]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
TEST-17-UDEV: check journal about inotify watch 36977/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 4 Apr 2025 14:26:03 +0000 (23:26 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 5 Apr 2025 08:33:31 +0000 (17:33 +0900)
test/units/TEST-17-UDEV.watch.sh

index 410f5a7f7785be09277d3e704cf09d871b216e42..bf82ac3712de07928429c8e822b709687ccb511e 100755 (executable)
@@ -5,6 +5,9 @@ set -o pipefail
 
 # tests for udev watch
 
+# shellcheck source=test/units/util.sh
+. "$(dirname "$0")"/util.sh
+
 function check_validity() {
     local f ID_OR_HANDLE
 
@@ -12,15 +15,28 @@ function check_validity() {
         ID_OR_HANDLE="$(readlink "$f")"
         test -L "/run/udev/watch/${ID_OR_HANDLE}"
         test "$(readlink "/run/udev/watch/${ID_OR_HANDLE}")" = "$(basename "$f")"
+
+        if [[ "${1:-}" == "1" ]]; then
+            journalctl -n 1 -q -u systemd-udevd.service --invocation=0 --grep "Found inotify watch .*$ID_OR_HANDLE"
+        fi
     done
 }
 
 function check() {
     for _ in {1..2}; do
+        systemctl reset-failed systemd-udevd.service
         systemctl restart systemd-udevd.service
-        udevadm control --ping
         udevadm settle --timeout=30
-        check_validity
+
+        journalctl --sync
+
+        # Check if the inotify watch fd is received from fd store.
+        journalctl -n 1 -q -u systemd-udevd.service --invocation=0 --grep 'Received inotify fd \(\d\) from service manager.'
+
+        # Check if there is no broken symlink chain.
+        assert_eq "$(journalctl -n 1 -q -u systemd-udevd.service --invocation=0 --grep 'Found broken inotify watch' || :)" ""
+
+        check_validity 1
 
         for _ in {1..2}; do
             udevadm trigger -w --action add --subsystem-match=block
@@ -34,6 +50,24 @@ function check() {
     done
 }
 
+# Check if the first invocation (should be in initrd) pushed the inotify fd to fdstore,
+# and the next invocation gained the fd from service manager.
+# TNote the service may be started without generating debugging logs. Let's check failure log.
+if ! journalctl -n 1 -q -u systemd-udevd.service --invocation=1 --grep 'Pushed inotify fd to service manager.'; then
+    assert_eq "$(journalctl -n 1 -q -u systemd-udevd.service --invocation=1 --grep 'Failed to push inotify fd to service manager.' || :)" ""
+fi
+if ! journalctl -n 1 -q -u systemd-udevd.service --invocation=2 --grep 'Received inotify fd \(\d\) from service manager.'; then
+    assert_eq "$(journalctl -n 1 -q -u systemd-udevd.service --invocation=2 --grep 'Pushed inotify fd to service manager.' || :)" ""
+fi
+
+mkdir -p /run/systemd/system/systemd-udevd.service.d/
+cat >/run/systemd/system/systemd-udevd.service.d/10-debug.conf <<EOF
+[Service]
+SYSTEMD_LOG_LEVEL=debug
+EOF
+
+systemctl daemon-reload
+
 mkdir -p /run/udev/rules.d/
 
 cat >/run/udev/rules.d/00-debug.rules <<EOF
@@ -44,6 +78,14 @@ cat >/run/udev/rules.d/50-testsuite.rules <<EOF
 ACTION=="add", SUBSYSTEM=="block", KERNEL=="sda", OPTIONS:="watch"
 EOF
 
+# To make the previous invocation of systemd-udevd generates debugging logs on stop,
+# that will be checked by check().
+udevadm control --log-level debug
+
+# Unfortunately, journalctl --invocation= is unstable when debug logging is enabled on service manager.
+SAVED_LOG_LEVEL=$(systemctl log-level)
+systemctl log-level info
+
 check
 
 ROOTDEV="$(bootctl -RR)"
@@ -64,8 +106,11 @@ test ! -e "/run/udev/watch/b${MAJOR}:${MINOR}"
 
 rm /run/udev/rules.d/00-debug.rules
 rm /run/udev/rules.d/50-testsuite.rules
-
 udevadm control --reload
-systemctl reset-failed systemd-udevd.service
+
+rm -f /run/systemd/system/systemd-udevd.service.d/10-debug.conf
+systemctl daemon-reload
+
+systemctl log-level "$SAVED_LOG_LEVEL"
 
 exit 0