diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2016-12-25 23:16:01 +0000 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2016-12-25 23:16:01 +0000 |
commit | db20f07830d445c20825bac3f871bc57a5c5b5b3 (patch) | |
tree | 5092ba787fd263fe9d0c696c18c3c783ddb7c32a /src | |
parent | 6eecb5ce7c89b5d203b175445b338a9ddd3a1368 (diff) | |
download | rspamd-db20f07830d445c20825bac3f871bc57a5c5b5b3.tar.gz rspamd-db20f07830d445c20825bac3f871bc57a5c5b5b3.zip |
[Fix] Add additional check to mark redis connection inactive
Diffstat (limited to 'src')
-rw-r--r-- | src/libserver/redis_pool.c | 19 | ||||
-rw-r--r-- | src/lua/lua_redis.c | 2 |
2 files changed, 14 insertions, 7 deletions
diff --git a/src/libserver/redis_pool.c b/src/libserver/redis_pool.c index 1d42ad3ff..17fa22b1e 100644 --- a/src/libserver/redis_pool.c +++ b/src/libserver/redis_pool.c @@ -394,12 +394,19 @@ rspamd_redis_pool_release_connection (struct rspamd_redis_pool *pool, REF_RELEASE (conn); } else { - /* Just move it to the inactive queue */ - g_queue_unlink (conn->elt->active, conn->entry); - g_queue_push_head_link (conn->elt->inactive, conn->entry); - conn->active = FALSE; - rspamd_redis_pool_schedule_timeout (conn); - msg_debug_rpool ("mark connection inactive"); + /* Ensure that there are no callbacks attached to this conn */ + if (ctx->replies.head == NULL) { + /* Just move it to the inactive queue */ + g_queue_unlink (conn->elt->active, conn->entry); + g_queue_push_head_link (conn->elt->inactive, conn->entry); + conn->active = FALSE; + rspamd_redis_pool_schedule_timeout (conn); + msg_debug_rpool ("mark connection inactive"); + } + else { + msg_debug_rpool ("closed connection due to callbacks leftover"); + REF_RELEASE (conn); + } } REF_RELEASE (conn); diff --git a/src/lua/lua_redis.c b/src/lua/lua_redis.c index 3566c7e11..7c5e84735 100644 --- a/src/lua/lua_redis.c +++ b/src/lua/lua_redis.c @@ -751,7 +751,7 @@ lua_redis_make_request (lua_State *L) sp_ud->w = NULL; } - REDIS_RETAIN (ctx); + REDIS_RETAIN (ctx); /* Cleared by fin event */ ctx->cmds_pending ++; double_to_tv (timeout, &tv); event_set (&sp_ud->timeout, -1, EV_TIMEOUT, lua_redis_timeout, sp_ud); |