From bc59df823221650859c0e8eedf3e6cda4b442469 Mon Sep 17 00:00:00 2001 From: Andreas Dilger Date: Thu, 18 Jan 2024 20:44:33 -0700 Subject: [PATCH] LU-17426 tests: add crossdir parallel rename test Add sanityn test_81d to test cross-dir (same-MDT) parallel rename if the MDT supports this functionality. Lustre-change: https://review.whamcloud.com/47643 Lustre-commit: TBD (from fdd1f9df934efa070cd4aca4cf3db686261ef868) Test-Parameters: trivial testlist=sanityn Test-Parameters: testlist=sanityn serverversion=2.15 Test-Parameters: testlist=sanityn env=ONLY=81d,ONLY_REPEAT=10 Test-Parameters: testlist=sanityn env=ONLY=81d,ONLY_REPEAT=10 mdtcount=2 Test-Parameters: testlist=sanityn env=ONLY=81d,ONLY_REPEAT=10 mdtcount=4 Signed-off-by: Andreas Dilger Change-Id: Ic8717e6865a9c6c9698186f4fdf34c1f4f74083f Reviewed-on: https://review.whamcloud.com/c/ex/lustre-release/+/53748 Tested-by: jenkins Tested-by: Maloo --- lustre/tests/mrename.c | 4 ++- lustre/tests/sanityn.sh | 71 ++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 67 insertions(+), 8 deletions(-) diff --git a/lustre/tests/mrename.c b/lustre/tests/mrename.c index 4031f55..6cff758 100644 --- a/lustre/tests/mrename.c +++ b/lustre/tests/mrename.c @@ -43,7 +43,9 @@ int main(int argc, char *argv[]) } rc = rename(argv[1], argv[2]); - printf("rename returned %d: %s\n", rc, strerror(errno)); + if (rc) + fprintf(stderr, "rename '%s' returned %d: %s\n", + argv[1], rc, strerror(errno)); return rc; } diff --git a/lustre/tests/sanityn.sh b/lustre/tests/sanityn.sh index 9091c52..691c406 100755 --- a/lustre/tests/sanityn.sh +++ b/lustre/tests/sanityn.sh @@ -1623,7 +1623,7 @@ test_39a() { if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi done } -run_test 39a "test from 11063 ==================================" +run_test 39a "file mtime does not change after rename" test_39b() { local client1=${CLIENT1:-`hostname`} @@ -1650,7 +1650,7 @@ test_39b() { if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi done } -run_test 39b "11063 problem 1 ==================================" +run_test 39b "file mtime the same on clients with/out lock" test_39c() { local client1=${CLIENT1:-`hostname`} @@ -4913,13 +4913,10 @@ test_81b() { [ $MDSCOUNT -lt 2 ] && skip "We need at least 2 MDTs for this test" - local total local setattr_pid - total=1000 - $LFS mkdir -c $MDSCOUNT $DIR1/$tdir || error "$LFS mkdir" - createmany -o $DIR1/$tdir/$tfile. $total || error "createmany" + createmany -o $DIR1/$tdir/$tfile. $COUNT || error "createmany" ( while true; do @@ -4928,7 +4925,7 @@ test_81b() { ) & setattr_pid=$! - for i in $(seq $total); do + for ((i = 0; i < COUNT; i++)); do mrename $DIR2/$tdir/$tfile.$i $DIR2/$tdir/$tfile-new.$i \ > /dev/null done @@ -4983,6 +4980,66 @@ test_81c() { } run_test 81c "rename revoke LOOKUP lock for remote object" +cleanup_81d() { + for ((mds = 0; mds < $MDSCOUNT; mds++)); do + local d2=$DIR2/$tdir-$mds + + rm -rf $d2 & + done + wait || error "rm failed" +} + +test_81d() { + local setattr_pid + local mdts=$(comma_list $(mdts_nodes)) + + do_nodes $mdts "$LCTL set_param mdt.*.md_stats=clear > /dev/null" + + stack_trap cleanup_81d + for ((mds = 0; mds < $MDSCOUNT; mds++)); do + local d1=$DIR1/$tdir-$mds + + $LFS mkdir -i $mds $d1 $d1/_temporary || error "mkdir failed" + createmany -o $d1/_temporary/$tfile. $COUNT || + error "createmany failed for $d1/_temporary" + done + + for ((mds = 0; mds < $MDSCOUNT; mds++)); do + local d1=$DIR1/$tdir-$mds + local d2=$DIR2/$tdir-$mds + + for ((i = 0; i < COUNT; i++)); do + mrename $d1/_temporary/$tfile.$i $d1/$tfile.$i & + ((i++)) + mrename $d2/_temporary/$tfile.$i $d2/$tfile.$i & + done + done + wait || error "rename failed" + + cleanup_81d + local stats=$DIR1/md_stats + local total=$((MDSCOUNT * COUNT)) + + do_nodes $mdts "$LCTL get_param -n mdt.*.md_stats" > $stats + cat $stats + crossdir=$(awk '/crossdir_rename/ {sum+=$2} END {print sum}' $stats) + (( crossdir == total )) || + error "not crossdir: $crossdir != $total" + samedir=$(awk '/samedir_rename/ {sum+=$2} END {print sum}' $stats) + (( samedir == 0 )) || error "considered samedir: $samedir" + pardir=$(awk '/parallel_rename_dir/ {sum+=$2} END {print sum}' $stats) + (( pardir == 0 )) || error "considered directory: $pardir" + + + (( MDS1_VERSION >= $(version_code 2.15.60) )) || + { echo "need MDS >= 2.15.60 for parallel cross-dir"; return 0; } + + parfile=$(awk '/parallel_rename_file/ {sum+=$2} END {print sum}' $stats) + (( parfile == total )) || + error "not considered file: $parfile != $total" +} +run_test 81d "parallel rename file cross-dir on same MDT" + test_82() { [[ "$MDS1_VERSION" -gt $(version_code 2.6.91) ]] || skip "Need MDS version at least 2.6.92" -- 1.8.3.1