| #!/usr/bin/env bash |
| # SPDX-License-Identifier: LGPL-2.1-or-later |
| 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 |
| |
| entered_rl=0 |
| 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 |