Files
erofs-freebsd-out-tree/tests/TC126-concurrent-reads.md
T
2026-08-18 09:20:44 +02:00

2.2 KiB

Test Case: Concurrent Reads

Test ID: TC126-concurrent-reads
Category: Boundary & Stress
Priority: High
Regression: None

Objective

Verify 16 simultaneous full-file reads, with every PID, exit code, expected source hash, and mounted-file hash recorded and checkable.

Preconditions

  • Complete G7-MANUAL-SETUP.md and verify the workload source inventory.

Manual Steps

G7=/root/repo22-g7
FIX=$G7/fixtures
SRC=$FIX/sources/workloads/concurrent
IMAGE=$FIX/images/workloads.erofs
MNT=/mnt/repo22-g7-tc126
E=$G7/evidence/TC126
mkdir -p "$MNT" "$E"
unit=$(mdconfig -a -t vnode -f "$IMAGE")
mount -t erofs -o ro "/dev/$unit" "$MNT"
: > "$E/pids.tsv"
index=0
while [ "$index" -lt 16 ]; do
  file=$(printf 'reader-%02d.bin' "$index")
  expected=$(sha256 -q "$SRC/$file")
  (
    actual=$(sha256 -q "$MNT/concurrent/$file")
    printf 'worker=%02d file=%s expected=%s actual=%s\n' \
      "$index" "$file" "$expected" "$actual"
    test "$actual" = "$expected"
  ) > "$E/worker-$(printf '%02d' "$index").log" 2>&1 &
  pid=$!
  printf '%02d\t%s\n' "$index" "$pid" >> "$E/pids.tsv"
  index=$((index + 1))
done
failed=0
: > "$E/waits.tsv"
while IFS="$(printf '\t')" read -r worker pid; do
  wait "$pid"
  rc=$?
  printf '%s\t%s\t%s\n' "$worker" "$pid" "$rc" >> "$E/waits.tsv"
  test "$rc" -eq 0 || failed=$((failed + 1))
done < "$E/pids.tsv"
cat "$E/pids.tsv" "$E/waits.tsv" "$E"/worker-*.log
test "$failed" -eq 0
test "$(wc -l < "$E/pids.tsv" | tr -d ' ')" -eq 16
test "$(wc -l < "$E/waits.tsv" | tr -d ' ')" -eq 16
alive=0
while IFS="$(printf '\t')" read -r worker pid; do
  if kill -0 "$pid" 2>/dev/null; then
    printf 'still-alive worker=%s pid=%s\n' "$worker" "$pid"
    alive=$((alive + 1))
  fi
done < "$E/pids.tsv"
test "$alive" -eq 0
umount "$MNT"
mdconfig -d -u "${unit#md}"
test -z "$(mount -p | awk -v m="$MNT" '$2 == m { print }')"
test -z "$(mdconfig -l | tr ' ' '\n' | grep -x "$unit")"

PASS Gate

  • Exactly 16 PIDs and 16 waits are recorded; every wait exit code is 0.
  • Every worker log contains identical expected/source and actual/mounted SHA256 values.
  • None of the recorded PIDs remains alive; no killall or unrelated-process cleanup is used.
  • No deadlock, panic, hang, dmesg error, mount leak, or provider leak occurs.