X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Ftests%2Fsanity.sh;h=c04480b75dbd7f9a09470e8c35abec5a6fd82f94;hp=445017257f32f1bdfae89d5a5f29d257510b3c72;hb=113fa79b7dc9b598c615d4cbfa6e3513d2c6d35b;hpb=672986cbae63e90262d55bf277643ea046bfa8b2 diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index 4450172..c04480b 100755 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -8,42 +8,26 @@ set -e ONLY=${ONLY:-"$*"} -# bug number for skipped test: 13297 2108 9789 3637 9789 3561 5188 -ALWAYS_EXCEPT=" 42a 42b 42c 42d 45 68b $SANITY_EXCEPT" +# bug number for skipped test: LU-9693 LU-6493 LU-9693 +ALWAYS_EXCEPT="$SANITY_EXCEPT 42a 42b 42c" # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT! -# with LOD/OSP landing -# bug number for skipped tests: LU-2036 LU-8411 -ALWAYS_EXCEPT=" 76 407 $ALWAYS_EXCEPT" +# skipped tests: LU-8411 LU-9096 LU-9054 +ALWAYS_EXCEPT=" 407 253 312 $ALWAYS_EXCEPT" -is_sles11() # LU-4341 -{ - if [ -r /etc/SuSE-release ] - then - local vers=$(grep VERSION /etc/SuSE-release | awk '{print $3}') - local patchlev=$(grep PATCHLEVEL /etc/SuSE-release | - awk '{ print $3 }') - if [ $vers -eq 11 ] && [ $patchlev -ge 3 ]; then - return 0 - fi - fi - return 1 -} - -if is_sles11; then # LU-4341 - ALWAYS_EXCEPT="$ALWAYS_EXCEPT 170" -fi +# Check Grants after these tests +GRANT_CHECK_LIST="$GRANT_CHECK_LIST 42a 42b 42c 42d 42e 63a 63b 64a 64b 64c" SRCDIR=$(cd $(dirname $0); echo $PWD) export PATH=$PATH:/sbin TMP=${TMP:-/tmp} +OSC=${OSC:-"osc"} CC=${CC:-cc} CHECKSTAT=${CHECKSTAT:-"checkstat -v"} CREATETEST=${CREATETEST:-createtest} LFS=${LFS:-lfs} -LFIND=${LFIND:-"$LFS find"} LVERIFY=${LVERIFY:-ll_dirstripe_verify} LCTL=${LCTL:-lctl} OPENFILE=${OPENFILE:-openfile} @@ -79,12 +63,36 @@ init_logging [ "$SLOW" = "no" ] && EXCEPT_SLOW="27m 64b 68 71 115 300o" if [ $(facet_fstype $SINGLEMDS) = "zfs" ]; then - # bug number for skipped test: LU-4536 LU-1957 - ALWAYS_EXCEPT="$ALWAYS_EXCEPT 65ic 180" + # bug number for skipped test: LU-1957 + ALWAYS_EXCEPT="$ALWAYS_EXCEPT 180" # 13 (min)" [ "$SLOW" = "no" ] && EXCEPT_SLOW="$EXCEPT_SLOW 51b" fi +# Get the SLES version so we can make decisions on if a test should be run +# +# Returns a version string that should only be used in comparing +# strings returned by version_code() + +sles_version_code() +{ + local version=$(grep VERSION_ID /etc/os-release | cut -d'"' -f2) + + # All SuSE Linux versions have one decimal. version_code expects two + local sles_version=$version.0 + version_code $sles_version +} + +if [ -r /etc/SuSE-release ]; then + sles_version=$(sles_version_code) + [ $sles_version -lt $(version_code 11.4.0) ] && + # bug number for skipped test: LU-4341 + ALWAYS_EXCEPT="$ALWAYS_EXCEPT 170" + [ $sles_version -lt $(version_code 12.0.0) ] && + # bug number for skipped test: LU-3703 + ALWAYS_EXCEPT="$ALWAYS_EXCEPT 234" +fi + FAIL_ON_ERROR=false cleanup() { @@ -160,44 +168,41 @@ test_0c() { $LCTL get_param mdc.*.import | grep "target: $FSNAME-MDT" || error "bad target" } -run_test 0c "check import proc =============================" +run_test 0c "check import proc" test_1() { - test_mkdir -p $DIR/$tdir || error "mkdir $tdir failed" - test_mkdir -p $DIR/$tdir/d2 || error "mkdir $tdir/d2 failed" - test_mkdir $DIR/$tdir/d2 && error "we expect EEXIST, but not returned" + test_mkdir $DIR/$tdir + test_mkdir $DIR/$tdir/d2 + mkdir $DIR/$tdir/d2 && error "we expect EEXIST, but not returned" $CHECKSTAT -t dir $DIR/$tdir/d2 || error "$tdir/d2 is not a dir" rmdir $DIR/$tdir/d2 rmdir $DIR/$tdir $CHECKSTAT -a $DIR/$tdir || error "$tdir was not removed" } -run_test 1 "mkdir; remkdir; rmdir ==============================" +run_test 1 "mkdir; remkdir; rmdir" test_2() { - test_mkdir -p $DIR/$tdir || error "mkdir $tdir failed" + test_mkdir $DIR/$tdir touch $DIR/$tdir/$tfile || error "touch $tdir/$tfile failed" $CHECKSTAT -t file $DIR/$tdir/$tfile || error "$tdir/$tfile not a file" rm -r $DIR/$tdir $CHECKSTAT -a $DIR/$tdir/$tfile || error "$tdir/$file is not removed" } -run_test 2 "mkdir; touch; rmdir; check file ====================" +run_test 2 "mkdir; touch; rmdir; check file" test_3() { - test_mkdir -p $DIR/$tdir || error "mkdir $tdir failed" + test_mkdir $DIR/$tdir $CHECKSTAT -t dir $DIR/$tdir || error "$tdir is not a directory" touch $DIR/$tdir/$tfile $CHECKSTAT -t file $DIR/$tdir/$tfile || error "$tdir/$tfile not a file" rm -r $DIR/$tdir $CHECKSTAT -a $DIR/$tdir || error "$tdir is not removed" } -run_test 3 "mkdir; touch; rmdir; check dir =====================" +run_test 3 "mkdir; touch; rmdir; check dir" # LU-4471 - failed rmdir on remote directories still removes directory on MDT0 test_4() { - local MDTIDX=1 - - test_mkdir $DIR/$tdir || - error "Create remote directory failed" + test_mkdir -i 1 $DIR/$tdir touch $DIR/$tdir/$tfile || error "Create file under remote directory failed" @@ -212,13 +217,13 @@ test_4() { run_test 4 "mkdir; touch dir/file; rmdir; checkdir (expect error)" test_5() { - test_mkdir -p $DIR/$tdir || error "mkdir $tdir failed" - test_mkdir $DIR/$tdir/d2 || error "mkdir $tdir/d2 failed" + test_mkdir $DIR/$tdir + test_mkdir $DIR/$tdir/d2 chmod 0707 $DIR/$tdir/d2 || error "chmod 0707 $tdir/d2 failed" $CHECKSTAT -t dir -p 0707 $DIR/$tdir/d2 || error "$tdir/d2 not mode 707" $CHECKSTAT -t dir $DIR/$tdir/d2 || error "$tdir/d2 is not a directory" } -run_test 5 "mkdir .../d5 .../d5/d2; chmod .../d5/d2 ============" +run_test 5 "mkdir .../d5 .../d5/d2; chmod .../d5/d2" test_6a() { touch $DIR/$tfile || error "touch $DIR/$tfile failed" @@ -253,15 +258,15 @@ test_6e() { $CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/$tfile || error "$tfile should be owned by UID $UID and GID $RUNAS_ID" } -run_test 6e "touch f6e; chgrp f6e; $RUNAS chgrp f6e (should return error) ==" +run_test 6e "touch+chgrp $tfile; $RUNAS chgrp $tfile (should return error)" test_6g() { [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID" && return - test_mkdir $DIR/$tdir || error "mkdir $tfile failed" + test_mkdir $DIR/$tdir chmod 777 $DIR/$tdir || error "chmod 0777 $tdir failed" $RUNAS mkdir $DIR/$tdir/d || error "mkdir $tdir/d failed" chmod g+s $DIR/$tdir/d || error "chmod g+s $tdir/d failed" - test_mkdir $DIR/$tdir/d/subdir || error "mkdir $tdir/d/subdir failed" + test_mkdir $DIR/$tdir/d/subdir $CHECKSTAT -g \#$RUNAS_GID $DIR/$tdir/d/subdir || error "$tdir/d/subdir should be GID $RUNAS_GID" if [[ $MDSCOUNT -gt 1 ]]; then @@ -280,7 +285,7 @@ test_6g() { error "$tdir.remote should be mode 02755" fi } -run_test 6g "Is new dir in sgid dir inheriting group?" +run_test 6g "verify new dir in sgid dir inherits group" test_6h() { # bug 7331 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID" && return @@ -291,7 +296,7 @@ test_6h() { # bug 7331 $CHECKSTAT -t file -u \#$RUNAS_ID -g \#$RUNAS_GID $DIR/$tfile || error "$tdir/$tfile should be UID $RUNAS_UID GID $RUNAS_GID" } -run_test 6h "$RUNAS chown RUNAS_ID.0 .../f6h (should return error)" +run_test 6h "$RUNAS chown RUNAS_ID.0 .../$tfile (should return error)" test_7a() { test_mkdir $DIR/$tdir @@ -392,10 +397,10 @@ test_16() { rm -rf $DIR/$tdir/$tfile $CHECKSTAT -a $DIR/$tdir/$tfile || error "$tdir/$tfile not removed" } -run_test 16 "touch .../d16/f; rm -rf .../d16/f =================" +run_test 16 "touch .../d16/f; rm -rf .../d16/f" test_17a() { - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir touch $DIR/$tdir/$tfile ln -s $DIR/$tdir/$tfile $DIR/$tdir/l-exist ls -l $DIR/$tdir @@ -406,10 +411,10 @@ test_17a() { rm -f $DIR/$tdir/l-exist $CHECKSTAT -a $DIR/$tdir/l-exist || error "$tdir/l-exist not removed" } -run_test 17a "symlinks: create, remove (real) ==================" +run_test 17a "symlinks: create, remove (real)" test_17b() { - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir ln -s no-such-file $DIR/$tdir/l-dangle ls -l $DIR/$tdir $CHECKSTAT -l no-such-file $DIR/$tdir/l-dangle || @@ -419,33 +424,33 @@ test_17b() { rm -f $DIR/$tdir/l-dangle $CHECKSTAT -a $DIR/$tdir/l-dangle || error "$tdir/l-dangle not removed" } -run_test 17b "symlinks: create, remove (dangling) ==============" +run_test 17b "symlinks: create, remove (dangling)" test_17c() { # bug 3440 - don't save failed open RPC for replay - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir ln -s foo $DIR/$tdir/$tfile cat $DIR/$tdir/$tfile && error "opened non-existent symlink" || true } -run_test 17c "symlinks: open dangling (should return error) ====" +run_test 17c "symlinks: open dangling (should return error)" test_17d() { - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir ln -s foo $DIR/$tdir/$tfile touch $DIR/$tdir/$tfile || error "creating to new symlink" } -run_test 17d "symlinks: create dangling ========================" +run_test 17d "symlinks: create dangling" test_17e() { - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir local foo=$DIR/$tdir/$tfile ln -s $foo $foo || error "create symlink failed" ls -l $foo || error "ls -l failed" ls $foo && error "ls not failed" || true } -run_test 17e "symlinks: create recursive symlink (should return error) ====" +run_test 17e "symlinks: create recursive symlink (should return error)" test_17f() { - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir ln -s 1234567890/2234567890/3234567890/4234567890 $DIR/$tdir/111 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890 $DIR/$tdir/222 ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890 $DIR/$tdir/333 @@ -454,7 +459,7 @@ test_17f() { ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890/c234567890/d234567890/f234567890/aaaaaaaaaa/bbbbbbbbbb/cccccccccc/dddddddddd/eeeeeeeeee/ffffffffff/ $DIR/$tdir/666 ls -l $DIR/$tdir } -run_test 17f "symlinks: long and very long symlink name ========================" +run_test 17f "symlinks: long and very long symlink name" # str_repeat(S, N) generate a string that is string S repeated N times str_repeat() { @@ -469,7 +474,7 @@ str_repeat() { # Long symlinks and LU-2241 test_17g() { - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir local TESTS="59 60 61 4094 4095" # Fix for inode size boundary in 2.1.4 @@ -498,16 +503,16 @@ test_17h() { #bug 17378 remote_mds_nodsh && skip "remote MDS with nodsh" && return [ $PARALLEL == "yes" ] && skip "skip parallel run" && return local mdt_idx - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir if [[ $MDSCOUNT -gt 1 ]]; then mdt_idx=$($LFS getdirstripe -i $DIR/$tdir) else mdt_idx=0 fi - $SETSTRIPE -c -1 $DIR/$tdir -#define OBD_FAIL_MDS_LOV_PREP_CREATE 0x141 - do_facet mds$((mdt_idx + 1)) lctl set_param fail_loc=0x80000141 - touch $DIR/$tdir/$tfile || true + $LFS setstripe -c -1 $DIR/$tdir + #define OBD_FAIL_MDS_LOV_PREP_CREATE 0x141 + do_facet mds$((mdt_idx + 1)) lctl set_param fail_loc=0x80000141 + touch $DIR/$tdir/$tfile || true } run_test 17h "create objects: lov_free_memmd() doesn't lbug" @@ -536,19 +541,19 @@ test_17k() { #bug 22301 rsync --help | grep -q xattr || skip_env "$(rsync --version | head -n1) does not support xattrs" [ $PARALLEL == "yes" ] && skip "skip parallel run" && return 0 - test_mkdir -p $DIR/$tdir - test_mkdir -p $DIR/$tdir.new + test_mkdir $DIR/$tdir + test_mkdir $DIR/$tdir.new touch $DIR/$tdir/$tfile ln -s $DIR/$tdir/$tfile $DIR/$tdir/$tfile.lnk rsync -av -X $DIR/$tdir/ $DIR/$tdir.new || error "rsync failed with xattrs enabled" } -run_test 17k "symlinks: rsync with xattrs enabled =========================" +run_test 17k "symlinks: rsync with xattrs enabled" test_17l() { # LU-279 [[ -z "$(which getfattr 2>/dev/null)" ]] && skip "no getfattr command" && return 0 - test_mkdir -p $DIR/$tdir + test_mkdir $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 @@ -561,12 +566,12 @@ test_17l() { # LU-279 done done } -run_test 17l "Ensure lgetxattr's returned xattr size is consistent ========" +run_test 17l "Ensure lgetxattr's returned xattr size is consistent" # LU-1540 test_17m() { local short_sym="0123456789" - local WDIR=$DIR/${tdir}m + local wdir=$DIR/$tdir local i remote_mds_nodsh && skip "remote MDS with nodsh" && return @@ -575,36 +580,36 @@ test_17m() { skip "MDS 2.2.0-2.2.93 do not NUL-terminate symlinks" && return [ "$(facet_fstype $SINGLEMDS)" != "ldiskfs" ] && - skip "only for ldiskfs MDT" && return 0 + skip "ldiskfs only test" && return 0 [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - test_mkdir -p $WDIR + test_mkdir $wdir long_sym=$short_sym # create a long symlink file for ((i = 0; i < 4; ++i)); do long_sym=${long_sym}${long_sym} done - echo "create 512 short and long symlink files under $WDIR" + echo "create 512 short and long symlink files under $wdir" for ((i = 0; i < 256; ++i)); do - ln -sf ${long_sym}"a5a5" $WDIR/long-$i - ln -sf ${short_sym}"a5a5" $WDIR/short-$i + ln -sf ${long_sym}"a5a5" $wdir/long-$i + ln -sf ${short_sym}"a5a5" $wdir/short-$i done echo "erase them" - rm -f $WDIR/* + rm -f $wdir/* sync wait_delete_completed echo "recreate the 512 symlink files with a shorter string" for ((i = 0; i < 512; ++i)); do # rewrite the symlink file with a shorter string - ln -sf ${long_sym} $WDIR/long-$i || error "long_sym failed" - ln -sf ${short_sym} $WDIR/short-$i || error "short_sym failed" + ln -sf ${long_sym} $wdir/long-$i || error "long_sym failed" + ln -sf ${short_sym} $wdir/short-$i || error "short_sym failed" done - local mds_index=$(($($LFS getstripe -M $WDIR) + 1)) + local mds_index=$(($($LFS getstripe -M $wdir) + 1)) local devname=$(mdsdevname $mds_index) echo "stop and checking mds${mds_index}:" @@ -613,7 +618,8 @@ test_17m() { run_e2fsck $(facet_active_host mds${mds_index}) $devname -n rc=$? - start mds${mds_index} $devname $MDS_MOUNT_OPTS || error "start failed" + start mds${mds_index} $devname $MDS_MOUNT_OPTS || + error "start mds${mds_index} failed" df $MOUNT > /dev/null 2>&1 [ $rc -eq 0 ] || error "e2fsck detected error for short/long symlink: rc=$rc" @@ -649,7 +655,7 @@ test_17n() { skip "MDS 2.2.0-2.2.93 do not NUL-terminate symlinks" && return [ "$(facet_fstype $SINGLEMDS)" != "ldiskfs" ] && - skip "only for ldiskfs MDT" && return 0 + skip "ldiskfs only test" && return 0 [[ $MDSCOUNT -lt 2 ]] && skip "needs >= 2 MDTs" && return @@ -700,14 +706,14 @@ test_17o() { [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.3.64) ] && skip "Need MDS version at least 2.3.64" && return - local WDIR=$DIR/${tdir}o + local wdir=$DIR/${tdir}o local mdt_index local rc=0 - test_mkdir -p $WDIR - touch $WDIR/$tfile - mdt_index=$($LFS getstripe -M $WDIR/$tfile) - mdt_index=$((mdt_index+1)) + test_mkdir $wdir + touch $wdir/$tfile + mdt_index=$($LFS getstripe -M $wdir/$tfile) + mdt_index=$((mdt_index + 1)) cancel_lru_locks mdc #fail mds will wait the failover finish then set @@ -716,10 +722,9 @@ test_17o() { #define OBD_FAIL_OSD_LMA_INCOMPAT 0x194 do_facet mds${mdt_index} lctl set_param fail_loc=0x194 - ls -l $WDIR/$tfile && rc=1 + ls -l $wdir/$tfile && rc=1 do_facet mds${mdt_index} lctl set_param fail_loc=0 - [[ $rc -ne 0 ]] && error "stat file should fail" - true + [[ $rc -eq 0 ]] || error "stat file should fail" } run_test 17o "stat file with incompat LMA feature" @@ -757,19 +762,16 @@ run_test 19d "cat .../f19 (should return error) ==============" test_20() { touch $DIR/$tfile rm $DIR/$tfile - log "1 done" touch $DIR/$tfile rm $DIR/$tfile - log "2 done" touch $DIR/$tfile rm $DIR/$tfile - log "3 done" $CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed" } -run_test 20 "touch .../f ; ls -l ... ===========================" +run_test 20 "touch .../f ; ls -l ..." test_21() { - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir [ -f $DIR/$tdir/dangle ] && rm -f $DIR/$tdir/dangle ln -s dangle $DIR/$tdir/link echo foo >> $DIR/$tdir/link @@ -778,43 +780,44 @@ test_21() { $CHECKSTAT -f -t file $DIR/$tdir/link || error "$tdir/link not linked to a file" } -run_test 21 "write to dangling link ============================" +run_test 21 "write to dangling link" test_22() { - WDIR=$DIR/$tdir - test_mkdir -p $DIR/$tdir - chown $RUNAS_ID:$RUNAS_GID $WDIR - (cd $WDIR || error "cd $WDIR failed"; - $RUNAS tar cf - /etc/hosts /etc/sysconfig/network | \ - $RUNAS tar xf -) - ls -lR $WDIR/etc || error "ls -lR $WDIR/etc failed" - $CHECKSTAT -t dir $WDIR/etc || error "checkstat -t dir failed" - $CHECKSTAT -u \#$RUNAS_ID -g \#$RUNAS_GID $WDIR/etc || error "checkstat -u failed" -} -run_test 22 "unpack tar archive as non-root user ===============" + local wdir=$DIR/$tdir + test_mkdir $wdir + chown $RUNAS_ID:$RUNAS_GID $wdir + (cd $wdir || error "cd $wdir failed"; + $RUNAS tar cf - /etc/hosts /etc/sysconfig/network | + $RUNAS tar xf -) + ls -lR $wdir/etc || error "ls -lR $wdir/etc failed" + $CHECKSTAT -t dir $wdir/etc || error "checkstat -t dir failed" + $CHECKSTAT -u \#$RUNAS_ID -g \#$RUNAS_GID $wdir/etc || + error "checkstat -u failed" +} +run_test 22 "unpack tar archive as non-root user" # was test_23 test_23a() { - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir local file=$DIR/$tdir/$tfile openfile -f O_CREAT:O_EXCL $file || error "$file create failed" openfile -f O_CREAT:O_EXCL $file && error "$file recreate succeeded" || true } -run_test 23a "O_CREAT|O_EXCL in subdir ==========================" +run_test 23a "O_CREAT|O_EXCL in subdir" test_23b() { # bug 18988 - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir local file=$DIR/$tdir/$tfile - rm -f $file - echo foo > $file || error "write filed" - echo bar >> $file || error "append filed" - $CHECKSTAT -s 8 $file || error "wrong size" - rm $file + rm -f $file + echo foo > $file || error "write filed" + echo bar >> $file || error "append filed" + $CHECKSTAT -s 8 $file || error "wrong size" + rm $file } -run_test 23b "O_APPEND check ==========================" +run_test 23b "O_APPEND check" # rename sanity test_24a() { @@ -956,10 +959,10 @@ test_24n() { run_test 24n "Statting the old file after renaming (Posix rename 2)" test_24o() { - test_mkdir -p $DIR/d24o - rename_many -s random -v -n 10 $DIR/d24o + test_mkdir $DIR/$tdir + rename_many -s random -v -n 10 $DIR/$tdir } -run_test 24o "rename of files during htree split ===============" +run_test 24o "rename of files during htree split" test_24p() { test_mkdir $DIR/R12a @@ -1127,13 +1130,13 @@ test_24x() { local MDTIDX=1 local remote_dir=$DIR/$tdir/remote_dir - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir $LFS mkdir -i $MDTIDX $remote_dir || error "create remote directory failed" - test_mkdir -p $DIR/$tdir/src_dir + test_mkdir $DIR/$tdir/src_dir touch $DIR/$tdir/src_file - test_mkdir -p $remote_dir/tgt_dir + test_mkdir $remote_dir/tgt_dir touch $remote_dir/tgt_file mrename $DIR/$tdir/src_dir $remote_dir/tgt_dir || @@ -1153,16 +1156,16 @@ run_test 24x "cross MDT rename/link" test_24y() { [[ $MDSCOUNT -lt 2 ]] && skip "needs >= 2 MDTs" && return [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - local MDTIDX=1 local remote_dir=$DIR/$tdir/remote_dir + local mdtidx=1 - test_mkdir -p $DIR/$tdir - $LFS mkdir -i $MDTIDX $remote_dir || + test_mkdir $DIR/$tdir + $LFS mkdir -i $mdtidx $remote_dir || error "create remote directory failed" - test_mkdir -p $remote_dir/src_dir + test_mkdir $remote_dir/src_dir touch $remote_dir/src_file - test_mkdir -p $remote_dir/tgt_dir + test_mkdir $remote_dir/tgt_dir touch $remote_dir/tgt_file mrename $remote_dir/src_dir $remote_dir/tgt_dir || @@ -1182,7 +1185,7 @@ test_24A() { # LU-3182 local NFILES=5000 rm -rf $DIR/$tdir - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir trap simple_cleanup_common EXIT createmany -m $DIR/$tdir/$tfile $NFILES local t=$(ls $DIR/$tdir | wc -l) @@ -1306,8 +1309,8 @@ test_26a() { run_test 26a "multiple component symlink =======================" test_26b() { - test_mkdir -p $DIR/d26b/d26-2 - ln -s d26b/d26-2/foo $DIR/s26-2 + test_mkdir -p $DIR/$tdir/d26-2 + ln -s $tdir/d26-2/foo $DIR/s26-2 touch $DIR/s26-2 || error } run_test 26b "multiple component symlink at end of lookup ======" @@ -1320,27 +1323,27 @@ test_26c() { ln -s s26.2-2 $DIR/s26.2-3 chmod 0666 $DIR/s26.2-3/foo } -run_test 26c "chain of symlinks ================================" +run_test 26c "chain of symlinks" # recursive symlinks (bug 439) test_26d() { ln -s d26-3/foo $DIR/d26-3 } -run_test 26d "create multiple component recursive symlink ======" +run_test 26d "create multiple component recursive symlink" test_26e() { [ ! -h $DIR/d26-3 ] && test_26d rm $DIR/d26-3 } -run_test 26e "unlink multiple component recursive symlink ======" +run_test 26e "unlink multiple component recursive symlink" # recursive symlinks (bug 7022) test_26f() { - test_mkdir -p $DIR/$tdir - test_mkdir $DIR/$tdir/$tfile || error "mkdir $DIR/$tdir/$tfile failed" + test_mkdir $DIR/$tdir + test_mkdir $DIR/$tdir/$tfile cd $DIR/$tdir/$tfile || error "cd $DIR/$tdir/$tfile failed" - test_mkdir -p lndir/bar1 || error "mkdir lndir/bar1 failed" - test_mkdir $DIR/$tdir/$tfile/$tfile || error "mkdir $tfile failed" + test_mkdir -p lndir/bar1 + test_mkdir $DIR/$tdir/$tfile/$tfile cd $tfile || error "cd $tfile failed" ln -s .. dotdot || error "ln dotdot failed" ln -s dotdot/lndir lndir || error "ln lndir failed" @@ -1350,108 +1353,105 @@ test_26f() { rm -r $tfile || error "rm $tfile failed" $CHECKSTAT -a $DIR/$tfile || error "$tfile not gone" } -run_test 26f "rm -r of a directory which has recursive symlink =" +run_test 26f "rm -r of a directory which has recursive symlink" test_27a() { - echo '== stripe sanity ==============================================' - test_mkdir -p $DIR/d27 || error "mkdir failed" - $GETSTRIPE $DIR/d27 - $SETSTRIPE -c 1 $DIR/d27/f0 || error "setstripe failed" - $CHECKSTAT -t file $DIR/d27/f0 || error "checkstat failed" - log "== test_27a: write to one stripe file =========================" - cp /etc/hosts $DIR/d27/f0 || error + test_mkdir $DIR/$tdir + $LFS getstripe $DIR/$tdir + $LFS setstripe -c 1 $DIR/$tdir/$tfile || error "setstripe failed" + $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed" + cp /etc/hosts $DIR/$tdir/$tfile || error } -run_test 27a "one stripe file ==================================" +run_test 27a "one stripe file" test_27b() { - [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test" && return - test_mkdir -p $DIR/d27 - $SETSTRIPE -c 2 $DIR/d27/f01 || error "setstripe failed" - $GETSTRIPE -c $DIR/d27/f01 - [ $($GETSTRIPE -c $DIR/d27/f01) -eq 2 ] || + [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return + test_mkdir $DIR/$tdir + $LFS setstripe -c 2 $DIR/$tdir/$tfile || error "setstripe failed" + $LFS getstripe -c $DIR/$tdir/$tfile + [ $($LFS getstripe -c $DIR/$tdir/$tfile) -eq 2 ] || error "two-stripe file doesn't have two stripes" - dd if=/dev/zero of=$DIR/d27/f01 bs=4k count=4 || error "dd failed" + dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed" } run_test 27b "create and write to two stripe file" test_27d() { - test_mkdir -p $DIR/d27 - $SETSTRIPE -c 0 -i -1 -S 0 $DIR/d27/fdef || error "setstripe failed" - $CHECKSTAT -t file $DIR/d27/fdef || error "checkstat failed" - dd if=/dev/zero of=$DIR/d27/fdef bs=4k count=4 || error + test_mkdir $DIR/$tdir + $LFS setstripe -c 0 -i -1 -S 0 $DIR/$tdir/$tfile || + error "setstripe failed" + $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed" + dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed" } -run_test 27d "create file with default settings ================" +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" - $CHECKSTAT -t file $DIR/d27/f12 || error "checkstat failed" + test_mkdir $DIR/$tdir + $LFS setstripe -c 2 $DIR/$tdir/$tfile || error "setstripe failed" + $LFS setstripe -c 2 $DIR/$tdir/$tfile && error "setstripe worked twice" + $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed" } -run_test 27e "setstripe existing file (should return error) ======" +run_test 27e "setstripe existing file (should return error)" test_27f() { test_mkdir $DIR/$tdir - $SETSTRIPE -S 100 -i 0 -c 1 $DIR/$tdir/$tfile && + $LFS setstripe -S 100 -i 0 -c 1 $DIR/$tdir/$tfile && error "$SETSTRIPE $DIR/$tdir/$tfile failed" $CHECKSTAT -t file $DIR/$tdir/$tfile && error "$CHECKSTAT -t file $DIR/$tdir/$tfile should fail" dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed" - $GETSTRIPE $DIR/$tdir/$tfile || error "$GETSTRIPE failed" + $LFS getstripe $DIR/$tdir/$tfile || error "$LFS getstripe failed" } run_test 27f "setstripe with bad stripe size (should return error)" test_27g() { - test_mkdir -p $DIR/d27 - $MCREATE $DIR/d27/fnone || error "mcreate failed" - $GETSTRIPE $DIR/d27/fnone 2>&1 | grep "no stripe info" || - error "$DIR/d27/fnone has object" + test_mkdir $DIR/$tdir + $MCREATE $DIR/$tdir/$tfile || error "mcreate failed" + $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "no stripe info" || + error "$DIR/$tdir/$tfile has object" } -run_test 27g "$GETSTRIPE with no objects" +run_test 27g "$LFS getstripe with no objects" test_27i() { test_mkdir $DIR/$tdir touch $DIR/$tdir/$tfile || error "touch failed" - [[ $($GETSTRIPE -c $DIR/$tdir/$tfile) -gt 0 ]] || + [[ $($LFS getstripe -c $DIR/$tdir/$tfile) -gt 0 ]] || error "missing objects" } -run_test 27i "$GETSTRIPE with some objects" +run_test 27i "$LFS getstripe with some objects" test_27j() { - test_mkdir -p $DIR/d27 - $SETSTRIPE -i $OSTCOUNT $DIR/d27/f27j && error "setstripe failed"||true + test_mkdir $DIR/$tdir + $LFS setstripe -i $OSTCOUNT $DIR/$tdir/$tfile && + error "setstripe failed" || true } run_test 27j "setstripe with bad stripe offset (should return error)" test_27k() { # bug 2844 - test_mkdir -p $DIR/d27 - FILE=$DIR/d27/f27k - LL_MAX_BLKSIZE=$((4 * 1024 * 1024)) - [ ! -d $DIR/d27 ] && test_mkdir -p $DIR d27 - $SETSTRIPE -S 67108864 $FILE || error "setstripe failed" - BLKSIZE=`stat $FILE | awk '/IO Block:/ { print $7 }'` - [ $BLKSIZE -le $LL_MAX_BLKSIZE ] || error "1:$BLKSIZE > $LL_MAX_BLKSIZE" - dd if=/dev/zero of=$FILE bs=4k count=1 - BLKSIZE=`stat $FILE | awk '/IO Block:/ { print $7 }'` - [ $BLKSIZE -le $LL_MAX_BLKSIZE ] || error "2:$BLKSIZE > $LL_MAX_BLKSIZE" -} -run_test 27k "limit i_blksize for broken user apps =============" + test_mkdir $DIR/$tdir + local file=$DIR/$tdir/$tfile + local ll_max_blksize=$((4 * 1024 * 1024)) + $LFS setstripe -S 67108864 $file || error "setstripe failed" + local blksize=$(stat $file | awk '/IO Block:/ { print $7 }') + [ $blksize -le $ll_max_blksize ] || error "1:$blksize > $ll_max_blksize" + dd if=/dev/zero of=$file bs=4k count=1 + blksize=$(stat $file | awk '/IO Block:/ { print $7 }') + [ $blksize -le $ll_max_blksize ] || error "2:$blksize > $ll_max_blksize" +} +run_test 27k "limit i_blksize for broken user apps" test_27l() { - test_mkdir -p $DIR/d27 - mcreate $DIR/f27l || error "creating file" - $RUNAS $SETSTRIPE -c 1 $DIR/f27l && \ + mcreate $DIR/$tfile || error "creating file" + $RUNAS $LFS setstripe -c 1 $DIR/$tfile && error "setstripe should have failed" || true } run_test 27l "check setstripe permissions (should return error)" test_27m() { - [[ $OSTCOUNT -lt 2 ]] && skip_env "$OSTCOUNT < 2 OSTs -- skipping" && - return + [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return ORIGFREE=$($LCTL get_param -n lov.$FSNAME-clilov-*.kbytesavail | head -n1) @@ -1460,30 +1460,33 @@ test_27m() { return fi trap simple_cleanup_common EXIT - test_mkdir -p $DIR/$tdir - $SETSTRIPE -i 0 -c 1 $DIR/$tdir/f27m_1 - dd if=/dev/zero of=$DIR/$tdir/f27m_1 bs=1024 count=$MAXFREE && + test_mkdir $DIR/$tdir + $LFS setstripe -i 0 -c 1 $DIR/$tdir/$tfile.1 + dd if=/dev/zero of=$DIR/$tdir/$tfile.1 bs=1024 count=$MAXFREE && error "dd should fill OST0" i=2 - while $SETSTRIPE -i 0 -c 1 $DIR/$tdir/f27m_$i; do + while $LFS setstripe -i 0 -c 1 $DIR/$tdir/$tfile.$i; do i=$((i + 1)) [ $i -gt 256 ] && break done i=$((i + 1)) - touch $DIR/$tdir/f27m_$i - [ `$GETSTRIPE $DIR/$tdir/f27m_$i | grep -A 10 obdidx | awk '{print $1}'| grep -w "0"` ] && + touch $DIR/$tdir/$tfile.$i + [ $($LFS getstripe $DIR/$tdir/$tfile.$i | grep -A 10 obdidx | + awk '{print $1}'| grep -w "0") ] && error "OST0 was full but new created file still use it" i=$((i + 1)) - touch $DIR/$tdir/f27m_$i - [ `$GETSTRIPE $DIR/$tdir/f27m_$i | grep -A 10 obdidx | awk '{print $1}'| grep -w "0"` ] && + touch $DIR/$tdir/$tfile.$i + [ $($LFS getstripe $DIR/$tdir/$tfile.$i | grep -A 10 obdidx | + awk '{print $1}'| grep -w "0") ] && error "OST0 was full but new created file still use it" simple_cleanup_common } -run_test 27m "create file while OST0 was full ==================" +run_test 27m "create file while OST0 was full" sleep_maxage() { - local DELAY=$(do_facet $SINGLEMDS lctl get_param -n lov.*.qos_maxage | head -n 1 | awk '{print $1 * 2}') - sleep $DELAY + local delay=$(do_facet $SINGLEMDS lctl get_param -n lov.*.qos_maxage | + head -n 1 | awk '{ print $1 * 2 }') + sleep $delay } # OSCs keep a NOSPC flag that will be reset after ~5s (qos_maxage) @@ -1541,7 +1544,7 @@ exhaust_all_precreations() { } test_27n() { - [[ $OSTCOUNT -lt 2 ]] && skip_env "too few OSTs" && return + [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return [ $PARALLEL == "yes" ] && skip "skip parallel run" && return remote_mds_nodsh && skip "remote MDS with nodsh" && return remote_ost_nodsh && skip "remote OST with nodsh" && return @@ -1549,15 +1552,15 @@ test_27n() { reset_enospc rm -f $DIR/$tdir/$tfile exhaust_precreations 0 0x80000215 - $SETSTRIPE -c -1 $DIR/$tdir + $LFS setstripe -c -1 $DIR/$tdir touch $DIR/$tdir/$tfile || error - $GETSTRIPE $DIR/$tdir/$tfile + $LFS getstripe $DIR/$tdir/$tfile reset_enospc } -run_test 27n "create file with some full OSTs ==================" +run_test 27n "create file with some full OSTs" test_27o() { - [[ $OSTCOUNT -lt 2 ]] && skip_env "too few OSTs" && return + [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return [ $PARALLEL == "yes" ] && skip "skip parallel run" && return remote_mds_nodsh && skip "remote MDS with nodsh" && return remote_ost_nodsh && skip "remote OST with nodsh" && return @@ -1571,17 +1574,17 @@ test_27o() { reset_enospc rm -rf $DIR/$tdir/* } -run_test 27o "create file with all full OSTs (should error) ====" +run_test 27o "create file with all full OSTs (should error)" test_27p() { - [[ $OSTCOUNT -lt 2 ]] && skip_env "too few OSTs" && return + [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return [ $PARALLEL == "yes" ] && skip "skip parallel run" && return remote_mds_nodsh && skip "remote MDS with nodsh" && return remote_ost_nodsh && skip "remote OST with nodsh" && return reset_enospc rm -f $DIR/$tdir/$tfile - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir $MCREATE $DIR/$tdir/$tfile || error "mcreate failed" $TRUNCATE $DIR/$tdir/$tfile 80000000 || error "truncate failed" @@ -1590,14 +1593,14 @@ test_27p() { exhaust_precreations 0 0x80000215 echo foo >> $DIR/$tdir/$tfile || error "append failed" $CHECKSTAT -s 80000004 $DIR/$tdir/$tfile || error "checkstat failed" - $GETSTRIPE $DIR/$tdir/$tfile + $LFS getstripe $DIR/$tdir/$tfile reset_enospc } -run_test 27p "append to a truncated file with some full OSTs ===" +run_test 27p "append to a truncated file with some full OSTs" test_27q() { - [[ $OSTCOUNT -lt 2 ]] && skip_env "too few OSTs" && return + [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return [ $PARALLEL == "yes" ] && skip "skip parallel run" && return remote_mds_nodsh && skip "remote MDS with nodsh" && return remote_ost_nodsh && skip "remote OST with nodsh" && return @@ -1605,9 +1608,10 @@ test_27q() { reset_enospc rm -f $DIR/$tdir/$tfile - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir $MCREATE $DIR/$tdir/$tfile || error "mcreate $DIR/$tdir/$tfile failed" - $TRUNCATE $DIR/$tdir/$tfile 80000000 ||error "truncate $DIR/$tdir/$tfile failed" + $TRUNCATE $DIR/$tdir/$tfile 80000000 || + error "truncate $DIR/$tdir/$tfile failed" $CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat failed" exhaust_all_precreations 0x215 @@ -1617,10 +1621,10 @@ test_27q() { reset_enospc } -run_test 27q "append to truncated file with all OSTs full (should error) ===" +run_test 27q "append to truncated file with all OSTs full (should error)" test_27r() { - [[ $OSTCOUNT -lt 2 ]] && skip_env "too few OSTs" && return + [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return [ $PARALLEL == "yes" ] && skip "skip parallel run" && return remote_mds_nodsh && skip "remote MDS with nodsh" && return remote_ost_nodsh && skip "remote OST with nodsh" && return @@ -1629,18 +1633,18 @@ test_27r() { rm -f $DIR/$tdir/$tfile exhaust_precreations 0 0x80000215 - $SETSTRIPE -i 0 -c 2 $DIR/$tdir/$tfile # && error + $LFS setstripe -i 0 -c 2 $DIR/$tdir/$tfile # && error reset_enospc } run_test 27r "stripe file with some full OSTs (shouldn't LBUG) =" test_27s() { # bug 10725 - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir local stripe_size=$((4096 * 1024 * 1024)) # 2^32 local stripe_count=0 [ $OSTCOUNT -eq 1 ] || stripe_count=2 - $SETSTRIPE -S $stripe_size -c $stripe_count $DIR/$tdir && + $LFS setstripe -S $stripe_size -c $stripe_count $DIR/$tdir && error "stripe width >= 2^32 succeeded" || true } @@ -1657,7 +1661,7 @@ test_27t() { # bug 10864 run_test 27t "check that utils parse path correctly" test_27u() { # bug 4900 - [[ $OSTCOUNT -lt 2 ]] && skip_env "too few OSTs" && return + [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return remote_mds_nodsh && skip "remote MDS with nodsh" && return local index local list=$(comma_list $(mdts_nodes)) @@ -1670,26 +1674,26 @@ test_27u() { # bug 4900 do_nodes $list $LCTL set_param fail_loc=0 TLOG=$TMP/$tfile.getstripe - $GETSTRIPE $DIR/$tdir > $TLOG + $LFS getstripe $DIR/$tdir > $TLOG OBJS=$(awk -vobj=0 '($1 == 0) { obj += 1 } END { print obj; }' $TLOG) unlinkmany $DIR/$tdir/t- 1000 trap 0 [[ $OBJS -gt 0 ]] && - error "$OBJS objects created on OST-0. See $TLOG" || pass + error "$OBJS objects created on OST-0. See $TLOG" || + rm -f $TLOG } -run_test 27u "skip object creation on OSC w/o objects ==========" +run_test 27u "skip object creation on OSC w/o objects" test_27v() { # bug 4900 - [[ $OSTCOUNT -lt 2 ]] && skip_env "too few OSTs" && return + [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - remote_mds_nodsh && skip "remote MDS with nodsh" && return - remote_ost_nodsh && skip "remote OST with nodsh" && return + remote_mds_nodsh && skip "remote MDS with nodsh" && return + remote_ost_nodsh && skip "remote OST with nodsh" && return - exhaust_all_precreations 0x215 - reset_enospc + exhaust_all_precreations 0x215 + reset_enospc - test_mkdir -p $DIR/$tdir - $SETSTRIPE -c 1 $DIR/$tdir # 1 stripe / file + $LFS setstripe -c 1 $DIR/$tdir # 1 stripe / file touch $DIR/$tdir/$tfile #define OBD_FAIL_TGT_DELAY_PRECREATE 0x705 @@ -1708,51 +1712,52 @@ test_27v() { # bug 4900 sleep $((TIMEOUT / 2 - PROCESS)) reset_enospc } -run_test 27v "skip object creation on slow OST =================" +run_test 27v "skip object creation on slow OST" test_27w() { # bug 10997 - test_mkdir -p $DIR/$tdir || error "mkdir failed" - $SETSTRIPE -S 65536 $DIR/$tdir/f0 || error "setstripe failed" - [ $($GETSTRIPE -S $DIR/$tdir/f0) -ne 65536 ] && - error "stripe size $size != 65536" || true - [ $($GETSTRIPE -d $DIR/$tdir | grep -c "stripe_count") -ne 1 ] && - error "$GETSTRIPE -d $DIR/$tdir failed" || true + test_mkdir $DIR/$tdir + $LFS setstripe -S 65536 $DIR/$tdir/f0 || error "setstripe failed" + [ $($LFS getstripe -S $DIR/$tdir/f0) -ne 65536 ] && + error "stripe size $size != 65536" || true + [ $($LFS getstripe -d $DIR/$tdir | grep -c "stripe_count") -eq 0 ] && + error "$LFS getstripe -d $DIR/$tdir no 'stripe_count'" || true } -run_test 27w "check $SETSTRIPE -S option" +run_test 27w "check $LFS setstripe -S and getstrip -d options" test_27wa() { [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping multiple stripe count/offset test" && return - test_mkdir -p $DIR/$tdir || error "mkdir failed" - for i in $(seq 1 $OSTCOUNT); do - offset=$((i - 1)) - $SETSTRIPE -c $i -i $offset $DIR/$tdir/f$i || - error "setstripe -c $i -i $offset failed" - count=$($GETSTRIPE -c $DIR/$tdir/f$i) - index=$($GETSTRIPE -i $DIR/$tdir/f$i) - [ $count -ne $i ] && error "stripe count $count != $i" || true - [ $index -ne $offset ] && - error "stripe offset $index != $offset" || true - done + test_mkdir $DIR/$tdir + for i in $(seq 1 $OSTCOUNT); do + offset=$((i - 1)) + $LFS setstripe -c $i -i $offset $DIR/$tdir/f$i || + error "setstripe -c $i -i $offset failed" + count=$($LFS getstripe -c $DIR/$tdir/f$i) + index=$($LFS getstripe -i $DIR/$tdir/f$i) + [ $count -ne $i ] && error "stripe count $count != $i" || true + [ $index -ne $offset ] && + error "stripe offset $index != $offset" || true + done } -run_test 27wa "check $SETSTRIPE -c -i options" +run_test 27wa "check $LFS setstripe -c -i options" test_27x() { remote_ost_nodsh && skip "remote OST with nodsh" && return - [[ $OSTCOUNT -lt 2 ]] && skip_env "$OSTCOUNT < 2 OSTs" && return + [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return [ $PARALLEL == "yes" ] && skip "skip parallel run" && return OFFSET=$(($OSTCOUNT - 1)) OSTIDX=0 local OST=$(ostname_from_index $OSTIDX) - test_mkdir -p $DIR/$tdir - $SETSTRIPE -c 1 $DIR/$tdir # 1 stripe per file + test_mkdir $DIR/$tdir + $LFS setstripe -c 1 $DIR/$tdir # 1 stripe per file do_facet ost$((OSTIDX + 1)) lctl set_param -n obdfilter.$OST.degraded 1 sleep_maxage createmany -o $DIR/$tdir/$tfile $OSTCOUNT - for i in `seq 0 $OFFSET`; do - [ `$GETSTRIPE $DIR/$tdir/$tfile$i | grep -A 10 obdidx | awk '{print $1}' | grep -w "$OSTIDX"` ] && + for i in $(seq 0 $OFFSET); do + [ $($LFS getstripe $DIR/$tdir/$tfile$i | grep -A 10 obdidx | + awk '{print $1}' | grep -w "$OSTIDX") ] && error "OST0 was degraded but new created file still use it" done do_facet ost$((OSTIDX + 1)) lctl set_param -n obdfilter.$OST.degraded 0 @@ -1760,18 +1765,17 @@ test_27x() { run_test 27x "create files while OST0 is degraded" test_27y() { - [[ $OSTCOUNT -lt 2 ]] && - skip_env "$OSTCOUNT < 2 OSTs -- skipping" && return - remote_mds_nodsh && skip "remote MDS with nodsh" && return - remote_ost_nodsh && skip "remote OST with nodsh" && return + [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return + remote_mds_nodsh && skip "remote MDS with nodsh" && return + remote_ost_nodsh && skip "remote OST with nodsh" && return [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS $FSNAME-OST0000) - local last_id=$(do_facet $SINGLEMDS lctl get_param -n \ - osc.$mdtosc.prealloc_last_id) - local next_id=$(do_facet $SINGLEMDS lctl get_param -n \ - osc.$mdtosc.prealloc_next_id) - local fcount=$((last_id - next_id)) + local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS $FSNAME-OST0000) + local last_id=$(do_facet $SINGLEMDS lctl get_param -n \ + osc.$mdtosc.prealloc_last_id) + local next_id=$(do_facet $SINGLEMDS lctl get_param -n \ + osc.$mdtosc.prealloc_next_id) + local fcount=$((last_id - next_id)) [[ $fcount -eq 0 ]] && skip "not enough space on OST0" && return [[ $fcount -gt $OSTCOUNT ]] && fcount=$OSTCOUNT @@ -1795,8 +1799,8 @@ test_27y() { done OSTIDX=$(index_from_ostuuid $OST) - test_mkdir -p $DIR/$tdir - $SETSTRIPE -c 1 $DIR/$tdir # 1 stripe / file + test_mkdir $DIR/$tdir + $LFS setstripe -c 1 $DIR/$tdir # 1 stripe / file for OSC in $MDS_OSCS; do OST=$(osc_to_ost $OSC) @@ -1824,16 +1828,16 @@ test_27y() { done # all osp devices get activated, hence -1 stripe count restored - local stripecnt=0 + local stripe_count=0 # sleep 2*lod_qos_maxage seconds waiting for lod qos to notice osp # devices get activated. sleep_maxage - $SETSTRIPE -c -1 $DIR/$tfile - stripecnt=$($GETSTRIPE -c $DIR/$tfile) + $LFS setstripe -c -1 $DIR/$tfile + stripe_count=$($LFS getstripe -c $DIR/$tfile) rm -f $DIR/$tfile - [ $stripecnt -ne $OSTCOUNT ] && - error "Of $OSTCOUNT OSTs, only $stripecnt is available" + [ $stripe_count -ne $OSTCOUNT ] && + error "Of $OSTCOUNT OSTs, only $stripe_count is available" return 0 } run_test 27y "create files while OST0 is degraded and the rest inactive" @@ -1882,17 +1886,18 @@ check_seq_oid() fi local obj_file="O/$seq/d$((oid %32))/$oid_hex" - local ff + local ff="" # # Don't unmount/remount the OSTs if we don't need to do that. # LU-2577 changes filter_fid to be smaller, so debugfs needs # update too, until that use mount/ll_decode_filter_fid/mount. # Re-enable when debugfs will understand new filter_fid. # - if false && [ $(facet_fstype ost$ost) == ldiskfs ]; then + if [ $(facet_fstype ost$ost) == ldiskfs ]; then ff=$(do_facet ost$ost "$DEBUGFS -c -R 'stat $obj_file' \ $dev 2>/dev/null" | grep "parent=") - else + fi + if [ -z "$ff" ]; then stop ost$ost mount_fstype ost$ost ff=$(do_facet ost$ost $LL_DECODE_FILTER_FID \ @@ -1908,69 +1913,65 @@ check_seq_oid() # /mnt/O/0/d23/23: objid=23 seq=0 parent=[0x200000400:0x1e:0x1] # fid: objid=23 seq=0 parent=[0x200000400:0x1e:0x0] stripe=1 - local ff_parent=$(echo $ff|sed -e 's/.*parent=.//') - local ff_pseq=$(echo $ff_parent | cut -d: -f1) - local ff_poid=$(echo $ff_parent | cut -d: -f2) + # + # fid: parent=[0x200000400:0x1e:0x0] stripe=1 stripe_count=2 \ + # stripe_size=1048576 component_id=1 component_start=0 \ + # component_end=33554432 + local ff_parent=$(sed -e 's/.*parent=.//' <<<$ff) + local ff_pseq=$(cut -d: -f1 <<<$ff_parent) + local ff_poid=$(cut -d: -f2 <<<$ff_parent) local ff_pstripe - if echo $ff_parent | grep -q 'stripe='; then - ff_pstripe=$(echo $ff_parent | sed -e 's/.*stripe=//') - if echo $ff_pstripe | grep -q 'stripe_size='; then - ff_pstripe=$(echo $ff_pstripe | cut -d' ' -f1) - fi + if grep -q 'stripe=' <<<$ff; then + ff_pstripe=$(sed -e 's/.*stripe=//' -e 's/ .*//' <<<$ff) else - # # $LL_DECODE_FILTER_FID does not print "stripe="; look - # into f_ver in this case. See the comment on - # ff_parent. - # - ff_pstripe=$(echo $ff_parent | cut -d: -f3 | - sed -e 's/\]//') + # into f_ver in this case. See comment on ff_parent. + ff_pstripe=$(cut -d: -f3 <<<$ff_parent | sed -e 's/]//') fi - if echo $ff_parent | grep -q 'stripe_count='; then - local ff_scnt=$(echo $ff_parent | - sed -e 's/.*stripe_count=//' | - cut -d' ' -f1) + # compare lmm_seq and filter_fid->ff_parent.f_seq + [ $ff_pseq = $lmm_seq ] || + error "FF parent SEQ $ff_pseq != $lmm_seq" + # compare lmm_object_id and filter_fid->ff_parent.f_oid + [ $ff_poid = $lmm_oid ] || + error "FF parent OID $ff_poid != $lmm_oid" + (($ff_pstripe == $stripe_nr)) || + error "FF stripe $ff_pstripe != $stripe_nr" - [ $lmm_count -eq $ff_scnt ] || + stripe_nr=$((stripe_nr + 1)) + [ $(lustre_version_code client) -lt $(version_code 2.9.55) ] && + continue + if grep -q 'stripe_count=' <<<$ff; then + local ff_scnt=$(sed -e 's/.*stripe_count=//' \ + -e 's/ .*//' <<<$ff) + [ $lmm_count = $ff_scnt ] || error "FF stripe count $lmm_count != $ff_scnt" fi - - # compare lmm_seq and filter_fid->ff_parent.f_seq - [ $ff_pseq = $lmm_seq ] || - error "FF parent SEQ $ff_pseq != $lmm_seq" - # compare lmm_object_id and filter_fid->ff_parent.f_oid - [ $ff_poid = $lmm_oid ] || - error "FF parent OID $ff_poid != $lmm_oid" - (($ff_pstripe == $stripe_nr)) || - error "FF stripe $ff_pstripe != $stripe_nr" - - stripe_nr=$((stripe_nr + 1)) - done + done } test_27z() { - remote_ost_nodsh && skip "remote OST with nodsh" && return + remote_ost_nodsh && skip "remote OST with nodsh" && return [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - test_mkdir -p $DIR/$tdir - - $SETSTRIPE -c 1 -i 0 -S 64k $DIR/$tdir/$tfile-1 || - { error "setstripe -c -1 failed"; return 1; } - # We need to send a write to every object to get parent FID info set. - # This _should_ also work for setattr, but does not currently. - # touch $DIR/$tdir/$tfile-1 || - dd if=/dev/zero of=$DIR/$tdir/$tfile-1 bs=1M count=1 || - { error "dd $tfile-1 failed"; return 2; } - $SETSTRIPE -c -1 -i $((OSTCOUNT - 1)) -S 1M $DIR/$tdir/$tfile-2 || - { error "setstripe -c -1 failed"; return 3; } - dd if=/dev/zero of=$DIR/$tdir/$tfile-2 bs=1M count=$OSTCOUNT || - { error "dd $tfile-2 failed"; return 4; } - - # make sure write RPCs have been sent to OSTs - sync; sleep 5; sync - - check_seq_oid $DIR/$tdir/$tfile-1 || return 5 - check_seq_oid $DIR/$tdir/$tfile-2 || return 6 + test_mkdir $DIR/$tdir + + $LFS setstripe -c 1 -i 0 -S 64k $DIR/$tdir/$tfile-1 || + { error "setstripe -c -1 failed"; return 1; } + # We need to send a write to every object to get parent FID info set. + # This _should_ also work for setattr, but does not currently. + # touch $DIR/$tdir/$tfile-1 || + dd if=/dev/zero of=$DIR/$tdir/$tfile-1 bs=1M count=1 || + { error "dd $tfile-1 failed"; return 2; } + $LFS setstripe -c -1 -i $((OSTCOUNT - 1)) -S 1M $DIR/$tdir/$tfile-2 || + { error "setstripe -c -1 failed"; return 3; } + dd if=/dev/zero of=$DIR/$tdir/$tfile-2 bs=1M count=$OSTCOUNT || + { error "dd $tfile-2 failed"; return 4; } + + # make sure write RPCs have been sent to OSTs + sync; sleep 5; sync + + check_seq_oid $DIR/$tdir/$tfile-1 || return 5 + check_seq_oid $DIR/$tdir/$tfile-2 || return 6 } run_test 27z "check SEQ/OID on the MDT and OST filesystems" @@ -1993,7 +1994,7 @@ test_27A() { # b=19102 run_test 27A "check filesystem-wide default LOV EA values" test_27B() { # LU-2523 - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir rm -f $DIR/$tdir/f0 $DIR/$tdir/f1 touch $DIR/$tdir/f0 # open f1 with O_LOV_DELAY_CREATE @@ -2024,7 +2025,7 @@ test_27C() { #LU-2871 local i local j - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir cd $DIR/$tdir for i in $(seq 0 $((OSTCOUNT - 1))); do # set stripe across all OSTs starting from OST$i @@ -2064,17 +2065,28 @@ test_27D() { local ost_list=$(seq $first_ost $ost_step $last_ost) local ost_range="$first_ost $last_ost $ost_step" - test_mkdir -p $DIR/$tdir + if ! combined_mgs_mds ; then + mount_mgs_client + fi + + test_mkdir $DIR/$tdir pool_add $POOL || error "pool_add failed" pool_add_targets $POOL $ost_range || error "pool_add_targets failed" local skip27D - [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.64) ] && - skip27D = "-s 29,30,31" + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.8.55) ] && + skip27D += "-s 29" + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.9.55) -o \ + $(lustre_version_code client) -lt $(version_code 2.9.55) ] && + skip27D += "-s 30,31" llapi_layout_test -d$DIR/$tdir -p$POOL -o$OSTCOUNT $skip27D || error "llapi_layout_test failed" destroy_test_pools || error "destroy test pools failed" + + if ! combined_mgs_mds ; then + umount_mgs_client + fi } run_test 27D "validate llapi_layout API" @@ -2110,13 +2122,12 @@ test_27E() { run_test 27E "check that default extended attribute size properly increases" test_27F() { # LU-5346/LU-7975 - [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.8.51) ]] && skip "Need MDS version at least 2.8.51" && return + remote_ost_nodsh && skip "remote OST with nodsh" && return - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir rm -f $DIR/$tdir/f0 $SETSTRIPE -c 2 $DIR/$tdir @@ -2406,7 +2417,7 @@ link_one() { } test_31o() { # LU-2901 - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir for LOOP in $(seq 100); do rm -f $DIR/$tdir/$tfile* for THREAD in $(seq 8); do @@ -2495,52 +2506,52 @@ test_32d() { ls -al $DIR/$tdir/ext2-mountpoint/../d2/test_dir || error cleanup_test32_mount } -run_test 32d "open d32d/ext2-mountpoint/../d2/test_dir =========" +run_test 32d "open d32d/ext2-mountpoint/../d2/test_dir" test_32e() { - [ -e $DIR/d32e ] && rm -fr $DIR/d32e - test_mkdir -p $DIR/d32e/tmp - TMP_DIR=$DIR/d32e/tmp - ln -s $DIR/d32e $TMP_DIR/symlink11 - ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01 - $CHECKSTAT -t link $DIR/d32e/tmp/symlink11 || error - $CHECKSTAT -t link $DIR/d32e/symlink01 || error + rm -fr $DIR/$tdir + test_mkdir -p $DIR/$tdir/tmp + local tmp_dir=$DIR/$tdir/tmp + ln -s $DIR/$tdir $tmp_dir/symlink11 + ln -s $tmp_dir/symlink11 $tmp_dir/../symlink01 + $CHECKSTAT -t link $DIR/$tdir/tmp/symlink11 || error "symlink11 bad" + $CHECKSTAT -t link $DIR/$tdir/symlink01 || error "symlink01 bad" } -run_test 32e "stat d32e/symlink->tmp/symlink->lustre-subdir ====" +run_test 32e "stat d32e/symlink->tmp/symlink->lustre-subdir" test_32f() { - [ -e $DIR/d32f ] && rm -fr $DIR/d32f - test_mkdir -p $DIR/d32f/tmp - TMP_DIR=$DIR/d32f/tmp - ln -s $DIR/d32f $TMP_DIR/symlink11 - ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01 - ls $DIR/d32f/tmp/symlink11 || error - ls $DIR/d32f/symlink01 || error + rm -fr $DIR/$tdir + test_mkdir -p $DIR/$tdir/tmp + local tmp_dir=$DIR/$tdir/tmp + ln -s $DIR/$tdir $tmp_dir/symlink11 + ln -s $tmp_dir/symlink11 $tmp_dir/../symlink01 + ls $DIR/$tdir/tmp/symlink11 || error "symlink11 bad" + ls $DIR/$tdir/symlink01 || error "symlink01 bad" } -run_test 32f "open d32f/symlink->tmp/symlink->lustre-subdir ====" +run_test 32f "open d32f/symlink->tmp/symlink->lustre-subdir" test_32g() { - TMP_DIR=$DIR/$tdir/tmp - test_mkdir -p $DIR/$tdir/tmp + local tmp_dir=$DIR/$tdir/tmp + test_mkdir -p $tmp_dir test_mkdir $DIR/${tdir}2 - ln -s $DIR/${tdir}2 $TMP_DIR/symlink12 - ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02 - $CHECKSTAT -t link $TMP_DIR/symlink12 || error - $CHECKSTAT -t link $DIR/$tdir/symlink02 || error - $CHECKSTAT -t dir -f $TMP_DIR/symlink12 || error - $CHECKSTAT -t dir -f $DIR/$tdir/symlink02 || error + ln -s $DIR/${tdir}2 $tmp_dir/symlink12 + ln -s $tmp_dir/symlink12 $tmp_dir/../symlink02 + $CHECKSTAT -t link $tmp_dir/symlink12 || error "symlink12 not a link" + $CHECKSTAT -t link $DIR/$tdir/symlink02 || error "symlink02 not a link" + $CHECKSTAT -t dir -f $tmp_dir/symlink12 || error "symlink12 not a dir" + $CHECKSTAT -t dir -f $DIR/$tdir/symlink02 || error "symlink12 not a dir" } run_test 32g "stat d32g/symlink->tmp/symlink->lustre-subdir/${tdir}2" test_32h() { rm -fr $DIR/$tdir $DIR/${tdir}2 - TMP_DIR=$DIR/$tdir/tmp - test_mkdir -p $DIR/$tdir/tmp + tmp_dir=$DIR/$tdir/tmp + test_mkdir -p $tmp_dir test_mkdir $DIR/${tdir}2 - ln -s $DIR/${tdir}2 $TMP_DIR/symlink12 - ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02 - ls $TMP_DIR/symlink12 || error - ls $DIR/$tdir/symlink02 || error + ln -s $DIR/${tdir}2 $tmp_dir/symlink12 + ln -s $tmp_dir/symlink12 $tmp_dir/../symlink02 + ls $tmp_dir/symlink12 || error "listing symlink12" + ls $DIR/$tdir/symlink02 || error "listing symlink02" } run_test 32h "open d32h/symlink->tmp/symlink->lustre-subdir/${tdir}2" @@ -2685,38 +2696,39 @@ test_33aa() { $RUNAS $OPENFILE -f O_RDWR $DIR/$tfile && error || true log 33_2 } -run_test 33aa "write file with mode 444 (should return error) ====" +run_test 33aa "write file with mode 444 (should return error)" test_33a() { - rm -fr $DIR/d33 - test_mkdir -p $DIR/d33 - chown $RUNAS_ID $DIR/d33 - $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $DIR/d33/f33|| error "create" - $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $DIR/d33/f33 && \ + rm -fr $DIR/$tdir + test_mkdir $DIR/$tdir + chown $RUNAS_ID $DIR/$tdir + $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $DIR/$tdir/$tfile || + error "$RUNAS create $tdir/$tfile failed" + $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $DIR/$tdir/$tfile && error "open RDWR" || true } run_test 33a "test open file(mode=0444) with O_RDWR (should return error)" test_33b() { - rm -fr $DIR/d33 - test_mkdir -p $DIR/d33 - chown $RUNAS_ID $DIR/d33 - $RUNAS $OPENFILE -f 1286739555 $DIR/d33/f33 || true + rm -fr $DIR/$tdir + test_mkdir $DIR/$tdir + chown $RUNAS_ID $DIR/$tdir + $RUNAS $OPENFILE -f 1286739555 $DIR/$tdir/$tfile || true } run_test 33b "test open file with malformed flags (No panic)" test_33c() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - local ostnum - local ostname - local write_bytes - local all_zeros + local ostnum + local ostname + local write_bytes + local all_zeros - remote_ost_nodsh && skip "remote OST with nodsh" && return - all_zeros=: - rm -fr $DIR/d33 - test_mkdir -p $DIR/d33 - # Read: 0, Write: 4, create/destroy: 2/0, stat: 1, punch: 0 + remote_ost_nodsh && skip "remote OST with nodsh" && return + all_zeros=: + rm -fr $DIR/$tdir + test_mkdir $DIR/$tdir + # Read: 0, Write: 4, create/destroy: 2/0, stat: 1, punch: 0 sync for ostnum in $(seq $OSTCOUNT); do @@ -2739,10 +2751,10 @@ test_33c() { $all_zeros || return 0 - # Write four bytes - echo foo > $DIR/d33/bar - # Really write them - sync + # Write four bytes + echo foo > $DIR/$tdir/bar + # Really write them + sync # Total up write_bytes after writing. We'd better find non-zeros. for ostnum in $(seq $OSTCOUNT); do @@ -2777,7 +2789,7 @@ test_33d() { local MDTIDX=1 local remote_dir=$DIR/$tdir/remote_dir - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir $LFS mkdir -i $MDTIDX $remote_dir || error "create remote directory failed" @@ -2996,19 +3008,19 @@ test_35a() { $RUNAS $DIR/f35a && error || true rm $DIR/f35a } -run_test 35a "exec file with mode 444 (should return and not leak) =====" +run_test 35a "exec file with mode 444 (should return and not leak)" test_36a() { rm -f $DIR/f36 utime $DIR/f36 || error } -run_test 36a "MDS utime check (mknod, utime) ===================" +run_test 36a "MDS utime check (mknod, utime)" test_36b() { echo "" > $DIR/f36 utime $DIR/f36 || error } -run_test 36b "OST utime check (open, utime) ====================" +run_test 36b "OST utime check (open, utime)" test_36c() { rm -f $DIR/d36/f36 @@ -3016,23 +3028,23 @@ test_36c() { chown $RUNAS_ID $DIR/d36 $RUNAS utime $DIR/d36/f36 || error } -run_test 36c "non-root MDS utime check (mknod, utime) ==========" +run_test 36c "non-root MDS utime check (mknod, utime)" test_36d() { [ ! -d $DIR/d36 ] && test_36c echo "" > $DIR/d36/f36 $RUNAS utime $DIR/d36/f36 || error } -run_test 36d "non-root OST utime check (open, utime) ===========" +run_test 36d "non-root OST utime check (open, utime)" test_36e() { [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID -- skipping" && return - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir touch $DIR/$tdir/$tfile - $RUNAS utime $DIR/$tdir/$tfile && \ + $RUNAS utime $DIR/$tdir/$tfile && error "utime worked, expected failure" || true } -run_test 36e "utime on non-owned file (should return error) ====" +run_test 36e "utime on non-owned file (should return error)" subr_36fh() { local fl="$1" @@ -3041,7 +3053,7 @@ subr_36fh() { export LANG=C LC_LANG=C # for date language DATESTR="Dec 20 2000" - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir lctl set_param fail_loc=$fl date; date +%s cp /etc/hosts $DIR/$tdir/$tfile @@ -3075,7 +3087,7 @@ test_36g() { local fmd_before local fmd_after - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir fmd_max_age=$(do_facet ost1 \ "lctl get_param -n obdfilter.*.client_cache_seconds 2> /dev/null | \ head -n 1") @@ -3152,10 +3164,10 @@ test_39a() { # was test_39 error "O_TRUNC didn't change timestamps" fi } -run_test 39a "mtime changed on create ===========================" +run_test 39a "mtime changed on create" test_39b() { - test_mkdir -p -c1 $DIR/$tdir + test_mkdir -c1 $DIR/$tdir cp -p /etc/passwd $DIR/$tdir/fopen cp -p /etc/passwd $DIR/$tdir/flink cp -p /etc/passwd $DIR/$tdir/funlink @@ -3536,19 +3548,19 @@ test_39o() { error "wrong links count $links1 != $links3" return 0 } -run_test 39o "directory cached attributes updated after create ========" +run_test 39o "directory cached attributes updated after create" test_39p() { [[ $MDSCOUNT -lt 2 ]] && skip "needs >= 2 MDTs" && return local MDTIDX=1 - TESTDIR=$DIR/$tdir/$tfile + TESTDIR=$DIR/$tdir/$tdir [ -e $TESTDIR ] && rm -rf $TESTDIR test_mkdir -p $TESTDIR cd $TESTDIR links1=2 ls - $LFS mkdir -i $MDTIDX $TESTDIR/remote_dir1 - $LFS mkdir -i $MDTIDX $TESTDIR/remote_dir2 + test_mkdir -i $MDTIDX $TESTDIR/remote_dir1 + test_mkdir -i $MDTIDX $TESTDIR/remote_dir2 ls links2=$(stat -c %h .) [ $(($links1 + 2)) != $links2 ] && @@ -3590,7 +3602,7 @@ test_41() { run_test 41 "test small file write + fstat =====================" count_ost_writes() { - lctl get_param -n osc.*.stats | + lctl get_param -n ${OSC}.*.stats | awk -vwrites=0 '/ost_write/ { writes += $2 } \ END { printf("%0.0f", writes) }' } @@ -3650,7 +3662,7 @@ setup_test42() { test_42a() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return setup_test42 - cancel_lru_locks osc + cancel_lru_locks $OSC stop_writeback sync; sleep 1; sync # just to be safe BEFOREWRITES=`count_ost_writes` @@ -3666,7 +3678,7 @@ run_test 42a "ensure that we don't flush on close" test_42b() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return setup_test42 - cancel_lru_locks osc + cancel_lru_locks $OSC stop_writeback sync dd if=/dev/zero of=$DIR/f42b bs=1024 count=100 @@ -3702,21 +3714,21 @@ run_test 42b "test destroy of file with cached dirty data ======" # start the file with a full-file pw lock to match against # until the truncate. trunc_test() { - test=$1 - file=$DIR/$test - offset=$2 - cancel_lru_locks osc + test=$1 + file=$DIR/$test + offset=$2 + cancel_lru_locks $OSC stop_writeback # prime the file with 0,EOF PW to match touch $file $TRUNCATE $file 0 sync; sync # now the real test.. - dd if=/dev/zero of=$file bs=1024 count=100 - BEFOREWRITES=`count_ost_writes` - $TRUNCATE $file $offset - cancel_lru_locks osc - AFTERWRITES=`count_ost_writes` + dd if=/dev/zero of=$file bs=1024 count=100 + BEFOREWRITES=`count_ost_writes` + $TRUNCATE $file $offset + cancel_lru_locks $OSC + AFTERWRITES=`count_ost_writes` start_writeback } @@ -3748,7 +3760,7 @@ test_42e() { # bug22074 local max_dirty_mb local warmup_files - test_mkdir -p $DIR/${tdir}e + test_mkdir $DIR/${tdir}e $SETSTRIPE -c 1 $TDIR createmany -o $TDIR/f $files @@ -3815,7 +3827,7 @@ test_42e() { # bug22074 run_test 42e "verify sub-RPC writes are not done synchronously" test_43A() { # was test_43 - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir cp -p /bin/ls $DIR/$tdir/$tfile $MULTIOP $DIR/$tdir/$tfile Ow_c & pid=$! @@ -3833,6 +3845,7 @@ test_43a() { cp -p multiop $DIR/$tdir/multiop MULTIOP_PROG=$DIR/$tdir/multiop multiop_bg_pause $TMP/$tfile.junk O_c || error "multiop open $TMP/$tfile.junk failed" + rm $TMP/$tfile.junk # delete junk file on close (not part of test) MULTIOP_PID=$! $MULTIOP $DIR/$tdir/multiop Oc && error "expected error, got success" kill -USR1 $MULTIOP_PID || error "kill -USR1 PID $MULTIOP_PID failed" @@ -3847,6 +3860,7 @@ test_43b() { cp -p multiop $DIR/$tdir/multiop MULTIOP_PROG=$DIR/$tdir/multiop multiop_bg_pause $TMP/$tfile.junk O_c || error "multiop open $TMP/$tfile.junk failed" + rm $TMP/$tfile.junk # delete junk file on close (not part of test) MULTIOP_PID=$! $TRUNCATE $DIR/$tdir/multiop 0 && error "expected error, got success" kill -USR1 $MULTIOP_PID || error "kill -USR1 PID $MULTIOP_PID failed" @@ -3864,7 +3878,7 @@ test_43c() { run_test 43c "md5sum of copy into lustre" test_44A() { # was test_44 - [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test" && return + [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return dd if=/dev/zero of=$DIR/f1 bs=4k count=1 seek=1023 dd if=$DIR/f1 bs=4k count=1 > /dev/null } @@ -3915,7 +3929,7 @@ run_test 44a "test sparse pwrite ===============================" dirty_osc_total() { tot=0 - for d in `lctl get_param -n osc.*.cur_dirty_bytes`; do + for d in `lctl get_param -n ${OSC}.*.cur_dirty_bytes`; do tot=$(($tot + $d)) done echo $tot @@ -3979,15 +3993,15 @@ test_48a() { # bug 2399 test_mkdir $DIR/$tdir cd $DIR/$tdir mv $DIR/$tdir $DIR/$tdir.new || error "move directory failed" - test_mkdir $DIR/$tdir || error "recreate directory failed" + test_mkdir $DIR/$tdir touch foo || error "'touch foo' failed after recreating cwd" - test_mkdir bar || error "'mkdir foo' failed after recreating cwd" + test_mkdir bar touch .foo || error "'touch .foo' failed after recreating cwd" - test_mkdir .bar || error "'mkdir .foo' failed after recreating cwd" + test_mkdir .bar 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" - test_mkdir . && error "'mkdir .' worked after recreating cwd" + mkdir . && error "'mkdir .' worked after recreating cwd" rmdir . && error "'rmdir .' worked after recreating cwd" ln -s . baz || error "'ln -s .' failed after recreating cwd" cd .. || error "'cd ..' failed after recreating cwd" @@ -4000,12 +4014,12 @@ test_48b() { # bug 2399 cd $DIR/$tdir rmdir $DIR/$tdir || error "remove cwd $DIR/$tdir failed" touch foo && error "'touch foo' worked after removing cwd" - test_mkdir foo && error "'mkdir foo' worked after removing cwd" + 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" + 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" - test_mkdir . && error "'mkdir .' worked after removing cwd" + 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 @@ -4020,12 +4034,12 @@ test_48c() { # bug 2350 cd $DIR/$tdir/dir $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" + $TRACE 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" + 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" - $TRACE test_mkdir . && error "'mkdir .' worked after removing cwd" + $TRACE mkdir . && error "'mkdir .' worked after removing cwd" $TRACE rmdir . && error "'rmdir .' worked after removing cwd" $TRACE ln -s . foo && error "'ln -s .' worked after removing cwd" $TRACE cd .. || echo "'cd ..' failed after removing cwd `pwd`" #bug 3415 @@ -4041,12 +4055,12 @@ test_48d() { # bug 2350 $TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed" $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" + $TRACE mkdir foo && error "mkdir foo worked after removing parent" touch .foo && error "'touch .foo' worked after removing parent" - test_mkdir .foo && error "mkdir .foo worked after removing parent" + 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" - $TRACE test_mkdir . && error "'mkdir .' worked after removing parent" + $TRACE mkdir . && error "'mkdir .' worked after removing parent" $TRACE rmdir . && error "'rmdir .' worked after removing parent" $TRACE ln -s . foo && error "'ln -s .' worked after removing parent" true @@ -4140,7 +4154,7 @@ test_51b() { # cleanup the directory rm -fr $dir - test_mkdir -p -c1 $dir + test_mkdir -c1 $dir $LFS df $LFS df -i @@ -4156,11 +4170,13 @@ test_51b() { [[ $numfree -lt $nrdirs ]] && skip "not enough blocks ($numfree)" && return - trap cleanup_print_lfsdf EXIT + trap cleanup_print_lfs_df EXIT # create files - createmany -d $dir/d $nrdirs || + createmany -d $dir/d $nrdirs || { + unlinkmany $dir/d $nrdirs error "failed to create $nrdirs subdirs in MDT$mdtidx:$dir" + } # really created : nrdirs=$(ls -U $dir | wc -l) @@ -4197,11 +4213,10 @@ run_test 51b "exceed 64k subdirectory nlink limit on create, verify unlink" test_51d() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - [[ $OSTCOUNT -lt 3 ]] && - skip_env "skipping test with few OSTs" && return - test_mkdir -p $DIR/$tdir + [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs" && return + test_mkdir $DIR/$tdir createmany -o $DIR/$tdir/t- 1000 - $GETSTRIPE $DIR/$tdir > $TMP/$tfile + $LFS getstripe $DIR/$tdir > $TMP/$tfile for N in $(seq 0 $((OSTCOUNT - 1))); do OBJS[$N]=$(awk -vobjs=0 '($1 == '$N') { objs += 1 } \ END { printf("%0.0f", objs) }' $TMP/$tfile) @@ -4235,12 +4250,12 @@ run_test 51d "check object distribution" test_51e() { if [ "$(facet_fstype $SINGLEMDS)" != ldiskfs ]; then - skip "Only applicable to ldiskfs-based MDTs" + skip "ldiskfs only test" return fi - test_mkdir -c1 $DIR/$tdir || error "create $tdir failed" - test_mkdir -c1 $DIR/$tdir/d0 || error "create d0 failed" + test_mkdir -c1 $DIR/$tdir + test_mkdir -c1 $DIR/$tdir/d0 touch $DIR/$tdir/d0/foo createmany -l $DIR/$tdir/d0/foo $DIR/$tdir/d0/f- 65001 && @@ -4270,8 +4285,10 @@ test_51f() { echo "left ulimit at $ulimit_old" fi - createmany -o -k -t 120 $DIR/$tdir/f $numfree || + createmany -o -k -t 120 $DIR/$tdir/f $numfree || { + unlinkmany $DIR/$tdir/f $numfree error "create+open $numfree files in $DIR/$tdir failed" + } ulimit -n $ulimit_old # if createmany exits at 120s there will be fewer than $numfree files @@ -4281,7 +4298,7 @@ run_test 51f "check many open files limit" test_52a() { [ -f $DIR/$tdir/foo ] && chattr -a $DIR/$tdir/foo - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir touch $DIR/$tdir/foo chattr +a $DIR/$tdir/foo || error "chattr +a failed" echo bar >> $DIR/$tdir/foo || error "append bar failed" @@ -4301,7 +4318,7 @@ run_test 52a "append-only flag test (should return errors)" test_52b() { [ -f $DIR/$tdir/foo ] && chattr -i $DIR/$tdir/foo - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir touch $DIR/$tdir/foo chattr +i $DIR/$tdir/foo || error "chattr +i failed" cat test > $DIR/$tdir/foo && error "cat test worked" @@ -4388,6 +4405,8 @@ test_53() { run_test 53 "verify that MDS and OSTs agree on pre-creation ====" test_54a() { + perl -MSocket -e ';' || { skip "no Socket perl module installed" && return; } + $SOCKETSERVER $DIR/socket || error "$SOCKETSERVER $DIR/socket failed: $?" $SOCKETCLIENT $DIR/socket || @@ -4442,7 +4461,7 @@ test_54c() { losetup $loopdev $DIR/$tfile || error "can't set up $loopdev for $DIR/$tfile" mkfs.ext2 $loopdev || error "mke2fs on $loopdev" - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir mount -t ext2 $loopdev $DIR/$tdir || error "error mounting $loopdev on $DIR/$tdir" dd if=/dev/zero of=$DIR/$tdir/tmp bs=$(get_page_size client) count=30 || @@ -4470,107 +4489,117 @@ test_54e() { } run_test 54e "console/tty device works in lustre ======================" -#The test_55 used to be iopen test and it was removed by bz#24037. -#run_test 55 "check iopen_connect_dentry() ======================" - -test_56a() { # was test_56 - rm -rf $DIR/$tdir - $SETSTRIPE -d $DIR - test_mkdir -p $DIR/$tdir/dir - NUMFILES=3 - NUMFILESx2=$(($NUMFILES * 2)) - for i in $(seq 1 $NUMFILES); do - touch $DIR/$tdir/file$i - touch $DIR/$tdir/dir/file$i - done +test_56a() { + local numfiles=3 + local dir=$DIR/$tdir + + rm -rf $dir + test_mkdir -p $dir/dir + for i in $(seq $numfiles); do + touch $dir/file$i + touch $dir/dir/file$i + done + + local numcomp=$($LFS getstripe --component-count $dir) + + [[ $numcomp == 0 ]] && numcomp=1 + + # test lfs getstripe with --recursive + local filenum=$($LFS getstripe -r $dir | egrep -c "obdidx|l_ost_idx") - # test lfs getstripe with --recursive - FILENUM=$($GETSTRIPE --recursive $DIR/$tdir | grep -c obdidx) - [[ $FILENUM -eq $NUMFILESx2 ]] || - error "$GETSTRIPE --recursive: found $FILENUM, not $NUMFILESx2" - FILENUM=$($GETSTRIPE $DIR/$tdir | grep -c obdidx) - [[ $FILENUM -eq $NUMFILES ]] || - error "$GETSTRIPE $DIR/$tdir: found $FILENUM, not $NUMFILES" - echo "$GETSTRIPE --recursive passed." + [[ $filenum -eq $((numfiles * 2)) ]] || + error "$LFS getstripe -r: found $filenum != $((numfiles * 2))" + filenum=$($LFS getstripe $dir | egrep -c "obdidx|l_ost_idx") + [[ $filenum -eq $numfiles ]] || + error "$LFS getstripe $dir: found $filenum, not $numfiles" + echo "$LFS getstripe showed obdidx or l_ost_idx" # test lfs getstripe with file instead of dir - FILENUM=$($GETSTRIPE $DIR/$tdir/file1 | grep -c obdidx) - [[ $FILENUM -eq 1 ]] || - error "$GETSTRIPE $DIR/$tdir/file1: found $FILENUM, not 1" - echo "$GETSTRIPE file1 passed." + filenum=$($LFS getstripe $dir/file1 | egrep -c "obdidx|l_ost_idx") + [[ $filenum -eq 1 ]] || + error "$LFS getstripe $dir/file1: found $filenum, not 1" + echo "$LFS getstripe file1 passed" #test lfs getstripe with --verbose - [[ $($GETSTRIPE --verbose $DIR/$tdir | - grep -c lmm_magic) -eq $NUMFILES ]] || - error "$GETSTRIPE --verbose $DIR/$tdir: want $NUMFILES" - [[ $($GETSTRIPE $DIR/$tdir | grep -c lmm_magic) -eq 0 ]] || - error "$GETSTRIPE $DIR/$tdir: showed lmm_magic" + filenum=$($LFS getstripe --verbose $dir | grep -c lmm_magic) + [[ $filenum -eq $((numfiles * numcomp)) ]] || + error "$LFS getstripe --verbose $dir: "\ + "got $filenum want $((numfiles * numcomp)) lmm_magic" + [[ $($LFS getstripe $dir | grep -c lmm_magic) -eq 0 ]] || + error "$LFS getstripe $dir: showed lmm_magic" #test lfs getstripe with -v prints lmm_fid - [[ $($GETSTRIPE -v $DIR/$tdir | grep -c lmm_fid) -eq $NUMFILES ]] || - error "$GETSTRIPE -v $DIR/$tdir: want $NUMFILES lmm_fid: lines" - [[ $($GETSTRIPE $DIR/$tdir | grep -c lmm_fid) -eq 0 ]] || - error "$GETSTRIPE $DIR/$tdir: showed lmm_fid" - echo "$GETSTRIPE --verbose passed." + filenum=$($LFS getstripe -v $dir | grep -c lmm_fid) + [[ $filenum -eq $((numfiles * numcomp)) ]] || + error "$LFS getstripe -v $dir: "\ + "got $filenum want $((numfiles * numcomp)) lmm_fid" + [[ $($LFS getstripe $dir | grep -c lmm_fid) -eq 0 ]] || + error "$LFS getstripe $dir: showed lmm_fid by default" + echo "$LFS getstripe --verbose passed" #check for FID information - local fid1=$($GETSTRIPE --fid $DIR/$tdir/file1) - local fid2=$($GETSTRIPE --verbose $DIR/$tdir/file1 | - awk '/lmm_fid: / { print $2 }') - local fid3=$($LFS path2fid $DIR/$tdir/file1) + local fid1=$($LFS getstripe --fid $dir/file1) + local fid2=$($LFS getstripe --verbose $dir/file1 | + awk '/lmm_fid: / { print $2; exit; }') + local fid3=$($LFS path2fid $dir/file1) + [ "$fid1" != "$fid2" ] && - error "getstripe --fid $fid1 != getstripe --verbose $fid2" + error "getstripe --fid '$fid1' != getstripe --verbose '$fid2'" [ "$fid1" != "$fid3" ] && - error "getstripe --fid $fid1 != lfs path2fid $fid3" - echo "$GETSTRIPE --fid passed." + error "getstripe --fid '$fid1' != lfs path2fid '$fid3'" + echo "$LFS getstripe --fid passed" #test lfs getstripe with --obd - $GETSTRIPE --obd wrong_uuid $DIR/$tdir 2>&1 | - grep -q "unknown obduuid" || - error "$GETSTRIPE --obd wrong_uuid should return error message" + $LFS getstripe --obd wrong_uuid $dir 2>&1 | grep -q "unknown obduuid" || + error "$LFS getstripe --obd wrong_uuid: should return error" [[ $OSTCOUNT -lt 2 ]] && - skip_env "skipping other $GETSTRIPE --obd test" && return - - OSTIDX=1 - OBDUUID=$(ostuuid_from_index $OSTIDX) - FILENUM=$($GETSTRIPE -ir $DIR/$tdir | grep "^$OSTIDX\$" | wc -l) - FOUND=$($GETSTRIPE -r --obd $OBDUUID $DIR/$tdir | grep obdidx | wc -l) - [[ $FOUND -eq $FILENUM ]] || - error "$GETSTRIPE --obd wrong: found $FOUND, expected $FILENUM" - [[ $($GETSTRIPE -r -v --obd $OBDUUID $DIR/$tdir | - sed '/^[ ]*'${OSTIDX}'[ ]/d' | + skip_env "skip '$LFS getstripe --obd' tests: $OSTCOUNT < 2" && + return + + local ostidx=1 + local obduuid=$(ostuuid_from_index $ostidx) + local found=$($LFS getstripe -r --obd $obduuid $dir | + egrep -c "obdidx|l_ost_idx") + + filenum=$($LFS getstripe -ir $dir | grep "^$ostidx\$" | wc -l) + [[ $found -eq $filenum ]] || + error "$LFS getstripe --obd: found $found expect $filenum" + [[ $($LFS getstripe -r -v --obd $obduuid $dir | + sed '/^[ ]*'${ostidx}'[ ]/d' | sed -n '/^[ ]*[0-9][0-9]*[ ]/p' | wc -l) -eq 0 ]] || - error "$GETSTRIPE --obd: should not show file on other obd" - echo "$GETSTRIPE --obd passed" + error "$LFS getstripe --obd: should not show file on other obd" + echo "$LFS getstripe --obd passed" } -run_test 56a "check $GETSTRIPE" +run_test 56a "check $LFS getstripe" test_56b() { - test_mkdir $DIR/$tdir - NUMDIRS=3 - for i in $(seq 1 $NUMDIRS); do - test_mkdir $DIR/$tdir/dir$i + local dir=$DIR/$tdir + local numdirs=3 + + test_mkdir $dir + for i in $(seq $numdirs); do + test_mkdir $dir/dir$i done # test lfs getdirstripe default mode is non-recursion, which is # different from lfs getstripe - dircnt=$($LFS getdirstripe $DIR/$tdir | grep -c lmv_stripe_count) + local dircnt=$($LFS getdirstripe $dir | grep -c lmv_stripe_count) + [[ $dircnt -eq 1 ]] || error "$LFS getdirstripe: found $dircnt, not 1" - dircnt=$($LFS getdirstripe --recursive $DIR/$tdir | + dircnt=$($LFS getdirstripe --recursive $dir | grep -c lmv_stripe_count) - [[ $dircnt -eq $((NUMDIRS + 1)) ]] || - error "$LFS getdirstripe --recursive: found $dircnt, \ - not $((NUMDIRS + 1))" + [[ $dircnt -eq $((numdirs + 1)) ]] || + error "$LFS getdirstripe -r: $dircnt, != $((numdirs + 1))" } run_test 56b "check $LFS getdirstripe" test_56c() { local ost_idx=0 local ost_name=$(ostname_from_index $ost_idx) - local old_status=$(ost_dev_status $ost_idx) + [[ -z "$old_status" ]] || { skip_env "OST $ost_name is in $old_status status"; return 0; } @@ -4578,6 +4607,7 @@ test_56c() { sleep_maxage local new_status=$(ost_dev_status $ost_idx) + [[ "$new_status" = "D" ]] || error "OST $ost_name is in status of '$new_status', not 'D'" @@ -4593,543 +4623,802 @@ run_test 56c "check 'lfs df' showing device status" NUMFILES=3 NUMDIRS=3 setup_56() { - local LOCAL_NUMFILES="$1" - local LOCAL_NUMDIRS="$2" - local MKDIR_PARAMS="$3" - local DIR_STRIPE_PARAMS="$4" - - if [ ! -d "$TDIR" ] ; then - test_mkdir -p $DIR_STRIPE_PARAMS $TDIR - [ "$MKDIR_PARAMS" ] && $SETSTRIPE $MKDIR_PARAMS $TDIR - for i in `seq 1 $LOCAL_NUMFILES` ; do - touch $TDIR/file$i + local local_tdir="$1" + local local_numfiles="$2" + local local_numdirs="$3" + local dir_params="$4" + local dir_stripe_params="$5" + + if [ ! -d "$local_tdir" ] ; then + test_mkdir -p $dir_stripe_params $local_tdir + [ "$dir_params" ] && $LFS setstripe $dir_params $local_tdir + for i in $(seq $local_numfiles) ; do + touch $local_tdir/file$i done - for i in `seq 1 $LOCAL_NUMDIRS` ; do - test_mkdir $DIR_STRIPE_PARAMS $TDIR/dir$i - for j in `seq 1 $LOCAL_NUMFILES` ; do - touch $TDIR/dir$i/file$j + for i in $(seq $local_numdirs) ; do + test_mkdir $dir_stripe_params $local_tdir/dir$i + for j in $(seq $local_numfiles) ; do + touch $local_tdir/dir$i/file$j done done fi } setup_56_special() { - LOCAL_NUMFILES=$1 - LOCAL_NUMDIRS=$2 - setup_56 $1 $2 - if [ ! -e "$TDIR/loop1b" ] ; then - for i in `seq 1 $LOCAL_NUMFILES` ; do - mknod $TDIR/loop${i}b b 7 $i - mknod $TDIR/null${i}c c 1 3 - ln -s $TDIR/file1 $TDIR/link${i}l + local local_tdir=$1 + local local_numfiles=$2 + local local_numdirs=$3 + + setup_56 $local_tdir $local_numfiles $local_numdirs + + if [ ! -e "$local_tdir/loop${local_numfiles}b" ] ; then + for i in $(seq $local_numfiles) ; do + mknod $local_tdir/loop${i}b b 7 $i + mknod $local_tdir/null${i}c c 1 3 + ln -s $local_tdir/file1 $local_tdir/link${i} done - for i in `seq 1 $LOCAL_NUMDIRS` ; do - mknod $TDIR/dir$i/loop${i}b b 7 $i - mknod $TDIR/dir$i/null${i}c c 1 3 - ln -s $TDIR/dir$i/file1 $TDIR/dir$i/link${i}l + for i in $(seq $local_numdirs) ; do + mknod $local_tdir/dir$i/loop${i}b b 7 $i + mknod $local_tdir/dir$i/null${i}c c 1 3 + ln -s $local_tdir/dir$i/file1 $local_tdir/dir$i/link${i} done fi } test_56g() { - $SETSTRIPE -d $DIR - - TDIR=$DIR/${tdir}g - setup_56 $NUMFILES $NUMDIRS - - EXPECTED=$(($NUMDIRS + 2)) - # test lfs find with -name - for i in $(seq 1 $NUMFILES) ; do - NUMS=$($LFIND -name "*$i" $TDIR | wc -l) - [ $NUMS -eq $EXPECTED ] || - error "lfs find -name \"*$i\" $TDIR wrong: "\ - "found $NUMS, expected $EXPECTED" - done + local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE + local expected=$(($NUMDIRS + 2)) + + setup_56 $dir $NUMFILES $NUMDIRS + + # test lfs find with -name + for i in $(seq $NUMFILES) ; do + local nums=$($LFS find -name "*$i" $dir | wc -l) + + [ $nums -eq $expected ] || + error "lfs find -name '*$i' $dir wrong: "\ + "found $nums, expected $expected" + done } -run_test 56g "check lfs find -name =============================" +run_test 56g "check lfs find -name" test_56h() { - $SETSTRIPE -d $DIR - - TDIR=$DIR/${tdir}g - setup_56 $NUMFILES $NUMDIRS - - EXPECTED=$(((NUMDIRS + 1) * (NUMFILES - 1) + NUMFILES)) - # test lfs find with ! -name - for i in $(seq 1 $NUMFILES) ; do - NUMS=$($LFIND ! -name "*$i" $TDIR | wc -l) - [ $NUMS -eq $EXPECTED ] || - error "lfs find ! -name \"*$i\" $TDIR wrong: "\ - "found $NUMS, expected $EXPECTED" - done + local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE + local expected=$(((NUMDIRS + 1) * (NUMFILES - 1) + NUMFILES)) + + setup_56 $dir $NUMFILES $NUMDIRS + + # test lfs find with ! -name + for i in $(seq $NUMFILES) ; do + local nums=$($LFS find ! -name "*$i" $dir | wc -l) + + [ $nums -eq $expected ] || + error "lfs find ! -name '*$i' $dir wrong: "\ + "found $nums, expected $expected" + done } -run_test 56h "check lfs find ! -name =============================" +run_test 56h "check lfs find ! -name" test_56i() { - tdir=${tdir}i - test_mkdir -p $DIR/$tdir - UUID=$(ostuuid_from_index 0 $DIR/$tdir) - CMD="$LFIND -ost $UUID $DIR/$tdir" - OUT=$($CMD) - [ -z "$OUT" ] || error "\"$CMD\" returned directory '$OUT'" + local dir=$DIR/$tdir + + test_mkdir $dir + + local cmd="$LFS find -ost $(ostuuid_from_index 0 $dir) $dir" + local out=$($cmd) + + [ -z "$out" ] || error "'$cmd' returned directory '$out'" } -run_test 56i "check 'lfs find -ost UUID' skips directories =======" +run_test 56i "check 'lfs find -ost UUID' skips directories" test_56j() { - TDIR=$DIR/${tdir}g - setup_56_special $NUMFILES $NUMDIRS + local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE + + setup_56_special $dir $NUMFILES $NUMDIRS - EXPECTED=$((NUMDIRS + 1)) - CMD="$LFIND -type d $TDIR" - NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || - error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" + local expected=$((NUMDIRS + 1)) + local cmd="$LFS find -type d $dir" + local nums=$($cmd | wc -l) + + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" } -run_test 56j "check lfs find -type d =============================" +run_test 56j "check lfs find -type d" test_56k() { - TDIR=$DIR/${tdir}g - setup_56_special $NUMFILES $NUMDIRS + local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE + + setup_56_special $dir $NUMFILES $NUMDIRS - EXPECTED=$(((NUMDIRS + 1) * NUMFILES)) - CMD="$LFIND -type f $TDIR" - NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || - error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" + local expected=$(((NUMDIRS + 1) * NUMFILES)) + local cmd="$LFS find -type f $dir" + local nums=$($cmd | wc -l) + + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" } -run_test 56k "check lfs find -type f =============================" +run_test 56k "check lfs find -type f" test_56l() { - TDIR=$DIR/${tdir}g - setup_56_special $NUMFILES $NUMDIRS + local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE + + setup_56_special $dir $NUMFILES $NUMDIRS - EXPECTED=$((NUMDIRS + NUMFILES)) - CMD="$LFIND -type b $TDIR" - NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || - error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" + local expected=$((NUMDIRS + NUMFILES)) + local cmd="$LFS find -type b $dir" + local nums=$($cmd | wc -l) + + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" } -run_test 56l "check lfs find -type b =============================" +run_test 56l "check lfs find -type b" test_56m() { - TDIR=$DIR/${tdir}g - setup_56_special $NUMFILES $NUMDIRS + local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE + + setup_56_special $dir $NUMFILES $NUMDIRS - EXPECTED=$((NUMDIRS + NUMFILES)) - CMD="$LFIND -type c $TDIR" - NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || - error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" + local expected=$((NUMDIRS + NUMFILES)) + local cmd="$LFS find -type c $dir" + local nums=$($cmd | wc -l) + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" } -run_test 56m "check lfs find -type c =============================" +run_test 56m "check lfs find -type c" test_56n() { - TDIR=$DIR/${tdir}g - setup_56_special $NUMFILES $NUMDIRS + local dir=$DIR/d$(basetest $testnum)g.$TESTSUITE + setup_56_special $dir $NUMFILES $NUMDIRS - EXPECTED=$((NUMDIRS + NUMFILES)) - CMD="$LFIND -type l $TDIR" - NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || - error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" + local expected=$((NUMDIRS + NUMFILES)) + local cmd="$LFS find -type l $dir" + local nums=$($cmd | wc -l) + + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" } -run_test 56n "check lfs find -type l =============================" +run_test 56n "check lfs find -type l" test_56o() { - TDIR=$DIR/${tdir}o - setup_56 $NUMFILES $NUMDIRS - utime $TDIR/file1 > /dev/null || error "utime (1)" - utime $TDIR/file2 > /dev/null || error "utime (2)" - utime $TDIR/dir1 > /dev/null || error "utime (3)" - utime $TDIR/dir2 > /dev/null || error "utime (4)" - utime $TDIR/dir1/file1 > /dev/null || error "utime (5)" - dd if=/dev/zero count=1 >> $TDIR/dir1/file1 && sync - - EXPECTED=4 - NUMS=`$LFIND -mtime +0 $TDIR | wc -l` - [ $NUMS -eq $EXPECTED ] || \ - error "lfs find -mtime +0 $TDIR wrong: found $NUMS, expected $EXPECTED" - - EXPECTED=12 - CMD="$LFIND -mtime 0 $TDIR" - NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || - error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" -} -run_test 56o "check lfs find -mtime for old files ==========================" + local dir=$DIR/$tdir -test_56p() { - [ $RUNAS_ID -eq $UID ] && - skip_env "RUNAS_ID = UID = $UID -- skipping" && return + setup_56 $dir $NUMFILES $NUMDIRS + utime $dir/file1 > /dev/null || error "utime (1)" + utime $dir/file2 > /dev/null || error "utime (2)" + utime $dir/dir1 > /dev/null || error "utime (3)" + utime $dir/dir2 > /dev/null || error "utime (4)" + utime $dir/dir1/file1 > /dev/null || error "utime (5)" + dd if=/dev/zero count=1 >> $dir/dir1/file1 && sync - TDIR=$DIR/${tdir}p - setup_56 $NUMFILES $NUMDIRS + local expected=4 + local nums=$($LFS find -mtime +0 $dir | wc -l) - chown $RUNAS_ID $TDIR/file* || error "chown $DIR/${tdir}g/file$i failed" - EXPECTED=$NUMFILES - CMD="$LFIND -uid $RUNAS_ID $TDIR" - NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || \ - error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" + [ $nums -eq $expected ] || + error "lfs find -mtime +0 $dir: found $nums expect $expected" - EXPECTED=$(((NUMFILES + 1) * NUMDIRS + 1)) - CMD="$LFIND ! -uid $RUNAS_ID $TDIR" - NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || \ - error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" + expected=12 + cmd="$LFS find -mtime 0 $dir" + nums=$($cmd | wc -l) + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" } -run_test 56p "check lfs find -uid and ! -uid ===============================" +run_test 56o "check lfs find -mtime for old files" -test_56q() { +test_56p() { [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID -- skipping" && return - TDIR=$DIR/${tdir}q - setup_56 $NUMFILES $NUMDIRS + local dir=$DIR/$tdir + + setup_56 $dir $NUMFILES $NUMDIRS + chown $RUNAS_ID $dir/file* || error "chown $DIR/${tdir}g/file$i failed" - chgrp $RUNAS_GID $TDIR/file* || error "chown $TDIR/file$i failed" + local expected=$NUMFILES + local cmd="$LFS find -uid $RUNAS_ID $dir" + local nums=$($cmd | wc -l) - EXPECTED=$NUMFILES - CMD="$LFIND -gid $RUNAS_GID $TDIR" - NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || - error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" - EXPECTED=$(( ($NUMFILES+1) * $NUMDIRS + 1)) - CMD="$LFIND ! -gid $RUNAS_GID $TDIR" - NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || - error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" + expected=$(((NUMFILES + 1) * NUMDIRS + 1)) + cmd="$LFS find ! -uid $RUNAS_ID $dir" + nums=$($cmd | wc -l) + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" } -run_test 56q "check lfs find -gid and ! -gid ===============================" +run_test 56p "check lfs find -uid and ! -uid" -test_56r() { - TDIR=$DIR/${tdir}r - setup_56 $NUMFILES $NUMDIRS - - EXPECTED=12 - CMD="$LFIND -size 0 -type f $TDIR" - NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || - error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" - EXPECTED=0 - CMD="$LFIND ! -size 0 -type f $TDIR" - NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || - error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" - echo "test" > $TDIR/$tfile - echo "test2" > $TDIR/$tfile.2 && sync - EXPECTED=1 - CMD="$LFIND -size 5 -type f $TDIR" - NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || - error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" - EXPECTED=1 - CMD="$LFIND -size +5 -type f $TDIR" - NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || - error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" - EXPECTED=2 - CMD="$LFIND -size +0 -type f $TDIR" - NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || - error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" - EXPECTED=2 - CMD="$LFIND ! -size -5 -type f $TDIR" - NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || - error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" - EXPECTED=12 - CMD="$LFIND -size -5 -type f $TDIR" - NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || - error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" -} -run_test 56r "check lfs find -size works ==========================" - -test_56s() { # LU-611 - TDIR=$DIR/${tdir}s - setup_56 $NUMFILES $NUMDIRS "-c $OSTCOUNT" +test_56q() { + [ $RUNAS_ID -eq $UID ] && + skip_env "RUNAS_ID = UID = $UID -- skipping" && return - if [[ $OSTCOUNT -gt 1 ]]; then - $SETSTRIPE -c 1 $TDIR/$tfile.{0,1,2,3} - ONESTRIPE=4 - EXTRA=4 - else - ONESTRIPE=$(((NUMDIRS + 1) * NUMFILES)) - EXTRA=0 - fi + local dir=$DIR/$tdir + + setup_56 $dir $NUMFILES $NUMDIRS + chgrp $RUNAS_GID $dir/file* || error "chown $dir/file$i failed" + + local expected=$NUMFILES + local cmd="$LFS find -gid $RUNAS_GID $dir" + local nums=$($cmd | wc -l) + + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" + + expected=$(( ($NUMFILES+1) * $NUMDIRS + 1)) + cmd="$LFS find ! -gid $RUNAS_GID $dir" + nums=$($cmd | wc -l) + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" +} +run_test 56q "check lfs find -gid and ! -gid" + +test_56r() { + local dir=$DIR/$tdir + + setup_56 $dir $NUMFILES $NUMDIRS + + local expected=12 + local cmd="$LFS find -size 0 -type f $dir" + local nums=$($cmd | wc -l) + + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" + expected=0 + cmd="$LFS find ! -size 0 -type f $dir" + nums=$($cmd | wc -l) + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" + echo "test" > $dir/$tfile + echo "test2" > $dir/$tfile.2 && sync + expected=1 + cmd="$LFS find -size 5 -type f $dir" + nums=$($cmd | wc -l) + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" + expected=1 + cmd="$LFS find -size +5 -type f $dir" + nums=$($cmd | wc -l) + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" + expected=2 + cmd="$LFS find -size +0 -type f $dir" + nums=$($cmd | wc -l) + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" + expected=2 + cmd="$LFS find ! -size -5 -type f $dir" + nums=$($cmd | wc -l) + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" + expected=12 + cmd="$LFS find -size -5 -type f $dir" + nums=$($cmd | wc -l) + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" +} +run_test 56r "check lfs find -size works" + +test_56s() { # LU-611 #LU-9369 + [[ $OSTCOUNT -lt 2 ]] && skip "need at least 2 OSTs" && return 0 - EXPECTED=$(((NUMDIRS + 1) * NUMFILES)) - CMD="$LFIND -stripe-count $OSTCOUNT -type f $TDIR" - NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || { - $GETSTRIPE -R $TDIR - error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" + local dir=$DIR/$tdir + local onestripe=$(((NUMDIRS + 1) * NUMFILES)) + + setup_56 $dir $NUMFILES $NUMDIRS "-c 1" + for i in $(seq $NUMDIRS); do + $LFS setstripe -c $((OSTCOUNT + 1)) $dir/dir$i/$tfile + done + + local expected=$NUMDIRS + local cmd="$LFS find -c $OSTCOUNT $dir" + local nums=$($cmd | wc -l) + + [ $nums -eq $expected ] || { + $LFS getstripe -R $dir + error "'$cmd' wrong: found $nums, expected $expected" } - EXPECTED=$(((NUMDIRS + 1) * NUMFILES + EXTRA)) - CMD="$LFIND -stripe-count +0 -type f $TDIR" - NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || { - $GETSTRIPE -R $TDIR - error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" + expected=$((NUMDIRS + onestripe)) + cmd="$LFS find -stripe-count +0 -type f $dir" + nums=$($cmd | wc -l) + [ $nums -eq $expected ] || { + $LFS getstripe -R $dir + error "'$cmd' wrong: found $nums, expected $expected" } - EXPECTED=$ONESTRIPE - CMD="$LFIND -stripe-count 1 -type f $TDIR" - NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || { - $GETSTRIPE -R $TDIR - error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" + expected=$onestripe + cmd="$LFS find -stripe-count 1 -type f $dir" + nums=$($cmd | wc -l) + [ $nums -eq $expected ] || { + $LFS getstripe -R $dir + error "'$cmd' wrong: found $nums, expected $expected" } - CMD="$LFIND -stripe-count -2 -type f $TDIR" - NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || { - $GETSTRIPE -R $TDIR - error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" + cmd="$LFS find -stripe-count -2 -type f $dir" + nums=$($cmd | wc -l) + [ $nums -eq $expected ] || { + $LFS getstripe -R $dir + error "'$cmd' wrong: found $nums, expected $expected" } - EXPECTED=0 - CMD="$LFIND -stripe-count $((OSTCOUNT + 1)) -type f $TDIR" - NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || { - $GETSTRIPE -R $TDIR - error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" + expected=0 + cmd="$LFS find -stripe-count $((OSTCOUNT + 1)) -type f $dir" + nums=$($cmd | wc -l) + [ $nums -eq $expected ] || { + $LFS getstripe -R $dir + error "'$cmd' wrong: found $nums, expected $expected" } } run_test 56s "check lfs find -stripe-count works" -test_56t() { # LU-611 - TDIR=$DIR/${tdir}t - setup_56 $NUMFILES $NUMDIRS "--stripe-size 512k" - - $SETSTRIPE -S 256k $TDIR/$tfile.{0,1,2,3} - - EXPECTED=$(((NUMDIRS + 1) * NUMFILES)) - CMD="$LFIND -stripe-size 512k -type f $TDIR" - NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || - error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" - - CMD="$LFIND -stripe-size +320k -type f $TDIR" - NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || - error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" - - EXPECTED=$(((NUMDIRS + 1) * NUMFILES + 4)) - CMD="$LFIND -stripe-size +200k -type f $TDIR" - NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || - error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" - - CMD="$LFIND -stripe-size -640k -type f $TDIR" - NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || - error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" - - EXPECTED=4 - CMD="$LFIND -stripe-size 256k -type f $TDIR" - NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || - error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" - - CMD="$LFIND -stripe-size -320k -type f $TDIR" - NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || - error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" - - EXPECTED=0 - CMD="$LFIND -stripe-size 1024k -type f $TDIR" - NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || - error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" +test_56t() { # LU-611 #LU-9369 + local dir=$DIR/$tdir + + setup_56 $dir 0 $NUMDIRS + for i in $(seq $NUMDIRS); do + $LFS setstripe -S 4M $dir/dir$i/$tfile + done + + local expected=$NUMDIRS + local cmd="$LFS find -S 4M $dir" + local nums=$($cmd | wc -l) + + [ $nums -eq $expected ] || { + $LFS getstripe -R $dir + error "'$cmd' wrong: found $nums, expected $expected" + } + rm -rf $dir + + setup_56 $dir $NUMFILES $NUMDIRS "--stripe-size 512k" + + $LFS setstripe -S 256k $dir/$tfile.{0,1,2,3} + + expected=$(((NUMDIRS + 1) * NUMFILES)) + cmd="$LFS find -stripe-size 512k -type f $dir" + nums=$($cmd | wc -l) + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" + + cmd="$LFS find -stripe-size +320k -type f $dir" + nums=$($cmd | wc -l) + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" + + expected=$(((NUMDIRS + 1) * NUMFILES + 4)) + cmd="$LFS find -stripe-size +200k -type f $dir" + nums=$($cmd | wc -l) + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" + + cmd="$LFS find -stripe-size -640k -type f $dir" + nums=$($cmd | wc -l) + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" + + expected=4 + cmd="$LFS find -stripe-size 256k -type f $dir" + nums=$($cmd | wc -l) + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" + + cmd="$LFS find -stripe-size -320k -type f $dir" + nums=$($cmd | wc -l) + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" + + expected=0 + cmd="$LFS find -stripe-size 1024k -type f $dir" + nums=$($cmd | wc -l) + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" } run_test 56t "check lfs find -stripe-size works" test_56u() { # LU-611 - TDIR=$DIR/${tdir}u - setup_56 $NUMFILES $NUMDIRS "-i 0" + local dir=$DIR/$tdir + + setup_56 $dir $NUMFILES $NUMDIRS "-i 0 -c 1" if [[ $OSTCOUNT -gt 1 ]]; then - $SETSTRIPE -i 1 $TDIR/$tfile.{0,1,2,3} - ONESTRIPE=4 + $LFS setstripe -i 1 -c 1 $dir/$tfile.{0,1,2,3} + onestripe=4 else - ONESTRIPE=0 + onestripe=0 fi - EXPECTED=$(((NUMDIRS + 1) * NUMFILES)) - CMD="$LFIND -stripe-index 0 -type f $TDIR" - NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || - error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" + local expected=$(((NUMDIRS + 1) * NUMFILES)) + local cmd="$LFS find -stripe-index 0 -type f $dir" + local nums=$($cmd | wc -l) + + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" - EXPECTED=$ONESTRIPE - CMD="$LFIND -stripe-index 1 -type f $TDIR" - NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || - error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" + expected=$onestripe + cmd="$LFS find -stripe-index 1 -type f $dir" + nums=$($cmd | wc -l) + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" - CMD="$LFIND ! -stripe-index 0 -type f $TDIR" - NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || - error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" + cmd="$LFS find ! -stripe-index 0 -type f $dir" + nums=$($cmd | wc -l) + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" - EXPECTED=0 + expected=0 # This should produce an error and not return any files - CMD="$LFIND -stripe-index $OSTCOUNT -type f $TDIR" - NUMS=$($CMD 2>/dev/null | wc -l) - [ $NUMS -eq $EXPECTED ] || - error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" + cmd="$LFS find -stripe-index $OSTCOUNT -type f $dir" + nums=$($cmd 2>/dev/null | wc -l) + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" if [[ $OSTCOUNT -gt 1 ]]; then - EXPECTED=$(((NUMDIRS + 1) * NUMFILES + ONESTRIPE)) - CMD="$LFIND -stripe-index 0,1 -type f $TDIR" - NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || - error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" + expected=$(((NUMDIRS + 1) * NUMFILES + onestripe)) + cmd="$LFS find -stripe-index 0,1 -type f $dir" + nums=$($cmd | wc -l) + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" fi } run_test 56u "check lfs find -stripe-index works" test_56v() { - local MDT_IDX=0 + local MDT_IDX=0 + local dir=$DIR/$tdir - TDIR=$DIR/${tdir}v - rm -rf $TDIR - setup_56 $NUMFILES $NUMDIRS + setup_56 $dir $NUMFILES $NUMDIRS - UUID=$(mdtuuid_from_index $MDT_IDX $TDIR) - [ -z "$UUID" ] && error "mdtuuid_from_index cannot find MDT index $MDT_IDX" + UUID=$(mdtuuid_from_index $MDT_IDX $dir) + [ -z "$UUID" ] && error "mdtuuid_from_index cannot find MDT $MDT_IDX" - for file in $($LFIND -mdt $UUID $TDIR); do - file_mdt_idx=$($GETSTRIPE -M $file) - [ $file_mdt_idx -eq $MDT_IDX ] || - error "'lfind -mdt $UUID' != 'getstripe -M' ($file_mdt_idx)" - done + for file in $($LFS find -mdt $UUID $dir); do + file_mdt_idx=$($LFS getstripe -M $file) + [ $file_mdt_idx -eq $MDT_IDX ] || + error "lfind -mdt $UUID != getstripe -M $file_mdt_idx" + done } run_test 56v "check 'lfs find -mdt match with lfs getstripe -M' =======" test_56w() { - [[ $OSTCOUNT -lt 2 ]] && skip_env "$OSTCOUNT < 2 OSTs -- skipping" && - return + [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - TDIR=$DIR/${tdir}w - - rm -rf $TDIR || error "remove $TDIR failed" - setup_56 $NUMFILES $NUMDIRS "-c $OSTCOUNT" "-c1" - - local stripe_size - stripe_size=$($GETSTRIPE -S -d $TDIR) || - error "$GETSTRIPE -S -d $TDIR failed" - stripe_size=${stripe_size%% *} - - local file_size=$((stripe_size * OSTCOUNT)) - local file_num=$((NUMDIRS * NUMFILES + NUMFILES)) - local required_space=$((file_num * file_size)) - - local free_space=$($LCTL get_param -n lov.$FSNAME-clilov-*.kbytesavail | - head -n1) - [[ $free_space -le $((required_space / 1024)) ]] && - skip_env "need at least $required_space bytes free space," \ - "have $free_space kbytes" && return - - local dd_bs=65536 - local dd_count=$((file_size / dd_bs)) - - # write data into the files - local i - local j - local file - for i in $(seq 1 $NUMFILES); do - file=$TDIR/file$i - yes | dd bs=$dd_bs count=$dd_count of=$file >/dev/null 2>&1 || - error "write data into $file failed" - done - for i in $(seq 1 $NUMDIRS); do - for j in $(seq 1 $NUMFILES); do - file=$TDIR/dir$i/file$j - yes | dd bs=$dd_bs count=$dd_count of=$file \ - >/dev/null 2>&1 || - error "write data into $file failed" - done - done + local dir=$DIR/$tdir + + setup_56 $dir $NUMFILES $NUMDIRS "-c $OSTCOUNT" "-c1" + + local stripe_size=$($LFS getstripe -S -d $dir) || + error "$LFS getstripe -S -d $dir failed" + stripe_size=${stripe_size%% *} + + local file_size=$((stripe_size * OSTCOUNT)) + local file_num=$((NUMDIRS * NUMFILES + NUMFILES)) + local required_space=$((file_num * file_size)) + local free_space=$($LCTL get_param -n lov.$FSNAME-clilov-*.kbytesavail | + head -n1) + [[ $free_space -le $((required_space / 1024)) ]] && + skip_env "need $required_space, have $free_space kbytes" && + return + + local dd_bs=65536 + local dd_count=$((file_size / dd_bs)) + + # write data into the files + local i + local j + local file + + for i in $(seq $NUMFILES); do + file=$dir/file$i + yes | dd bs=$dd_bs count=$dd_count of=$file &>/dev/null || + error "write data into $file failed" + done + for i in $(seq $NUMDIRS); do + for j in $(seq $NUMFILES); do + file=$dir/dir$i/file$j + yes|dd bs=$dd_bs count=$dd_count of=$file &>/dev/null || + error "write data into $file failed" + done + done + + # $LFS_MIGRATE will fail if hard link migration is unsupported + if [[ $(lustre_version_code mds1) -gt $(version_code 2.5.55) ]]; then + createmany -l$dir/dir1/file1 $dir/dir1/link 200 || + error "creating links to $dir/dir1/file1 failed" + fi - local expected=-1 - [[ $OSTCOUNT -gt 1 ]] && expected=$((OSTCOUNT - 1)) + local expected=-1 - # lfs_migrate file - local cmd="$LFS_MIGRATE -y -c $expected $TDIR/file1" - echo "$cmd" - eval $cmd || error "$cmd failed" + [[ $OSTCOUNT -gt 1 ]] && expected=$((OSTCOUNT - 1)) - check_stripe_count $TDIR/file1 $expected + # lfs_migrate file + local cmd="$LFS_MIGRATE -y -c $expected $dir/file1" + + echo "$cmd" + eval $cmd || error "$cmd failed" + + check_stripe_count $dir/file1 $expected if [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.6.90) ]; then # lfs_migrate file onto OST 0 if it is on OST 1, or onto # OST 1 if it is on OST 0. This file is small enough to # be on only one stripe. - file=$TDIR/migr_1_ost + file=$dir/migr_1_ost dd bs=$dd_bs count=1 if=/dev/urandom of=$file >/dev/null 2>&1 || error "write data into $file failed" local obdidx=$($LFS getstripe -i $file) local oldmd5=$(md5sum $file) local newobdidx=0 + [[ $obdidx -eq 0 ]] && newobdidx=1 cmd="$LFS migrate -i $newobdidx $file" echo $cmd eval $cmd || error "$cmd failed" + local realobdix=$($LFS getstripe -i $file) local newmd5=$(md5sum $file) + [[ $newobdidx -ne $realobdix ]] && - error "new OST is different (was=$obdidx, wanted=$newobdidx, got=$realobdix)" + error "new OST is different (was=$obdidx, "\ + "wanted=$newobdidx, got=$realobdix)" [[ "$oldmd5" != "$newmd5" ]] && error "md5sum differ: $oldmd5, $newmd5" fi - # lfs_migrate dir - cmd="$LFS_MIGRATE -y -c $expected $TDIR/dir1" - echo "$cmd" - eval $cmd || error "$cmd failed" + # lfs_migrate dir + cmd="$LFS_MIGRATE -y -c $expected $dir/dir1" + echo "$cmd" + eval $cmd || error "$cmd failed" - for j in $(seq 1 $NUMFILES); do - check_stripe_count $TDIR/dir1/file$j $expected - done + for j in $(seq $NUMFILES); do + check_stripe_count $dir/dir1/file$j $expected + done - # lfs_migrate works with lfs find - cmd="$LFIND -stripe_count $OSTCOUNT -type f $TDIR | - $LFS_MIGRATE -y -c $expected" - echo "$cmd" - eval $cmd || error "$cmd failed" + # lfs_migrate works with lfs find + cmd="$LFS find -stripe_count $OSTCOUNT -type f $dir | + $LFS_MIGRATE -y -c $expected" + echo "$cmd" + eval $cmd || error "$cmd failed" - for i in $(seq 2 $NUMFILES); do - check_stripe_count $TDIR/file$i $expected - done - for i in $(seq 2 $NUMDIRS); do - for j in $(seq 1 $NUMFILES); do - check_stripe_count $TDIR/dir$i/file$j $expected - done - done + for i in $(seq 2 $NUMFILES); do + check_stripe_count $dir/file$i $expected + done + for i in $(seq 2 $NUMDIRS); do + for j in $(seq $NUMFILES); do + check_stripe_count $dir/dir$i/file$j $expected + done + done } run_test 56w "check lfs_migrate -c stripe_count works" +test_56wb() { + local file1=$DIR/$tdir/file1 + local create_pool=false + local initial_pool=$($LFS getstripe -p $DIR) + local pool_list=() + local pool="" + + echo -n "Creating test dir..." + test_mkdir $DIR/$tdir &> /dev/null || error "cannot create dir" + echo "done." + + echo -n "Creating test file..." + touch $file1 || error "cannot create file" + echo "done." + + echo -n "Detecting existing pools..." + while IFS='' read thispool; do + pool_list+=("$thispool") + done < <($LFS pool_list $MOUNT | awk -F '.' 'NR>=2 { print $2 }') + + if [ ${#pool_list[@]} -gt 0 ]; then + echo "${pool_list[@]}" + for thispool in "${pool_list[@]}"; do + if [[ -z "$initial_pool" || + "$initial_pool" != "$thispool" ]]; then + pool="$thispool" + echo "Using existing pool '$pool'" + break + fi + done + else + echo "none detected." + fi + if [ -z "$pool" ]; then + pool=${POOL:-testpool} + [ "$initial_pool" = "$pool" ] && pool="testpool2" + echo -n "Creating pool '$pool'..." + create_pool=true + pool_add $pool &> /dev/null || + error "pool_add failed" + echo "done." + + echo -n "Adding target to pool..." + pool_add_targets $pool 0 0 1 &> /dev/null || + error "pool_add_targets failed" + echo "done." + fi + + echo -n "Setting pool using -p option..." + $LFS_MIGRATE -y -q --no-rsync -p $pool $file1 &> /dev/null || + error "migrate failed rc = $?" + echo "done." + + echo -n "Verifying test file is in pool after migrating..." + [ "$($LFS getstripe -p $file1)" = $pool ] || + error "file was not migrated to pool $pool" + echo "done." + + echo -n "Removing test file from pool '$pool'..." + $LFS migrate $file1 &> /dev/null || + error "cannot remove from pool" + [ "$($LFS getstripe -p $file1)" ] && + error "pool still set" + echo "done." + + echo -n "Setting pool using --pool option..." + $LFS_MIGRATE -y -q --no-rsync --pool $pool $file1 &> /dev/null || + error "migrate failed rc = $?" + echo "done." + + # Clean up + rm -f $file1 + if $create_pool; then + destroy_test_pools 2> /dev/null || + error "destroy test pools failed" + fi +} +run_test 56wb "check lfs_migrate pool support" + +test_56wc() { + local file1="$DIR/$tdir/file 1" + + echo -n "Creating test dir..." + test_mkdir $DIR/$tdir &> /dev/null || error "cannot create dir" + $LFS setstripe -S 1M -c 1 "$DIR/$tdir" &> /dev/null || + error "cannot set stripe" + echo "done" + + echo -n "Setting initial stripe for test file..." + $LFS setstripe -S 512K -c 1 "$file1" &> /dev/null || + error "cannot set stripe" + [ $($LFS getstripe -S "$file1") -eq 524288 ] || + error "stripe size not set" + echo "done." + + # File currently set to -S 512K -c 1 + + # Ensure -c and -S options are rejected when -R is set + echo -n "Verifying incompatible options are detected..." + $LFS_MIGRATE -y -R -c 1 "$file1" &> /dev/null && + error "incompatible -c and -R options not detected" + $LFS_MIGRATE -y -R -S 1M "$file1" &> /dev/null && + error "incompatible -S and -R options not detected" + echo "done." + + # Ensure unrecognized options are passed through to 'lfs migrate' + echo -n "Verifying -S option is passed through to lfs migrate..." + $LFS_MIGRATE -y -S 1M "$file1" &> /dev/null || + error "migration failed" + [ $($LFS getstripe -S "$file1") -eq 1048576 ] || + error "file was not restriped" + echo "done." + + # File currently set to -S 1M -c 1 + + # Ensure long options are supported + echo -n "Verifying long options supported..." + $LFS_MIGRATE -y --non-block "$file1" &> /dev/null || + error "long option without argument not supported" + $LFS_MIGRATE -y --stripe-size 512K "$file1" &> /dev/null || + error "long option with argument not supported" + [ $($LFS getstripe -S "$file1") -eq 524288 ] || + error "file not restriped with --stripe-size option" + echo "done." + + # File currently set to -S 512K -c 1 + + if [ "$OSTCOUNT" -gt 1 ]; then + echo -n "Verifying explicit stripe count can be set..." + $LFS_MIGRATE -y -c 2 "$file1" &> /dev/null || + error "migrate failed" + [ $($LFS getstripe -c "$file1") -eq 2 ] || + error "file not restriped to explicit count" + echo "done." + fi + + # File currently set to -S 512K -c 1 or -S 512K -c 2 + + # Ensure parent striping is used if -R is set, and no stripe + # count or size is specified + echo -n "Setting stripe for parent directory..." + $LFS setstripe -S 1M -c 1 "$DIR/$tdir" &> /dev/null || + error "cannot set stripe" + echo "done." + + echo -n "Verifying restripe option uses parent stripe settings..." + $LFS_MIGRATE -y -R "$file1" &> /dev/null || + error "migrate failed" + [ $($LFS getstripe -S "$file1") -eq 1048576 ] || + error "file not restriped to parent settings" + [ $($LFS getstripe -c "$file1") -eq 1 ] || + error "file not restriped to parent settings" + echo "done." + + # File currently set to -S 1M -c 1 + + # Ensure striping is preserved if -R is not set, and no stripe + # count or size is specified + echo -n "Verifying striping size preserved when not specified..." + $LFS setstripe -S 2M -c 1 "$DIR/$tdir" &> /dev/null || + error "cannot set stripe on parent directory" + $LFS_MIGRATE -y "$file1" &> /dev/null || + error "migrate failed" + [ $($LFS getstripe -S "$file1") -eq 1048576 ] || + error "file was restriped" + echo "done." + + # Ensure file name properly detected when final option has no argument + echo -n "Verifying file name properly detected..." + $LFS_MIGRATE -y "$file1" &> /dev/null || + error "file name interpreted as option argument" + echo "done." + + # Clean up + rm -f "$file1" +} +run_test 56wc "check unrecognized options for lfs_migrate are passed through" + +test_56wd() { + [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return + local file1=$DIR/$tdir/file1 + + echo -n "Creating test dir..." + test_mkdir $DIR/$tdir || error "cannot create dir" + echo "done." + + echo -n "Creating test file..." + touch $file1 + echo "done." + + # Ensure 'lfs migrate' will fail by using a non-existent option, + # and make sure rsync is not called to recover + echo -n "Make sure --no-rsync option works..." + $LFS_MIGRATE -y --no-rsync --invalid-opt $file1 2>&1 | + grep -q 'refusing to fall back to rsync' || + error "rsync was called with --no-rsync set" + echo "done." + + # Ensure rsync is called without trying 'lfs migrate' first + echo -n "Make sure --rsync option works..." + $LFS_MIGRATE -y --rsync --invalid-opt $file1 2>&1 | + grep -q 'falling back to rsync' && + error "lfs migrate was called with --rsync set" + echo "done." + + echo -n "Make sure --rsync and --no-rsync options are exclusive..." + $LFS_MIGRATE -y --rsync --no-rsync $file1 2>&1 | + grep -q 'at the same time' || + error "--rsync and --no-rsync accepted concurrently" + echo "done." + + # Clean up + rm -f $file1 +} +run_test 56wd "check lfs_migrate --rsync and --no-rsync work" + test_56x() { check_swap_layouts_support && return 0 - [[ $OSTCOUNT -lt 2 ]] && - skip_env "need 2 OST, skipping test" && return - - local dir0=$DIR/$tdir/$testnum - test_mkdir -p $dir0 || error "creating dir $dir0" + [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return + local dir=$DIR/$tdir local ref1=/etc/passwd - local file1=$dir0/file1 + local file1=$dir/file1 - $SETSTRIPE -c 2 $file1 + test_mkdir $dir || error "creating dir $dir" + $LFS setstripe -c 2 $file1 cp $ref1 $file1 $LFS migrate -c 1 $file1 || error "migrate failed rc = $?" - stripe=$($GETSTRIPE -c $file1) + stripe=$($LFS getstripe -c $file1) [[ $stripe == 1 ]] || error "stripe of $file1 is $stripe != 1" cmp $file1 $ref1 || error "content mismatch $file1 differs from $ref1" @@ -5140,19 +5429,21 @@ run_test 56x "lfs migration support" test_56xa() { check_swap_layouts_support && return 0 - [[ $OSTCOUNT -lt 2 ]] && - skip_env "need 2 OST, skipping test" && return + [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return - local dir0=$DIR/$tdir/$testnum - test_mkdir -p $dir0 || error "creating dir $dir0" + local dir=$DIR/$tdir/$testnum + + test_mkdir -p $dir local ref1=/etc/passwd - local file1=$dir0/file1 + local file1=$dir/file1 - $SETSTRIPE -c 2 $file1 + $LFS setstripe -c 2 $file1 cp $ref1 $file1 $LFS migrate --block -c 1 $file1 || error "migrate failed rc = $?" - local stripe=$($GETSTRIPE -c $file1) + + local stripe=$($LFS getstripe -c $file1) + [[ $stripe == 1 ]] || error "stripe of $file1 is $stripe != 1" cmp $file1 $ref1 || error "content mismatch $file1 differs from $ref1" @@ -5161,34 +5452,140 @@ test_56xa() { } run_test 56xa "lfs migration --block support" +check_migrate_links() { + local dir="$1" + local file1="$dir/file1" + local begin="$2" + local count="$3" + local total_count=$(($begin + $count - 1)) + local symlink_count=10 + local uniq_count=10 + + if [ ! -f "$file1" ]; then + echo -n "creating initial file..." + $LFS setstripe -c 1 -S "512k" "$file1" || + error "cannot setstripe initial file" + echo "done" + + echo -n "creating symlinks..." + for s in $(seq 1 $symlink_count); do + ln -s "$file1" "$dir/slink$s" || + error "cannot create symlinks" + done + echo "done" + + echo -n "creating nonlinked files..." + createmany -o "$dir/uniq" 1 10 &> /dev/null || + error "cannot create nonlinked files" + echo "done" + fi + + # create hard links + if [ ! -f "$dir/file$total_count" ]; then + echo -n "creating hard links $begin:$total_count..." + createmany -l"$file1" "$dir/file" "$begin" "$count" &> \ + /dev/null || error "cannot create hard links" + echo "done" + fi + + echo -n "checking number of hard links listed in xattrs..." + local fid=$($LFS getstripe -F "$file1") + local paths=($($LFS fid2path "$MOUNT" "$fid" 2> /dev/null)) + + echo "${#paths[*]}" + if [ ${#paths[*]} -lt $total_count -a "$begin" -eq 2 ]; then + echo "hard link list has unexpected size, skipping test" + return 0 + fi + if [ ${#paths[*]} -ge $total_count -a "$begin" -ne 2 ]; then + error "link names should exceed xattrs size" + fi + + echo -n "migrating files..." + local migrate_out=$($LFS_MIGRATE -y -S '1m' $dir) + local rc=$? + [ $rc -eq 0 ] || error "migrate failed rc = $rc" + echo "done" + + # make sure all links have been properly migrated + echo -n "verifying files..." + fid=$($LFS getstripe -F "$file1") || + error "cannot get fid for file $file1" + for i in $(seq 2 $total_count); do + local fid2=$($LFS getstripe -F $dir/file$i) + + [ "$fid2" == "$fid" ] || + error "migrated hard link has mismatched FID" + done + + # make sure hard links were properly detected, and migration was + # performed only once for the entire link set; nonlinked files should + # also be migrated + local actual=$(grep -c 'done migrate' <<< "$migrate_out") + local expected=$(($uniq_count + 1)) + + [ "$actual" -eq "$expected" ] || + error "hard links individually migrated ($actual != $expected)" + + # make sure the correct number of hard links are present + local hardlinks=$(stat -c '%h' "$file1") + + [ $hardlinks -eq $total_count ] || + error "num hard links $hardlinks != $total_count" + echo "done" + + return 0 +} + +test_56xb() { + local dir="$DIR/$tdir" + + test_mkdir "$dir" || error "cannot create dir $dir" + + echo "testing lfs migrate mode when all links fit within xattrs" + LFS_MIGRATE_RSYNC=false check_migrate_links "$dir" 2 99 + + echo "testing rsync mode when all links fit within xattrs" + LFS_MIGRATE_RSYNC=true check_migrate_links "$dir" 2 99 + + echo "testing lfs migrate mode when all links do not fit within xattrs" + LFS_MIGRATE_RSYNC=false check_migrate_links "$dir" 101 100 + + echo "testing rsync mode when all links do not fit within xattrs" + LFS_MIGRATE_RSYNC=true check_migrate_links "$dir" 101 100 + + # clean up + rm -rf $dir +} +run_test 56xb "lfs migration hard link support" + test_56y() { [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.53) ] && skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53" && return local res="" - local dir0=$DIR/$tdir/$testnum - test_mkdir -p $dir0 || error "creating dir $dir0" - local f1=$dir0/file1 - local f2=$dir0/file2 + local dir=$DIR/$tdir + local f1=$dir/file1 + local f2=$dir/file2 + test_mkdir -p $dir || error "creating dir $dir" touch $f1 || error "creating std file $f1" $MULTIOP $f2 H2c || error "creating released file $f2" # a directory can be raid0, so ask only for files - res=$($LFIND $dir0 -L raid0 -type f | wc -l) + res=$($LFS find $dir -L raid0 -type f | wc -l) [[ $res == 2 ]] || error "search raid0: found $res files != 2" - res=$($LFIND $dir0 \! -L raid0 -type f | wc -l) + res=$($LFS find $dir \! -L raid0 -type f | wc -l) [[ $res == 0 ]] || error "search !raid0: found $res files != 0" # only files can be released, so no need to force file search - res=$($LFIND $dir0 -L released) + res=$($LFS find $dir -L released) [[ $res == $f2 ]] || error "search released: found $res != $f2" - res=$($LFIND $dir0 \! -L released) + res=$($LFS find $dir -type f \! -L released) [[ $res == $f1 ]] || error "search !released: found $res != $f1" - } run_test 56y "lfs find -L raid0|released" @@ -5199,18 +5596,22 @@ test_56z() { # LU-4824 # errors out # - If errors are encountered during the search, it should not terminate # early + local dir=$DIR/$tdir local i - test_mkdir $DIR/$tdir + + test_mkdir $dir for i in d{0..9}; do - test_mkdir $DIR/$tdir/$i + test_mkdir $dir/$i done - touch $DIR/$tdir/d{0..9}/$tfile - $LFS find $DIR/non_existent_dir $DIR/$tdir && + touch $dir/d{0..9}/$tfile + $LFS find $DIR/non_existent_dir $dir && error "$LFS find did not return an error" # Make a directory unsearchable. This should NOT be the last entry in # directory order. Arbitrarily pick the 6th entry - chmod 700 $($LFS find $DIR/$tdir -type d | sed '6!d') - local count=$($RUNAS $LFS find $DIR/non_existent $DIR/$tdir | wc -l) + chmod 700 $($LFS find $dir -type d | sed '6!d') + + local count=$($RUNAS $LFS find $DIR/non_existent $dir | wc -l) + # The user should be able to see 10 directories and 9 files [ $count == 19 ] || error "$LFS find did not continue after error" } @@ -5219,21 +5620,85 @@ run_test 56z "lfs find should continue after an error" test_56aa() { # LU-5937 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return - mkdir $DIR/$tdir - $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir + local dir=$DIR/$tdir - createmany -o $DIR/$tdir/striped_dir/${tfile}- 1024 - local dirs=$(lfs find --size +8k $DIR/$tdir/) + mkdir $dir + $LFS setdirstripe -c$MDSCOUNT $dir/striped_dir + + createmany -o $dir/striped_dir/${tfile}- 1024 + local dirs=$(lfs find --size +8k $dir/) [ -n "$dirs" ] || error "lfs find --size wrong under striped dir" } run_test 56aa "lfs find --size under striped dir" +test_56ba() { + # Create composite files with one component + local dir=$DIR/$tdir + + setup_56 $dir/1Mfiles 5 1 "--component-end 1M" + # Create composite files with three components + setup_56 $dir/2Mfiles 5 2 "-E 2M -E 4M -E 6M" + # Create non-composite files + createmany -o $dir/${tfile}- 10 + + local nfiles=$($LFS find --component-end 1M --type f $dir | wc -l) + + [[ $nfiles == 10 ]] || + error "lfs find -E 1M found $nfiles != 10 files" + + nfiles=$($LFS find ! -E 1M --type f $dir | wc -l) + [[ $nfiles == 25 ]] || + error "lfs find ! -E 1M found $nfiles != 25 files" + + # All files have a component that starts at 0 + nfiles=$($LFS find --component-start 0 --type f $dir | wc -l) + [[ $nfiles == 35 ]] || + error "lfs find --component-start 0 - $nfiles != 35 files" + + nfiles=$($LFS find --component-start 2M --type f $dir | wc -l) + [[ $nfiles == 15 ]] || + error "lfs find --component-start 2M - $nfiles != 15 files" + + # All files created here have a componenet that does not starts at 2M + nfiles=$($LFS find ! --component-start 2M --type f $dir | wc -l) + [[ $nfiles == 35 ]] || + error "lfs find ! --component-start 2M - $nfiles != 35 files" + + # Find files with a specified number of components + local nfiles=$($LFS find --component-count 3 --type f $dir | wc -l) + [[ $nfiles == 15 ]] || + error "lfs find --component-count 3 - $nfiles != 15 files" + + # Remember non-composite files have a component count of zero + local nfiles=$($LFS find --component-count 0 --type f $dir | wc -l) + [[ $nfiles == 10 ]] || + error "lfs find --component-count 0 - $nfiles != 10 files" + + nfiles=$($LFS find ! --component-count 3 --type f $dir | wc -l) + [[ $nfiles == 20 ]] || + error "lfs find ! --component-count 3 - $nfiles != 20 files" + + # All files have a flag called "init" + local nfiles=$($LFS find --component-flags init --type f $dir | wc -l) + [[ $nfiles == 35 ]] || + error "lfs find --component-flags init - $nfiles != 35 files" + + # Multi-component files will have a component not initialized + local nfiles=$($LFS find ! --component-flags init --type f $dir | wc -l) + [[ $nfiles == 15 ]] || + error "lfs find !--component-flags init - $nfiles != 15 files" + + rm -rf $dir + +} +run_test 56ba "test lfs find --component-end, -start, -count, and -flags" + test_57a() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return # note test will not do anything if MDS is not local if [ "$(facet_fstype $SINGLEMDS)" != ldiskfs ]; then - skip "Only applicable to ldiskfs-based MDTs" + skip "ldiskfs only test" return fi @@ -5254,7 +5719,7 @@ run_test 57a "verify MDS filesystem created with large inodes ==" test_57b() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return if [ "$(facet_fstype $SINGLEMDS)" != ldiskfs ]; then - skip "Only applicable to ldiskfs-based MDTs" + skip "ldiskfs only test" return fi @@ -5266,7 +5731,7 @@ test_57b() { local FILEN=$dir/f$FILECOUNT rm -rf $dir || error "removing $dir" - test_mkdir -p -c1 $dir || error "creating $dir" + test_mkdir -c1 $dir local mdtidx=$($LFS getstripe -M $dir) local mdtname=MDT$(printf %04x $mdtidx) local facet=mds$((mdtidx + 1)) @@ -5342,7 +5807,7 @@ test_60a() { log "$TEST60_HEAD - from kernel mode" do_facet mgs "$LCTL set_param debug=warning; $LCTL dk > /dev/null" - do_facet mgs sh run-llog.sh + do_facet mgs "sh run-llog.sh" || error "run-llog.sh failed" do_facet mgs $LCTL dk > $TMP/$tfile # LU-6388: test llog_reader @@ -5574,25 +6039,111 @@ test_64b () { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return sh oos.sh $MOUNT || error "oos.sh failed: $?" } -run_test 64b "check out-of-space detection on client ===========" +run_test 64b "check out-of-space detection on client" test_64c() { $LCTL set_param osc.*OST0000-osc-[^mM]*.cur_grant_bytes=0 } -run_test 64c "verify grant shrink ========================------" +run_test 64c "verify grant shrink" + +# this does exactly what osc_request.c:osc_announce_cached() does in +# order to calculate max amount of grants to ask from server +want_grant() { + local tgt=$1 + + local page_size=$(get_page_size client) + + local nrpages=$($LCTL get_param -n osc.${tgt}.max_pages_per_rpc) + local rpc_in_flight=$($LCTL get_param -n osc.${tgt}.max_rpcs_in_flight) + + ((rpc_in_flight ++)); + nrpages=$((nrpages * rpc_in_flight)) + + local dirty_max_pages=$($LCTL get_param -n osc.${tgt}.max_dirty_mb) + + dirty_max_pages=$((dirty_max_pages * 1024 * 1024 / page_size)) + + [[ $dirty_max_pages -gt $nrpages ]] && nrpages=$dirty_max_pages + local undirty=$((nrpages * page_size)) + + local max_extent_pages + max_extent_pages=$($LCTL get_param osc.${tgt}.import | + grep grant_max_extent_size | awk '{print $2}') + max_extent_pages=$((max_extent_pages / page_size)) + local nrextents=$(((nrpages + max_extent_pages - 1) / max_extent_pages)) + local grant_extent_tax + grant_extent_tax=$($LCTL get_param osc.${tgt}.import | + grep grant_extent_tax | awk '{print $2}') + + undirty=$((undirty + nrextents * grant_extent_tax)) + + echo $undirty +} + +# this is size of unit for grant allocation. It should be equal to +# what tgt_grant.c:tgt_grant_chunk() calculates +grant_chunk() { + local tgt=$1 + local max_brw_size + local grant_extent_tax + + max_brw_size=$($LCTL get_param osc.${tgt}.import | + grep max_brw_size | awk '{print $2}') + + grant_extent_tax=$($LCTL get_param osc.${tgt}.import | + grep grant_extent_tax | awk '{print $2}') + + echo $(((max_brw_size + grant_extent_tax) * 2)) +} + +test_64d() { + [ $(lustre_version_code ost1) -lt $(version_code 2.10.56) ] && + skip "OST < 2.10.55 doesn't limit grants enough" && return 0 + + local tgt=$($LCTL dl | grep "0000-osc-[^mM]" | awk '{print $4}') + + [[ $($LCTL get_param osc.${tgt}.import | + grep "connect_flags:.*grant_param") ]] || \ + { skip "no grant_param connect flag"; return; } + + local olddebug=$($LCTL get_param -n debug 2> /dev/null) + + $LCTL set_param debug="$OLDDEBUG" 2> /dev/null || true + + local max_cur_granted=$(($(want_grant $tgt) + $(grant_chunk $tgt))) + + $SETSTRIPE $DIR/$tfile -i 0 -c 1 + dd if=/dev/zero of=$DIR/$tfile bs=1M count=1000 & + ddpid=$! + + while true + do + local cur_grant=$($LCTL get_param -n osc.${tgt}.cur_grant_bytes) + if [[ $cur_grant -gt $max_cur_granted ]] + then + kill $ddpid + error "cur_grant $cur_grant > $max_cur_granted" + fi + kill -0 $ddpid + [[ $? -ne 0 ]] && break; + sleep 2 + done + $LCTL set_param debug="$olddebug" 2> /dev/null || true +} +run_test 64d "check grant limit exceed" # bug 1414 - set/get directories' stripe info test_65a() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir touch $DIR/$tdir/f1 $LVERIFY $DIR/$tdir $DIR/$tdir/f1 || error "lverify failed" } -run_test 65a "directory with no stripe info ====================" +run_test 65a "directory with no stripe info" test_65b() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir) $SETSTRIPE -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir || @@ -5604,21 +6155,20 @@ run_test 65b "directory setstripe -S stripe_size*2 -i 0 -c 1" test_65c() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - if [[ $OSTCOUNT -gt 1 ]]; then - test_mkdir -p $DIR/$tdir - local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir) + [ $OSTCOUNT -lt 2 ] && skip "need at least 2 OSTs" && return + test_mkdir $DIR/$tdir + local stripesize=$($GETSTRIPE -S $DIR/$tdir) - $SETSTRIPE -S $(($STRIPESIZE * 4)) -i 1 \ - -c $(($OSTCOUNT - 1)) $DIR/$tdir || error "setstripe" - touch $DIR/$tdir/f3 - $LVERIFY $DIR/$tdir $DIR/$tdir/f3 || error "lverify failed" - fi + $LFS setstripe -S $((stripesize * 4)) -i 1 \ + -c $((OSTCOUNT - 1)) $DIR/$tdir || error "setstripe" + touch $DIR/$tdir/f3 + $LVERIFY $DIR/$tdir $DIR/$tdir/f3 || error "lverify failed" } run_test 65c "directory setstripe -S stripe_size*4 -i 1 -c $((OSTCOUNT-1))" test_65d() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir local STRIPECOUNT=$($GETSTRIPE -c $DIR/$tdir) local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir) @@ -5639,7 +6189,7 @@ run_test 65d "directory setstripe -S stripe_size -c stripe_count" test_65e() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir $SETSTRIPE $DIR/$tdir || error "setstripe" $GETSTRIPE -v $DIR/$tdir | grep "Default" || @@ -5647,38 +6197,38 @@ test_65e() { touch $DIR/$tdir/f6 $LVERIFY $DIR/$tdir $DIR/$tdir/f6 || error "lverify failed" } -run_test 65e "directory setstripe defaults =======================" +run_test 65e "directory setstripe defaults" test_65f() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - test_mkdir -p $DIR/${tdir}f + test_mkdir $DIR/${tdir}f $RUNAS $SETSTRIPE $DIR/${tdir}f && error "setstripe succeeded" || true } run_test 65f "dir setstripe permission (should return error) ===" test_65g() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir) - $SETSTRIPE -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir || - error "setstripe" - $SETSTRIPE -d $DIR/$tdir || error "setstripe" - $GETSTRIPE -v $DIR/$tdir | grep "Default" || + $LFS setstripe -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir || + error "setstripe -S failed" + $LFS setstripe -d $DIR/$tdir || error "setstripe -d failed" + $LFS getstripe -v $DIR/$tdir | grep "Default" || error "delete default stripe failed" } -run_test 65g "directory setstripe -d ===========================" +run_test 65g "directory setstripe -d" test_65h() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir) - $SETSTRIPE -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir || - error "setstripe" - test_mkdir -p $DIR/$tdir/dd1 - [ $($GETSTRIPE -c $DIR/$tdir) == $($GETSTRIPE -c $DIR/$tdir/dd1) ] || - error "stripe info inherit failed" + $LFS setstripe -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir || + error "setstripe -S failed" + test_mkdir $DIR/$tdir/dd1 + [ $($LFS getstripe -c $DIR/$tdir) = $($GETSTRIPE -c $DIR/$tdir/dd1) ] || + error "stripe info inherit failed" } run_test 65h "directory stripe info inherit ====================" @@ -5708,6 +6258,8 @@ run_test 65ic "new find on -1 default directory striping" test_65j() { # bug6367 [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + [ $($LFS getstripe --component-count $MOUNT) -gt 1 ] && + skip "don't delete default PFL layout" && return sync; sleep 1 # if we aren't already remounting for each test, do so for this test if [ "$CLEANUP" = ":" -a "$I_MOUNTED" = "yes" ]; then @@ -5720,7 +6272,7 @@ run_test 65j "set default striping on root directory (bug 6367)=" test_65k() { # bug11679 [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - [[ $OSTCOUNT -lt 2 ]] && skip_env "too few OSTs" && return + [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return remote_mds_nodsh && skip "remote MDS with nodsh" && return local disable_precreate=true @@ -5805,23 +6357,6 @@ test_66() { } run_test 66 "update inode blocks count on client ===============" -LLOOP= -LLITELOOPLOAD= -cleanup_68() { - [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - trap 0 - if [ ! -z "$LLOOP" ]; then - if swapon -s | grep -q $LLOOP; then - swapoff $LLOOP || error "swapoff failed" - fi - - $LCTL blockdev_detach $LLOOP || error "detach failed" - rm -f $LLOOP - unset LLOOP - fi - rm -f $DIR/f68* -} - meminfo() { awk '($1 == "'$1':") { print $2 }' /proc/meminfo } @@ -5860,7 +6395,7 @@ test_69() { run_test 69 "verify oa2dentry return -ENOENT doesn't LBUG ======" test_71() { - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir $LFS setdirstripe -D -c$MDSCOUNT $DIR/$tdir sh rundbench -C -D $DIR/$tdir 2 || error "dbench failed!" } @@ -5996,21 +6531,9 @@ num_inodes() { awk '/lustre_inode_cache/ {print $2; exit}' /proc/slabinfo } -get_inode_slab_tunables() { - awk '/lustre_inode_cache/ {print $9," ",$10," ",$11; exit}' /proc/slabinfo -} - -set_inode_slab_tunables() { - echo "lustre_inode_cache $1" > /proc/slabinfo -} - test_76() { # Now for bug 20433, added originally in bug 1443 [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - local SLAB_SETTINGS=$(get_inode_slab_tunables) local CPUS=$(getconf _NPROCESSORS_ONLN 2>/dev/null) - # we cannot set limit below 1 which means 1 inode in each - # per-cpu cache is still allowed - set_inode_slab_tunables "1 1 0" cancel_lru_locks osc BEFORE_INODES=$(num_inodes) echo "before inodes: $BEFORE_INODES" @@ -6033,7 +6556,6 @@ test_76() { # Now for bug 20433, added originally in bug 1443 error "inode slab grew from $BEFORE_INODES to $AFTER_INODES" fi done - set_inode_slab_tunables "$SLAB_SETTINGS" } run_test 76 "confirm clients recycle inodes properly ====" @@ -6140,7 +6662,7 @@ test_77c() { error "dd write error: $?" fid=$($LFS path2fid $DIR/$tfile) - if [ $(lustre_version_code ost1) -ge $(version_code 2.5.42.6) ] + if [ $(lustre_version_code ost1) -ge $(version_code 2.9.57) ] then check_ost=true ost_file_prefix=$(do_facet ost1 $LCTL get_param -n debug_path) @@ -6183,7 +6705,7 @@ test_77c() { [[ "$orig_cksum" == "$dump_cksum" ]] || error "dump content does not match on Client" - $check_ost || skip "No need to check cksum dump on OSS" + $check_ost || { skip "No need to check cksum dump on OSS"; return 0; } # check cksum dump on OSS ost_file=$(do_facet ost1 ls ${ost_file_prefix}\*) @@ -6456,80 +6978,59 @@ test_82() { # LU-1031 wait $MULTIPID1 wait $MULTIPID2 } -run_test 82 "Basic grouplock test ===============================" +run_test 82 "Basic grouplock test" + +test_83() { + local sfile="/boot/System.map-$(uname -r)" + # define OBD_FAIL_LLITE_PTASK_IO_FAIL 0x140d + $LCTL set_param fail_loc=0x140d + cp $sfile $DIR/$tfile || error "write failed" + diff -c $sfile $DIR/$tfile || error "files are different" + $LCTL set_param fail_loc=0 + rm -f $DIR/$tfile +} +run_test 83 "Short write in ptask ===============================" -test_99a() { +test_99() { [ -z "$(which cvs 2>/dev/null)" ] && skip_env "could not find cvs" && return - test_mkdir -p $DIR/d99cvsroot - chown $RUNAS_ID $DIR/d99cvsroot - local oldPWD=$PWD # bug 13584, use $TMP as working dir - cd $TMP + test_mkdir $DIR/$tdir.cvsroot + chown $RUNAS_ID $DIR/$tdir.cvsroot - $RUNAS cvs -d $DIR/d99cvsroot init || error "cvs init failed" - cd $oldPWD -} -run_test 99a "cvs init =========================================" + cd $TMP + $RUNAS cvs -d $DIR/$tdir.cvsroot init || error "cvs init failed" -test_99b() { - [ -z "$(which cvs 2>/dev/null)" ] && - skip_env "could not find cvs" && return - [ ! -d $DIR/d99cvsroot ] && test_99a cd /etc/init.d # some versions of cvs import exit(1) when asked to import links or # files they can't read. ignore those files. - TOIGNORE=$(find . -type l -printf '-I %f\n' -o \ - ! -perm /4 -printf '-I %f\n') - $RUNAS cvs -d $DIR/d99cvsroot import -m "nomesg" $TOIGNORE \ - d99reposname vtag rtag -} -run_test 99b "cvs import =======================================" + local toignore=$(find . -type l -printf '-I %f\n' -o \ + ! -perm /4 -printf '-I %f\n') + $RUNAS cvs -d $DIR/$tdir.cvsroot import -m "nomesg" $toignore \ + $tdir.reposname vtag rtag -test_99c() { - [ -z "$(which cvs 2>/dev/null)" ] && skip_env "could not find cvs" && return - [ ! -d $DIR/d99cvsroot ] && test_99b cd $DIR - test_mkdir -p $DIR/d99reposname - chown $RUNAS_ID $DIR/d99reposname - $RUNAS cvs -d $DIR/d99cvsroot co d99reposname -} -run_test 99c "cvs checkout =====================================" + test_mkdir $DIR/$tdir.reposname + chown $RUNAS_ID $DIR/$tdir.reposname + $RUNAS cvs -d $DIR/$tdir.cvsroot co $tdir.reposname -test_99d() { - [ -z "$(which cvs 2>/dev/null)" ] && skip_env "could not find cvs" && return - [ ! -d $DIR/d99cvsroot ] && test_99c - cd $DIR/d99reposname + cd $DIR/$tdir.reposname $RUNAS touch foo99 $RUNAS cvs add -m 'addmsg' foo99 -} -run_test 99d "cvs add ==========================================" - -test_99e() { - [ -z "$(which cvs 2>/dev/null)" ] && skip_env "could not find cvs" && return - [ ! -d $DIR/d99cvsroot ] && test_99c - cd $DIR/d99reposname $RUNAS cvs update -} -run_test 99e "cvs update =======================================" - -test_99f() { - [ -z "$(which cvs 2>/dev/null)" ] && skip_env "could not find cvs" && return - [ ! -d $DIR/d99cvsroot ] && test_99d - cd $DIR/d99reposname $RUNAS cvs commit -m 'nomsg' foo99 - rm -fr $DIR/d99cvsroot + rm -fr $DIR/$tdir.cvsroot } -run_test 99f "cvs commit =======================================" +run_test 99 "cvs strange file/directory operations" test_100() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - [ "$NETTYPE" = tcp ] || \ - { skip "TCP secure port test, not useful for NETTYPE=$NETTYPE" && \ + [[ "$NETTYPE" =~ tcp ]] || + { skip "TCP secure port test, not useful for NETTYPE=$NETTYPE" && return ; } remote_ost_nodsh && skip "remote OST with nodsh" && return remote_mds_nodsh && skip "remote MDS with nodsh" && return - remote_servers || \ + remote_servers || { skip "useless for local single node setup" && return; } netstat -tna | ( rc=1; while read PROT SND RCV LOCAL REMOTE STAT; do @@ -6575,7 +7076,7 @@ cleanup_101a() { test_101a() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - [ $MDSCOUNT -ge 2 ] && skip "skip now for >= 2 MDTs" && return #LU-4322 + [ $MDSCOUNT -ge 2 ] && skip "needs < 2 MDTs" && return #LU-4322 local s local discard local nreads=10000 @@ -6606,10 +7107,10 @@ test_101a() { fi rm -f $DIR/$tfile || true } -run_test 101a "check read-ahead for random reads ================" +run_test 101a "check read-ahead for random reads" setup_test101bc() { - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir local STRIPE_SIZE=$1 local FILE_LENGTH=$2 STRIPE_OFFSET=0 @@ -6664,8 +7165,7 @@ ra_check_101() { test_101b() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - [[ $OSTCOUNT -lt 2 ]] && - skip_env "skipping stride IO stride-ahead test" && return + [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return local STRIPE_SIZE=1048576 local STRIDE_SIZE=$((STRIPE_SIZE*OSTCOUNT)) if [ $SLOW == "yes" ]; then @@ -6795,7 +7295,7 @@ test_101e() { done echo "Cancel LRU locks on lustre client to flush the client cache" - cancel_lru_locks osc + cancel_lru_locks $OSC echo "Reset readahead stats" $LCTL set_param -n llite.*.read_ahead_stats 0 @@ -6871,8 +7371,8 @@ test_101g_brw_size_test() { # calculate number of full-sized read and write RPCs rpcs=($($LCTL get_param -n 'osc.*.rpc_stats' | sed -n '/pages per rpc/,/^$/p' | - awk '/'$pages':/ { reads += $2; writes += $5 };' \ - 'END { print reads,writes }')) + awk '/'$pages':/ { reads += $2; writes += $6 }; \ + END { print reads,writes }')) [ ${rpcs[0]} -ne $count ] && error "${rpcs[0]} != $count read RPCs" && return 5 [ ${rpcs[1]} -ne $count ] && error "${rpcs[1]} != $count write RPCs" && @@ -6887,14 +7387,20 @@ test_101g() { local list=$(comma_list $(osts_nodes)) local p="$TMP/$TESTSUITE-$TESTNAME.parameters" local brw_size="obdfilter.*.brw_size" + local ostver=$(lustre_version_code ost1) + local cliver=$(lustre_version_code client) $LFS setstripe -i 0 -c 1 $DIR/$tfile local orig_mb=$(do_facet ost1 $LCTL get_param -n $brw_size | head -n 1) - if [ $(lustre_version_code ost1) -ge $(version_code 2.8.52) ]; then - [ $(lustre_version_code ost1) -ge $(version_code 2.9.52) ] && - suffix="M" - if [[ $orig_mb < 16 ]]; then + if [ $ostver -ge $(version_code 2.8.52) -o \ + \( $ostver -ge $(version_code 2.7.17) -a \ + $ostver -lt $(version_code 2.7.50) \) ] && + [ $cliver -ge $(version_code 2.8.52) -o \ + \( $cliver -ge $(version_code 2.7.17) -a \ + $cliver -lt $(version_code 2.7.50) \) ]; then + [ $ostver -ge $(version_code 2.9.52) ] && suffix="M" + if [[ $orig_mb -lt 16 ]]; then save_lustre_params $osts "$brw_size" > $p do_nodes $list $LCTL set_param -n $brw_size=16$suffix || error "set 16MB RPC size failed" @@ -6910,7 +7416,7 @@ test_101g() { test_101g_brw_size_test 4 || error "4MB RPC test failed" - if [[ $orig_mb < 16 ]]; then + if [[ $orig_mb -lt 16 ]]; then restore_lustre_params < $p remount_client $MOUNT || error "remount_client restore failed" fi @@ -6920,7 +7426,7 @@ test_101g() { run_test 101g "Big bulk(4/16 MiB) readahead" setup_test102() { - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir chown $RUNAS_ID $DIR/$tdir STRIPE_SIZE=65536 STRIPE_OFFSET=1 @@ -6942,7 +7448,7 @@ setup_test102() { done cd $DIR - $1 $TAR cf $TMP/f102.tar $tdir --xattrs + $1 tar cf $TMP/f102.tar $tdir --xattrs } cleanup_test102() { @@ -7001,13 +7507,15 @@ test_102a() { setfattr -x user.author1 $testfile || error "$testfile error deleting user.author1" - getfattr -d -m user $testfile 2> /dev/null | grep "user.author1" && - error "$testfile did not delete trusted.name1 xattr" - - # b10667: setting lustre special xattr be silently discarded echo "set lustre special xattr ..." - setfattr -n "trusted.lov" -v "invalid value" $testfile || - error "$testfile allowed setting trusted.lov" + $LFS setstripe -c1 $testfile + local lovea=$(getfattr -n "trusted.lov" -e hex $testfile | + awk -F "=" '/trusted.lov/ { print $2 }' ) + setfattr -n "trusted.lov" -v $lovea $testfile || + error "$testfile doesn't ignore setting trusted.lov again" + setfattr -n "trusted.lov" -v "invalid_value" $testfile && + error "$testfile allow setting invalid trusted.lov" + rm -f $testfile } run_test 102a "user xattr test ==================================" @@ -7017,7 +7525,7 @@ test_102b() { # b10930: get/set/list trusted.lov xattr echo "get/set/list trusted.lov xattr ..." - [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test" && return + [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return local testfile=$DIR/$tfile $SETSTRIPE -S 65536 -i 1 -c $OSTCOUNT $testfile || error "setstripe failed" @@ -7048,8 +7556,8 @@ test_102c() { # b10930: get/set/list lustre.lov xattr echo "get/set/list lustre.lov xattr ..." - [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test" && return - test_mkdir -p $DIR/$tdir + [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return + test_mkdir $DIR/$tdir chown $RUNAS_ID $DIR/$tdir local testfile=$DIR/$tdir/$tfile $RUNAS $SETSTRIPE -S 65536 -i 1 -c $OSTCOUNT $testfile || @@ -7099,39 +7607,35 @@ compare_stripe_info1() { return 0 } -find_lustre_tar() { - [ -n "$(which tar 2>/dev/null)" ] && - strings $(which tar) | grep -q "lustre" && echo tar +have_xattrs_include() { + tar --help | grep -q xattrs-include && + echo --xattrs-include="lustre.*" } test_102d() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - # b10930: tar test for trusted.lov xattr - TAR=$(find_lustre_tar) - [ -z "$TAR" ] && skip_env "lustre-aware tar is not installed" && return - [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping N-stripe test" && return + [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return + XINC=$(have_xattrs_include) setup_test102 - test_mkdir -p $DIR/d102d - $TAR xf $TMP/f102.tar -C $DIR/d102d --xattrs - cd $DIR/d102d/$tdir + tar xf $TMP/f102.tar -C $DIR/$tdir --xattrs $XINC + cd $DIR/$tdir/$tdir compare_stripe_info1 } -run_test 102d "tar restore stripe info from tarfile,not keep osts ===========" +run_test 102d "tar restore stripe info from tarfile,not keep osts" test_102f() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - # b10930: tar test for trusted.lov xattr - TAR=$(find_lustre_tar) - [ -z "$TAR" ] && skip_env "lustre-aware tar is not installed" && return - [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping N-stripe test" && return + [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return + XINC=$(have_xattrs_include) setup_test102 - test_mkdir -p $DIR/d102f + test_mkdir $DIR/$tdir.restore cd $DIR - $TAR cf - --xattrs $tdir | $TAR xf - --xattrs -C $DIR/d102f - cd $DIR/d102f/$tdir + tar cf - --xattrs $tdir | tar xf - \ + -C $DIR/$tdir.restore --xattrs $XINC + cd $DIR/$tdir.restore/$tdir compare_stripe_info1 } -run_test 102f "tar copy files, not keep osts ===========" +run_test 102f "tar copy files, not keep osts" grow_xattr() { local xsize=${1:-1024} # in bytes @@ -7201,14 +7705,12 @@ run_test 102i "lgetxattr test on symbolic link ============" test_102j() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - TAR=$(find_lustre_tar) - [ -z "$TAR" ] && skip_env "lustre-aware tar is not installed" && return - [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping N-stripe test" && return + [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return + XINC=$(have_xattrs_include) setup_test102 "$RUNAS" - test_mkdir -p $DIR/d102j - chown $RUNAS_ID $DIR/d102j - $RUNAS $TAR xf $TMP/f102.tar -C $DIR/d102j --xattrs - cd $DIR/d102j/$tdir + chown $RUNAS_ID $DIR/$tdir + $RUNAS tar xf $TMP/f102.tar -C $DIR/$tdir --xattrs $XINC + cd $DIR/$tdir/$tdir compare_stripe_info1 "$RUNAS" } run_test 102j "non-root tar restore stripe info from tarfile, not keep osts ===" @@ -7216,28 +7718,28 @@ run_test 102j "non-root tar restore stripe info from tarfile, not keep osts ===" test_102k() { [ -z "$(which setfattr 2>/dev/null)" ] && skip "could not find setfattr" && return - touch $DIR/$tfile - # b22187 just check that does not crash for regular file. - setfattr -n trusted.lov $DIR/$tfile - # b22187 'setfattr -n trusted.lov' should work as remove LOV EA for directories - local test_kdir=$DIR/d102k - test_mkdir $test_kdir - local default_size=`$GETSTRIPE -S $test_kdir` - local default_count=`$GETSTRIPE -c $test_kdir` - local default_offset=`$GETSTRIPE -i $test_kdir` + touch $DIR/$tfile + # b22187 just check that does not crash for regular file. + setfattr -n trusted.lov $DIR/$tfile + # b22187 'setfattr -n trusted.lov' should remove LOV EA for directories + local test_kdir=$DIR/$tdir + test_mkdir $test_kdir + local default_size=$($LFS getstripe -S $test_kdir) + local default_count=$($LFS getstripe -c $test_kdir) + local default_offset=$($LFS getstripe -i $test_kdir) $SETSTRIPE -S 65536 -i 0 -c $OSTCOUNT $test_kdir || - error 'dir setstripe failed' - setfattr -n trusted.lov $test_kdir - local stripe_size=`$GETSTRIPE -S $test_kdir` - local stripe_count=`$GETSTRIPE -c $test_kdir` - local stripe_offset=`$GETSTRIPE -i $test_kdir` - [ $stripe_size -eq $default_size ] || - error "stripe size $stripe_size != $default_size" - [ $stripe_count -eq $default_count ] || - error "stripe count $stripe_count != $default_count" - [ $stripe_offset -eq $default_offset ] || - error "stripe offset $stripe_offset != $default_offset" - rm -rf $DIR/$tfile $test_kdir + error 'dir setstripe failed' + setfattr -n trusted.lov $test_kdir + local stripe_size=$($LFS getstripe -S $test_kdir) + local stripe_count=$($LFS getstripe -c $test_kdir) + local stripe_offset=$($LFS getstripe -i $test_kdir) + [ $stripe_size -eq $default_size ] || + error "stripe size $stripe_size != $default_size" + [ $stripe_count -eq $default_count ] || + error "stripe count $stripe_count != $default_count" + [ $stripe_offset -eq $default_offset ] || + error "stripe offset $stripe_offset != $default_offset" + rm -rf $DIR/$tfile $test_kdir } run_test 102k "setfattr without parameter of value shouldn't cause a crash" @@ -7322,8 +7824,13 @@ test_102n() { # LU-4101 mdt: protect internal xattrs # Try to set a garbage xattr. value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4= - setfattr --name=trusted.$name --value="$value" $file1 || - error "setxattr 'trusted.$name' failed" + if [[ x$name == "xlov" ]]; then + setfattr --name=trusted.lov --value="$value" $file1 && + error "setxattr invalid 'trusted.lov' success" + else + setfattr --name=trusted.$name --value="$value" $file1 || + error "setxattr invalid 'trusted.$name' failed" + fi # Try to remove the xattr from $file1. We don't care if this # appears to succeed or fail, we just don't want there to be @@ -7411,7 +7918,7 @@ test_102r() { rmdir $DIR/$tdir || error "rmdir" #striped directory - test_mkdir -p $DIR/$tdir || error "make striped dir" + test_mkdir $DIR/$tdir 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 || @@ -7506,43 +8013,6 @@ test_103a() { } run_test 103a "acl test =========================================" -test_103b() { - remote_mds_nodsh && skip "remote MDS with nodsh" && return - local noacl=false - local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/}) - local mountopts=$MDS_MOUNT_OPTS - - if [[ "$MDS_MOUNT_OPTS" =~ "noacl" ]]; then - noacl=true - else - # stop the MDT - stop $SINGLEMDS || error "failed to stop MDT." - # remount the MDT - if [ -z "$MDS_MOUNT_OPTS" ]; then - MDS_MOUNT_OPTS="-o noacl" - else - MDS_MOUNT_OPTS="${MDS_MOUNT_OPTS},noacl" - fi - start $SINGLEMDS $MDT_DEV $MDS_MOUNT_OPTS || - error "failed to start MDT." - MDS_MOUNT_OPTS=$mountopts - fi - - touch $DIR/$tfile - setfacl -m u:bin:rw $DIR/$tfile && error "setfacl should fail" - - if ! $noacl; then - # stop the MDT - stop $SINGLEMDS || error "failed to stop MDT." - # remount the MDT - start $SINGLEMDS $MDT_DEV $MDS_MOUNT_OPTS || - error "failed to start MDT." - fi - - true -} -run_test 103b "MDS mount option 'noacl'" - test_103c() { mkdir -p $DIR/$tdir cp -rp $DIR/$tdir $DIR/$tdir.bak @@ -7622,11 +8092,11 @@ test_105c() { fi rm -f $DIR/$tfile } -run_test 105c "lockf when mounted without -o flock test ========" +run_test 105c "lockf when mounted without -o flock test" test_105d() { # bug 15924 [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir flock_is_enabled || { skip "mount w/o flock enabled" && return; } #define OBD_FAIL_LDLM_CP_CB_WAIT 0x315 $LCTL set_param fail_loc=0x80000315 @@ -7639,10 +8109,10 @@ test_105e() { # bug 22660 && 22040 touch $DIR/$tfile flocks_test 3 $DIR/$tfile } -run_test 105e "Two conflicting flocks from same process =======" +run_test 105e "Two conflicting flocks from same process" test_106() { #bug 10921 - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir $DIR/$tdir && error "exec $DIR/$tdir succeeded" chmod 777 $DIR/$tdir || error "chmod $DIR/$tdir failed" } @@ -7683,10 +8153,9 @@ test_107() { run_test 107 "Coredump on SIG" test_110() { - test_mkdir -p $DIR/$tdir - test_mkdir $DIR/$tdir/$(str_repeat 'a' 255) || - error "mkdir with 255 char failed" - test_mkdir $DIR/$tdir/$(str_repeat 'b' 256) && + test_mkdir $DIR/$tdir + test_mkdir $DIR/$tdir/$(str_repeat 'a' 255) + $LFS mkdir -c $MDSCOUNT $DIR/$tdir/$(str_repeat 'b' 256) && error "mkdir with 256 char should fail, but did not" touch $DIR/$tdir/$(str_repeat 'x' 255) || error "create with 255 char failed" @@ -7698,31 +8167,110 @@ test_110() { } run_test 110 "filename length checking" +# +# Purpose: To verify dynamic thread (OSS) creation. +# test_115() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - OSTIO_pre=$(ps -e | grep ll_ost_io | awk '{ print $4 }'| sort -n | - tail -1 | cut -c11-20) - [ -z "$OSTIO_pre" ] && skip "no OSS threads" && return + remote_ost_nodsh && skip "remote OST with nodsh" && return + + # Lustre does not stop service threads once they are started. + # Reset number of running threads to default. + stopall + setupall + + local OSTIO_pre + local save_params="$TMP/sanity-$TESTNAME.parameters" + + # Get ll_ost_io count before I/O + OSTIO_pre=$(do_facet ost1 \ + "$LCTL get_param ost.OSS.ost_io.threads_started | cut -d= -f2") + # Exit if lustre is not running (ll_ost_io not running). + [ -z "$OSTIO_pre" ] && error "no OSS threads" + echo "Starting with $OSTIO_pre threads" + local thread_max=$((OSTIO_pre * 2)) + local rpc_in_flight=$((thread_max * 2)) + # Number of I/O Process proposed to be started. + local nfiles + local facets=$(get_facets OST) - NUMTEST=20000 - NUMFREE=$(df -i -P $DIR | tail -n 1 | awk '{ print $4 }') - [[ $NUMFREE -lt $NUMTEST ]] && NUMTEST=$(($NUMFREE - 1000)) - echo "$NUMTEST creates/unlinks" - test_mkdir -p $DIR/$tdir - createmany -o $DIR/$tdir/$tfile $NUMTEST - unlinkmany $DIR/$tdir/$tfile $NUMTEST + save_lustre_params client "osc.*OST*.max_rpcs_in_flight" > $save_params + save_lustre_params $facets "ost.OSS.ost_io.threads_max" >> $save_params + + # Set in_flight to $rpc_in_flight + $LCTL set_param osc.*OST*.max_rpcs_in_flight=$rpc_in_flight || + error "Failed to set max_rpcs_in_flight to $rpc_in_flight" + nfiles=${rpc_in_flight} + # Set ost thread_max to $thread_max + do_facet ost1 "$LCTL set_param ost.OSS.ost_io.threads_max=$thread_max" + + # 5 Minutes should be sufficient for max number of OSS + # threads(thread_max) to be created. + local timeout=300 - OSTIO_post=$(ps -e | grep ll_ost_io | awk '{ print $4 }' | sort -n | - tail -1 | cut -c11-20) + # Start I/O. + local WTL=${WTL:-"$LUSTRE/tests/write_time_limit"} + test_mkdir $DIR/$tdir + for i in $(seq $nfiles); do + local file=$DIR/$tdir/${tfile}-$i + $LFS setstripe -c -1 -i 0 $file + ($WTL $file $timeout)& + done + + # I/O Started - Wait for thread_started to reach thread_max or report + # error if thread_started is more than thread_max. + echo "Waiting for thread_started to reach thread_max" + local thread_started=0 + local end_time=$((SECONDS + timeout)) + + while [ $SECONDS -le $end_time ] ; do + echo -n "." + # Get ost i/o thread_started count. + thread_started=$(do_facet ost1 \ + "$LCTL get_param \ + ost.OSS.ost_io.threads_started | cut -d= -f2") + # Break out if thread_started is equal/greater than thread_max + if [[ $thread_started -ge $thread_max ]]; then + echo ll_ost_io thread_started $thread_started, \ + equal/greater than thread_max $thread_max + break + fi + sleep 1 + done + + # Cleanup - We have the numbers, Kill i/o jobs if running. + jobcount=($(jobs -p)) + for i in $(seq 0 $((${#jobcount[@]}-1))) + do + kill -9 ${jobcount[$i]} + if [ $? -ne 0 ] ; then + echo Warning: \ + Failed to Kill \'WTL\(I/O\)\' with pid ${jobcount[$i]} + fi + done - # don't return an error - [ $OSTIO_post == $OSTIO_pre ] && echo \ - "WARNING: No new ll_ost_io threads were created ($OSTIO_pre)" && - echo "This may be fine, depending on what ran before this test" && - echo "and how fast this system is." && return + # Cleanup files left by WTL binary. + for i in $(seq $nfiles); do + local file=$DIR/$tdir/${tfile}-$i + rm -rf $file + if [ $? -ne 0 ] ; then + echo "Warning: Failed to delete file $file" + fi + done - echo "Started with $OSTIO_pre threads, ended with $OSTIO_post" + restore_lustre_params <$save_params + rm -f $save_params || echo "Warning: delete file '$save_params' failed" + + # Error out if no new thread has started or Thread started is greater + # than thread max. + if [[ $thread_started -le $OSTIO_pre || + $thread_started -gt $thread_max ]]; then + error "ll_ost_io: thread_started $thread_started" \ + "OSTIO_pre $OSTIO_pre, thread_max $thread_max." \ + "No new thread started or thread started greater " \ + "than thread_max." + fi } run_test 115 "verify dynamic thread creation====================" @@ -7753,7 +8301,7 @@ 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 + [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return echo -n "Free space priority " do_facet $SINGLEMDS lctl get_param -n lo*.*-mdtlov.qos_prio_free | @@ -8270,7 +8818,7 @@ test_118k() #define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e set_nodes_failloc "$(osts_nodes)" 0x20e - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir for ((i=0;i<10;i++)); do (dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=1M count=10 || \ @@ -8290,16 +8838,16 @@ test_118l() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return # LU-646 - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir $MULTIOP $DIR/$tdir Dy || error "fsync dir failed" rm -rf $DIR/$tdir } -run_test 118l "fsync dir =========" +run_test 118l "fsync dir" test_118m() # LU-3066 { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir $MULTIOP $DIR/$tdir DY || error "fdatasync dir failed" rm -rf $DIR/$tdir } @@ -8307,6 +8855,34 @@ run_test 118m "fdatasync dir =========" [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] && set_resend_count $OLD_RESENDCOUNT +test_118n() +{ + local begin + local end + + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + remote_ost_nodsh && skip "remote OSTs with nodsh" && return + + # Sleep to avoid a cached response. + #define OBD_STATFS_CACHE_SECONDS 1 + sleep 2 + + # Inject a 10 second delay in the OST_STATFS handler. + #define OBD_FAIL_OST_STATFS_DELAY 0x242 + set_nodes_failloc "$(osts_nodes)" 0x242 + + begin=$SECONDS + stat --file-system $MOUNT > /dev/null + end=$SECONDS + + set_nodes_failloc "$(osts_nodes)" 0 + + if ((end - begin > 20)); then + error "statfs took $((end - begin)) seconds, expected 10" + fi +} +run_test 118n "statfs() sends OST_STATFS requests in parallel" + test_119a() # bug 11737 { BSIZE=$((512 * 1024)) @@ -8325,7 +8901,7 @@ run_test 119a "Short directIO read must return actual read amount" test_119b() # bug 11737 { - [ "$OSTCOUNT" -lt "2" ] && skip_env "skipping 2-stripe test" && return + [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return $SETSTRIPE -c 2 $DIR/$tfile || error "setstripe failed" dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1 || error "dd failed" @@ -8374,9 +8950,9 @@ run_test 119d "The DIO path should try to send a new rpc once one is completed" test_120a() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return remote_mds_nodsh && skip "remote MDS with nodsh" && return - test_mkdir -p $DIR/$tdir - [ -z "`lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel`" ] && \ - skip "no early lock cancel on server" && return 0 + test_mkdir $DIR/$tdir + $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel || + { skip "no early lock cancel on server"; return 0; } lru_resize_disable mdc lru_resize_disable osc @@ -8406,13 +8982,13 @@ run_test 120a "Early Lock Cancel: mkdir test" test_120b() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return remote_mds_nodsh && skip "remote MDS with nodsh" && return - test_mkdir $DIR/$tdir - [ -z "$(lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel)" ] && \ - skip "no early lock cancel on server" && return 0 - lru_resize_disable mdc - lru_resize_disable osc - cancel_lru_locks mdc - stat $DIR/$tdir > /dev/null + test_mkdir $DIR/$tdir + $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel || + { skip "no early lock cancel on server"; return 0; } + lru_resize_disable mdc + lru_resize_disable osc + cancel_lru_locks mdc + stat $DIR/$tdir > /dev/null can1=$(do_facet $SINGLEMDS \ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | awk '/ldlm_cancel/ {print $2}') @@ -8435,12 +9011,12 @@ test_120c() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return remote_mds_nodsh && skip "remote MDS with nodsh" && return test_mkdir -c1 $DIR/$tdir - [ -z "$(lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel)" ] && \ - skip "no early lock cancel on server" && return 0 - lru_resize_disable mdc - lru_resize_disable osc - test_mkdir -p -c1 $DIR/$tdir/d1 - test_mkdir -p -c1 $DIR/$tdir/d2 + $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel || + { skip "no early lock cancel on server"; return 0; } + lru_resize_disable mdc + lru_resize_disable osc + test_mkdir -c1 $DIR/$tdir/d1 + test_mkdir -c1 $DIR/$tdir/d2 touch $DIR/$tdir/d1/f1 cancel_lru_locks mdc stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 > /dev/null @@ -8465,9 +9041,9 @@ run_test 120c "Early Lock Cancel: link test" test_120d() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return remote_mds_nodsh && skip "remote MDS with nodsh" && return - test_mkdir -p -c1 $DIR/$tdir - [ -z "$(lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel)" ] && \ - skip "no early lock cancel on server" && return 0 + test_mkdir -c1 $DIR/$tdir + $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel || + { skip "no early lock cancel on server"; return 0; } lru_resize_disable mdc lru_resize_disable osc touch $DIR/$tdir @@ -8493,12 +9069,12 @@ run_test 120d "Early Lock Cancel: setattr test" test_120e() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - ! $($LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_can) && - skip "no early lock cancel on server" && return 0 + $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel || + { skip "no early lock cancel on server"; return 0; } remote_mds_nodsh && skip "remote MDS with nodsh" && return local dlmtrace_set=false - test_mkdir -p -c1 $DIR/$tdir + test_mkdir -c1 $DIR/$tdir lru_resize_disable mdc lru_resize_disable osc ! $LCTL get_param debug | grep -q dlmtrace && @@ -8536,14 +9112,14 @@ run_test 120e "Early Lock Cancel: unlink test" test_120f() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - [ -z "`lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel`" ] && \ - skip "no early lock cancel on server" && return 0 + $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel || + { skip "no early lock cancel on server"; return 0; } remote_mds_nodsh && skip "remote MDS with nodsh" && return - test_mkdir -p -c1 $DIR/$tdir - lru_resize_disable mdc - lru_resize_disable osc - test_mkdir -p -c1 $DIR/$tdir/d1 - test_mkdir -p -c1 $DIR/$tdir/d2 + test_mkdir -c1 $DIR/$tdir + lru_resize_disable mdc + lru_resize_disable osc + test_mkdir -c1 $DIR/$tdir/d1 + test_mkdir -c1 $DIR/$tdir/d2 dd if=/dev/zero of=$DIR/$tdir/d1/f1 count=1 dd if=/dev/zero of=$DIR/$tdir/d2/f2 count=1 cancel_lru_locks mdc @@ -8576,17 +9152,17 @@ run_test 120f "Early Lock Cancel: rename test" test_120g() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - [ -z "`lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel`" ] && \ - skip "no early lock cancel on server" && return 0 + $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel || + { skip "no early lock cancel on server"; return 0; } remote_mds_nodsh && skip "remote MDS with nodsh" && return - lru_resize_disable mdc - lru_resize_disable osc - count=10000 - echo create $count files - test_mkdir -p $DIR/$tdir - cancel_lru_locks mdc - cancel_lru_locks osc - t0=`date +%s` + lru_resize_disable mdc + lru_resize_disable osc + count=10000 + echo create $count files + test_mkdir $DIR/$tdir + cancel_lru_locks mdc + cancel_lru_locks osc + t0=$(date +%s) can0=$(do_facet $SINGLEMDS \ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | @@ -8636,14 +9212,14 @@ run_test 121 "read cancel race =========" test_123a() { # was test 123, statahead(bug 11401) [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - SLOWOK=0 - if [ -z "$(grep "processor.*: 1" /proc/cpuinfo)" ]; then - log "testing on UP system. Performance may be not as good as expected." - SLOWOK=1 - fi + SLOWOK=0 + if ! grep -q "processor.*: 1" /proc/cpuinfo; then + log "testing UP system. Performance may be lower than expected." + SLOWOK=1 + fi - rm -rf $DIR/$tdir - test_mkdir -p $DIR/$tdir + rm -rf $DIR/$tdir + test_mkdir $DIR/$tdir NUMFREE=$(df -i -P $DIR | tail -n 1 | awk '{ print $4 }') [[ $NUMFREE -gt 100000 ]] && NUMFREE=100000 || NUMFREE=$((NUMFREE-1000)) MULT=10 @@ -8719,7 +9295,7 @@ run_test 123a "verify statahead work" test_123b () { # statahead(bug 15027) [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir createmany -o $DIR/$tdir/$tfile-%d 1000 cancel_lru_locks mdc @@ -8739,20 +9315,20 @@ run_test 123b "not panic with network error in statahead enqueue (bug 15027)" test_124a() { [ $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 - local NR=2000 - test_mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir" + $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize || + { skip "no lru resize on server"; return 0; } + local NR=2000 + test_mkdir $DIR/$tdir - log "create $NR files at $DIR/$tdir" - createmany -o $DIR/$tdir/f $NR || - error "failed to create $NR files in $DIR/$tdir" + log "create $NR files at $DIR/$tdir" + createmany -o $DIR/$tdir/f $NR || + error "failed to create $NR files in $DIR/$tdir" - cancel_lru_locks mdc - ls -l $DIR/$tdir > /dev/null + cancel_lru_locks mdc + ls -l $DIR/$tdir > /dev/null - local NSDIR="" - local LRU_SIZE=0 + local NSDIR="" + local LRU_SIZE=0 for VALUE in $($LCTL get_param ldlm.namespaces.*mdc-*.lru_size); do local PARAM=$(echo ${VALUE[0]} | cut -d "=" -f1) LRU_SIZE=$($LCTL get_param -n $PARAM) @@ -8841,8 +9417,8 @@ get_max_pool_limit() test_124b() { [ $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 + $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize || + { skip "no lru resize on server"; return 0; } LIMIT=$(get_max_pool_limit) @@ -8859,8 +9435,7 @@ test_124b() { fi lru_resize_disable mdc - test_mkdir -p $DIR/$tdir/disable_lru_resize || - error "failed to create $DIR/$tdir/disable_lru_resize" + test_mkdir -p $DIR/$tdir/disable_lru_resize createmany -o $DIR/$tdir/disable_lru_resize/f $NR log "doing ls -la $DIR/$tdir/disable_lru_resize 3 times" @@ -8882,9 +9457,8 @@ test_124b() { log "lru_size = $(lctl get_param -n ldlm.namespaces.*mdc*.lru_size)" unlinkmany $DIR/$tdir/disable_lru_resize/f $NR - lru_resize_enable mdc - test_mkdir -p $DIR/$tdir/enable_lru_resize || - error "failed to create $DIR/$tdir/enable_lru_resize" + lru_resize_enable mdc + test_mkdir -p $DIR/$tdir/enable_lru_resize createmany -o $DIR/$tdir/enable_lru_resize/f $NR log "doing ls -la $DIR/$tdir/enable_lru_resize 3 times" @@ -8918,13 +9492,13 @@ 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 + $LCTL get_param -n mdc.*.connect_flags | grep -q 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" + test_mkdir $DIR/$tdir createmany -o $DIR/$tdir/f $nr || error "failed to create $nr files in $DIR/$tdir" ls -l $DIR/$tdir > /dev/null @@ -8936,7 +9510,7 @@ test_124c() { 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 + $LCTL set_param $nsdir.lru_max_age=1000 # milliseconds echo "sleep $((recalc_p * 2)) seconds..." sleep $((recalc_p * 2)) @@ -8949,19 +9523,22 @@ test_124c() { 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 + $LCTL get_param -n llite.*.client_type | grep -q local || + { skip "must run as local client"; return; } + $LCTL get_param -n mdc.*-mdc-*.connect_flags | grep -q acl || + { skip "must have acl enabled"; return; } [ -z "$(which setfacl)" ] && skip "must have setfacl tool" && return - test_mkdir -p $DIR/d125 || error "mkdir failed" - $SETSTRIPE -S 65536 -c -1 $DIR/d125 || error "setstripe failed" - setfacl -R -m u:bin:rwx $DIR/d125 || error "setfacl $DIR/d125 failed" - ls -ld $DIR/d125 || error "cannot access $DIR/d125" + test_mkdir $DIR/$tdir + $LFS setstripe -S 65536 -c -1 $DIR/$tdir || error "setstripe failed" + setfacl -R -m u:bin:rwx $DIR/$tdir || error "setfacl $DIR/$tdir failed" + ls -ld $DIR/$tdir || error "cannot access $DIR/$tdir" } run_test 125 "don't return EPROTO when a dir has a non-default striping and ACLs" test_126() { # bug 12829/13455 - [ -z "$(lctl get_param -n llite.*.client_type | grep local)" ] && skip "must run as local client" && return - [ "$UID" != 0 ] && skip_env "skipping $TESTNAME (must run as root)" && return + $LCTL get_param -n llite.*.client_type | grep -q local || + { skip "must run as local client"; return; } + [ "$UID" != 0 ] && skip_env "$TESTNAME (must run as root)" && return $GSS && skip "must run as gss disabled" && return $RUNAS -u 0 -g 1 touch $DIR/$tfile || error "touch failed" @@ -9072,18 +9649,16 @@ set_dir_limits () { local canondev local node - local LDPROC=/proc/fs/ldiskfs + local ldproc=/proc/fs/ldiskfs local facets=$(get_facets MDS) for facet in ${facets//,/ }; do canondev=$(ldiskfs_canon \ *.$(convert_facet2label $facet).mntdev $facet) - do_facet $facet "test -e $LDPROC/$canondev/max_dir_size" || - LDPROC=/sys/fs/ldiskfs - do_facet $facet "echo $1 >$LDPROC/$canondev/max_dir_size" - do_facet $facet "test -e $LDPROC/$canondev/warning_dir_size" || - LDPROC=/sys/fs/ldiskfs - do_facet $facet "echo $2 >$LDPROC/$canondev/warning_dir_size" + do_facet $facet "test -e $ldproc/$canondev/max_dir_size" || + ldproc=/sys/fs/ldiskfs + do_facet $facet "echo $1 >$ldproc/$canondev/max_dir_size" + do_facet $facet "echo $2 >$ldproc/$canondev/warning_dir_size" done } @@ -9101,68 +9676,60 @@ test_129() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return if [ "$(facet_fstype $SINGLEMDS)" != ldiskfs ]; then - skip "Only applicable to ldiskfs-based MDTs" + skip "ldiskfs only test" return fi remote_mds_nodsh && skip "remote MDS with nodsh" && return local ENOSPC=28 local EFBIG=27 - local has_warning=0 + local has_warning=false rm -rf $DIR/$tdir mkdir -p $DIR/$tdir # block size of mds1 - local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/}) - local MDSBLOCKSIZE=$($LCTL get_param -n mdc.*MDT0000*.blocksize) - local MAX=$((MDSBLOCKSIZE * 5)) - set_dir_limits $MAX $MAX - local I=$(stat -c%s "$DIR/$tdir") - local J=0 - while [[ $I -le $MAX ]]; do - $MULTIOP $DIR/$tdir/$J Oc + local maxsize=$(($($LCTL get_param -n mdc.*MDT0000*.blocksize) * 5)) + set_dir_limits $maxsize $maxsize + local dirsize=$(stat -c%s "$DIR/$tdir") + local nfiles=0 + while [[ $dirsize -le $maxsize ]]; do + $MULTIOP $DIR/$tdir/file_base_$nfiles Oc rc=$? - if [ $has_warning -eq 0 ]; then - check_mds_dmesg '"is approaching"' && - has_warning=1 + if ! $has_warning; then + check_mds_dmesg '"is approaching"' && has_warning=true fi - #check two errors ENOSPC for new version of ext4 max_dir_size patch - #mainline kernel commit df981d03eeff7971ac7e6ff37000bfa702327ef1 - #and EFBIG for previous versions + # check two errors: + # ENOSPC for new ext4 max_dir_size (kernel commit df981d03ee) + # EFBIG for previous versions included in ldiskfs series if [ $rc -eq $EFBIG -o $rc -eq $ENOSPC ]; then set_dir_limits 0 0 echo "return code $rc received as expected" - createmany -o $DIR/$tdir/$J_file_ 1000 || + createmany -o $DIR/$tdir/file_extra_$nfiles. 5 || error_exit "create failed w/o dir size limit" check_mds_dmesg '"has reached"' || - error_exit "has reached message should be output" + error_exit "reached message should be output" - [ $has_warning -eq 0 ] && + [ $has_warning = "false" ] && error_exit "warning message should be output" - I=$(stat -c%s "$DIR/$tdir") + dirsize=$(stat -c%s "$DIR/$tdir") - if [ $(lustre_version_code $SINGLEMDS) -lt \ - $(version_code 2.4.51) ] - then - [[ $I -eq $MAX ]] && return 0 - else - [[ $I -gt $MAX ]] && return 0 - fi - error_exit "current dir size $I, previous limit $MAX" + [[ $dirsize -ge $maxsize ]] && return 0 + error_exit "current dir size $dirsize, " \ + "previous limit $maxsize" elif [ $rc -ne 0 ]; then set_dir_limits 0 0 - error_exit "return code $rc received instead of expected " \ - "$EFBIG or $ENOSPC, files in dir $I" + error_exit "return $rc received instead of expected " \ + "$EFBIG or $ENOSPC, files in dir $dirsize" fi - J=$((J+1)) - I=$(stat -c%s "$DIR/$tdir") + nfiles=$((nfiles + 1)) + dirsize=$(stat -c%s "$DIR/$tdir") done set_dir_limits 0 0 - error "exceeded dir size limit $MAX($MDSCOUNT) : $I bytes" + error "exceeded dir size limit $maxsize($MDSCOUNT) : $dirsize bytes" } run_test 129 "test directory size limit ========================" @@ -9191,7 +9758,7 @@ test_130a() { skip "ORI-366/LU-1941: FIEMAP unimplemented on ZFS" && return [ $RC != 0 ] && error "filefrag $fm_file failed" - filefrag_op=$(filefrag -ve $fm_file | + filefrag_op=$(filefrag -ve -k $fm_file | sed -n '/ext:/,/found/{/ext:/d; /found/d; p}') lun=$($GETSTRIPE -i $fm_file) @@ -9223,8 +9790,7 @@ test_130a() { run_test 130a "FIEMAP (1-stripe file)" test_130b() { - [ "$OSTCOUNT" -lt "2" ] && - skip_env "skipping FIEMAP on $OSTCOUNT-stripe file" && return + [ "$OSTCOUNT" -lt "2" ] && skip_env "needs >= 2 OSTs" && return local filefrag_op=$(filefrag -e 2>&1 | grep "invalid option") [ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP" && @@ -9242,7 +9808,7 @@ test_130b() { error "dd failed on $fm_file" filefrag -ves $fm_file || error "filefrag $fm_file failed" - filefrag_op=$(filefrag -ve $fm_file | + filefrag_op=$(filefrag -ve -k $fm_file | sed -n '/ext:/,/found/{/ext:/d; /found/d; p}') last_lun=$(echo $filefrag_op | cut -d: -f5 | @@ -9284,8 +9850,7 @@ test_130b() { run_test 130b "FIEMAP ($OSTCOUNT-stripe file)" test_130c() { - [ "$OSTCOUNT" -lt "2" ] && - skip_env "skipping FIEMAP on 2-stripe file" && return + [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return filefrag_op=$(filefrag -e 2>&1 | grep "invalid option") [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP" && @@ -9302,7 +9867,7 @@ test_130c() { error "dd failed on $fm_file" filefrag -ves $fm_file || error "filefrag $fm_file failed" - filefrag_op=$(filefrag -ve $fm_file | + filefrag_op=$(filefrag -ve -k $fm_file | sed -n '/ext:/,/found/{/ext:/d; /found/d; p}') last_lun=$(echo $filefrag_op | cut -d: -f5 | @@ -9351,8 +9916,7 @@ test_130c() { run_test 130c "FIEMAP (2-stripe file with hole)" test_130d() { - [ "$OSTCOUNT" -lt "3" ] && - skip_env "skipping FIEMAP on N-stripe file test" && return + [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs" && return filefrag_op=$(filefrag -e 2>&1 | grep "invalid option") [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP" && @@ -9366,12 +9930,12 @@ test_130d() { [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] && skip "ORI-366/LU-1941: FIEMAP unimplemented on ZFS" && return - local actual_stripecnt=$($GETSTRIPE -c $fm_file) - dd if=/dev/zero of=$fm_file bs=1M count=$actual_stripecnt || + local actual_stripe_count=$($GETSTRIPE -c $fm_file) + dd if=/dev/zero of=$fm_file bs=1M count=$actual_stripe_count || error "dd failed on $fm_file" filefrag -ves $fm_file || error "filefrag $fm_file failed" - filefrag_op=$(filefrag -ve $fm_file | + filefrag_op=$(filefrag -ve -k $fm_file | sed -n '/ext:/,/found/{/ext:/d; /found/d; p}') last_lun=$(echo $filefrag_op | cut -d: -f5 | @@ -9399,7 +9963,7 @@ test_130d() { (( tot_len += ext_len )) last_lun=$frag_lun done - if (( num_luns != actual_stripecnt || tot_len != 1024 )); then + if (( num_luns != actual_stripe_count || tot_len != 1024 )); then cleanup_130 error "FIEMAP on $fm_file failed; returned wrong number of " \ "luns or wrong len for OST $last_lun" @@ -9413,8 +9977,7 @@ test_130d() { run_test 130d "FIEMAP (N-stripe file)" test_130e() { - [ "$OSTCOUNT" -lt "2" ] && - skip_env "skipping continuation FIEMAP test" && return + [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return filefrag_op=$(filefrag -e 2>&1 | grep "invalid option") [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP" && return @@ -9434,7 +9997,7 @@ test_130e() { done filefrag -ves $fm_file || error "filefrag $fm_file failed" - filefrag_op=$(filefrag -ve $fm_file | + filefrag_op=$(filefrag -ve -k $fm_file | sed -n '/ext:/,/found/{/ext:/d; /found/d; p}') last_lun=$(echo $filefrag_op | cut -d: -f5 | @@ -9476,21 +10039,47 @@ test_130e() { } run_test 130e "FIEMAP (test continuation FIEMAP calls)" +test_130f() { + filefrag_op=$(filefrag -e 2>&1 | grep "invalid option") + [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP" && + return + + local fm_file=$DIR/$tfile + $MULTIOP $fm_file oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:T33554432c || + error "multiop create with lov_delay_create on $fm_file" + + filefrag -ves $fm_file || error "filefrag $fm_file failed" + filefrag_extents=$(filefrag -vek $fm_file | + awk '/extents? found/ { print $2 }') + if [[ "$filefrag_extents" != "0" ]]; then + error "FIEMAP on $fm_file failed; " \ + "returned $filefrag_extents expected 0" + fi + + rm -f $fm_file +} +run_test 130f "FIEMAP (unstriped file)" + # Test for writev/readv test_131a() { - rwv -f $DIR/$tfile -w -n 3 524288 1048576 1572864 || \ - error "writev test failed" - rwv -f $DIR/$tfile -r -v -n 2 1572864 1048576 || \ - error "readv failed" + rwv -f $DIR/$tfile -w -n 3 524288 1048576 1572864 || + error "writev test failed" + rwv -f $DIR/$tfile -r -v -n 2 1572864 1048576 || + error "readv failed" rm -f $DIR/$tfile } run_test 131a "test iov's crossing stripe boundary for writev/readv" test_131b() { - rwv -f $DIR/$tfile -w -a -n 3 524288 1048576 1572864 || \ - error "append writev test failed" - rwv -f $DIR/$tfile -w -a -n 2 1572864 1048576 || \ - error "append writev test failed" + local fsize=$((524288 + 1048576 + 1572864)) + rwv -f $DIR/$tfile -w -a -n 3 524288 1048576 1572864 && + $CHECKSTAT -t file $DIR/$tfile -s $fsize || + error "append writev test failed" + + ((fsize += 1572864 + 1048576)) + rwv -f $DIR/$tfile -w -a -n 2 1572864 1048576 && + $CHECKSTAT -t file $DIR/$tfile -s $fsize || + error "append writev test failed" rm -f $DIR/$tfile } run_test 131b "test append writev" @@ -9624,11 +10213,11 @@ test_133c() { [ $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 - local testdir=$DIR/${tdir}/stats_testdir - test_mkdir -p ${testdir} || error "mkdir failed" + local testdir=$DIR/$tdir/stats_testdir + test_mkdir -p $testdir # verify obdfilter stats. - $SETSTRIPE -c 1 -i 0 ${testdir}/${tfile} + $SETSTRIPE -c 1 -i 0 $testdir/$tfile sync cancel_lru_locks osc wait_delete_completed @@ -9637,22 +10226,23 @@ test_133c() { do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear do_facet ost1 $LCTL set_param obdfilter.*.stats=clear - dd if=/dev/zero of=${testdir}/${tfile} conv=notrunc bs=512k count=1 || error "dd failed" + dd if=/dev/zero of=$testdir/$tfile conv=notrunc bs=512k count=1 || + error "dd failed" sync cancel_lru_locks osc check_stats ost1 "write" 1 - dd if=${testdir}/${tfile} of=/dev/null bs=1k count=1 || error "dd failed" + dd if=$testdir/$tfile of=/dev/null bs=1k count=1 || error "dd failed" check_stats ost1 "read" 1 - > ${testdir}/${tfile} || error "truncate failed" + > $testdir/$tfile || error "truncate failed" check_stats ost1 "punch" 1 - rm -f ${testdir}/${tfile} || error "file remove failed" + rm -f $testdir/$tfile || error "file remove failed" wait_delete_completed check_stats ost1 "destroy" 1 - rm -rf $DIR/${tdir} + rm -rf $DIR/$tdir } run_test 133c "Verifying OST stats ========================================" @@ -9870,10 +10460,11 @@ test_133g() { echo "proc_dirs='$proc_dirs'" [ -n "$proc_dirs" ] || error "no proc_dirs on $HOSTNAME" find $proc_dirs \ + -ignore_readdir_race \ -type f \ -not -name force_lbug \ -not -name changelog_mask \ - -exec badarea_io '{}' \; &> /dev/null || + -exec badarea_io '{}' \; || error "find $proc_dirs failed" local facet @@ -9885,10 +10476,11 @@ test_133g() { echo "${facet}_proc_dirs='$facet_proc_dirs'" [ -z "$facet_proc_dirs" ] && error "no proc_dirs on $facet" do_facet $facet find $facet_proc_dirs \ + -ignore_readdir_race \ -type f \ -not -name force_lbug \ -not -name changelog_mask \ - -exec badarea_io '{}' \\\; &> /dev/null || + -exec badarea_io '{}' \\\; || error "$facet find $facet_proc_dirs failed" done @@ -10006,32 +10598,32 @@ run_test 134b "Server rejects lock request when reaching lock_limit_mb" test_140() { #bug-17379 [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - test_mkdir -p $DIR/$tdir || error "Creating dir $DIR/$tdir" + test_mkdir $DIR/$tdir cd $DIR/$tdir || error "Changing to $DIR/$tdir" cp $(which stat) . || error "Copying stat to $DIR/$tdir" # VFS limits max symlink depth to 5(4KSTACK) or 7(8KSTACK) or 8 # For kernel > 3.5, bellow only tests consecutive symlink (MAX 40) local i=0 - while i=`expr $i + 1`; do - test_mkdir -p $i || error "Creating dir $i" - cd $i || error "Changing to $i" - ln -s ../stat stat || error "Creating stat symlink" - # Read the symlink until ELOOP present, - # not LBUGing the system is considered success, - # we didn't overrun the stack. - $OPENFILE -f O_RDONLY stat >/dev/null 2>&1; ret=$? - [ $ret -ne 0 ] && { - if [ $ret -eq 40 ]; then - break # -ELOOP - else - error "Open stat symlink" - return - fi - } - done - i=`expr $i - 1` - echo "The symlink depth = $i" + while i=$((i + 1)); do + test_mkdir $i + cd $i || error "Changing to $i" + ln -s ../stat stat || error "Creating stat symlink" + # Read the symlink until ELOOP present, + # not LBUGing the system is considered success, + # we didn't overrun the stack. + $OPENFILE -f O_RDONLY stat >/dev/null 2>&1; ret=$? + if [ $ret -ne 0 ]; then + if [ $ret -eq 40 ]; then + break # -ELOOP + else + error "Open stat symlink" + return + fi + fi + done + i=$((i - 1)) + echo "The symlink depth = $i" [ $i -eq 5 -o $i -eq 7 -o $i -eq 8 -o $i -eq 40 ] || error "Invalid symlink depth" @@ -10047,31 +10639,31 @@ test_150() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return local TF="$TMP/$tfile" - dd if=/dev/urandom of=$TF bs=6096 count=1 || error "dd failed" - cp $TF $DIR/$tfile - cancel_lru_locks osc - cmp $TF $DIR/$tfile || error "$TMP/$tfile $DIR/$tfile differ" - remount_client $MOUNT - df -P $MOUNT - cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (remount)" + dd if=/dev/urandom of=$TF bs=6096 count=1 || error "dd failed" + cp $TF $DIR/$tfile + cancel_lru_locks $OSC + cmp $TF $DIR/$tfile || error "$TMP/$tfile $DIR/$tfile differ" + remount_client $MOUNT + df -P $MOUNT + cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (remount)" - $TRUNCATE $TF 6000 - $TRUNCATE $DIR/$tfile 6000 - cancel_lru_locks osc - cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (truncate1)" + $TRUNCATE $TF 6000 + $TRUNCATE $DIR/$tfile 6000 + cancel_lru_locks $OSC + cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (truncate1)" - echo "12345" >>$TF - echo "12345" >>$DIR/$tfile - cancel_lru_locks osc - cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append1)" + echo "12345" >>$TF + echo "12345" >>$DIR/$tfile + cancel_lru_locks $OSC + cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append1)" - echo "12345" >>$TF - echo "12345" >>$DIR/$tfile - cancel_lru_locks osc - cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append2)" + echo "12345" >>$TF + echo "12345" >>$DIR/$tfile + cancel_lru_locks $OSC + cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append2)" - rm -f $TF - true + rm -f $TF + true } run_test 150 "truncate/append tests" @@ -10079,12 +10671,12 @@ run_test 150 "truncate/append tests" function roc_hit_init() { local list=$(comma_list $(osts_nodes)) local dir=$DIR/$tdir-check - local file=$dir/file + local file=$dir/$tfile local BEFORE local AFTER local idx - test_mkdir -p $dir + test_mkdir $dir #use setstripe to do a write to every ost for i in $(seq 0 $((OSTCOUNT-1))); do $SETSTRIPE -c 1 -i $i $dir || error "$SETSTRIPE $file failed" @@ -10409,6 +11001,8 @@ test_154a() { dot_lustre_fid_permission_check "$fid" $DIR || error "dot lustre permission check $fid failed" + ls -a $MOUNT | grep "\.lustre" && error ".lustre should not be listed" + rm -rf $MOUNT/.lustre && error ".lustre is not allowed to be unlinked" touch $MOUNT/.lustre/file && @@ -10602,7 +11196,8 @@ run_test 154f "get parent fids by reading link ea" test_154g() { - [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.6.92) ]] || + [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.6.92) && \ + $(lustre_version_code client) -gt $(version_code 2.6.99) ]] || { skip "Need MDS version at least 2.6.92"; return 0; } [ -n "$FILESET" ] && skip "SKIP due to FILESET set" && return @@ -10618,7 +11213,7 @@ test_155_small_load() { dd if=/dev/urandom of=$temp bs=6096 count=1 || \ error "dd of=$temp bs=6096 count=1 failed" cp $temp $file - cancel_lru_locks osc + cancel_lru_locks $OSC cmp $temp $file || error "$temp $file differ" $TRUNCATE $temp 6000 @@ -10920,9 +11515,8 @@ test_156() { log "cache hits:: before: $BEFORE, after: $AFTER" fi - rm -f $file restore_lustre_params < $p - rm -f $p + rm -f $p $file } run_test 156 "Verification of tunables" @@ -11161,6 +11755,8 @@ test_160d() { run_test 160d "verify that changelog log catch the migrate event" test_160e() { + remote_mds_nodsh && skip "remote MDS with nodsh" && return + # Create a user CL_USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \ changelog_register -n) @@ -11190,9 +11786,189 @@ test_160e() { } run_test 160e "changelog negative testing" +cleanup_160f() { + trap 0 + do_facet $SINGLEMDS $LCTL set_param fail_loc=0 fail_val=0 + echo "Deregistering changelog client $CL_USER" + do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister $CL_USER + echo "Deregistering changelog client $CL_USER2" + do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister $CL_USER2 + restore_lustre_params < $save_params + rm -f $save_params +} + +test_160f() { + # do_facet $SINGLEMDS $LCTL set_param mdd.$MDT0.changelog_gc=1 + # should be set by default + + local CL_USERS="mdd.$MDT0.changelog_users" + local GET_CL_USERS="do_facet $SINGLEMDS $LCTL get_param -n $CL_USERS" + local save_params="$TMP/sanity-$TESTNAME.parameters" + + save_lustre_params $SINGLEMDS \ + "mdd.$MDT0.changelog_max_idle_time" > $save_params + save_lustre_params $SINGLEMDS \ + "mdd.$MDT0.changelog_min_gc_interval" >> $save_params + save_lustre_params $SINGLEMDS \ + "mdd.$MDT0.changelog_min_free_cat_entries" >> $save_params + + trap cleanup_160f EXIT + + # Create a user + CL_USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \ + changelog_register -n) + echo "Registered as changelog user $CL_USER" + CL_USER2=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \ + changelog_register -n) + echo "Registered as changelog user $CL_USER2" + $GET_CL_USERS | grep -q $CL_USER || + error "User $CL_USER not found in changelog_users" + $GET_CL_USERS | grep -q $CL_USER2 || + error "User $CL_USER2 not found in changelog_users" + + # generate some changelogs to accumulate + mkdir -p $DIR/$tdir || error "mkdir $tdir failed" + touch $DIR/$tdir/$tfile || error "touch $DIR/$tdir/$tfile failed" + touch $DIR/$tdir/${tfile}2 || error "touch $DIR/$tdir/${tfile}2 failed" + rm -f $DIR/$tdir/$tfile || error "rm -f $tfile failed" + + # check changelogs have been generated + nbcl=$($LFS changelog $MDT0 | wc -l) + [[ $nbcl -eq 0 ]] && error "no changelogs found" + + do_facet $SINGLEMDS $LCTL set_param \ + mdd.$MDT0.changelog_max_idle_time=10 + do_facet $SINGLEMDS $LCTL set_param \ + mdd.$MDT0.changelog_min_gc_interval=2 + do_facet $SINGLEMDS $LCTL set_param \ + mdd.$MDT0.changelog_min_free_cat_entries=3 + + # simulate changelog catalog almost full +#define OBD_FAIL_CAT_FREE_RECORDS 0x1313 + do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1313 + do_facet $SINGLEMDS $LCTL set_param fail_val=3 + + sleep 6 + USER_REC1=$($GET_CL_USERS | awk "\$1 == \"$CL_USER\" {print \$2}") + $LFS changelog_clear $MDT0 $CL_USER $(($USER_REC1 + 2)) + USER_REC2=$($GET_CL_USERS | awk "\$1 == \"$CL_USER\" {print \$2}") + echo "verifying user clear: $(( $USER_REC1 + 2 )) == $USER_REC2" + [ $USER_REC2 == $(($USER_REC1 + 2)) ] || + error "user index expected $(($USER_REC1 + 2)) is $USER_REC2" + sleep 5 + + # generate one more changelog to trigger fail_loc + rm -rf $DIR/$tdir || error "rm -rf $tdir failed" + + # ensure gc thread is done + wait_update_facet $SINGLEMDS \ + "ps -e -o comm= | grep chlg_gc_thread" "" 20 + + # check user still registered + $GET_CL_USERS | grep -q $CL_USER || + error "User $CL_USER not found in changelog_users" + # check user2 unregistered + $GET_CL_USERS | grep -q $CL_USER2 && + error "User $CL_USER2 still found in changelog_users" + + # check changelogs are present and starting at $USER_REC2 + 1 + FIRST_REC=$($LFS changelog $MDT0 | head -n1 | awk '{print $1}') + echo "verifying min purge: $(( $USER_REC2 + 1 )) == $FIRST_REC" + [ $FIRST_REC == $(($USER_REC2 + 1)) ] || + error "first index should be $(($USER_REC2 + 1)) is $FIRST_REC" + + cleanup_160f +} +run_test 160f "changelog garbage collect (timestamped users)" + +test_160g() { + # do_facet $SINGLEMDS $LCTL set_param mdd.$MDT0.changelog_gc=1 + # should be set by default + + local CL_USERS="mdd.$MDT0.changelog_users" + local GET_CL_USERS="do_facet $SINGLEMDS $LCTL get_param -n $CL_USERS" + local save_params="$TMP/sanity-$TESTNAME.parameters" + + save_lustre_params $SINGLEMDS \ + "mdd.$MDT0.changelog_max_idle_indexes" > $save_params + save_lustre_params $SINGLEMDS \ + "mdd.$MDT0.changelog_min_gc_interval" >> $save_params + save_lustre_params $SINGLEMDS \ + "mdd.$MDT0.changelog_min_free_cat_entries" >> $save_params + + trap cleanup_160f EXIT + +#define OBD_FAIL_TIME_IN_CHLOG_USER 0x1314 + do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1314 + + # Create a user + CL_USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \ + changelog_register -n) + echo "Registered as changelog user $CL_USER" + CL_USER2=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \ + changelog_register -n) + echo "Registered as changelog user $CL_USER2" + $GET_CL_USERS | grep -q $CL_USER || + error "User $CL_USER not found in changelog_users" + $GET_CL_USERS | grep -q $CL_USER2 || + error "User $CL_USER2 not found in changelog_users" + + # generate some changelogs to accumulate + mkdir -p $DIR/$tdir || error "mkdir $tdir failed" + touch $DIR/$tdir/$tfile || error "touch $DIR/$tdir/$tfile failed" + touch $DIR/$tdir/${tfile}2 || error "touch $DIR/$tdir/${tfile}2 failed" + rm -f $DIR/$tdir/$tfile || error "rm -f $tfile failed" + + # check changelogs have been generated + nbcl=$($LFS changelog $MDT0 | wc -l) + [[ $nbcl -eq 0 ]] && error "no changelogs found" + + do_facet $SINGLEMDS $LCTL set_param \ + mdd.$MDT0.changelog_max_idle_indexes=$((nbcl - 1)) + do_facet $SINGLEMDS $LCTL set_param \ + mdd.$MDT0.changelog_min_gc_interval=2 + do_facet $SINGLEMDS $LCTL set_param \ + mdd.$MDT0.changelog_min_free_cat_entries=3 + + # simulate changelog catalog almost full +#define OBD_FAIL_CAT_FREE_RECORDS 0x1313 + do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1313 + do_facet $SINGLEMDS $LCTL set_param fail_val=3 + + USER_REC1=$($GET_CL_USERS | awk "\$1 == \"$CL_USER\" {print \$2}") + $LFS changelog_clear $MDT0 $CL_USER $(($USER_REC1 + 3)) + USER_REC2=$($GET_CL_USERS | awk "\$1 == \"$CL_USER\" {print \$2}") + echo "verifying user clear: $(( $USER_REC1 + 3 )) == $USER_REC2" + [ $USER_REC2 == $(($USER_REC1 + 3)) ] || + error "user index expected $(($USER_REC1 + 3)) is $USER_REC2" + + # generate one more changelog to trigger fail_loc + rm -rf $DIR/$tdir || error "rm -rf $tdir failed" + + # ensure gc thread is done + wait_update_facet $SINGLEMDS \ + "ps -e -o comm= | grep chlg_gc_thread" "" 20 + + # check user still registered + $GET_CL_USERS | grep -q $CL_USER || + error "User $CL_USER not found in changelog_users" + # check user2 unregistered + $GET_CL_USERS | grep -q $CL_USER2 && + error "User $CL_USER2 still found in changelog_users" + + # check changelogs are present and starting at $USER_REC2 + 1 + FIRST_REC=$($LFS changelog $MDT0 | head -n1 | awk '{print $1}') + echo "verifying min purge: $(( $USER_REC2 + 1 )) == $FIRST_REC" + [ $FIRST_REC == $(($USER_REC2 + 1)) ] || + error "first index should be $(($USER_REC2 + 1)) is $FIRST_REC" + + cleanup_160f +} +run_test 160g "changelog garbage collect (old users)" + test_161a() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - test_mkdir -p -c1 $DIR/$tdir + test_mkdir -c1 $DIR/$tdir cp /etc/hosts $DIR/$tdir/$tfile test_mkdir -c1 $DIR/$tdir/foo1 test_mkdir -c1 $DIR/$tdir/foo2 @@ -11564,16 +12340,17 @@ run_test 169 "parallel read and truncate should not deadlock" test_170() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - $LCTL clear # bug 18514 - $LCTL debug_daemon start $TMP/${tfile}_log_good - touch $DIR/$tfile - $LCTL debug_daemon stop - sed -e "s/^...../a/g" $TMP/${tfile}_log_good > $TMP/${tfile}_log_bad || - error "sed failed to read log_good" - $LCTL debug_daemon start $TMP/${tfile}_log_good - rm -rf $DIR/$tfile - $LCTL debug_daemon stop + $LCTL clear # bug 18514 + $LCTL debug_daemon start $TMP/${tfile}_log_good + touch $DIR/$tfile + $LCTL debug_daemon stop + sed -e "s/^...../a/g" $TMP/${tfile}_log_good > $TMP/${tfile}_log_bad || + error "sed failed to read log_good" + + $LCTL debug_daemon start $TMP/${tfile}_log_good + rm -rf $DIR/$tfile + $LCTL debug_daemon stop $LCTL df $TMP/${tfile}_log_bad > $TMP/${tfile}_log_bad.out 2>&1 || error "lctl df log_bad failed" @@ -11764,7 +12541,7 @@ test_180c() { # LU-2598 run_test 180c "test huge bulk I/O size on obdfilter, don't LASSERT" test_181() { # bug 22177 - test_mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir" + test_mkdir $DIR/$tdir # create enough files to index the directory createmany -o $DIR/$tdir/foobar 4000 # print attributes for debug purpose @@ -11841,7 +12618,7 @@ test_184a() { check_swap_layouts_support && return 0 dir0=$DIR/$tdir/$testnum - test_mkdir -p -c1 $dir0 || error "creating dir $dir0" + test_mkdir -p -c1 $dir0 ref1=/etc/passwd ref2=/etc/group file1=$dir0/f1 @@ -11863,6 +12640,8 @@ test_184a() { cmp $ref1 $file2 || error "content compare failed ($ref1 != $file2)" cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)" + + lfsck_verify_pfid $file1 $file2 || error "PFID are not transferred" } run_test 184a "Basic layout swap" @@ -12108,8 +12887,12 @@ test_200() { local test_path=$POOL_ROOT/$POOL_DIR_NAME local file_dir=$POOL_ROOT/file_tst local subdir=$test_path/subdir - local rc=0 + + if ! combined_mgs_mds ; then + mount_mgs_client + fi + while : ; do # former test_200a test_200b pool_add $POOL || { rc=$? ; break; } @@ -12129,7 +12912,7 @@ test_200() { pool_create_files $POOL $file_dir $files "$ost_list" \ || { rc=$? ; break; } # former test_200g test_200h - pool_lfs_df $POOL || { rc=$? ; break; } + pool_lfs_df $POOL || { rc=$? ; break; } pool_file_rel_path $POOL $test_path || { rc=$? ; break; } # former test_201a test_201b test_201c @@ -12137,11 +12920,15 @@ test_200() { local f=$test_path/$tfile pool_remove_all_targets $POOL $f || { rc=$? ; break; } - pool_remove $POOL $f || { rc=$? ; break; } + pool_remove $POOL $f || { rc=$? ; break; } break done destroy_test_pools + + if ! combined_mgs_mds ; then + umount_mgs_client + fi return $rc } run_test 200 "OST pools" @@ -12155,109 +12942,93 @@ default_attr() { check_default_stripe_attr() { ACTUAL=$($GETSTRIPE $* $DIR/$tdir) case $1 in - --stripe-count|--count) + --stripe-count|-c) [ -n "$2" ] && EXPECTED=0 || EXPECTED=$(default_attr count);; - --stripe-size|--size) + --stripe-size|-S) [ -n "$2" ] && EXPECTED=0 || EXPECTED=$(default_attr size);; - --stripe-index|--index) + --stripe-index|-i) EXPECTED=-1;; *) error "unknown getstripe attr '$1'" esac - [ $ACTUAL != $EXPECTED ] && + [ $ACTUAL == $EXPECTED ] || error "$DIR/$tdir has $1 '$ACTUAL', not '$EXPECTED'" } test_204a() { - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir $SETSTRIPE --stripe-count 0 --stripe-size 0 --stripe-index -1 $DIR/$tdir check_default_stripe_attr --stripe-count check_default_stripe_attr --stripe-size check_default_stripe_attr --stripe-index - - return 0 } -run_test 204a "Print default stripe attributes =================" +run_test 204a "Print default stripe attributes" test_204b() { - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir $SETSTRIPE --stripe-count 1 $DIR/$tdir check_default_stripe_attr --stripe-size check_default_stripe_attr --stripe-index - - return 0 } -run_test 204b "Print default stripe size and offset ===========" +run_test 204b "Print default stripe size and offset" test_204c() { - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir $SETSTRIPE --stripe-size 65536 $DIR/$tdir check_default_stripe_attr --stripe-count check_default_stripe_attr --stripe-index - - return 0 } -run_test 204c "Print default stripe count and offset ===========" +run_test 204c "Print default stripe count and offset" test_204d() { - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir $SETSTRIPE --stripe-index 0 $DIR/$tdir check_default_stripe_attr --stripe-count check_default_stripe_attr --stripe-size - - return 0 } -run_test 204d "Print default stripe count and size =============" +run_test 204d "Print default stripe count and size" test_204e() { - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir $SETSTRIPE -d $DIR/$tdir check_default_stripe_attr --stripe-count --raw check_default_stripe_attr --stripe-size --raw check_default_stripe_attr --stripe-index --raw - - return 0 } -run_test 204e "Print raw stripe attributes =================" +run_test 204e "Print raw stripe attributes" test_204f() { - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir $SETSTRIPE --stripe-count 1 $DIR/$tdir check_default_stripe_attr --stripe-size --raw check_default_stripe_attr --stripe-index --raw - - return 0 } -run_test 204f "Print raw stripe size and offset ===========" +run_test 204f "Print raw stripe size and offset" test_204g() { - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir $SETSTRIPE --stripe-size 65536 $DIR/$tdir check_default_stripe_attr --stripe-count --raw check_default_stripe_attr --stripe-index --raw - - return 0 } -run_test 204g "Print raw stripe count and offset ===========" +run_test 204g "Print raw stripe count and offset" test_204h() { - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir $SETSTRIPE --stripe-index 0 $DIR/$tdir check_default_stripe_attr --stripe-count --raw check_default_stripe_attr --stripe-size --raw - - return 0 } -run_test 204h "Print raw stripe count and size =============" +run_test 204h "Print raw stripe count and size" # Figure out which job scheduler is being used, if any, # or use a fake one @@ -12598,16 +13369,12 @@ run_test 214 "hash-indexed directory test - bug 20133" # having "abc" as 1st arg, creates $TMP/lnet_abc.out and $TMP/lnet_abc.sys create_lnet_proc_files() { - lctl get_param -n $1 >$TMP/lnet_$1.out || error "cannot read lnet.$1" - sysctl lnet.$1 >$TMP/lnet_$1.sys_tmp || error "cannot read lnet.$1" - - sed "s/^lnet.$1\ =\ //g" "$TMP/lnet_$1.sys_tmp" >$TMP/lnet_$1.sys - rm -f "$TMP/lnet_$1.sys_tmp" + lctl get_param -n $1 >$TMP/lnet_$1.sys || error "cannot read lnet.$1" } # counterpart of create_lnet_proc_files remove_lnet_proc_files() { - rm -f $TMP/lnet_$1.out $TMP/lnet_$1.sys + rm -f $TMP/lnet_$1.sys } # uses 1st arg as trailing part of filename, 2nd arg as description for reports, @@ -12717,7 +13484,6 @@ test_215() { # for bugs 18102, 21079, 21517 # can we successfully write to lnet.stats? lctl set_param -n stats=0 || error "cannot write to lnet.stats" - sysctl -w lnet.stats=0 || error "cannot write to lnet.stats" } run_test 215 "lnet exists and has proper content - bugs 18102, 21079, 21517" @@ -12773,8 +13539,8 @@ test_217() { # bug 22430 for node in $(nodes_list); do nid=$(host_nids_address $node $NETTYPE) if [[ $nid = *-* ]] ; then - echo "lctl ping $nid@$NETTYPE" - lctl ping $nid@$NETTYPE + echo "lctl ping $(h2nettype $nid)" + lctl ping $(h2nettype $nid) else echo "skipping $node (no hyphen detected)" fi @@ -12840,6 +13606,10 @@ test_220() { #LU-325 $LFS df -i + if ! combined_mgs_mds ; then + mount_mgs_client + fi + do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=-1 #define OBD_FAIL_OST_ENOINO 0x229 do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0x229 @@ -12870,10 +13640,16 @@ test_220() { #LU-325 do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=0 do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0 - do_facet mgs $LCTL pool_remove $FSNAME.$TESTNAME $OST || return 4 - do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME || return 5 + do_facet mgs $LCTL pool_remove $FSNAME.$TESTNAME $OST || + error "$LCTL pool_remove $FSNAME.$TESTNAME $OST failed" + do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME || + error "$LCTL pool_destroy $FSNAME.$TESTNAME failed" echo "unlink $MDSOBJS files @$next_id..." - unlinkmany $DIR/$tdir/f $MDSOBJS || return 6 + unlinkmany $DIR/$tdir/f $MDSOBJS || error "unlinkmany failed" + + if ! combined_mgs_mds ; then + umount_mgs_client + fi } run_test 220 "preallocated MDS objects still used if ENOSPC from OST" @@ -12892,25 +13668,25 @@ run_test 221 "make sure fault and truncate race to not cause OOM" test_222a () { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - rm -rf $DIR/$tdir - test_mkdir -p $DIR/$tdir - $SETSTRIPE -c 1 -i 0 $DIR/$tdir - createmany -o $DIR/$tdir/$tfile 10 - cancel_lru_locks mdc - cancel_lru_locks osc - #define OBD_FAIL_LDLM_AGL_DELAY 0x31a - $LCTL set_param fail_loc=0x31a - ls -l $DIR/$tdir > /dev/null || error "AGL for ls failed" - $LCTL set_param fail_loc=0 - rm -r $DIR/$tdir -} -run_test 222a "AGL for ls should not trigger CLIO lock failure ================" + rm -rf $DIR/$tdir + test_mkdir $DIR/$tdir + $LFS setstripe -c 1 -i 0 $DIR/$tdir + createmany -o $DIR/$tdir/$tfile 10 + cancel_lru_locks mdc + cancel_lru_locks osc + #define OBD_FAIL_LDLM_AGL_DELAY 0x31a + $LCTL set_param fail_loc=0x31a + ls -l $DIR/$tdir > /dev/null || error "AGL for ls failed" + $LCTL set_param fail_loc=0 + rm -r $DIR/$tdir +} +run_test 222a "AGL for ls should not trigger CLIO lock failure" test_222b () { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return rm -rf $DIR/$tdir - test_mkdir -p $DIR/$tdir - $SETSTRIPE -c 1 -i 0 $DIR/$tdir + test_mkdir $DIR/$tdir + $LFS setstripe -c 1 -i 0 $DIR/$tdir createmany -o $DIR/$tdir/$tfile 10 cancel_lru_locks mdc cancel_lru_locks osc @@ -12919,21 +13695,21 @@ test_222b () { rm -r $DIR/$tdir || error "AGL for rmdir failed" $LCTL set_param fail_loc=0 } -run_test 222b "AGL for rmdir should not trigger CLIO lock failure =============" +run_test 222b "AGL for rmdir should not trigger CLIO lock failure" test_223 () { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - rm -rf $DIR/$tdir - test_mkdir -p $DIR/$tdir - $SETSTRIPE -c 1 -i 0 $DIR/$tdir - createmany -o $DIR/$tdir/$tfile 10 - cancel_lru_locks mdc - cancel_lru_locks osc - #define OBD_FAIL_LDLM_AGL_NOLOCK 0x31b - $LCTL set_param fail_loc=0x31b - ls -l $DIR/$tdir > /dev/null || error "reenqueue failed" - $LCTL set_param fail_loc=0 - rm -r $DIR/$tdir + rm -rf $DIR/$tdir + test_mkdir $DIR/$tdir + $LFS setstripe -c 1 -i 0 $DIR/$tdir + createmany -o $DIR/$tdir/$tfile 10 + cancel_lru_locks mdc + cancel_lru_locks osc + #define OBD_FAIL_LDLM_AGL_NOLOCK 0x31b + $LCTL set_param fail_loc=0x31b + ls -l $DIR/$tdir > /dev/null || error "reenqueue failed" + $LCTL set_param fail_loc=0 + rm -r $DIR/$tdir } run_test 223 "osc reenqueue if without AGL lock granted =======================" @@ -13045,8 +13821,6 @@ test_225b () { skip_env "Need to mount OST to test" && return fi - [ $MDSCOUNT -ge 2 ] && - skip "skipping now for more than one MDT" && return local mds=$(facet_host $SINGLEMDS) local target=$(do_nodes $mds 'lctl dl' | \ awk "{if (\$2 == \"UP\" && \$3 == \"mdt\") {print \$4}}") @@ -13148,7 +13922,7 @@ test_228a() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return remote_mds_nodsh && skip "remote MDS with nodsh" && return [ "$(facet_fstype $SINGLEMDS)" != "ldiskfs" ] && - skip "non-ldiskfs backend" && return + skip "ldiskfs only test" && return local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/}) local myDIR=$DIR/$tdir @@ -13190,7 +13964,7 @@ test_228b() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return remote_mds_nodsh && skip "remote MDS with nodsh" && return [ "$(facet_fstype $SINGLEMDS)" != "ldiskfs" ] && - skip "non-ldiskfs backend" && return + skip "ldiskfs only test" && return local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/}) local myDIR=$DIR/$tdir @@ -13240,7 +14014,7 @@ test_228c() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return remote_mds_nodsh && skip "remote MDS with nodsh" && return [ "$(facet_fstype $SINGLEMDS)" != "ldiskfs" ] && - skip "non-ldiskfs backend" && return + skip "ldiskfs only test" && return local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/}) local myDIR=$DIR/$tdir @@ -13298,7 +14072,7 @@ test_229() { # LU-2482, LU-3448 $GETSTRIPE -v $DIR/$tfile local pattern=$($GETSTRIPE -L $DIR/$tfile) - [ X"$pattern" = X"80000001" ] || error "pattern error ($pattern)" + [ X"$pattern" = X"released" ] || error "pattern error ($pattern)" local stripe_count=$($GETSTRIPE -c $DIR/$tfile) || error "getstripe" [ $stripe_count -eq 2 ] || error "stripe count not 2 ($stripe_count)" @@ -13742,8 +14516,12 @@ test_231a() # is the same across all OSCs local max_pages=$($LCTL get_param -n osc.*.max_pages_per_rpc | head -n1) local bulk_size=$((max_pages * 4096)) + local brw_size=$(do_facet ost1 $LCTL get_param -n obdfilter.*.brw_size | + head -n 1) mkdir -p $DIR/$tdir + $LFS setstripe -S ${brw_size}M $DIR/$tdir || + error "failed to set stripe with -S ${brw_size}M option" # clear the OSC stats $LCTL set_param osc.*.stats=0 &>/dev/null @@ -13791,19 +14569,44 @@ test_231b() { } run_test 231b "must not assert on fully utilized OST request buffer" -test_232() { +test_232a() { mkdir -p $DIR/$tdir + $LFS setstripe -c1 -i0 $DIR/$tdir/$tfile + #define OBD_FAIL_LDLM_OST_LVB 0x31c - $LCTL set_param fail_loc=0x31c + do_facet ost1 $LCTL set_param fail_loc=0x31c # ignore dd failure dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1 || true - $LCTL set_param fail_loc=0 + do_facet ost1 $LCTL set_param fail_loc=0 umount_client $MOUNT || error "umount failed" mount_client $MOUNT || error "mount failed" + stop ost1 || error "cannot stop ost1" + start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1" } -run_test 232 "failed lock should not block umount" +run_test 232a "failed lock should not block umount" + +test_232b() { + mkdir -p $DIR/$tdir + $LFS setstripe -c1 -i0 $DIR/$tdir/$tfile + dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1 + sync + cancel_lru_locks osc + + #define OBD_FAIL_LDLM_OST_LVB 0x31c + do_facet ost1 $LCTL set_param fail_loc=0x31c + + # ignore failure + $LFS data_version $DIR/$tdir/$tfile || true + + do_facet ost1 $LCTL set_param fail_loc=0 + umount_client $MOUNT || error "umount failed" + mount_client $MOUNT || error "mount failed" + stop ost1 || error "cannot stop ost1" + start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1" +} +run_test 232b "failed data version lock should not block umount" test_233a() { [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.3.64) ] || @@ -13841,17 +14644,8 @@ test_234() { touch $DIR/$tdir/$tfile || error "touch failed" # OBD_FAIL_LLITE_XATTR_ENOMEM $LCTL set_param fail_loc=0x1405 - # output of the form: attr 2 4 44 3 fc13 x86_64 - V=($(IFS=".-" rpm -q attr)) - if [[ ${V[1]} > 2 || ${V[2]} > 4 || ${V[3]} > 44 || - ${V[1]} = 2 && ${V[2]} = 4 && ${V[3]} = 44 && ${V[4]} > 6 ]]; then - # attr pre-2.4.44-7 had a bug with rc - # LU-3703 - SLES 11 and FC13 clients have older attr - getfattr -n user.attr $DIR/$tdir/$tfile && - error "getfattr should have failed with ENOMEM" - else - skip "LU-3703: attr version $(getfattr --version) too old" - fi + getfattr -n user.attr $DIR/$tdir/$tfile && + error "getfattr should have failed with ENOMEM" $LCTL set_param fail_loc=0x0 rm -rf $DIR/$tdir @@ -13879,7 +14673,7 @@ run_test 235 "LU-1715: flock deadlock detection does not work properly" #LU-2935 test_236() { check_swap_layouts_support && return 0 - test_mkdir -p -c1 $DIR/$tdir || error "mkdir $tdir failed" + test_mkdir -c1 $DIR/$tdir local ref1=/etc/passwd local ref2=/etc/group @@ -13949,9 +14743,10 @@ test_239() { mkdir -p $DIR/$tdir createmany -o $DIR/$tdir/f- 5000 unlinkmany $DIR/$tdir/f- 5000 - do_nodes $list "lctl set_param -n osp*.*.sync_changes 1" - changes=$(do_nodes $list "lctl get_param -n osc.*MDT*.sync_changes \ - osc.*MDT*.sync_in_flight" | calc_sum) + [ $(lustre_version_code $SINGLEMDS) -gt $(version_code 2.10.53) ] && + do_nodes $list "lctl set_param -n osp.*.force_sync=1" + changes=$(do_nodes $list "lctl get_param -n osp.*MDT*.sync_changes \ + osp.*MDT*.sync_in_flight" | calc_sum) [ "$changes" -eq 0 ] || error "$changes not synced" } run_test 239 "osp_sync test" @@ -14004,7 +14799,7 @@ run_test 240 "race between ldlm enqueue and the connection RPC (no ASSERT)" test_241_bio() { for LOOP in $(seq $1); do dd if=$DIR/$tfile of=/dev/null bs=40960 count=1 2>/dev/null - cancel_lru_locks osc || true + cancel_lru_locks $OSC || true done } @@ -14018,7 +14813,7 @@ test_241_dio() { test_241a() { # was test_241 dd if=/dev/zero of=$DIR/$tfile count=1 bs=40960 ls -la $DIR/$tfile - cancel_lru_locks osc + cancel_lru_locks $OSC test_241_bio 1000 & PID=$! test_241_dio 1000 @@ -14052,14 +14847,14 @@ run_test 242 "mdt_readpage failure should not cause directory unreadable" test_243() { - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir group_lock_test -d $DIR/$tdir || error "A group lock test failed" } run_test 243 "various group lock tests" test_244() { - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=35 sendfile_grouplock $DIR/$tdir/$tfile || \ error "sendfile+grouplock failed" @@ -14106,6 +14901,14 @@ test_246() { # LU-7371 } run_test 246 "Read file of size 4095 should return right length" +cleanup_247() { + local submount=$1 + + trap 0 + umount_client $submount + rmdir $submount +} + test_247a() { lctl get_param -n mdc.$FSNAME-MDT0000*.import | grep -q subtree || @@ -14117,11 +14920,11 @@ test_247a() { mkdir -p $submount || error "mkdir $submount failed" FILESET="$FILESET/$tdir" mount_client $submount || error "mount $submount failed" + trap "cleanup_247 $submount" EXIT echo foo > $submount/$tfile || error "write $submount/$tfile failed" [ $(cat $MOUNT/$tdir/$tfile) = "foo" ] || error "read $MOUNT/$tdir/$tfile failed" - umount_client $submount || error "umount $submount failed" - rmdir $submount + cleanup_247 $submount } run_test 247a "mount subdir as fileset" @@ -14148,12 +14951,12 @@ test_247c() { mkdir -p $MOUNT/$tdir/dir1 mkdir -p $submount || error "mkdir $submount failed" + trap "cleanup_247 $submount" EXIT FILESET="$FILESET/$tdir" mount_client $submount || error "mount $submount failed" local fid=$($LFS path2fid $MOUNT/) $LFS fid2path $submount $fid && error "fid2path should fail" - umount_client $submount || error "umount $submount failed" - rmdir $submount + cleanup_247 $submount } run_test 247c "running fid2path outside root" @@ -14167,10 +14970,10 @@ test_247d() { mkdir -p $submount || error "mkdir $submount failed" FILESET="$FILESET/$tdir" mount_client $submount || error "mount $submount failed" + trap "cleanup_247 $submount" EXIT local fid=$($LFS path2fid $submount/dir1) $LFS fid2path $submount $fid || error "fid2path should succeed" - umount_client $submount || error "umount $submount failed" - rmdir $submount + cleanup_247 $submount } run_test 247d "running fid2path inside root" @@ -14206,12 +15009,13 @@ test_248() { # small read with fast read enabled $LCTL set_param -n llite.*.fast_read=1 local t_fast=$(dd if=$DIR/$tfile of=/dev/null bs=4k 2>&1 | - awk '/copied/ { print $6 }') - + egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 | + sed -e 's/,/./' -e 's/[eE]+*/\*10\^/') # small read with fast read disabled $LCTL set_param -n llite.*.fast_read=0 local t_slow=$(dd if=$DIR/$tfile of=/dev/null bs=4k 2>&1 | - awk '/copied/ { print $6 }') + egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 | + sed -e 's/,/./' -e 's/[eE]+*/\*10\^/') # verify that fast read is 4 times faster for cache read [ $(bc <<< "4 * $t_fast < $t_slow") -eq 1 ] || @@ -14224,12 +15028,14 @@ test_248() { # 1k non-cache read cancel_lru_locks osc local t_1k=$(dd if=$DIR/$tfile of=/dev/null bs=1k 2>&1 | - awk '/copied/ { print $6 }') + egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 | + sed -e 's/,/./' -e 's/[eE]+*/\*10\^/') # 1M non-cache read cancel_lru_locks osc local t_1m=$(dd if=$DIR/$tfile of=/dev/null bs=1k 2>&1 | - awk '/copied/ { print $6 }') + egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 | + sed -e 's/,/./' -e 's/[eE]+*/\*10\^/') # verify that big IO is not 4 times faster than small IO [ $(bc <<< "4 * $t_1k >= $t_1m") -eq 1 ] || @@ -14296,7 +15102,7 @@ test_252() { remote_ost_nodsh && skip "remote OST with nodsh" && return if [ "$(facet_fstype ost1)" != "ldiskfs" -o \ "$(facet_fstype mds1)" != "ldiskfs" ]; then - skip "can only run lr_reader on ldiskfs target" + skip "ldiskfs only test" return fi @@ -14392,6 +15198,9 @@ test_253() { osp.$mdtosc_proc1.reserved_mb_low) echo "prev high watermark $last_wm_h, prev low watermark $last_wm_l" + if ! combined_mgs_mds ; then + mount_mgs_client + fi create_pool $FSNAME.$TESTNAME || error "Pool creation failed" do_facet mgs $LCTL pool_add $FSNAME.$TESTNAME $ost_name || error "Adding $ost_name to pool failed" @@ -14456,6 +15265,10 @@ test_253() { error "Remove $ost_name from pool failed" do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME || error "Pool destroy fialed" + + if ! combined_mgs_mds ; then + umount_mgs_client + fi } run_test 253 "Check object allocation limit" @@ -14595,7 +15408,7 @@ ladvise_willread_performance() local lowest_speedup=20 if [ ${average_cache%.*} -lt $lowest_speedup ]; then - echo "Speedup with OSS cached read less than $lowest_speedup%, " + echo "Speedup with OSS cached read less than $lowest_speedup%," \ "got $average_cache%. Skipping ladvise willread check." return 0 fi @@ -14616,6 +15429,7 @@ ladvise_willread_performance() test_255a() { [ $(lustre_version_code ost1) -lt $(version_code 2.8.54) ] && skip "lustre < 2.8.54 does not support ladvise " && return + remote_ost_nodsh && skip "remote OST with nodsh" && return lfs setstripe -c -1 -i 0 $DIR/$tfile || error "$tfile failed" @@ -14700,6 +15514,8 @@ facet_meminfo() { } test_255b() { + remote_ost_nodsh && skip "remote OST with nodsh" && return + lfs setstripe -c 1 -i 0 $DIR/$tfile ladvise_no_type dontneed $DIR/$tfile && @@ -14758,6 +15574,91 @@ test_255b() { } run_test 255b "check 'lfs ladvise -a dontneed'" +test_255c() { + local count + local new_count + local difference + local i + local rc + + [ $(lustre_version_code ost1) -lt $(version_code 2.10.50) ] && + skip "lustre < 2.10.53 does not support lockahead" && return + + test_mkdir -p $DIR/$tdir + $SETSTRIPE -i 0 $DIR/$tdir + + #test 10 returns only success/failure + i=10 + lockahead_test -d $DIR/$tdir -t $i + rc=$? + if [ $rc -eq 255 ]; then + error "Ladvise test${i} failed, ${rc}" + fi + + #test 11 counts lock enqueue requests, all others count new locks + i=11 + count=$(do_facet ost1 \ + $LCTL get_param -n ost.OSS.ost.stats) + count=$(echo "$count" | grep ldlm_extent_enqueue | awk '{ print $2 }') + + lockahead_test -d $DIR/$tdir -t $i + rc=$? + if [ $rc -eq 255 ]; then + error "Ladvise test${i} failed, ${rc}" + fi + + new_count=$(do_facet ost1 \ + $LCTL get_param -n ost.OSS.ost.stats) + new_count=$(echo "$new_count" | grep ldlm_extent_enqueue | \ + awk '{ print $2 }') + + difference="$((new_count - count))" + if [ $difference -ne $rc ]; then + error "Ladvise test${i}, bad enqueue count, returned " \ + "${rc}, actual ${difference}" + fi + + for i in $(seq 12 21); do + # If we do not do this, we run the risk of having too many + # locks and starting lock cancellation while we are checking + # lock counts. + cancel_lru_locks osc + + count=$($LCTL get_param -n \ + ldlm.namespaces.$FSNAME-OST0000*osc-f*.lock_unused_count) + + lockahead_test -d $DIR/$tdir -t $i + rc=$? + if [ $rc -eq 255 ]; then + error "Ladvise test ${i} failed, ${rc}" + fi + + new_count=$($LCTL get_param -n \ + ldlm.namespaces.$FSNAME-OST0000*osc-f*.lock_unused_count) + difference="$((new_count - count))" + + # Test 15 output is divided by 100 to map down to valid return + if [ $i -eq 15 ]; then + rc="$((rc * 100))" + fi + + if [ $difference -ne $rc ]; then + error "Ladvise test ${i}, bad lock count, returned " \ + "${rc}, actual ${difference}" + fi + done + + #test 22 returns only success/failure + i=22 + lockahead_test -d $DIR/$tdir -t $i + rc=$? + if [ $rc -eq 255 ]; then + error "Ladvise test${i} failed, ${rc}" + fi + +} +run_test 255c "suite of ladvise lockahead tests" + test_256() { local cl_user local cat_sl @@ -14766,7 +15667,7 @@ test_256() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return remote_mds_nodsh && skip "remote MDS with nodsh" && return [ "$(facet_fstype mds1)" != "ldiskfs" ] && - skip "non-ldiskfs backend" && return + skip "ldiskfs only test" && return mdt_dev=$(mdsdevname 1) echo $mdt_dev @@ -14796,9 +15697,12 @@ test_256() { #after mount new plainllog is used touch $DIR/$tdir/{11..19} + do_facet mds1 sync + local TEMP256FILE=$(mktemp -u TEMP256XXXXXX) cat_sl=$(do_facet mds1 \ - "$DEBUGFS -R \\\"dump changelog_catalog cat.dmp\\\" $mdt_dev; \ - llog_reader cat.dmp | grep \\\"type=1064553b\\\" | wc -l") + "$DEBUGFS -R \\\"dump changelog_catalog $TEMP256FILE\\\" $mdt_dev; \ + llog_reader $TEMP256FILE | grep \\\"type=1064553b\\\" | wc -l") + do_facet mds1 rm $TEMP256FILE if (( cat_sl != 2 )); then do_facet mds1 $LCTL --device $MDT0 changelog_deregister $cl_user @@ -14807,9 +15711,12 @@ test_256() { $LFS changelog_clear $MDT0 $cl_user 0 + do_facet mds1 sync + TEMP256FILE=$(mktemp -u TEMP256XXXXXX) cat_sl=$(do_facet mds1 \ - "$DEBUGFS -R \\\"dump changelog_catalog cat.dmp\\\" $mdt_dev; \ - llog_reader cat.dmp | grep \\\"type=1064553b\\\" | wc -l") + "$DEBUGFS -R \\\"dump changelog_catalog $TEMP256FILE\\\" $mdt_dev; \ + llog_reader $TEMP256FILE | grep \\\"type=1064553b\\\" | wc -l") + do_facet mds1 rm $TEMP256FILE do_facet mds1 $LCTL --device $MDT0 changelog_deregister $cl_user @@ -14827,7 +15734,7 @@ test_257() { [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.8.55) ]] && skip "Need MDS version at least 2.8.55" && return - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir setfattr -n trusted.name1 -v value1 $DIR/$tdir || error "setfattr -n trusted.name1=value1 $DIR/$tdir failed" @@ -14845,6 +15752,39 @@ test_257() { } run_test 257 "xattr locks are not lost" +# Verify we take the i_mutex when security requires it +test_258a() { +#define OBD_FAIL_IMUTEX_SEC 0x141c + $LCTL set_param fail_loc=0x141c + touch $DIR/$tfile + chmod u+s $DIR/$tfile + chmod a+rwx $DIR/$tfile + $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 oflag=append + RC=$? + if [ $RC -ne 0 ]; then + error "error, failed to take i_mutex, rc=$?" + fi + rm -f $DIR/$tfile +} +run_test 258a + +# Verify we do NOT take the i_mutex in the normal case +test_258b() { +#define OBD_FAIL_IMUTEX_NOSEC 0x141d + $LCTL set_param fail_loc=0x141d + touch $DIR/$tfile + chmod a+rwx $DIR + chmod a+rw $DIR/$tfile + $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 oflag=append + RC=$? + if [ $RC -ne 0 ]; then + error "error, took i_mutex unnecessarily, rc=$?" + fi + rm -f $DIR/$tfile + +} +run_test 258b "verify i_mutex security behavior" + test_260() { #define OBD_FAIL_MDC_CLOSE 0x806 $LCTL set_param fail_loc=0x80000806 @@ -14853,6 +15793,401 @@ test_260() { } run_test 260 "Check mdc_close fail" +### Data-on-MDT sanity tests ### +test_270a() { + + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] && + skip "Need MDS version at least 2.10.55" && return + + # create DoM file + local dom=$DIR/$tdir/dom_file + local tmp=$DIR/$tdir/tmp_file + + mkdir -p $DIR/$tdir + + # basic checks for DoM component creation + $LFS setstripe -E 1024K -E 1024K -L mdt $dom 2>/dev/null && + error "Can set MDT layout to non-first entry" + + $LFS setstripe -E 1024K -L mdt -E 1024K -L mdt $dom 2>/dev/null && + error "Can define multiple entries as MDT layout" + + $LFS setstripe -E 1M -L mdt $dom || + error "Can't create DoM layout" + + [ $($LFS getstripe -L $dom) == "mdt" ] || error "bad pattern" + [ $($LFS getstripe -c $dom) == 0 ] || error "bad stripe count" + [ $($LFS getstripe -S $dom) == 1048576 ] || error "bad stripe size" + + local mdtidx=$($GETSTRIPE -M $dom) + local mdtname=MDT$(printf %04x $mdtidx) + local facet=mds$((mdtidx + 1)) + local space_check=1 + + # Skip free space checks with ZFS + if [ "$(facet_fstype $facet)" == "zfs" ]; then + space_check=0 + fi + + # write + sync + local mdtfree1=$(do_facet $facet \ + lctl get_param -n osd*.*$mdtname.kbytesfree) + dd if=/dev/urandom of=$tmp bs=1024 count=100 + # check also direct IO along write + dd if=$tmp of=$dom bs=102400 count=1 oflag=direct + sync + cmp $tmp $dom || error "file data is different" + [ $(stat -c%s $dom) == 102400 ] || error "bad size after write" + if [ $space_check == 1 ]; then + local mdtfree2=$(do_facet $facet \ + lctl get_param -n osd*.*$mdtname.kbytesfree) + [ $(($mdtfree1 - $mdtfree2)) -ge 102 ] || + error "MDT free space is wrong after write" + fi + + # truncate + $TRUNCATE $dom 10000 + [ $(stat -c%s $dom) == 10000 ] || error "bad size after truncate" + if [ $space_check == 1 ]; then + mdtfree1=$(do_facet $facet \ + lctl get_param -n osd*.*$mdtname.kbytesfree) + [ $(($mdtfree1 - $mdtfree2)) -ge 92 ] || + error "MDT free space is wrong after truncate" + fi + + # append + cat $tmp >> $dom + sync + [ $(stat -c%s $dom) == 112400 ] || error "bad size after append" + if [ $space_check == 1 ]; then + mdtfree2=$(do_facet $facet \ + lctl get_param -n osd*.*$mdtname.kbytesfree) + [ $(($mdtfree1 - $mdtfree2)) -ge 102 ] || + error "MDT free space is wrong after append" + fi + + # delete + rm $dom + if [ $space_check == 1 ]; then + mdtfree1=$(do_facet $facet \ + lctl get_param -n osd*.*$mdtname.kbytesfree) + [ $(($mdtfree1 - $mdtfree2)) -ge 112 ] || + error "MDT free space is wrong after removal" + fi + + # combined striping + $LFS setstripe -E 1024K -L mdt -E EOF $dom || + error "Can't create DoM + OST striping" + + dd if=/dev/urandom of=$tmp bs=1024 count=2000 + # check also direct IO along write + dd if=$tmp of=$dom bs=102400 count=20 oflag=direct + sync + cmp $tmp $dom || error "file data is different" + [ $(stat -c%s $dom) == 2048000 ] || error "bad size after write" + rm $dom + rm $tmp + + return 0 +} +run_test 270a "DoM: basic functionality tests" + +test_270b() { + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] && + skip "Need MDS version at least 2.10.55" && return + + local dom=$DIR/$tdir/dom_file + local max_size=1048576 + + mkdir -p $DIR/$tdir + $LFS setstripe -E $max_size -L mdt $dom + + # truncate over the limit + $TRUNCATE $dom $(($max_size + 1)) && + error "successful truncate over the maximum size" + # write over the limit + dd if=/dev/zero of=$dom bs=$max_size seek=1 count=1 && + error "successful write over the maximum size" + # append over the limit + dd if=/dev/zero of=$dom bs=$(($max_size - 3)) count=1 + echo "12345" >> $dom && error "successful append over the maximum size" + rm $dom + + return 0 +} +run_test 270b "DoM: maximum size overflow checks for DoM-only file" + +test_270c() { + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] && + skip "Need MDS version at least 2.10.55" && return + + mkdir -p $DIR/$tdir + $LFS setstripe -E 1024K -L mdt $DIR/$tdir + + # check files inherit DoM EA + touch $DIR/$tdir/first + [ $($GETSTRIPE -L $DIR/$tdir/first) == "mdt" ] || + error "bad pattern" + [ $($LFS getstripe -c $DIR/$tdir/first) == 0 ] || + error "bad stripe count" + [ $($LFS getstripe -S $DIR/$tdir/first) == 1048576 ] || + error "bad stripe size" + + # check directory inherits DoM EA and uses it as default + mkdir $DIR/$tdir/subdir + touch $DIR/$tdir/subdir/second + [ $($LFS getstripe -L $DIR/$tdir/subdir/second) == "mdt" ] || + error "bad pattern in sub-directory" + [ $($LFS getstripe -c $DIR/$tdir/subdir/second) == 0 ] || + error "bad stripe count in sub-directory" + [ $($LFS getstripe -S $DIR/$tdir/subdir/second) == 1048576 ] || + error "bad stripe size in sub-directory" + return 0 +} +run_test 270c "DoM: DoM EA inheritance tests" + +test_270d() { + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] && + skip "Need MDS version at least 2.10.55" && return + + mkdir -p $DIR/$tdir + $LFS setstripe -E 1024K -L mdt $DIR/$tdir + + # inherit default DoM striping + mkdir $DIR/$tdir/subdir + touch $DIR/$tdir/subdir/f1 + + # change default directory striping + $LFS setstripe -c 1 $DIR/$tdir/subdir + touch $DIR/$tdir/subdir/f2 + [ $($LFS getstripe -c $DIR/$tdir/subdir/f2) == 1 ] || + error "wrong default striping in file 2" + [ $($LFS getstripe -L $DIR/$tdir/subdir/f2) == "raid0" ] || + error "bad pattern in file 2" + return 0 +} +run_test 270d "DoM: change striping from DoM to RAID0" + +test_270e() { + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] && + skip "Need MDS version at least 2.10.55" && return + + mkdir -p $DIR/$tdir/dom + mkdir -p $DIR/$tdir/norm + DOMFILES=20 + NORMFILES=10 + $LFS setstripe -E 1M -L mdt $DIR/$tdir/dom + $LFS setstripe -i 0 -S 2M $DIR/$tdir/norm + + createmany -o $DIR/$tdir/dom/dom- $DOMFILES + createmany -o $DIR/$tdir/norm/norm- $NORMFILES + + # find DoM files by layout + NUM=$($LFS find -L mdt -type f $DIR/$tdir 2>/dev/null | wc -l) + [ $NUM -eq $DOMFILES ] || + error "lfs find -L: found $NUM, expected $DOMFILES" + echo "Test 1: lfs find 20 DOM files by layout: OK" + + # there should be 1 dir with default DOM striping + NUM=$($LFS find -L mdt -type d $DIR/$tdir 2>/dev/null | wc -l) + [ $NUM -eq 1 ] || + error "lfs find -L: found $NUM, expected 1 dir" + echo "Test 2: lfs find 1 DOM dir by layout: OK" + + # find DoM files by stripe size + NUM=$($LFS find -S -1200K -type f $DIR/$tdir 2>/dev/null | wc -l) + [ $NUM -eq $DOMFILES ] || + error "lfs find -S: found $NUM, expected $DOMFILES" + echo "Test 4: lfs find 20 DOM files by stripe size: OK" + + # find files by stripe offset except DoM files + NUM=$($LFS find -i 0 -type f $DIR/$tdir 2>/dev/null | wc -l) + [ $NUM -eq $NORMFILES ] || + error "lfs find -i: found $NUM, expected $NORMFILES" + echo "Test 5: lfs find no DOM files by stripe index: OK" + return 0 +} +run_test 270e "DoM: lfs find with DoM files test" + +test_270f() { + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] && + skip "Need MDS version at least 2.10.55" && return + + local mdtname=${FSNAME}-MDT0000-mdtlov + local dom=$DIR/$tdir/dom_file + local dom_limit_saved=$(do_facet mds1 $LCTL get_param -n \ + lod.$mdtname.dom_stripesize) + local dom_limit=131072 + + do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=$dom_limit + local dom_current=$(do_facet mds1 $LCTL get_param -n \ + lod.$mdtname.dom_stripesize) + [ ${dom_limit} -eq ${dom_current} ] || + error "Cannot change per-MDT DoM stripe limit to $dom_limit" + + $LFS mkdir -i 0 -c 1 $DIR/$tdir + $LFS setstripe -d $DIR/$tdir + $LFS setstripe -E $dom_limit -L mdt $DIR/$tdir || + error "Can't set directory default striping" + + # exceed maximum stripe size + $LFS setstripe -E $(($dom_limit * 2)) -L mdt $dom && + error "Able to create DoM component size more than LOD limit" + + do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=0 + dom_current=$(do_facet mds1 $LCTL get_param -n \ + lod.$mdtname.dom_stripesize) + [ 0 -eq ${dom_current} ] || + error "Can't set zero DoM stripe limit" + + # too low values to be aligned with smallest stripe size 64K + do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=30000 + dom_current=$(do_facet mds1 $LCTL get_param -n \ + lod.$mdtname.dom_stripesize) + [ 30000 -eq ${dom_current} ] && + error "Can set too small DoM stripe limit" + + do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=2147483648 + dom_current=$(do_facet mds1 $LCTL get_param -n \ + lod.$mdtname.dom_stripesize) + echo $dom_current + [ 2147483648 -eq ${dom_current} ] && + error "Can set too large DoM stripe limit" + + do_facet mds1 $LCTL set_param -n \ + lod.$mdtname.dom_stripesize=$((dom_limit * 2)) + $LFS setstripe -E $((dom_limit * 2)) -L mdt $dom || + error "Can't create DoM component size after limit change" + do_facet mds1 $LCTL set_param -n \ + lod.$mdtname.dom_stripesize=$((dom_limit / 2)) + $LFS setstripe -E $dom_limit -L mdt ${dom}_big && + error "Can create big DoM component after limit decrease" + touch ${dom}_def || + error "Can't create file with old default layout" + + do_facet mds1 $LCTL set_param -n lod.*.dom_stripesize=$dom_limit_saved + return 0 +} +run_test 270f "DoM: maximum DoM stripe size checks" + +test_271a() { + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] && + skip "Need MDS version at least 2.10.55" && return + + local dom=$DIR/$tdir/dom + + mkdir -p $DIR/$tdir + + $LFS setstripe -E 1024K -L mdt $dom + + lctl set_param -n mdc.*.stats=clear + dd if=/dev/zero of=$dom bs=4096 count=1 || return 1 + cat $dom > /dev/null + local reads=$(lctl get_param -n mdc.*.stats | + awk '/ost_read/ {print $2}') + [ -z $reads ] || error "Unexpected $reads READ RPCs" + ls $dom + rm -f $dom +} +run_test 271a "DoM: data is cached for read after write" + +test_271b() { + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] && + skip "Need MDS version at least 2.10.55" && return + + local dom=$DIR/$tdir/dom + + mkdir -p $DIR/$tdir + + $LFS setstripe -E 1024K -L mdt -E EOF $dom + + lctl set_param -n mdc.*.stats=clear + dd if=/dev/zero of=$dom bs=4096 count=1 || return 1 + cancel_lru_locks mdc + $CHECKSTAT -t file -s 4096 $dom || error "stat #1 fails" + # second stat to check size is cached on client + $CHECKSTAT -t file -s 4096 $dom || error "stat #2 fails" + local gls=$(lctl get_param -n mdc.*.stats | + awk '/ldlm_glimpse/ {print $2}') + [ -z $gls ] || error "Unexpected $gls glimpse RPCs" + rm -f $dom +} +run_test 271b "DoM: no glimpse RPC for stat (DoM only file)" + +test_271ba() { + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] && + skip "Need MDS version at least 2.10.55" && return + + local dom=$DIR/$tdir/dom + + mkdir -p $DIR/$tdir + + $LFS setstripe -E 1024K -L mdt -E EOF $dom + + lctl set_param -n mdc.*.stats=clear + lctl set_param -n osc.*.stats=clear + dd if=/dev/zero of=$dom bs=2048K count=1 || return 1 + cancel_lru_locks mdc + $CHECKSTAT -t file -s 2097152 $dom || error "stat" + # second stat to check size is cached on client + $CHECKSTAT -t file -s 2097152 $dom || error "stat" + local gls=$(lctl get_param -n mdc.*.stats | + awk '/ldlm_glimpse/ {print $2}') + [ -z $gls ] || error "Unexpected $gls glimpse RPCs" + local gls=$(lctl get_param -n osc.*.stats | + awk '/ldlm_glimpse/ {print $2}') + [ -z $gls ] || error "Unexpected $gls OSC glimpse RPCs" + rm -f $dom +} +run_test 271ba "DoM: no glimpse RPC for stat (combined file)" + +test_271c() { + # test to be enabled with lock_convert + skip "skipped until lock convert will be implemented" && return + + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] && + skip "Need MDS version at least 2.10.55" && return + + local dom=$DIR/$tdir/dom + + mkdir -p $DIR/$tdir + + $LFS setstripe -E 1024K -L mdt $DIR/$tdir + + local mdtidx=$($LFS getstripe -M $DIR/$tdir) + local facet=mds$((mdtidx + 1)) + + cancel_lru_locks mdc + do_facet $facet lctl set_param -n mdt.*.dom_lock=0 + createmany -o $dom 1000 + lctl set_param -n mdc.*.stats=clear + smalliomany -w $dom 1000 200 + lctl get_param -n mdc.*.stats + local enq=$(lctl get_param -n mdc.*.stats | + awk '/ldlm_ibits_enqueue/ {print $2}') + # Each file has 1 open, 1 IO enqueues, total 2000 + # but now we have also +1 getxattr for security.capability, total 3000 + [ $enq -ge 2000 ] || error "Too few enqueues $enq, expected > 2000" + unlinkmany $dom 1000 + + cancel_lru_locks mdc + do_facet $facet lctl set_param -n mdt.*.dom_lock=1 + createmany -o $dom 1000 + lctl set_param -n mdc.*.stats=clear + smalliomany -w $dom 1000 200 + lctl get_param -n mdc.*.stats + local enq_2=$(lctl get_param -n mdc.*.stats | + awk '/ldlm_ibits_enqueue/ {print $2}') + # Expect to see reduced amount of RPCs by 1000 due to single enqueue + # for OPEN and IO lock. + [ $((enq - enq_2)) -ge 1000 ] || + error "Too many enqueues $enq_2, expected about $((enq - 1000))" + unlinkmany $dom 1000 + return 0 +} +run_test 271c "DoM: IO lock at open saves enqueue RPCs" + cleanup_test_300() { trap 0 umask $SAVE_UMASK @@ -14946,7 +16281,7 @@ test_300b() { local mtime2 local mtime3 - test_mkdir $DIR/$tdir || error "mkdir fail" + test_mkdir $DIR/$tdir $LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir || error "set striped dir error" for ((i=0; i<10; i++)); do @@ -15177,17 +16512,17 @@ test_300g() { $LFS setdirstripe -D -i1 $DIR/$tdir/striped_dir || error "create striped_dir failed" + $LFS setdirstripe -i0 $DIR/$tdir/striped_dir/dir0 || + error "create dir0 fails" + stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/dir0) + [ $stripe_index -eq 0 ] || + error "dir0 expect index 0 got $stripe_index" + mkdir $DIR/$tdir/striped_dir/dir1 || error "create dir1 fails" stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/dir1) [ $stripe_index -eq 1 ] || - error "dir1 expect 1 got $stripe_index" - - $LFS setdirstripe -i2 $DIR/$tdir/striped_dir/dir2 || - error "create dir2 fails" - stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/dir2) - [ $stripe_index -eq 2 ] || - error "dir2 expect 2 got $stripe_index" + error "dir1 expect index 1 got $stripe_index" #check default stripe count/stripe index test_300_check_default_striped_dir normal_dir $MDSCOUNT 1 @@ -15417,6 +16752,8 @@ test_300n() { skip "Need MDS version at least 2.7.55" && return [ $PARALLEL == "yes" ] && skip "skip parallel run" && return [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + remote_mds_nodsh && skip "remote MDS with nodsh" && return + local stripe_index local list=$(comma_list $(mdts_nodes)) @@ -15609,6 +16946,7 @@ test_311() { [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.8.54) ] && skip "lustre < 2.8.54 does not contain LU-4825 fix" && return [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + remote_mds_nodsh && skip "remote MDS with nodsh" && return local old_iused=$($LFS df -i | grep OST0000 | awk '{ print $3 }') @@ -15662,7 +17000,7 @@ zfs_oid_to_objid() local objid=$2 local vdevdir=$(dirname $(facet_vdevice $ost)) - local cmd="$ZDB -e -p $vdevdir -dddd $(facet_device $ost)" + local cmd="$ZDB -e -p $vdevdir -ddddd $(facet_device $ost)" local zfs_zapid=$(do_facet $ost $cmd | grep -w "/O/0/d$((objid%32))" -C 5 | awk '/Object/{getline; print $1}') @@ -15691,12 +17029,15 @@ zfs_object_blksz() { } test_312() { # LU-4856 + remote_ost_nodsh && skip "remote OST with nodsh" && return + [ $(facet_fstype ost1) = "zfs" ] || { skip "the test only applies to zfs" && return; } local max_blksz=$(do_facet ost1 \ $ZFS get -p recordsize $(facet_device ost1) | awk '!/VALUE/{print $3}') + local min_blksz=$(getconf PAGE_SIZE) # to make life a little bit easier $LFS mkdir -c 1 -i 0 $DIR/$tdir @@ -15711,7 +17052,7 @@ test_312() { # LU-4856 # block size change by sequential over write local blksz - for ((bs=4096; bs <= max_blksz; bs <<= 2)); do + for ((bs=$min_blksz; bs <= max_blksz; bs <<= 2)); do dd if=/dev/zero of=$tf bs=$bs count=1 oflag=sync conv=notrunc blksz=$(zfs_object_blksz ost1 $zfs_objid) @@ -15720,18 +17061,18 @@ test_312() { # LU-4856 rm -f $tf # block size change by sequential append write - dd if=/dev/zero of=$tf bs=4K count=1 oflag=sync conv=notrunc + dd if=/dev/zero of=$tf bs=$min_blksz count=1 oflag=sync conv=notrunc oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}') zfs_objid=$(zfs_oid_to_objid ost1 $oid) - for ((count = 1; count < $((max_blksz / 4096)); count *= 2)); do - dd if=/dev/zero of=$tf bs=4K count=$count seek=$count \ + for ((count = 1; count < $((max_blksz / min_blksz)); count *= 2)); do + dd if=/dev/zero of=$tf bs=$min_blksz count=$count seek=$count \ oflag=sync conv=notrunc blksz=$(zfs_object_blksz ost1 $zfs_objid) - blksz=$((blksz / 8192)) # in 2*4K unit - [ $blksz -eq $count ] || - error "blksz error(in 8k): $blksz, expected: $count" + [ $blksz -eq $((2 * count * min_blksz)) ] || + error "blksz error, actual $blksz, " \ + "expected: 2 * $count * $min_blksz" done rm -f $tf @@ -15740,9 +17081,10 @@ test_312() { # LU-4856 oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}') zfs_objid=$(zfs_oid_to_objid ost1 $oid) - dd if=/dev/zero of=$tf bs=8K count=1 oflag=sync conv=notrunc + dd if=/dev/zero of=$tf bs=1K count=1 oflag=sync conv=notrunc blksz=$(zfs_object_blksz ost1 $zfs_objid) - [ $blksz -eq 8192 ] || error "blksz error: $blksz, expected: 8k" + [ $blksz -eq $min_blksz ] || + error "blksz error: $blksz, expected: $min_blksz" dd if=/dev/zero of=$tf bs=64K count=1 oflag=sync conv=notrunc seek=128 blksz=$(zfs_object_blksz ost1 $zfs_objid) @@ -15755,6 +17097,8 @@ test_312() { # LU-4856 run_test 312 "make sure ZFS adjusts its block size by write pattern" test_313() { + remote_ost_nodsh && skip "remote OST with nodsh" && return + local file=$DIR/$tfile rm -f $file $SETSTRIPE -c 1 -i 0 $file || error "setstripe failed" @@ -15768,6 +17112,33 @@ test_313() { } run_test 313 "io should fail after last_rcvd update fail" +test_314() { + $SETSTRIPE -c 2 -i 0 $DIR/$tfile || error "setstripe failed" + do_facet ost1 "$LCTL set_param fail_loc=0x720" + rm -f $DIR/$tfile + wait_delete_completed + do_facet ost1 "$LCTL set_param fail_loc=0" +} +run_test 314 "OSP shouldn't fail after last_rcvd update failure" + +test_315() { # LU-618 + local file=$DIR/$tfile + rm -f $file + + $MULTIOP $file oO_CREAT:O_DIRECT:O_RDWR:w4096000c + $MULTIOP $file oO_RDONLY:r4096000_c & + PID=$! + + sleep 2 + + local rbytes=$(awk '/read_bytes/ { print $2 }' /proc/$PID/io) + kill -USR1 $PID + + [ $rbytes -gt 4000000 ] || error "read is not accounted ($rbytes)" + rm -f $file +} +run_test 315 "read should be accounted" + test_fake_rw() { local read_write=$1 if [ "$read_write" = "write" ]; then @@ -15827,14 +17198,17 @@ test_fake_rw() { rm -f $DIR/$tfile } test_399a() { # LU-7655 for OST fake write + remote_ost_nodsh && skip "remote OST with nodsh" && return + test_fake_rw write } run_test 399a "fake write should not be slower than normal write" - test_399b() { # LU-8726 for OST fake read + remote_ost_nodsh && skip "remote OST with nodsh" && return + if [ "$(facet_fstype ost1)" != "ldiskfs" ]; then - skip "only for ldiskfs" && return 0 + skip "ldiskfs only test" && return 0 fi test_fake_rw read } @@ -15853,7 +17227,6 @@ test_400a() { # LU-1606, was conf-sanity test_74 if ! [[ -d $prefix ]]; then # Assume we're running in tree and fixup the include path. - extra_flags+=" -I$LUSTRE/../libcfs/include" extra_flags+=" -I$LUSTRE/include" extra_flags+=" -L$LUSTRE/utils" fi @@ -15869,7 +17242,7 @@ run_test 400a "Lustre client api program can compile and link" test_400b() { # LU-1606, LU-5011 local header local out=$TMP/$tfile - local prefix=/usr/include/lustre + local prefix=/usr/include/linux/lustre # We use a hard coded prefix so that this test will not fail # when run in tree. There are headers in lustre/include/lustre/ @@ -15888,8 +17261,8 @@ test_400b() { # LU-1606, LU-5011 continue fi - if [[ "$(basename $header)" == liblustreapi.h ]]; then - continue # liblustreapi.h is deprecated. + if [[ "$(basename $header)" == lustre_ioctl.h ]]; then + continue # lustre_ioctl.h is internal header fi $CC -Wall -Werror -include $header -c -x c /dev/null -o $out || @@ -16035,7 +17408,7 @@ test_403() { wait - [ `cat $tfile` -gt 0 ] || error "wrong nlink count: `cat $tfile`" + [ $(cat $tfile) -gt 0 ] || error "wrong nlink count: $(cat $tfile)" rm -f $tfile $file1 $file2 } @@ -16073,12 +17446,13 @@ test_404() { # LU-6601 run_test 404 "validate manual {de}activated works properly for OSPs" test_405() { - [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.6.92) ] && + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.6.92) -o \ + [ $(lustre_version_code client) -lt $(version_code 2.6.99) ] && skip "Layout swap lock is not supported" && return check_swap_layouts_support && return 0 - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir swap_lock_test -d $DIR/$tdir || error "One layout swap locked test failed" } @@ -16092,12 +17466,15 @@ test_406() { [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.8.50) ] && skip "Need MDS version at least 2.8.50" && return - local def_stripenr=$($GETSTRIPE -c $MOUNT) + local def_stripe_count=$($GETSTRIPE -c $MOUNT) local def_stripe_size=$($GETSTRIPE -S $MOUNT) local def_stripe_offset=$($GETSTRIPE -i $MOUNT) local def_pool=$($GETSTRIPE -p $MOUNT) - local test_pool=$TESTNAME + + if ! combined_mgs_mds ; then + mount_mgs_client + fi pool_add $test_pool || error "pool_add failed" pool_add_targets $test_pool 0 $(($OSTCOUNT - 1)) 1 || error "pool_add_targets failed" @@ -16139,7 +17516,7 @@ test_406() { [ $size -eq $def_stripe_size ] || error "$f stripe size $size != $def_stripe_size" local pool=$($GETSTRIPE -p $f) - [ "#$pool" == "#" ] || error "$f pool $pool is set" + [ $pool == $test_pool ] || error "$f pool $pool isn't set" done @@ -16147,26 +17524,30 @@ test_406() { # restore FS default striping if [ -z $def_pool ]; then - $SETSTRIPE -c $def_stripenr -S $def_stripe_size \ + $SETSTRIPE -c $def_stripe_count -S $def_stripe_size \ -i $def_stripe_offset $MOUNT || error "restore default striping failed" else - $SETSTRIPE -c $def_stripenr -S $def_stripe_size -p $def_pool \ - -i $def_stripe_offset $MOUNT || + $SETSTRIPE -c $def_stripe_count -S $def_stripe_size \ + -i $def_stripe_offset -p $def_pool $MOUNT || error "restore default striping with $def_pool failed" fi local f=$DIR/$tdir/$tfile pool_remove_all_targets $test_pool $f pool_remove $test_pool $f + + if ! combined_mgs_mds ; then + umount_mgs_client + fi } run_test 406 "DNE support fs default striping" test_407() { [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return - [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.8.55) ]] && skip "Need MDS version at least 2.8.55" && return + remote_mds_nodsh && skip "remote MDS with nodsh" && return $LFS mkdir -i 0 -c 1 $DIR/$tdir.0 || error "$LFS mkdir -i 0 -c 1 $tdir.0 failed" @@ -16237,6 +17618,82 @@ test_409() } run_test 409 "Large amount of cross-MDTs hard links on the same file" +test_410() +{ + [[ $(lustre_version_code client) -lt $(version_code 2.9.59) ]] && + skip "Need client version at least 2.9.59" && return + + # Create a file, and stat it from the kernel + local testfile=$DIR/$tfile + touch $testfile + + local run_id=$RANDOM + local my_ino=$(stat --format "%i" $testfile) + + # Try to insert the module. This will always fail as the + # module is designed to not be inserted. + insmod $LUSTRE/tests/kernel/kinode.ko run_id=$run_id fname=$testfile \ + &> /dev/null + + # Anything but success is a test failure + dmesg | grep -q \ + "lustre_kinode_$run_id: inode numbers are identical: $my_ino" || + error "no inode match" +} +run_test 410 "Test inode number returned from kernel thread" + +cleanup_test411_cgroup() { + trap 0 + rmdir "$1" +} + +test_411() { + local cg_basedir=/sys/fs/cgroup/memory + # LU-9966 + test -f "$cg_basedir/memory.kmem.limit_in_bytes" || + { skip "no setup for cgroup"; return; } + + dd if=/dev/zero of=$DIR/$tfile bs=1M count=100 conv=fsync || + error "test file creation failed" + cancel_lru_locks osc + + # Create a very small memory cgroup to force a slab allocation error + local cgdir=$cg_basedir/osc_slab_alloc + mkdir $cgdir || error "cgroup mkdir '$cgdir' failed" + trap "cleanup_test411_cgroup $cgdir" EXIT + echo 2M > $cgdir/memory.kmem.limit_in_bytes + echo 1M > $cgdir/memory.limit_in_bytes + + # Should not LBUG, just be killed by oom-killer + sh -c "echo \$$ > $cgdir/tasks && dd if=$DIR/$tfile of=/dev/null" && + error "fail to trigger a memory allocation error" + + cleanup_test411_cgroup $cgdir + + return 0 +} +run_test 411 "Slab allocation error with cgroup does not LBUG" + +test_412() { + [ $MDSCOUNT -lt 2 ] && + skip "We need at least 2 MDTs for this test" && return + + if [ $(lustre_version_code mds1) -lt $(version_code 2.10.55) ]; then + skip "Need server version at least 2.10.55" & exit 0 + fi + + $LFS mkdir -i $((MDSCOUNT - 1)),$((MDSCOUNT - 2)) $DIR/$tdir || + error "mkdir failed" + $LFS getdirstripe $DIR/$tdir + stripe_index=$($LFS getdirstripe -i $DIR/$tdir) + [ $stripe_index -eq $((MDSCOUNT - 1)) ] || + error "expect $((MDSCOUT - 1)) get $stripe_index" + stripe_count=$($LFS getdirstripe -T $DIR/$tdir) + [ $stripe_count -eq 2 ] || + error "expect 2 get $stripe_count" +} +run_test 412 "mkdir on specific MDTs" + prep_801() { [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] || [[ $(lustre_version_code ost1) -lt $(version_code 2.9.55) ]] && @@ -16248,58 +17705,79 @@ post_801() { stop_full_debug_logging } +barrier_stat() { + if [ $(lustre_version_code mgs) -le $(version_code 2.10.0) ]; then + local st=$(do_facet mgs $LCTL barrier_stat $FSNAME | + awk '/The barrier for/ { print $7 }') + echo $st + else + local st=$(do_facet mgs $LCTL barrier_stat -s $FSNAME) + echo \'$st\' + fi +} + +barrier_expired() { + local expired + + if [ $(lustre_version_code mgs) -le $(version_code 2.10.0) ]; then + expired=$(do_facet mgs $LCTL barrier_stat $FSNAME | + awk '/will be expired/ { print $7 }') + else + expired=$(do_facet mgs $LCTL barrier_stat -t $FSNAME) + fi + + echo $expired +} + test_801a() { prep_801 + echo "Start barrier_freeze at: $(date)" #define OBD_FAIL_BARRIER_DELAY 0x2202 - do_facet mgs $LCTL set_param fail_val=3 fail_loc=0x2202 + do_facet mgs $LCTL set_param fail_val=5 fail_loc=0x2202 do_facet mgs $LCTL barrier_freeze $FSNAME 10 & - sleep 1 - local b_status=$(do_facet mgs $LCTL barrier_stat $FSNAME | - awk '/The barrier for/ { print $7 }') + sleep 2 + local b_status=$(barrier_stat) + echo "Got barrier status at: $(date)" [ "$b_status" = "'freezing_p1'" ] || error "(1) unexpected barrier status $b_status" do_facet mgs $LCTL set_param fail_val=0 fail_loc=0 wait - b_status=$(do_facet mgs $LCTL barrier_stat $FSNAME | - awk '/The barrier for/ { print $7 }') + b_status=$(barrier_stat) [ "$b_status" = "'frozen'" ] || error "(2) unexpected barrier status $b_status" - local expired=$(do_facet mgs $LCTL barrier_stat $FSNAME | - awk '/will be expired/ { print $7 }') + local expired=$(barrier_expired) echo "sleep $((expired + 3)) seconds, then the barrier will be expired" sleep $((expired + 3)) - b_status=$(do_facet mgs $LCTL barrier_stat $FSNAME | - awk '/The barrier for/ { print $7 }') + b_status=$(barrier_stat) [ "$b_status" = "'expired'" ] || error "(3) unexpected barrier status $b_status" do_facet mgs $LCTL barrier_freeze $FSNAME 10 || error "(4) fail to freeze barrier" - b_status=$(do_facet mgs $LCTL barrier_stat $FSNAME | - awk '/The barrier for/ { print $7 }') + b_status=$(barrier_stat) [ "$b_status" = "'frozen'" ] || error "(5) unexpected barrier status $b_status" + echo "Start barrier_thaw at: $(date)" #define OBD_FAIL_BARRIER_DELAY 0x2202 - do_facet mgs $LCTL set_param fail_val=3 fail_loc=0x2202 + do_facet mgs $LCTL set_param fail_val=5 fail_loc=0x2202 do_facet mgs $LCTL barrier_thaw $FSNAME & - sleep 1 - b_status=$(do_facet mgs $LCTL barrier_stat $FSNAME | - awk '/The barrier for/ { print $7 }') + sleep 2 + b_status=$(barrier_stat) + echo "Got barrier status at: $(date)" [ "$b_status" = "'thawing'" ] || error "(6) unexpected barrier status $b_status" do_facet mgs $LCTL set_param fail_val=0 fail_loc=0 wait - b_status=$(do_facet mgs $LCTL barrier_stat $FSNAME | - awk '/The barrier for/ { print $7 }') + b_status=$(barrier_stat) [ "$b_status" = "'thawed'" ] || error "(7) unexpected barrier status $b_status" @@ -16307,8 +17785,7 @@ test_801a() { do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2203 do_facet mgs $LCTL barrier_freeze $FSNAME - b_status=$(do_facet mgs $LCTL barrier_stat $FSNAME | - awk '/The barrier for/ { print $7 }') + b_status=$(barrier_stat) [ "$b_status" = "'failed'" ] || error "(8) unexpected barrier status $b_status" @@ -16333,8 +17810,7 @@ test_801b() { # 180 seconds should be long enough do_facet mgs $LCTL barrier_freeze $FSNAME 180 - local b_status=$(do_facet mgs $LCTL barrier_stat $FSNAME | - awk '/The barrier for/ { print $7 }') + local b_status=$(barrier_stat) [ "$b_status" = "'frozen'" ] || error "(6) unexpected barrier status $b_status" @@ -16356,8 +17832,7 @@ test_801b() { stat $DIR/$tdir/d5 || error "(7) stat should succeed" # To guarantee taht the 'stat' is not blocked - b_status=$(do_facet mgs $LCTL barrier_stat $FSNAME | - awk '/The barrier for/ { print $7 }') + b_status=$(barrier_stat) [ "$b_status" = "'frozen'" ] || error "(8) unexpected barrier status $b_status" @@ -16370,14 +17845,12 @@ test_801b() { ps -p $mv_pid || error "(12) rename should be blocked" ps -p $rm_pid || error "(13) unlink should be blocked" - b_status=$(do_facet mgs $LCTL barrier_stat $FSNAME | - awk '/The barrier for/ { print $7 }') + b_status=$(barrier_stat) [ "$b_status" = "'frozen'" ] || error "(14) unexpected barrier status $b_status" do_facet mgs $LCTL barrier_thaw $FSNAME - b_status=$(do_facet mgs $LCTL barrier_stat $FSNAME | - awk '/The barrier for/ { print $7 }') + b_status=$(barrier_stat) [ "$b_status" = "'thawed'" ] || error "(15) unexpected barrier status $b_status" @@ -16400,8 +17873,7 @@ test_801c() { do_facet mgs $LCTL barrier_freeze $FSNAME 30 - local b_status=$(do_facet mgs $LCTL barrier_stat $FSNAME | - awk '/The barrier for/ { print $7 }') + local b_status=$(barrier_stat) [ "$b_status" = "'expired'" -o "$b_status" = "'failed'" ] || { do_facet mgs $LCTL barrier_thaw $FSNAME error "(2) unexpected barrier status $b_status" @@ -16412,14 +17884,12 @@ test_801c() { do_facet mgs $LCTL barrier_freeze $FSNAME 10 - b_status=$(do_facet mgs $LCTL barrier_stat $FSNAME | - awk '/The barrier for/ { print $7 }') + b_status=$(barrier_stat) [ "$b_status" = "'frozen'" ] || error "(4) unexpected barrier status $b_status" do_facet mgs $LCTL barrier_thaw $FSNAME - b_status=$(do_facet mgs $LCTL barrier_stat $FSNAME | - awk '/The barrier for/ { print $7 }') + b_status=$(barrier_stat) [ "$b_status" = "'thawed'" ] || error "(5) unexpected barrier status $b_status" @@ -16492,6 +17962,137 @@ test_802() { } run_test 802 "simulate readonly device" +test_803() { + [[ $MDSCOUNT -lt 2 ]] && skip "needs >= 2 MDTs" && return + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.54) ] && + skip "MDS needs to be newer than 2.10.54" && return + + mkdir -p $DIR/$tdir + # Create some objects on all MDTs to trigger related logs objects + for idx in $(seq $MDSCOUNT); do + $LFS mkdir -c $MDSCOUNT -i $((idx % $MDSCOUNT)) \ + $DIR/$tdir/dir${idx} || + error "Fail to create $DIR/$tdir/dir${idx}" + done + + sync; sleep 5 + echo "before create:" + $LFS df -i $MOUNT + local before_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}') + + for ((i=0; i<10; i++)); do + $LFS mkdir -c 1 -i 1 $DIR/$tdir/foo$i || + error "Fail to create $DIR/$tdir/foo$i" + done + + sync; sleep 5 + echo "after create:" + $LFS df -i $MOUNT + local after_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}') + + [ $after_used -ge $((before_used + 10)) ] || + error "before ($before_used) + 10 > after ($after_used)" + + for ((i=0; i<10; i++)); do + rm -rf $DIR/$tdir/foo$i || + error "Fail to remove $DIR/$tdir/foo$i" + done + + wait_delete_completed + echo "after unlink:" + $LFS df -i $MOUNT + before_used=$after_used + after_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}') + + [ $after_used -le $((before_used - 8)) ] || + error "before ($before_used) - 8 < after ($after_used)" +} +run_test 803 "verify agent object for remote object" + +test_804() { + [[ $MDSCOUNT -lt 2 ]] && skip "needs >= 2 MDTs" && return + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.54) ] && + skip "MDS needs to be newer than 2.10.54" && return + + [ "$(facet_fstype $SINGLEMDS)" != "ldiskfs" ] && + skip "ldiskfs only test" && return 0 + + mkdir -p $DIR/$tdir + $LFS mkdir -c 1 -i 1 $DIR/$tdir/dir0 || + error "Fail to create $DIR/$tdir/dir0" + + local fid=$($LFS path2fid $DIR/$tdir/dir0) + local dev=$(mdsdevname 2) + + do_facet mds2 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" | + grep ${fid} || error "NOT found agent entry for dir0" + + $LFS mkdir -c $MDSCOUNT -i 0 $DIR/$tdir/dir1 || + error "Fail to create $DIR/$tdir/dir1" + + touch $DIR/$tdir/dir1/foo0 || + error "Fail to create $DIR/$tdir/dir1/foo0" + fid=$($LFS path2fid $DIR/$tdir/dir1/foo0) + local rc=0 + + for idx in $(seq $MDSCOUNT); do + dev=$(mdsdevname $idx) + do_facet mds${idx} \ + "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" | + grep ${fid} && rc=$idx + done + + mv $DIR/$tdir/dir1/foo0 $DIR/$tdir/dir1/foo1 || + error "Fail to rename foo0 to foo1" + if [ $rc -eq 0 ]; then + for idx in $(seq $MDSCOUNT); do + dev=$(mdsdevname $idx) + do_facet mds${idx} \ + "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" | + grep ${fid} && rc=$idx + done + fi + + mv $DIR/$tdir/dir1/foo1 $DIR/$tdir/dir1/foo2 || + error "Fail to rename foo1 to foo2" + if [ $rc -eq 0 ]; then + for idx in $(seq $MDSCOUNT); do + dev=$(mdsdevname $idx) + do_facet mds${idx} \ + "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" | + grep ${fid} && rc=$idx + done + fi + + [ $rc -ne 0 ] || error "NOT found agent entry for foo" + + ln $DIR/$tdir/dir1/foo2 $DIR/$tdir/dir0/guard || + error "Fail to link to $DIR/$tdir/dir1/foo2" + mv $DIR/$tdir/dir1/foo2 $DIR/$tdir/dir1/foo0 || + error "Fail to rename foo2 to foo0" + unlink $DIR/$tdir/dir1/foo0 || + error "Fail to unlink $DIR/$tdir/dir1/foo0" + rm -rf $DIR/$tdir/dir0 || + error "Fail to rm $DIR/$tdir/dir0" + + for idx in $(seq $MDSCOUNT); do + dev=$(mdsdevname $idx) + rc=0 + + stop mds${idx} + run_e2fsck $(facet_active_host mds$idx) $dev -n || + rc=$? + start mds${idx} $dev $MDS_MOUNT_OPTS || + error "mount mds$idx failed" + df $MOUNT > /dev/null 2>&1 + + # e2fsck should not return error + [ $rc -eq 0 ] || + error "e2fsck detected error on MDT${idx}: rc=$rc" + done +} +run_test 804 "verify agent entry for remote entry" + # # tests that do cleanup/setup should be run at the end #