From 17b41740899ffcf22c150b3ab2d981938bb1a3e2 Mon Sep 17 00:00:00 2001
From: Mark Nunberg <mnunberg@haskalah.org>
Date: Mon, 11 Mar 2019 09:01:32 -0400
Subject: 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
---
 async.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/async.c b/async.c
index 0a2659c..b6163f2 100644
--- a/async.c
+++ b/async.c
@@ -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
-- 
cgit v1.2.3