diff options
author | antirez <antirez@gmail.com> | 2014-06-18 16:14:33 +0200 |
---|---|---|
committer | antirez <antirez@gmail.com> | 2014-06-18 16:14:33 +0200 |
commit | eef369b66a1ef64bdcd45d3d60f46d352fd5235b (patch) | |
tree | f052d8bd151a26d3118bdc2ac016ebbbfc3df30c | |
parent | f392c7737c08467925e8c31d797d004f453031f4 (diff) | |
download | redis-eef369b66a1ef64bdcd45d3d60f46d352fd5235b.tar.gz |
Sentinel framework new layout back ported 2.8.
Functionally the same, but makes cherry picking simpler.
-rwxr-xr-x | runtest-sentinel | 2 | ||||
-rw-r--r-- | tests/instances.tcl (renamed from tests/sentinel.tcl) | 72 | ||||
-rw-r--r-- | tests/sentinel/run.tcl | 22 | ||||
-rw-r--r-- | tests/sentinel/tests/00-base.tcl (renamed from tests/sentinel-tests/00-base.tcl) | 2 | ||||
-rw-r--r-- | tests/sentinel/tests/01-conf-update.tcl (renamed from tests/sentinel-tests/01-conf-update.tcl) | 2 | ||||
-rw-r--r-- | tests/sentinel/tests/02-slaves-reconf.tcl (renamed from tests/sentinel-tests/02-slaves-reconf.tcl) | 2 | ||||
-rw-r--r-- | tests/sentinel/tests/03-runtime-reconf.tcl (renamed from tests/sentinel-tests/03-runtime-reconf.tcl) | 0 | ||||
-rw-r--r-- | tests/sentinel/tests/04-slave-selection.tcl (renamed from tests/sentinel-tests/04-slave-selection.tcl) | 0 | ||||
-rw-r--r-- | tests/sentinel/tests/includes/init-tests.tcl (renamed from tests/sentinel-tests/includes/init-tests.tcl) | 0 | ||||
-rw-r--r-- | tests/sentinel/tmp/.gitignore (renamed from tests/sentinel-tmp/.gitignore) | 0 |
10 files changed, 67 insertions, 35 deletions
diff --git a/runtest-sentinel b/runtest-sentinel index 1650eea73..3fb1ef615 100755 --- a/runtest-sentinel +++ b/runtest-sentinel @@ -11,4 +11,4 @@ then echo "You need tcl 8.5 or newer in order to run the Redis Sentinel test" exit 1 fi -$TCLSH tests/sentinel.tcl $* +$TCLSH tests/sentinel/run.tcl $* diff --git a/tests/sentinel.tcl b/tests/instances.tcl index b19cafc14..26d0737c6 100644 --- a/tests/sentinel.tcl +++ b/tests/instances.tcl @@ -1,14 +1,19 @@ -# Sentinel test suite. Copyright (C) 2014 Salvatore Sanfilippo antirez@gmail.com +# Multi-instance test framework. +# This is used in order to test Sentinel and Redis Cluster, and provides +# basic capabilities for spawning and handling N parallel Redis / Sentinel +# instances. +# +# Copyright (C) 2014 Salvatore Sanfilippo antirez@gmail.com # This softare is released under the BSD License. See the COPYING file for # more information. package require Tcl 8.5 set tcl_precision 17 -source tests/support/redis.tcl -source tests/support/util.tcl -source tests/support/server.tcl -source tests/support/test.tcl +source ../support/redis.tcl +source ../support/util.tcl +source ../support/server.tcl +source ../support/test.tcl set ::verbose 0 set ::pause_on_error 0 @@ -17,45 +22,50 @@ set ::sentinel_instances {} set ::redis_instances {} set ::sentinel_base_port 20000 set ::redis_base_port 30000 -set ::instances_count 5 ; # How many Sentinels / Instances we use at max set ::pids {} ; # We kill everything at exit set ::dirs {} ; # We remove all the temp dirs at exit set ::run_matching {} ; # If non empty, only tests matching pattern are run. -if {[catch {cd tests/sentinel-tmp}]} { - puts "tests/sentinel-tmp directory not found." +if {[catch {cd tmp}]} { + puts "tmp directory not found." puts "Please run this test from the Redis source root." exit 1 } # Spawn a redis or sentinel instance, depending on 'type'. -proc spawn_instance {type base_port count} { +proc spawn_instance {type base_port count {conf {}}} { for {set j 0} {$j < $count} {incr j} { set port [find_available_port $base_port] incr base_port puts "Starting $type #$j at port $port" - # Create a directory for this Sentinel. + # Create a directory for this instance. set dirname "${type}_${j}" lappend ::dirs $dirname catch {exec rm -rf $dirname} file mkdir $dirname - # Write the Sentinel config file. + # Write the instance config file. set cfgfile [file join $dirname $type.conf] set cfg [open $cfgfile w] puts $cfg "port $port" puts $cfg "dir ./$dirname" puts $cfg "logfile log.txt" + # Add additional config files + foreach directive $conf { + puts $cfg $directive + } close $cfg # Finally exec it and remember the pid for later cleanup. if {$type eq "redis"} { set prgname redis-server - } else { + } elseif {$type eq "sentinel"} { set prgname redis-sentinel + } else { + error "Unknown instance type." } - set pid [exec ../../src/${prgname} $cfgfile &] + set pid [exec ../../../src/${prgname} $cfgfile &] lappend ::pids $pid # Check availability @@ -64,11 +74,13 @@ proc spawn_instance {type base_port count} { } # Push the instance into the right list + set link [redis 127.0.0.1 $port] + $link reconnect 1 lappend ::${type}_instances [list \ pid $pid \ host 127.0.0.1 \ port $port \ - link [redis 127.0.0.1 $port] \ + link $link \ ] } } @@ -116,14 +128,6 @@ proc parse_options {} { } } -proc main {} { - parse_options - spawn_instance sentinel $::sentinel_base_port $::instances_count - spawn_instance redis $::redis_base_port $::instances_count - run_tests - cleanup -} - # If --pause-on-error option was passed at startup this function is called # on error in order to give the developer a chance to understand more about # the error condition while the instances are still running. @@ -139,6 +143,14 @@ proc pause_on_error {} { set cmd [lindex $argv 0] if {$cmd eq {continue}} { break + } elseif {$cmd eq {show-redis-logs}} { + set count 10 + if {[lindex $argv 1] ne {}} {set count [lindex $argv 1]} + foreach_redis_id id { + puts "=== REDIS $id ====" + puts [exec tail -$count redis_$id/log.txt] + puts "---------------------\n" + } } elseif {$cmd eq {show-sentinel-logs}} { set count 10 if {[lindex $argv 1] ne {}} {set count [lindex $argv 1]} @@ -182,6 +194,7 @@ proc pause_on_error {} { } elseif {$cmd eq {help}} { puts "ls List Sentinel and Redis instances." puts "show-sentinel-logs \[N\] Show latest N lines of logs." + puts "show-redis-logs \[N\] Show latest N lines of logs." puts "S <id> cmd ... arg Call command in Sentinel <id>." puts "R <id> cmd ... arg Call command in Redis <id>." puts "SI <id> <field> Show Sentinel <id> INFO <field>." @@ -218,7 +231,7 @@ proc test {descr code} { } proc run_tests {} { - set tests [lsort [glob ../sentinel-tests/*]] + set tests [lsort [glob ../tests/*]] foreach test $tests { if {$::run_matching ne {} && [string match $::run_matching $test] == 0} { continue @@ -361,7 +374,7 @@ proc kill_instance {type id} { # Return true of the instance of the specified type/id is killed. proc instance_is_killed {type id} { set pid [get_instance_attrib $type $id pid] - return $pid == -1 + expr {$pid == -1} } # Restart an instance previously killed by kill_instance @@ -377,7 +390,7 @@ proc restart_instance {type id} { } else { set prgname redis-sentinel } - set pid [exec ../../src/${prgname} $cfgfile &] + set pid [exec ../../../src/${prgname} $cfgfile &] set_instance_attrib $type $id pid $pid lappend ::pids $pid @@ -387,11 +400,8 @@ proc restart_instance {type id} { } # Connect with it with a fresh link - set_instance_attrib $type $id link [redis 127.0.0.1 $port] + set link [redis 127.0.0.1 $port] + $link reconnect 1 + set_instance_attrib $type $id link $link } -if {[catch main e]} { - puts $::errorInfo - cleanup - exit 1 -} diff --git a/tests/sentinel/run.tcl b/tests/sentinel/run.tcl new file mode 100644 index 000000000..66198af94 --- /dev/null +++ b/tests/sentinel/run.tcl @@ -0,0 +1,22 @@ +# Sentinel test suite. Copyright (C) 2014 Salvatore Sanfilippo antirez@gmail.com +# This softare is released under the BSD License. See the COPYING file for +# more information. + +cd tests/sentinel +source ../instances.tcl + +set ::instances_count 5 ; # How many instances we use at max. + +proc main {} { + parse_options + spawn_instance sentinel $::sentinel_base_port $::instances_count + spawn_instance redis $::redis_base_port $::instances_count + run_tests + cleanup +} + +if {[catch main e]} { + puts $::errorInfo + cleanup + exit 1 +} diff --git a/tests/sentinel-tests/00-base.tcl b/tests/sentinel/tests/00-base.tcl index 26758de09..a79d0c371 100644 --- a/tests/sentinel-tests/00-base.tcl +++ b/tests/sentinel/tests/00-base.tcl @@ -1,6 +1,6 @@ # Check the basic monitoring and failover capabilities. -source "../sentinel-tests/includes/init-tests.tcl" +source "../tests/includes/init-tests.tcl" if {$::simulate_error} { test "This test will fail" { diff --git a/tests/sentinel-tests/01-conf-update.tcl b/tests/sentinel/tests/01-conf-update.tcl index 4625ebd4c..4998104d2 100644 --- a/tests/sentinel-tests/01-conf-update.tcl +++ b/tests/sentinel/tests/01-conf-update.tcl @@ -1,6 +1,6 @@ # Test Sentinel configuration consistency after partitions heal. -source "../sentinel-tests/includes/init-tests.tcl" +source "../tests/includes/init-tests.tcl" test "We can failover with Sentinel 1 crashed" { set old_port [RI $master_id tcp_port] diff --git a/tests/sentinel-tests/02-slaves-reconf.tcl b/tests/sentinel/tests/02-slaves-reconf.tcl index 843c62dcc..868bae5ec 100644 --- a/tests/sentinel-tests/02-slaves-reconf.tcl +++ b/tests/sentinel/tests/02-slaves-reconf.tcl @@ -5,7 +5,7 @@ # 2) That partitioned slaves point to new master when they are partitioned # away during failover and return at a latter time. -source "../sentinel-tests/includes/init-tests.tcl" +source "../tests/includes/init-tests.tcl" proc 03_test_slaves_replication {} { uplevel 1 { diff --git a/tests/sentinel-tests/03-runtime-reconf.tcl b/tests/sentinel/tests/03-runtime-reconf.tcl index 426596c37..426596c37 100644 --- a/tests/sentinel-tests/03-runtime-reconf.tcl +++ b/tests/sentinel/tests/03-runtime-reconf.tcl diff --git a/tests/sentinel-tests/04-slave-selection.tcl b/tests/sentinel/tests/04-slave-selection.tcl index 3d2ca6484..3d2ca6484 100644 --- a/tests/sentinel-tests/04-slave-selection.tcl +++ b/tests/sentinel/tests/04-slave-selection.tcl diff --git a/tests/sentinel-tests/includes/init-tests.tcl b/tests/sentinel/tests/includes/init-tests.tcl index cb359ea1b..cb359ea1b 100644 --- a/tests/sentinel-tests/includes/init-tests.tcl +++ b/tests/sentinel/tests/includes/init-tests.tcl diff --git a/tests/sentinel-tmp/.gitignore b/tests/sentinel/tmp/.gitignore index f581f73e2..f581f73e2 100644 --- a/tests/sentinel-tmp/.gitignore +++ b/tests/sentinel/tmp/.gitignore |