From a21c81c30e69867ffbab9b19cd01b9868b50a30c Mon Sep 17 00:00:00 2001 From: John Sully Date: Thu, 6 Feb 2020 23:31:12 -0500 Subject: [PATCH 1/2] Add test to detect issue #137 and #132 Former-commit-id: 49d86746edef497a568c6f3a64695d420305cca8 --- src/debug.cpp | 20 +++++++++++++++++++- tests/integration/replication.tcl | 2 ++ tests/test_helper.tcl | 1 + tests/unit/rreplay.tcl | 6 +++--- 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/debug.cpp b/src/debug.cpp index 234f197be..1916dc79b 100644 --- a/src/debug.cpp +++ b/src/debug.cpp @@ -685,8 +685,26 @@ NULL } else if (!strcasecmp(szFromObj(c->argv[1]),"stringmatch-test") && c->argc == 2) { stringmatchlen_fuzz_test(); addReplyStatus(c,"Apparently Redis did not crash: test passed"); - } else if (!strcasecmp(szFromObj(c->argv[1]), "force-master") && c->argc == 2) { + } else if (!strcasecmp(szFromObj(c->argv[1]), "force-master") && c->argc == 3) { c->flags |= CLIENT_MASTER | CLIENT_MASTER_FORCE_REPLY; + if (!strcasecmp(szFromObj(c->argv[2]), "yes")) + { + redisMaster *mi = (redisMaster*)zcalloc(sizeof(redisMaster), MALLOC_LOCAL); + mi->master = c; + listAddNodeHead(g_pserver->masters, mi); + } + else if (strcasecmp(szFromObj(c->argv[2]), "flagonly")) // if we didn't set flagonly assume its an unset + { + serverAssert(c->flags & CLIENT_MASTER); + if (listLength(g_pserver->masters)) + { + redisMaster *mi = (redisMaster*)listNodeValue(listFirst(g_pserver->masters)); + serverAssert(mi->master == c); + listDelNode(g_pserver->masters, listFirst(g_pserver->masters)); + zfree(mi); + } + c->flags &= ~(CLIENT_MASTER | CLIENT_MASTER_FORCE_REPLY); + } addReply(c, shared.ok); } else { addReplySubcommandSyntaxError(c); diff --git a/tests/integration/replication.tcl b/tests/integration/replication.tcl index 0e50c20a9..5ed1ffc52 100644 --- a/tests/integration/replication.tcl +++ b/tests/integration/replication.tcl @@ -309,3 +309,5 @@ start_server {tags {"repl"}} { } } } + + diff --git a/tests/test_helper.tcl b/tests/test_helper.tcl index ec1d7cd31..0711d4cc2 100644 --- a/tests/test_helper.tcl +++ b/tests/test_helper.tcl @@ -37,6 +37,7 @@ set ::all_tests { unit/acl unit/rreplay unit/cron + unit/replication integration/block-repl integration/replication integration/replication-2 diff --git a/tests/unit/rreplay.tcl b/tests/unit/rreplay.tcl index 2029f521d..2fd1d3714 100644 --- a/tests/unit/rreplay.tcl +++ b/tests/unit/rreplay.tcl @@ -1,7 +1,7 @@ -start_server {tags {"rreplay"}} { +start_server {tags {"rreplay"} overrides {active-replica yes}} { test {RREPLAY use current db} { - r debug force-master + r debug force-master flagonly r select 4 r set dbnum invalid r rreplay "f4d5b2b5-4f07-4ee5-a4f2-5dc98507dfce" "*3\r\n\$3\r\nSET\r\n\$5\r\ndbnum\r\n\$4\r\nfour\r\n" @@ -10,7 +10,7 @@ start_server {tags {"rreplay"}} { reconnect test {RREPLAY db different} { - r debug force-master + r debug force-master flagonly r select 4 r set testkey four r rreplay "f4d5b2b5-4f07-4ee5-a4f2-5dc98507dfce" "*3\r\n\$3\r\nSET\r\n\$7\r\ntestkey\r\n\$4\r\nbebe\r\n" 2 From a5a736be732fade593019d8af4d0567ebab4886e Mon Sep 17 00:00:00 2001 From: John Sully Date: Thu, 6 Feb 2020 23:31:31 -0500 Subject: [PATCH 2/2] Fix issue #137 and #132 Former-commit-id: 050d58007f84e4f71b0ae8b053ae4d6fd5bb4ec7 --- src/db.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/db.cpp b/src/db.cpp index 605baaf40..9190d22f1 100644 --- a/src/db.cpp +++ b/src/db.cpp @@ -177,9 +177,8 @@ robj_roptr lookupKeyRead(redisDb *db, robj *key) { * Returns the linked value object if the key exists or NULL if the key * does not exist in the specified DB. */ robj *lookupKeyWrite(redisDb *db, robj *key) { + expireIfNeeded(db,key); robj *o = lookupKey(db,key,LOOKUP_UPDATEMVCC); - if (expireIfNeeded(db,key)) - o = NULL; return o; }