diff options
Diffstat (limited to 'examples/redis-unstable/tests/unit/shutdown.tcl')
| -rw-r--r-- | examples/redis-unstable/tests/unit/shutdown.tcl | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/examples/redis-unstable/tests/unit/shutdown.tcl b/examples/redis-unstable/tests/unit/shutdown.tcl new file mode 100644 index 0000000..7504851 --- /dev/null +++ b/examples/redis-unstable/tests/unit/shutdown.tcl | |||
| @@ -0,0 +1,133 @@ | |||
| 1 | start_server {tags {"shutdown external:skip"}} { | ||
| 2 | test {Temp rdb will be deleted if we use bg_unlink when shutdown} { | ||
| 3 | for {set i 0} {$i < 20} {incr i} { | ||
| 4 | r set $i $i | ||
| 5 | } | ||
| 6 | r config set rdb-key-save-delay 10000000 | ||
| 7 | |||
| 8 | # Child is dumping rdb | ||
| 9 | r bgsave | ||
| 10 | wait_for_condition 1000 10 { | ||
| 11 | [s rdb_bgsave_in_progress] eq 1 | ||
| 12 | } else { | ||
| 13 | fail "bgsave did not start in time" | ||
| 14 | } | ||
| 15 | after 100 ;# give the child a bit of time for the file to be created | ||
| 16 | |||
| 17 | set dir [lindex [r config get dir] 1] | ||
| 18 | set child_pid [get_child_pid 0] | ||
| 19 | set temp_rdb [file join [lindex [r config get dir] 1] temp-${child_pid}.rdb] | ||
| 20 | # Temp rdb must be existed | ||
| 21 | assert {[file exists $temp_rdb]} | ||
| 22 | |||
| 23 | catch {r shutdown nosave} | ||
| 24 | # Make sure the server was killed | ||
| 25 | catch {set rd [redis_deferring_client]} e | ||
| 26 | assert_match {*connection refused*} $e | ||
| 27 | |||
| 28 | # Temp rdb file must be deleted | ||
| 29 | assert {![file exists $temp_rdb]} | ||
| 30 | } | ||
| 31 | } | ||
| 32 | |||
| 33 | start_server {tags {"shutdown external:skip"} overrides {save {900 1}}} { | ||
| 34 | test {SHUTDOWN ABORT can cancel SIGTERM} { | ||
| 35 | r debug pause-cron 1 | ||
| 36 | set pid [s process_id] | ||
| 37 | exec kill -SIGTERM $pid | ||
| 38 | after 10; # Give signal handler some time to run | ||
| 39 | r shutdown abort | ||
| 40 | verify_log_message 0 "*Shutdown manually aborted*" 0 | ||
| 41 | r debug pause-cron 0 | ||
| 42 | r ping | ||
| 43 | } {PONG} | ||
| 44 | |||
| 45 | test {Temp rdb will be deleted in signal handle} { | ||
| 46 | for {set i 0} {$i < 20} {incr i} { | ||
| 47 | r set $i $i | ||
| 48 | } | ||
| 49 | # It will cost 2s (20 * 100ms) to dump rdb | ||
| 50 | r config set rdb-key-save-delay 100000 | ||
| 51 | |||
| 52 | set pid [s process_id] | ||
| 53 | set temp_rdb [file join [lindex [r config get dir] 1] temp-${pid}.rdb] | ||
| 54 | |||
| 55 | # trigger a shutdown which will save an rdb | ||
| 56 | exec kill -SIGINT $pid | ||
| 57 | # Wait for creation of temp rdb | ||
| 58 | wait_for_condition 50 10 { | ||
| 59 | [file exists $temp_rdb] | ||
| 60 | } else { | ||
| 61 | fail "Can't trigger rdb save on shutdown" | ||
| 62 | } | ||
| 63 | |||
| 64 | # Insist on immediate shutdown, temp rdb file must be deleted | ||
| 65 | exec kill -SIGINT $pid | ||
| 66 | # wait for the rdb file to be deleted | ||
| 67 | wait_for_condition 50 10 { | ||
| 68 | ![file exists $temp_rdb] | ||
| 69 | } else { | ||
| 70 | fail "Can't trigger rdb save on shutdown" | ||
| 71 | } | ||
| 72 | } | ||
| 73 | } | ||
| 74 | |||
| 75 | start_server {tags {"shutdown external:skip"} overrides {save {900 1}}} { | ||
| 76 | set pid [s process_id] | ||
| 77 | set dump_rdb [file join [lindex [r config get dir] 1] dump.rdb] | ||
| 78 | |||
| 79 | test {RDB save will be failed in shutdown} { | ||
| 80 | for {set i 0} {$i < 20} {incr i} { | ||
| 81 | r set $i $i | ||
| 82 | } | ||
| 83 | |||
| 84 | # create a folder called 'dump.rdb' to trigger temp-rdb rename failure | ||
| 85 | # and it will cause rdb save to fail eventually. | ||
| 86 | if {[file exists $dump_rdb]} { | ||
| 87 | exec rm -f $dump_rdb | ||
| 88 | } | ||
| 89 | exec mkdir -p $dump_rdb | ||
| 90 | } | ||
| 91 | test {SHUTDOWN will abort if rdb save failed on signal} { | ||
| 92 | # trigger a shutdown which will save an rdb | ||
| 93 | exec kill -SIGINT $pid | ||
| 94 | wait_for_log_messages 0 {"*Error trying to save the DB, can't exit*"} 0 100 10 | ||
| 95 | } | ||
| 96 | test {SHUTDOWN will abort if rdb save failed on shutdown command} { | ||
| 97 | catch {[r shutdown]} err | ||
| 98 | assert_match {*Errors trying to SHUTDOWN*} $err | ||
| 99 | # make sure the server is still alive | ||
| 100 | assert_equal [r ping] {PONG} | ||
| 101 | } | ||
| 102 | test {SHUTDOWN can proceed if shutdown command was with nosave} { | ||
| 103 | catch {[r shutdown nosave]} | ||
| 104 | wait_for_log_messages 0 {"*ready to exit, bye bye*"} 0 100 10 | ||
| 105 | } | ||
| 106 | test {Clean up rdb same named folder} { | ||
| 107 | exec rm -r $dump_rdb | ||
| 108 | } | ||
| 109 | } | ||
| 110 | |||
| 111 | |||
| 112 | start_server {tags {"shutdown external:skip"} overrides {appendonly no}} { | ||
| 113 | test {SHUTDOWN SIGTERM will abort if there's an initial AOFRW - default} { | ||
| 114 | r config set shutdown-on-sigterm default | ||
| 115 | r config set rdb-key-save-delay 10000000 | ||
| 116 | for {set i 0} {$i < 10} {incr i} { | ||
| 117 | r set $i $i | ||
| 118 | } | ||
| 119 | |||
| 120 | r config set appendonly yes | ||
| 121 | wait_for_condition 1000 10 { | ||
| 122 | [s aof_rewrite_in_progress] eq 1 | ||
| 123 | } else { | ||
| 124 | fail "aof rewrite did not start in time" | ||
| 125 | } | ||
| 126 | |||
| 127 | set pid [s process_id] | ||
| 128 | exec kill -SIGTERM $pid | ||
| 129 | wait_for_log_messages 0 {"*Writing initial AOF, can't exit*"} 0 1000 10 | ||
| 130 | |||
| 131 | r config set shutdown-on-sigterm force | ||
| 132 | } | ||
| 133 | } | ||
