Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP - fix #2141 - cluster redirect if client closed #2701

Draft
wants to merge 3 commits into
base: master
Choose a base branch
from

Conversation

scorpionknifes
Copy link

@scorpionknifes scorpionknifes commented Feb 8, 2024

Description

Here is a rough attempt to resolve issues described in #2141 (I'm not an expert with TS and would like someone to take over this PR)

createCluster is currently unable to update slots when slots are out of date (when a master node goes down and a replica takes over)
This causes the client to throw ClientClosedError forever until the application is restarted.

This PR takes inspiration from https://github.com/redis/go-redis

  • Whenever a command is executed, we check if the state has been last updated 10s ago reference
  • Use concept of state struct to make lazy loading easier reference

Related: #2141 (comment)

Known issues

Do not use isolated - commandOptions; this breaks the client forever, the duplicated client from using this command option would keep using old node addresses and cause Connection timeout on each reconnection. This PR attempts to make changes only to the cluster client and won't make any fixes to this issue (this issue already exists prior this PR)
e.g.

await client.xRead(
    commandOptions({
        isolated: true
    }),
    [
        {
            key: key,
            id:'0-0'
        }
    ],
    {
        COUNT: 100,
        BLOCK: 0
    }
);

Try it out

For those interested in trying this client out you can install it using the following:

# I'm using pnpm
"pnpm": {
  "overrides": {
    "@redis/client": "npm:@scorpionknifes/redis-client@^1.6.0"
  }
},

It is available here: https://www.npmjs.com/package/@scorpionknifes/redis-client
Reminder - this is a draft and don't use this for production.

Testing

I've tested this against docker, k8s
Writing tests for these is almost impossible cause it relies on simulating a Redis master going down. (aka no tests written for these)


Checklist

  • Does npm test pass with this change (including linting)?
  • Is the new or changed code fully tested?
  • Is a documentation update included (if this change modifies existing APIs, or introduces new ones)?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant