1+ proc scan_interleaved {primary replica cmd {key " " } args} {
2+ set cursor 0
3+ set keys {}
4+ set toggle [randomInt 2]
5+ while {1} {
6+ if {$key != " " } {
7+ set cmd_args [list $key $cursor {*}$args ]
8+ } else {
9+ set cmd_args [list $cursor {*}$args ]
10+ }
11+
12+ if {$toggle == 0} {
13+ set scan_result [$primary $cmd {*}$cmd_args ]
14+ } else {
15+ set scan_result [$replica $cmd {*}$cmd_args ]
16+ }
17+ lappend keys {*}[lindex $scan_result 1]
18+ if {[lindex $scan_result 0] eq 0} {
19+ break
20+ }
21+ set cursor [lindex $scan_result 0]
22+ set toggle [expr {1 - $toggle }]
23+ }
24+ return $keys
25+ }
26+
127test {scan family consistency with configured hash seed} {
2- start_server {tags {" external:skip" }} {
3-
4- set fixed_seed " aabbccddeeffgghh"
5- set shared_overrides [list appendonly no save " " hash-seed $fixed_seed activedefrag no hz 1]
6-
7- start_server [list overrides $shared_overrides ] {
8- set primary_host [srv 0 host]
9- set primary_port [srv 0 port]
10-
11- start_server [list overrides $shared_overrides ] {
12- set primary [srv -1 client]
13- set replica [srv 0 client]
14-
15- $primary flushall
16- $replica replicaof $primary_host $primary_port
17- wait_replica_online $primary
18-
19- set n 50
20- for {set i 0} {$i < $n } {incr i} {
21- $primary set " k:$i " x
22- $primary hset h " f:$i " $i
23- $primary sadd s " m:$i "
24- $primary zadd z $i " m:$i "
25- }
26-
27- wait_for_condition 200 50 {
28- [$replica dbsize] == [$primary dbsize]
29- } else {
30- fail " replica did not catch up dbsize (primary=[ $primary dbsize] , replica=[ $replica dbsize] )"
31- }
32- set cursor {{0} {}}
33- while {1} {
34- set primary_cursor_next [$primary scan [lindex $cursor 0]]
35- set replica_cursor_next [$replica scan [lindex $cursor 0]]
36- assert_equal $primary_cursor_next $replica_cursor_next
37- if {[lindex $primary_cursor_next 0] eq " 0" } {
38- assert_equal " 0" [lindex $replica_cursor_next 0]
39- break
40- }
41- set cursor $primary_cursor_next
42- }
43-
44- foreach {cmd key} {hscan h sscan s zscan z} {
45- set cursor {{0} {}}
46- while {1} {
47- set primary_cursor_next [$primary $cmd $key [lindex $cursor 0]]
48- set replica_cursor_next [$replica $cmd $key [lindex $cursor 0]]
49- assert_equal $primary_cursor_next $replica_cursor_next
50- if {[lindex $primary_cursor_next 0] eq " 0" } {
51- assert_equal " 0" [lindex $replica_cursor_next 0]
52- break
53- }
54- set cursor $primary_cursor_next
55- }
56- }
57- }
28+ set fixed_seed [randstring 16 16 alpha]
29+ set shared_overrides [list appendonly no save " " hash-seed $fixed_seed ]
30+
31+ start_multiple_servers 2 [list overrides $shared_overrides ] {
32+ set primary [srv -1 client]
33+ set replica [srv 0 client]
34+
35+ set primary_host [srv -1 host]
36+ set primary_port [srv -1 port]
37+
38+ $primary flushall
39+ $replica replicaof $primary_host $primary_port
40+ wait_for_sync $replica
41+
42+ set n 50
43+ for {set i 0} {$i < $n } {incr i} {
44+ $primary set " k:$i " x
45+ $primary hset h " f:$i " $i
46+ $primary sadd s " m:$i "
47+ $primary zadd z $i " m:$i "
48+ }
49+
50+ wait_for_condition 200 50 {
51+ [$replica dbsize] == [$primary dbsize]
52+ } else {
53+ fail " replica did not catch up dbsize (primary=[ $primary dbsize] , replica=[ $replica dbsize] )"
54+ }
55+
56+ set keys [scan_interleaved $primary $replica scan]
57+ set keys [lsort -unique $keys ]
58+ assert_equal [expr {$n +3}] [llength $keys ]
59+
60+ foreach {cmd key extra} {hscan h {novalues} sscan s {} zscan z {noscores}} {
61+ set items [scan_interleaved $primary $replica $cmd $key {*}$extra ]
62+ set items [lsort -unique $items ]
63+ assert_equal $n [llength $items ]
5864 }
5965 }
60- }
66+ } {} {external:skip}
0 commit comments