summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Thunes <cthunes@brewtab.com>2016-03-11 15:22:36 -0500
committerantirez <antirez@gmail.com>2016-05-05 09:34:48 +0200
commit1f3ed652e2a6cfcbbd5300a31f5771f2ce842e98 (patch)
tree7390028b247c845c0f7abe799a4083ba614a5774
parent3a4810678904af013901a896ab0bb3c71856644c (diff)
downloadredis-1f3ed652e2a6cfcbbd5300a31f5771f2ce842e98.tar.gz
Ensure slots are rechecked on EXEC.
Fixes #2515.
-rw-r--r--src/server.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/server.c b/src/server.c
index 6d4a36179..840eecfc3 100644
--- a/src/server.c
+++ b/src/server.c
@@ -2360,7 +2360,8 @@ int processCommand(client *c) {
!(c->flags & CLIENT_MASTER) &&
!(c->flags & CLIENT_LUA &&
server.lua_caller->flags & CLIENT_MASTER) &&
- !(c->cmd->getkeys_proc == NULL && c->cmd->firstkey == 0))
+ !(c->cmd->getkeys_proc == NULL && c->cmd->firstkey == 0 &&
+ c->cmd->proc != execCommand))
{
int hashslot;
@@ -2372,7 +2373,11 @@ int processCommand(client *c) {
int error_code;
clusterNode *n = getNodeByQuery(c,c->cmd,c->argv,c->argc,&hashslot,&error_code);
if (n == NULL || n != server.cluster->myself) {
- flagTransaction(c);
+ if (c->cmd->proc == execCommand) {
+ discardTransaction(c);
+ } else {
+ flagTransaction(c);
+ }
clusterRedirectClient(c,n,hashslot,error_code);
return C_OK;
}