You've already forked node-redis
mirror of
https://github.com/redis/node-redis.git
synced 2025-08-06 02:15:48 +03:00
fix(clustered pubsub): check that client.isOpen
before calling client.disconnect()
when unsubscribing (#2687)
* Confirm the client isOpen before disconnecting * Write tests * fix tests * fix tests --------- Co-authored-by: Leibale Eidelman <me@leibale.com>
This commit is contained in:
@@ -562,7 +562,7 @@ export default class RedisClusterSlots<
|
|||||||
const client = await this.getPubSubClient();
|
const client = await this.getPubSubClient();
|
||||||
await unsubscribe(client);
|
await unsubscribe(client);
|
||||||
|
|
||||||
if (!client.isPubSubActive) {
|
if (!client.isPubSubActive && client.isOpen) {
|
||||||
await client.disconnect();
|
await client.disconnect();
|
||||||
this.pubSubNode = undefined;
|
this.pubSubNode = undefined;
|
||||||
}
|
}
|
||||||
@@ -613,7 +613,7 @@ export default class RedisClusterSlots<
|
|||||||
const client = await master.pubSubClient;
|
const client = await master.pubSubClient;
|
||||||
await unsubscribe(client);
|
await unsubscribe(client);
|
||||||
|
|
||||||
if (!client.isPubSubActive) {
|
if (!client.isPubSubActive && client.isOpen) {
|
||||||
await client.disconnect();
|
await client.disconnect();
|
||||||
master.pubSubClient = undefined;
|
master.pubSubClient = undefined;
|
||||||
}
|
}
|
||||||
|
@@ -235,6 +235,18 @@ describe('Cluster', () => {
|
|||||||
|
|
||||||
assert.equal(cluster.pubSubNode, undefined);
|
assert.equal(cluster.pubSubNode, undefined);
|
||||||
}, GLOBAL.CLUSTERS.OPEN);
|
}, GLOBAL.CLUSTERS.OPEN);
|
||||||
|
|
||||||
|
testUtils.testWithCluster('concurrent UNSUBSCRIBE does not throw an error (#2685)', async cluster => {
|
||||||
|
const listener = spy();
|
||||||
|
await Promise.all([
|
||||||
|
cluster.subscribe('1', listener),
|
||||||
|
cluster.subscribe('2', listener)
|
||||||
|
]);
|
||||||
|
await Promise.all([
|
||||||
|
cluster.unsubscribe('1', listener),
|
||||||
|
cluster.unsubscribe('2', listener)
|
||||||
|
]);
|
||||||
|
}, GLOBAL.CLUSTERS.OPEN);
|
||||||
|
|
||||||
testUtils.testWithCluster('psubscribe & punsubscribe', async cluster => {
|
testUtils.testWithCluster('psubscribe & punsubscribe', async cluster => {
|
||||||
const listener = spy();
|
const listener = spy();
|
||||||
@@ -323,6 +335,21 @@ describe('Cluster', () => {
|
|||||||
minimumDockerVersion: [7]
|
minimumDockerVersion: [7]
|
||||||
});
|
});
|
||||||
|
|
||||||
|
testUtils.testWithCluster('concurrent SUNSUBCRIBE does not throw an error (#2685)', async cluster => {
|
||||||
|
const listener = spy();
|
||||||
|
await Promise.all([
|
||||||
|
await cluster.sSubscribe('1', listener),
|
||||||
|
await cluster.sSubscribe('2', listener)
|
||||||
|
]);
|
||||||
|
await Promise.all([
|
||||||
|
cluster.sUnsubscribe('1', listener),
|
||||||
|
cluster.sUnsubscribe('2', listener)
|
||||||
|
]);
|
||||||
|
}, {
|
||||||
|
...GLOBAL.CLUSTERS.OPEN,
|
||||||
|
minimumDockerVersion: [7]
|
||||||
|
});
|
||||||
|
|
||||||
testUtils.testWithCluster('should handle sharded-channel-moved events', async cluster => {
|
testUtils.testWithCluster('should handle sharded-channel-moved events', async cluster => {
|
||||||
const SLOT = 10328,
|
const SLOT = 10328,
|
||||||
migrating = cluster.slots[SLOT].master,
|
migrating = cluster.slots[SLOT].master,
|
||||||
|
Reference in New Issue
Block a user