}
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
# 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
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
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() {