Browse Source

Merge pull request #3313 from arkamar/hiredis

Revert "[Fix] Fix hiredis stupidity" and use the hiredis api as intended
tags/2.6
Vsevolod Stakhov 4 years ago
parent
commit
4e269dc2f8
No account linked to committer's email address
3 changed files with 9 additions and 14 deletions
  1. 3
    5
      contrib/hiredis/async.c
  2. 2
    4
      contrib/hiredis/async.h
  3. 4
    5
      src/libserver/redis_pool.c

+ 3
- 5
contrib/hiredis/async.c View File

@@ -129,7 +129,6 @@ static redisAsyncContext *redisAsyncInitialize(redisContext *c) {

ac->onConnect = NULL;
ac->onDisconnect = NULL;
ac->disconnectCbdata = NULL;

ac->replies.head = NULL;
ac->replies.tail = NULL;
@@ -216,10 +215,9 @@ int redisAsyncSetConnectCallback(redisAsyncContext *ac, redisConnectCallback *fn
return REDIS_ERR;
}

int redisAsyncSetDisconnectCallback(redisAsyncContext *ac, redisDisconnectCallback *fn, void *cbdata) {
int redisAsyncSetDisconnectCallback(redisAsyncContext *ac, redisDisconnectCallback *fn) {
if (ac->onDisconnect == NULL) {
ac->onDisconnect = fn;
ac->disconnectCbdata = cbdata;
return REDIS_OK;
}
return REDIS_ERR;
@@ -308,10 +306,10 @@ static void __redisAsyncFree(redisAsyncContext *ac) {
* this context, the status will always be REDIS_OK. */
if (ac->onDisconnect && (c->flags & REDIS_CONNECTED)) {
if (c->flags & REDIS_FREEING) {
ac->onDisconnect(ac,REDIS_OK,ac->disconnectCbdata);
ac->onDisconnect(ac,REDIS_OK);
} else {
c->flags |= REDIS_FREEING;
ac->onDisconnect(ac,(ac->err == 0) ? REDIS_OK : REDIS_ERR,ac->disconnectCbdata);
ac->onDisconnect(ac,(ac->err == 0) ? REDIS_OK : REDIS_ERR);
}
}


+ 2
- 4
contrib/hiredis/async.h View File

@@ -54,7 +54,7 @@ typedef struct redisCallbackList {
} redisCallbackList;

/* Connection callback prototypes */
typedef void (redisDisconnectCallback)(const struct redisAsyncContext*, int status, void *cbdata);
typedef void (redisDisconnectCallback)(const struct redisAsyncContext*, int status);
typedef void (redisConnectCallback)(const struct redisAsyncContext*, int status);

/* Context for an async connection to Redis */
@@ -85,8 +85,6 @@ typedef struct redisAsyncContext {
/* Called when either the connection is terminated due to an error or per
* user request. The status is set accordingly (REDIS_OK, REDIS_ERR). */
redisDisconnectCallback *onDisconnect;
/* Hiredis is just brain-damaged here, need to fix it */
void *disconnectCbdata;

/* Called when the first write event was received. */
redisConnectCallback *onConnect;
@@ -109,7 +107,7 @@ redisAsyncContext *redisAsyncConnectBindWithReuse(const char *ip, int port,
const char *source_addr);
redisAsyncContext *redisAsyncConnectUnix(const char *path);
int redisAsyncSetConnectCallback(redisAsyncContext *ac, redisConnectCallback *fn);
int redisAsyncSetDisconnectCallback(redisAsyncContext *ac, redisDisconnectCallback *fn, void *cbdata);
int redisAsyncSetDisconnectCallback(redisAsyncContext *ac, redisDisconnectCallback *fn);
void redisAsyncDisconnect(redisAsyncContext *ac);
void redisAsyncFree(redisAsyncContext *ac);


+ 4
- 5
src/libserver/redis_pool.c View File

@@ -258,10 +258,9 @@ rspamd_redis_pool_schedule_timeout (struct rspamd_redis_pool_connection *conn)
}

static void
rspamd_redis_pool_on_disconnect (const struct redisAsyncContext *ac, int status,
void *ud)
rspamd_redis_pool_on_disconnect (const struct redisAsyncContext *ac, int status)
{
struct rspamd_redis_pool_connection *conn = ud;
struct rspamd_redis_pool_connection *conn = ac->data;

/*
* Here, we know that redis itself will free this connection
@@ -313,13 +312,13 @@ rspamd_redis_pool_new_connection (struct rspamd_redis_pool *pool,
g_hash_table_insert (elt->pool->elts_by_ctx, ctx, conn);
g_queue_push_head_link (elt->active, conn->entry);
conn->ctx = ctx;
ctx->data = conn;
rspamd_random_hex (conn->tag, sizeof (conn->tag));
REF_INIT_RETAIN (conn, rspamd_redis_pool_conn_dtor);
msg_debug_rpool ("created new connection to %s:%d: %p", ip, port, ctx);

redisLibevAttach (pool->event_loop, ctx);
redisAsyncSetDisconnectCallback (ctx, rspamd_redis_pool_on_disconnect,
conn);
redisAsyncSetDisconnectCallback (ctx, rspamd_redis_pool_on_disconnect);

if (password) {
redisAsyncCommand (ctx, NULL, NULL,

Loading…
Cancel
Save