summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2017-07-14 13:02:15 +0200
committerantirez <antirez@gmail.com>2017-07-14 13:02:15 +0200
commitbd1782fa0af2a2af081254a267d5fc8c2d0f472e (patch)
tree90450a943eff78dbd096ac4c758c9dab822b7d93
parent8eefc9323dc677bf266c71c07fe788aef68b4eaf (diff)
downloadredis-bd1782fa0af2a2af081254a267d5fc8c2d0f472e.tar.gz
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.
-rw-r--r--src/module.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/src/module.c b/src/module.c
index 7b8b17479..342612a1b 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;
}