Skip to content

cluster slots not rediscovered on scale-down cluster #2806

Open
@carlhopf

Description

@carlhopf

Description

#slots.rediscover() is correctly called when MOVED or ASK reply is received:

} else if (err.message.startsWith('MOVED')) {

if (err.message.startsWith('ASK')) {

there is a problem / race-condition on scale-down cluster (rebalance hash slots away, forget node, shutdown):

#slots.rediscover() might never be called, if the leaving node has not been queried (after it's slots migrated away) before shutdown (hence it never got a chance to reply with MOVED and trigger a rediscover)

this results in connection closed errors, because node-redis cluster.#slots is keeping a client active for an outdated cluster topology.

steps to reproduce:

  1. start a redis cluster
  2. create node-redis client and connect
  3. redis-cli reshard all slots away from a redis cluster node
  4. redis-cli del-node the now empty node, then shutdown
  5. node-redis client execute command for a key, which is sharded the (now shutdown) node
  6. connection closed error

an option to fix this would be to provide an option for a slot refresh interval (ioredis does this too), will send a pull request

Node.js Version

No response

Redis Server Version

No response

Node Redis Version

No response

Platform

No response

Logs

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions