From 11dc4e59b365d6cd8699604d7d1c1025b6bb6259 Mon Sep 17 00:00:00 2001 From: Binbin Date: Sat, 17 Jul 2021 14:54:06 +0800 Subject: [PATCH] SMOVE only notify dstset when the addition is successful. (#9244) in case dest key already contains the member, the dest key isn't modified, so the command shouldn't invalidate watch. --- src/t_set.c | 2 +- tests/unit/type/set.tcl | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/t_set.c b/src/t_set.c index b58bb6fc0..88c5c7994 100644 --- a/src/t_set.c +++ b/src/t_set.c @@ -392,12 +392,12 @@ void smoveCommand(client *c) { } signalModifiedKey(c,c->db,c->argv[1]); - signalModifiedKey(c,c->db,c->argv[2]); server.dirty++; /* An extra key has changed when ele was successfully added to dstset */ if (setTypeAdd(dstset,ele->ptr)) { server.dirty++; + signalModifiedKey(c,c->db,c->argv[2]); notifyKeyspaceEvent(NOTIFY_SET,"sadd",c->argv[2],c->db->id); } addReply(c,shared.cone); diff --git a/tests/unit/type/set.tcl b/tests/unit/type/set.tcl index a12eae5b3..463dc5859 100644 --- a/tests/unit/type/set.tcl +++ b/tests/unit/type/set.tcl @@ -828,6 +828,28 @@ start_server { lsort [r smembers set{t}] } {a b c} + test "SMOVE only notify dstset when the addition is successful" { + r del srcset{t} + r del dstset{t} + + r sadd srcset{t} a b + r sadd dstset{t} a + + r watch dstset{t} + + r multi + r sadd dstset{t} c + + set r2 [redis_client] + $r2 smove srcset{t} dstset{t} a + + # The dstset is actually unchanged, multi should success + r exec + set res [r scard dstset{t}] + assert_equal $res 2 + $r2 close + } + tags {slow} { test {intsets implementation stress testing} { for {set j 0} {$j < 20} {incr j} {