summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2019-10-31 17:38:58 +0100
committerantirez <antirez@gmail.com>2019-10-31 17:39:05 +0100
commit825adcf3f5775271583ebe4df0ba92fd8f9c821b (patch)
tree14c0535ee5aeab229d337f36d796f938b07b4420
parent37bf3e18cbc4db5538940ac4a6006627122e1c17 (diff)
downloadredis-825adcf3f5775271583ebe4df0ba92fd8f9c821b.tar.gz
Modules: block on keys: finish implementing RM_UnblockClient().
-rw-r--r--src/module.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/src/module.c b/src/module.c
index 248a55e62..a4384163a 100644
--- a/src/module.c
+++ b/src/module.c
@@ -4201,15 +4201,24 @@ int moduleClientIsBlockedOnKeys(client *c) {
* needs to be passed to the client, included but not limited some slow
* to compute reply or some reply obtained via networking.
*
- * Note: this function can be called from threads spawned by the module.
+ * Note 1: this function can be called from threads spawned by the module.
*
- * Note: when we unblock a client that is blocked for keys using
+ * Note 2: when we unblock a client that is blocked for keys using
* the API RedisModule_BlockClientOnKeys(), the privdata argument here is
* not used, and the reply callback is called with the privdata pointer that
- * was passed when blocking the client. Also note if you unblock clients
- * blocked on keys in this way, the reply callback should be ready to handle
- * the fact the key may not be ready at all. */
+ * was passed when blocking the client.
+ *
+ * Unblocking a client that was blocked for keys using this API will still
+ * require the client to get some reply, so the function will use the
+ * "timeout" handler in order to do so. */
int RM_UnblockClient(RedisModuleBlockedClient *bc, void *privdata) {
+ if (bc->blocked_on_keys) {
+ /* In theory the user should always pass the timeout handler as an
+ * argument, but better to be safe than sorry. */
+ if (bc->timeout_callback == NULL) return REDISMODULE_ERR;
+ if (bc->unblocked) return REDISMODULE_OK;
+ if (bc->client) moduleBlockedClientTimedOut(bc->client);
+ }
moduleUnblockClientByHandle(bc,privdata);
return REDISMODULE_OK;
}