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

This commit is contained in:
antirez 2013-01-25 17:34:52 +01:00
parent fce016d31b
commit 562b2bd6a7
2 changed files with 7 additions and 5 deletions

View File

@ -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) {
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);
} }

View File

@ -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.