b7dd4d
From e6cd875a767ba23b218cdca395307ac6fb7fd882 Mon Sep 17 00:00:00 2001
b7dd4d
From: Michal Sekletar <msekleta@redhat.com>
b7dd4d
Date: Mon, 30 May 2022 14:50:05 +0200
b7dd4d
Subject: [PATCH] tests: make sure we delay running mount start jobs when
b7dd4d
 /p/s/mountinfo is rate limited
b7dd4d
b7dd4d
(cherry picked from commit 9e15be6c8d55abd800bf33f9776dd0e307ed37bc)
b7dd4d
b7dd4d
Related: #2095744
b7dd4d
---
b7dd4d
 test/TEST-60-MOUNT-RATELIMIT/testsuite.sh | 53 +++++++++++++++++++++++
b7dd4d
 test/test-functions                       |  2 +-
b7dd4d
 2 files changed, 54 insertions(+), 1 deletion(-)
b7dd4d
b7dd4d
diff --git a/test/TEST-60-MOUNT-RATELIMIT/testsuite.sh b/test/TEST-60-MOUNT-RATELIMIT/testsuite.sh
b7dd4d
index 6211050faf..84fe9640e1 100755
b7dd4d
--- a/test/TEST-60-MOUNT-RATELIMIT/testsuite.sh
b7dd4d
+++ b/test/TEST-60-MOUNT-RATELIMIT/testsuite.sh
b7dd4d
@@ -2,6 +2,56 @@
b7dd4d
 set -eux
b7dd4d
 set -o pipefail
b7dd4d
 
b7dd4d
+test_issue_20329() {
b7dd4d
+    local tmpdir unit
b7dd4d
+    tmpdir="$(mktemp -d)"
b7dd4d
+    unit=$(systemd-escape --suffix mount --path "$tmpdir")
b7dd4d
+
b7dd4d
+    # Set up test mount unit
b7dd4d
+    cat > /run/systemd/system/"$unit" <
b7dd4d
+[Mount]
b7dd4d
+What=tmpfs
b7dd4d
+Where=$tmpdir
b7dd4d
+Type=tmpfs
b7dd4d
+Options=defaults,nofail
b7dd4d
+EOF
b7dd4d
+
b7dd4d
+    # Start the unit
b7dd4d
+    systemctl daemon-reload
b7dd4d
+    systemctl start "$unit"
b7dd4d
+
b7dd4d
+    [[ "$(systemctl show --property SubState --value "$unit")" = "mounted" ]] || {
b7dd4d
+        echo >&2 "Test mount \"$unit\" unit isn't mounted"
b7dd4d
+        return 1
b7dd4d
+    }
b7dd4d
+    mountpoint -q "$tmpdir"
b7dd4d
+
b7dd4d
+    trap 'systemctl stop $unit' RETURN
b7dd4d
+
b7dd4d
+    # Trigger the mount ratelimiting
b7dd4d
+    cd "$(mktemp -d)"
b7dd4d
+    mkdir foo
b7dd4d
+    for ((i=0;i<50;++i)); do
b7dd4d
+        mount --bind foo foo
b7dd4d
+        umount foo
b7dd4d
+    done
b7dd4d
+
b7dd4d
+    # Unmount the test mount and start it immediately again via systemd
b7dd4d
+    umount "$tmpdir"
b7dd4d
+    systemctl start "$unit"
b7dd4d
+
b7dd4d
+    # Make sure it is seen as mounted by systemd and it actually is mounted
b7dd4d
+    [[ "$(systemctl show --property SubState --value "$unit")" = "mounted" ]] || {
b7dd4d
+        echo >&2 "Test mount \"$unit\" unit isn't in \"mounted\" state"
b7dd4d
+        return 1
b7dd4d
+    }
b7dd4d
+
b7dd4d
+    mountpoint -q "$tmpdir" || {
b7dd4d
+        echo >&2 "Test mount \"$unit\" is in \"mounted\" state, actually is not mounted"
b7dd4d
+        return 1
b7dd4d
+    }
b7dd4d
+}
b7dd4d
+
b7dd4d
 systemd-analyze log-level debug
b7dd4d
 systemd-analyze log-target journal
b7dd4d
 
b7dd4d
@@ -85,6 +135,9 @@ if systemctl list-units -t mount tmp-meow* | grep -q tmp-meow; then
b7dd4d
     exit 42
b7dd4d
 fi
b7dd4d
 
b7dd4d
+# test that handling of mount start jobs is delayed when /proc/self/mouninfo monitor is rate limited
b7dd4d
+test_issue_20329
b7dd4d
+
b7dd4d
 systemd-analyze log-level info
b7dd4d
 
b7dd4d
 echo OK >/testok
b7dd4d
diff --git a/test/test-functions b/test/test-functions
b7dd4d
index 4d7832b1fb..ed8ab98173 100644
b7dd4d
--- a/test/test-functions
b7dd4d
+++ b/test/test-functions
b7dd4d
@@ -23,7 +23,7 @@ fi
b7dd4d
 
b7dd4d
 PATH_TO_INIT=$ROOTLIBDIR/systemd
b7dd4d
 
b7dd4d
-BASICTOOLS="test sh bash setsid loadkeys setfont login sulogin gzip sleep echo mount umount cryptsetup date dmsetup modprobe sed cmp tee rm true false chmod chown ln xargs env"
b7dd4d
+BASICTOOLS="test sh bash setsid loadkeys setfont login sulogin gzip sleep echo mount umount cryptsetup date dmsetup modprobe sed cmp tee rm true false chmod chown ln xargs env mktemp mountpoint"
b7dd4d
 DEBUGTOOLS="df free ls stty cat ps ln ip route dmesg dhclient mkdir cp ping dhclient strace less grep id tty touch du sort hostname find"
b7dd4d
 
b7dd4d
 STATEDIR="${BUILD_DIR:-.}/test/$(basename $(dirname $(realpath $0)))"