]> git.saurik.com Git - redis.git/blobdiff - redis.c
extract preloading of multiple keys according to the command prototype to a separate...
[redis.git] / redis.c
diff --git a/redis.c b/redis.c
index 19f431cf97c9c90b9b1bd1c2772ac9122d1d5b08..e342416f1b8a48808d3a681992b9ba6aa5602b84 100644 (file)
--- a/redis.c
+++ b/redis.c
@@ -1886,6 +1886,9 @@ static void loadServerConfig(char *filename) {
             if ((server.appendonly = yesnotoi(argv[1])) == -1) {
                 err = "argument must be 'yes' or 'no'"; goto loaderr;
             }
             if ((server.appendonly = yesnotoi(argv[1])) == -1) {
                 err = "argument must be 'yes' or 'no'"; goto loaderr;
             }
+        } else if (!strcasecmp(argv[0],"appendfilename") && argc == 2) {
+            zfree(server.appendfilename);
+            server.appendfilename = zstrdup(argv[1]);
         } else if (!strcasecmp(argv[0],"appendfsync") && argc == 2) {
             if (!strcasecmp(argv[1],"no")) {
                 server.appendfsync = APPENDFSYNC_NO;
         } else if (!strcasecmp(argv[0],"appendfsync") && argc == 2) {
             if (!strcasecmp(argv[1],"no")) {
                 server.appendfsync = APPENDFSYNC_NO;
@@ -9545,6 +9548,19 @@ static int waitForSwappedKey(redisClient *c, robj *key) {
     return 1;
 }
 
     return 1;
 }
 
+/* Preload keys for any command with first, last and step values for
+ * the command keys prototype, as defined in the command table. */
+static void waitForMultipleSwappedKeys(redisClient *c, struct redisCommand *cmd, int argc, robj **argv) {
+    int j, last;
+    if (cmd->vm_firstkey == 0) return;
+    last = cmd->vm_lastkey;
+    if (last < 0) last = argc+last;
+    for (j = cmd->vm_firstkey; j <= last; j += cmd->vm_keystep) {
+        redisAssert(j < argc);
+        waitForSwappedKey(c,argv[j]);
+    }
+}
+
 /* Preload keys needed for the ZUNION and ZINTER commands. */
 static void zunionInterBlockClientOnSwappedKeys(redisClient *c) {
     int i, num;
 /* Preload keys needed for the ZUNION and ZINTER commands. */
 static void zunionInterBlockClientOnSwappedKeys(redisClient *c) {
     int i, num;
@@ -9565,16 +9581,10 @@ static void zunionInterBlockClientOnSwappedKeys(redisClient *c) {
  * Return 1 if the client is marked as blocked, 0 if the client can
  * continue as the keys it is going to access appear to be in memory. */
 static int blockClientOnSwappedKeys(struct redisCommand *cmd, redisClient *c) {
  * Return 1 if the client is marked as blocked, 0 if the client can
  * continue as the keys it is going to access appear to be in memory. */
 static int blockClientOnSwappedKeys(struct redisCommand *cmd, redisClient *c) {
-    int j, last;
-
     if (cmd->vm_preload_proc != NULL) {
         cmd->vm_preload_proc(c);
     } else {
     if (cmd->vm_preload_proc != NULL) {
         cmd->vm_preload_proc(c);
     } else {
-        if (cmd->vm_firstkey == 0) return 0;
-        last = cmd->vm_lastkey;
-        if (last < 0) last = c->argc+last;
-        for (j = cmd->vm_firstkey; j <= last; j += cmd->vm_keystep)
-            waitForSwappedKey(c,c->argv[j]);
+        waitForMultipleSwappedKeys(c,cmd,c->argc,c->argv);
     }
 
     /* If the client was blocked for at least one key, mark it as blocked. */
     }
 
     /* If the client was blocked for at least one key, mark it as blocked. */