]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
TEST-64-UDEV-STORAGE: several cleanups
authorYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 30 Jul 2025 12:43:06 +0000 (21:43 +0900)
committerLuca Boccassi <luca.boccassi@gmail.com>
Mon, 4 Aug 2025 16:07:14 +0000 (17:07 +0100)
- drop unused variables,
- adjust number of partitions, interations, and timeout,
- clear partitions on each test case finished,
- check if unnecessary devlinks are removed,
- several coding style cleanups.

(cherry picked from commit 35e4cfa83db1348157f0dd33a3cfc880c369b932)

test/units/TEST-64-UDEV-STORAGE.sh

index d489159eb71dd167f648db7dd700530f0c776eb7..856f44595d12a458f464be844190906819e252fe 100755 (executable)
@@ -381,9 +381,8 @@ EOF
 }
 
 testcase_simultaneous_events_1() {
-    local disk expected i iterations key link num_part part partscript rule target timeout
-    local -a devices symlinks
-    local -A running
+    local disk expected i iterations link num_part part partscript rule target timeout
+    local -a devices symlinks running
 
     if [[ -v ASAN_OPTIONS || "$(systemd-detect-virt -v)" == "qemu" ]]; then
         num_part=2
@@ -438,18 +437,20 @@ EOF
     # On unpatched udev versions the delete-recreate cycle may trigger a race
     # leading to dead symlinks in /dev/disk/
     for ((i = 1; i <= iterations; i++)); do
+        running=()
         for disk in {0..9}; do
             if ((disk % 2 == i % 2)); then
                 udevadm lock --timeout=30 --device="${devices[$disk]}" sfdisk -q --delete "${devices[$disk]}" &
             else
                 udevadm lock --timeout=30 --device="${devices[$disk]}" sfdisk -q -X gpt "${devices[$disk]}" <"$partscript" &
             fi
-            running[$disk]=$!
+
+            # shellcheck disable=SC2190
+            running+=( "$!" )
         done
 
-        for key in "${!running[@]}"; do
-            wait "${running[$key]}"
-            unset "running[$key]"
+        for j in "${running[@]}"; do
+            wait "$j"
         done
 
         if ((i % 10 <= 1)); then
@@ -473,28 +474,36 @@ EOF
     done
 
     helper_check_device_units
-    rm -f "$rule" "$partscript"
 
+    # Cleanup and check if unnecessary devlinks are removed.
+    for disk in {0..9}; do
+        udevadm lock --timeout="$timeout" --device="${devices[$disk]}" sfdisk -q --delete "${devices[$disk]}" || :
+    done
+    udevadm settle --timeout="$timeout"
+    for ((part = 1; part <= num_part; part++)); do
+        udevadm wait --timeout=10 --removed "/dev/disk/by-partlabel/test${part}"
+    done
+
+    rm -f "$rule" "$partscript"
     udevadm control --reload
 }
 
 testcase_simultaneous_events_2() {
-    local disk expected i iterations key link num_part part script_dir target timeout
-    local -a devices symlinks
-    local -A running
+    local disk i iterations link num_part part script_dir target timeout
+    local -a devices running
 
     script_dir="$(mktemp --directory "/tmp/test-udev-storage.script.XXXXXXXXXX")"
     # shellcheck disable=SC2064
     trap "rm -rf '$script_dir'" RETURN
 
     if [[ -v ASAN_OPTIONS || "$(systemd-detect-virt -v)" == "qemu" ]]; then
-        num_part=20
-        iterations=1
-        timeout=2400
-    else
-        num_part=100
-        iterations=3
+        num_part=10
+        iterations=2
         timeout=300
+    else
+        num_part=40
+        iterations=5
+        timeout=200
     fi
 
     for disk in {0..9}; do
@@ -514,32 +523,40 @@ $(for ((part = 1; part <= num_part; part++)); do printf 'name="testlabel-%d", si
 EOF
     done
 
+    ls -l /dev/disk/by-partlabel
+
     echo "## $iterations iterations start: $(date '+%H:%M:%S.%N')"
-    for ((i = 1; i <= iterations; i++)); do
+    running=()
+    for disk in "${devices[@]}"; do
+        udevadm lock --timeout=30 --device="$disk" \
+                bash -c "for ((i = 1; i <= $iterations; i++)); do sfdisk -q --delete $disk; sfdisk -q -X gpt $disk <$script_dir/partscript-\$i; done" &
 
-        for disk in {0..9}; do
-            udevadm lock --timeout="$timeout" --device="${devices[$disk]}" sfdisk -q --delete "${devices[$disk]}" &
-            running[$disk]=$!
-        done
+        # shellcheck disable=SC2190
+        running+=( "$!" )
+    done
 
-        for key in "${!running[@]}"; do
-            wait "${running[$key]}"
-            unset "running[$key]"
-        done
+    for i in "${running[@]}"; do
+        wait "$i"
+    done
 
-        for disk in {0..9}; do
-            udevadm lock --timeout="$timeout" --device="${devices[$disk]}" sfdisk -q -X gpt "${devices[$disk]}" <"$script_dir/partscript-$i" &
-            running[$disk]=$!
-        done
+    udevadm settle --timeout="$timeout"
+    echo "## $iterations iterations end: $(date '+%H:%M:%S.%N')"
 
-        for key in "${!running[@]}"; do
-            wait "${running[$key]}"
-            unset "running[$key]"
-        done
+    ls -l /dev/disk/by-partlabel
 
-        udevadm wait --settle --timeout="$timeout" "${devices[@]}" "/dev/disk/by-partlabel/testlabel-$i"
+    # Check if unnecessary devlinks are removed.
+    for ((i = 1; i < iterations; i++)); do
+        udevadm wait --timeout=10 --removed "/dev/disk/by-partlabel/testlabel-$i"
     done
-    echo "## $iterations iterations end: $(date '+%H:%M:%S.%N')"
+
+    helper_check_device_units
+
+    # Cleanup
+    for disk in "${devices[@]}"; do
+        udevadm lock --timeout=30 --device="$disk" sfdisk -q --delete "$disk"
+    done
+    udevadm settle --timeout="$timeout"
+    udevadm wait --timeout=10 --removed "/dev/disk/by-partlabel/testlabel-$iterations"
 }
 
 testcase_simultaneous_events() {