diff --git a/tests/golden/export-lookup-evict-race b/tests/golden/export-lookup-evict-race new file mode 100644 index 00000000..e69de29b diff --git a/tests/sequence b/tests/sequence index 9e51c19a..972bebe2 100644 --- a/tests/sequence +++ b/tests/sequence @@ -13,6 +13,7 @@ lock-refleak.sh lock-shrink-consistency.sh lock-pr-cw-conflict.sh lock-revoke-getcwd.sh +export-lookup-evict-race.sh createmany-parallel.sh createmany-large-names.sh createmany-rename-large-dir.sh diff --git a/tests/tests/export-lookup-evict-race.sh b/tests/tests/export-lookup-evict-race.sh new file mode 100644 index 00000000..ebddf6c3 --- /dev/null +++ b/tests/tests/export-lookup-evict-race.sh @@ -0,0 +1,32 @@ +# +# test racing fh_to_dentry with evict from lock invalidation. We've +# had deadlocks between the ordering of iget and evict when they acquire +# cluster locks. +# + +t_require_commands touch stat handle_cat +t_require_mounts 2 + +CPUS=$(getconf _NPROCESSORS_ONLN) +NR=$((CPUS * 4)) +END=$((SECONDS + 30)) + +touch "$T_D0/file" +ino=$(stat -c "%i" "$T_D0/file") + +while test $SECONDS -lt $END; do + for i in $(seq 1 $NR); do + fs=$((RANDOM % T_NR_MOUNTS)) + eval dir="\$T_D${fs}" + write=$((RANDOM & 1)) + + if [ "$write" == 1 ]; then + touch "$dir/file" & + else + handle_cat "$dir" "$ino" & + fi + done + wait +done + +t_pass