}
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
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