Commit 2fa077b0 authored by Oran Agra's avatar Oran Agra
Browse files

Avoid rejecting WATCH / UNWATCH, like MULTI/EXEC/DISCARD

Much like MULTI/EXEC/DISCARD, the WATCH and UNWATCH are not actually
operating on the database or server state, but instead operate on the
client state. the client may send them all in one long pipeline and check
all the responses only at the end, so failing them may lead to a
mismatch between the client state on the server and the one on the
client end, and execute the wrong commands (ones that were meant to be
discarded)

the watched keys are not actually stored in the client struct, but they
are in fact part of the client state. for instance, they're not cleared
or moved in SWAPDB or FLUSHDB.
parent 44b76a75
...@@ -776,11 +776,11 @@ struct redisCommand redisCommandTable[] = { ...@@ -776,11 +776,11 @@ struct redisCommand redisCommandTable[] = {
0,NULL,0,0,0,0,0,0}, 0,NULL,0,0,0,0,0,0},
{"watch",watchCommand,-2, {"watch",watchCommand,-2,
"no-script fast @transaction", "no-script fast ok-loading ok-stale @transaction",
0,NULL,1,-1,1,0,0,0}, 0,NULL,1,-1,1,0,0,0},
{"unwatch",unwatchCommand,1, {"unwatch",unwatchCommand,1,
"no-script fast @transaction", "no-script fast ok-loading ok-stale @transaction",
0,NULL,0,0,0,0,0,0}, 0,NULL,0,0,0,0,0,0},
{"cluster",clusterCommand,-2, {"cluster",clusterCommand,-2,
...@@ -3627,6 +3627,8 @@ int processCommand(client *c) { ...@@ -3627,6 +3627,8 @@ int processCommand(client *c) {
c->cmd->proc != multiCommand && c->cmd->proc != multiCommand &&
c->cmd->proc != execCommand && c->cmd->proc != execCommand &&
c->cmd->proc != discardCommand && c->cmd->proc != discardCommand &&
c->cmd->proc != watchCommand &&
c->cmd->proc != unwatchCommand &&
!(c->cmd->proc == shutdownCommand && !(c->cmd->proc == shutdownCommand &&
c->argc == 2 && c->argc == 2 &&
tolower(((char*)c->argv[1]->ptr)[0]) == 'n') && tolower(((char*)c->argv[1]->ptr)[0]) == 'n') &&
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment