From bd1782fa0af2a2af081254a267d5fc8c2d0f472e Mon Sep 17 00:00:00 2001 From: antirez Date: Fri, 14 Jul 2017 13:02:15 +0200 Subject: [PATCH] Modules: fix thread safe context DB selection. Before this fix the DB currenty selected by the client blocked was not respected and operations were always performed on DB 0. --- src/module.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/module.c b/src/module.c index 7b8b1747..342612a1 100644 --- a/src/module.c +++ b/src/module.c @@ -206,6 +206,7 @@ typedef struct RedisModuleBlockedClient { RedisModule_UnblockClient() API. */ client *reply_client; /* Fake client used to accumulate replies in thread safe contexts. */ + int dbid; /* Database number selected by the original client. */ } RedisModuleBlockedClient; static pthread_mutex_t moduleUnblockedClientsMutex = PTHREAD_MUTEX_INITIALIZER; @@ -3339,6 +3340,7 @@ RedisModuleBlockedClient *RM_BlockClient(RedisModuleCtx *ctx, RedisModuleCmdFunc bc->privdata = NULL; bc->reply_client = createClient(-1); bc->reply_client->flags |= CLIENT_MODULE; + bc->dbid = c->db->id; c->bpop.timeout = timeout_ms ? (mstime()+timeout_ms) : 0; blockClient(c,BLOCKED_MODULE); @@ -3524,6 +3526,7 @@ RedisModuleCtx *RM_GetThreadSafeContext(RedisModuleBlockedClient *bc) { * in order to keep things like the currently selected database and similar * things. */ ctx->client = createClient(-1); + if (bc) selectDb(ctx->client,bc->dbid); return ctx; }