Commit 562b2bd6 authored by antirez's avatar antirez
Browse files

Keyspace notifications: fixed a leak and a bug introduced in the latest commit.

parent fce016d3
...@@ -92,22 +92,22 @@ sds keyspaceEventsFlagsToString(int flags) { ...@@ -92,22 +92,22 @@ sds keyspaceEventsFlagsToString(int flags) {
* 'dbid' is the database ID where the key lives. */ * 'dbid' is the database ID where the key lives. */
void notifyKeyspaceEvent(int type, char *event, robj *key, int dbid) { void notifyKeyspaceEvent(int type, char *event, robj *key, int dbid) {
sds chan; sds chan;
robj *chanobj; robj *chanobj, *eventobj;
int len = -1; int len = -1;
char buf[24]; char buf[24];
/* If notifications for this class of events are off, return ASAP. */ /* If notifications for this class of events are off, return ASAP. */
if (!(server.notify_keyspace_events & type)) return; if (!(server.notify_keyspace_events & type)) return;
eventobj = createStringObject(event,strlen(event));
/* __keyspace@<db>__:<key> <event> notifications. */ /* __keyspace@<db>__:<key> <event> notifications. */
if (server.notify_keyspace_events & REDIS_NOTIFY_KEYSPACE) { if (server.notify_keyspace_events & REDIS_NOTIFY_KEYSPACE) {
robj *eventobj;
chan = sdsnewlen("__keyspace@",11); chan = sdsnewlen("__keyspace@",11);
len = ll2string(buf,sizeof(buf),dbid); len = ll2string(buf,sizeof(buf),dbid);
chan = sdscatlen(chan, buf, len); chan = sdscatlen(chan, buf, len);
chan = sdscatlen(chan, "__:", 3); chan = sdscatlen(chan, "__:", 3);
eventobj = createStringObject(event,strlen(event)); chan = sdscatsds(chan, key->ptr);
chanobj = createObject(REDIS_STRING, chan); chanobj = createObject(REDIS_STRING, chan);
pubsubPublishMessage(chanobj, eventobj); pubsubPublishMessage(chanobj, eventobj);
decrRefCount(chanobj); decrRefCount(chanobj);
...@@ -119,8 +119,10 @@ void notifyKeyspaceEvent(int type, char *event, robj *key, int dbid) { ...@@ -119,8 +119,10 @@ void notifyKeyspaceEvent(int type, char *event, robj *key, int dbid) {
if (len == -1) len = ll2string(buf,sizeof(buf),dbid); if (len == -1) len = ll2string(buf,sizeof(buf),dbid);
chan = sdscatlen(chan, buf, len); chan = sdscatlen(chan, buf, len);
chan = sdscatlen(chan, "__:", 3); chan = sdscatlen(chan, "__:", 3);
chan = sdscatsds(chan, eventobj->ptr);
chanobj = createObject(REDIS_STRING, chan); chanobj = createObject(REDIS_STRING, chan);
pubsubPublishMessage(chanobj, key); pubsubPublishMessage(chanobj, key);
decrRefCount(chanobj); decrRefCount(chanobj);
} }
decrRefCount(eventobj);
} }
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
# units are case insensitive so 1GB 1Gb 1gB are all the same. # units are case insensitive so 1GB 1Gb 1gB are all the same.
# Enable keyspace events notification for testing so that we cover more code. # Enable keyspace events notification for testing so that we cover more code.
notify-keyspace-events A notify-keyspace-events KEA
# By default Redis does not run as a daemon. Use 'yes' if you need it. # By default Redis does not run as a daemon. Use 'yes' if you need it.
# Note that Redis will write a pid file in /var/run/redis.pid when daemonized. # Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment