summaryrefslogtreecommitdiffstats
path: root/tests/unit/oom-score-adj.tcl
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-14 13:40:54 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-14 13:40:54 +0000
commit317c0644ccf108aa23ef3fd8358bd66c2840bfc0 (patch)
treec417b3d25c86b775989cb5ac042f37611b626c8a /tests/unit/oom-score-adj.tcl
parentInitial commit. (diff)
downloadredis-317c0644ccf108aa23ef3fd8358bd66c2840bfc0.tar.xz
redis-317c0644ccf108aa23ef3fd8358bd66c2840bfc0.zip
Adding upstream version 5:7.2.4.upstream/5%7.2.4upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'tests/unit/oom-score-adj.tcl')
-rw-r--r--tests/unit/oom-score-adj.tcl131
1 files changed, 131 insertions, 0 deletions
diff --git a/tests/unit/oom-score-adj.tcl b/tests/unit/oom-score-adj.tcl
new file mode 100644
index 0000000..6c7b713
--- /dev/null
+++ b/tests/unit/oom-score-adj.tcl
@@ -0,0 +1,131 @@
+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
+ }
+
+ test {CONFIG SET out-of-range oom score} {
+ assert_error {ERR *must be between -2000 and 2000*} {r config set oom-score-adj-values "-2001 -2001 -2001"}
+ assert_error {ERR *must be between -2000 and 2000*} {r config set oom-score-adj-values "2001 2001 2001"}
+ }
+ }
+}