diff options
author | Mark Nunberg <mnunberg@haskalah.org> | 2019-03-11 09:01:32 -0400 |
---|---|---|
committer | Mark Nunberg <mnunberg@haskalah.org> | 2019-03-11 09:20:21 -0400 |
commit | 17b41740899ffcf22c150b3ab2d981938bb1a3e2 (patch) | |
tree | e6f71683b87687c3968a8a9dcecaa8e0ca9da56b | |
parent | 297de989a647a6f96f25aabea267aa0d18c43328 (diff) |
Retain the same semantics for connection error on connection timeout
This ensures that a disconnect occurs.
This commit also ensures that disconnects will clean the socket even if
the user is in no-auto-free mode
-rw-r--r-- | async.c | 11 |
1 files changed, 11 insertions, 0 deletions
@@ -60,6 +60,7 @@ } while(0) #define _EL_CLEANUP(ctx) do { \ if ((ctx)->ev.cleanup) (ctx)->ev.cleanup((ctx)->ev.data); \ + ctx->ev.cleanup = NULL; \ } while(0); static void refreshTimeout(redisAsyncContext *ctx) { @@ -359,6 +360,10 @@ static void __redisAsyncDisconnect(redisAsyncContext *ac) { c->flags |= REDIS_DISCONNECTING; } + /* cleanup event library on disconnect. + * this is safe to call multiple times */ + _EL_CLEANUP(ac); + /* For non-clean disconnects, __redisAsyncFree() will execute pending * callbacks with a NULL-reply. */ if (!(c->flags & REDIS_NO_AUTO_FREE)) { @@ -697,6 +702,12 @@ void redisAsyncHandleTimeout(redisAsyncContext *ac) { while (__redisShiftCallback(&ac->replies, &cb) == REDIS_OK) { __redisRunCallback(ac, &cb, NULL); } + + /** + * TODO: Don't automatically sever the connection, + * rather, allow to ignore <x> responses before the queue is clear + */ + __redisAsyncDisconnect(ac); } /* Sets a pointer to the first argument and its length starting at p. Returns |