summaryrefslogtreecommitdiff
path: root/tests/unit/oom-score-adj.tcl
blob: b226a266acc3e7c82553c34fa7115523633c869a (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
set system_name [string tolower [exec uname -s]]
set user_id [exec id -u]

if {$system_name eq {linux}} {
    start_server {tags {"oom-score-adj external:skip"}} {
        proc get_oom_score_adj {{pid ""}} {
            if {$pid == ""} {
                set pid [srv 0 pid]
            }
            set fd [open "/proc/$pid/oom_score_adj" "r"]
            set val [gets $fd]
            close $fd

            return $val
        }

        proc set_oom_score_adj {score {pid ""}} {
            if {$pid == ""} {
                set pid [srv 0 pid]
            }
            set fd [open "/proc/$pid/oom_score_adj" "w"]
            puts $fd $score
            close $fd
        }

        test {CONFIG SET oom-score-adj works as expected} {
            set base [get_oom_score_adj]

            # Enable oom-score-adj, check defaults
            r config set oom-score-adj-values "10 20 30"
            r config set oom-score-adj yes

            assert {[get_oom_score_adj] == [expr $base + 10]}

            # Modify current class
            r config set oom-score-adj-values "15 20 30"
            assert {[get_oom_score_adj] == [expr $base + 15]}

            # Check replica class
            r replicaof localhost 1
            assert {[get_oom_score_adj] == [expr $base + 20]}
            r replicaof no one
            assert {[get_oom_score_adj] == [expr $base + 15]}

            # Check child process
            r set key-a value-a
            r config set rdb-key-save-delay 1000000
            r bgsave

            set child_pid [get_child_pid 0]
            # Wait until background child process to setOOMScoreAdj success.
            wait_for_condition 100 10 {
                [get_oom_score_adj $child_pid] == [expr $base + 30]
            } else {
                fail "Set oom-score-adj of background child process is not ok"
            }
        }

        # Failed oom-score-adj tests can only run unprivileged
        if {$user_id != 0} {
            test {CONFIG SET oom-score-adj handles configuration failures} {
                # Bad config
                r config set oom-score-adj no
                r config set oom-score-adj-values "-1000 -1000 -1000"

                # Make sure it fails
                catch {r config set oom-score-adj yes} e
                assert_match {*Failed to set*} $e

                # Make sure it remains off
                assert {[r config get oom-score-adj] == "oom-score-adj no"}

                # Fix config
                r config set oom-score-adj-values "0 100 100"
                r config set oom-score-adj yes

                # Make sure it fails
                catch {r config set oom-score-adj-values "-1000 -1000 -1000"} e
                assert_match {*Failed*} $e

                # Make sure previous values remain
                assert {[r config get oom-score-adj-values] == {oom-score-adj-values {0 100 100}}}
            }
        }

        test {CONFIG SET oom-score-adj-values doesn't touch proc when disabled} {
            set orig_osa [get_oom_score_adj]
            
            set other_val1 [expr $orig_osa + 1]
            set other_val2 [expr $orig_osa + 2]
            
            r config set oom-score-adj no
            
            set_oom_score_adj $other_val2
            assert_equal [get_oom_score_adj] $other_val2

            r config set oom-score-adj-values "$other_val1 $other_val1 $other_val1"
            
            assert_equal [get_oom_score_adj] $other_val2
        }

        test {CONFIG SET oom score restored on disable} {
            r config set oom-score-adj no
            set_oom_score_adj 22
            assert_equal [get_oom_score_adj] 22

            r config set oom-score-adj-values "9 9 9" oom-score-adj yes
            assert_equal [get_oom_score_adj] [expr 9+22]

            r config set oom-score-adj no
            assert_equal [get_oom_score_adj] 22
        }

        test {CONFIG SET oom score relative and absolute} {
            set custom_oom 9
            r config set oom-score-adj no
            set base_oom [get_oom_score_adj]

            r config set oom-score-adj-values "$custom_oom $custom_oom $custom_oom" oom-score-adj relative
            assert_equal [get_oom_score_adj] [expr $base_oom+$custom_oom]

            r config set oom-score-adj absolute
            assert_equal [get_oom_score_adj] $custom_oom
        }
    }
}