aboutsummaryrefslogtreecommitdiffstats
path: root/src/lua/lua_redis.c
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2015-05-13 16:19:58 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2015-05-13 16:19:58 +0100
commit2965af455342740fd999e01a8c7dac7741214648 (patch)
tree084f32eb3f78647b18f3888bd91109dde39647a3 /src/lua/lua_redis.c
parent7cb545ef98d323c142bff391a8a9dfe7b9148e97 (diff)
downloadrspamd-2965af455342740fd999e01a8c7dac7741214648.tar.gz
rspamd-2965af455342740fd999e01a8c7dac7741214648.zip
More workarounds for hiredis.
Diffstat (limited to 'src/lua/lua_redis.c')
-rw-r--r--src/lua/lua_redis.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/lua/lua_redis.c b/src/lua/lua_redis.c
index 4af8d20b8..275df0a35 100644
--- a/src/lua/lua_redis.c
+++ b/src/lua/lua_redis.c
@@ -288,6 +288,22 @@ lua_redis_parse_args (lua_State *L, gint idx, const gchar *cmd,
ud->nargs = top;
ud->args = args;
}
+
+static void
+lua_redis_connect_cb (const struct redisAsyncContext *c, int status)
+{
+ /*
+ * Workaround to prevent double close:
+ * https://groups.google.com/forum/#!topic/redis-db/mQm46XkIPOY
+ */
+#if defined(HIREDIS_MAJOR) && HIREDIS_MAJOR == 0 && HIREDIS_MINOR <= 11
+ struct redisAsyncContext *nc = (struct redisAsyncContext *)c;
+ if (status == REDIS_ERR) {
+ nc->c.fd = -1;
+ }
+#endif
+}
+
/***
* @function rspamd_redis.make_request({params})
* Make request to redis server, params is a table of key=value arguments in any order
@@ -403,8 +419,10 @@ lua_redis_make_request (lua_State *L)
ud->terminated = 0;
ud->ctx = redisAsyncConnect (rspamd_inet_address_to_string (addr->addr),
rspamd_inet_address_get_port (addr->addr));
+ redisAsyncSetConnectCallback (ud->ctx, lua_redis_connect_cb);
if (ud->ctx == NULL || ud->ctx->err) {
+ ud->terminated = 1;
redisAsyncFree (ud->ctx);
lua_redis_free_args (ud);
luaL_unref (ud->L, LUA_REGISTRYINDEX, ud->cbref);
@@ -432,6 +450,7 @@ lua_redis_make_request (lua_State *L)
}
else {
msg_info ("call to redis failed: %s", ud->ctx->errstr);
+ ud->terminated = 1;
lua_redis_free_args (ud);
redisAsyncFree (ud->ctx);
luaL_unref (ud->L, LUA_REGISTRYINDEX, ud->cbref);