summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/cluster/tests/00-base.tcl19
-rw-r--r--tests/support/cluster_helper.tcl96
-rw-r--r--tests/support/server.tcl13
-rw-r--r--tests/support/util.tcl6
-rw-r--r--tests/test_helper.tcl25
-rw-r--r--tests/unit/cluster/cli.tcl (renamed from tests/unit/cluster.tcl)108
-rw-r--r--tests/unit/cluster/hostnames.tcl (renamed from tests/cluster/tests/27-endpoints.tcl)56
-rw-r--r--tests/unit/cluster/multi-slot-operations.tcl (renamed from tests/cluster/tests/23-multiple-slot-operations.tcl)33
-rw-r--r--tests/unit/cluster/scripting.tcl (renamed from tests/unit/cluster-scripting.tcl)32
-rw-r--r--tests/unit/moduleapi/cluster.tcl57
10 files changed, 235 insertions, 210 deletions
diff --git a/tests/cluster/tests/00-base.tcl b/tests/cluster/tests/00-base.tcl
index e9e99baaa..08ecd5e4a 100644
--- a/tests/cluster/tests/00-base.tcl
+++ b/tests/cluster/tests/00-base.tcl
@@ -63,24 +63,6 @@ test "It is possible to write and read from the cluster" {
cluster_write_test 0
}
-test "Function no-cluster flag" {
- R 1 function load {#!lua name=test
- redis.register_function{function_name='f1', callback=function() return 'hello' end, flags={'no-cluster'}}
- }
- catch {R 1 fcall f1 0} e
- assert_match {*Can not run script on cluster, 'no-cluster' flag is set*} $e
-}
-
-test "Script no-cluster flag" {
- catch {
- R 1 eval {#!lua flags=no-cluster
- return 1
- } 0
- } e
-
- assert_match {*Can not run script on cluster, 'no-cluster' flag is set*} $e
-}
-
test "CLUSTER RESET SOFT test" {
set last_epoch_node0 [get_info_field [R 0 cluster info] cluster_current_epoch]
R 0 FLUSHALL
@@ -92,4 +74,3 @@ test "CLUSTER RESET SOFT test" {
R 1 CLUSTER RESET SOFT
assert {[get_info_field [R 1 cluster info] cluster_current_epoch] eq $last_epoch_node1}
}
-
diff --git a/tests/support/cluster_helper.tcl b/tests/support/cluster_helper.tcl
new file mode 100644
index 000000000..42b99ca83
--- /dev/null
+++ b/tests/support/cluster_helper.tcl
@@ -0,0 +1,96 @@
+# Helper functions specifically for setting up and configuring redis
+# clusters.
+
+# Check if cluster configuration is consistent.
+proc cluster_config_consistent {} {
+ for {set j 0} {$j < [llength $::servers]} {incr j} {
+ if {$j == 0} {
+ set base_cfg [R $j cluster slots]
+ } else {
+ if {[R $j cluster slots] != $base_cfg} {
+ return 0
+ }
+ }
+ }
+
+ return 1
+}
+
+# Wait for cluster configuration to propagate and be consistent across nodes.
+proc wait_for_cluster_propagation {} {
+ wait_for_condition 50 100 {
+ [cluster_config_consistent] eq 1
+ } else {
+ fail "cluster config did not reach a consistent state"
+ }
+}
+
+# Check that cluster nodes agree about "state", or raise an error.
+proc wait_for_cluster_state {state} {
+ for {set j 0} {$j < [llength $::servers]} {incr j} {
+ wait_for_condition 100 50 {
+ [CI $j cluster_state] eq $state
+ } else {
+ fail "Cluster node $j cluster_state:[CI $j cluster_state]"
+ }
+ }
+}
+
+# Default slot allocation for clusters, each master has a continuous block
+# and approximately equal number of slots.
+proc continuous_slot_allocation {masters} {
+ set avg [expr double(16384) / $masters]
+ set slot_start 0
+ for {set j 0} {$j < $masters} {incr j} {
+ set slot_end [expr int(ceil(($j + 1) * $avg) - 1)]
+ R $j cluster addslotsrange $slot_start $slot_end
+ set slot_start [expr $slot_end + 1]
+ }
+}
+
+# Setup method to be executed to configure the cluster before the
+# tests run.
+proc cluster_setup {masters node_count slot_allocator code} {
+ # Have all nodes meet
+ for {set i 1} {$i < $node_count} {incr i} {
+ R 0 CLUSTER MEET [srv -$i host] [srv -$i port]
+ }
+
+ $slot_allocator $masters
+
+ wait_for_cluster_propagation
+
+ # Setup master/replica relationships
+ for {set i 0} {$i < $masters} {incr i} {
+ set nodeid [R $i CLUSTER MYID]
+ for {set j [expr $i + $masters]} {$j < $node_count} {incr j $masters} {
+ R $j CLUSTER REPLICATE $nodeid
+ }
+ }
+
+ wait_for_cluster_propagation
+ wait_for_cluster_state "ok"
+
+ uplevel 1 $code
+}
+
+# Start a cluster with the given number of masters and replicas. Replicas
+# will be allocated to masters by round robin.
+proc start_cluster {masters replicas options code {slot_allocator continuous_slot_allocation}} {
+ set node_count [expr $masters + $replicas]
+
+ # Set the final code to be the tests + cluster setup
+ set code [list cluster_setup $masters $node_count $slot_allocator $code]
+
+ # Configure the starting of multiple servers. Set cluster node timeout
+ # aggressively since many tests depend on ping/pong messages.
+ set cluster_options [list overrides [list cluster-enabled yes cluster-node-timeout 500]]
+ set options [concat $cluster_options $options]
+
+ # Cluster mode only supports a single database, so before executing the tests
+ # it needs to be configured correctly and needs to be reset after the tests.
+ set old_singledb $::singledb
+ set ::singledb 1
+ start_multiple_servers $node_count $options $code
+ set ::singledb $old_singledb
+}
diff --git a/tests/support/server.tcl b/tests/support/server.tcl
index 4a993f552..b673b70ae 100644
--- a/tests/support/server.tcl
+++ b/tests/support/server.tcl
@@ -253,12 +253,15 @@ proc tags {tags code} {
# Write the configuration in the dictionary 'config' in the specified
# file name.
-proc create_server_config_file {filename config} {
+proc create_server_config_file {filename config config_lines} {
set fp [open $filename w+]
foreach directive [dict keys $config] {
puts -nonewline $fp "$directive "
puts $fp [dict get $config $directive]
}
+ foreach {config_line_directive config_line_args} $config_lines {
+ puts $fp "$config_line_directive $config_line_args"
+ }
close $fp
}
@@ -406,6 +409,7 @@ proc start_server {options {code undefined}} {
set tags {}
set args {}
set keep_persistence false
+ set config_lines {}
# parse options
foreach {option value} $options {
@@ -416,6 +420,9 @@ proc start_server {options {code undefined}} {
"overrides" {
set overrides $value
}
+ "config_lines" {
+ set config_lines $value
+ }
"args" {
set args $value
}
@@ -503,7 +510,7 @@ proc start_server {options {code undefined}} {
# write new configuration to temporary file
set config_file [tmpfile redis.conf]
- create_server_config_file $config_file $config
+ create_server_config_file $config_file $config $config_lines
set stdout [format "%s/%s" [dict get $config "dir"] "stdout"]
set stderr [format "%s/%s" [dict get $config "dir"] "stderr"]
@@ -544,7 +551,7 @@ proc start_server {options {code undefined}} {
} else {
dict set config port $port
}
- create_server_config_file $config_file $config
+ create_server_config_file $config_file $config $config_lines
# Truncate log so wait_server_started will not be looking at
# output of the failed server.
diff --git a/tests/support/util.tcl b/tests/support/util.tcl
index fd72dcf75..8153ad8bb 100644
--- a/tests/support/util.tcl
+++ b/tests/support/util.tcl
@@ -77,12 +77,6 @@ proc getInfoProperty {infostr property} {
}
}
-proc cluster_info {r field} {
- if {[regexp "^$field:(.*?)\r\n" [$r cluster info] _ value]} {
- set _ $value
- }
-}
-
# Return value for INFO property
proc status {r property} {
set _ [getInfoProperty [{*}$r info] $property]
diff --git a/tests/test_helper.tcl b/tests/test_helper.tcl
index 2dcccb8cf..5dabd8b1d 100644
--- a/tests/test_helper.tcl
+++ b/tests/test_helper.tcl
@@ -8,6 +8,7 @@ set tcl_precision 17
source tests/support/redis.tcl
source tests/support/aofmanifest.tcl
source tests/support/server.tcl
+source tests/support/cluster_helper.tcl
source tests/support/tmpfile.tcl
source tests/support/test.tcl
source tests/support/util.tcl
@@ -90,11 +91,13 @@ set ::all_tests {
unit/oom-score-adj
unit/shutdown
unit/networking
- unit/cluster
unit/client-eviction
unit/violations
unit/replybufsize
- unit/cluster-scripting
+ unit/cluster/cli
+ unit/cluster/scripting
+ unit/cluster/hostnames
+ unit/cluster/multi-slot-operations
}
# Index to the next test to run in the ::all_tests list.
set ::next_test 0
@@ -197,6 +200,13 @@ proc r {args} {
[srv $level "client"] {*}$args
}
+# Provide easy access to a client for an inner server. Requires a positive
+# index, unlike r which uses an optional negative index.
+proc R {n args} {
+ set level [expr -1*$n]
+ [srv $level "client"] {*}$args
+}
+
proc reconnect {args} {
set level [lindex $args 0]
if {[string length $level] == 0 || ![string is integer $level]} {
@@ -275,14 +285,9 @@ proc s {args} {
status [srv $level "client"] [lindex $args 0]
}
-# Provide easy access to CLUSTER INFO properties. Same semantic as "proc s".
-proc csi {args} {
- set level 0
- if {[string is integer [lindex $args 0]]} {
- set level [lindex $args 0]
- set args [lrange $args 1 end]
- }
- cluster_info [srv $level "client"] [lindex $args 0]
+# Get the specified field from the givens instances cluster info output.
+proc CI {index field} {
+ getInfoProperty [R $index cluster info] $field
}
# Test wrapped into run_solo are sent back from the client to the
diff --git a/tests/unit/cluster.tcl b/tests/unit/cluster/cli.tcl
index 180a19257..9f5dd5206 100644
--- a/tests/unit/cluster.tcl
+++ b/tests/unit/cluster/cli.tcl
@@ -2,20 +2,6 @@
source tests/support/cli.tcl
-proc cluster_info {r field} {
- set _ [getInfoProperty [$r cluster info] $field]
-}
-
-# Provide easy access to CLUSTER INFO properties. Same semantic as "proc s".
-proc csi {args} {
- set level 0
- if {[string is integer [lindex $args 0]]} {
- set level [lindex $args 0]
- set args [lrange $args 1 end]
- }
- cluster_info [srv $level "client"] [lindex $args 0]
-}
-
# make sure the test infra won't use SELECT
set old_singledb $::singledb
set ::singledb 1
@@ -40,9 +26,9 @@ start_multiple_servers 3 [list overrides $base_conf] {
127.0.0.1:[srv -2 port]
wait_for_condition 1000 50 {
- [csi 0 cluster_state] eq {ok} &&
- [csi -1 cluster_state] eq {ok} &&
- [csi -2 cluster_state] eq {ok}
+ [CI 0 cluster_state] eq {ok} &&
+ [CI 1 cluster_state] eq {ok} &&
+ [CI 2 cluster_state] eq {ok}
} else {
fail "Cluster doesn't stabilize"
}
@@ -127,8 +113,8 @@ start_multiple_servers 3 [list overrides $base_conf] {
exec kill -SIGSTOP $node3_pid
wait_for_condition 1000 50 {
- [csi 0 cluster_state] eq {fail} &&
- [csi -1 cluster_state] eq {fail}
+ [CI 0 cluster_state] eq {fail} &&
+ [CI 1 cluster_state] eq {fail}
} else {
fail "Cluster doesn't fail"
}
@@ -162,9 +148,9 @@ start_multiple_servers 5 [list overrides $base_conf] {
wait_for_condition 1000 50 {
- [csi 0 cluster_state] eq {ok} &&
- [csi -1 cluster_state] eq {ok} &&
- [csi -2 cluster_state] eq {ok}
+ [CI 0 cluster_state] eq {ok} &&
+ [CI 1 cluster_state] eq {ok} &&
+ [CI 2 cluster_state] eq {ok}
} else {
fail "Cluster doesn't stabilize"
}
@@ -181,10 +167,10 @@ start_multiple_servers 5 [list overrides $base_conf] {
127.0.0.1:[srv 0 port]
wait_for_condition 1000 50 {
- [csi 0 cluster_state] eq {ok} &&
- [csi -1 cluster_state] eq {ok} &&
- [csi -2 cluster_state] eq {ok} &&
- [csi -3 cluster_state] eq {ok}
+ [CI 0 cluster_state] eq {ok} &&
+ [CI 1 cluster_state] eq {ok} &&
+ [CI 2 cluster_state] eq {ok} &&
+ [CI 3 cluster_state] eq {ok}
} else {
fail "Cluster doesn't stabilize"
}
@@ -222,9 +208,9 @@ test {Migrate the last slot away from a node using redis-cli} {
127.0.0.1:[srv -2 port]
wait_for_condition 1000 50 {
- [csi 0 cluster_state] eq {ok} &&
- [csi -1 cluster_state] eq {ok} &&
- [csi -2 cluster_state] eq {ok}
+ [CI 0 cluster_state] eq {ok} &&
+ [CI 1 cluster_state] eq {ok} &&
+ [CI 2 cluster_state] eq {ok}
} else {
fail "Cluster doesn't stabilize"
}
@@ -239,10 +225,10 @@ test {Migrate the last slot away from a node using redis-cli} {
127.0.0.1:[srv 0 port]
wait_for_condition 1000 50 {
- [csi 0 cluster_state] eq {ok} &&
- [csi -1 cluster_state] eq {ok} &&
- [csi -2 cluster_state] eq {ok} &&
- [csi -3 cluster_state] eq {ok}
+ [CI 0 cluster_state] eq {ok} &&
+ [CI 1 cluster_state] eq {ok} &&
+ [CI 2 cluster_state] eq {ok} &&
+ [CI 3 cluster_state] eq {ok}
} else {
fail "Cluster doesn't stabilize"
}
@@ -273,10 +259,10 @@ test {Migrate the last slot away from a node using redis-cli} {
[catch {exec src/redis-cli --cluster check 127.0.0.1:[srv -1 port]}] == 0 &&
[catch {exec src/redis-cli --cluster check 127.0.0.1:[srv -2 port]}] == 0 &&
[catch {exec src/redis-cli --cluster check 127.0.0.1:[srv -3 port]}] == 0 &&
- [csi 0 cluster_state] eq {ok} &&
- [csi -1 cluster_state] eq {ok} &&
- [csi -2 cluster_state] eq {ok} &&
- [csi -3 cluster_state] eq {ok}
+ [CI 0 cluster_state] eq {ok} &&
+ [CI 1 cluster_state] eq {ok} &&
+ [CI 2 cluster_state] eq {ok} &&
+ [CI 3 cluster_state] eq {ok}
} else {
fail "Cluster doesn't stabilize"
}
@@ -291,10 +277,10 @@ test {Migrate the last slot away from a node using redis-cli} {
# The empty node will become a replica of the new owner before the
# `MOVED` check, so let's wait for the cluster to become stable.
wait_for_condition 1000 50 {
- [csi 0 cluster_state] eq {ok} &&
- [csi -1 cluster_state] eq {ok} &&
- [csi -2 cluster_state] eq {ok} &&
- [csi -3 cluster_state] eq {ok}
+ [CI 0 cluster_state] eq {ok} &&
+ [CI 1 cluster_state] eq {ok} &&
+ [CI 2 cluster_state] eq {ok} &&
+ [CI 3 cluster_state] eq {ok}
} else {
fail "Cluster doesn't stabilize"
}
@@ -336,17 +322,17 @@ start_server [list overrides [list cluster-enabled yes cluster-node-timeout 1 cl
127.0.0.1:[srv -2 port]
wait_for_condition 1000 50 {
- [csi 0 cluster_state] eq {ok} &&
- [csi -1 cluster_state] eq {ok} &&
- [csi -2 cluster_state] eq {ok}
+ [CI 0 cluster_state] eq {ok} &&
+ [CI 1 cluster_state] eq {ok} &&
+ [CI 2 cluster_state] eq {ok}
} else {
fail "Cluster doesn't stabilize"
}
# Make sure each node can meet other nodes
- assert_equal 3 [csi 0 cluster_known_nodes]
- assert_equal 3 [csi -1 cluster_known_nodes]
- assert_equal 3 [csi -2 cluster_known_nodes]
+ assert_equal 3 [CI 0 cluster_known_nodes]
+ assert_equal 3 [CI 1 cluster_known_nodes]
+ assert_equal 3 [CI 2 cluster_known_nodes]
}
test {redis-cli --cluster add-node with cluster-port} {
@@ -356,10 +342,10 @@ start_server [list overrides [list cluster-enabled yes cluster-node-timeout 1 cl
127.0.0.1:[srv 0 port]
wait_for_condition 1000 50 {
- [csi 0 cluster_state] eq {ok} &&
- [csi -1 cluster_state] eq {ok} &&
- [csi -2 cluster_state] eq {ok} &&
- [csi -3 cluster_state] eq {ok}
+ [CI 0 cluster_state] eq {ok} &&
+ [CI 1 cluster_state] eq {ok} &&
+ [CI 2 cluster_state] eq {ok} &&
+ [CI 3 cluster_state] eq {ok}
} else {
fail "Cluster doesn't stabilize"
}
@@ -370,21 +356,21 @@ start_server [list overrides [list cluster-enabled yes cluster-node-timeout 1 cl
127.0.0.1:[srv 0 port]
wait_for_condition 1000 50 {
- [csi 0 cluster_state] eq {ok} &&
- [csi -1 cluster_state] eq {ok} &&
- [csi -2 cluster_state] eq {ok} &&
- [csi -3 cluster_state] eq {ok} &&
- [csi -4 cluster_state] eq {ok}
+ [CI 0 cluster_state] eq {ok} &&
+ [CI 1 cluster_state] eq {ok} &&
+ [CI 2 cluster_state] eq {ok} &&
+ [CI 3 cluster_state] eq {ok} &&
+ [CI 4 cluster_state] eq {ok}
} else {
fail "Cluster doesn't stabilize"
}
# Make sure each node can meet other nodes
- assert_equal 5 [csi 0 cluster_known_nodes]
- assert_equal 5 [csi -1 cluster_known_nodes]
- assert_equal 5 [csi -2 cluster_known_nodes]
- assert_equal 5 [csi -3 cluster_known_nodes]
- assert_equal 5 [csi -4 cluster_known_nodes]
+ assert_equal 5 [CI 0 cluster_known_nodes]
+ assert_equal 5 [CI 1 cluster_known_nodes]
+ assert_equal 5 [CI 2 cluster_known_nodes]
+ assert_equal 5 [CI 3 cluster_known_nodes]
+ assert_equal 5 [CI 4 cluster_known_nodes]
}
# stop 5 servers
}
diff --git a/tests/cluster/tests/27-endpoints.tcl b/tests/unit/cluster/hostnames.tcl
index 32e3e794d..f9fd3f719 100644
--- a/tests/cluster/tests/27-endpoints.tcl
+++ b/tests/unit/cluster/hostnames.tcl
@@ -1,10 +1,8 @@
-source "../tests/includes/init-tests.tcl"
-
# Isolate a node from the cluster and give it a new nodeid
proc isolate_node {id} {
set node_id [R $id CLUSTER MYID]
- R 6 CLUSTER RESET HARD
- for {set j 0} {$j < 20} {incr j} {
+ R $id CLUSTER RESET HARD
+ for {set j 0} {$j < [llength $::servers]} {incr j} {
if { $j eq $id } {
continue
}
@@ -12,21 +10,29 @@ proc isolate_node {id} {
}
}
-proc get_slot_field {slot_output shard_id node_id attrib_id} {
- return [lindex [lindex [lindex $slot_output $shard_id] $node_id] $attrib_id]
-}
-
-test "Create a 6 nodes cluster" {
- cluster_create_with_continuous_slots 3 3
+# Check if cluster's view of hostnames is consistent
+proc are_hostnames_propagated {match_string} {
+ for {set j 0} {$j < [llength $::servers]} {incr j} {
+ set cfg [R $j cluster slots]
+ foreach node $cfg {
+ for {set i 2} {$i < [llength $node]} {incr i} {
+ if {! [string match $match_string [lindex [lindex [lindex $node $i] 3] 1]] } {
+ return 0
+ }
+ }
+ }
+ }
+ return 1
}
-test "Cluster should start ok" {
- assert_cluster_state ok
- wait_for_cluster_propagation
+proc get_slot_field {slot_output shard_id node_id attrib_id} {
+ return [lindex [lindex [lindex $slot_output $shard_id] $node_id] $attrib_id]
}
+# Start a cluster with 3 masters and 4 replicas.
+start_cluster 3 4 {tags {external:skip cluster}} {
test "Set cluster hostnames and verify they are propagated" {
- for {set j 0} {$j < $::cluster_master_nodes + $::cluster_replica_nodes} {incr j} {
+ for {set j 0} {$j < [llength $::servers]} {incr j} {
R $j config set cluster-announce-hostname "host-$j.com"
}
@@ -41,7 +47,7 @@ test "Set cluster hostnames and verify they are propagated" {
}
test "Update hostnames and make sure they are all eventually propagated" {
- for {set j 0} {$j < $::cluster_master_nodes + $::cluster_replica_nodes} {incr j} {
+ for {set j 0} {$j < [llength $::servers]} {incr j} {
R $j config set cluster-announce-hostname "host-updated-$j.com"
}
@@ -56,7 +62,7 @@ test "Update hostnames and make sure they are all eventually propagated" {
}
test "Remove hostnames and make sure they are all eventually propagated" {
- for {set j 0} {$j < $::cluster_master_nodes + $::cluster_replica_nodes} {incr j} {
+ for {set j 0} {$j < [llength $::servers]} {incr j} {
R $j config set cluster-announce-hostname ""
}
@@ -136,7 +142,7 @@ test "Verify the nodes configured with prefer hostname only show hostname for ne
# Have everyone forget node 6 and isolate it from the cluster.
isolate_node 6
- # Set hostnames for the primaries, now that the node is isolated
+ # Set hostnames for the masters, now that the node is isolated
R 0 config set cluster-announce-hostname "shard-1.com"
R 1 config set cluster-announce-hostname "shard-2.com"
R 2 config set cluster-announce-hostname "shard-3.com"
@@ -149,14 +155,14 @@ test "Verify the nodes configured with prefer hostname only show hostname for ne
R 6 DEBUG DROP-CLUSTER-PACKET-FILTER 0
# Have a replica meet the isolated node
- R 3 cluster meet 127.0.0.1 [get_instance_attrib redis 6 port]
+ R 3 cluster meet 127.0.0.1 [srv -6 port]
# Wait for the isolated node to learn about the rest of the cluster,
# which correspond to a single entry in cluster nodes. Note this
# doesn't mean the isolated node has successfully contacted each
# node.
wait_for_condition 50 100 {
- [llength [split [R 6 CLUSTER NODES] "\n"]] eq 21
+ [llength [split [R 6 CLUSTER NODES] "\n"]] eq [expr [llength $::servers] + 1]
} else {
fail "Isolated node didn't learn about the rest of the cluster *"
}
@@ -173,10 +179,10 @@ test "Verify the nodes configured with prefer hostname only show hostname for ne
assert_equal [lindex [get_slot_field $slot_result 0 2 3] 1] "shard-2.com"
assert_equal [lindex [get_slot_field $slot_result 1 2 3] 1] "shard-3.com"
- # Also make sure we know about the isolated primary, we
+ # Also make sure we know about the isolated master, we
# just can't reach it.
- set primary_id [R 0 CLUSTER MYID]
- assert_match "*$primary_id*" [R 6 CLUSTER NODES]
+ set master_id [R 0 CLUSTER MYID]
+ assert_match "*$master_id*" [R 6 CLUSTER NODES]
# Stop dropping cluster packets, and make sure everything
# stabilizes
@@ -199,8 +205,7 @@ test "Test restart will keep hostname information" {
R 0 config set cluster-announce-hostname "restart-1.com"
# Store the hostname in the config
R 0 config rewrite
- kill_instance redis 0
- restart_instance redis 0
+ restart_server 0 true false
set slot_result [R 0 CLUSTER SLOTS]
assert_equal [lindex [get_slot_field $slot_result 0 2 3] 1] "restart-1.com"
@@ -216,4 +221,5 @@ test "Test hostname validation" {
# Note this isn't a valid hostname, but it passes our internal validation
R 0 config set cluster-announce-hostname "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-."
-} \ No newline at end of file
+}
+}
diff --git a/tests/cluster/tests/23-multiple-slot-operations.tcl b/tests/unit/cluster/multi-slot-operations.tcl
index 060ab577a..a5f921408 100644
--- a/tests/cluster/tests/23-multiple-slot-operations.tcl
+++ b/tests/unit/cluster/multi-slot-operations.tcl
@@ -1,7 +1,4 @@
-# Check the multiple slot add and remove commands
-
-source "../tests/includes/init-tests.tcl"
-
+# This test uses a custom slot allocation for testing
proc cluster_allocate_with_continuous_slots_local {n} {
R 0 cluster ADDSLOTSRANGE 0 3276
R 1 cluster ADDSLOTSRANGE 3277 6552
@@ -10,28 +7,13 @@ proc cluster_allocate_with_continuous_slots_local {n} {
R 4 cluster ADDSLOTSRANGE 13105 16383
}
-proc cluster_create_with_continuous_slots_local {masters slaves} {
- cluster_allocate_with_continuous_slots_local $masters
- if {$slaves} {
- cluster_allocate_slaves $masters $slaves
- }
- assert_cluster_state ok
-}
-
-
-test "Create a 5 nodes cluster" {
- cluster_create_with_continuous_slots_local 5 5
-}
-
-test "Cluster should start ok" {
- assert_cluster_state ok
-}
+start_cluster 5 0 {tags {external:skip cluster}} {
-set master1 [Rn 0]
-set master2 [Rn 1]
-set master3 [Rn 2]
-set master4 [Rn 3]
-set master5 [Rn 4]
+set master1 [srv 0 "client"]
+set master2 [srv -1 "client"]
+set master3 [srv -2 "client"]
+set master4 [srv -3 "client"]
+set master5 [srv -4 "client"]
test "Continuous slots distribution" {
assert_match "* 0-3276*" [$master1 CLUSTER NODES]
@@ -113,3 +95,4 @@ test "DELSLOTSRANGE command with several boundary conditions test suite" {
assert_match "* 9829-11000 12001-12100 12201-13104*" [$master4 CLUSTER NODES]
assert_match "*9829 11000*12001 12100*12201 13104*" [$master4 CLUSTER SLOTS]
}
+} cluster_allocate_with_continuous_slots_local
diff --git a/tests/unit/cluster-scripting.tcl b/tests/unit/cluster/scripting.tcl
index 72fc028c3..1ade36ea2 100644
--- a/tests/unit/cluster-scripting.tcl
+++ b/tests/unit/cluster/scripting.tcl
@@ -1,14 +1,4 @@
-# make sure the test infra won't use SELECT
-set old_singledb $::singledb
-set ::singledb 1
-
-start_server {overrides {cluster-enabled yes} tags {external:skip cluster}} {
- r 0 cluster addslotsrange 0 16383
- wait_for_condition 50 100 {
- [csi 0 cluster_state] eq "ok"
- } else {
- fail "Cluster never became 'ok'"
- }
+start_cluster 1 0 {tags {external:skip cluster}} {
test {Eval scripts with shebangs and functions default to no cross slots} {
# Test that scripts with shebang block cross slot operations
@@ -59,6 +49,22 @@ start_server {overrides {cluster-enabled yes} tags {external:skip cluster}} {
return 'OK'
} 1 bar}
}
-}
-set ::singledb $old_singledb
+ test "Function no-cluster flag" {
+ R 0 function load {#!lua name=test
+ redis.register_function{function_name='f1', callback=function() return 'hello' end, flags={'no-cluster'}}
+ }
+ catch {R 0 fcall f1 0} e
+ assert_match {*Can not run script on cluster, 'no-cluster' flag is set*} $e
+ }
+
+ test "Script no-cluster flag" {
+ catch {
+ R 0 eval {#!lua flags=no-cluster
+ return 1
+ } 0
+ } e
+
+ assert_match {*Can not run script on cluster, 'no-cluster' flag is set*} $e
+ }
+}
diff --git a/tests/unit/moduleapi/cluster.tcl b/tests/unit/moduleapi/cluster.tcl
index f4ebaab1b..b2603a74d 100644
--- a/tests/unit/moduleapi/cluster.tcl
+++ b/tests/unit/moduleapi/cluster.tcl
@@ -1,59 +1,27 @@
-# Primitive tests on cluster-enabled redis with modules using redis-cli
+# Primitive tests on cluster-enabled redis with modules
source tests/support/cli.tcl
-set testmodule [file normalize tests/modules/blockonkeys.so]
-set testmodule_nokey [file normalize tests/modules/blockonbackground.so]
-set testmodule_blockedclient [file normalize tests/modules/blockedclient.so]
-
-# make sure the test infra won't use SELECT
-set old_singledb $::singledb
-set ::singledb 1
-
# cluster creation is complicated with TLS, and the current tests don't really need that coverage
tags {tls:skip external:skip cluster modules} {
-# start three servers
-set base_conf [list cluster-enabled yes cluster-node-timeout 1 loadmodule $testmodule]
-start_server [list overrides $base_conf] {
-start_server [list overrides $base_conf] {
-start_server [list overrides $base_conf] {
+set testmodule_nokey [file normalize tests/modules/blockonbackground.so]
+set testmodule_blockedclient [file normalize tests/modules/blockedclient.so]
+set testmodule [file normalize tests/modules/blockonkeys.so]
+
+set modules [list loadmodule $testmodule loadmodule $testmodule_nokey loadmodule $testmodule_blockedclient]
+start_cluster 3 0 [list config_lines $modules] {
set node1 [srv 0 client]
set node2 [srv -1 client]
set node3 [srv -2 client]
set node3_pid [srv -2 pid]
- # the "overrides" mechanism can only support one "loadmodule" directive
- $node1 module load $testmodule_nokey
- $node2 module load $testmodule_nokey
- $node3 module load $testmodule_nokey
-
- $node1 module load $testmodule_blockedclient
- $node2 module load $testmodule_blockedclient
- $node3 module load $testmodule_blockedclient
-
- test {Create 3 node cluster} {
- exec src/redis-cli --cluster-yes --cluster create \
- 127.0.0.1:[srv 0 port] \
- 127.0.0.1:[srv -1 port] \
- 127.0.0.1:[srv -2 port]
-
- wait_for_condition 1000 50 {
- [csi 0 cluster_state] eq {ok} &&
- [csi -1 cluster_state] eq {ok} &&
- [csi -2 cluster_state] eq {ok}
- } else {
- fail "Cluster doesn't stabilize"
- }
- }
-
test "Run blocking command (blocked on key) on cluster node3" {
# key9184688 is mapped to slot 10923 (first slot of node 3)
set node3_rd [redis_deferring_client -2]
$node3_rd fsl.bpop key9184688 0
$node3_rd flush
-
wait_for_condition 50 100 {
[s -2 blocked_clients] eq {1}
} else {
@@ -164,8 +132,8 @@ start_server [list overrides $base_conf] {
exec kill -SIGSTOP $node3_pid
wait_for_condition 1000 50 {
- [csi 0 cluster_state] eq {fail} &&
- [csi -1 cluster_state] eq {fail}
+ [CI 0 cluster_state] eq {fail} &&
+ [CI 1 cluster_state] eq {fail}
} else {
fail "Cluster doesn't fail"
}
@@ -190,12 +158,5 @@ start_server [list overrides $base_conf] {
exec kill -SIGCONT $node3_pid
$node1_rd close
$node2_rd close
-
-# stop three servers
-}
}
}
-
-} ;# tags
-
-set ::singledb $old_singledb