summaryrefslogtreecommitdiff
path: root/redis.c
diff options
context:
space:
mode:
authorPieter Noordhuis <pcnoordhuis@gmail.com>2010-05-07 12:45:27 +0200
committerPieter Noordhuis <pcnoordhuis@gmail.com>2010-05-07 12:45:27 +0200
commit6f07874621392f7f0eb5f092f79f1afe8939b9c3 (patch)
tree1d5a4143d0062019dacc521852c371d520a954d1 /redis.c
parentf3b52411db839f4716bdbd7ac9f90331c94f0ccd (diff)
downloadredis-6f07874621392f7f0eb5f092f79f1afe8939b9c3.tar.gz
extract preloading of multiple keys according to the command prototype to a separate function
Diffstat (limited to 'redis.c')
-rw-r--r--redis.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/redis.c b/redis.c
index 7e27e0fbf..e342416f1 100644
--- a/redis.c
+++ b/redis.c
@@ -9548,6 +9548,19 @@ static int waitForSwappedKey(redisClient *c, robj *key) {
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;
@@ -9568,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) {
- int j, last;
-
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. */