Whamcloud - gitweb
LU-6475 mdt: race between open and migrate
[fs/lustre-release.git] / lustre / tests / sanityn.sh
index 9acd1cb..4fa584a 100644 (file)
@@ -3081,7 +3081,7 @@ test_77g() {
 }
 run_test 77g "Change TBF type directly"
 
-test_80() {
+test_80a() {
        [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
        local MDTIDX=1
        local mdt_index
@@ -3121,7 +3121,130 @@ test_80() {
 
        rm -rf $DIR1/$tdir || error "rm dir failed after migration"
 }
-run_test 80 "migrate directory when some children is being opened"
+run_test 80a "migrate directory when some children is being opened"
+
+cleanup_80b() {
+       trap 0
+       kill -9 $migrate_pid
+}
+
+test_80b() {
+       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+       local migrate_dir1=$DIR1/$tdir/migrate_dir
+       local migrate_dir2=$DIR2/$tdir/migrate_dir
+       local migrate_run=$LUSTRE/tests/migrate.sh
+       local start_time
+       local end_time
+       local show_time=1
+       local mdt_idx
+       local rc=0
+       local rc1=0
+
+       trap cleanup_80b EXIT
+       #prepare migrate directory
+       mkdir -p $migrate_dir1
+       for F in {1,2,3,4,5}; do
+               echo "$F$F$F$F$F" > $migrate_dir1/file$F
+               echo "$F$F$F$F$F" > $DIR/$tdir/file$F
+       done
+
+       #migrate the directories among MDTs
+       (
+               while true; do
+                       mdt_idx=$((RANDOM % MDSCOUNT))
+                       $LFS migrate -m $mdt_idx $migrate_dir1 2&>/dev/null ||
+                               rc=$?
+                       [ $rc -ne 0 -o $rc -ne 16 ] || break
+               done
+       ) &
+       migrate_pid=$!
+
+       echo "start migration thread $migrate_pid"
+       #Access the files at the same time
+       start_time=$(date +%s)
+       echo "accessing the migrating directory for 5 minutes..."
+       while true; do
+               ls $migrate_dir2 > /dev/null || {
+                       echo "read dir fails"
+                       break
+               }
+               diff -u $DIR2/$tdir/file1 $migrate_dir2/file1 || {
+                       echo "access file1 fails"
+                       break
+               }
+
+               cat $migrate_dir2/file2 > $migrate_dir2/file3 || {
+                       echo "access file2/3 fails"
+                       break
+               }
+
+               echo "aaaaa" > $migrate_dir2/file4 > /dev/null || {
+                       echo "access file4 fails"
+                       break
+               }
+
+               stat $migrate_dir2/file5 > /dev/null || {
+                       echo "stat file5 fails"
+                       break
+               }
+
+               touch $migrate_dir2/source_file > /dev/null || rc1=$?
+               [ $rc1 -ne 0 -o $rc1 -ne 1 ] || {
+                       echo "touch file failed with $rc1"
+                       break;
+               }
+
+               if [ -e $migrate_dir2/source_file ]; then
+                       ln $migrate_dir2/source_file $migrate_dir2/link_file \
+                                       2&>/dev/null || rc1=$?
+                       if [ -e $migrate_dir2/link_file ]; then
+                               rm -rf $migrate_dir2/link_file
+                       fi
+
+                       mrename $migrate_dir2/source_file \
+                               $migrate_dir2/target_file 2&>/dev/null || rc1=$?
+                       [ $rc1 -ne 0 -o $rc1 -ne 1 ] || {
+                               echo "rename failed with $rc1"
+                               break
+                       }
+
+                       if [ -e $migrate_dir2/target_file ]; then
+                               rm -rf $migrate_dir2/target_file 2&>/dev/null ||
+                                                               rc1=$?
+                       else
+                               rm -rf $migrate_dir2/source_file 2&>/dev/null ||
+                                                               rc1=$?
+                       fi
+                       [ $rc1 -ne 0 -o $rc1 -ne 1 ] || {
+                               echo "unlink failed with $rc1"
+                               break
+                       }
+               fi
+
+               end_time=$(date +%s)
+               duration=$((end_time - start_time))
+               if [ $((duration % 10)) -eq 0 ]; then
+                       if [ $show_time -eq 1 ]; then
+                               echo "...$duration seconds"
+                               show_time=0
+                       fi
+               else
+                       show_time=1
+               fi
+
+               kill -0 $migrate_pid || {
+                       echo "migration stopped 1"
+                       break
+               }
+
+               [ $duration -ge 300 ] && break
+       done
+
+       #check migration are still there
+       kill -0 $migrate_pid || error "migration stopped 2"
+       cleanup_80b
+}
+run_test 80b "Accessing directory during migration"
 
 test_81() {
        [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return