1
0
mirror of https://github.com/fluencelabs/redis synced 2025-03-31 14:51:04 +00:00

Clients blocked in modules: free argv/argc later.

See issue  for more information.
This commit is contained in:
antirez 2017-07-11 12:33:00 +02:00
parent 14c32c3569
commit e203a46cf3
2 changed files with 15 additions and 3 deletions

@ -3304,6 +3304,11 @@ void moduleBlockedClientPipeReadable(aeEventLoop *el, int fd, void *privdata, in
void unblockClientFromModule(client *c) { void unblockClientFromModule(client *c) {
RedisModuleBlockedClient *bc = c->bpop.module_blocked_handle; RedisModuleBlockedClient *bc = c->bpop.module_blocked_handle;
bc->client = NULL; bc->client = NULL;
/* Reset the client for a new query since, for blocking commands implemented
* into modules, we do not it immediately after the command returns (and
* the client blocks) in order to be still able to access the argument
* vector from callbacks. */
resetClient(c);
} }
/* Block a client in the context of a blocking command, returning an handle /* Block a client in the context of a blocking command, returning an handle

@ -1332,10 +1332,17 @@ void processInputBuffer(client *c) {
/* Update the applied replication offset of our master. */ /* Update the applied replication offset of our master. */
c->reploff = c->read_reploff - sdslen(c->querybuf); c->reploff = c->read_reploff - sdslen(c->querybuf);
} }
/* Don't reset the client structure for clients blocked in a
* module blocking command, so that the reply callback will
* still be able to access the client argv and argc field.
* The client will be reset in unblockClientFromModule(). */
if (!(c->flags & CLIENT_BLOCKED) || c->btype != BLOCKED_MODULE)
resetClient(c); resetClient(c);
} }
/* freeMemoryIfNeeded may flush slave output buffers. This may result /* freeMemoryIfNeeded may flush slave output buffers. This may
* into a slave, that may be the active client, to be freed. */ * result into a slave, that may be the active client, to be
* freed. */
if (server.current_client == NULL) break; if (server.current_client == NULL) break;
} }
} }