diff options
author | Dvir Volk <dvirsky@gmail.com> | 2017-12-07 17:15:16 +0200 |
---|---|---|
committer | Dvir Volk <dvirsky@gmail.com> | 2018-02-14 21:40:10 +0200 |
commit | f27a64232e59e5bc5f8ee648b3610d19128ab149 (patch) | |
tree | 8addc4cfd6809c7af716f9353a52b6e8eb397921 | |
parent | 3aab12414f27685bf8e9dc9fd4693c8c9ecf9ccb (diff) | |
download | redis-f27a64232e59e5bc5f8ee648b3610d19128ab149.tar.gz |
Use one static client for all keyspace notification callbacks
-rw-r--r-- | src/module.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/src/module.c b/src/module.c index e2c878ea5..c909cfa9b 100644 --- a/src/module.c +++ b/src/module.c @@ -235,6 +235,9 @@ typedef struct RedisModuleKeyspaceSubscriber { /* The module keyspace notification subscribers list */ static list *moduleKeyspaceSubscribers; +/* Static client recycled for all notification clients, to avoid allocating per round. */ +static client *moduleKeyspaceSubscribersClient; + /* -------------------------------------------------------------------------- * Prototypes * -------------------------------------------------------------------------- */ @@ -3769,10 +3772,6 @@ void moduleNotifyKeyspaceEvent(int type, const char *event, robj *key, int dbid) /* Remove irrelevant flags from the type mask */ type &= ~(NOTIFY_KEYEVENT | NOTIFY_KEYSPACE); - /* Setup a fake client, so we can have proper db selection when performing - * actions. We use one client for all handlers, writing to it will crash */ - client *c = createClient(-1); - c->flags |= CLIENT_MODULE; while((ln = listNext(&li))) { RedisModuleKeyspaceSubscriber *sub = ln->value; @@ -3781,8 +3780,9 @@ void moduleNotifyKeyspaceEvent(int type, const char *event, robj *key, int dbid) if ((sub->event_mask & type) && sub->active == 0) { RedisModuleCtx ctx = REDISMODULE_CTX_INIT; ctx.module = sub->module; - selectDb(c, dbid); - ctx.client = c; + ctx.client = moduleKeyspaceSubscribersClient; + selectDb(ctx.client, dbid); + /* mark the handler as activer to avoid reentrant loops. * If the subscriber performs an action triggering itself, * it will not be notified about it. */ @@ -3792,7 +3792,7 @@ void moduleNotifyKeyspaceEvent(int type, const char *event, robj *key, int dbid) moduleFreeContext(&ctx); } } - freeClient(c); + } /* Unsubscribe any notification subscirbers this module has upon unloading */ @@ -3850,7 +3850,11 @@ void moduleInitModulesSystem(void) { server.loadmodule_queue = listCreate(); modules = dictCreate(&modulesDictType,NULL); + + /* Set up the keyspace notification susbscriber list and static client */ moduleKeyspaceSubscribers = listCreate(); + moduleKeyspaceSubscribersClient = createClient(-1); + moduleKeyspaceSubscribersClient->flags |= CLIENT_MODULE; moduleRegisterCoreAPI(); if (pipe(server.module_blocked_pipe) == -1) { |