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 #3844 for more information.
This commit is contained in:
parent
14c32c3569
commit
e203a46cf3
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user