2020-08-12 10:58:56 -04:00
|
|
|
set system_name [string tolower [exec uname -s]]
|
|
|
|
set user_id [exec id -u]
|
|
|
|
|
|
|
|
if {$system_name eq {linux}} {
|
2021-06-09 08:13:24 -04:00
|
|
|
start_server {tags {"oom-score-adj external:skip"}} {
|
2020-08-12 10:58:56 -04:00
|
|
|
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
|
|
|
|
}
|
|
|
|
|
2021-12-07 09:05:51 -05:00
|
|
|
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
|
|
|
|
}
|
|
|
|
|
2020-08-12 10:58:56 -04:00
|
|
|
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
|
2020-09-09 11:58:06 -04:00
|
|
|
r config set rdb-key-save-delay 1000000
|
2020-08-12 10:58:56 -04:00
|
|
|
r bgsave
|
|
|
|
|
if diskless repl child is killed, make sure to reap the pid (#7742)
Starting redis 6.0 and the changes we made to the diskless master to be
suitable for TLS, I made the master avoid reaping (wait3) the pid of the
child until we know all replicas are done reading their rdb.
I did that in order to avoid a state where the rdb_child_pid is -1 but
we don't yet want to start another fork (still busy serving that data to
replicas).
It turns out that the solution used so far was problematic in case the
fork child was being killed (e.g. by the kernel OOM killer), in that
case there's a chance that we currently disabled the read event on the
rdb pipe, since we're waiting for a replica to become writable again.
and in that scenario the master would have never realized the child
exited, and the replica will remain hung too.
Note that there's no mechanism to detect a hung replica while it's in
rdb transfer state.
The solution here is to add another pipe which is used by the parent to
tell the child it is safe to exit. this mean that when the child exits,
for whatever reason, it is safe to reap it.
Besides that, i'm re-introducing an adjustment to REPLCONF ACK which was
part of #6271 (Accelerate diskless master connections) but was dropped
when that PR was rebased after the TLS fork/pipe changes (5a47794).
Now that RdbPipeCleanup no longer calls checkChildrenDone, and the ACK
has chance to detect that the child exited, it should be the one to call
it so that we don't have to wait for cron (server.hz) to do that.
2020-09-06 09:43:57 -04:00
|
|
|
set child_pid [get_child_pid 0]
|
2021-02-19 06:01:25 -05:00
|
|
|
# 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"
|
|
|
|
}
|
2020-08-12 10:58:56 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
# 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}}}
|
|
|
|
}
|
|
|
|
}
|
2021-12-07 09:05:51 -05:00
|
|
|
|
|
|
|
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
|
|
|
|
}
|
2022-04-19 04:31:15 -04:00
|
|
|
|
|
|
|
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"}
|
|
|
|
}
|
2020-08-12 10:58:56 -04:00
|
|
|
}
|
|
|
|
}
|