mirror of
https://github.com/fluencelabs/redis
synced 2025-03-17 16:10:50 +00:00
implemented preload of EXEC using the new getKeys() system
This commit is contained in:
parent
a3cf904121
commit
42b2621cdc
@ -969,14 +969,33 @@ void execBlockClientOnSwappedKeys(redisClient *c, struct redisCommand *cmd, int
|
||||
* 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. */
|
||||
int blockClientOnSwappedKeys(redisClient *c, struct redisCommand *cmd) {
|
||||
int *keyindex, numkeys, j;
|
||||
int *keyindex, numkeys, j, i;
|
||||
|
||||
keyindex = getKeysFromCommand(cmd,c->argv,c->argc,&numkeys,
|
||||
REDIS_GETKEYS_PRELOAD);
|
||||
for (j = 0; j < numkeys; j++) waitForSwappedKey(c,c->argv[keyindex[j]]);
|
||||
getKeysFreeResult(keyindex);
|
||||
/* EXEC is a special case, we need to preload all the commands
|
||||
* queued into the transaction */
|
||||
if (cmd->proc == execCommand) {
|
||||
struct redisCommand *mcmd;
|
||||
robj **margv;
|
||||
int margc;
|
||||
|
||||
#warning "Handle EXEC here"
|
||||
if (!(c->flags & REDIS_MULTI)) return 0;
|
||||
for (i = 0; i < c->mstate.count; i++) {
|
||||
mcmd = c->mstate.commands[i].cmd;
|
||||
margc = c->mstate.commands[i].argc;
|
||||
margv = c->mstate.commands[i].argv;
|
||||
|
||||
keyindex = getKeysFromCommand(mcmd,margv,margc,&numkeys,
|
||||
REDIS_GETKEYS_PRELOAD);
|
||||
for (j = 0; j < numkeys; j++)
|
||||
waitForSwappedKey(c,margv[keyindex[j]]);
|
||||
getKeysFreeResult(keyindex);
|
||||
}
|
||||
} else {
|
||||
keyindex = getKeysFromCommand(cmd,c->argv,c->argc,&numkeys,
|
||||
REDIS_GETKEYS_PRELOAD);
|
||||
for (j = 0; j < numkeys; j++) waitForSwappedKey(c,c->argv[keyindex[j]]);
|
||||
getKeysFreeResult(keyindex);
|
||||
}
|
||||
|
||||
/* If the client was blocked for at least one key, mark it as blocked. */
|
||||
if (listLength(c->io_keys)) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user