mirror of
https://github.com/systemd/systemd
synced 2024-09-06 16:56:43 +00:00
test: add extended test for triggering mount rate limit
It's hard to trigger the failure to exit the rate limit state in isolation as it needs multiple event sources in order to show that it gets stuck in the queue. Hence why this is an extended test.
This commit is contained in:
parent
9f40351f77
commit
0c81900965
1
test/TEST-60-MOUNT-RATELIMIT/Makefile
Symbolic link
1
test/TEST-60-MOUNT-RATELIMIT/Makefile
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../TEST-01-BASIC/Makefile
|
7
test/TEST-60-MOUNT-RATELIMIT/test.sh
Executable file
7
test/TEST-60-MOUNT-RATELIMIT/test.sh
Executable file
|
@ -0,0 +1,7 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
set -e
|
||||||
|
TEST_DESCRIPTION="Test that mount/unmount storms can enter/exit rate limit state and will not leak units"
|
||||||
|
|
||||||
|
. $TEST_BASE_DIR/test-functions
|
||||||
|
|
||||||
|
do_test "$@"
|
6
test/units/testsuite-60.service
Normal file
6
test/units/testsuite-60.service
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
[Unit]
|
||||||
|
Description=TEST-60-MOUNT-RATELIMIT
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
ExecStart=/usr/lib/systemd/tests/testdata/units/%N.sh
|
73
test/units/testsuite-60.sh
Executable file
73
test/units/testsuite-60.sh
Executable file
|
@ -0,0 +1,73 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
set -eux
|
||||||
|
set -o pipefail
|
||||||
|
|
||||||
|
systemd-analyze log-level debug
|
||||||
|
systemd-analyze log-target journal
|
||||||
|
|
||||||
|
NUM_DIRS=20
|
||||||
|
|
||||||
|
# mount/unmount enough times to trigger the /proc/self/mountinfo parsing rate limiting
|
||||||
|
|
||||||
|
for ((i = 0; i < NUM_DIRS; i++)); do
|
||||||
|
mkdir "/tmp/meow${i}"
|
||||||
|
done
|
||||||
|
|
||||||
|
for ((i = 0; i < NUM_DIRS; i++)); do
|
||||||
|
mount -t tmpfs tmpfs "/tmp/meow${i}"
|
||||||
|
done
|
||||||
|
|
||||||
|
systemctl daemon-reload
|
||||||
|
systemctl list-units -t mount tmp-meow* | grep -q tmp-meow
|
||||||
|
|
||||||
|
for ((i = 0; i < NUM_DIRS; i++)); do
|
||||||
|
umount "/tmp/meow${i}"
|
||||||
|
done
|
||||||
|
|
||||||
|
# figure out if we have entered the rate limit state
|
||||||
|
|
||||||
|
exited_rl=0
|
||||||
|
timeout="$(date -ud "2 minutes" +%s)"
|
||||||
|
while [[ $(date -u +%s) -le ${timeout} ]]; do
|
||||||
|
if journalctl -u init.scope | grep -q "(mount-monitor-dispatch) entered rate limit"; then
|
||||||
|
entered_rl=1
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
sleep 5
|
||||||
|
done
|
||||||
|
|
||||||
|
# if the infra is slow we might not enter the rate limit state; in that case skip the exit check
|
||||||
|
|
||||||
|
if [ "${entered_rl}" = "1" ]; then
|
||||||
|
exited_rl=0
|
||||||
|
timeout="$(date -ud "2 minutes" +%s)"
|
||||||
|
while [[ $(date -u +%s) -le ${timeout} ]]; do
|
||||||
|
if journalctl -u init.scope | grep -q "(mount-monitor-dispatch) left rate limit"; then
|
||||||
|
exited_rl=1
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
sleep 5
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "${exited_rl}" = "0" ]; then
|
||||||
|
exit 24
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# give some time for units to settle so we don't race between exiting the rate limit state and cleaning up the units
|
||||||
|
|
||||||
|
sleep 60
|
||||||
|
systemctl daemon-reload
|
||||||
|
sleep 60
|
||||||
|
|
||||||
|
# verify that the mount units are always cleaned up at the end
|
||||||
|
|
||||||
|
if systemctl list-units -t mount tmp-meow* | grep -q tmp-meow; then
|
||||||
|
exit 42
|
||||||
|
fi
|
||||||
|
|
||||||
|
systemd-analyze log-level info
|
||||||
|
|
||||||
|
echo OK >/testok
|
||||||
|
|
||||||
|
exit 0
|
Loading…
Reference in a new issue