-
Notifications
You must be signed in to change notification settings - Fork 1.9k
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
Redis hangs indefinitely on connection lost #2205
Comments
Facing the same issue, client hangs at get(). |
import { createClient } from 'redis';
import { setTimeout } from 'node:timers/promises';
const client = createClient({
disableOfflineQueue: true
});
client.on('error', (err) => console.log('Redis Client Error', err.message));
await client.connect();
console.log('Client is connected, stop redis-server');
await setTimeout(5000);
try {
console.log(await client.ping());
} catch (err) {
console.log(err.message);
}
console.log('AFTER');
|
Didn't understand this! |
@sunilgsuthar I've tried to reproduce the error using the code in my last comment, but it seems like it "works" (throw an error) as exptected |
@bssergy did you find any solution to this? |
An alternative is to inject the redis client, HOWEVER, you need to use the redis version 3.x.x, if you use version 4.x.x the library never resolves the promises because the callbacks are never called. I must admit this is very annonying |
@leibale Try again with the |
Any news about this? I have been facing this problem for a while now. |
@GledsonAfonso have you set |
Thanks for the reply and sorry for my late reply, I just manage to test this today. It didn't work, though. Here's the code from my Redis client: _client = createClient({
legacyMode: true,
disableOfflineQueue: true,
socket: {
port: environment.redisPort,
host: environment.redisHost
}
});
await _client.connect(); The way I'm testing this is through Docker Compose. I'm starting the Redis server along with an API that needs to connect to it and then I disconnect the Redis server and watch the logs from the API. When this happens, it fails and the application is successfully closed, but when I start it without starting the Redis server first, it gives me this log: ConnectionTimeoutError: Connection timeout
at Socket.<anonymous> (/app/node_modules/@redis/client/dist/lib/client/socket.js:168:124)
at Object.onceWrapper (node:events:641:28)
at Socket.emit (node:events:527:28)
at Socket.emit (node:domain:475:12)
at Socket._onTimeout (node:net:522:8)
at listOnTimeout (node:internal/timers:559:17)
at processTimers (node:internal/timers:502:7) And the API doesn't fail, allowing the application to hang infinitely whenever some data are requested. What I needed was that the application to throw some error when data are requested, instead of just hanging like that. I need this because the API needs to redirect the request to S3 storage whenever this problem happens. |
…eQueue` is `true`
@GledsonAfonso wanna give #2328 a shot? |
Sure! How do I do that? |
@GledsonAfonso if you are testing locally: clone my fork, checkout to the "fix-2205" branch, run |
Okay, I'm going to try that. |
It still hangs. |
@GledsonAfonso wanna debug it together (because I'm having a hard time reproducing it)? |
Sure! What time you will be available and through which channel? |
@GledsonAfonso I'll be in this zoom call for the next few hours, hope you'll have time to join :) |
Okay! Thanks! |
Thanks for your help, @leibale! Just in case someone else needs this, what solved my problem was basically some changes to the client code, as below: _client = createClient({
legacyMode: true,
disableOfflineQueue: true,
socket: {
port: environment.redisPort,
host: environment.redisHost,
reconnectStrategy: () => 3000
}
});
_client.on('error', (error) =>
console.error(`Connection to Redis server failed! Error ${error}`)
);
_client.connect(); Some pointers of what changed:
With those changes, now my application keeps retrying to reconnect with the server when the latter is offline and is able to default to the S3 storage after the timeout set on the Cheers guys! Thanks again! |
@GledsonAfonso thanks for summarizing it :) just one note, I would suggest using the default |
Thanks for the heads up. Will do! |
@GledsonAfonso |
A little late to say that, but thanks! ^^ |
Here is my code sample:
My application hangs indefinitely if connection lost for some reasons and I want to handle this case. I try to catch every possible errors but it doesn't help - application hangs on get() method and nothing happens.
So I just need to handle redis error on lost connection to be able to log this error and move next in my code.
Environment:
The text was updated successfully, but these errors were encountered: