summaryrefslogtreecommitdiffstats
path: root/tests/unit/shutdown.tcl
blob: 7504851a1391fe43e78b5d00398743403b096d3b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
start_server {tags {"shutdown external:skip"}} {
    test {Temp rdb will be deleted if we use bg_unlink when shutdown} {
        for {set i 0} {$i < 20} {incr i} {
            r set $i $i
        }
        r config set rdb-key-save-delay 10000000

        # Child is dumping rdb
        r bgsave
        wait_for_condition 1000 10 {
            [s rdb_bgsave_in_progress] eq 1
        } else {
            fail "bgsave did not start in time"
        }
        after 100 ;# give the child a bit of time for the file to be created

        set dir [lindex [r config get dir] 1]
        set child_pid [get_child_pid 0]
        set temp_rdb [file join [lindex [r config get dir] 1] temp-${child_pid}.rdb]
        # Temp rdb must be existed
        assert {[file exists $temp_rdb]}

        catch {r shutdown nosave}
        # Make sure the server was killed
        catch {set rd [redis_deferring_client]} e
        assert_match {*connection refused*} $e

        # Temp rdb file must be deleted
        assert {![file exists $temp_rdb]}
    }
}

start_server {tags {"shutdown external:skip"} overrides {save {900 1}}} {
    test {SHUTDOWN ABORT can cancel SIGTERM} {
        r debug pause-cron 1
        set pid [s process_id]
        exec kill -SIGTERM $pid
        after 10;               # Give signal handler some time to run
        r shutdown abort
        verify_log_message 0 "*Shutdown manually aborted*" 0
        r debug pause-cron 0
        r ping
    } {PONG}

    test {Temp rdb will be deleted in signal handle} {
        for {set i 0} {$i < 20} {incr i} {
            r set $i $i
        }
        # It will cost 2s (20 * 100ms) to dump rdb
        r config set rdb-key-save-delay 100000

        set pid [s process_id]
        set temp_rdb [file join [lindex [r config get dir] 1] temp-${pid}.rdb]

        # trigger a shutdown which will save an rdb
        exec kill -SIGINT $pid
        # Wait for creation of temp rdb
        wait_for_condition 50 10 {
            [file exists $temp_rdb]
        } else {
            fail "Can't trigger rdb save on shutdown"
        }

        # Insist on immediate shutdown, temp rdb file must be deleted
        exec kill -SIGINT $pid
        # wait for the rdb file to be deleted
        wait_for_condition 50 10 {
            ![file exists $temp_rdb]
        } else {
            fail "Can't trigger rdb save on shutdown"
        }
    }
}

start_server {tags {"shutdown external:skip"} overrides {save {900 1}}} {
    set pid [s process_id]
    set dump_rdb [file join [lindex [r config get dir] 1] dump.rdb]

    test {RDB save will be failed in shutdown} {
        for {set i 0} {$i < 20} {incr i} {
            r set $i $i
        }

        # create a folder called 'dump.rdb' to trigger temp-rdb rename failure
        # and it will cause rdb save to fail eventually.
        if {[file exists $dump_rdb]} {
            exec rm -f $dump_rdb
        }
        exec mkdir -p $dump_rdb
    }
    test {SHUTDOWN will abort if rdb save failed on signal} {
        # trigger a shutdown which will save an rdb
        exec kill -SIGINT $pid
        wait_for_log_messages 0 {"*Error trying to save the DB, can't exit*"} 0 100 10
    }
    test {SHUTDOWN will abort if rdb save failed on shutdown command} {
        catch {[r shutdown]} err
        assert_match {*Errors trying to SHUTDOWN*} $err
        # make sure the server is still alive
        assert_equal [r ping] {PONG}
    }
    test {SHUTDOWN can proceed if shutdown command was with nosave} {
        catch {[r shutdown nosave]}
        wait_for_log_messages 0 {"*ready to exit, bye bye*"} 0 100 10
    }
    test {Clean up rdb same named folder} {
        exec rm -r $dump_rdb
    }
}


start_server {tags {"shutdown external:skip"} overrides {appendonly no}} {
    test {SHUTDOWN SIGTERM will abort if there's an initial AOFRW - default} {
        r config set shutdown-on-sigterm default
        r config set rdb-key-save-delay 10000000
        for {set i 0} {$i < 10} {incr i} {
            r set $i $i
        }

        r config set appendonly yes
        wait_for_condition 1000 10 {
            [s aof_rewrite_in_progress] eq 1
        } else {
            fail "aof rewrite did not start in time"
        }

        set pid [s process_id]
        exec kill -SIGTERM $pid
        wait_for_log_messages 0 {"*Writing initial AOF, can't exit*"} 0 1000 10

        r config set shutdown-on-sigterm force
    }
}