diff options
author | antirez <antirez@gmail.com> | 2011-04-15 17:28:03 +0200 |
---|---|---|
committer | antirez <antirez@gmail.com> | 2011-04-15 17:28:03 +0200 |
commit | 6a9764d1839579d76a3eff7744fd73075dfc4844 (patch) | |
tree | 574b50c83ccaa35d1894c56379fad5dbe82e9e8d | |
parent | c138dc7da4cf210fd70f4c7621833bd0388fce77 (diff) | |
parent | 2b886275e9756bb8619ad0021048d39b319c5b0a (diff) | |
download | redis-6a9764d1839579d76a3eff7744fd73075dfc4844.tar.gz |
Merge branch '2.2' of github.com:antirez/redis into 2.2
-rw-r--r-- | 00-RELEASENOTES | 15 | ||||
-rw-r--r-- | src/object.c | 45 | ||||
-rw-r--r-- | src/redis.c | 3 | ||||
-rw-r--r-- | src/redis.h | 2 | ||||
-rw-r--r-- | src/version.h | 2 |
5 files changed, 64 insertions, 3 deletions
diff --git a/00-RELEASENOTES b/00-RELEASENOTES index 8e04f7608..1bc6c9152 100644 --- a/00-RELEASENOTES +++ b/00-RELEASENOTES @@ -12,6 +12,21 @@ for 2.0. CHANGELOG --------- +What's new in Redis 2.2.4 +========================= + +* Return value of OBJECT DEBUG against sorted sets fixed, now is "skiplist". + +What's new in Redis 2.2.3 +========================= + +* Fixed issue #503. MONITOR + QUIT (and other combinations) could crash + the server. +* OBJECT command implemented. See http://redis.io/commands/object +* Fixed a problem in redis-cli related to escapes in the form "\x..". +* Fixed a minor memory leak in redis-cli +* Saved RDB on SIGTERM on archs where it was not working properly. + What's new in Redis 2.2.2 ========================= diff --git a/src/object.c b/src/object.c index de62f504c..d8ef59bc5 100644 --- a/src/object.c +++ b/src/object.c @@ -93,10 +93,13 @@ robj *createHashObject(void) { robj *createZsetObject(void) { zset *zs = zmalloc(sizeof(*zs)); + robj *o; zs->dict = dictCreate(&zsetDictType,NULL); zs->zsl = zslCreate(); - return createObject(REDIS_ZSET,zs); + o = createObject(REDIS_ZSET,zs); + o->encoding = REDIS_ENCODING_SKIPLIST; + return o; } void freeStringObject(robj *o) { @@ -425,6 +428,7 @@ char *strEncoding(int encoding) { case REDIS_ENCODING_LINKEDLIST: return "linkedlist"; case REDIS_ENCODING_ZIPLIST: return "ziplist"; case REDIS_ENCODING_INTSET: return "intset"; + case REDIS_ENCODING_SKIPLIST: return "skiplist"; default: return "unknown"; } } @@ -439,3 +443,42 @@ unsigned long estimateObjectIdleTime(robj *o) { REDIS_LRU_CLOCK_RESOLUTION; } } + +/* This is an helper function for the DEBUG command. We need to lookup keys + * without any modification of LRU or other parameters. */ +robj *objectCommandLookup(redisClient *c, robj *key) { + dictEntry *de; + + if ((de = dictFind(c->db->dict,key->ptr)) == NULL) return NULL; + return (robj*) dictGetEntryVal(de); +} + +robj *objectCommandLookupOrReply(redisClient *c, robj *key, robj *reply) { + robj *o = objectCommandLookup(c,key); + + if (!o) addReply(c, reply); + return o; +} + +/* Object command allows to inspect the internals of an Redis Object. + * Usage: OBJECT <verb> ... arguments ... */ +void objectCommand(redisClient *c) { + robj *o; + + if (!strcasecmp(c->argv[1]->ptr,"refcount") && c->argc == 3) { + if ((o = objectCommandLookupOrReply(c,c->argv[2],shared.nullbulk)) + == NULL) return; + addReplyLongLong(c,o->refcount); + } else if (!strcasecmp(c->argv[1]->ptr,"encoding") && c->argc == 3) { + if ((o = objectCommandLookupOrReply(c,c->argv[2],shared.nullbulk)) + == NULL) return; + addReplyBulkCString(c,strEncoding(o->encoding)); + } else if (!strcasecmp(c->argv[1]->ptr,"idletime") && c->argc == 3) { + if ((o = objectCommandLookupOrReply(c,c->argv[2],shared.nullbulk)) + == NULL) return; + addReplyLongLong(c,estimateObjectIdleTime(o)); + } else { + addReplyError(c,"Syntax error. Try OBJECT (refcount|encoding|idletime)"); + } +} + diff --git a/src/redis.c b/src/redis.c index ec8736afe..1775981b3 100644 --- a/src/redis.c +++ b/src/redis.c @@ -187,7 +187,8 @@ struct redisCommand readonlyCommandTable[] = { {"punsubscribe",punsubscribeCommand,-1,0,NULL,0,0,0}, {"publish",publishCommand,3,REDIS_CMD_FORCE_REPLICATION,NULL,0,0,0}, {"watch",watchCommand,-2,0,NULL,0,0,0}, - {"unwatch",unwatchCommand,1,0,NULL,0,0,0} + {"unwatch",unwatchCommand,1,0,NULL,0,0,0}, + {"object",objectCommand,-2,0,NULL,0,0,0} }; /*============================ Utility functions ============================ */ diff --git a/src/redis.h b/src/redis.h index fddf29ed0..7c1471794 100644 --- a/src/redis.h +++ b/src/redis.h @@ -81,6 +81,7 @@ #define REDIS_ENCODING_LINKEDLIST 4 /* Encoded as regular linked list */ #define REDIS_ENCODING_ZIPLIST 5 /* Encoded as ziplist */ #define REDIS_ENCODING_INTSET 6 /* Encoded as intset */ +#define REDIS_ENCODING_SKIPLIST 7 /* Encoded as skiplist */ /* Object types only used for dumping to disk */ #define REDIS_EXPIRETIME 253 @@ -1008,6 +1009,7 @@ void punsubscribeCommand(redisClient *c); void publishCommand(redisClient *c); void watchCommand(redisClient *c); void unwatchCommand(redisClient *c); +void objectCommand(redisClient *c); #if defined(__GNUC__) void *calloc(size_t count, size_t size) __attribute__ ((deprecated)); diff --git a/src/version.h b/src/version.h index 0834bc824..6ae276d89 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define REDIS_VERSION "2.2.2" +#define REDIS_VERSION "2.2.4" |