DF-2832 / race_witness3.sh
#!/bin/sh # DF2832 witness race v3 (root, guest, witness-v3 kernel). # The in-kernel park auto-skips the root fs; unpriv writers/churners on the # TEST hammer2 mount drive trigger_syncer*() stalls while umount -f/mount # cycles tear the syncer ctx down. ITER=${1:-10} IMG=/root/h2img MNT=/mnt/t B=/usr/local/df2832 rm -f $IMG dd if=/dev/zero of=$IMG bs=1m count=0 seek=512 >/dev/null 2>&1 vnconfig -u vn0 >/dev/null 2>&1 vnconfig -c -S 512m vn0 $IMG newfs_hammer2 /dev/vn0 >/dev/null 2>&1 mkdir -p $MNT sysctl vfs.hammer2.limit_dirty_chains=16 >/dev/null sysctl vfs.hammer2.limit_dirty_inodes=4 >/dev/null mount_hammer2 /dev/vn0 $MNT >/dev/null 2>&1 || { echo "mount failed"; exit 1; } chmod 777 $MNT ( # unpriv respawner end=$(( $(date +%s) + 3000 )) while [ $(date +%s) -lt $end ]; do n=$(pgrep -u nobody dirty_writer | wc -l) while [ $n -lt 3 ]; do su -m nobody -c "$B/dirty_writer /mnt/t/b$n.dat 600 >&/dev/null &" n=$(( n + 1 )) done n=$(pgrep -u nobody churn_open | wc -l) while [ $n -lt 6 ]; do su -m nobody -c "$B/churn_open /mnt/t 600 >&/dev/null &" n=$(( n + 1 )) done sleep 0.2 done ) & RESPAWNER=$! n=0 while [ $n -lt $ITER ]; do echo "--- iteration $n (starts=$(sysctl -n debug.df2832_starts) hits=$(sysctl -n debug.df2832_hits)) ---" umount -f $MNT 2>&1 | head -1 sleep 0.3 if ! mount_hammer2 /dev/vn0 $MNT >/dev/null 2>&1; then echo "[$n] remount failed; retry" sleep 2 mount_hammer2 /dev/vn0 $MNT >/dev/null 2>&1 || echo "[$n] remount STILL failed" fi chmod 777 $MNT sleep 1.5 n=$(( n + 1 )) done kill $RESPAWNER 2>/dev/null killall -u nobody churn_open dirty_writer >/dev/null 2>&1 sleep 1 echo "=== counters ===" sysctl debug.df2832_starts debug.df2832_hits echo "=== HIT lines ===" dmesg | grep "DF2832: HIT" | tail -20 echo "=== last teardown lines ===" dmesg | grep "thr_stop FREE" | tail -3 umount -f $MNT >/dev/null 2>&1 vnconfig -u vn0 >/dev/null 2>&1 echo "race_witness3: done" |