]> git.saurik.com Git - redis.git/commitdiff
CLUSTER GETKEYSINSLOT implemented
authorantirez <antirez@gmail.com>
Fri, 29 Apr 2011 14:17:58 +0000 (16:17 +0200)
committerantirez <antirez@gmail.com>
Fri, 29 Apr 2011 14:17:58 +0000 (16:17 +0200)
src/cluster.c
src/db.c
src/redis.h

index 6c43bbf8d7553e4aa9ad4334d93d939715d87ad3..5b747264cc6a99fa1b557d8cafd06ddb36b626d6 100644 (file)
@@ -1209,6 +1209,27 @@ void clusterCommand(redisClient *c) {
         sds key = c->argv[2]->ptr;
 
         addReplyLongLong(c,keyHashSlot(key,sdslen(key)));
+    } else if (!strcasecmp(c->argv[1]->ptr,"getkeysinslot") && c->argc == 4) {
+        long long maxkeys, slot;
+        unsigned int numkeys;
+        int j;
+        robj **keys;
+
+        if (getLongLongFromObjectOrReply(c,c->argv[2],&slot,NULL) != REDIS_OK)
+            return;
+        if (getLongLongFromObjectOrReply(c,c->argv[3],&maxkeys,NULL) != REDIS_OK)
+            return;
+        if (slot < 0 || slot >= REDIS_CLUSTER_SLOTS || maxkeys < 0 ||
+            maxkeys > 1024*1024) {
+            addReplyError(c,"Invalid slot or number of keys");
+            return;
+        }
+
+        keys = zmalloc(sizeof(robj*)*maxkeys);
+        numkeys = GetKeysInSlot(slot, keys, maxkeys);
+        addReplyMultiBulkLen(c,numkeys);
+        for (j = 0; j < numkeys; j++) addReplyBulk(c,keys[j]);
+        zfree(keys);
     } else {
         addReplyError(c,"Wrong CLUSTER subcommand or number of arguments");
     }
index 7d323924508c7ef8e002842fc956796998ae5891..670e2bce4e850496a783dc8992d1dc1414bb1caf 100644 (file)
--- a/src/db.c
+++ b/src/db.c
@@ -725,14 +725,18 @@ void SlotToKeyDel(robj *key) {
     zslDelete(server.cluster.slots_to_keys,hashslot,key);
 }
 
-robj *GetKeyInSlot(unsigned int hashslot) {
+unsigned int GetKeysInSlot(unsigned int hashslot, robj **keys, unsigned int count) {
     zskiplistNode *n;
     zrangespec range;
+    int j = 0;
 
     range.min = range.max = hashslot;
     range.minex = range.maxex = 0;
     
     n = zslFirstInRange(server.cluster.slots_to_keys, range);
-    if (!n) return NULL;
-    return n->obj;
+    while(n && n->score == hashslot && count--) {
+        keys[j++] = n->obj;
+        n = n->level[0].forward;
+    }
+    return j;
 }
index 0baa7d81aed80e24f5ea102f6667ef50d577ffb2..b6955805c95893b2f730b0b5989ed0b98f434c2c 100644 (file)
@@ -1065,6 +1065,7 @@ long long emptyDb();
 int selectDb(redisClient *c, int id);
 void signalModifiedKey(redisDb *db, robj *key);
 void signalFlushedDb(int dbid);
+unsigned int GetKeysInSlot(unsigned int hashslot, robj **keys, unsigned int count);
 
 /* API to get key arguments from commands */
 #define REDIS_GETKEYS_ALL 0