X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Ftests%2Fsanity.sh;h=232c45c1e41d5b98eb08e9fb55644e321ee32e80;hp=2ec1cee6b13ea7550acb9e0c57c3907f2f96c392;hb=ea383222e031cdceffbdf2e3afab3b6d1fd53c8e;hpb=9f0aaae0fb3759e7991d4ea042567d09f58ed436 diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index 2ec1cee..232c45c 100644 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -58,11 +58,11 @@ init_test_env $@ . ${CONFIG:=$LUSTRE/tests/cfg/${NAME}.sh} init_logging -[ "$SLOW" = "no" ] && EXCEPT_SLOW="24o 24D 27m 64b 68 71 77f 78 115 124b 230d" +[ "$SLOW" = "no" ] && EXCEPT_SLOW="24o 24D 27m 64b 68 71 77f 78 115 124b" if [ $(facet_fstype $SINGLEMDS) = "zfs" ]; then - # bug number for skipped test: LU-4536 LU-5242 LU-1957 LU-2805 - ALWAYS_EXCEPT="$ALWAYS_EXCEPT 65ic 78 79 80 180 184c" + # bug number for skipped test: LU-4536 LU-1957 LU-2805 + ALWAYS_EXCEPT="$ALWAYS_EXCEPT 65ic 180 184c" [ "$SLOW" = "no" ] && EXCEPT_SLOW="$EXCEPT_SLOW 51b 51ba" fi @@ -80,17 +80,6 @@ setup() { echo "done" } -check_kernel_version() { - WANT_VER=$1 - GOT_VER=$(lctl get_param -n version | awk '/kernel:/ {print $2}') - case $GOT_VER in - patchless|patchless_client) return 0;; - *) [ $GOT_VER -ge $WANT_VER ] && return 0 ;; - esac - log "test needs at least kernel version $WANT_VER, running $GOT_VER" - return 1 -} - check_swap_layouts_support() { $LCTL get_param -n llite.*.sbi_flags | grep -q layout || @@ -98,11 +87,6 @@ check_swap_layouts_support() return 1 } -if [ "$ONLY" == "cleanup" ]; then - sh llmountcleanup.sh - exit 0 -fi - check_and_setup_lustre DIR=${DIR:-$MOUNT} @@ -292,7 +276,7 @@ run_test 7a "mkdir .../d7; mcreate .../d7/f; chmod .../d7/f ====" test_7b() { if [ ! -d $DIR/$tdir ]; then - mkdir $DIR/$tdir + test_mkdir $DIR/$tdir fi $MCREATE $DIR/$tdir/$tfile echo -n foo > $DIR/$tdir/$tfile @@ -370,6 +354,7 @@ test_15() { mv $DIR/$tdir/$tfile $DIR/$tdir/${tfile}_2 $CHECKSTAT -t file $DIR/$tdir/${tfile}_2 || error "$tdir/${tfile_2} not a file after rename" + rm $DIR/$tdir/${tfile}_2 || error "unlink failed after rename" } run_test 15 "touch .../d15/f; mv .../d15/f .../d15/f2 ==========" @@ -535,7 +520,7 @@ run_test 17k "symlinks: rsync with xattrs enabled =========================" test_17l() { # LU-279 [[ -z "$(which getfattr 2>/dev/null)" ]] && skip "no getfattr command" && return 0 - mkdir -p $DIR/$tdir + test_mkdir -p $DIR/$tdir touch $DIR/$tdir/$tfile ln -s $DIR/$tdir/$tfile $DIR/$tdir/$tfile.lnk for path in "$DIR/$tdir" "$DIR/$tdir/$tfile" "$DIR/$tdir/$tfile.lnk"; do @@ -570,7 +555,7 @@ test_17m() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - mkdir -p $WDIR + test_mkdir -p $WDIR long_sym=$short_sym # create a long symlink file for ((i = 0; i < 4; ++i)); do @@ -653,7 +638,7 @@ test_17n() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - mkdir $DIR/$tdir + test_mkdir $DIR/$tdir for ((i=0; i<10; i++)); do $LFS mkdir -i1 -c2 $DIR/$tdir/remote_dir_${i} || error "create remote dir error $i" @@ -679,7 +664,7 @@ test_17n() { mkdir -p $DIR/$tdir/remote_dir_${i} createmany -o $DIR/$tdir/remote_dir_${i}/f 10 || error "create files under remote dir failed $i" - $LFS mv --mdt-index 1 $DIR/$tdir/remote_dir_${i} || + $LFS migrate --mdt-index 1 $DIR/$tdir/remote_dir_${i} || error "migrate remote dir error $i" done check_fs_consistency_17n || error "e2fsck report error after migration" @@ -700,18 +685,17 @@ test_17o() { local WDIR=$DIR/${tdir}o local mdt_index - local mdtdevname local rc=0 - mkdir -p $WDIR + test_mkdir -p $WDIR mdt_index=$($LFS getstripe -M $WDIR) mdt_index=$((mdt_index+1)) - mdtdevname=$(mdsdevname $mdt_index) touch $WDIR/$tfile - stop mds${mdt_index} - start mds${mdt_index} $mdtdevname $MDS_MOUNT_OPTS || - error "mount mds${mdt_index} failed" + + #fail mds will wait the failover finish then set + #following fail_loc to avoid interfer the recovery process. + fail mds${mdt_index} #define OBD_FAIL_OSD_LMA_INCOMPAT 0x194 do_facet mds${mdt_index} lctl set_param fail_loc=0x194 @@ -955,7 +939,6 @@ test_24n() { run_test 24n "Statting the old file after renaming (Posix rename 2)" test_24o() { - check_kernel_version 37 || return 0 test_mkdir -p $DIR/d24o rename_many -s random -v -n 10 $DIR/d24o } @@ -1058,7 +1041,7 @@ test_24v() { # Performance issue on ZFS see LU-4072 (c.f. LU-2887) [ $(facet_fstype $SINGLEMDS) = "zfs" ] && NRFILES=10000 - mkdir -p $DIR/$tdir + test_mkdir -p $DIR/$tdir createmany -m $DIR/$tdir/$tfile $NRFILES cancel_lru_locks mdc @@ -1101,30 +1084,28 @@ test_24x() { local MDTIDX=1 local remote_dir=$DIR/$tdir/remote_dir - mkdir -p $DIR/$tdir + test_mkdir -p $DIR/$tdir $LFS mkdir -i $MDTIDX $remote_dir || error "create remote directory failed" - mkdir -p $DIR/$tdir/src_dir + test_mkdir -p $DIR/$tdir/src_dir touch $DIR/$tdir/src_file - mkdir -p $remote_dir/tgt_dir + test_mkdir -p $remote_dir/tgt_dir touch $remote_dir/tgt_file - mrename $remote_dir $DIR/ && - error "rename dir cross MDT works!" + mrename $DIR/$tdir/src_dir $remote_dir/tgt_dir || + error "rename dir cross MDT failed!" - mrename $DIR/$tdir/src_dir $remote_dir/tgt_dir && - error "rename dir cross MDT works!" + mrename $DIR/$tdir/src_file $remote_dir/tgt_file || + error "rename file cross MDT failed!" - mrename $DIR/$tdir/src_file $remote_dir/tgt_file && - error "rename file cross MDT works!" - - ln $DIR/$tdir/src_file $remote_dir/tgt_file1 && - error "ln file cross MDT should not work!" + touch $DIR/$tdir/ln_file + ln $DIR/$tdir/ln_file $remote_dir/ln_name || + error "ln file cross MDT failed" rm -rf $DIR/$tdir || error "Can not delete directories" } -run_test 24x "cross rename/link should be failed" +run_test 24x "cross MDT rename/link" test_24y() { [[ $MDSCOUNT -lt 2 ]] && skip "needs >= 2 MDTs" && return @@ -1132,13 +1113,13 @@ test_24y() { local MDTIDX=1 local remote_dir=$DIR/$tdir/remote_dir - mkdir -p $DIR/$tdir + test_mkdir -p $DIR/$tdir $LFS mkdir -i $MDTIDX $remote_dir || error "create remote directory failed" - mkdir -p $remote_dir/src_dir + test_mkdir -p $remote_dir/src_dir touch $remote_dir/src_file - mkdir -p $remote_dir/tgt_dir + test_mkdir -p $remote_dir/tgt_dir touch $remote_dir/tgt_file mrename $remote_dir/src_dir $remote_dir/tgt_dir || @@ -1154,37 +1135,11 @@ test_24y() { } run_test 24y "rename/link on the same dir should succeed" -test_24z() { - [[ $MDSCOUNT -lt 2 ]] && skip "needs >= 2 MDTs" && return - [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - local MDTIDX=1 - local remote_src=$DIR/$tdir/remote_dir - local remote_tgt=$DIR/$tdir/remote_tgt - - mkdir -p $DIR/$tdir - $LFS mkdir -i $MDTIDX $remote_src || - error "create remote directory failed" - - $LFS mkdir -i $MDTIDX $remote_tgt || - error "create remote directory failed" - - mrename $remote_src $remote_tgt && - error "rename remote dirs should not work!" - - # If target dir does not exists, it should succeed - rm -rf $remote_tgt - mrename $remote_src $remote_tgt || - error "rename remote dirs(tgt dir does not exists) failed!" - - rm -rf $DIR/$tdir || error "Can not delete directories" -} -run_test 24z "rename one remote dir to another remote dir should fail" - test_24A() { # LU-3182 local NFILES=5000 rm -rf $DIR/$tdir - mkdir -p $DIR/$tdir + test_mkdir -p $DIR/$tdir createmany -m $DIR/$tdir/$tfile $NFILES local t=$(ls $DIR/$tdir | wc -l) local u=$(ls $DIR/$tdir | sort -u | wc -l) @@ -1201,7 +1156,7 @@ test_24B() { # LU-4805 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return local count - mkdir $DIR/$tdir + test_mkdir $DIR/$tdir $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir || error "create striped dir failed" @@ -1268,6 +1223,38 @@ test_24D() { # LU-6101 } run_test 24D "readdir() returns correct number of entries after cursor reload" +test_24E() { + [[ $MDSCOUNT -lt 4 ]] && skip "needs >= 4 MDTs" && return + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + + mkdir -p $DIR/$tdir + mkdir $DIR/$tdir/src_dir + $LFS mkdir -i 1 $DIR/$tdir/src_dir/src_child || + error "create remote source failed" + + touch $DIR/$tdir/src_dir/src_child/a + + $LFS mkdir -i 2 $DIR/$tdir/tgt_dir || + error "create remote target dir failed" + + $LFS mkdir -i 3 $DIR/$tdir/tgt_dir/tgt_child || + error "create remote target child failed" + + mrename $DIR/$tdir/src_dir/src_child $DIR/$tdir/tgt_dir/tgt_child || + error "rename dir cross MDT failed!" + + find $DIR/$tdir + + $CHECKSTAT -t dir $DIR/$tdir/src_dir/src_child && + error "src_child still exists after rename" + + $CHECKSTAT -t file $DIR/$tdir/tgt_dir/tgt_child/a || + error "missing file(a) after rename" + + rm -rf $DIR/$tdir || error "Can not delete directories" +} +run_test 24E "cross MDT rename/link" + test_25a() { echo '== symlink sanity =============================================' @@ -1370,6 +1357,9 @@ test_27d() { run_test 27d "create file with default settings ================" test_27e() { + # LU-5839 adds check for existed layout before setting it + [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.56) ]] && + skip "Need MDS version at least 2.7.56" && return test_mkdir -p $DIR/d27 $SETSTRIPE -c 2 $DIR/d27/f12 || error "setstripe failed" $SETSTRIPE -c 2 $DIR/d27/f12 && error "setstripe succeeded twice" @@ -1774,7 +1764,7 @@ test_27y() { done OSTIDX=$(index_from_ostuuid $OST) - mkdir -p $DIR/$tdir + test_mkdir -p $DIR/$tdir $SETSTRIPE -c 1 $DIR/$tdir # 1 stripe / file for OSC in $MDS_OSCS; do @@ -2028,7 +2018,7 @@ test_27D() { local ost_list=$(seq $first_ost $ost_step $last_ost) local ost_range="$first_ost $last_ost $ost_step" - mkdir -p $DIR/$tdir + test_mkdir -p $DIR/$tdir pool_add $POOL || error "pool_add failed" pool_add_targets $POOL $ost_range || error "pool_add_targets failed" llapi_layout_test -d$DIR/$tdir -p$POOL -o$OSTCOUNT || @@ -2181,7 +2171,6 @@ test_31d() { run_test 31d "remove of open directory =========================" test_31e() { # bug 2904 - check_kernel_version 34 || return 0 openfilleddirunlink $DIR/d31e || error } run_test 31e "remove of open non-empty directory ===============" @@ -2323,7 +2312,7 @@ link_one() { } test_31o() { # LU-2901 - mkdir -p $DIR/$tdir + test_mkdir -p $DIR/$tdir for LOOP in $(seq 100); do rm -f $DIR/$tdir/$tfile* for THREAD in $(seq 8); do @@ -2341,7 +2330,7 @@ run_test 31o "duplicate hard links with same filename" test_31p() { [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return - mkdir $DIR/$tdir + test_mkdir $DIR/$tdir $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir $LFS setdirstripe -D -c2 -t all_char $DIR/$tdir/striped_dir @@ -2694,7 +2683,7 @@ test_33d() { local MDTIDX=1 local remote_dir=$DIR/$tdir/remote_dir - mkdir -p $DIR/$tdir + test_mkdir -p $DIR/$tdir $LFS mkdir -i $MDTIDX $remote_dir || error "create remote directory failed" @@ -3013,7 +3002,7 @@ run_test 36h "utime on file racing with OST BRW write ==========" test_36i() { [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return - mkdir $DIR/$tdir + test_mkdir $DIR/$tdir $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir local mtime=$(stat -c%Y $DIR/$tdir/striped_dir) @@ -3430,7 +3419,7 @@ run_test 39n "check that O_NOATIME is honored" test_39o() { TESTDIR=$DIR/$tdir/$tfile [ -e $TESTDIR ] && rm -rf $TESTDIR - test_mkdir -p $TESTDIR + mkdir -p $TESTDIR cd $TESTDIR links1=2 ls @@ -3452,7 +3441,7 @@ test_39p() { local MDTIDX=1 TESTDIR=$DIR/$tdir/$tfile [ -e $TESTDIR ] && rm -rf $TESTDIR - mkdir -p $TESTDIR + test_mkdir -p $TESTDIR cd $TESTDIR links1=2 ls @@ -3876,19 +3865,14 @@ test_48a() { # bug 2399 [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.3.63) ] && skip "MDS prior to 2.3.63 handle ZFS dir .. incorrectly" && return - check_kernel_version 34 || return 0 - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir cd $DIR/$tdir - mv $DIR/$tdir $DIR/d48.new || error "move directory failed" + mv $DIR/$tdir $DIR/$tdir.new || error "move directory failed" test_mkdir $DIR/$tdir || error "recreate directory failed" touch foo || error "'touch foo' failed after recreating cwd" - test_mkdir $DIR/$tdir/bar || - error "'mkdir foo' failed after recreating cwd" - if check_kernel_version 44; then - touch .foo || error "'touch .foo' failed after recreating cwd" - test_mkdir $DIR/$tdir/.bar || - error "'mkdir .foo' failed after recreating cwd" - fi + test_mkdir bar || error "'mkdir foo' failed after recreating cwd" + touch .foo || error "'touch .foo' failed after recreating cwd" + test_mkdir .bar || error "'mkdir .foo' failed after recreating cwd" ls . > /dev/null || error "'ls .' failed after recreating cwd" ls .. > /dev/null || error "'ls ..' failed after removing cwd" cd . || error "'cd .' failed after recreating cwd" @@ -3900,23 +3884,18 @@ test_48a() { # bug 2399 run_test 48a "Access renamed working dir (should return errors)=" test_48b() { # bug 2399 - check_kernel_version 34 || return 0 rm -rf $DIR/$tdir - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir cd $DIR/$tdir rmdir $DIR/$tdir || error "remove cwd $DIR/$tdir failed" touch foo && error "'touch foo' worked after removing cwd" - test_mkdir $DIR/$tdir/foo && - error "'mkdir foo' worked after removing cwd" - if check_kernel_version 44; then - touch .foo && error "'touch .foo' worked after removing cwd" - test_mkdir $DIR/$tdir/.foo && - error "'mkdir .foo' worked after removing cwd" - fi + test_mkdir foo && error "'mkdir foo' worked after removing cwd" + touch .foo && error "'touch .foo' worked after removing cwd" + test_mkdir .foo && error "'mkdir .foo' worked after removing cwd" ls . > /dev/null && error "'ls .' worked after removing cwd" ls .. > /dev/null || error "'ls ..' failed after removing cwd" is_patchless || ( cd . && error "'cd .' worked after removing cwd" ) - test_mkdir $DIR/$tdir/. && error "'mkdir .' worked after removing cwd" + test_mkdir . && error "'mkdir .' worked after removing cwd" rmdir . && error "'rmdir .' worked after removing cwd" ln -s . foo && error "'ln -s .' worked after removing cwd" cd .. || echo "'cd ..' failed after removing cwd `pwd`" #bug 3517 @@ -3924,7 +3903,6 @@ test_48b() { # bug 2399 run_test 48b "Access removed working dir (should return errors)=" test_48c() { # bug 2350 - check_kernel_version 36 || return 0 #lctl set_param debug=-1 #set -vx rm -rf $DIR/$tdir @@ -3933,10 +3911,8 @@ test_48c() { # bug 2350 $TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed" $TRACE touch foo && error "touch foo worked after removing cwd" $TRACE test_mkdir foo && error "'mkdir foo' worked after removing cwd" - if check_kernel_version 44; then - touch .foo && error "touch .foo worked after removing cwd" - test_mkdir .foo && error "mkdir .foo worked after removing cwd" - fi + touch .foo && error "touch .foo worked after removing cwd" + test_mkdir .foo && error "mkdir .foo worked after removing cwd" $TRACE ls . && error "'ls .' worked after removing cwd" $TRACE ls .. || error "'ls ..' failed after removing cwd" is_patchless || ( $TRACE cd . && @@ -3949,7 +3925,6 @@ test_48c() { # bug 2350 run_test 48c "Access removed working subdir (should return errors)" test_48d() { # bug 2350 - check_kernel_version 36 || return 0 #lctl set_param debug=-1 #set -vx rm -rf $DIR/$tdir @@ -3959,11 +3934,8 @@ test_48d() { # bug 2350 $TRACE rmdir $DIR/$tdir || error "remove parent $DIR/$tdir failed" $TRACE touch foo && error "'touch foo' worked after removing parent" $TRACE test_mkdir foo && error "mkdir foo worked after removing parent" - if check_kernel_version 44; then - touch .foo && error "'touch .foo' worked after removing parent" - test_mkdir .foo && - error "mkdir .foo worked after removing parent" - fi + touch .foo && error "'touch .foo' worked after removing parent" + test_mkdir .foo && error "mkdir .foo worked after removing parent" $TRACE ls . && error "'ls .' worked after removing parent" $TRACE ls .. && error "'ls ..' worked after removing parent" is_patchless || ( $TRACE cd . && @@ -3977,7 +3949,6 @@ test_48d() { # bug 2350 run_test 48d "Access removed parent subdir (should return errors)" test_48e() { # bug 4134 - check_kernel_version 41 || return 0 #lctl set_param debug=-1 #set -vx rm -rf $DIR/$tdir @@ -4367,7 +4338,6 @@ test_54d() { run_test 54d "fifo device works in lustre ======================" test_54e() { - check_kernel_version 46 || return 0 f="$DIR/f54e" string="aaaaaa" cp -aL /dev/console $f @@ -4963,7 +4933,7 @@ test_56x() { skip_env "need 2 OST, skipping test" && return local dir0=$DIR/$tdir/$testnum - mkdir -p $dir0 || error "creating dir $dir0" + test_mkdir -p $dir0 || error "creating dir $dir0" local ref1=/etc/passwd local file1=$dir0/file1 @@ -4982,12 +4952,12 @@ run_test 56x "lfs migration support" test_56y() { [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.53) ] && - skip "No HSM support on MDS of $(get_lustre_version)," \ - "need 2.4.53 at least" && return - local res="" + skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53" && + return + local res="" local dir0=$DIR/$tdir/$testnum - mkdir -p $dir0 || error "creating dir $dir0" + test_mkdir -p $dir0 || error "creating dir $dir0" local f1=$dir0/file1 local f2=$dir0/file2 @@ -5265,6 +5235,8 @@ test_63b() { dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 rm $DIR/$tfile + sync # sync lest earlier test intercept the fail_loc + #define OBD_FAIL_OSC_BRW_PREP_REQ 0x406 lctl set_param fail_loc=0x80000406 $MULTIOP $DIR/$tfile Owy && \ @@ -5603,8 +5575,9 @@ test_69() { run_test 69 "verify oa2dentry return -ENOENT doesn't LBUG ======" test_71() { - test_mkdir -p $DIR/$tdir - sh rundbench -C -D $DIR/$tdir 2 || error "dbench failed!" + test_mkdir -p $DIR/$tdir + $LFS setdirstripe -D -c$MDSCOUNT $DIR/$tdir + sh rundbench -C -D $DIR/$tdir 2 || error "dbench failed!" } run_test 71 "Running dbench on lustre (don't segment fault) ====" @@ -6972,15 +6945,41 @@ test_102p() { # LU-4703 setxattr did not check ownership run_test 102p "check setxattr(2) correctly fails without permission" test_102q() { + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.6.92) ] && + skip "MDS needs to be at least 2.6.92" && return orphan_linkea_check $DIR/$tfile || error "orphan_linkea_check" } run_test 102q "flistxattr should not return trusted.link EAs for orphans" test_102r() { + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.6.93) ] && + skip "MDS needs to be at least 2.6.93" && return touch $DIR/$tfile || error "touch" setfattr -n user.$(basename $tfile) $DIR/$tfile || error "setfattr" getfattr -n user.$(basename $tfile) $DIR/$tfile || error "getfattr" rm $DIR/$tfile || error "rm" + + #normal directory + mkdir -p $DIR/$tdir || error "mkdir" + setfattr -n user.$(basename $tdir) $DIR/$tdir || error "setfattr dir" + getfattr -n user.$(basename $tdir) $DIR/$tdir || error "getfattr dir" + setfattr -x user.$(basename $tdir) $DIR/$tdir || + error "$testfile error deleting user.author1" + getfattr -d -m user.$(basename $tdir) 2> /dev/null | + grep "user.$(basename $tdir)" && + error "$tdir did not delete user.$(basename $tdir)" + rmdir $DIR/$tdir || error "rmdir" + + #striped directory + test_mkdir -p $DIR/$tdir || error "make striped dir" + setfattr -n user.$(basename $tdir) $DIR/$tdir || error "setfattr dir" + getfattr -n user.$(basename $tdir) $DIR/$tdir || error "getfattr dir" + setfattr -x user.$(basename $tdir) $DIR/$tdir || + error "$testfile error deleting user.author1" + getfattr -d -m user.$(basename $tdir) 2> /dev/null | + grep "user.$(basename $tdir)" && + error "$tdir did not delete user.$(basename $tdir)" + rmdir $DIR/$tdir || error "rm striped dir" } run_test 102r "set EAs with empty values" @@ -7296,6 +7295,8 @@ free_min_max () { test_116a() { # was previously test_116() [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + remote_mds_nodsh && skip "remote MDS with nodsh" && return + [[ $OSTCOUNT -lt 2 ]] && skip_env "$OSTCOUNT < 2 OSTs" && return echo -n "Free space priority " @@ -7415,6 +7416,8 @@ run_test 116a "stripe QOS: free space balance ===================" test_116b() { # LU-2093 [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + remote_mds_nodsh && skip "remote MDS with nodsh" && return + #define OBD_FAIL_MDS_OSC_CREATE_FAIL 0x147 local old_rr=$(do_facet $SINGLEMDS lctl get_param -n \ lo*.$FSNAME-MDT0000-mdtlov.qos_threshold_rr | head -1) @@ -8430,6 +8433,38 @@ test_124b() { } run_test 124b "lru resize (performance test) =======================" +test_124c() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + [ -z "$($LCTL get_param -n mdc.*.connect_flags | grep lru_resize)" ] && + skip "no lru resize on server" && return 0 + + # cache ununsed locks on client + local nr=100 + cancel_lru_locks mdc + test_mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir" + createmany -o $DIR/$tdir/f $nr || + error "failed to create $nr files in $DIR/$tdir" + ls -l $DIR/$tdir > /dev/null + + local nsdir="ldlm.namespaces.*-MDT0000-mdc-*" + local unused=$($LCTL get_param -n $nsdir.lock_unused_count) + local max_age=$($LCTL get_param -n $nsdir.lru_max_age) + local recalc_p=$($LCTL get_param -n $nsdir.pool.recalc_period) + echo "unused=$unused, max_age=$max_age, recalc_p=$recalc_p" + + # set lru_max_age to 1 sec + $LCTL set_param $nsdir.lru_max_age=1000 # jiffies + echo "sleep $((recalc_p * 2)) seconds..." + sleep $((recalc_p * 2)) + + local remaining=$($LCTL get_param -n $nsdir.lock_unused_count) + # restore lru_max_age + $LCTL set_param -n $nsdir.lru_max_age $max_age + [ $remaining -eq 0 ] || error "$remaining locks are not canceled" + unlinkmany $DIR/$tdir/f $nr +} +run_test 124c "LRUR cancel very aged locks" + test_125() { # 13358 [ -z "$(lctl get_param -n llite.*.client_type | grep local)" ] && skip "must run as local client" && return [ -z "$(lctl get_param -n mdc.*-mdc-*.connect_flags | grep acl)" ] && skip "must have acl enabled" && return @@ -9346,6 +9381,79 @@ test_133g() { } run_test 133g "Check for Oopses on bad io area writes/reads in /proc" +test_134a() { + [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.54) ]] && + skip "Need MDS version at least 2.7.54" && return + + mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir" + cancel_lru_locks mdc + + local nsdir="ldlm.namespaces.*-MDT0000-mdc-*" + local unused=$($LCTL get_param -n $nsdir.lock_unused_count) + [ $unused -eq 0 ] || "$unused locks are not cleared" + + local nr=1000 + createmany -o $DIR/$tdir/f $nr || + error "failed to create $nr files in $DIR/$tdir" + unused=$($LCTL get_param -n $nsdir.lock_unused_count) + + #define OBD_FAIL_LDLM_WATERMARK_LOW 0x327 + do_facet mds1 $LCTL set_param fail_loc=0x327 + do_facet mds1 $LCTL set_param fail_val=500 + touch $DIR/$tdir/m + + echo "sleep 10 seconds ..." + sleep 10 + local lck_cnt=$($LCTL get_param -n $nsdir.lock_unused_count) + + do_facet mds1 $LCTL set_param fail_loc=0 + do_facet mds1 $LCTL set_param fail_val=0 + [ $lck_cnt -lt $unused ] || + error "No locks reclaimed, before:$unused, after:$lck_cnt" + + rm $DIR/$tdir/m + unlinkmany $DIR/$tdir/f $nr +} +run_test 134a "Server reclaims locks when reaching low watermark" + +test_134b() { + [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.54) ]] && + skip "Need MDS version at least 2.7.54" && return + + mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir" + cancel_lru_locks mdc + + local low_wm=$(do_facet mds1 $LCTL get_param -n ldlm.watermark_mb_low) + # disable reclaim temporarily + do_facet mds1 $LCTL set_param ldlm.watermark_mb_low=0 + + #define OBD_FAIL_LDLM_WATERMARK_HIGH 0x328 + do_facet mds1 $LCTL set_param fail_loc=0x328 + do_facet mds1 $LCTL set_param fail_val=500 + + $LCTL set_param debug=+trace + + local nr=600 + createmany -o $DIR/$tdir/f $nr & + local create_pid=$! + + echo "Sleep $TIMEOUT seconds ..." + sleep $TIMEOUT + if ! ps -p $create_pid > /dev/null 2>&1; then + do_facet mds1 $LCTL set_param fail_loc=0 + do_facet mds1 $LCTL set_param fail_val=0 + do_facet mds1 $LCTL set_param ldlm.watermark_mb_low=$low_wm + error "createmany finished incorrectly!" + fi + do_facet mds1 $LCTL set_param fail_loc=0 + do_facet mds1 $LCTL set_param fail_val=0 + do_facet mds1 $LCTL set_param ldlm.watermark_mb_low=$low_wm + wait $create_pid || return 1 + + unlinkmany $DIR/$tdir/f $nr +} +run_test 134b "Server rejects lock request when reaching high watermark" + test_140() { #bug-17379 [ $PARALLEL == "yes" ] && skip "skip parallel run" && return test_mkdir -p $DIR/$tdir || error "Creating dir $DIR/$tdir" @@ -10352,6 +10460,8 @@ test_160b() { # LU-3587 run_test 160b "Verify that very long rename doesn't crash in changelog" test_160c() { + remote_mds_nodsh && skip "remote MDS with nodsh" && return + local rc=0 local server_version=$(lustre_version_code $SINGLEMDS) @@ -10671,6 +10781,8 @@ run_test 162b "striped directory path lookup sanity" # LU-4239: Verify fid2path works with paths 100 or more directories deep test_162c() { + [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.51) ]] && + skip "Need MDS version at least 2.7.51" && return test_mkdir $DIR/$tdir.local test_mkdir $DIR/$tdir.remote local lpath=$tdir.local @@ -10935,31 +11047,32 @@ test_181() { # bug 22177 run_test 181 "Test open-unlinked dir ========================" test_182() { - [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - # disable MDC RPC lock wouldn't crash client local fcount=1000 - local tcount=4 + local tcount=10 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir" -#define OBD_FAIL_MDC_RPCS_SEM 0x804 - $LCTL set_param fail_loc=0x804 - for (( i=0; i < $tcount; i++ )) ; do + $LCTL set_param mdc.*.rpc_stats=clear + + for (( i = 0; i < $tcount; i++ )) ; do mkdir $DIR/$tdir/$i + done + + for (( i = 0; i < $tcount; i++ )) ; do createmany -o $DIR/$tdir/$i/f- $fcount & done wait - for (( i=0; i < $tcount; i++ )) ; do + for (( i = 0; i < $tcount; i++ )) ; do unlinkmany $DIR/$tdir/$i/f- $fcount & done wait - rm -rf $DIR/$tdir + $LCTL get_param mdc.*.rpc_stats - $LCTL set_param fail_loc=0 + rm -rf $DIR/$tdir } -run_test 182 "Disable MDC RPCs semaphore wouldn't crash client ================" +run_test 182 "Test parallel modify metadata operations ================" test_183() { # LU-2275 remote_mds_nodsh && skip "remote MDS with nodsh" && return @@ -11197,6 +11310,10 @@ test_185() { # LU-2441 run_test 185 "Volatile file support" test_187a() { + remote_mds_nodsh && skip "remote MDS with nodsh" && return + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.3.0) ] && + skip "Need MDS version at least 2.3.0" && return + local dir0=$DIR/$tdir/$testnum mkdir -p $dir0 || error "creating dir $dir0" @@ -11214,6 +11331,10 @@ test_187a() { run_test 187a "Test data version change" test_187b() { + remote_mds_nodsh && skip "remote MDS with nodsh" && return + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.3.0) ] && + skip "Need MDS version at least 2.3.0" && return + local dir0=$DIR/$tdir/$testnum mkdir -p $dir0 || error "creating dir $dir0" @@ -11411,36 +11532,41 @@ else fi verify_jobstats() { - local cmd=$1 - local target=$2 - - # clear old jobstats - do_facet $SINGLEMDS lctl set_param mdt.*.job_stats="clear" - do_facet ost1 lctl set_param obdfilter.*.job_stats="clear" - - # use a new JobID for this test, or we might see an old one - [ "$JOBENV" = "FAKE_JOBID" ] && FAKE_JOBID=test_id.$testnum.$RANDOM + local cmd=($1) + shift + local facets="$@" + +# we don't really need to clear the stats for this test to work, since each +# command has a unique jobid, but it makes debugging easier if needed. +# for facet in $facets; do +# local dev=$(convert_facet2label $facet) +# # clear old jobstats +# do_facet $facet lctl set_param *.$dev.job_stats="clear" +# done + + # use a new JobID for each test, or we might see an old one + [ "$JOBENV" = "FAKE_JOBID" ] && + FAKE_JOBID=id.$testnum.$(basename ${cmd[0]}).$RANDOM JOBVAL=${!JOBENV} - log "Test: $cmd" + log "Test: ${cmd[*]}" log "Using JobID environment variable $JOBENV=$JOBVAL" if [ $JOBENV = "FAKE_JOBID" ]; then - FAKE_JOBID=$JOBVAL $cmd + FAKE_JOBID=$JOBVAL ${cmd[*]} else - $cmd + ${cmd[*]} fi - if [ "$target" = "mdt" -o "$target" = "both" ]; then - FACET="$SINGLEMDS" # will need to get MDS number for DNE - do_facet $FACET lctl get_param mdt.*.job_stats | - grep $JOBVAL || error "No job stats found on MDT $FACET" - fi - if [ "$target" = "ost" -o "$target" = "both" ]; then - FACET=ost1 - do_facet $FACET lctl get_param obdfilter.*.job_stats | - grep $JOBVAL || error "No job stats found on OST $FACET" - fi + # all files are created on OST0000 + for facet in $facets; do + local stats="*.$(convert_facet2label $facet).job_stats" + if [ $(do_facet $facet lctl get_param $stats | + grep -c $JOBVAL) -ne 1 ]; then + do_facet $facet lctl get_param $stats + error "No jobstats for $JOBVAL found on $facet::$stats" + fi + done } jobstats_set() { @@ -11450,54 +11576,83 @@ jobstats_set() { wait_update $HOSTNAME "$LCTL get_param -n jobid_var" $NEW_JOBENV } +cleanup_205() { + do_facet $SINGLEMDS \ + $LCTL set_param mdt.*.job_cleanup_interval=$OLD_INTERVAL + [ $OLD_JOBENV != $JOBENV ] && jobstats_set $OLD_JOBENV + do_facet $SINGLEMDS lctl --device $MDT0 changelog_deregister $CL_USER +} + test_205() { # Job stats [ $PARALLEL == "yes" ] && skip "skip parallel run" && return remote_mgs_nodsh && skip "remote MGS with nodsh" && return + remote_mds_nodsh && skip "remote MDS with nodsh" && return + remote_ost_nodsh && skip "remote OST with nodsh" && return + [ -z "$(lctl get_param -n mdc.*.connect_flags | grep jobstats)" ] && skip "Server doesn't support jobstats" && return 0 [[ $JOBID_VAR = disable ]] && skip "jobstats is disabled" && return - local cmd OLD_JOBENV=$($LCTL get_param -n jobid_var) if [ $OLD_JOBENV != $JOBENV ]; then jobstats_set $JOBENV - trap jobstats_set EXIT + trap cleanup_205 EXIT fi - local user=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \ - changelog_register -n) - echo "Registered as changelog user $user" + CL_USER=$(do_facet $SINGLEMDS lctl --device $MDT0 changelog_register -n) + echo "Registered as changelog user $CL_USER" + OLD_INTERVAL=$(do_facet $SINGLEMDS \ + lctl get_param -n mdt.*.job_cleanup_interval) + local interval_new=5 + do_facet $SINGLEMDS \ + $LCTL set_param mdt.*.job_cleanup_interval=$interval_new + local start=$SECONDS + + local cmd # mkdir - cmd="mkdir $DIR/$tfile" - verify_jobstats "$cmd" "mdt" + cmd="mkdir $DIR/$tdir" + verify_jobstats "$cmd" "$SINGLEMDS" # rmdir - cmd="rm -fr $DIR/$tfile" - verify_jobstats "$cmd" "mdt" + cmd="rmdir $DIR/$tdir" + verify_jobstats "$cmd" "$SINGLEMDS" + # mkdir on secondary MDT + if [ $MDSCOUNT -gt 1 ]; then + cmd="lfs mkdir -i 1 $DIR/$tdir.remote" + verify_jobstats "$cmd" "mds2" + fi # mknod cmd="mknod $DIR/$tfile c 1 3" - verify_jobstats "$cmd" "mdt" + verify_jobstats "$cmd" "$SINGLEMDS" # unlink cmd="rm -f $DIR/$tfile" - verify_jobstats "$cmd" "mdt" + verify_jobstats "$cmd" "$SINGLEMDS" + # create all files on OST0000 so verify_jobstats can find OST stats # open & close cmd="$SETSTRIPE -i 0 -c 1 $DIR/$tfile" - verify_jobstats "$cmd" "mdt" + verify_jobstats "$cmd" "$SINGLEMDS" # setattr cmd="touch $DIR/$tfile" - verify_jobstats "$cmd" "both" + verify_jobstats "$cmd" "$SINGLEMDS ost1" # write cmd="dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=sync" - verify_jobstats "$cmd" "ost" + verify_jobstats "$cmd" "ost1" # read cmd="dd if=$DIR/$tfile of=/dev/null bs=1M count=1 iflag=direct" - verify_jobstats "$cmd" "ost" + verify_jobstats "$cmd" "ost1" # truncate cmd="$TRUNCATE $DIR/$tfile 0" - verify_jobstats "$cmd" "both" + verify_jobstats "$cmd" "$SINGLEMDS ost1" # rename - cmd="mv -f $DIR/$tfile $DIR/jobstats_test_rename" - verify_jobstats "$cmd" "mdt" + cmd="mv -f $DIR/$tfile $DIR/$tdir.rename" + verify_jobstats "$cmd" "$SINGLEMDS" + # jobstats expiry - sleep until old stats should be expired + local left=$((interval_new - (SECONDS - start))) + [ $left -ge 0 ] && echo "sleep $left for expiry" && sleep $((left + 1)) + cmd="mkdir $DIR/$tdir.expire" + verify_jobstats "$cmd" "$SINGLEMDS" + [ $(do_facet $SINGLEMDS lctl get_param *.*.job_stats | + grep -c "job_id.*mkdir") -gt 1 ] && error "old jobstats not expired" # Ensure that jobid are present in changelog (if supported by MDS) if [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.6.52) ] @@ -11517,10 +11672,7 @@ test_205() { # Job stats error "Unexpected jobids when jobid_var=$JOBENV" fi - # cleanup - rm -f $DIR/jobstats_test_rename - - [ $OLD_JOBENV != $JOBENV ] && jobstats_set $OLD_JOBENV + cleanup_205 } run_test 205 "Verify job stats" @@ -11575,9 +11727,9 @@ test_208() { # for now as only exclusive open is supported. After generic lease # is done, this test suite should be revised. - Jinshan + remote_mds_nodsh && skip "remote MDS with nodsh" && return [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.4.52) ]] || { skip "Need MDS version at least 2.4.52"; return 0; } - remote_mds_nodsh && skip "remote MDS with nodsh" && return echo "==== test 1: verify get lease work" $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:eRE+eU || error "get lease error" @@ -11905,6 +12057,8 @@ run_test 219 "LU-394: Write partial won't cause uncontiguous pages vec at LND" test_220() { #LU-325 [ $PARALLEL == "yes" ] && skip "skip parallel run" && return remote_ost_nodsh && skip "remote OST with nodsh" && return + remote_mds_nodsh && skip "remote MDS with nodsh" && return + remote_mgs_nodsh && skip "remote MGS with nodsh" && return local OSTIDX=0 test_mkdir -p $DIR/$tdir @@ -12039,9 +12193,43 @@ test_224b() { # LU-1039, MRP-303 } run_test 224b "Don't panic on bulk IO failure" +test_224c() { # LU-6441 + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + local pages_per_rpc=$($LCTL get_param \ + osc.*.max_pages_per_rpc) + local at_max=$($LCTL get_param -n at_max) + local timeout=$($LCTL get_param -n timeout) + local test_at="$LCTL get_param -n at_max" + local param_at="$FSNAME.sys.at_max" + local test_timeout="$LCTL get_param -n timeout" + local param_timeout="$FSNAME.sys.timeout" + + $LCTL set_param -n osc.*.max_pages_per_rpc=1024 + + set_conf_param_and_check client "$test_at" "$param_at" 0 || + error "conf_param at_max=0 failed" + set_conf_param_and_check client "$test_timeout" "$param_timeout" 5 || + error "conf_param timeout=5 failed" + + #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB3 0x520 + $LCTL set_param fail_loc=0x520 + dd if=/dev/zero of=$DIR/$tfile bs=8MB count=1 + sync + $LCTL set_param fail_loc=0 + + set_conf_param_and_check client "$test_at" "$param_at" $at_max || + error "conf_param at_max=$at_max failed" + set_conf_param_and_check client "$test_timeout" "$param_timeout" \ + $timeout || error "conf_param timeout=$timeout failed" + + $LCTL set_param -n $pages_per_rpc +} +run_test 224c "Don't hang if one of md lost during large bulk RPC" + MDSSURVEY=${MDSSURVEY:-$(which mds-survey 2>/dev/null || true)} test_225a () { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + remote_mds_nodsh && skip "remote MDS with nodsh" && return if [ -z ${MDSSURVEY} ]; then skip_env "mds-survey not found" && return fi @@ -12071,7 +12259,7 @@ run_test 225a "Metadata survey sanity with zero-stripe" test_225b () { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - + remote_mds_nodsh && skip "remote MDS with nodsh" && return if [ -z ${MDSSURVEY} ]; then skip_env "mds-survey not found" && return fi @@ -12321,8 +12509,8 @@ run_test 228c "NOT shrink the last entry in OI index node to recycle idle leaf" test_229() { # LU-2482, LU-3448 [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.53) ] && - skip "No HSM support on MDS of $(get_lustre_version)," \ - "need 2.4.53 at least" && return + skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53" && + return [ $PARALLEL == "yes" ] && skip "skip parallel run" && return [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return @@ -12420,7 +12608,7 @@ test_230b() { ln -s $migrate_dir/$tfile $migrate_dir/${tfile}_ln ln -s $other_dir/$tfile $migrate_dir/${tfile}_ln_other - $LFS mv -v -M $MDTIDX $migrate_dir || + $LFS migrate -m $MDTIDX $migrate_dir || error "migrate remote dir error" echo "migratate to MDT1, then checking.." @@ -12484,7 +12672,7 @@ test_230b() { #migrate back to MDT0 MDTIDX=0 - $LFS mv -v -M $MDTIDX $migrate_dir || + $LFS migrate -m $MDTIDX $migrate_dir || error "migrate remote dir error" echo "migrate back to MDT0, checking.." @@ -12542,6 +12730,7 @@ run_test 230b "migrate directory" test_230c() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + remote_mds_nodsh && skip "remote MDS with nodsh" && return [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return local MDTIDX=1 local mdt_index @@ -12561,7 +12750,7 @@ test_230c() { do_facet mds1 lctl set_param fail_loc=0x20001801 do_facet mds1 lctl set_param fail_val=5 local t=$(ls $migrate_dir | wc -l) - $LFS mv --mdt-index $MDTIDX $migrate_dir && + $LFS migrate --mdt-index $MDTIDX $migrate_dir && error "migrate should fail after 5 entries" local u=$(ls $migrate_dir | wc -l) [ "$u" == "$t" ] || error "$u != $t during migration" @@ -12573,7 +12762,7 @@ test_230c() { do_facet mds1 lctl set_param fail_loc=0 do_facet mds1 lctl set_param fail_val=0 - $LFS mv -M $MDTIDX $migrate_dir || + $LFS migrate -m $MDTIDX $migrate_dir || error "migrate open files should failed with open files" echo "Finish migration, then checking.." @@ -12605,7 +12794,8 @@ test_230d() { error "create files under remote dir failed $i" done - $LFS mv -M $MDTIDX -v $migrate_dir || error "migrate remote dir error" + $LFS migrate -m $MDTIDX $migrate_dir || + error "migrate remote dir error" echo "Finish migration, then checking.." for file in $(find $migrate_dir); do @@ -12876,6 +13066,16 @@ test_241() { } run_test 241 "bio vs dio" +test_241b() { + dd if=/dev/zero of=$DIR/$tfile count=1 bs=40960 + ls -la $DIR/$tfile + test_241_dio 1000 & + PID=$! + test_241_dio 1000 + wait $PID +} +run_test 241b "dio vs dio" + test_242() { mkdir -p $DIR/$tdir touch $DIR/$tdir/$tfile @@ -12896,6 +13096,16 @@ test_243() } run_test 243 "various group lock tests" +test_244() +{ + test_mkdir -p $DIR/$tdir + dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=35 + sendfile_grouplock $DIR/$tdir/$tfile || \ + error "sendfile+grouplock failed" + rm -rf $DIR/$tdir +} +run_test 244 "sendfile with group lock tests" + test_250() { [ "$(facet_fstype ost$(($($GETSTRIPE -i $DIR/$tfile) + 1)))" = "zfs" ] \ && skip "no 16TB file size limit on ZFS" && return @@ -12910,6 +13120,23 @@ test_250() { } run_test 250 "Write above 16T limit" +test_251() { + $SETSTRIPE -c -1 -S 1048576 $DIR/$tfile + + #define OBD_FAIL_LLITE_LOST_LAYOUT 0x1407 + #Skip once - writing the first stripe will succeed + $LCTL set_param fail_loc=0xa0001407 fail_val=1 + $MULTIOP $DIR/$tfile o:O_RDWR:w2097152c 2>&1 | grep -q "short write" && + error "short write happened" + + $LCTL set_param fail_loc=0xa0001407 fail_val=1 + $MULTIOP $DIR/$tfile or2097152c 2>&1 | grep -q "short read" && + error "short read happened" + + rm -f $DIR/$tfile +} +run_test 251 "Handling short read and write correctly" + cleanup_test_300() { trap 0 umask $SAVE_UMASK @@ -12931,6 +13158,8 @@ test_striped_dir() { local mode=$(stat -c%a $DIR/$tdir/striped_dir) [ "$mode" = "755" ] || error "expect 755 got $mode" + $LFS getdirstripe $DIR/$tdir/striped_dir > /dev/null 2>&1 || + error "getdirstripe failed" stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir) if [ "$stripe_count" != "2" ]; then error "stripe_count is $stripe_count, expect 2" @@ -13097,19 +13326,16 @@ test_300e() { $LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir/stp_c || error "set striped dir under striped dir error" - mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir/b && - error "rename file under striped dir should fail" + mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir/dir_b || + error "rename dir under striped dir fails" - mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir/dir_b && - error "rename dir under striped dir should fail" - - mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir/stp_b && - error "rename dir under different stripes should fail" + mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir/stp_b || + error "rename dir under different stripes fails" mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir/c || error "rename file under striped dir should succeed" - mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir/dir_c || + mrename $DIR/$tdir/striped_dir/dir_b $DIR/$tdir/striped_dir/dir_c || error "rename dir under striped dir should succeed" rm -rf $DIR/$tdir @@ -13141,21 +13367,15 @@ test_300f() { $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir/stp_b || error "create striped dir under striped dir fails" - mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir1/b && - error "rename file under different striped dir should fail" - - mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir1/dir_b && + mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir1/dir_b || error "rename dir under different striped dir should fail" - mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir1/stp_b && + mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir1/stp_b || error "rename striped dir under diff striped dir should fail" mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir1/a || error "rename file under diff striped dirs fails" - mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir1/dir_a || - error "rename dir under diff striped dirs fails" - rm -rf $DIR/$tdir } run_test 300f "check rename cross striped directory" @@ -13307,6 +13527,152 @@ test_300i() { } run_test 300i "client handle unknown hash type striped directory" +test_300j() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.55) ] && + skip "Need MDS version at least 2.7.55" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + local stripe_count + local file + + mkdir $DIR/$tdir + + #define OBD_FAIL_SPLIT_UPDATE_REC 0x1702 + $LCTL set_param fail_loc=0x1702 + $LFS setdirstripe -i 0 -c$MDSCOUNT -t all_char $DIR/$tdir/striped_dir || + error "set striped dir error" + + createmany -o $DIR/$tdir/striped_dir/f- 10 || + error "create files under striped dir failed" + + $LCTL set_param fail_loc=0 + + rm -rf $DIR/$tdir || error "unlink striped dir fails" + + return 0 +} +run_test 300j "test large update record" + +test_300k() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.55) ] && + skip "Need MDS version at least 2.7.55" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + local stripe_count + local file + + mkdir $DIR/$tdir + + #define OBD_FAIL_LARGE_STRIPE 0x1703 + $LCTL set_param fail_loc=0x1703 + $LFS setdirstripe -i 0 -c512 $DIR/$tdir/striped_dir || + error "set striped dir error" + $LCTL set_param fail_loc=0 + + $LFS getdirstripe $DIR/$tdir/striped_dir || + error "getstripeddir fails" + rm -rf $DIR/$tdir/striped_dir || + error "unlink striped dir fails" + + return 0 +} +run_test 300k "test large striped directory" + +test_300l() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + local stripe_index + + test_mkdir -p $DIR/$tdir/striped_dir + chown $RUNAS_ID $DIR/$tdir/striped_dir || + error "chown $RUNAS_ID failed" + $LFS setdirstripe -i 1 -D $DIR/$tdir/striped_dir || + error "set default striped dir failed" + + #define OBD_FAIL_MDS_STALE_DIR_LAYOUT 0x158 + $LCTL set_param fail_loc=0x80000158 + $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir || error "create dir fails" + + stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/test_dir) + [ $stripe_index -eq 1 ] || + error "expect 1 get $stripe_index for $dir" +} +run_test 300l "non-root user to create dir under striped dir with stale layout" + +prepare_remote_file() { + mkdir $DIR/$tdir/src_dir || + error "create remote source failed" + + cp /etc/hosts $DIR/$tdir/src_dir/a || error + touch $DIR/$tdir/src_dir/a + + $LFS mkdir -i 1 $DIR/$tdir/tgt_dir || + error "create remote target dir failed" + + touch $DIR/$tdir/tgt_dir/b + + mrename $DIR/$tdir/src_dir/a $DIR/$tdir/tgt_dir/b || + error "rename dir cross MDT failed!" + + $CHECKSTAT -t file $DIR/$tdir/src_dir/a && + error "src_child still exists after rename" + + $CHECKSTAT -t file $DIR/$tdir/tgt_dir/b || + error "missing file(a) after rename" + + diff /etc/hosts $DIR/$tdir/tgt_dir/b || + error "diff after rename" +} + +test_310a() { + [[ $MDSCOUNT -lt 2 ]] && skip "needs >= 4 MDTs" && return + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + local remote_file=$DIR/$tdir/tgt_dir/b + + mkdir -p $DIR/$tdir + + prepare_remote_file || error "prepare remote file failed" + + #open-unlink file + $OPENUNLINK $remote_file $remote_file || error + $CHECKSTAT -a $remote_file || error +} +run_test 310a "open unlink remote file" + +test_310b() { + [[ $MDSCOUNT -lt 2 ]] && skip "needs >= 4 MDTs" && return + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + local remote_file=$DIR/$tdir/tgt_dir/b + + mkdir -p $DIR/$tdir + + prepare_remote_file || error "prepare remote file failed" + + ln $remote_file $DIR/$tfile || error "link failed for remote file" + $MULTIOP $DIR/$tfile Ouc || error "mulitop failed" + $CHECKSTAT -t file $remote_file || error "check file failed" +} +run_test 310b "unlink remote file with multiple links while open" + +test_310c() { + [[ $MDSCOUNT -lt 4 ]] && skip "needs >= 4 MDTs" && return + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + local remote_file=$DIR/$tdir/tgt_dir/b + + mkdir -p $DIR/$tdir + + prepare_remote_file || error "prepare remote file failed" + + ln $remote_file $DIR/$tfile || error "link failed for remote file" + multiop_bg_pause $remote_file O_uc || + error "mulitop failed for remote file" + MULTIPID=$! + $MULTIOP $DIR/$tfile Ouc + kill -USR1 $MULTIPID + wait $MULTIPID +} +run_test 310c "open-unlink remote file with multiple links" + test_400a() { # LU-1606, was conf-sanity test_74 local extra_flags='' local out=$TMP/$tfile