mirror of
https://github.com/fluencelabs/redis
synced 2025-03-30 22:31:03 +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
|
* 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. */
|
* continue as the keys it is going to access appear to be in memory. */
|
||||||
int blockClientOnSwappedKeys(redisClient *c, struct redisCommand *cmd) {
|
int blockClientOnSwappedKeys(redisClient *c, struct redisCommand *cmd) {
|
||||||
int *keyindex, numkeys, j;
|
int *keyindex, numkeys, j, i;
|
||||||
|
|
||||||
keyindex = getKeysFromCommand(cmd,c->argv,c->argc,&numkeys,
|
/* EXEC is a special case, we need to preload all the commands
|
||||||
REDIS_GETKEYS_PRELOAD);
|
* queued into the transaction */
|
||||||
for (j = 0; j < numkeys; j++) waitForSwappedKey(c,c->argv[keyindex[j]]);
|
if (cmd->proc == execCommand) {
|
||||||
getKeysFreeResult(keyindex);
|
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 the client was blocked for at least one key, mark it as blocked. */
|
||||||
if (listLength(c->io_keys)) {
|
if (listLength(c->io_keys)) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user