From 3f8756a06ae48258779ffc7cbef605a3ec0a926f Mon Sep 17 00:00:00 2001 From: Binbin Date: Tue, 22 Nov 2022 17:20:24 +0800 Subject: Fix set with duplicate elements causes sdiff to hang (#11530) This payload produces a set with duplicate elements (listpack encoding): ``` restore _key 0 "\x14\x25\x25\x00\x00\x00\x0A\x00\x06\x01\x82\x5F\x35\x03\x04\x01\x82\x5F\x31\x03\x82\x5F\x33\x03\x00\x01\x82\x5F\x39\x03\x82\x5F\x33\x03\x08\x01\x02\x01\xFF\x0B\x00\x31\xBE\x7D\x41\x01\x03\x5B\xEC" smembers key 1) "6" 2) "_5" 3) "4" 4) "_1" 5) "_3" ---> dup 6) "0" 7) "_9" 8) "_3" ---> dup 9) "8" 10) "2" ``` This kind of sets will cause SDIFF to hang, SDIFF generated a broken protocol and left the client hung. (Expected ten elements, but only got nine elements due to the duplication.) If we set `sanitize-dump-payload` to yes, we will be able to find the duplicate elements and report "ERR Bad data format". Discovered and discussed in #11290. This PR also improve prints when corrupt-dump-fuzzer hangs, it will print the cmds and the payload, an example like: ``` Testing integration/corrupt-dump-fuzzer [TIMEOUT]: clients state report follows. sock6 => (SPAWNED SERVER) pid:28884 Killing still running Redis server 28884 commands caused test to hang: SDIFF __key payload that caused test to hang: "\x14\balabala" ``` Co-authored-by: Oran Agra --- tests/support/util.tcl | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'tests/support') diff --git a/tests/support/util.tcl b/tests/support/util.tcl index 22774868c..b2c9bdf7a 100644 --- a/tests/support/util.tcl +++ b/tests/support/util.tcl @@ -730,13 +730,20 @@ proc generate_fuzzy_traffic_on_key {key duration} { } else { set err [format "%s" $err] ;# convert to string for pattern matching if {[string match "*SIGTERM*" $err]} { - puts "command caused test to hang? $cmd" - exit 1 + puts "commands caused test to hang:" + foreach cmd $sent { + foreach arg $cmd { + puts -nonewline "[string2printable $arg] " + } + puts "" + } + # Re-raise, let handler up the stack take care of this. + error $err $::errorInfo } } } - # print stats so that we know if we managed to generate commands that actually made senes + # print stats so that we know if we managed to generate commands that actually made sense #if {$::verbose} { # set count [llength $sent] # puts "Fuzzy traffic sent: $count, succeeded: $succeeded" -- cgit v1.2.1