X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Ftests%2Fsanity.sh;h=238e75624e335920bc0c9c169fdef84163069ac8;hp=b4eea621ee812688b8a963084d10757ec054034c;hb=6e45c6d3ae4c46a0312bbb95b7e9ff09761f037d;hpb=1f9235152b2f44c7bd64c5c021066f1984f341e6 diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index b4eea62..238e756 100644 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -1,5 +1,5 @@ #!/bin/bash -# -*- tab-width: 4; indent-tabs-mode: t; -*- +# -*- tab-width: 8; indent-tabs-mode: t; -*- # # Run select tests by setting ONLY, or as arguments to the script. # Skip specific tests by setting EXCEPT. @@ -16,19 +16,18 @@ ALWAYS_EXCEPT=" 42a 42b 42c 42d 45 51d 68b $SANITY_EXCE # bug number for skipped tests: LU-2036 ALWAYS_EXCEPT=" 76 $ALWAYS_EXCEPT" - SRCDIR=$(cd $(dirname $0); echo $PWD) export PATH=$PATH:/sbin TMP=${TMP:-/tmp} +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} -MCREATE=${MCREATE:-mcreate} OPENFILE=${OPENFILE:-openfile} OPENUNLINK=${OPENUNLINK:-openunlink} export MULTIOP=${MULTIOP:-multiop} @@ -53,16 +52,19 @@ CLEANUP=${CLEANUP:-:} SETUP=${SETUP:-:} TRACE=${TRACE:-""} LUSTRE=${LUSTRE:-$(cd $(dirname $0)/..; echo $PWD)} +LUSTRE_TESTS_API_DIR=${LUSTRE_TESTS_API_DIR:-${LUSTRE}/tests/clientapi} . $LUSTRE/tests/test-framework.sh init_test_env $@ . ${CONFIG:=$LUSTRE/tests/cfg/${NAME}.sh} init_logging -[ "$SLOW" = "no" ] && EXCEPT_SLOW="24o 27m 64b 68 71 77f 78 115 124b" +[ "$SLOW" = "no" ] && EXCEPT_SLOW="24o 27m 64b 68 71 77f 78 115 124b 230d" -[ $(facet_fstype $SINGLEMDS) = "zfs" ] && -# bug number for skipped test: LU-1593 LU-2610 LU-2833 LU-1957 LU-2805 - ALWAYS_EXCEPT="$ALWAYS_EXCEPT 34h 40 48a 180 184c" +if [ $(facet_fstype $SINGLEMDS) = "zfs" ]; then + # bug number for skipped test: LU-1593 LU-2833 LU-1957 LU-2805 + ALWAYS_EXCEPT="$ALWAYS_EXCEPT 34h 48a 180 184c" + [ "$SLOW" = "no" ] && EXCEPT_SLOW="$EXCEPT_SLOW 51b 51ba" +fi FAIL_ON_ERROR=false @@ -106,8 +108,8 @@ check_and_setup_lustre DIR=${DIR:-$MOUNT} assert_DIR -MDT0=$($LCTL get_param -n mdc.*.mds_server_uuid | \ - awk '{gsub(/_UUID/,""); print $1}' | head -1) +MDT0=$($LCTL get_param -n mdc.*.mds_server_uuid | + awk '{ gsub(/_UUID/,""); print $1 }' | head -n1) LOVNAME=$($LCTL get_param -n llite.*.lov.common_name | tail -n 1) OSTCOUNT=$($LCTL get_param -n lov.$LOVNAME.numobd) STRIPECOUNT=$($LCTL get_param -n lov.$LOVNAME.stripecount) @@ -193,6 +195,25 @@ test_3() { } 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" + + touch $DIR/$tdir/$tfile || + error "Create file under remote directory failed" + + rmdir $DIR/$tdir && + error "Expect error removing in-use dir $DIR/$tdir" + + test -d $DIR/$tdir || error "Remote directory disappeared" + + rm -rf $DIR/$tdir || error "remove remote dir error" +} +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" @@ -411,14 +432,14 @@ test_17e() { run_test 17e "symlinks: create recursive symlink (should return error) ====" test_17f() { - test_mkdir -p $DIR/d17f - ln -s 1234567890/2234567890/3234567890/4234567890 $DIR/d17f/111 - ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890 $DIR/d17f/222 - ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890 $DIR/d17f/333 - ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890 $DIR/d17f/444 - ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890/c234567890/d234567890/f234567890 $DIR/d17f/555 - ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890/c234567890/d234567890/f234567890/aaaaaaaaaa/bbbbbbbbbb/cccccccccc/dddddddddd/eeeeeeeeee/ffffffffff/ $DIR/d17f/666 - ls -l $DIR/d17f + test_mkdir -p $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 + ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890 $DIR/$tdir/444 + ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890/c234567890/d234567890/f234567890 $DIR/$tdir/555 + 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 ========================" @@ -447,6 +468,11 @@ test_17g() { [ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.3.55) ] && TESTS="4094 4095" + # skip long symlink name for rhel6.5. + # rhel6.5 has a limit (PATH_MAX - sizeof(struct filename)) + grep -q '6.5' /etc/redhat-release &>/dev/null && + TESTS="59 60 61 4062 4063" + for i in $TESTS; do local SYMNAME=$(str_repeat 'x' $i) ln -s $SYMNAME $DIR/$tdir/f$i || error "failed $i-char symlink" @@ -460,7 +486,7 @@ test_17h() { #bug 17378 [ $PARALLEL == "yes" ] && skip "skip parallel run" && return local mdt_idx test_mkdir -p $DIR/$tdir - if [ $MDSCOUNT -gt 1 ]; then + if [[ $MDSCOUNT -gt 1 ]]; then mdt_idx=$($LFS getdirstripe -i $DIR/$tdir) else mdt_idx=0 @@ -475,10 +501,10 @@ run_test 17h "create objects: lov_free_memmd() doesn't lbug" test_17i() { #bug 20018 remote_mds_nodsh && skip "remote MDS with nodsh" && return [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - test_mkdir -p $DIR/$tdir + test_mkdir -c1 $DIR/$tdir local foo=$DIR/$tdir/$tfile local mdt_idx - if [ $MDSCOUNT -gt 1 ]; then + if [[ $MDSCOUNT -gt 1 ]]; then mdt_idx=$($LFS getdirstripe -i $DIR/$tdir) else mdt_idx=0 @@ -492,9 +518,11 @@ test_17i() { #bug 20018 run_test 17i "don't panic on short symlink" test_17k() { #bug 22301 - rsync --help | grep -q xattr || - skip_env "$(rsync --version| head -1) does not support xattrs" - [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + [[ -z "$(which rsync 2>/dev/null)" ]] && + skip "no rsync command" && return 0 + 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 touch $DIR/$tdir/$tfile @@ -505,6 +533,8 @@ test_17k() { #bug 22301 run_test 17k "symlinks: rsync with xattrs enabled =========================" test_17l() { # LU-279 + [[ -z "$(which getfattr 2>/dev/null)" ]] && + skip "no getfattr command" && return 0 mkdir -p $DIR/$tdir touch $DIR/$tdir/$tfile ln -s $DIR/$tdir/$tfile $DIR/$tdir/$tfile.lnk @@ -530,6 +560,7 @@ test_17m() { local i local rc=0 + remote_mds_nodsh && skip "remote MDS with nodsh" && return [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.2.0) ] && [ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.2.93) ] && skip "MDS 2.2.0-2.2.93 do not NUL-terminate symlinks" && return @@ -571,10 +602,10 @@ test_17m() { echo "stop and checking mds${mds_index}: $cmd" # e2fsck should not return error - stop mds${mds_index} -f + stop mds${mds_index} do_facet mds${mds_index} $cmd || rc=$? - start mds${mds_index} $devname $MDS_MOUNT_OPTS + start mds${mds_index} $devname $MDS_MOUNT_OPTS || error "start failed" df $MOUNT > /dev/null 2>&1 [ $rc -ne 0 ] && error "e2fsck should not report error upon "\ "short/long symlink MDT: rc=$rc" @@ -588,7 +619,9 @@ check_fs_consistency_17n() { local cmd local rc=0 - for mdt_index in $(seq 1 $MDSCOUNT); do + # create/unlink in 17n only change 2 MDTs(MDT1/MDT2), + # so it only check MDT1/MDT2 instead of all of MDTs. + for mdt_index in $(seq 1 2); do devname=$(mdsdevname $mdt_index) cmd="$E2FSCK -fnvd $devname" @@ -597,7 +630,8 @@ check_fs_consistency_17n() { stop mds${mdt_index} do_facet mds${mdt_index} $cmd || rc=$? - start mds${mdt_index} $devname $MDS_MOUNT_OPTS + start mds${mdt_index} $devname $MDS_MOUNT_OPTS || + error "mount mds${mdt_index} failed" df $MOUNT > /dev/null 2>&1 [ $rc -ne 0 ] && break done @@ -607,6 +641,7 @@ check_fs_consistency_17n() { test_17n() { local i + remote_mds_nodsh && skip "remote MDS with nodsh" && return [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.2.0) ] && [ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.2.93) ] && skip "MDS 2.2.0-2.2.93 do not NUL-terminate symlinks" && return @@ -614,31 +649,53 @@ test_17n() { [ "$(facet_fstype $SINGLEMDS)" != "ldiskfs" ] && skip "only for ldiskfs MDT" && return 0 - [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + [[ $MDSCOUNT -lt 2 ]] && skip "needs >= 2 MDTs" && return [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - mkdir -p $DIR/$tdir + mkdir $DIR/$tdir for ((i=0; i<10; i++)); do - $LFS mkdir -i 1 $DIR/$tdir/remote_dir_${i} || + $LFS mkdir -i1 -c2 $DIR/$tdir/remote_dir_${i} || error "create remote dir error $i" createmany -o $DIR/$tdir/remote_dir_${i}/f 10 || error "create files under remote dir failed $i" done - check_fs_consistency_17n || error "e2fsck report error" + check_fs_consistency_17n || + error "e2fsck report error after create files under remote dir" + + for ((i=0;i<10;i++)); do + rm -rf $DIR/$tdir/remote_dir_${i} || + error "destroy remote dir error $i" + done + + check_fs_consistency_17n || + error "e2fsck report error after unlink files under remote dir" + + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.50) ] && + skip "lustre < 2.4.50 does not support migrate mv " && return + + for ((i=0; i<10; i++)); do + mkdir -p $DIR/$tdir/remote_dir_${i} + createmany -o $DIR/$tdir/remote_dir_${i}/f 10 || + error "create files under remote dir failed $i" + $LFS mv -M 1 $DIR/$tdir/remote_dir_${i} || + error "migrate remote dir error $i" + done + check_fs_consistency_17n || error "e2fsck report error after migration" for ((i=0;i<10;i++)); do rm -rf $DIR/$tdir/remote_dir_${i} || error "destroy remote dir error $i" done - check_fs_consistency_17n || error "e2fsck report error" + check_fs_consistency_17n || error "e2fsck report error after unlink" } run_test 17n "run e2fsck against master/slave MDT which contains remote dir" test_17o() { - [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.3.64) ]] && + remote_mds_nodsh && skip "remote MDS with nodsh" && return + [ $(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 @@ -653,7 +710,8 @@ test_17o() { touch $WDIR/$tfile stop mds${mdt_index} - start mds${mdt_index} $mdtdevname $MDS_MOUNT_OPTS + start mds${mdt_index} $mdtdevname $MDS_MOUNT_OPTS || + error "mount mds${mdt_index} failed" #define OBD_FAIL_OSD_LMA_INCOMPAT 0x194 do_facet mds${mdt_index} lctl set_param fail_loc=0x194 @@ -665,7 +723,7 @@ test_17o() { run_test 17o "stat file with incompat LMA feature" test_18() { - touch $DIR/f || error "Failed to touch $DIR/f: $?" + touch $DIR/$tfile || error "Failed to touch $DIR/$tfile: $?" ls $DIR || error "Failed to ls $DIR: $?" } run_test 18 "touch .../f ; ls ... ==============================" @@ -786,9 +844,9 @@ test_24c() { run_test 24c "rename directory to non-existent target" test_24d() { - test_mkdir $DIR/$tdir - test_mkdir $DIR/$tdir/d$testnum.1 - test_mkdir $DIR/$tdir/d$testnum.2 + test_mkdir -c1 $DIR/$tdir + test_mkdir -c1 $DIR/$tdir/d$testnum.1 + test_mkdir -c1 $DIR/$tdir/d$testnum.2 mrename $DIR/$tdir/d$testnum.1 $DIR/$tdir/d$testnum.2 $CHECKSTAT -a $DIR/$tdir/d$testnum.1 || error "d$testnum.1 exists" $CHECKSTAT -t dir $DIR/$tdir/d$testnum.2 || error "d$testnum.2 not dir" @@ -827,10 +885,10 @@ test_24g() { run_test 24g "mkdir .../R7{a,b}/d; mv .../R7a/d .../R7b/e ======" test_24h() { - test_mkdir $DIR/R8a - test_mkdir $DIR/R8b - test_mkdir $DIR/R8a/d - test_mkdir $DIR/R8b/e + test_mkdir -c1 $DIR/R8a + test_mkdir -c1 $DIR/R8b + test_mkdir -c1 $DIR/R8a/d + test_mkdir -c1 $DIR/R8b/e mrename $DIR/R8a/d $DIR/R8b/e $CHECKSTAT -a $DIR/R8a/d || error $CHECKSTAT -t dir $DIR/R8b/e || error @@ -968,7 +1026,6 @@ test_24t() { run_test 24t "mkdir .../R16a/b/c; rename .../R16a/b/c .../R16a =" test_24u() { # bug12192 - rm -rf $DIR/$tfile $MULTIOP $DIR/$tfile C2w$((2048 * 1024))c || error $CHECKSTAT -s $((2048 * 1024)) $DIR/$tfile || error "wrong file size" } @@ -985,13 +1042,13 @@ simple_cleanup_common() { } max_pages_per_rpc() { - $LCTL get_param -n mdc.*.max_pages_per_rpc | head -1 + $LCTL get_param -n mdc.*.max_pages_per_rpc | head -n1 } test_24v() { local NRFILES=100000 local FREE_INODES=$(mdt_free_inodes 0) - [ $FREE_INODES -lt $NRFILES ] && \ + [[ $FREE_INODES -lt $NRFILES ]] && skip "not enough free inodes $FREE_INODES required $NRFILES" && return @@ -1018,9 +1075,9 @@ test_24v() { DIRENT_SIZE=48 RPC_SIZE=$(($(max_pages_per_rpc) * $(page_size))) RPC_NUM=$(((NRFILES * DIRENT_SIZE + RPC_SIZE - 1) / RPC_SIZE + 1)) - mds_readpage=$(lctl get_param mdc.*MDT0000*.stats | \ + mds_readpage=$(lctl get_param mdc.*MDT0000*.stats | awk '/^mds_readpage/ {print $2}') - [ $mds_readpage -gt $RPC_NUM ] && \ + [[ $mds_readpage -gt $RPC_NUM ]] && error "large readdir doesn't take effect" simple_cleanup_common @@ -1033,13 +1090,13 @@ test_24w() { # bug21506 dd if=/dev/zero bs=$SZ1 count=1 >> $DIR/$tfile || return 2 dd if=$DIR/$tfile of=$DIR/${tfile}_left bs=1M skip=4097 || return 3 SZ2=`ls -l $DIR/${tfile}_left | awk '{print $5}'` - [ "$SZ1" = "$SZ2" ] || \ + [[ "$SZ1" -eq "$SZ2" ]] || error "Error reading at the end of the file $tfile" } run_test 24w "Reading a file larger than 4Gb" test_24x() { - [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + [[ $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 @@ -1070,7 +1127,7 @@ test_24x() { run_test 24x "cross rename/link should be failed" test_24y() { - [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + [[ $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 @@ -1098,7 +1155,7 @@ test_24y() { run_test 24y "rename/link on the same dir should succeed" test_24z() { - [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + [[ $MDSCOUNT -lt 2 ]] && skip "needs >= 2 MDTs" && return [ $PARALLEL == "yes" ] && skip "skip parallel run" && return local MDTIDX=1 local remote_src=$DIR/$tdir/remote_dir @@ -1129,16 +1186,71 @@ test_24A() { # LU-3182 rm -rf $DIR/$tdir mkdir -p $DIR/$tdir createmany -m $DIR/$tdir/$tfile $NFILES - local t=`ls $DIR/$tdir | wc -l` - local u=`ls $DIR/$tdir | sort -u | wc -l` - if [ $t -ne $NFILES -o $u -ne $NFILES ] ; then - error "Expected $NFILES files, got $t ($u unique)" + local t=$(ls $DIR/$tdir | wc -l) + local u=$(ls $DIR/$tdir | sort -u | wc -l) + local v=$(ls -ai $DIR/$tdir | sort -u | wc -l) + if [ $t -ne $NFILES -o $u -ne $NFILES -o $v -ne $((NFILES + 2)) ] ; then + error "Expected $NFILES files, got $t ($u unique $v .&..)" fi rm -rf $DIR/$tdir || error "Can not delete directories" } run_test 24A "readdir() returns correct number of entries." +test_24B() { # LU-4805 + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + local count + + mkdir $DIR/$tdir + $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir || + error "create striped dir failed" + + count=$(ls -ai $DIR/$tdir/striped_dir | wc -l) + [ $count -eq 2 ] || error "Expected 2, got $count" + + touch $DIR/$tdir/striped_dir/a + + count=$(ls -ai $DIR/$tdir/striped_dir | wc -l) + [ $count -eq 3 ] || error "Expected 3, got $count" + + touch $DIR/$tdir/striped_dir/.f + + count=$(ls -ai $DIR/$tdir/striped_dir | wc -l) + [ $count -eq 4 ] || error "Expected 4, got $count" + + rm -rf $DIR/$tdir || error "Can not delete directories" +} +run_test 24B "readdir for striped dir return correct number of entries" + +test_24C() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + + mkdir $DIR/$tdir + mkdir $DIR/$tdir/d0 + mkdir $DIR/$tdir/d1 + + $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/d0/striped_dir || + error "create striped dir failed" + + cd $DIR/$tdir/d0/striped_dir + + local d0_ino=$(ls -i -l -a $DIR/$tdir | grep "d0" | awk '{print $1}') + local d1_ino=$(ls -i -l -a $DIR/$tdir | grep "d1" | awk '{print $1}') + local parent_ino=$(ls -i -l -a | grep "\.\." | awk '{print $1}') + + [ "$d0_ino" = "$parent_ino" ] || + error ".. wrong, expect $d0_ino, get $parent_ino" + + mv $DIR/$tdir/d0/striped_dir $DIR/$tdir/d1/ || + error "mv striped dir failed" + + parent_ino=$(ls -i -l -a | grep "\.\." | awk '{print $1}') + + [ "$d1_ino" = "$parent_ino" ] || + error ".. wrong after mv, expect $d1_ino, get $parent_ino" +} +run_test 24C "check .. in striped dir" + test_25a() { echo '== symlink sanity =============================================' @@ -1215,14 +1327,13 @@ test_27a() { $GETSTRIPE $DIR/d27 $SETSTRIPE -c 1 $DIR/d27/f0 || error "setstripe failed" $CHECKSTAT -t file $DIR/d27/f0 || error "checkstat failed" - pass log "== test_27a: write to one stripe file =========================" cp /etc/hosts $DIR/d27/f0 || error } run_test 27a "one stripe file ==================================" test_27b() { - [ "$OSTCOUNT" -lt "2" ] && skip_env "skipping 2-stripe test" && return + [[ $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 @@ -1250,10 +1361,13 @@ test_27e() { run_test 27e "setstripe existing file (should return error) ======" test_27f() { - test_mkdir -p $DIR/d27 - $SETSTRIPE -S 100 -i 0 -c 1 $DIR/d27/fbad && error "setstripe failed" - dd if=/dev/zero of=$DIR/d27/fbad bs=4k count=4 || error "dd failed" - $GETSTRIPE $DIR/d27/fbad || error "$GETSTRIPE failed" + test_mkdir $DIR/$tdir + $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" } run_test 27f "setstripe with bad stripe size (should return error)" @@ -1267,7 +1381,7 @@ run_test 27g "$GETSTRIPE with no objects" test_27i() { touch $DIR/d27/fsome || error "touch failed" - [ $($GETSTRIPE -c $DIR/d27/fsome) -gt 0 ] || error "missing objects" + [[ $($GETSTRIPE -c $DIR/d27/fsome) -gt 0 ]] || error "missing objects" } run_test 27i "$GETSTRIPE with some objects" @@ -1300,9 +1414,9 @@ test_27l() { run_test 27l "check setstripe permissions (should return error)" test_27m() { - [ "$OSTCOUNT" -lt "2" ] && skip_env "$OSTCOUNT < 2 OSTs -- skipping" && + [[ $OSTCOUNT -lt 2 ]] && skip_env "$OSTCOUNT < 2 OSTs -- skipping" && return - if [ $ORIGFREE -gt $MAXFREE ]; then + if [[ $ORIGFREE -gt $MAXFREE ]]; then skip "$ORIGFREE > $MAXFREE skipping out-of-space test on OST0" return fi @@ -1313,14 +1427,14 @@ test_27m() { error "dd should fill OST0" i=2 while $SETSTRIPE -i 0 -c 1 $DIR/$tdir/f27m_$i; do - i=`expr $i + 1` + i=$((i + 1)) [ $i -gt 256 ] && break done - i=`expr $i + 1` + i=$((i + 1)) touch $DIR/$tdir/f27m_$i [ `$GETSTRIPE $DIR/$tdir/f27m_$i | grep -A 10 obdidx | awk '{print $1}'| grep -w "0"` ] && error "OST0 was full but new created file still use it" - i=`expr $i + 1` + i=$((i + 1)) touch $DIR/$tdir/f27m_$i [ `$GETSTRIPE $DIR/$tdir/f27m_$i | grep -A 10 obdidx | awk '{print $1}'| grep -w "0"` ] && error "OST0 was full but new created file still use it" @@ -1389,7 +1503,7 @@ exhaust_all_precreations() { } test_27n() { - [ "$OSTCOUNT" -lt "2" ] && skip_env "too few OSTs" && return + [[ $OSTCOUNT -lt 2 ]] && skip_env "too few 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 @@ -1405,7 +1519,7 @@ test_27n() { 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 "too few 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 @@ -1422,7 +1536,7 @@ test_27o() { 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 "too few 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 @@ -1445,7 +1559,7 @@ test_27p() { 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 "too few 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 @@ -1468,7 +1582,7 @@ test_27q() { 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 "too few 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 @@ -1495,17 +1609,17 @@ test_27s() { # bug 10725 run_test 27s "lsm_xfersize overflow (should error) (bug 10725)" test_27t() { # bug 10864 - WDIR=`pwd` - WLFS=`which lfs` - cd $DIR - touch $tfile - $WLFS getstripe $tfile - cd $WDIR + WDIR=$(pwd) + WLFS=$(which lfs) + cd $DIR + touch $tfile + $WLFS getstripe $tfile + cd $WDIR } 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 "too few OSTs" && return remote_mds_nodsh && skip "remote MDS with nodsh" && return local index local list=$(comma_list $(mdts_nodes)) @@ -1519,15 +1633,15 @@ test_27u() { # bug 4900 TLOG=$DIR/$tfile.getstripe $GETSTRIPE $DIR/$tdir > $TLOG - OBJS=`awk -vobj=0 '($1 == 0) { obj += 1 } END { print obj;}' $TLOG` + OBJS=$(awk -vobj=0 '($1 == 0) { obj += 1 } END { print obj; }' $TLOG) unlinkmany $DIR/$tdir/t- 1000 - [ $OBJS -gt 0 ] && \ - error "$OBJS objects created on OST-0. See $TLOG" || pass + [[ $OBJS -gt 0 ]] && + error "$OBJS objects created on OST-0. See $TLOG" || pass } 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 "too few 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 @@ -1568,8 +1682,8 @@ test_27w() { # bug 10997 run_test 27w "check $SETSTRIPE -S option" test_27wa() { - [ "$OSTCOUNT" -lt "2" ] && - skip_env "skipping multiple stripe count/offset test" && return + [[ $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 @@ -1587,7 +1701,7 @@ run_test 27wa "check $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 "$OSTCOUNT < 2 OSTs" && return [ $PARALLEL == "yes" ] && skip "skip parallel run" && return OFFSET=$(($OSTCOUNT - 1)) OSTIDX=0 @@ -1607,7 +1721,8 @@ test_27x() { run_test 27x "create files while OST0 is degraded" test_27y() { - [ "$OSTCOUNT" -lt "2" ] && skip_env "$OSTCOUNT < 2 OSTs -- skipping" && return + [[ $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 [ $PARALLEL == "yes" ] && skip "skip parallel run" && return @@ -1618,8 +1733,8 @@ test_27y() { 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 + [[ $fcount -eq 0 ]] && skip "not enough space on OST0" && return + [[ $fcount -gt $OSTCOUNT ]] && fcount=$OSTCOUNT local MDS_OSCS=$(do_facet $SINGLEMDS lctl dl | awk '/[oO][sS][cC].*md[ts]/ { print $4 }') @@ -1849,7 +1964,7 @@ test_27B() { # LU-2523 run_test 27B "call setstripe on open unlinked file/rename victim" test_27C() { #LU-2871 - [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return + [[ $OSTCOUNT -lt 2 ]] && skip "needs >= 2 OSTs" && return declare -a ost_idx local index @@ -1886,6 +2001,24 @@ test_27C() { #LU-2871 } run_test 27C "check full striping across all OSTs" +test_27D() { + [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return + local POOL=${POOL:-testpool} + local first_ost=0 + local last_ost=$(($OSTCOUNT - 1)) + local ost_step=1 + local ost_list=$(seq $first_ost $ost_step $last_ost) + local ost_range="$first_ost $last_ost $ost_step" + + mkdir -p $DIR/$tdir + pool_add $POOL || error "pool_add failed" + pool_add_targets $POOL $ost_range || error "pool_add_targets failed" + llapi_layout_test -d$DIR/$tdir -p$POOL -o$OSTCOUNT || + error "llapi_layout_test failed" + cleanup_pools || error "cleanup_pools failed" +} +run_test 27D "validate llapi_layout API" + # createtest also checks that device nodes are created and # then visible correctly (#2091) test_28() { # bug 2091 @@ -1927,14 +2060,14 @@ test_29() { let LOCKUNUSEDCOUNTCURRENT=$LOCKUNUSEDCOUNTCURRENT+$unused_count done - if [ "$LOCKCOUNTCURRENT" -gt "$LOCKCOUNTORIG" ]; then - lctl set_param -n ldlm.dump_namespaces "" + if [[ $LOCKCOUNTCURRENT -gt $LOCKCOUNTORIG ]]; then + $LCTL set_param -n ldlm.dump_namespaces "" error "CURRENT: $LOCKCOUNTCURRENT > $LOCKCOUNTORIG" $LCTL dk | sort -k4 -t: > $TMP/test_29.dk log "dumped log to $TMP/test_29.dk (bug 5793)" return 2 fi - if [ "$LOCKUNUSEDCOUNTCURRENT" -gt "$LOCKUNUSEDCOUNTORIG" ]; then + if [[ $LOCKUNUSEDCOUNTCURRENT -gt $LOCKUNUSEDCOUNTORIG ]]; then error "UNUSED: $LOCKUNUSEDCOUNTCURRENT > $LOCKUNUSEDCOUNTORIG" $LCTL dk | sort -k4 -t: > $TMP/test_29.dk log "dumped log to $TMP/test_29.dk (bug 5793)" @@ -1944,7 +2077,7 @@ test_29() { run_test 29 "IT_GETATTR regression ============================" test_30a() { # was test_30 - cp `which ls` $DIR || cp /bin/ls $DIR + cp $(which ls) $DIR || cp /bin/ls $DIR $DIR/ls / || error rm $DIR/ls } @@ -2038,76 +2171,74 @@ test_31f() { # bug 4554 run_test 31f "remove of open directory with open-unlink file ===" test_31g() { - echo "-- cross directory link --" - test_mkdir $DIR/d31ga - test_mkdir $DIR/d31gb - touch $DIR/d31ga/f - ln $DIR/d31ga/f $DIR/d31gb/g - $CHECKSTAT -t file $DIR/d31ga/f || error "source" - [ `stat -c%h $DIR/d31ga/f` == '2' ] || error "source nlink" - $CHECKSTAT -t file $DIR/d31gb/g || error "target" - [ `stat -c%h $DIR/d31gb/g` == '2' ] || error "target nlink" + echo "-- cross directory link --" + test_mkdir -c1 $DIR/${tdir}ga + test_mkdir -c1 $DIR/${tdir}gb + touch $DIR/${tdir}ga/f + ln $DIR/${tdir}ga/f $DIR/${tdir}gb/g + $CHECKSTAT -t file $DIR/${tdir}ga/f || error "source" + [ `stat -c%h $DIR/${tdir}ga/f` == '2' ] || error "source nlink" + $CHECKSTAT -t file $DIR/${tdir}gb/g || error "target" + [ `stat -c%h $DIR/${tdir}gb/g` == '2' ] || error "target nlink" } run_test 31g "cross directory link===============" test_31h() { - echo "-- cross directory link --" - test_mkdir $DIR/d31h - test_mkdir $DIR/d31h/dir - touch $DIR/d31h/f - ln $DIR/d31h/f $DIR/d31h/dir/g - $CHECKSTAT -t file $DIR/d31h/f || error "source" - [ `stat -c%h $DIR/d31h/f` == '2' ] || error "source nlink" - $CHECKSTAT -t file $DIR/d31h/dir/g || error "target" - [ `stat -c%h $DIR/d31h/dir/g` == '2' ] || error "target nlink" + echo "-- cross directory link --" + test_mkdir -c1 $DIR/${tdir} + test_mkdir -c1 $DIR/${tdir}/dir + touch $DIR/${tdir}/f + ln $DIR/${tdir}/f $DIR/${tdir}/dir/g + $CHECKSTAT -t file $DIR/${tdir}/f || error "source" + [ `stat -c%h $DIR/${tdir}/f` == '2' ] || error "source nlink" + $CHECKSTAT -t file $DIR/${tdir}/dir/g || error "target" + [ `stat -c%h $DIR/${tdir}/dir/g` == '2' ] || error "target nlink" } run_test 31h "cross directory link under child===============" test_31i() { - echo "-- cross directory link --" - test_mkdir $DIR/d31i - test_mkdir $DIR/d31i/dir - touch $DIR/d31i/dir/f - ln $DIR/d31i/dir/f $DIR/d31i/g - $CHECKSTAT -t file $DIR/d31i/dir/f || error "source" - [ `stat -c%h $DIR/d31i/dir/f` == '2' ] || error "source nlink" - $CHECKSTAT -t file $DIR/d31i/g || error "target" - [ `stat -c%h $DIR/d31i/g` == '2' ] || error "target nlink" + echo "-- cross directory link --" + test_mkdir -c1 $DIR/$tdir + test_mkdir -c1 $DIR/$tdir/dir + touch $DIR/$tdir/dir/f + ln $DIR/$tdir/dir/f $DIR/$tdir/g + $CHECKSTAT -t file $DIR/$tdir/dir/f || error "source" + [ `stat -c%h $DIR/$tdir/dir/f` == '2' ] || error "source nlink" + $CHECKSTAT -t file $DIR/$tdir/g || error "target" + [ `stat -c%h $DIR/$tdir/g` == '2' ] || error "target nlink" } run_test 31i "cross directory link under parent===============" - test_31j() { - test_mkdir $DIR/d31j - test_mkdir $DIR/d31j/dir1 - ln $DIR/d31j/dir1 $DIR/d31j/dir2 && error "ln for dir" - link $DIR/d31j/dir1 $DIR/d31j/dir3 && error "link for dir" - mlink $DIR/d31j/dir1 $DIR/d31j/dir4 && error "mlink for dir" - mlink $DIR/d31j/dir1 $DIR/d31j/dir1 && error "mlink to the same dir" + test_mkdir -c1 -p $DIR/$tdir + test_mkdir -c1 -p $DIR/$tdir/dir1 + ln $DIR/$tdir/dir1 $DIR/$tdir/dir2 && error "ln for dir" + link $DIR/$tdir/dir1 $DIR/$tdir/dir3 && error "link for dir" + mlink $DIR/$tdir/dir1 $DIR/$tdir/dir4 && error "mlink for dir" + mlink $DIR/$tdir/dir1 $DIR/$tdir/dir1 && error "mlink to the same dir" return 0 } run_test 31j "link for directory===============" - test_31k() { - test_mkdir $DIR/d31k - touch $DIR/d31k/s - touch $DIR/d31k/exist - mlink $DIR/d31k/s $DIR/d31k/t || error "mlink" - mlink $DIR/d31k/s $DIR/d31k/exist && error "mlink to exist file" - mlink $DIR/d31k/s $DIR/d31k/s && error "mlink to the same file" - mlink $DIR/d31k/s $DIR/d31k && error "mlink to parent dir" - mlink $DIR/d31k $DIR/d31k/s && error "mlink parent dir to target" - mlink $DIR/d31k/not-exist $DIR/d31k/foo && error "mlink non-existing to new" - mlink $DIR/d31k/not-exist $DIR/d31k/s && error "mlink non-existing to exist" + test_mkdir -c1 -p $DIR/$tdir + touch $DIR/$tdir/s + touch $DIR/$tdir/exist + mlink $DIR/$tdir/s $DIR/$tdir/t || error "mlink" + mlink $DIR/$tdir/s $DIR/$tdir/exist && error "mlink to exist file" + mlink $DIR/$tdir/s $DIR/$tdir/s && error "mlink to the same file" + mlink $DIR/$tdir/s $DIR/$tdir && error "mlink to parent dir" + mlink $DIR/$tdir $DIR/$tdir/s && error "mlink parent dir to target" + mlink $DIR/$tdir/not-exist $DIR/$tdir/foo && error "mlink non-existing to new" + mlink $DIR/$tdir/not-exist $DIR/$tdir/s && error "mlink non-existing to exist" return 0 } run_test 31k "link to file: the same, non-existing, dir===============" test_31m() { - test_mkdir $DIR/d31m + mkdir $DIR/d31m touch $DIR/d31m/s - test_mkdir $DIR/d31m2 + mkdir $DIR/d31m2 touch $DIR/d31m2/exist mlink $DIR/d31m/s $DIR/d31m2/t || error "mlink" mlink $DIR/d31m/s $DIR/d31m2/exist && error "mlink to exist file" @@ -2120,7 +2251,6 @@ test_31m() { run_test 31m "link to file: the same, non-existing, dir===============" test_31n() { - [ -e /proc/self/fd/173 ] && echo "skipping, fd 173 is in use" && return touch $DIR/$tfile || error "cannot create '$DIR/$tfile'" nlink=$(stat --format=%h $DIR/$tfile) [ ${nlink:--1} -eq 1 ] || error "nlink is $nlink, expected 1" @@ -2154,13 +2284,32 @@ test_31o() { # LU-2901 done wait local LINKS=$(ls -1 $DIR/$tdir | grep -c $tfile.$LOOP) - [ $LINKS -gt 1 ] && ls $DIR/$tdir && + [[ $LINKS -gt 1 ]] && ls $DIR/$tdir && error "$LINKS duplicate links to $tfile.$LOOP" && break || true done } run_test 31o "duplicate hard links with same filename" +test_31p() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + + mkdir $DIR/$tdir + $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir + $LFS setdirstripe -D -c2 -t all_char $DIR/$tdir/striped_dir + + opendirunlink $DIR/$tdir/striped_dir/test1 || + error "open unlink test1 failed" + opendirunlink $DIR/$tdir/striped_dir/test2 || + error "open unlink test2 failed" + + $CHECKSTAT -a $DIR/$tdir/striped_dir/test1 || + error "test1 still exists" + $CHECKSTAT -a $DIR/$tdir/striped_dir/test2 || + error "test2 still exists" +} +run_test 31p "remove of open striped directory" + cleanup_test32_mount() { trap 0 $UMOUNT -d $DIR/$tdir/ext2-mountpoint @@ -2333,7 +2482,6 @@ test_32n() { run_test 32n "open d32n/symlink->tmp/symlink->lustre-root ======" test_32o() { - rm -fr $DIR/d32o $DIR/$tfile touch $DIR/$tfile test_mkdir -p $DIR/d32o/tmp TMP_DIR=$DIR/d32o/tmp @@ -2423,9 +2571,9 @@ test_33b() { rm -fr $DIR/d33 test_mkdir -p $DIR/d33 chown $RUNAS_ID $DIR/d33 - $RUNAS $OPENFILE -f 1286739555 $DIR/d33/f33 && error "create" || true + $RUNAS $OPENFILE -f 1286739555 $DIR/d33/f33 } -run_test 33b "test open file with malformed flags (No panic and return error)" +run_test 33b "test open file with malformed flags (No panic)" test_33c() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return @@ -2494,7 +2642,7 @@ test_33c() { run_test 33c "test llobdstat and write_bytes" test_33d() { - [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + [[ $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 @@ -2519,6 +2667,52 @@ test_33d() { } run_test 33d "openfile with 444 modes and malformed flags under remote dir" +test_33e() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + + mkdir $DIR/$tdir + + $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir + $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1 + mkdir $DIR/$tdir/local_dir + + local s0_mode=$(stat -c%f $DIR/$tdir/striped_dir) + local s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1) + local l_mode=$(stat -c%f $DIR/$tdir/local_dir) + + [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] || + error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode" + + rmdir $DIR/$tdir/* || error "rmdir failed" + + umask 777 + $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir + $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1 + mkdir $DIR/$tdir/local_dir + + s0_mode=$(stat -c%f $DIR/$tdir/striped_dir) + s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1) + l_mode=$(stat -c%f $DIR/$tdir/local_dir) + + [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] || + error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode 777" + + rmdir $DIR/$tdir/* || error "rmdir(umask 777) failed" + + umask 000 + $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir + $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1 + mkdir $DIR/$tdir/local_dir + + s0_mode=$(stat -c%f $DIR/$tdir/striped_dir) + s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1) + l_mode=$(stat -c%f $DIR/$tdir/local_dir) + + [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] || + error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode 0" +} +run_test 33e "mkdir and striped directory should have same mode" + TEST_34_SIZE=${TEST_34_SIZE:-2000000000000} test_34a() { rm -f $DIR/f34 @@ -2727,8 +2921,8 @@ test_36g() { echo "fmd_before: $fmd_before" echo "fmd_after: $fmd_after" - [ "$fmd_after" -gt "$fmd_before" ] && \ - echo "AFTER: $fmd_after > BEFORE: $fmd_before" && \ + [[ $fmd_after -gt $fmd_before ]] && + echo "AFTER: $fmd_after > BEFORE: $fmd_before" && error "fmd didn't expire after ping" || true } run_test 36g "filter mod data cache expiry =====================" @@ -2740,6 +2934,25 @@ test_36h() { } run_test 36h "utime on file racing with OST BRW write ==========" +test_36i() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + + mkdir $DIR/$tdir + $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir + + local mtime=$(stat -c%Y $DIR/$tdir/striped_dir) + local new_mtime=$((mtime + 200)) + + #change Modify time of striped dir + touch -m -d @$new_mtime $DIR/$tdir/striped_dir || + error "change mtime failed" + + local got=$(stat -c%Y $DIR/$tdir/striped_dir) + + [ "$new_mtime" = "$got" ] || error "expect $new_mtime got $got" +} +run_test 36i "change mtime on striped directory" + # test_37 - duplicate with tests 32q 32r test_38() { @@ -2774,7 +2987,7 @@ test_39() { run_test 39 "mtime changed on create ===========================" test_39b() { - test_mkdir -p $DIR/$tdir + test_mkdir -p -c1 $DIR/$tdir cp -p /etc/passwd $DIR/$tdir/fopen cp -p /etc/passwd $DIR/$tdir/flink cp -p /etc/passwd $DIR/$tdir/funlink @@ -3159,11 +3372,11 @@ test_39o() { run_test 39o "directory cached attributes updated after create ========" test_39p() { - [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + [[ $MDSCOUNT -lt 2 ]] && skip "needs >= 2 MDTs" && return local MDTIDX=1 TESTDIR=$DIR/$tdir/$tfile [ -e $TESTDIR ] && rm -rf $TESTDIR - test_mkdir -p $TESTDIR + mkdir -p $TESTDIR cd $TESTDIR links1=2 ls @@ -3198,8 +3411,9 @@ test_41() { run_test 41 "test small file write + fstat =====================" count_ost_writes() { - lctl get_param -n osc.*.stats | - awk -vwrites=0 '/ost_write/ { writes += $2 } END { print writes; }' + lctl get_param -n osc.*.stats | + awk -vwrites=0 '/ost_write/ { writes += $2 } \ + END { printf("%0.0f", writes) }' } # decent default @@ -3275,23 +3489,23 @@ test_42b() { setup_test42 cancel_lru_locks osc stop_writeback - sync - dd if=/dev/zero of=$DIR/f42b bs=1024 count=100 - BEFOREWRITES=`count_ost_writes` - $MUNLINK $DIR/f42b || error "$MUNLINK $DIR/f42b: $?" - AFTERWRITES=`count_ost_writes` - if [ $BEFOREWRITES -lt $AFTERWRITES ]; then - error "$BEFOREWRITES < $AFTERWRITES on unlink" - fi - BEFOREWRITES=`count_ost_writes` - sync || error "sync: $?" - AFTERWRITES=`count_ost_writes` - if [ $BEFOREWRITES -lt $AFTERWRITES ]; then - error "$BEFOREWRITES < $AFTERWRITES on sync" - fi - dmesg | grep 'error from obd_brw_async' && error 'error writing back' + sync + dd if=/dev/zero of=$DIR/f42b bs=1024 count=100 + BEFOREWRITES=$(count_ost_writes) + $MUNLINK $DIR/f42b || error "$MUNLINK $DIR/f42b: $?" + AFTERWRITES=$(count_ost_writes) + if [[ $BEFOREWRITES -lt $AFTERWRITES ]]; then + error "$BEFOREWRITES < $AFTERWRITES on unlink" + fi + BEFOREWRITES=$(count_ost_writes) + sync || error "sync: $?" + AFTERWRITES=$(count_ost_writes) + if [[ $BEFOREWRITES -lt $AFTERWRITES ]]; then + error "$BEFOREWRITES < $AFTERWRITES on sync" + fi + dmesg | grep 'error from obd_brw_async' && error 'error writing back' start_writeback - return 0 + return 0 } run_test 42b "test destroy of file with cached dirty data ======" @@ -3374,7 +3588,7 @@ test_42e() { # bug22074 dd if=/dev/zero of=$TDIR/w$i bs="$max_dirty_mb"M count=1 break done - [ $i -gt $warmup_files ] && error "OST0 is still cold" + [[ $i -gt $warmup_files ]] && error "OST0 is still cold" sync $LCTL get_param $proc_osc0/cur_dirty_bytes $LCTL get_param $proc_osc0/cur_grant_bytes @@ -3408,10 +3622,10 @@ test_42e() { # bug22074 $have_ppr || continue # we only want the percent stat for < 16 pages - [ $(echo $PPR | tr -d ':') -ge $pages ] && break + [[ $(echo $PPR | tr -d ':') -ge $pages ]] && break percent=$((percent + WPCT)) - if [ $percent -gt 15 ]; then + if [[ $percent -gt 15 ]]; then error "less than 16-pages write RPCs" \ "$percent% > 15%" break @@ -3474,45 +3688,52 @@ test_43c() { run_test 43c "md5sum of copy into lustre========================" test_44() { - [ "$OSTCOUNT" -lt "2" ] && skip_env "skipping 2-stripe test" && return + [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test" && return dd if=/dev/zero of=$DIR/f1 bs=4k count=1 seek=1023 dd if=$DIR/f1 bs=4k count=1 > /dev/null } run_test 44 "zero length read from a sparse stripe =============" test_44a() { - local nstripe=`$LCTL lov_getconfig $DIR | grep default_stripe_count: | \ - awk '{print $2}'` - [ -z "$nstripe" ] && skip "can't get stripe info" && return - [ "$nstripe" -gt "$OSTCOUNT" ] && skip "Wrong default_stripe_count: $nstripe (OSTCOUNT: $OSTCOUNT)" && return - local stride=`$LCTL lov_getconfig $DIR | grep default_stripe_size: | \ - awk '{print $2}'` - if [ $nstripe -eq 0 -o $nstripe -eq -1 ] ; then - nstripe=`$LCTL lov_getconfig $DIR | grep obd_count: | awk '{print $2}'` - fi + local nstripe=$($LCTL lov_getconfig $DIR | grep default_stripe_count: | + awk '{ print $2 }') + [ -z "$nstripe" ] && skip "can't get stripe info" && return + [[ $nstripe -gt $OSTCOUNT ]] && + skip "Wrong default_stripe_count: $nstripe (OSTCOUNT: $OSTCOUNT)" && + return + local stride=$($LCTL lov_getconfig $DIR | grep default_stripe_size: | + awk '{ print $2 }') + if [[ $nstripe -eq 0 || $nstripe -eq -1 ]]; then + nstripe=$($LCTL lov_getconfig $DIR | grep obd_count: | + awk '{ print $2 }') + fi - OFFSETS="0 $((stride/2)) $((stride-1))" - for offset in $OFFSETS ; do - for i in `seq 0 $((nstripe-1))`; do - local GLOBALOFFSETS="" - local size=$((((i + 2 * $nstripe )*$stride + $offset))) # Bytes - local myfn=$DIR/d44a-$size - echo "--------writing $myfn at $size" - ll_sparseness_write $myfn $size || error "ll_sparseness_write" - GLOBALOFFSETS="$GLOBALOFFSETS $size" - ll_sparseness_verify $myfn $GLOBALOFFSETS \ - || error "ll_sparseness_verify $GLOBALOFFSETS" - - for j in `seq 0 $((nstripe-1))`; do - size=$((((j + $nstripe )*$stride + $offset))) # Bytes - ll_sparseness_write $myfn $size || error "ll_sparseness_write" - GLOBALOFFSETS="$GLOBALOFFSETS $size" - done - ll_sparseness_verify $myfn $GLOBALOFFSETS \ - || error "ll_sparseness_verify $GLOBALOFFSETS" - rm -f $myfn - done - done + OFFSETS="0 $((stride/2)) $((stride-1))" + for offset in $OFFSETS; do + for i in $(seq 0 $((nstripe-1))); do + local GLOBALOFFSETS="" + # size in Bytes + local size=$((((i + 2 * $nstripe )*$stride + $offset))) + local myfn=$DIR/d44a-$size + echo "--------writing $myfn at $size" + ll_sparseness_write $myfn $size || + error "ll_sparseness_write" + GLOBALOFFSETS="$GLOBALOFFSETS $size" + ll_sparseness_verify $myfn $GLOBALOFFSETS || + error "ll_sparseness_verify $GLOBALOFFSETS" + + for j in $(seq 0 $((nstripe-1))); do + # size in Bytes + size=$((((j + $nstripe )*$stride + $offset))) + ll_sparseness_write $myfn $size || + error "ll_sparseness_write" + GLOBALOFFSETS="$GLOBALOFFSETS $size" + done + ll_sparseness_verify $myfn $GLOBALOFFSETS || + error "ll_sparseness_verify $GLOBALOFFSETS" + rm -f $myfn + done + done } run_test 44a "test sparse pwrite ===============================" @@ -3538,17 +3759,18 @@ test_45() { stop_writeback sync do_dirty_record "echo blah > $f" - [ $before -eq $after ] && error "write wasn't cached" + [[ $before -eq $after ]] && error "write wasn't cached" do_dirty_record "> $f" - [ $before -gt $after ] || error "truncate didn't lower dirty count" + [[ $before -gt $after ]] || error "truncate didn't lower dirty count" do_dirty_record "echo blah > $f" - [ $before -eq $after ] && error "write wasn't cached" + [[ $before -eq $after ]] && error "write wasn't cached" do_dirty_record "sync" - [ $before -gt $after ] || error "writeback didn't lower dirty count" + [[ $before -gt $after ]] || error "writeback didn't lower dirty count" do_dirty_record "echo blah > $f" - [ $before -eq $after ] && error "write wasn't cached" + [[ $before -eq $after ]] && error "write wasn't cached" do_dirty_record "cancel_lru_locks osc" - [ $before -gt $after ] || error "lock cancellation didn't lower dirty count" + [[ $before -gt $after ]] || + error "lock cancellation didn't lower dirty count" start_writeback } run_test 45 "osc io page accounting ============================" @@ -3696,17 +3918,19 @@ run_test 48e "Access to recreated parent subdir (should return errors)" test_49() { # LU-1030 [ $PARALLEL == "yes" ] && skip "skip parallel run" && return # get ost1 size - lustre-OST0000 - ost1_size=$(do_facet ost1 lfs df |grep ${ost1_svc} |awk '{print $4}') + ost1_size=$(do_facet ost1 $LFS df | grep ${ost1_svc} | + awk '{ print $4 }') # write 800M at maximum - [ $ost1_size -gt 819200 ] && ost1_size=819200 + [[ $ost1_size -lt 2 ]] && ost1_size=2 + [[ $ost1_size -gt 819200 ]] && ost1_size=819200 - lfs setstripe -c 1 -i 0 $DIR/$tfile + $SETSTRIPE -c 1 -i 0 $DIR/$tfile dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((ost1_size >> 2)) & local dd_pid=$! # change max_pages_per_rpc while writing the file local osc1_mppc=osc.$(get_osc_import_name client ost1).max_pages_per_rpc - local orig_mppc=`$LCTL get_param -n $osc1_mppc` + local orig_mppc=$($LCTL get_param -n $osc1_mppc) # loop until dd process exits while ps ax -opid | grep -wq $dd_pid; do $LCTL set_param $osc1_mppc=$((RANDOM % 256 + 1)) @@ -3728,13 +3952,13 @@ run_test 50 "special situations: /proc symlinks ===============" test_51a() { # was test_51 # bug 1516 - create an empty entry right after ".." then split dir - test_mkdir -p $DIR/$tdir + test_mkdir -c1 $DIR/$tdir touch $DIR/$tdir/foo $MCREATE $DIR/$tdir/bar rm $DIR/$tdir/foo createmany -m $DIR/$tdir/longfile 201 FNUM=202 - while [ $(ls -sd $DIR/$tdir | awk '{ print $1 }') -eq 4 ]; do + while [[ $(ls -sd $DIR/$tdir | awk '{ print $1 }') -eq 4 ]]; do $MCREATE $DIR/$tdir/longfile$FNUM FNUM=$(($FNUM + 1)) echo -n "+" @@ -3747,34 +3971,42 @@ run_test 51a "special situations: split htree with empty entry ==" export NUMTEST=70000 test_51b() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - local BASE=$DIR/$tdir + local BASE=$DIR/d${base}.${TESTSUITE} # cleanup the directory rm -fr $BASE - test_mkdir -p $BASE + test_mkdir -p -c1 $BASE + $LFS df + $LFS df -i local mdtidx=$(printf "%04x" $($LFS getstripe -M $BASE)) local numfree=$(lctl get_param -n mdc.$FSNAME-MDT$mdtidx*.filesfree) - [ $numfree -lt 21000 ] && skip "not enough free inodes ($numfree)" && + [[ $numfree -lt 21000 ]] && + skip "not enough free inodes ($numfree) on MDT$mdtidx" && return - [ $numfree -lt $NUMTEST ] && NUMTEST=$(($numfree - 50)) && - echo "reduced count to $NUMTEST due to inodes" + [[ $numfree -lt $NUMTEST ]] && NUMTEST=$(($numfree - 50)) && + echo "reduced count to $NUMTEST due to inodes on MDT$mdtidx" # need to check free space for the directories as well local blkfree=$(lctl get_param -n mdc.$FSNAME-MDT$mdtidx*.kbytesavail) numfree=$((blkfree / 4)) - [ $numfree -lt $NUMTEST ] && NUMTEST=$(($numfree - 50)) && - echo "reduced count to $NUMTEST due to blocks" + [[ $numfree -lt $NUMTEST ]] && NUMTEST=$((numfree - 50)) && + echo "reduced count to $NUMTEST due to blocks on MDT$mdtidx" createmany -d $BASE/d $NUMTEST && echo $NUMTEST > $BASE/fnum || + { + $LFS df + $LFS df -i echo "failed" > $BASE/fnum + error "failed to create $NUMTEST subdirs in MDT$mdtidx:$BASE" + } } run_test 51b "exceed 64k subdirectory nlink limit" test_51ba() { # LU-993 - local BASE=$DIR/$tdir + local BASE=$DIR/d${base}.${TESTSUITE} # unlink all but 100 subdirectories, then check it still works local LEFT=100 [ -f $BASE/fnum ] && local NUMPREV=$(cat $BASE/fnum) && rm $BASE/fnum @@ -3813,40 +4045,65 @@ test_51ba() { # LU-993 # regardless of whether the backing filesystem tracks nlink accurately # or not, the nlink count shouldn't be more than "." and ".." here local AFTER=$(stat -c %h $BASE) - [ $AFTER -gt 2 ] && error "nlink after: $AFTER > 2" || + [[ $AFTER -gt 2 ]] && error "nlink after: $AFTER > 2" || echo "nlink after: $AFTER" } run_test 51ba "verify nlink for many subdirectory cleanup" 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 - createmany -o $DIR/$tdir/t- 1000 - $GETSTRIPE $DIR/$tdir > $TMP/files - for N in `seq 0 $((OSTCOUNT - 1))`; do - OBJS[$N]=`awk -vobjs=0 '($1 == '$N') { objs += 1 } END { print objs;}' $TMP/files` - OBJS0[$N]=`grep -A 1 idx $TMP/files | awk -vobjs=0 '($1 == '$N') { objs += 1 } END { print objs;}'` - log "OST$N has ${OBJS[$N]} objects, ${OBJS0[$N]} are index 0" - done - unlinkmany $DIR/$tdir/t- 1000 - - NLAST=0 - for N in `seq 1 $((OSTCOUNT - 1))`; do - [ ${OBJS[$N]} -lt $((${OBJS[$NLAST]} - 20)) ] && \ - error "OST $N has less objects vs OST $NLAST (${OBJS[$N]} < ${OBJS[$NLAST]}" - [ ${OBJS[$N]} -gt $((${OBJS[$NLAST]} + 20)) ] && \ - error "OST $N has less objects vs OST $NLAST (${OBJS[$N]} < ${OBJS[$NLAST]}" - - [ ${OBJS0[$N]} -lt $((${OBJS0[$NLAST]} - 20)) ] && \ - error "OST $N has less #0 objects vs OST $NLAST (${OBJS0[$N]} < ${OBJS0[$NLAST]}" - [ ${OBJS0[$N]} -gt $((${OBJS0[$NLAST]} + 20)) ] && \ - error "OST $N has less #0 objects vs OST $NLAST (${OBJS0[$N]} < ${OBJS0[$NLAST]}" - NLAST=$N - done + [[ $OSTCOUNT -lt 3 ]] && + skip_env "skipping test with few OSTs" && return + test_mkdir -p $DIR/$tdir + createmany -o $DIR/$tdir/t- 1000 + $GETSTRIPE $DIR/$tdir > $TMP/files + for N in $(seq 0 $((OSTCOUNT - 1))); do + OBJS[$N]=$(awk -vobjs=0 '($1 == '$N') { objs += 1 } \ + END { printf("%0.0f", objs) }' $TMP/files) + OBJS0[$N]=$(grep -A 1 idx $TMP/files | awk -vobjs=0 \ + '($1 == '$N') { objs += 1 } \ + END { printf("%0.0f", objs) }') + log "OST$N has ${OBJS[$N]} objects, ${OBJS0[$N]} are index 0" + done + unlinkmany $DIR/$tdir/t- 1000 + + NLAST=0 + for N in $(seq 1 $((OSTCOUNT - 1))); do + [[ ${OBJS[$N]} -lt $((${OBJS[$NLAST]} - 20)) ]] && + error "OST $N has less objects vs OST $NLAST" \ + " (${OBJS[$N]} < ${OBJS[$NLAST]}" + [[ ${OBJS[$N]} -gt $((${OBJS[$NLAST]} + 20)) ]] && + error "OST $N has less objects vs OST $NLAST" \ + " (${OBJS[$N]} < ${OBJS[$NLAST]}" + + [[ ${OBJS0[$N]} -lt $((${OBJS0[$NLAST]} - 20)) ]] && + error "OST $N has less #0 objects vs OST $NLAST" \ + " (${OBJS0[$N]} < ${OBJS0[$NLAST]}" + [[ ${OBJS0[$N]} -gt $((${OBJS0[$NLAST]} + 20)) ]] && + error "OST $N has less #0 objects vs OST $NLAST" \ + " (${OBJS0[$N]} < ${OBJS0[$NLAST]}" + NLAST=$N + done } run_test 51d "check object distribution ====================" +test_51e() { + if [ "$(facet_fstype $SINGLEMDS)" != ldiskfs ]; then + skip "Only applicable to ldiskfs-based MDTs" + return + fi + + test_mkdir -c1 $DIR/$tdir || error "create $tdir failed" + test_mkdir -c1 $DIR/$tdir/d0 || error "create d0 failed" + + touch $DIR/$tdir/d0/foo + createmany -l $DIR/$tdir/d0/foo $DIR/$tdir/d0/f- 65001 && + error "file exceed 65000 nlink limit!" + unlinkmany $DIR/$tdir/d0/f- 65001 + return 0 +} +run_test 51e "check file nlink limit" + test_52a() { [ -f $DIR/$tdir/foo ] && chattr -a $DIR/$tdir/foo test_mkdir -p $DIR/$tdir @@ -3904,37 +4161,53 @@ test_53() { local ost_last_id local ostnum local node - local found=0 + local found=false + local support_last_seq=true + + [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.3.60) ]] || + support_last_seq=false # only test MDT0000 - local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS) - for value in $(do_facet $SINGLEMDS lctl get_param osc.$mdtosc.prealloc_last_id) ; do - param=$(echo ${value[0]} | cut -d "=" -f1) - ostname=$(echo $param | cut -d "." -f2 | cut -d - -f 1-2) - param_seq=$(echo ${param} | - sed -e s/prealloc_last_id/prealloc_last_seq/g) - mds_last_seq=$(do_facet $SINGLEMDS lctl get_param -n $param_seq) - mds_last=$(do_facet $SINGLEMDS lctl get_param -n $param) + local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS) + local value + for value in $(do_facet $SINGLEMDS \ + $LCTL get_param osc.$mdtosc.prealloc_last_id) ; do + param=$(echo ${value[0]} | cut -d "=" -f1) + ostname=$(echo $param | cut -d "." -f2 | cut -d - -f 1-2) + + if $support_last_seq; then + param_seq=$(echo $param | + sed -e s/prealloc_last_id/prealloc_last_seq/g) + mds_last_seq=$(do_facet $SINGLEMDS \ + $LCTL get_param -n $param_seq) + fi + mds_last=$(do_facet $SINGLEMDS $LCTL get_param -n $param) ostnum=$(index_from_ostuuid ${ostname}_UUID) node=$(facet_active_host ost$((ostnum+1))) param="obdfilter.$ostname.last_id" - for ost_last in $(do_node $node lctl get_param -n $param) ; do - echo "$ostname.last_id=$ost_last ;MDS.last_id=$mds_last" - ost_last_id=$(echo $ost_last | awk -F':' '{print $2}' | - sed -e "s/^0x//g") - ost_last_seq=$(echo $ost_last | awk -F':' '{print $1}') - if [ $ost_last_seq = $mds_last_seq ]; then - if [ $ost_last_id != $mds_last ]; then - error "$ost_last != $mds_last_id" - else - found=1 - break - fi + for ost_last in $(do_node $node $LCTL get_param -n $param) ; do + echo "$ostname.last_id=$ost_last; MDS.last_id=$mds_last" + ost_last_id=$ost_last + + if $support_last_seq; then + ost_last_id=$(echo $ost_last | + awk -F':' '{print $2}' | + sed -e "s/^0x//g") + ost_last_seq=$(echo $ost_last | + awk -F':' '{print $1}') + [[ $ost_last_seq = $mds_last_seq ]] || continue + fi + + if [[ $ost_last_id != $mds_last ]]; then + error "$ost_last_id != $mds_last" + else + found=true + break fi done - done - [ $found = 0 ] && error "can not match last_seq/last_id for $mdtosc" + done + $found || error "can not match last_seq/last_id for $mdtosc" return 0 } run_test 53 "verify that MDS and OSTs agree on pre-creation ====" @@ -3969,27 +4242,39 @@ find_loop_dev() { done } +cleanup_54c() { + loopdev="$DIR/loop54c" + + trap 0 + $UMOUNT -d $DIR/$tdir || rc=$? + losetup -d $loopdev || true + losetup -d $LOOPDEV || true + rm -rf $loopdev $DIR/$tfile $DIR/$tdir + return $rc +} + test_54c() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - tfile="$DIR/f54c" - tdir="$DIR/d54c" loopdev="$DIR/loop54c" find_loop_dev [ -z "$LOOPNUM" ] && echo "couldn't find empty loop device" && return + trap cleanup_54c EXIT mknod $loopdev b 7 $LOOPNUM - echo "make a loop file system with $tfile on $loopdev ($LOOPNUM)..." - dd if=/dev/zero of=$tfile bs=`page_size` seek=1024 count=1 > /dev/null - losetup $loopdev $tfile || error "can't set up $loopdev for $tfile" + echo "make a loop file system with $DIR/$tfile on $loopdev ($LOOPNUM)." + dd if=/dev/zero of=$DIR/$tfile bs=$(get_page_size client) seek=1024 count=1 > /dev/null + losetup $loopdev $DIR/$tfile || + error "can't set up $loopdev for $DIR/$tfile" mkfs.ext2 $loopdev || error "mke2fs on $loopdev" - test_mkdir -p $tdir - mount -t ext2 $loopdev $tdir || error "error mounting $loopdev on $tdir" - dd if=/dev/zero of=$tdir/tmp bs=`page_size` count=30 || error "dd write" - df $tdir - dd if=$tdir/tmp of=/dev/zero bs=`page_size` count=30 || error "dd read" - $UMOUNT -d $tdir - losetup -d $loopdev - rm $loopdev + test_mkdir -p $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 || + error "dd write" + df $DIR/$tdir + dd if=$DIR/$tdir/tmp of=/dev/zero bs=$(get_page_size client) count=30 || + error "dd read" + cleanup_54c } run_test 54c "block device works in lustre =====================" @@ -4019,76 +4304,77 @@ test_56a() { # was test_56 test_mkdir -p $DIR/$tdir/dir NUMFILES=3 NUMFILESx2=$(($NUMFILES * 2)) - for i in `seq 1 $NUMFILES` ; do + for i in $(seq 1 $NUMFILES); do touch $DIR/$tdir/file$i touch $DIR/$tdir/dir/file$i done # 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=$($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." # 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=$($GETSTRIPE $DIR/$tdir/file1 | grep -c obdidx) + [[ $FILENUM -eq 1 ]] || + error "$GETSTRIPE $DIR/$tdir/file1: found $FILENUM, not 1" + echo "$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" - echo "$GETSTRIPE --verbose passed." + [[ $($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 ]] || + rror "$GETSTRIPE $DIR/$tdir: showed lmm_magic" + echo "$GETSTRIPE --verbose 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" + grep -q "unknown obduuid" || + error "$GETSTRIPE --obd wrong_uuid should return error message" - [ "$OSTCOUNT" -lt 2 ] && + [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping other $GETSTRIPE --obd test" && return OSTIDX=1 OBDUUID=$(ostuuid_from_index $OSTIDX) - FILENUM=`$GETSTRIPE -ir $DIR/$tdir | grep -x $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' | - 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" + 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' | + 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" } run_test 56a "check $GETSTRIPE" NUMFILES=3 NUMDIRS=3 setup_56() { - local LOCAL_NUMFILES="$1" - local LOCAL_NUMDIRS="$2" - local MKDIR_PARAMS="$3" - - if [ ! -d "$TDIR" ] ; then - test_mkdir -p $TDIR - [ "$MKDIR_PARAMS" ] && $SETSTRIPE $MKDIR_PARAMS $TDIR - for i in `seq 1 $LOCAL_NUMFILES` ; do - touch $TDIR/file$i - done - for i in `seq 1 $LOCAL_NUMDIRS` ; do - test_mkdir $TDIR/dir$i - for j in `seq 1 $LOCAL_NUMFILES` ; do - touch $TDIR/dir$i/file$j - done - done - fi + 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 + 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 + done + done + fi } setup_56_special() { @@ -4216,7 +4502,6 @@ 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)" @@ -4330,7 +4615,7 @@ test_56s() { # LU-611 TDIR=$DIR/${tdir}s setup_56 $NUMFILES $NUMDIRS "-c $OSTCOUNT" - if [ $OSTCOUNT -gt 1 ]; then + if [[ $OSTCOUNT -gt 1 ]]; then $SETSTRIPE -c 1 $TDIR/$tfile.{0,1,2,3} ONESTRIPE=4 EXTRA=4 @@ -4342,31 +4627,41 @@ test_56s() { # LU-611 EXPECTED=$(((NUMDIRS + 1) * NUMFILES)) CMD="$LFIND -stripe-count $OSTCOUNT -type f $TDIR" NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || + [ $NUMS -eq $EXPECTED ] || { + $GETSTRIPE -R $TDIR 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 ] || + [ $NUMS -eq $EXPECTED ] || { + $GETSTRIPE -R $TDIR error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" + } EXPECTED=$ONESTRIPE CMD="$LFIND -stripe-count 1 -type f $TDIR" NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || + [ $NUMS -eq $EXPECTED ] || { + $GETSTRIPE -R $TDIR error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" + } CMD="$LFIND -stripe-count -2 -type f $TDIR" NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || + [ $NUMS -eq $EXPECTED ] || { + $GETSTRIPE -R $TDIR 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 ] || + [ $NUMS -eq $EXPECTED ] || { + $GETSTRIPE -R $TDIR error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" + } } run_test 56s "check lfs find -stripe-count works" @@ -4421,7 +4716,7 @@ test_56u() { # LU-611 TDIR=$DIR/${tdir}u setup_56 $NUMFILES $NUMDIRS "-i 0" - if [ $OSTCOUNT -gt 1 ]; then + if [[ $OSTCOUNT -gt 1 ]]; then $SETSTRIPE -i 1 $TDIR/$tfile.{0,1,2,3} ONESTRIPE=4 else @@ -4452,7 +4747,7 @@ test_56u() { # LU-611 [ $NUMS -eq $EXPECTED ] || error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" - if [ $OSTCOUNT -gt 1 ]; then + if [[ $OSTCOUNT -gt 1 ]]; then EXPECTED=$(((NUMDIRS + 1) * NUMFILES + ONESTRIPE)) CMD="$LFIND -stripe-index 0,1 -type f $TDIR" NUMS=$($CMD | wc -l) @@ -4480,34 +4775,12 @@ test_56v() { } run_test 56v "check 'lfs find -mdt match with lfs getstripe -M' =======" -# Get and check the actual stripe count of one file. -# Usage: check_stripe_count -check_stripe_count() { - local file=$1 - local expected=$2 - local actual - - [[ -z "$file" || -z "$expected" ]] && - error "check_stripe_count: invalid argument!" - - local cmd="$GETSTRIPE -c $file" - actual=$($cmd) || error "$cmd failed" - actual=${actual%% *} - - if [[ $actual -ne $expected ]]; then - [[ $expected -eq -1 ]] || - error "$cmd wrong: found $actual, expected $expected" - [[ $actual -eq $OSTCOUNT ]] || - error "$cmd wrong: found $actual, expected $OSTCOUNT" - fi -} - test_56w() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return TDIR=$DIR/${tdir}w rm -rf $TDIR || error "remove $TDIR failed" - setup_56 $NUMFILES $NUMDIRS "-c $OSTCOUNT" + setup_56 $NUMFILES $NUMDIRS "-c $OSTCOUNT" "-c1" local stripe_size stripe_size=$($GETSTRIPE -S -d $TDIR) || @@ -4581,7 +4854,7 @@ run_test 56w "check lfs_migrate -c stripe_count works" test_56x() { check_swap_layouts_support && return 0 - [ "$OSTCOUNT" -lt "2" ] && + [[ $OSTCOUNT -lt 2 ]] && skip_env "need 2 OST, skipping test" && return local dir0=$DIR/$tdir/$testnum @@ -4633,6 +4906,30 @@ test_56y() { } run_test 56y "lfs find -L raid0|released" +test_56z() { # LU-4824 + # This checks to make sure 'lfs find' continues after errors + # There are two classes of errors that should be caught: + # - If multiple paths are provided, all should be searched even if one + # errors out + # - If errors are encountered during the search, it should not terminate + # early + local i + test_mkdir $DIR/$tdir + for i in d{0..9}; do + test_mkdir $DIR/$tdir/$i + done + touch $DIR/$tdir/d{0..9}/$tfile + $LFS find $DIR/non_existent_dir $DIR/$tdir && + 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) + # The user should be able to see 10 directories and 9 files + [ $count == 19 ] || error "$LFS find did not continue after error" +} +run_test 56z "lfs find should continue after an error" + test_57a() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return # note test will not do anything if MDS is not local @@ -4648,8 +4945,8 @@ test_57a() { for DEV in $(do_facet $SINGLEMDS lctl get_param -n $MNTDEV); do do_facet $SINGLEMDS $DUMPE2FS -h $DEV > $TMP/t57a.dump || error "can't access $DEV" - DEVISIZE=`awk '/Inode size:/ { print $3 }' $TMP/t57a.dump` - [ "$DEVISIZE" -gt 128 ] || error "inode size $DEVISIZE" + DEVISIZE=$(awk '/Inode size:/ { print $3 }' $TMP/t57a.dump) + [[ $DEVISIZE -gt 128 ]] || error "inode size $DEVISIZE" rm $TMP/t57a.dump done } @@ -4703,7 +5000,7 @@ test_57b() { local MDSFREE2=$(do_facet $mymds \ lctl get_param -n osd*.*MDT000$((num -1)).kbytesfree) local MDCFREE2=$(lctl get_param -n mdc.*MDT000$((num -1))-mdc-*.kbytesfree) - if [ "$MDCFREE2" -lt "$((MDCFREE - 16))" ]; then + if [[ $MDCFREE2 -lt $((MDCFREE - 16)) ]]; then if [ "$MDSFREE" != "$MDSFREE2" ]; then error "MDC before $MDCFREE != after $MDCFREE2" else @@ -4761,7 +5058,8 @@ test_60b() { # bug 6411 else print from_begin }"` - [ $LLOG_COUNT -gt 50 ] && error "CDEBUG_LIMIT not limiting messages ($LLOG_COUNT)"|| true + [[ $LLOG_COUNT -gt 50 ]] && + error "CDEBUG_LIMIT not limiting messages ($LLOG_COUNT)" || true } run_test 60b "limit repeated messages from CERROR/CWARN ========" @@ -4821,10 +5119,11 @@ test_62() { #run_test 62 "verify obd_match failure doesn't LBUG (should -EIO)" # bug 2319 - oig_wait() interrupted causes crash because of invalid waitq. -test_63a() { # was test_63 +# Though this test is irrelevant anymore, it helped to reveal some +# other grant bugs (LU-4482), let's keep it. +test_63a() { # was test_63 [ $PARALLEL == "yes" ] && skip "skip parallel run" && return MAX_DIRTY_MB=`lctl get_param -n osc.*.max_dirty_mb | head -n 1` - lctl set_param -n osc.*.max_dirty_mb 0 for i in `seq 10` ; do dd if=/dev/zero of=$DIR/f63 bs=8k & sleep 5 @@ -4832,7 +5131,6 @@ test_63a() { # was test_63 sleep 1 done - lctl set_param -n osc.*.max_dirty_mb $MAX_DIRTY_MB rm -f $DIR/f63 || true } run_test 63a "Verify oig_wait interruption does not crash =======" @@ -4898,7 +5196,7 @@ run_test 65b "directory setstripe -S $((STRIPESIZE * 2)) -i 0 -c 1" test_65c() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - if [ $OSTCOUNT -gt 1 ]; then + if [[ $OSTCOUNT -gt 1 ]]; then test_mkdir -p $DIR/$tdir $SETSTRIPE -S $(($STRIPESIZE * 4)) -i 1 \ -c $(($OSTCOUNT - 1)) $DIR/$tdir || error "setstripe" @@ -4911,18 +5209,18 @@ run_test 65c "directory setstripe -S $((STRIPESIZE*4)) -i 1 -c $((OSTCOUNT-1))" test_65d() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return test_mkdir -p $DIR/$tdir - if [ $STRIPECOUNT -le 0 ]; then + if [[ $STRIPECOUNT -le 0 ]]; then sc=1 - elif [ $STRIPECOUNT -gt 2000 ]; then + elif [[ $STRIPECOUNT -gt 2000 ]]; then #LOV_MAX_STRIPE_COUNT is 2000 - [ $OSTCOUNT -gt 2000 ] && sc=2000 || sc=$(($OSTCOUNT - 1)) + [[ $OSTCOUNT -gt 2000 ]] && sc=2000 || sc=$(($OSTCOUNT - 1)) else sc=$(($STRIPECOUNT - 1)) fi $SETSTRIPE -S $STRIPESIZE -c $sc $DIR/$tdir || error "setstripe" touch $DIR/$tdir/f4 $DIR/$tdir/f5 $LVERIFY $DIR/$tdir $DIR/$tdir/f4 $DIR/$tdir/f5 || - error "lverify failed" + error "lverify failed" } run_test 65d "directory setstripe -S $STRIPESIZE -c stripe_count" @@ -5005,7 +5303,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 "too few OSTs" && return remote_mds_nodsh && skip "remote MDS with nodsh" && return echo "Check OST status: " @@ -5201,8 +5499,6 @@ test_72a() { # bug 5695 - Test that on 2.6 remove_suid works properly skip_env "User $RUNAS_ID does not exist - skipping" return 0 } - # We had better clear the $DIR to get enough space for dd - rm -rf $DIR/* touch $DIR/$tfile chmod 777 $DIR/$tfile chmod ug+s $DIR/$tfile @@ -5285,12 +5581,12 @@ test_74a() { # bug 6149, 6184 # very important to OR with OBD_FAIL_ONCE (0x80000000) -- otherwise it # will spin in a tight reconnection loop touch $DIR/f74a - lctl set_param fail_loc=0x8000030e + $LCTL set_param fail_loc=0x8000030e # get any lock that won't be difficult - lookup works. ls $DIR/f74a - lctl set_param fail_loc=0 - true + $LCTL set_param fail_loc=0 rm -f $DIR/f74a + true } run_test 74a "ldlm_enqueue freed-export error path, ls (shouldn't LBUG)" @@ -5300,20 +5596,21 @@ test_74b() { # bug 13310 # # very important to OR with OBD_FAIL_ONCE (0x80000000) -- otherwise it # will spin in a tight reconnection loop - lctl set_param fail_loc=0x8000030e + $LCTL set_param fail_loc=0x8000030e # get a "difficult" lock touch $DIR/f74b - lctl set_param fail_loc=0 - true + $LCTL set_param fail_loc=0 rm -f $DIR/f74b + true } run_test 74b "ldlm_enqueue freed-export error path, touch (shouldn't LBUG)" test_74c() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return -#define OBD_FAIL_LDLM_NEW_LOCK - lctl set_param fail_loc=0x80000319 - touch $DIR/$tfile && error "Touch successful" + #define OBD_FAIL_LDLM_NEW_LOCK + $LCTL set_param fail_loc=0x319 + touch $DIR/$tfile && error "touch successful" + $LCTL set_param fail_loc=0 true } run_test 74c "ldlm_lock_create error path, (shouldn't LBUG)" @@ -5338,21 +5635,21 @@ test_76() { # Now for bug 20433, added originally in bug 1443 # per-cpu cache is still allowed set_inode_slab_tunables "1 1 0" cancel_lru_locks osc - BEFORE_INODES=`num_inodes` + BEFORE_INODES=$(num_inodes) echo "before inodes: $BEFORE_INODES" local COUNT=1000 [ "$SLOW" = "no" ] && COUNT=100 - for i in `seq $COUNT`; do + for i in $(seq $COUNT); do touch $DIR/$tfile rm -f $DIR/$tfile done cancel_lru_locks osc - AFTER_INODES=`num_inodes` + AFTER_INODES=$(num_inodes) echo "after inodes: $AFTER_INODES" local wait=0 - while [ $((AFTER_INODES-1*CPUS)) -gt $BEFORE_INODES ]; do + while [[ $((AFTER_INODES-1*CPUS)) -gt $BEFORE_INODES ]]; do sleep 2 - AFTER_INODES=`num_inodes` + AFTER_INODES=$(num_inodes) wait=$((wait+2)) echo "wait $wait seconds inodes: $AFTER_INODES" if [ $wait -gt 30 ]; then @@ -5545,35 +5842,37 @@ test_78() { # bug 10901 echo "MemFree: $F78SIZE, Max file size: $MAXFREE" MEMTOTAL=$(($(awk '/MemTotal:/ { print $2 }' /proc/meminfo) / 1024)) echo "MemTotal: $MEMTOTAL" -# reserve 256MB of memory for the kernel and other running processes, -# and then take 1/2 of the remaining memory for the read/write buffers. - if [ $MEMTOTAL -gt 512 ] ;then - MEMTOTAL=$(((MEMTOTAL - 256 ) / 2)) - else - # for those poor memory-starved high-end clusters... - MEMTOTAL=$((MEMTOTAL / 2)) - fi + + # reserve 256MB of memory for the kernel and other running processes, + # and then take 1/2 of the remaining memory for the read/write buffers. + if [ $MEMTOTAL -gt 512 ] ;then + MEMTOTAL=$(((MEMTOTAL - 256 ) / 2)) + else + # for those poor memory-starved high-end clusters... + MEMTOTAL=$((MEMTOTAL / 2)) + fi echo "Mem to use for directio: $MEMTOTAL" - [ $F78SIZE -gt $MEMTOTAL ] && F78SIZE=$MEMTOTAL - [ $F78SIZE -gt 512 ] && F78SIZE=512 - [ $F78SIZE -gt $((MAXFREE / 1024)) ] && F78SIZE=$((MAXFREE / 1024)) - SMALLESTOST=`lfs df $DIR |grep OST | awk '{print $4}' |sort -n |head -1` + + [[ $F78SIZE -gt $MEMTOTAL ]] && F78SIZE=$MEMTOTAL + [[ $F78SIZE -gt 512 ]] && F78SIZE=512 + [[ $F78SIZE -gt $((MAXFREE / 1024)) ]] && F78SIZE=$((MAXFREE / 1024)) + SMALLESTOST=$(lfs df $DIR | grep OST | awk '{ print $4 }' | sort -n | + head -n1) echo "Smallest OST: $SMALLESTOST" - [ $SMALLESTOST -lt 10240 ] && \ + [[ $SMALLESTOST -lt 10240 ]] && skip "too small OSTSIZE, useless to run large O_DIRECT test" && return 0 - [ $F78SIZE -gt $((SMALLESTOST * $OSTCOUNT / 1024 - 80)) ] && \ + [[ $F78SIZE -gt $((SMALLESTOST * $OSTCOUNT / 1024 - 80)) ]] && F78SIZE=$((SMALLESTOST * $OSTCOUNT / 1024 - 80)) [ "$SLOW" = "no" ] && NSEQ=1 && [ $F78SIZE -gt 32 ] && F78SIZE=32 echo "File size: $F78SIZE" $SETSTRIPE -c $OSTCOUNT $DIR/$tfile || error "setstripe failed" - for i in `seq 1 $NSEQ` - do - FSIZE=$(($F78SIZE / ($NSEQ - $i + 1))) - echo directIO rdwr round $i of $NSEQ - $DIRECTIO rdwr $DIR/$tfile 0 $FSIZE 1048576||error "rdwr failed" - done + for i in $(seq 1 $NSEQ); do + FSIZE=$(($F78SIZE / ($NSEQ - $i + 1))) + echo directIO rdwr round $i of $NSEQ + $DIRECTIO rdwr $DIR/$tfile 0 $FSIZE 1048576||error "rdwr failed" + done rm -f $DIR/$tfile } @@ -5611,6 +5910,7 @@ test_79() { # bug 12743 run_test 79 "df report consistency check =======================" test_80() { # bug 10718 + remote_ost_nodsh && skip "remote OST with nodsh" && return [ $PARALLEL == "yes" ] && skip "skip parallel run" && return # relax strong synchronous semantics for slow backends like ZFS local soc="obdfilter.*.sync_on_lock_cancel" @@ -5812,6 +6112,7 @@ cleanup_101a() { test_101a() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + [ $MDSCOUNT -ge 2 ] && skip "skip now for >= 2 MDTs" && return #LU-4322 local s local discard local nreads=10000 @@ -5829,13 +6130,13 @@ test_101a() { $READS -f $DIR/$tfile -s$((cache_limit * 3192 * 1024)) -b65536 -C -n$nreads -t 180 discard=0 - for s in `$LCTL get_param -n llite.*.read_ahead_stats | \ - get_named_value 'read but discarded' | cut -d" " -f1`; do + for s in $($LCTL get_param -n llite.*.read_ahead_stats | + get_named_value 'read but discarded' | cut -d" " -f1); do discard=$(($discard + $s)) done cleanup_101a - if [ $(($discard * 10)) -gt $nreads ] ;then + if [[ $(($discard * 10)) -gt $nreads ]]; then $LCTL get_param osc.*-osc*.rpc_stats $LCTL get_param llite.*.read_ahead_stats error "too many ($discard) discarded pages" @@ -5846,10 +6147,12 @@ run_test 101a "check read-ahead for random reads ================" setup_test101bc() { test_mkdir -p $DIR/$tdir - STRIPE_SIZE=1048576 - STRIPE_COUNT=$OSTCOUNT + local STRIPE_SIZE=$1 + local FILE_LENGTH=$2 STRIPE_OFFSET=0 + local FILE_SIZE_MB=$((FILE_LENGTH / STRIPE_SIZE)) + local list=$(comma_list $(osts_nodes)) set_osd_param $list '' read_cache_enable 0 set_osd_param $list '' writethrough_cache_enable 0 @@ -5858,7 +6161,9 @@ setup_test101bc() { # prepare the read-ahead file $SETSTRIPE -S $STRIPE_SIZE -i $STRIPE_OFFSET -c $OSTCOUNT $DIR/$tfile - dd if=/dev/zero of=$DIR/$tfile bs=1024k count=100 2> /dev/null + dd if=/dev/zero of=$DIR/$tfile bs=$STRIPE_SIZE \ + count=$FILE_SIZE_MB 2> /dev/null + } cleanup_test101bc() { @@ -5877,16 +6182,16 @@ calc_total() { ra_check_101() { local READ_SIZE=$1 - local STRIPE_SIZE=1048576 + local STRIPE_SIZE=$2 + local FILE_LENGTH=$3 local RA_INC=1048576 local STRIDE_LENGTH=$((STRIPE_SIZE/READ_SIZE)) - local FILE_LENGTH=$((64*100)) local discard_limit=$((((STRIDE_LENGTH - 1)*3/(STRIDE_LENGTH*OSTCOUNT))* \ (STRIDE_LENGTH*OSTCOUNT - STRIDE_LENGTH))) - DISCARD=`$LCTL get_param -n llite.*.read_ahead_stats | \ - get_named_value 'read but discarded' | \ - cut -d" " -f1 | calc_total` - if [ $DISCARD -gt $discard_limit ]; then + DISCARD=$($LCTL get_param -n llite.*.read_ahead_stats | + get_named_value 'read but discarded' | + cut -d" " -f1 | calc_total) + if [[ $DISCARD -gt $discard_limit ]]; then $LCTL get_param llite.*.read_ahead_stats error "Too many ($DISCARD) discarded pages with size (${READ_SIZE})" else @@ -5896,13 +6201,20 @@ 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 "skipping stride IO stride-ahead test" && return local STRIPE_SIZE=1048576 local STRIDE_SIZE=$((STRIPE_SIZE*OSTCOUNT)) - local FILE_LENGTH=$((STRIPE_SIZE*100)) - local ITERATION=$((FILE_LENGTH/STRIDE_SIZE)) + if [ $SLOW == "yes" ]; then + local FILE_LENGTH=$((STRIDE_SIZE * 64)) + else + local FILE_LENGTH=$((STRIDE_SIZE * 8)) + fi + + local ITERATION=$((FILE_LENGTH / STRIDE_SIZE)) + # prepare the read-ahead file - setup_test101bc + setup_test101bc $STRIPE_SIZE $FILE_LENGTH cancel_lru_locks osc for BIDX in 2 4 8 16 32 64 128 256 do @@ -5914,7 +6226,7 @@ test_101b() { $READS -f $DIR/$tfile -l $STRIDE_LENGTH -o $OFFSET \ -s $FILE_LENGTH -b $STRIPE_SIZE -a $READ_COUNT -n $ITERATION cancel_lru_locks osc - ra_check_101 $BSIZE + ra_check_101 $BSIZE $STRIPE_SIZE $FILE_LENGTH done cleanup_test101bc true @@ -5928,7 +6240,7 @@ test_101c() { local nreads=10000 local osc_rpc_stats - setup_test101bc + setup_test101bc $STRIPE_SIZE $FILE_LENGTH cancel_lru_locks osc $LCTL set_param osc.*.rpc_stats 0 @@ -5955,89 +6267,89 @@ test_101c() { run_test 101c "check stripe_size aligned read-ahead =================" set_read_ahead() { - $LCTL get_param -n llite.*.max_read_ahead_mb | head -n 1 - $LCTL set_param -n llite.*.max_read_ahead_mb $1 > /dev/null 2>&1 + $LCTL get_param -n llite.*.max_read_ahead_mb | head -n 1 + $LCTL set_param -n llite.*.max_read_ahead_mb $1 > /dev/null 2>&1 } test_101d() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return local file=$DIR/$tfile - local size=${FILESIZE_101c:-500} + local sz_MB=${FILESIZE_101d:-500} local ra_MB=${READAHEAD_MB:-40} - local space=$(df -P $DIR | tail -n 1 | awk '{ print $4 }') - [ $space -gt $((size * 1024)) ] || - { skip "Need free space ${size}M, have ${space}K" && return; } + local free_MB=$(($(df -P $DIR | tail -n 1 | awk '{ print $4 }') / 1024)) + [ $free_MB -lt $sz_MB ] && + skip "Need free space ${sz_MB}M, have ${free_MB}M" && return - echo "Creating test file $file of size ${size}M with ${space}K free space" + echo "Create test file $file size ${sz_MB}M, ${free_MB}M free" $SETSTRIPE -c -1 $file || error "setstripe failed" - dd if=/dev/zero of=$file bs=1M count=$size || error "dd failed" + + dd if=/dev/zero of=$file bs=1M count=$sz_MB || error "dd failed" echo Cancel LRU locks on lustre client to flush the client cache cancel_lru_locks osc - echo Disable read-ahead - local old_READAHEAD=$(set_read_ahead 0) + echo Disable read-ahead + local old_READAHEAD=$(set_read_ahead 0) - echo Reading the test file $file with read-ahead disabled - time_ra_OFF=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$size") + echo Reading the test file $file with read-ahead disabled + local raOFF=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB") - echo Cancel LRU locks on lustre client to flush the client cache - cancel_lru_locks osc - echo Enable read-ahead with ${ra_MB}MB - set_read_ahead $ra_MB + echo Cancel LRU locks on lustre client to flush the client cache + cancel_lru_locks osc + echo Enable read-ahead with ${ra_MB}MB + set_read_ahead $ra_MB - echo Reading the test file $file with read-ahead enabled - time_ra_ON=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$size") + echo Reading the test file $file with read-ahead enabled + local raON=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB") - echo read-ahead disabled time read $time_ra_OFF - echo read-ahead enabled time read $time_ra_ON + echo "read-ahead disabled time read $raOFF" + echo "read-ahead enabled time read $raON" set_read_ahead $old_READAHEAD rm -f $file wait_delete_completed - [ $time_ra_ON -lt $time_ra_OFF ] || - error "read-ahead enabled time read (${time_ra_ON}s) is more than - read-ahead disabled time read (${time_ra_OFF}s) filesize ${size}M" + [ $raOFF -le 1 -o $raON -lt $raOFF ] || + error "readahead ${raON}s > no-readahead ${raOFF}s ${sz_MB}M" } -run_test 101d "file read with and without read-ahead enabled =================" +run_test 101d "file read with and without read-ahead enabled" test_101e() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - local file=$DIR/$tfile - local size=500 #KB - local count=100 - local blksize=1024 - - local space=$(df -P $DIR | tail -n 1 | awk '{ print $4 }') - local need_space=$((count * size)) - [ $space -gt $need_space ] || - { skip_env "Need free space $need_space, have $space" && return; } - - echo Creating $count ${size}K test files - for ((i = 0; i < $count; i++)); do - dd if=/dev/zero of=${file}_${i} bs=$blksize count=$size 2>/dev/null - done + local file=$DIR/$tfile + local size_KB=500 #KB + local count=100 + local bsize=1024 + + local free_KB=$(df -P $DIR | tail -n 1 | awk '{ print $4 }') + local need_KB=$((count * size_KB)) + [[ $free_KB -le $need_KB ]] && + skip_env "Need free space $need_KB, have $free_KB" && return + + echo "Creating $count ${size_KB}K test files" + for ((i = 0; i < $count; i++)); do + dd if=/dev/zero of=$file.$i bs=$bsize count=$size_KB 2>/dev/null + done - echo Cancel LRU locks on lustre client to flush the client cache - cancel_lru_locks osc + echo "Cancel LRU locks on lustre client to flush the client cache" + cancel_lru_locks osc - echo Reset readahead stats - $LCTL set_param -n llite.*.read_ahead_stats 0 + echo "Reset readahead stats" + $LCTL set_param -n llite.*.read_ahead_stats 0 - for ((i = 0; i < $count; i++)); do - dd if=${file}_${i} of=/dev/null bs=$blksize count=$size 2>/dev/null - done + for ((i = 0; i < $count; i++)); do + dd if=$file.$i of=/dev/null bs=$bsize count=$size_KB 2>/dev/null + done - local miss=$($LCTL get_param -n llite.*.read_ahead_stats | \ - get_named_value 'misses' | cut -d" " -f1 | calc_total) + local miss=$($LCTL get_param -n llite.*.read_ahead_stats | + get_named_value 'misses' | cut -d" " -f1 | calc_total) - for ((i = 0; i < $count; i++)); do - rm -rf ${file}_${i} 2>/dev/null - done + for ((i = 0; i < $count; i++)); do + rm -rf $file.$i 2>/dev/null + done - #10000 means 20% reads are missing in readahead - [ $miss -lt 10000 ] || error "misses too much for small reads" + #10000 means 20% reads are missing in readahead + [[ $miss -lt 10000 ]] || error "misses too much for small reads" } run_test 101e "check read-ahead for small read(1k) for small files(500k)" @@ -6083,7 +6395,7 @@ setup_test102() { STRIPE_SIZE=65536 STRIPE_OFFSET=1 STRIPE_COUNT=$OSTCOUNT - [ $OSTCOUNT -gt 4 ] && STRIPE_COUNT=4 + [[ $OSTCOUNT -gt 4 ]] && STRIPE_COUNT=4 trap cleanup_test102 EXIT cd $DIR @@ -6110,7 +6422,7 @@ cleanup_test102() { } test_102a() { - local testfile=$DIR/xattr_testfile + local testfile=$DIR/$tfile touch $testfile @@ -6170,36 +6482,43 @@ test_102a() { run_test 102a "user xattr test ==================================" test_102b() { + [ -z "$(which setfattr 2>/dev/null)" ] && + skip_env "could not find setfattr" && return + # 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 "skipping 2-stripe test" && return local testfile=$DIR/$tfile $SETSTRIPE -S 65536 -i 1 -c $OSTCOUNT $testfile || error "setstripe failed" local STRIPECOUNT=$($GETSTRIPE -c $testfile) || error "getstripe failed" - getfattr -d -m "^trusted" $testfile 2> /dev/null | \ - grep "trusted.lov" || error "can't get trusted.lov from $testfile" + getfattr -d -m "^trusted" $testfile 2>/dev/null | grep "trusted.lov" || + error "can't get trusted.lov from $testfile" local testfile2=${testfile}2 - local value=`getfattr -n trusted.lov $testfile 2> /dev/null | \ - grep "trusted.lov" |sed -e 's/[^=]\+=//'` + local value=$(getfattr -n trusted.lov $testfile 2>/dev/null | + grep "trusted.lov" | sed -e 's/[^=]\+=//') $MCREATE $testfile2 setfattr -n trusted.lov -v $value $testfile2 local stripe_size=$($GETSTRIPE -S $testfile2) local stripe_count=$($GETSTRIPE -c $testfile2) - [ $stripe_size -eq 65536 ] || error "stripe size $stripe_size != 65536" - [ $stripe_count -eq $STRIPECOUNT ] || + [[ $stripe_size -eq 65536 ]] || + error "stripe size $stripe_size != 65536" + [[ $stripe_count -eq $STRIPECOUNT ]] || error "stripe count $stripe_count != $STRIPECOUNT" rm -f $DIR/$tfile } run_test 102b "getfattr/setfattr for trusted.lov EAs ============" test_102c() { + [ -z "$(which setfattr 2>/dev/null)" ] && + skip_env "could not find setfattr" && return + # b10930: get/set/list lustre.lov xattr echo "get/set/list lustre.lov xattr ..." - [ "$OSTCOUNT" -lt "2" ] && skip_env "skipping 2-stripe test" && return + [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test" && return test_mkdir -p $DIR/$tdir chown $RUNAS_ID $DIR/$tdir local testfile=$DIR/$tdir/$tfile @@ -6233,14 +6552,14 @@ compare_stripe_info1() { local size=$((STRIPE_SIZE * num)) local file=file"$num-$offset-$count" stripe_size=$(lfs getstripe -S $PWD/$file) - [ $stripe_size -ne $size ] && + [[ $stripe_size -ne $size ]] && error "$file: size $stripe_size != $size" stripe_count=$(lfs getstripe -c $PWD/$file) # allow fewer stripes to be created, ORI-601 - [ $stripe_count -lt $(((3 * count + 3) / 4)) ]&& + [[ $stripe_count -lt $(((3 * count + 3) / 4)) ]] && error "$file: count $stripe_count != $count" stripe_index=$(lfs getstripe -i $PWD/$file) - [ $stripe_index -ne 0 ] && + [[ $stripe_index -ne 0 ]] && stripe_index_all_zero=false done done @@ -6260,7 +6579,7 @@ test_102d() { # 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 "skipping N-stripe test" && return setup_test102 test_mkdir -p $DIR/d102d $TAR xf $TMP/f102.tar -C $DIR/d102d --xattrs @@ -6274,7 +6593,7 @@ test_102f() { # 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 "skipping N-stripe test" && return setup_test102 test_mkdir -p $DIR/d102f cd $DIR @@ -6337,19 +6656,24 @@ test_102ha() { run_test 102ha "grow xattr from inside inode to external inode" test_102i() { # bug 17038 - touch $DIR/$tfile - ln -s $DIR/$tfile $DIR/${tfile}link - getfattr -n trusted.lov $DIR/$tfile || error "lgetxattr on $DIR/$tfile failed" - getfattr -h -n trusted.lov $DIR/${tfile}link 2>&1 | grep -i "no such attr" || error "error for lgetxattr on $DIR/${tfile}link is not ENODATA" - rm -f $DIR/$tfile $DIR/${tfile}link -} + [ -z "$(which getfattr 2>/dev/null)" ] && + skip "could not find getfattr" && return + touch $DIR/$tfile + ln -s $DIR/$tfile $DIR/${tfile}link + getfattr -n trusted.lov $DIR/$tfile || + error "lgetxattr on $DIR/$tfile failed" + getfattr -h -n trusted.lov $DIR/${tfile}link 2>&1 | + grep -i "no such attr" || + error "error for lgetxattr on $DIR/${tfile}link is not ENODATA" + rm -f $DIR/$tfile $DIR/${tfile}link +} 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 "skipping N-stripe test" && return setup_test102 "$RUNAS" test_mkdir -p $DIR/d102j chown $RUNAS_ID $DIR/d102j @@ -6360,6 +6684,8 @@ test_102j() { 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 @@ -6386,6 +6712,9 @@ test_102k() { run_test 102k "setfattr without parameter of value shouldn't cause a crash" test_102l() { + [ -z "$(which getfattr 2>/dev/null)" ] && + skip "could not find getfattr" && return + # LU-532 trusted. xattr is invisible to non-root local testfile=$DIR/$tfile @@ -6411,13 +6740,104 @@ run_test 102m "Ensure listxattr fails on small bufffer ========" cleanup_test102 +getxattr() { # getxattr path name + # Return the base64 encoding of the value of xattr name on path. + local path=$1 + local name=$2 + + # # getfattr --absolute-names --encoding=base64 --name=trusted.lov $path + # file: $path + # trusted.lov=0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA= + # + # We print just 0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA= + + getfattr --absolute-names --encoding=base64 --name=$name $path | + awk -F= -v name=$name '$1 == name { + print substr($0, index($0, "=") + 1); + }' +} + +test_102n() { # LU-4101 mdt: protect internal xattrs + local file0=$DIR/$tfile.0 + local file1=$DIR/$tfile.1 + local xattr0=$TMP/$tfile.0 + local xattr1=$TMP/$tfile.1 + local name + local value + + [ -z "$(which setfattr 2>/dev/null)" ] && + skip "could not find setfattr" && return + + if [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.5.50) ] + then + skip "MDT < 2.5.50 allows setxattr on internal trusted xattrs" + return + fi + + rm -rf $file0 $file1 $xattr0 $xattr1 + touch $file0 $file1 + + # Get 'before' xattrs of $file1. + getfattr --absolute-names --dump --match=- $file1 > $xattr0 + + for name in lov lma lmv link fid version som hsm lfsck_namespace; do + # Try to copy xattr from $file0 to $file1. + value=$(getxattr $file0 trusted.$name 2> /dev/null) + + setfattr --name=trusted.$name --value="$value" $file1 || + error "setxattr 'trusted.$name' failed" + + # Try to set a garbage xattr. + value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4= + + setfattr --name=trusted.$name --value="$value" $file1 || + error "setxattr 'trusted.$name' failed" + + # 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 + # any changes or crashes. + setfattr --remove=$trusted.$name $file1 2> /dev/null + done + + # Get 'after' xattrs of file1. + getfattr --absolute-names --dump --match=- $file1 > $xattr1 + + if ! diff $xattr0 $xattr1; then + error "before and after xattrs of '$file1' differ" + fi + + rm -rf $file0 $file1 $xattr0 $xattr1 + + return 0 +} +run_test 102n "silently ignore setxattr on internal trusted xattrs" + +test_102p() { # LU-4703 setxattr did not check ownership + local testfile=$DIR/$tfile + + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.5.56) ] && + skip "MDS needs to be at least 2.5.56" && return + + touch $testfile + + echo "setfacl as user..." + $RUNAS setfacl -m "u:$RUNAS_ID:rwx" $testfile + [ $? -ne 0 ] || error "setfacl by $RUNAS_ID was allowed on $testfile" + + echo "setfattr as user..." + setfacl -m "u:$RUNAS_ID:---" $testfile + $RUNAS setfattr -x system.posix_acl_access $testfile + [ $? -ne 0 ] || error "setfattr by $RUNAS_ID was allowed on $testfile" +} +run_test 102p "check setxattr(2) correctly fails without permission" + run_acl_subtest() { $LUSTRE/tests/acl/run $LUSTRE/tests/acl/$1.test return $? } -test_103 () { +test_103a() { [ "$UID" != 0 ] && skip_env "must run as root" && return [ -z "$(lctl get_param -n mdc.*-mdc-*.connect_flags | grep acl)" ] && skip "must have acl enabled" && return @@ -6425,6 +6845,8 @@ test_103 () { skip_env "could not find setfacl" && return $GSS && skip "could not run under gss" && return + gpasswd -a daemon bin # LU-5641 + declare -a identity_old for num in $(seq $MDSCOUNT); do @@ -6461,7 +6883,13 @@ test_103 () { fi echo "LU-2561 newly created file is same size as directory..." - run_acl_subtest 2561 || error "LU-2561 test failed" + if [ $(facet_fstype $SINGLEMDS) != "zfs" ]; then + run_acl_subtest 2561 || error "LU-2561 test failed" + else + run_acl_subtest 2561_zfs || error "LU-2561 zfs test failed" + fi + + run_acl_subtest 4924 || error "LU-4924 test failed" cd $SAVE_PWD umask $SAVE_UMASK @@ -6472,7 +6900,55 @@ test_103 () { fi done } -run_test 103 "acl test =========================================" +run_test 103a "acl test =========================================" + +test_103b() { + 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 + + [ -n "$(getfattr -d -m. $DIR/$tdir | grep posix_acl_default)" ] && + error "$DIR/$tdir shouldn't contain default ACL" + [ -n "$(getfattr -d -m. $DIR/$tdir.bak | grep posix_acl_default)" ] && + error "$DIR/$tdir.bak shouldn't contain default ACL" + true +} +run_test 103c "'cp -rp' won't set empty acl" test_104a() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return @@ -6512,7 +6988,7 @@ run_test 104b "$RUNAS lfs check servers test ====================" test_105a() { # doesn't work on 2.4 kernels touch $DIR/$tfile - if [ -n "$(mount | grep "$MOUNT.*flock" | grep -v noflock)" ]; then + if $(flock_is_enabled); then flocks_test 1 on -f $DIR/$tfile || error "fail flock on" else flocks_test 1 off -f $DIR/$tfile || error "fail flock off" @@ -6523,7 +6999,7 @@ run_test 105a "flock when mounted without -o flock test ========" test_105b() { touch $DIR/$tfile - if [ -n "$(mount | grep "$MOUNT.*flock" | grep -v noflock)" ]; then + if $(flock_is_enabled); then flocks_test 1 on -c $DIR/$tfile || error "fail flock on" else flocks_test 1 off -c $DIR/$tfile || error "fail flock off" @@ -6534,7 +7010,7 @@ run_test 105b "fcntl when mounted without -o flock test ========" test_105c() { touch $DIR/$tfile - if [ -n "$(mount | grep "$MOUNT.*flock" | grep -v noflock)" ]; then + if $(flock_is_enabled); then flocks_test 1 on -l $DIR/$tfile || error "fail flock on" else flocks_test 1 off -l $DIR/$tfile || error "fail flock off" @@ -6546,8 +7022,7 @@ 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 - [ -z "$(mount | grep "$MOUNT.*flock" | grep -v noflock)" ] && - skip "mount w/o flock enabled" && return + flock_is_enabled || { skip "mount w/o flock enabled" && return; } #define OBD_FAIL_LDLM_CP_CB_WAIT 0x315 $LCTL set_param fail_loc=0x80000315 flocks_test 2 $DIR/$tdir @@ -6555,8 +7030,7 @@ test_105d() { # bug 15924 run_test 105d "flock race (should not freeze) ========" test_105e() { # bug 22660 && 22040 - [ -z "$(mount | grep "$MOUNT.*flock" | grep -v noflock)" ] && - skip "mount w/o flock enabled" && return + flock_is_enabled || { skip "mount w/o flock enabled" && return; } touch $DIR/$tfile flocks_test 3 $DIR/$tfile } @@ -6621,30 +7095,29 @@ run_test 110 "filename length checking" 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 - echo "Starting with $OSTIO_pre threads" + 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 + echo "Starting with $OSTIO_pre threads" NUMTEST=20000 - NUMFREE=`df -i -P $DIR | tail -n 1 | awk '{ print $4 }'` - [ $NUMFREE -lt $NUMTEST ] && NUMTEST=$(($NUMFREE - 1000)) + 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 - OSTIO_post=$(ps -e|grep ll_ost_io|awk '{print $4}'|sort -n|tail -1|\ - cut -c11-20) + OSTIO_post=$(ps -e | grep ll_ost_io | awk '{ print $4 }' | sort -n | + tail -1 | cut -c11-20) # don't return an error - [ $OSTIO_post == $OSTIO_pre ] && echo \ + [ $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 - echo "Started with $OSTIO_pre threads, ended with $OSTIO_post" + echo "Started with $OSTIO_pre threads, ended with $OSTIO_post" } run_test 115 "verify dynamic thread creation====================" @@ -6655,13 +7128,13 @@ free_min_max () { MAXI=0; MAXV=${AVAIL[0]} MINI=0; MINV=${AVAIL[0]} for ((i = 0; i < ${#AVAIL[@]}; i++)); do - #echo OST $i: ${AVAIL[i]}kb - if [ ${AVAIL[i]} -gt $MAXV ]; then - MAXV=${AVAIL[i]}; MAXI=$i - fi - if [ ${AVAIL[i]} -lt $MINV ]; then - MINV=${AVAIL[i]}; MINI=$i - fi + #echo OST $i: ${AVAIL[i]}kb + if [[ ${AVAIL[i]} -gt $MAXV ]]; then + MAXV=${AVAIL[i]}; MAXI=$i + fi + if [[ ${AVAIL[i]} -lt $MINV ]]; then + MINV=${AVAIL[i]}; MINI=$i + fi done echo Min free space: OST $MINI: $MINV echo Max free space: OST $MAXI: $MAXV @@ -6669,17 +7142,20 @@ free_min_max () { test_116a() { # was previously test_116() [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - [ "$OSTCOUNT" -lt "2" ] && skip_env "$OSTCOUNT < 2 OSTs" && return + [[ $OSTCOUNT -lt 2 ]] && skip_env "$OSTCOUNT < 2 OSTs" && return echo -n "Free space priority " do_facet $SINGLEMDS lctl get_param -n lo*.*-mdtlov.qos_prio_free | - head -1 + head -n1 declare -a AVAIL free_min_max [ $MINV -eq 0 ] && skip "no free space in OST$MINI, skip" && return + [ $MINV -gt 10000000 ] && skip "too much free space in OST$MINI, skip" \ + && return trap simple_cleanup_common EXIT + # Check if we need to generate uneven OSTs test_mkdir -p $DIR/$tdir/OST${MINI} local FILL=$(($MINV / 4)) @@ -6687,12 +7163,12 @@ test_116a() { # was previously test_116() local DIFF2=$(($DIFF * 100 / $MINV)) local threshold=$(do_facet $SINGLEMDS \ - lctl get_param -n *.*MDT0000-mdtlov.qos_threshold_rr | head -1) + lctl get_param -n *.*MDT0000-mdtlov.qos_threshold_rr | head -n1) threshold=${threshold%%%} echo -n "Check for uneven OSTs: " echo -n "diff=${DIFF}KB (${DIFF2}%) must be > ${threshold}% ..." - if [ $DIFF2 -gt $threshold ]; then + if [[ $DIFF2 -gt $threshold ]]; then echo "ok" echo "Don't need to fill OST$MINI" else @@ -6720,7 +7196,7 @@ test_116a() { # was previously test_116() DIFF=$(($MAXV - $MINV)) DIFF2=$(($DIFF * 100 / $MINV)) echo -n "diff=${DIFF}=${DIFF2}% must be > ${threshold}% for QOS mode..." - if [ $DIFF2 -gt $threshold ]; then + if [[ $DIFF2 -gt $threshold ]]; then echo "ok" else echo "failed - QOS mode won't be used" @@ -6741,7 +7217,7 @@ test_116a() { # was previously test_116() echo "writing $FILL files to QOS-assigned OSTs" i=0 while [ $i -lt $FILL ]; do - i=$(($i + 1)) + i=$((i + 1)) dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=200k \ count=1 2>/dev/null echo -n . @@ -6775,9 +7251,9 @@ test_116a() { # was previously test_116() MAXC=$($GETSTRIPE --ost $UUID $DIR/$tdir | grep $DIR | wc -l) echo "$MAXC files created on larger OST $MAXI1" FILL=$(($MAXC * 100 / $MINC - 100)) - [ $MINC -gt 0 ] && + [[ $MINC -gt 0 ]] && echo "Wrote ${FILL}% more files to larger OST $MAXI1" - [ $MAXC -gt $MINC ] || + [[ $MAXC -gt $MINC ]] || error_ignore LU-9 "stripe QOS didn't balance free space" simple_cleanup_common } @@ -6785,16 +7261,21 @@ run_test 116a "stripe QOS: free space balance ===================" test_116b() { # LU-2093 [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + [ -z "$($LCTL get_param -n lo*.$FSNAME-MDT0000-mdtlov.qos_threshold_rr | + head -1 2>/dev/null)" ] && skip "no QOS" && return #define OBD_FAIL_MDS_OSC_CREATE_FAIL 0x147 local old_rr - old_rr=$(do_facet $SINGLEMDS lctl get_param -n lov.*mdtlov*.qos_threshold_rr) - do_facet $SINGLEMDS lctl set_param lov.*mdtlov*.qos_threshold_rr 0 + old_rr=$(do_facet $SINGLEMDS lctl get_param -n \ + lo*.$FSNAME-MDT0000-mdtlov.qos_threshold_rr | head -1) + do_facet $SINGLEMDS lctl set_param \ + lo*.$FSNAME-MDT0000-mdtlov.qos_threshold_rr=0 mkdir -p $DIR/$tdir do_facet $SINGLEMDS lctl set_param fail_loc=0x147 createmany -o $DIR/$tdir/f- 20 || error "can't create" do_facet $SINGLEMDS lctl set_param fail_loc=0 rm -rf $DIR/$tdir - do_facet $SINGLEMDS lctl set_param lov.*mdtlov*.qos_threshold_rr $old_rr + do_facet $SINGLEMDS lctl set_param \ + lo*.$FSNAME-MDT0000-mdtlov.qos_threshold_rr=$old_rr } run_test 116b "QoS shouldn't LBUG if not enough OSTs found on the 2nd pass" @@ -6815,7 +7296,7 @@ NO_SLOW_RESENDCOUNT=4 export OLD_RESENDCOUNT="" set_resend_count () { local PROC_RESENDCOUNT="osc.${FSNAME}-OST*-osc-*.resend_count" - OLD_RESENDCOUNT=$(lctl get_param -n $PROC_RESENDCOUNT | head -1) + OLD_RESENDCOUNT=$(lctl get_param -n $PROC_RESENDCOUNT | head -n1) lctl set_param -n $PROC_RESENDCOUNT $1 echo resend_count is set to $(lctl get_param -n $PROC_RESENDCOUNT) } @@ -7277,7 +7758,7 @@ 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 - test_mkdir -p $DIR/$tdir + 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 @@ -7287,89 +7768,113 @@ test_120a() { # asynchronous object destroy at MDT could cause bl ast to client cancel_lru_locks osc - stat $DIR/$tdir > /dev/null - can1=`lctl get_param -n ldlm.services.ldlm_canceld.stats | awk '/ldlm_cancel/ {print $2}'` - blk1=`lctl get_param -n ldlm.services.ldlm_cbd.stats | awk '/ldlm_bl_callback/ {print $2}'` - test_mkdir $DIR/$tdir/d1 - can2=`lctl get_param -n ldlm.services.ldlm_canceld.stats | awk '/ldlm_cancel/ {print $2}'` - blk2=`lctl get_param -n ldlm.services.ldlm_cbd.stats | awk '/ldlm_bl_callback/ {print $2}'` - [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured." - [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured." - lru_resize_enable mdc - lru_resize_enable osc + stat $DIR/$tdir > /dev/null + can1=$(do_facet $SINGLEMDS \ + "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | + awk '/ldlm_cancel/ {print $2}') + blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats | + awk '/ldlm_bl_callback/ {print $2}') + test_mkdir -c1 $DIR/$tdir/d1 + can2=$(do_facet $SINGLEMDS \ + "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | + awk '/ldlm_cancel/ {print $2}') + blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats | + awk '/ldlm_bl_callback/ {print $2}') + [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured." + [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured." + lru_resize_enable mdc + lru_resize_enable osc } run_test 120a "Early Lock Cancel: mkdir test" test_120b() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - test_mkdir -p $DIR/$tdir - [ -z "`lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel`" ] && \ + 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 - can1=`lctl get_param -n ldlm.services.ldlm_canceld.stats | awk '/ldlm_cancel/ {print $2}'` - blk1=`lctl get_param -n ldlm.services.ldlm_cbd.stats | awk '/ldlm_bl_callback/ {print $2}'` - touch $DIR/$tdir/f1 - can2=`lctl get_param -n ldlm.services.ldlm_canceld.stats | awk '/ldlm_cancel/ {print $2}'` - blk2=`lctl get_param -n ldlm.services.ldlm_cbd.stats | awk '/ldlm_bl_callback/ {print $2}'` - [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured." - [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured." - lru_resize_enable mdc - lru_resize_enable osc + can1=$(do_facet $SINGLEMDS \ + "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | + awk '/ldlm_cancel/ {print $2}') + blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats | + awk '/ldlm_bl_callback/ {print $2}') + touch $DIR/$tdir/f1 + can2=$(do_facet $SINGLEMDS \ + "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | + awk '/ldlm_cancel/ {print $2}') + blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats | + awk '/ldlm_bl_callback/ {print $2}') + [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured." + [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured." + lru_resize_enable mdc + lru_resize_enable osc } run_test 120b "Early Lock Cancel: create test" test_120c() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && 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 -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 $DIR/$tdir/d1 - test_mkdir -p $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 - can1=`lctl get_param -n ldlm.services.ldlm_canceld.stats | awk '/ldlm_cancel/ {print $2}'` - blk1=`lctl get_param -n ldlm.services.ldlm_cbd.stats | awk '/ldlm_bl_callback/ {print $2}'` - ln $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2 - can2=`lctl get_param -n ldlm.services.ldlm_canceld.stats | awk '/ldlm_cancel/ {print $2}'` - blk2=`lctl get_param -n ldlm.services.ldlm_cbd.stats | awk '/ldlm_bl_callback/ {print $2}'` - [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured." - [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured." - lru_resize_enable mdc - lru_resize_enable osc + test_mkdir -p -c1 $DIR/$tdir/d1 + test_mkdir -p -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 + can1=$(do_facet $SINGLEMDS \ + "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | + awk '/ldlm_cancel/ {print $2}') + blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats | + awk '/ldlm_bl_callback/ {print $2}') + ln $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2 + can2=$(do_facet $SINGLEMDS \ + "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | + awk '/ldlm_cancel/ {print $2}') + blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats | + awk '/ldlm_bl_callback/ {print $2}') + [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured." + [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured." + lru_resize_enable mdc + lru_resize_enable osc } run_test 120c "Early Lock Cancel: link test" test_120d() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && 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 - lru_resize_disable mdc - lru_resize_disable osc - touch $DIR/$tdir - cancel_lru_locks mdc - stat $DIR/$tdir > /dev/null - can1=`lctl get_param -n ldlm.services.ldlm_canceld.stats | awk '/ldlm_cancel/ {print $2}'` - blk1=`lctl get_param -n ldlm.services.ldlm_cbd.stats | awk '/ldlm_bl_callback/ {print $2}'` - chmod a+x $DIR/$tdir - can2=`lctl get_param -n ldlm.services.ldlm_canceld.stats | awk '/ldlm_cancel/ {print $2}'` - blk2=`lctl get_param -n ldlm.services.ldlm_cbd.stats | awk '/ldlm_bl_callback/ {print $2}'` - [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured." - [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured." - lru_resize_enable mdc - lru_resize_enable osc + 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 + lru_resize_disable mdc + lru_resize_disable osc + touch $DIR/$tdir + 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}') + blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats | + awk '/ldlm_bl_callback/ {print $2}') + chmod a+x $DIR/$tdir + can2=$(do_facet $SINGLEMDS \ + "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | + awk '/ldlm_cancel/ {print $2}') + blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats | + awk '/ldlm_bl_callback/ {print $2}') + [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured." + [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured." + lru_resize_enable mdc + lru_resize_enable osc } run_test 120d "Early Lock Cancel: setattr test" test_120e() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - test_mkdir -p $DIR/$tdir + 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 lru_resize_disable mdc @@ -7379,19 +7884,25 @@ test_120e() { cancel_lru_locks osc dd if=$DIR/$tdir/f1 of=/dev/null stat $DIR/$tdir $DIR/$tdir/f1 > /dev/null - can1=`lctl get_param -n ldlm.services.ldlm_canceld.stats | - awk '/ldlm_cancel/ {print $2}'` - blk1=`lctl get_param -n ldlm.services.ldlm_cbd.stats | - awk '/ldlm_bl_callback/ {print $2}'` - unlink $DIR/$tdir/f1 - can2=`lctl get_param -n ldlm.services.ldlm_canceld.stats | - awk '/ldlm_cancel/ {print $2}'` - blk2=`lctl get_param -n ldlm.services.ldlm_cbd.stats | - awk '/ldlm_bl_callback/ {print $2}'` - [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured." - [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured." - lru_resize_enable mdc - lru_resize_enable osc + # XXX client can not do early lock cancel of OST lock + # during unlink (LU-4206), so cancel osc lock now. + cancel_lru_locks osc + can1=$(do_facet $SINGLEMDS \ + "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | + awk '/ldlm_cancel/ {print $2}') + blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats | + awk '/ldlm_bl_callback/ {print $2}') + unlink $DIR/$tdir/f1 + sleep 5 + can2=$(do_facet $SINGLEMDS \ + "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | + awk '/ldlm_cancel/ {print $2}') + blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats | + awk '/ldlm_bl_callback/ {print $2}') + [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured." + [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured." + lru_resize_enable mdc + lru_resize_enable osc } run_test 120e "Early Lock Cancel: unlink test" @@ -7399,31 +7910,37 @@ 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 - test_mkdir -p $DIR/$tdir + test_mkdir -p -c1 $DIR/$tdir lru_resize_disable mdc lru_resize_disable osc - test_mkdir -p $DIR/$tdir/d1 - test_mkdir -p $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 - cancel_lru_locks osc - dd if=$DIR/$tdir/d1/f1 of=/dev/null - dd if=$DIR/$tdir/d2/f2 of=/dev/null - stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2 > /dev/null - can1=`lctl get_param -n ldlm.services.ldlm_canceld.stats | - awk '/ldlm_cancel/ {print $2}'` - blk1=`lctl get_param -n ldlm.services.ldlm_cbd.stats | - awk '/ldlm_bl_callback/ {print $2}'` - mv $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2 - can2=`lctl get_param -n ldlm.services.ldlm_canceld.stats | - awk '/ldlm_cancel/ {print $2}'` - blk2=`lctl get_param -n ldlm.services.ldlm_cbd.stats | - awk '/ldlm_bl_callback/ {print $2}'` - [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured." - [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured." - lru_resize_enable mdc - lru_resize_enable osc + test_mkdir -p -c1 $DIR/$tdir/d1 + test_mkdir -p -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 + cancel_lru_locks osc + dd if=$DIR/$tdir/d1/f1 of=/dev/null + dd if=$DIR/$tdir/d2/f2 of=/dev/null + stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2 > /dev/null + # XXX client can not do early lock cancel of OST lock + # during rename (LU-4206), so cancel osc lock now. + cancel_lru_locks osc + can1=$(do_facet $SINGLEMDS \ + "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | + awk '/ldlm_cancel/ {print $2}') + blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats | + awk '/ldlm_bl_callback/ {print $2}') + mrename $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2 + sleep 5 + can2=$(do_facet $SINGLEMDS \ + "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | + awk '/ldlm_cancel/ {print $2}') + blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats | + awk '/ldlm_bl_callback/ {print $2}') + [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured." + [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured." + lru_resize_enable mdc + lru_resize_enable osc } run_test 120f "Early Lock Cancel: rename test" @@ -7440,32 +7957,35 @@ test_120g() { cancel_lru_locks osc t0=`date +%s` - can0=`lctl get_param -n ldlm.services.ldlm_canceld.stats | - awk '/ldlm_cancel/ {print $2}'` - blk0=`lctl get_param -n ldlm.services.ldlm_cbd.stats | - awk '/ldlm_bl_callback/ {print $2}'` - createmany -o $DIR/$tdir/f $count - sync - can1=`lctl get_param -n ldlm.services.ldlm_canceld.stats | - awk '/ldlm_cancel/ {print $2}'` - blk1=`lctl get_param -n ldlm.services.ldlm_cbd.stats | - awk '/ldlm_bl_callback/ {print $2}'` - t1=`date +%s` - echo total: $((can1-can0)) cancels, $((blk1-blk0)) blockings - echo rm $count files - rm -r $DIR/$tdir - sync - can2=`lctl get_param -n ldlm.services.ldlm_canceld.stats | - awk '/ldlm_cancel/ {print $2}'` - blk2=`lctl get_param -n ldlm.services.ldlm_cbd.stats | - awk '/ldlm_bl_callback/ {print $2}'` - t2=`date +%s` - echo total: $count removes in $((t2-t1)) - echo total: $((can2-can1)) cancels, $((blk2-blk1)) blockings - sleep 2 - # wait for commitment of removal - lru_resize_enable mdc - lru_resize_enable osc + can0=$(do_facet $SINGLEMDS \ + "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | + awk '/ldlm_cancel/ {print $2}') + blk0=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats | + awk '/ldlm_bl_callback/ {print $2}') + createmany -o $DIR/$tdir/f $count + sync + can1=$(do_facet $SINGLEMDS \ + "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | + awk '/ldlm_cancel/ {print $2}') + blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats | + awk '/ldlm_bl_callback/ {print $2}') + t1=$(date +%s) + echo total: $((can1-can0)) cancels, $((blk1-blk0)) blockings + echo rm $count files + rm -r $DIR/$tdir + sync + can2=$(do_facet $SINGLEMDS \ + "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | + awk '/ldlm_cancel/ {print $2}') + blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats | + awk '/ldlm_bl_callback/ {print $2}') + t2=$(date +%s) + echo total: $count removes in $((t2-t1)) + echo total: $((can2-can1)) cancels, $((blk2-blk1)) blockings + sleep 2 + # wait for commitment of removal + lru_resize_enable mdc + lru_resize_enable osc } run_test 120g "Early Lock Cancel: performance test" @@ -7478,7 +7998,8 @@ test_121() { #bug #10589 cancel_lru_locks osc > /dev/null reads=$(LANG=C dd if=$DIR/$tfile of=/dev/null 2>&1 | awk -F '+' '/in$/ {print $1}') lctl set_param fail_loc=0 - [ "$reads" -eq "$writes" ] || error "read" $reads "blocks, must be" $writes + [[ $reads -eq $writes ]] || + error "read $reads blocks, must be $writes blocks" } run_test 121 "read cancel race =========" @@ -7492,8 +8013,8 @@ test_123a() { # was test 123, statahead(bug 11401) rm -rf $DIR/$tdir test_mkdir -p $DIR/$tdir - NUMFREE=`df -i -P $DIR | tail -n 1 | awk '{ print $4 }'` - [ $NUMFREE -gt 100000 ] && NUMFREE=100000 || NUMFREE=$((NUMFREE-1000)) + NUMFREE=$(df -i -P $DIR | tail -n 1 | awk '{ print $4 }') + [[ $NUMFREE -gt 100000 ]] && NUMFREE=100000 || NUMFREE=$((NUMFREE-1000)) MULT=10 for ((i=100, j=0; i<=$NUMFREE; j=$i, i=$((i * MULT)) )); do createmany -o $DIR/$tdir/$tfile $j $((i - j)) @@ -7522,8 +8043,9 @@ test_123a() { # was test 123, statahead(bug 11401) lctl get_param -n llite.*.statahead_stats ewrong=`lctl get_param -n llite.*.statahead_stats | grep "statahead wrong:" | awk '{print $3}'` - [ $swrong -lt $ewrong ] && log "statahead was stopped, maybe too many locks held!" - [ $delta -eq 0 -o $delta_sa -eq 0 ] && continue + [[ $swrong -lt $ewrong ]] && + log "statahead was stopped, maybe too many locks held!" + [[ $delta -eq 0 || $delta_sa -eq 0 ]] && continue if [ $((delta_sa * 100)) -gt $((delta * 105)) -a $delta_sa -gt $((delta + 2)) ]; then max=`lctl get_param -n llite.*.statahead_max | head -n 1` @@ -7586,8 +8108,8 @@ 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 + [ -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" @@ -7600,18 +8122,18 @@ test_124a() { 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) - if [ $LRU_SIZE -gt $(default_lru_size) ]; then - NSDIR=$(echo $PARAM | cut -d "." -f1-3) - log "NSDIR=$NSDIR" + 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) + if [[ $LRU_SIZE -gt $(default_lru_size) ]]; then + NSDIR=$(echo $PARAM | cut -d "." -f1-3) + log "NSDIR=$NSDIR" log "NS=$(basename $NSDIR)" break fi done - if [ -z "$NSDIR" -o $LRU_SIZE -lt $(default_lru_size) ]; then + if [[ -z "$NSDIR" || $LRU_SIZE -lt $(default_lru_size) ]]; then skip "Not enough cached locks created!" return 0 fi @@ -7622,8 +8144,8 @@ test_124a() { # We know that lru resize allows one client to hold $LIMIT locks # for 10h. After that locks begin to be killed by client. local MAX_HRS=10 - local LIMIT=`lctl get_param -n $NSDIR.pool.limit` - log "LIMIT=$LIMIT" + local LIMIT=$($LCTL get_param -n $NSDIR.pool.limit) + log "LIMIT=$LIMIT" # Make LVF so higher that sleeping for $SLEEP is enough to _start_ # killing locks. Some time was spent for creating locks. This means @@ -7637,9 +8159,9 @@ test_124a() { # created in the case of CMD, LRU_SIZE_B != $NR in most of cases local LRU_SIZE_B=$LRU_SIZE log "LVF=$LVF" - local OLD_LVF=`lctl get_param -n $NSDIR.pool.lock_volume_factor` - log "OLD_LVF=$OLD_LVF" - lctl set_param -n $NSDIR.pool.lock_volume_factor $LVF + local OLD_LVF=$($LCTL get_param -n $NSDIR.pool.lock_volume_factor) + log "OLD_LVF=$OLD_LVF" + $LCTL set_param -n $NSDIR.pool.lock_volume_factor $LVF # Let's make sure that we really have some margin. Client checks # cached locks every 10 sec. @@ -7650,14 +8172,14 @@ test_124a() { echo -n "..." sleep 5 SEC=$((SEC+5)) - LRU_SIZE=`lctl get_param -n $NSDIR/lru_size` + LRU_SIZE=$($LCTL get_param -n $NSDIR/lru_size) echo -n "$LRU_SIZE" done echo "" - lctl set_param -n $NSDIR.pool.lock_volume_factor $OLD_LVF - local LRU_SIZE_A=`lctl get_param -n $NSDIR.lru_size` + $LCTL set_param -n $NSDIR.pool.lock_volume_factor $OLD_LVF + local LRU_SIZE_A=$($LCTL get_param -n $NSDIR.lru_size) - [ $LRU_SIZE_B -gt $LRU_SIZE_A ] || { + [[ $LRU_SIZE_B -gt $LRU_SIZE_A ]] || { error "No locks dropped in ${SLEEP}s. LRU size: $LRU_SIZE_A" unlinkmany $DIR/$tdir/f $NR return @@ -7671,25 +8193,26 @@ run_test 124a "lru resize =======================================" get_max_pool_limit() { - local limit=`lctl get_param -n ldlm.namespaces.*-MDT0000-mdc-*.pool.limit` - local max=0 - for l in $limit; do - if test $l -gt $max; then - max=$l - fi - done - echo $max + local limit=$($LCTL get_param \ + -n ldlm.namespaces.*-MDT0000-mdc-*.pool.limit) + local max=0 + for l in $limit; do + if [[ $l -gt $max ]]; then + max=$l + fi + done + echo $max } 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 + [ -z "$($LCTL get_param -n mdc.*.connect_flags | grep lru_resize)" ] && + skip "no lru resize on server" && return 0 - LIMIT=`get_max_pool_limit` + LIMIT=$(get_max_pool_limit) - NR=$(($(default_lru_size)*20)) - if [ $NR -gt $LIMIT ]; then + NR=$(($(default_lru_size)*20)) + if [[ $NR -gt $LIMIT ]]; then log "Limit lock number by $LIMIT locks" NR=$LIMIT fi @@ -7754,6 +8277,7 @@ run_test 124b "lru resize (performance test) =======================" 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 + [ -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" @@ -7890,34 +8414,44 @@ test_129() { return fi remote_mds_nodsh && skip "remote MDS with nodsh" && return - ENOSPC=28 EFBIG=27 + rm -rf $DIR/$tdir test_mkdir -p $DIR/$tdir - MAX=$(stat -c%s "$DIR/$tdir") + # block size of mds1 + local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/}) + local MDSBLOCKSIZE=$($LCTL get_param -n mdc.*MDT0000*.blocksize) + local MAX=$((MDSBLOCKSIZE * 3)) set_dir_limits $MAX - local I=0 + local I=$(stat -c%s "$DIR/$tdir") local J=0 - while [ ! $I -gt $MAX ]; do + local STRIPE_COUNT=1 + [[ $MDSCOUNT -ge 2 ]] && STRIPE_COUNT=$($LFS getdirstripe -c $DIR/$tdir) + MAX=$((MAX*STRIPE_COUNT)) + while [[ $I -le $MAX ]]; do $MULTIOP $DIR/$tdir/$J Oc rc=$? #check two errors ENOSPC for new version of ext4 max_dir_size patch #mainline kernel commit df981d03eeff7971ac7e6ff37000bfa702327ef1 #and EFBIG for previous versions - if [ $rc -eq $EFBIG -o $rc -eq $ENOSPC ] && [ $I -gt 0 ]; then + if [ $rc -eq $EFBIG -o $rc -eq $ENOSPC ]; then set_dir_limits 0 echo "return code $rc received as expected" - multiop $DIR/$tdir/$J Oc - rc=$? + multiop $DIR/$tdir/$J Oc || + error_exit "multiop failed w/o dir size limit" + I=$(stat -c%s "$DIR/$tdir") - if [ $I -gt $MAX ] && [ $rc -eq 0 ]; then - return 0 + + if [ $(lustre_version_code $SINGLEMDS) -lt \ + $(version_code 2.4.51) ] + then + [[ $I -eq $MAX ]] && return 0 else - error_exit "return code $rc current dir size $I " \ - "previous limit $MAX" + [[ $I -gt $MAX ]] && return 0 fi + error_exit "current dir size $I, previous limit $MAX" elif [ $rc -ne 0 ]; then set_dir_limits 0 error_exit "return code $rc received instead of expected " \ @@ -7928,7 +8462,7 @@ test_129() { done set_dir_limits 0 - error "exceeded dir size limit $MAX x $MDSCOUNT $MAX : $I bytes" + error "exceeded dir size limit $MAX($MDSCOUNT) : $I bytes" } run_test 129 "test directory size limit ========================" @@ -8289,11 +8823,12 @@ som_mode_switch() { if [ x$som = x"enabled" ]; then [ $((gl2 - gl1)) -gt 0 ] && error "no glimpse RPC is expected" - MOUNTOPT=`echo $MOUNTOPT | sed 's/som_preview//g'` + MOUNT_OPTS=`echo $MOUNT_OPTS | + sed 's/som_preview,\|,som_preview\|som_preview//g'` do_facet mgs "$LCTL conf_param $FSNAME.mdt.som=disabled" else [ $((gl2 - gl1)) -gt 0 ] || error "some glimpse RPC is expected" - MOUNTOPT="$MOUNTOPT,som_preview" + MOUNT_OPTS="${MOUNT_OPTS:+$MOUNT_OPTS,}som_preview" do_facet mgs "$LCTL conf_param $FSNAME.mdt.som=enabled" fi @@ -8309,12 +8844,12 @@ test_132() { #1028, SOM remote_mds_nodsh && skip "remote MDS with nodsh" && return local num=$(get_mds_dir $DIR) local mymds=mds${num} - local MOUNTOPT_SAVE=$MOUNTOPT + local MOUNT_OPTS_SAVE=$MOUNT_OPTS dd if=/dev/zero of=$DIR/$tfile count=1 2>/dev/null cancel_lru_locks osc - som1=$(do_facet $mymds "$LCTL get_param mdt.*.som" | awk -F= ' {print $2}' | head -n 1) + som1=$(do_facet $mymds "$LCTL get_param -n mdt.*.som" | head -n 1) gl1=$(get_ost_param "ldlm_glimpse_enqueue") stat $DIR/$tfile >/dev/null @@ -8326,7 +8861,7 @@ test_132() { #1028, SOM dd if=/dev/zero of=$DIR/$tfile count=1 2>/dev/null cancel_lru_locks osc - som2=$(do_facet $mymds "$LCTL get_param mdt.*.som" | awk -F= ' {print $2}' | head -n 1) + som2=$(do_facet $mymds "$LCTL get_param -n mdt.*.som" | head -n 1) if [ $som1 == $som2 ]; then error "som is still "$som2 if [ x$som2 = x"enabled" ]; then @@ -8341,7 +8876,7 @@ test_132() { #1028, SOM gl2=$(get_ost_param "ldlm_glimpse_enqueue") echo "====> SOM is "$som2", "$((gl2 - gl1))" glimpse RPC occured" som_mode_switch $som2 $gl1 $gl2 - MOUNTOPT=$MOUNTOPT_SAVE + MOUNT_OPTS=$MOUNT_OPTS_SAVE } run_test 132 "som avoids glimpse rpc" @@ -8356,11 +8891,12 @@ check_stats() { *) error "Wrong argument $1" ;; esac echo $res - count=`echo $res | awk '{print $2}'` [ -z "$res" ] && error "The counter for $2 on $1 was not incremented" # if the argument $3 is zero, it means any stat increment is ok. - if [ $3 -gt 0 ] ; then - [ $count -ne $3 ] && error "The $2 counter on $1 is wrong - expected $3" + if [[ $3 -gt 0 ]]; then + count=$(echo $res | awk '{ print $2 }') + [[ $count -ne $3 ]] && + error "The $2 counter on $1 is wrong - expected $3" fi } @@ -8475,19 +9011,19 @@ test_133c() { run_test 133c "Verifying OST stats ========================================" order_2() { - local value=$1 - local orig=$value - local order=1 + local value=$1 + local orig=$value + local order=1 - while [ $value -ge 2 ]; do - order=$((order*2)) - value=$((value/2)) - done + while [ $value -ge 2 ]; do + order=$((order*2)) + value=$((value/2)) + done - if [ $orig -gt $order ]; then - order=$((order*2)) - fi - echo $order + if [ $orig -gt $order ]; then + order=$((order*2)) + fi + echo $order } size_in_KMGT() { @@ -8562,7 +9098,8 @@ test_133d() { local samedir=$($cmd | grep 'same_dir') local same_sample=$(get_rename_size $testdir1_size) [ -z "$samedir" ] && error "samedir_rename_size count error" - [ "$same_sample" -eq 1 ] || error "samedir_rename_size error $same_sample" + [[ $same_sample -eq 1 ]] || + error "samedir_rename_size error $same_sample" echo "Check same dir rename stats success" do_facet $SINGLEMDS $LCTL set_param mdt.*.rename_stats=clear @@ -8589,19 +9126,22 @@ test_133d() { local src_sample=$(get_rename_size $testdir1_size crossdir_src) local tgt_sample=$(get_rename_size $testdir2_size crossdir_tgt) [ -z "$crossdir" ] && error "crossdir_rename_size count error" - [ "$src_sample" -eq 1 ] || error "crossdir_rename_size error $src_sample" - [ "$tgt_sample" -eq 1 ] || error "crossdir_rename_size error $tgt_sample" + [[ $src_sample -eq 1 ]] || + error "crossdir_rename_size error $src_sample" + [[ $tgt_sample -eq 1 ]] || + error "crossdir_rename_size error $tgt_sample" echo "Check cross dir rename stats success" rm -rf $DIR/${tdir} } run_test 133d "Verifying rename_stats ========================================" test_133e() { + 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 testdir=$DIR/${tdir}/stats_testdir local ctr f0 f1 bs=32768 count=42 sum - remote_ost_nodsh && skip "remote OST with nodsh" && return mkdir -p ${testdir} || error "mkdir failed" $SETSTRIPE -c 1 -i 0 ${testdir}/${tfile} @@ -8627,11 +9167,10 @@ test_133e() { cancel_lru_locks osc sum=$(do_facet ost1 $LCTL get_param \ - "obdfilter.*.exports.*.stats" | \ - awk -v ctr=$ctr '\ - BEGIN { sum = 0 } + "obdfilter.*.exports.*.stats" | + awk -v ctr=$ctr 'BEGIN { sum = 0 } $1 == ctr { sum += $7 } - END { print sum }') + END { printf("%0.0f", sum) }') if ((sum != bs * count)); then error "Bad $ctr sum, expected $((bs * count)), got $sum" @@ -8643,35 +9182,89 @@ test_133e() { run_test 133e "Verifying OST {read,write}_bytes nid stats =================" test_133f() { - local proc_dirs="/proc/fs/lustre/ /proc/sys/lnet/ /proc/sys/lustre/" + local proc_dirs + + local dirs="/proc/fs/lustre/ /proc/sys/lnet/ /proc/sys/lustre/ \ +/sys/fs/lustre/ /sys/fs/lnet/" + local dir + for dir in $dirs; do + if [ -d $dir ]; then + proc_dirs="$proc_dirs $dir" + fi + done + local facet + remote_mds_nodsh && skip "remote MDS with nodsh" && return + remote_ost_nodsh && skip "remote OST with nodsh" && return # First without trusting modes. - find $proc_dirs \ - -exec cat '{}' \; &> /dev/null + find $proc_dirs -exec cat '{}' \; &> /dev/null # Second verifying readability. find $proc_dirs \ -type f \ - -readable \ - -exec cat '{}' \; > /dev/null || + -exec cat '{}' \; &> /dev/null || error "proc file read failed" for facet in $SINGLEMDS ost1; do do_facet $facet find $proc_dirs \ - -not -name req_history \ + ! -name req_history \ -exec cat '{}' \\\; &> /dev/null - do_facet $facet find $proc_dirs \ - -not -name req_history \ + do_facet $facet find $proc_dirs \ + ! -name req_history \ -type f \ - -readable \ - -exec cat '{}' \\\; > /dev/null || + -exec cat '{}' \\\; &> /dev/null || error "proc file read failed" done } run_test 133f "Check for LBUGs/Oopses/unreadable files in /proc" +test_133g() { + local proc_dirs + + local dirs="/proc/fs/lustre/ /proc/sys/lnet/ /proc/sys/lustre/ \ +/sys/fs/lustre/ /sys/fs/lnet/" + local dir + for dir in $dirs; do + if [ -d $dir ]; then + proc_dirs="$proc_dirs $dir" + fi + done + + local facet + + # Second verifying readability. + find $proc_dirs \ + -type f \ + -not -name force_lbug \ + -not -name changelog_mask \ + -exec badarea_io '{}' \; &> /dev/null || + error "find $proc_dirs failed" + + [ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.5.54) ] && + skip "Too old lustre on MDS" + + [ $(lustre_version_code ost1) -le $(version_code 2.5.54) ] && + skip "Too old lustre on ost1" + + for facet in $SINGLEMDS ost1; do + do_facet $facet find $proc_dirs \ + -type f \ + -not -name force_lbug \ + -not -name changelog_mask \ + -exec badarea_io '{}' \\\; &> /dev/null || + error "$facet find $proc_dirs failed" + + done + + # remount the FS in case writes/reads /proc break the FS + cleanup || error "failed to unmount" + setup || error "failed to setup" + true +} +run_test 133g "Check for Oopses on bad io area writes/reads in /proc" + test_140() { #bug-17379 [ $PARALLEL == "yes" ] && skip "skip parallel run" && return test_mkdir -p $DIR/$tdir || error "Creating dir $DIR/$tdir" @@ -8759,16 +9352,15 @@ function roc_hit_init() { dd if=/dev/urandom of=$file bs=4k count=4 2>&1 > /dev/null idx=$(printf %04x $i) BEFORE=$(get_osd_param $list *OST*$idx stats | - awk '$1 == "cache_access" {sum += $2} END { print sum }') - if [ -z "$BEFORE" ]; then - BEFORE=0 - fi + awk '$1 == "cache_access" {sum += $7} + END { printf("%0.0f", sum) }') cancel_lru_locks osc cat $file >/dev/null AFTER=$(get_osd_param $list *OST*$idx stats | - awk '$1 == "cache_access" {sum += $2} END { print sum }') + awk '$1 == "cache_access" {sum += $7} + END { printf("%0.0f", sum) }') echo BEFORE:$BEFORE AFTER:$AFTER if ! let "AFTER - BEFORE == 4"; then @@ -8784,7 +9376,8 @@ function roc_hit_init() { function roc_hit() { local list=$(comma_list $(osts_nodes)) echo $(get_osd_param $list '' stats | - awk '$1 == "cache_hit" {sum += $2} END { print sum }') + awk '$1 == "cache_hit" {sum += $7} + END { printf("%0.0f", sum) }') } function set_cache() { @@ -8918,8 +9511,10 @@ dot_lustre_fid_permission_check() { rm -f $test_dir/$tfile.1 echo "truncate fid $fid" $TRUNCATE $ffid 777 || error "truncate $ffid failed." - echo "link fid $fid" - ln -f $ffid $test_dir/tfile.lnk || error "link $ffid failed." + if [ $MDSCOUNT -lt 2 ]; then #FIXME when cross-MDT hard link is working + echo "link fid $fid" + ln -f $ffid $test_dir/tfile.lnk || error "link $ffid failed." + fi if [ -n $(lctl get_param -n mdc.*-mdc-*.connect_flags | grep acl) ]; then echo "setfacl fid $fid" setfacl -R -m u:bin:rwx $ffid || error "setfacl $ffid failed." @@ -9000,9 +9595,13 @@ dot_lustre_fid_permission_check() { $OPENFILE -f O_LOV_DELAY_CREATE:O_CREAT $test_dir/$tfile-2 fid=$($LFS path2fid $test_dir/$tfile-2) - echo "cp /etc/passwd $MOUNT/.lustre/fid/$fid" - cp /etc/passwd $MOUNT/.lustre/fid/$fid && - error "create lov data thru .lustre should fail." + + if [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.6.50) ] + then # LU-5424 + echo "cp /etc/passwd $MOUNT/.lustre/fid/$fid" + cp /etc/passwd $MOUNT/.lustre/fid/$fid || + error "create lov data thru .lustre failed" + fi echo "cp /etc/passwd $test_dir/$tfile-2" cp /etc/passwd $test_dir/$tfile-2 || error "copy to $test_dir/$tfile-2 failed." @@ -9036,6 +9635,7 @@ test_154a() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.2.51) ]] || { skip "Need MDS version at least 2.2.51"; return 0; } + [ -z "$(which setfacl)" ] && skip "must have setfacl tool" && return cp /etc/hosts $DIR/$tfile @@ -9112,6 +9712,126 @@ test_154c() { } run_test 154c "lfs path2fid and fid2path multiple arguments" +test_154d() { + [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.5.53) ]] && + skip "Need MDS version at least 2.5.53" && return + + if remote_mds; then + nid=$($LCTL list_nids | sed "s/\./\\\./g") + else + nid="0@lo" + fi + local proc_ofile="mdt.*.exports.'$nid'.open_files" + local fd + local cmd + + rm -f $DIR/$tfile + touch $DIR/$tfile + + fid=$($LFS path2fid $DIR/$tfile) + # Open the file + fd=$(free_fd) + cmd="exec $fd<$DIR/$tfile" + eval $cmd + fid_list=$(do_facet $SINGLEMDS $LCTL get_param $proc_ofile) + echo $fid_list | grep $fid + rc=$? + + cmd="exec $fd>/dev/null" + eval $cmd + if [ $rc -ne 0 ]; then + error "FID $fid not found in open files list $fid_list" + fi +} +run_test 154d "Verify open file fid" + +test_154e() +{ + [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.6.50) ]] && + skip "Need MDS version at least 2.6.50" && return + + if ls -a $MOUNT | grep -q '^\.lustre$'; then + error ".lustre returned by readdir" + fi +} +run_test 154e ".lustre is not returned by readdir" + +test_154f() { + # create parent directory on a single MDT to avoid cross-MDT hardlinks + test_mkdir -p -c1 $DIR/$tdir/d + # test dirs inherit from its stripe + mkdir -p $DIR/$tdir/d/foo1 || error "mkdir error" + mkdir -p $DIR/$tdir/d/foo2 || error "mkdir error" + cp /etc/hosts $DIR/$tdir/d/foo1/$tfile + ln $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/link + touch $DIR/f + + # get fid of parents + local FID0=$($LFS path2fid $DIR/$tdir/d) + local FID1=$($LFS path2fid $DIR/$tdir/d/foo1) + local FID2=$($LFS path2fid $DIR/$tdir/d/foo2) + local FID3=$($LFS path2fid $DIR) + + # check that path2fid --parents returns expected /name + # 1) test for a directory (single parent) + local parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1) + [ "$parent" == "$FID0/foo1" ] || + error "expected parent: $FID0/foo1, got: $parent" + + # 2) test for a file with nlink > 1 (multiple parents) + parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1/$tfile) + echo "$parent" | grep -F "$FID1/$tfile" || + error "$FID1/$tfile not returned in parent list" + echo "$parent" | grep -F "$FID2/link" || + error "$FID2/link not returned in parent list" + + # 3) get parent by fid + local file_fid=$($LFS path2fid $DIR/$tdir/d/foo1/$tfile) + parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid) + echo "$parent" | grep -F "$FID1/$tfile" || + error "$FID1/$tfile not returned in parent list (by fid)" + echo "$parent" | grep -F "$FID2/link" || + error "$FID2/link not returned in parent list (by fid)" + + # 4) test for entry in root directory + parent=$($LFS path2fid --parents $DIR/f) + echo "$parent" | grep -F "$FID3/f" || + error "$FID3/f not returned in parent list" + + # 5) test it on root directory + [ -z "$($LFS path2fid --parents $MOUNT 2>/dev/null)" ] || + error "$MOUNT should not have parents" + + # enable xattr caching and check that linkea is correctly updated + local save="$TMP/$TESTSUITE-$TESTNAME.parameters" + save_lustre_params client "llite.*.xattr_cache" > $save + lctl set_param llite.*.xattr_cache 1 + + # 6.1) linkea update on rename + mv $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/$tfile.moved + + # get parents by fid + parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid) + # foo1 should no longer be returned in parent list + echo "$parent" | grep -F "$FID1" && + error "$FID1 should no longer be in parent list" + # the new path should appear + echo "$parent" | grep -F "$FID2/$tfile.moved" || + error "$FID2/$tfile.moved is not in parent list" + + # 6.2) linkea update on unlink + rm -f $DIR/$tdir/d/foo2/link + parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid) + # foo2/link should no longer be returned in parent list + echo "$parent" | grep -F "$FID2/link" && + error "$FID2/link should no longer be in parent list" + true + + rm -f $DIR/f + restore_lustre_params < $save +} +run_test 154f "get parent fids by reading link ea" + test_155_small_load() { local temp=$TMP/$tfile local file=$DIR/$tfile @@ -9233,6 +9953,7 @@ test_155h() { run_test 155h "Verify big file correctness: read cache:off write_cache:off" test_156() { + remote_ost_nodsh && skip "remote OST with nodsh" && return [ $PARALLEL == "yes" ] && skip "skip parallel run" && return local CPAGES=3 local BEFORE @@ -9378,7 +10099,7 @@ run_test 156 "Verification of tunables ============================" #Changelogs err17935 () { - if [ $MDSCOUNT -gt 1 ]; then + if [[ $MDSCOUNT -gt 1 ]]; then error_ignore bz17935 $* else error $* @@ -9473,18 +10194,18 @@ test_160a() { MIN_REC=$($GET_CL_USERS | awk 'min == "" || $2 < min {min = $2}; END {print min}') - FIRST_REC=$($LFS changelog $MDT0 | head -1 | awk '{print $1}') + FIRST_REC=$($LFS changelog $MDT0 | head -n1 | awk '{print $1}') echo "verifying min purge: $(( $MIN_REC + 1 )) == $FIRST_REC" [ $FIRST_REC == $(($MIN_REC + 1)) ] || err17935 "first index should be $(($MIN_REC + 1)) is $FIRST_REC" # LU-3446 changelog index reset on MDT restart local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/}) - CUR_REC1=$($GET_CL_USERS | head -1 | cut -f3 -d' ') + CUR_REC1=$($GET_CL_USERS | head -n1 | cut -f3 -d' ') $LFS changelog_clear $MDT0 $USER 0 stop $SINGLEMDS || error "Fail to stop MDT." start $SINGLEMDS $MDT_DEV $MDS_MOUNT_OPTS || error "Fail to start MDT." - CUR_REC2=$($GET_CL_USERS | head -1 | cut -f3 -d' ') + CUR_REC2=$($GET_CL_USERS | head -n1 | cut -f3 -d' ') echo "verifying index survives MDT restart: $CUR_REC1 == $CUR_REC2" [ $CUR_REC1 == $CUR_REC2 ] || err17935 "current index should be $CUR_REC1 is $CUR_REC2" @@ -9496,9 +10217,9 @@ test_160a() { USERS=$(( $($GET_CL_USERS | wc -l) - 2 )) if [ $USERS -eq 0 ]; then - LAST_REC1=$($GET_CL_USERS | head -1 | cut -f3 -d' ') + LAST_REC1=$($GET_CL_USERS | head -n1 | cut -f3 -d' ') touch $DIR/$tdir/chloe - LAST_REC2=$($GET_CL_USERS | head -1 | cut -f3 -d' ') + LAST_REC2=$($GET_CL_USERS | head -n1 | cut -f3 -d' ') echo "verify changelogs are off: $LAST_REC1 == $LAST_REC2" [ $LAST_REC1 == $LAST_REC2 ] || error "changelogs not off" else @@ -9538,16 +10259,48 @@ test_160b() { # LU-3587 } run_test 160b "Verify that very long rename doesn't crash in changelog" +test_160c() { + local rc=0 + local server_version=$(lustre_version_code $SINGLEMDS) + + [[ $server_version -gt $(version_code 2.5.57) ]] || + [[ $server_version -gt $(version_code 2.5.1) && + $server_version -lt $(version_code 2.5.50) ]] || + { skip "Need MDS version at least 2.5.58 or 2.5.2+"; return; } + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + + # Registration step + local USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \ + changelog_register -n) + + rm -rf $DIR/$tdir + mkdir -p $DIR/$tdir + $MCREATE $DIR/$tdir/foo_160c + changelog_chmask "TRUNC" + $TRUNCATE $DIR/$tdir/foo_160c 200 + changelog_chmask "TRUNC" + $TRUNCATE $DIR/$tdir/foo_160c 199 + $LFS changelog $MDT0 + TRUNCS=$($LFS changelog $MDT0 | tail -5 | grep -c "TRUNC") + [ $TRUNCS -eq 1 ] || err17935 "TRUNC changelog mask count $TRUNCS != 1" + $LFS changelog_clear $MDT0 $USER 0 + + # Deregistration step + echo "deregistering $USER" + do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister $USER +} +run_test 160c "verify that changelog log catch the truncate event" + test_161a() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - test_mkdir -p $DIR/$tdir - cp /etc/hosts $DIR/$tdir/$tfile - test_mkdir $DIR/$tdir/foo1 - test_mkdir $DIR/$tdir/foo2 - ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/sofia - ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/zachary - ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/luna - ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/thor + test_mkdir -p -c1 $DIR/$tdir + cp /etc/hosts $DIR/$tdir/$tfile + test_mkdir -c1 $DIR/$tdir/foo1 + test_mkdir -c1 $DIR/$tdir/foo2 + ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/sofia + ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/zachary + ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/luna + ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/thor local FID=$($LFS path2fid $DIR/$tdir/$tfile | tr -d '[]') if [ "$($LFS fid2path $DIR $FID | wc -l)" != "5" ]; then $LFS fid2path $DIR $FID @@ -9568,15 +10321,16 @@ test_161a() { fi rm $DIR/$tdir/foo2/maggie - # overflow the EA - local longname=filename_avg_len_is_thirty_two_ - createmany -l$DIR/$tdir/foo1/luna $DIR/$tdir/foo2/$longname 1000 || \ - error "failed to hardlink many files" - links=$($LFS fid2path $DIR $FID | wc -l) - echo -n "${links}/1000 links in link EA" - [ ${links} -gt 60 ] || err17935 "expected at least 60 links in link EA" - unlinkmany $DIR/$tdir/foo2/$longname 1000 || \ - error "failed to unlink many hardlinks" + # overflow the EA + local longname=filename_avg_len_is_thirty_two_ + createmany -l$DIR/$tdir/foo1/luna $DIR/$tdir/foo2/$longname 1000 || + error "failed to hardlink many files" + links=$($LFS fid2path $DIR $FID | wc -l) + echo -n "${links}/1000 links in link EA" + [[ $links -gt 60 ]] || + err17935 "expected at least 60 links in link EA" + unlinkmany $DIR/$tdir/foo2/$longname 1000 || + error "failed to unlink many hardlinks" } run_test 161a "link ea sanity" @@ -9626,13 +10380,15 @@ test_161b() { error "failed to hardlink many files" links=$($LFS fid2path $DIR $FID | wc -l) echo -n "${links}/1000 links in link EA" - [ ${links} -gt 60 ] || err17935 "expected at least 60 links in link EA" + [[ ${links} -gt 60 ]] || + err17935 "expected at least 60 links in link EA" unlinkmany $remote_dir/foo2/$longname 1000 || error "failed to unlink many hardlinks" } run_test 161b "link ea sanity under remote directory" test_161c() { + remote_mds_nodsh && skip "remote MDS with nodsh" && return [ $PARALLEL == "yes" ] && skip "skip parallel run" && return [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.1.5) ]] && skip "Need MDS version at least 2.1.5" && return @@ -9740,33 +10496,38 @@ check_path() { test_162() { # Make changes to filesystem [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - test_mkdir -p $DIR/$tdir/d2 + test_mkdir -p -c1 $DIR/$tdir/d2 touch $DIR/$tdir/d2/$tfile touch $DIR/$tdir/d2/x1 touch $DIR/$tdir/d2/x2 - test_mkdir -p $DIR/$tdir/d2/a/b/c - test_mkdir -p $DIR/$tdir/d2/p/q/r + test_mkdir -p -c1 $DIR/$tdir/d2/a/b/c + test_mkdir -p -c1 $DIR/$tdir/d2/p/q/r # regular file FID=$($LFS path2fid $DIR/$tdir/d2/$tfile | tr -d '[]') - check_path "$tdir/d2/$tfile" $FSNAME $FID --link 0 + check_path "$tdir/d2/$tfile" $FSNAME $FID --link 0 || + error "check path $tdir/d2/$tfile failed" # softlink ln -s $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/slink FID=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink | tr -d '[]') - check_path "$tdir/d2/p/q/r/slink" $FSNAME $FID --link 0 + check_path "$tdir/d2/p/q/r/slink" $FSNAME $FID --link 0 || + error "check path $tdir/d2/p/q/r/slink failed" # softlink to wrong file ln -s /this/is/garbage $DIR/$tdir/d2/p/q/r/slink.wrong FID=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink.wrong | tr -d '[]') - check_path "$tdir/d2/p/q/r/slink.wrong" $FSNAME $FID --link 0 + check_path "$tdir/d2/p/q/r/slink.wrong" $FSNAME $FID --link 0 || + error "check path $tdir/d2/p/q/r/slink.wrong failed" # hardlink ln $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/hlink mv $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/a/b/c/new_file FID=$($LFS path2fid $DIR/$tdir/d2/a/b/c/new_file | tr -d '[]') # fid2path dir/fsname should both work - check_path "$tdir/d2/a/b/c/new_file" $FSNAME $FID --link 1 - check_path "$DIR/$tdir/d2/p/q/r/hlink" $DIR $FID --link 0 + check_path "$tdir/d2/a/b/c/new_file" $FSNAME $FID --link 1 || + error "check path $tdir/d2/a/b/c/new_file failed" + check_path "$DIR/$tdir/d2/p/q/r/hlink" $DIR $FID --link 0 || + error "check path $DIR/$tdir/d2/p/q/r/hlink failed" # hardlink count: check that there are 2 links # Doesnt work with CMD yet: 17935 @@ -9775,12 +10536,45 @@ test_162() { # hardlink indexing: remove the first link rm $DIR/$tdir/d2/p/q/r/hlink - check_path "$tdir/d2/a/b/c/new_file" $FSNAME $FID --link 0 + check_path "$tdir/d2/a/b/c/new_file" $FSNAME $FID --link 0 || + error "check path $DIR/$tdir/d2/a/b/c/new_file failed" return 0 } run_test 162 "path lookup sanity" +test_162b() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + + mkdir $DIR/$tdir + $LFS setdirstripe -i0 -c$MDSCOUNT -t all_char $DIR/$tdir/striped_dir || + error "create striped dir failed" + + local FID=$($LFS getdirstripe $DIR/$tdir/striped_dir | + tail -n 1 | awk '{print $2}') + stat $MOUNT/.lustre/fid/$FID && error "sub_stripe can be accessed" + + touch $DIR/$tdir/striped_dir/f{0..4} || error "touch f0..4 failed" + mkdir $DIR/$tdir/striped_dir/d{0..4} || error "mkdir d0..4 failed" + + # regular file + for ((i=0;i<5;i++)); do + FID=$($LFS path2fid $DIR/$tdir/striped_dir/f$i | tr -d '[]') || + error "get fid for f$i failed" + check_path "$tdir/striped_dir/f$i" $FSNAME $FID --link 0 || + error "check path $tdir/striped_dir/f$i failed" + + FID=$($LFS path2fid $DIR/$tdir/striped_dir/d$i | tr -d '[]') || + error "get fid for d$i failed" + check_path "$tdir/striped_dir/d$i" $FSNAME $FID --link 0 || + error "check path $tdir/striped_dir/d$i failed" + done + + return 0 +} +run_test 162b "striped directory path lookup sanity" + test_169() { # do directio so as not to populate the page cache log "creating a 10 Mb file" @@ -9871,7 +10665,7 @@ test_171() { # bug20592 } run_test 171 "test libcfs_debug_dumplog_thread stuck in do_exit() ======" -# it would be good to share it with obdfilter-survey/libecho code +# it would be good to share it with obdfilter-survey/iokit-libecho code setup_obdecho_osc () { local rc=0 local ost_nid=$1 @@ -9900,6 +10694,15 @@ obdecho_test() { local pages=${3:-64} local rc=0 local id + + local count=10 + local obd_size=$(get_obd_size $node $OBD) + local page_size=$(get_page_size $node) + if [[ -n "$obd_size" ]]; then + local new_count=$((obd_size / (pages * page_size / 1024))) + [[ $new_count -ge $count ]] || count=$new_count + fi + do_facet $node "$LCTL attach echo_client ec ec_uuid" || rc=1 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec setup $OBD" || rc=2; } @@ -9911,7 +10714,7 @@ obdecho_test() { [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec getattr $id" || rc=4; } [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec " \ - "test_brw 10 w v $pages $id" || rc=4; } + "test_brw $count w v $pages $id" || rc=4; } [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec destroy $id 1" || rc=4; } [ $rc -eq 0 -o $rc -gt 2 ] && { do_facet $node "$LCTL --device ec " \ @@ -9966,6 +10769,7 @@ run_test 180b "test obdecho directly on obdfilter" test_180c() { # LU-2598 [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + remote_ost_nodsh && skip "remote OST with nodsh" && return [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.0) ]] && skip "Need MDS version at least 2.4.0" && return @@ -9977,10 +10781,10 @@ test_180c() { # LU-2598 do_rpc_nodes $(facet_active_host ost1) load_module obdecho/obdecho && rmmod_remote=true || error "failed to load module obdecho" - target=$(do_facet ost1 $LCTL dl | awk '/obdfilter/ {print $4}'|head -1) - if [[ -n $target ]]; then - obdecho_test "$target" ost1 "$pages" || - rc=${PIPESTATUS[0]} + target=$(do_facet ost1 $LCTL dl | awk '/obdfilter/ { print $4 }' | + head -n1) + if [ -n "$target" ]; then + obdecho_test "$target" ost1 "$pages" || rc=${PIPESTATUS[0]} else echo "there is no obdfilter target on ost1" rc=2 @@ -10037,6 +10841,7 @@ test_182() { run_test 182 "Disable MDC RPCs semaphore wouldn't crash client ================" test_183() { # LU-2275 + remote_mds_nodsh && skip "remote MDS with nodsh" && return [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.3.56) ]] && skip "Need MDS version at least 2.3.56" && return @@ -10066,7 +10871,7 @@ test_184a() { check_swap_layouts_support && return 0 dir0=$DIR/$tdir/$testnum - test_mkdir -p $dir0 || error "creating dir $dir0" + test_mkdir -p -c1 $dir0 || error "creating dir $dir0" ref1=/etc/passwd ref2=/etc/group file1=$dir0/f1 @@ -10134,7 +10939,8 @@ test_184c() { # create a file large enough for the concurent test dd if=/dev/urandom of=$ref1 bs=1M count=$((RANDOM % 50 + 20)) dd if=/dev/urandom of=$ref2 bs=1M count=$((RANDOM % 50 + 20)) - echo "ref file size: ref1(`stat -c %s $ref1`), ref2(`stat -c %s $ref2`)" + echo "ref file size: ref1($(stat -c %s $ref1))," \ + "ref2($(stat -c %s $ref2))" cp $ref2 $file2 dd if=$ref1 of=$file1 bs=16k & @@ -10150,8 +10956,8 @@ test_184c() { [[ $rc == 0 ]] || error "swap of $file1 and $file2 failed" # how many bytes copied before swapping layout - local copied=`stat -c %s $file2` - local remaining=`stat -c %s $ref1` + local copied=$(stat -c %s $file2) + local remaining=$(stat -c %s $ref1) remaining=$((remaining - copied)) echo "Copied $copied bytes before swapping layout..." @@ -10169,6 +10975,8 @@ run_test 184c "Concurrent write and layout swap" test_184d() { check_swap_layouts_support && return 0 + [ -z "$(which getfattr 2>/dev/null)" ] && + skip "no getfattr command" && return 0 local file1=$DIR/$tdir/$tfile-1 local file2=$DIR/$tdir/$tfile-2 @@ -10193,7 +11001,7 @@ test_184d() { [ "$lovea1" == "$lovea2" ] || error "lovea $lovea1 != $lovea2" lovea1=$(getfattr -n trusted.lov $file1 | grep ^trusted) - [ -z $lovea1 ] || error "$file1 shouldn't have lovea" + [[ -z "$lovea1" ]] || error "$file1 shouldn't have lovea" } run_test 184d "allow stripeless layouts swap" @@ -10263,266 +11071,21 @@ test_187b() { } run_test 187b "Test data version change on volatile file" -# OST pools tests -check_file_in_pool() -{ - local file=$1 - local pool=$2 - local tlist="$3" - local res=$($GETSTRIPE $file | grep 0x | cut -f2) - for i in $res - do - for t in $tlist ; do - [ "$i" -eq "$t" ] && continue 2 - done - - echo "pool list: $tlist" - echo "striping: $res" - error_noexit "$file not allocated in $pool" - return 1 - done - return 0 -} - -pool_add() { - echo "Creating new pool" - local pool=$1 - - create_pool $FSNAME.$pool || - { error_noexit "No pool created, result code $?"; return 1; } - [ $($LFS pool_list $FSNAME | grep -c $pool) -eq 1 ] || - { error_noexit "$pool not in lfs pool_list"; return 2; } -} +test_200() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + remote_mgs_nodsh && skip "remote MGS with nodsh" && return -pool_add_targets() { - echo "Adding targets to pool" - local pool=$1 - local first=$2 - local last=$3 - local step=${4:-1} - - local list=$(seq $first $step $last) - - local t=$(for i in $list; do printf "$FSNAME-OST%04x_UUID " $i; done) - do_facet mgs $LCTL pool_add \ - $FSNAME.$pool $FSNAME-OST[$first-$last/$step] - wait_update $HOSTNAME "lctl get_param -n lov.$FSNAME-*.pools.$pool \ - | sort -u | tr '\n' ' ' " "$t" || { - error_noexit "Add to pool failed" - return 1 - } - local lfscount=$($LFS pool_list $FSNAME.$pool | grep -c "\-OST") - local addcount=$(((last - first) / step + 1)) - [ $lfscount -eq $addcount ] || { - error_noexit "lfs pool_list bad ost count" \ - "$lfscount != $addcount" - return 2 - } -} - -pool_set_dir() { - local pool=$1 - local tdir=$2 - echo "Setting pool on directory $tdir" - - $SETSTRIPE -c 2 -p $pool $tdir && return 0 - - error_noexit "Cannot set pool $pool to $tdir" - return 1 -} - -pool_check_dir() { - local pool=$1 - local tdir=$2 - echo "Checking pool on directory $tdir" - - local res=$($GETSTRIPE --pool $tdir | sed "s/\s*$//") - [ "$res" = "$pool" ] && return 0 - - error_noexit "Pool on '$tdir' is '$res', not '$pool'" - return 1 -} - -pool_dir_rel_path() { - echo "Testing relative path works well" - local pool=$1 - local tdir=$2 - local root=$3 - - mkdir -p $root/$tdir/$tdir - cd $root/$tdir - pool_set_dir $pool $tdir || return 1 - pool_set_dir $pool ./$tdir || return 2 - pool_set_dir $pool ../$tdir || return 3 - pool_set_dir $pool ../$tdir/$tdir || return 4 - rm -rf $tdir; cd - > /dev/null -} - -pool_alloc_files() { - echo "Checking files allocation from directory pool" - local pool=$1 - local tdir=$2 - local count=$3 - local tlist="$4" - - local failed=0 - for i in $(seq -w 1 $count) - do - local file=$tdir/file-$i - touch $file - check_file_in_pool $file $pool "$tlist" || \ - failed=$((failed + 1)) - done - [ "$failed" = 0 ] && return 0 - - error_noexit "$failed files not allocated in $pool" - return 1 -} - -pool_create_files() { - echo "Creating files in pool" - local pool=$1 - local tdir=$2 - local count=$3 - local tlist="$4" - - mkdir -p $tdir - local failed=0 - for i in $(seq -w 1 $count) - do - local file=$tdir/spoo-$i - $SETSTRIPE -p $pool $file - check_file_in_pool $file $pool "$tlist" || \ - failed=$((failed + 1)) - done - [ "$failed" = 0 ] && return 0 - - error_noexit "$failed files not allocated in $pool" - return 1 -} - -pool_lfs_df() { - echo "Checking 'lfs df' output" - local pool=$1 - - local t=$($LCTL get_param -n lov.$FSNAME-clilov-*.pools.$pool | - tr '\n' ' ') - local res=$($LFS df --pool $FSNAME.$pool | - awk '{print $1}' | - grep "$FSNAME-OST" | - tr '\n' ' ') - [ "$res" = "$t" ] && return 0 - - error_noexit "Pools OSTs '$t' is not '$res' that lfs df reports" - return 1 -} - -pool_file_rel_path() { - echo "Creating files in a pool with relative pathname" - local pool=$1 - local tdir=$2 - - mkdir -p $tdir || - { error_noexit "unable to create $tdir"; return 1 ; } - local file="/..$tdir/$tfile-1" - $SETSTRIPE -p $pool $file || - { error_noexit "unable to create $file" ; return 2 ; } - - cd $tdir - $SETSTRIPE -p $pool $tfile-2 || { - error_noexit "unable to create $tfile-2 in $tdir" - return 3 - } -} - -pool_remove_first_target() { - echo "Removing first target from a pool" - local pool=$1 - - local pname="lov.$FSNAME-*.pools.$pool" - local t=$($LCTL get_param -n $pname | head -1) - do_facet mgs $LCTL pool_remove $FSNAME.$pool $t - wait_update $HOSTNAME "lctl get_param -n $pname | grep $t" "" || { - error_noexit "$t not removed from $FSNAME.$pool" - return 1 - } -} - -pool_remove_all_targets() { - echo "Removing all targets from pool" - local pool=$1 - local file=$2 - local pname="lov.$FSNAME-*.pools.$pool" - for t in $($LCTL get_param -n $pname | sort -u) - do - do_facet mgs $LCTL pool_remove $FSNAME.$pool $t - done - wait_update $HOSTNAME "lctl get_param -n $pname" "" || { - error_noexit "Pool $FSNAME.$pool cannot be drained" - return 1 - } - # striping on an empty/nonexistant pool should fall back - # to "pool of everything" - touch $file || { - error_noexit "failed to use fallback striping for empty pool" - return 2 - } - # setstripe on an empty pool should fail - $SETSTRIPE -p $pool $file 2>/dev/null && { - error_noexit "expected failure when creating file" \ - "with empty pool" - return 3 - } - return 0 -} - -pool_remove() { - echo "Destroying pool" - local pool=$1 - local file=$2 - - do_facet mgs $LCTL pool_destroy $FSNAME.$pool - - sleep 2 - # striping on an empty/nonexistant pool should fall back - # to "pool of everything" - touch $file || { - error_noexit "failed to use fallback striping for missing pool" - return 1 - } - # setstripe on an empty pool should fail - $SETSTRIPE -p $pool $file 2>/dev/null && { - error_noexit "expected failure when creating file" \ - "with missing pool" - return 2 - } - - # get param should return err once pool is gone - if wait_update $HOSTNAME "lctl get_param -n \ - lov.$FSNAME-*.pools.$pool 2>/dev/null || echo foo" "foo" - then - remove_pool_from_list $FSNAME.$pool - return 0 - fi - error_noexit "Pool $FSNAME.$pool is not destroyed" - return 3 -} - -test_200() { - [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - remote_mgs_nodsh && skip "remote MGS with nodsh" && return - - local POOL=${POOL:-cea1} - local POOL_ROOT=${POOL_ROOT:-$DIR/d200.pools} - local POOL_DIR_NAME=${POOL_DIR_NAME:-dir_tst} - # Pool OST targets - local first_ost=0 - local last_ost=$(($OSTCOUNT - 1)) - local ost_step=2 - local ost_list=$(seq $first_ost $ost_step $last_ost) - local ost_range="$first_ost $last_ost $ost_step" - local test_path=$POOL_ROOT/$POOL_DIR_NAME - local file_dir=$POOL_ROOT/file_tst + local POOL=${POOL:-cea1} + local POOL_ROOT=${POOL_ROOT:-$DIR/d200.pools} + local POOL_DIR_NAME=${POOL_DIR_NAME:-dir_tst} + # Pool OST targets + local first_ost=0 + local last_ost=$(($OSTCOUNT - 1)) + local ost_step=2 + local ost_list=$(seq $first_ost $ost_step $last_ost) + local ost_range="$first_ost $last_ost $ost_step" + local test_path=$POOL_ROOT/$POOL_DIR_NAME + local file_dir=$POOL_ROOT/file_tst local rc=0 while : ; do @@ -10730,16 +11293,22 @@ jobstats_set() { test_205() { # Job stats [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + remote_mgs_nodsh && skip "remote MGS with nodsh" && return [ -z "$(lctl get_param -n mdc.*.connect_flags | grep jobstats)" ] && skip "Server doesn't support jobstats" && return 0 + [[ $JOBID_VAR = disable ]] && skip "jobstats is disabled" && return local cmd - OLD_JOBENV=`$LCTL get_param -n jobid_var` + OLD_JOBENV=$($LCTL get_param -n jobid_var) if [ $OLD_JOBENV != $JOBENV ]; then jobstats_set $JOBENV trap jobstats_set EXIT fi + local user=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \ + changelog_register -n) + echo "Registered as changelog user $user" + # mkdir cmd="mkdir $DIR/$tfile" verify_jobstats "$cmd" "mdt" @@ -10771,6 +11340,15 @@ test_205() { # Job stats cmd="mv -f $DIR/$tfile $DIR/jobstats_test_rename" verify_jobstats "$cmd" "mdt" + # Ensure that jobid are present in changelog (if supported by MDS) + if [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.6.52) ] + then + $LFS changelog $MDT0 | tail -9 + jobids=$($LFS changelog $MDT0 | tail -9 | grep -c "j=") + [ $jobids -eq 9 ] || + error "Wrong changelog jobid count $jobids != 9" + fi + # cleanup rm -f $DIR/jobstats_test_rename @@ -10781,7 +11359,7 @@ run_test 205 "Verify job stats" # LU-1480, LU-1773 and LU-1657 test_206() { mkdir -p $DIR/$tdir - lfs setstripe -c -1 $DIR/$tdir + $SETSTRIPE -c -1 $DIR/$tdir #define OBD_FAIL_LOV_INIT 0x1403 $LCTL set_param fail_loc=0xa0001403 $LCTL set_param fail_val=1 @@ -10831,6 +11409,7 @@ test_208() { [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.4.52) ]] || { skip "Need MDS version at least 2.4.52"; return 0; } + remote_mds_nodsh && skip "remote MDS with nodsh" && return echo "==== test 1: verify get lease work" $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:eRE+eU || error "get lease error" @@ -10876,7 +11455,7 @@ test_208() { run_test 208 "Exclusive open" test_209() { - [[ $($LCTL get_param -n mdc.*.connect_flags) == ~disp_stripe ]] && + [ -z "$(lctl get_param -n mdc.*.connect_flags | grep disp_stripe)" ] && skip_env "must have disp_stripe" && return touch $DIR/$tfile @@ -10936,7 +11515,7 @@ 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() { - cat /proc/sys/lnet/$1 >$TMP/lnet_$1.out || error "cannot read /proc/sys/lnet/$1" + 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 @@ -10961,8 +11540,8 @@ check_lnet_proc_stats() { # 3rd arg as regexp for body, 4th arg as regexp for 1st line, 5th arg is # optional and can be regexp for 2nd line (lnet.routes case) check_lnet_proc_entry() { - local blp=2 # blp stands for 'position of 1st line of body' - [ "$5" = "" ] || blp=3 # lnet.routes case + local blp=2 # blp stands for 'position of 1st line of body' + [ -z "$5" ] || blp=3 # lnet.routes case local l=$(cat "$TMP/lnet_$1" |wc -l) # subtracting one from $blp because the body can be empty @@ -10975,7 +11554,7 @@ check_lnet_proc_entry() { (cat "$TMP/lnet_$1" && error "2nd line of $2 misformatted") # bail out if any unexpected line happened - sed -n "$blp~1 p" "$TMP/lnet_$1" |grep -Ev "$3" + sed -n "$blp p" "$TMP/lnet_$1" | grep -Ev "$3" [ "$?" != 0 ] || error "$2 misformatted" } @@ -10992,14 +11571,13 @@ test_215() { # for bugs 18102, 21079, 21517 local L2 # regexp for 2nd line (optional) local BR # regexp for the rest (body) - # /proc/sys/lnet/stats should look as 11 space-separated non-negative numerics + # lnet.stats should look as 11 space-separated non-negative numerics BR="^$N $N $N $N $N $N $N $N $N $N $N$" create_lnet_proc_files "stats" - check_lnet_proc_stats "stats.out" "/proc/sys/lnet/stats" "$BR" check_lnet_proc_stats "stats.sys" "lnet.stats" "$BR" remove_lnet_proc_files "stats" - # /proc/sys/lnet/routes should look like this: + # lnet.routes should look like this: # Routing disabled/enabled # net hops priority state router # where net is a string like tcp0, hops > 0, priority >= 0, @@ -11009,11 +11587,10 @@ test_215() { # for bugs 18102, 21079, 21517 L2="^net +hops +priority +state +router$" BR="^$NET +$N +(0|1) +(up|down) +$NID$" create_lnet_proc_files "routes" - check_lnet_proc_entry "routes.out" "/proc/sys/lnet/routes" "$BR" "$L1" "$L2" check_lnet_proc_entry "routes.sys" "lnet.routes" "$BR" "$L1" "$L2" remove_lnet_proc_files "routes" - # /proc/sys/lnet/routers should look like this: + # lnet.routers should look like this: # ref rtr_ref alive_cnt state last_ping ping_sent deadline down_ni router # where ref > 0, rtr_ref > 0, alive_cnt >= 0, state is up/down, # last_ping >= 0, ping_sent is boolean (0/1), deadline and down_ni are @@ -11021,11 +11598,10 @@ test_215() { # for bugs 18102, 21079, 21517 L1="^ref +rtr_ref +alive_cnt +state +last_ping +ping_sent +deadline +down_ni +router$" BR="^$P +$P +$N +(up|down) +$N +(0|1) +$I +$I +$NID$" create_lnet_proc_files "routers" - check_lnet_proc_entry "routers.out" "/proc/sys/lnet/routers" "$BR" "$L1" check_lnet_proc_entry "routers.sys" "lnet.routers" "$BR" "$L1" remove_lnet_proc_files "routers" - # /proc/sys/lnet/peers should look like this: + # lnet.peers should look like this: # nid refs state last max rtr min tx min queue # where nid is a string like 192.168.1.1@tcp2, refs > 0, # state is up/down/NA, max >= 0. last, rtr, min, tx, min are @@ -11033,21 +11609,19 @@ test_215() { # for bugs 18102, 21079, 21517 L1="^nid +refs +state +last +max +rtr +min +tx +min +queue$" BR="^$NID +$P +(up|down|NA) +$I +$N +$I +$I +$I +$I +$N$" create_lnet_proc_files "peers" - check_lnet_proc_entry "peers.out" "/proc/sys/lnet/peers" "$BR" "$L1" check_lnet_proc_entry "peers.sys" "lnet.peers" "$BR" "$L1" remove_lnet_proc_files "peers" - # /proc/sys/lnet/buffers should look like this: + # lnet.buffers should look like this: # pages count credits min # where pages >=0, count >=0, credits and min are numeric (0 or >0 or <0) L1="^pages +count +credits +min$" BR="^ +$N +$N +$I +$I$" create_lnet_proc_files "buffers" - check_lnet_proc_entry "buffers.out" "/proc/sys/lnet/buffers" "$BR" "$L1" check_lnet_proc_entry "buffers.sys" "lnet.buffers" "$BR" "$L1" remove_lnet_proc_files "buffers" - # /proc/sys/lnet/nis should look like this: + # lnet.nis should look like this: # nid status alive refs peer rtr max tx min # where nid is a string like 192.168.1.1@tcp2, status is up/down, # alive is numeric (0 or >0 or <0), refs >= 0, peer >= 0, @@ -11055,15 +11629,14 @@ test_215() { # for bugs 18102, 21079, 21517 L1="^nid +status +alive +refs +peer +rtr +max +tx +min$" BR="^$NID +(up|down) +$I +$N +$N +$N +$N +$I +$I$" create_lnet_proc_files "nis" - check_lnet_proc_entry "nis.out" "/proc/sys/lnet/nis" "$BR" "$L1" check_lnet_proc_entry "nis.sys" "lnet.nis" "$BR" "$L1" remove_lnet_proc_files "nis" - # can we successfully write to /proc/sys/lnet/stats? - echo "0" >/proc/sys/lnet/stats || error "cannot write to /proc/sys/lnet/stats" + # 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 "/proc/sys/lnet exists and has proper content - bugs 18102, 21079, 21517" +run_test 215 "lnet exists and has proper content - bugs 18102, 21079, 21517" test_216() { # bug 20317 [ $PARALLEL == "yes" ] && skip "skip parallel run" && return @@ -11154,6 +11727,10 @@ test_219() { dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=3 $LCTL set_param fail_loc=0x411 dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1 seek=2 conv=notrunc + + # LU-4201 + dd if=/dev/zero of=$DIR/$tfile-2 bs=1024 count=1 + $CHECKSTAT -s 1024 $DIR/$tfile-2 || error "checkstat wrong size" } run_test 219 "LU-394: Write partial won't cause uncontiguous pages vec at LND" @@ -11425,7 +12002,8 @@ run_test 226b "call path2fid and fid2path on files of all type under remote dir" # cause an out-of-memory condition. test_227() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - dd if=`which date` of=$MOUNT/date bs=1k count=1 + [ -z "$(which ldd)" ] && skip "should have ldd tool" && return + dd if=$(which date) of=$MOUNT/date bs=1k count=1 chmod +x $MOUNT/date $MOUNT/date > /dev/null @@ -11437,6 +12015,7 @@ run_test 227 "running truncated executable does not cause OOM" # LU-1512 try to reuse idle OI blocks 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 @@ -11478,6 +12057,7 @@ run_test 228a "try to reuse idle OI blocks" 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 @@ -11527,6 +12107,7 @@ run_test 228b "idle OI blocks can be reused after MDT restart" #LU-1881 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 @@ -11631,45 +12212,243 @@ test_230b() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return local MDTIDX=1 - local remote_dir=$DIR/$tdir/remote_dir - local rc=0 + local mdt_index + local i + local file + local pid + local stripe_count + local migrate_dir=$DIR/$tdir/migrate_dir + local other_dir=$DIR/$tdir/other_dir + + mkdir -p $migrate_dir + mkdir -p $other_dir + for ((i=0; i<10; i++)); do + mkdir -p $migrate_dir/dir_${i} + createmany -o $migrate_dir/dir_${i}/f 10 || + error "create files under remote dir failed $i" + done + + cp /etc/passwd $migrate_dir/$tfile + cp /etc/passwd $other_dir/$tfile + chattr +SAD $migrate_dir + chattr +SAD $migrate_dir/$tfile + + local old_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}') + local old_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}') + local old_dir_mode=$(stat -c%f $migrate_dir) + local old_file_mode=$(stat -c%f $migrate_dir/$tfile) + + mkdir -p $migrate_dir/dir_default_stripe2 + $SETSTRIPE -c 2 $migrate_dir/dir_default_stripe2 + $SETSTRIPE -c 2 $migrate_dir/${tfile}_stripe2 + + mkdir -p $other_dir + ln $migrate_dir/$tfile $other_dir/luna + ln $migrate_dir/$tfile $migrate_dir/sofia + ln $other_dir/$tfile $migrate_dir/david + ln -s $migrate_dir/$tfile $other_dir/zachary + ln -s $migrate_dir/$tfile $migrate_dir/${tfile}_ln + ln -s $other_dir/$tfile $migrate_dir/${tfile}_ln_other + + $LFS mv -v -M $MDTIDX $migrate_dir || + error "migrate remote dir error" + + echo "migratate to MDT1, then checking.." + for ((i=0; i<10; i++)); do + for file in $(find $migrate_dir/dir_${i}); do + mdt_index=$($LFS getstripe -M $file) + [ $mdt_index == $MDTIDX ] || + error "$file is not on MDT${MDTIDX}" + done + done + + # the multiple link file should still in MDT0 + mdt_index=$($LFS getstripe -M $migrate_dir/$tfile) + [ $mdt_index == 0 ] || + error "$file is not on MDT${MDTIDX}" + + local new_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}') + [ "$old_dir_flag" = "$new_dir_flag" ] || + error " expect $old_dir_flag get $new_dir_flag" + + local new_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}') + [ "$old_file_flag" = "$new_file_flag" ] || + error " expect $old_file_flag get $new_file_flag" + + local new_dir_mode=$(stat -c%f $migrate_dir) + [ "$old_dir_mode" = "$new_dir_mode" ] || + error "expect mode $old_dir_mode get $new_dir_mode" + + local new_file_mode=$(stat -c%f $migrate_dir/$tfile) + [ "$old_file_mode" = "$new_file_mode" ] || + error "expect mode $old_file_mode get $new_file_mode" + + diff /etc/passwd $migrate_dir/$tfile || + error "$tfile different after migration" + + diff /etc/passwd $other_dir/luna || + error "luna different after migration" + + diff /etc/passwd $migrate_dir/sofia || + error "sofia different after migration" + + diff /etc/passwd $migrate_dir/david || + error "david different after migration" + + diff /etc/passwd $other_dir/zachary || + error "zachary different after migration" + + diff /etc/passwd $migrate_dir/${tfile}_ln || + error "${tfile}_ln different after migration" + + diff /etc/passwd $migrate_dir/${tfile}_ln_other || + error "${tfile}_ln_other different after migration" + + stripe_count=$($LFS getstripe -c $migrate_dir/dir_default_stripe2) + [ $stripe_count = 2 ] || + error "dir strpe_count $d != 2 after migration." + + stripe_count=$($LFS getstripe -c $migrate_dir/${tfile}_stripe2) + [ $stripe_count = 2 ] || + error "file strpe_count $d != 2 after migration." + + #migrate back to MDT0 + MDTIDX=0 + $LFS mv -v -M $MDTIDX $migrate_dir || + error "migrate remote dir error" + + echo "migrate back to MDT0, checking.." + for file in $(find $migrate_dir); do + mdt_index=$($LFS getstripe -M $file) + [ $mdt_index == $MDTIDX ] || + error "$file is not on MDT${MDTIDX}" + done + + local new_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}') + [ "$old_dir_flag" = "$new_dir_flag" ] || + error " expect $old_dir_flag get $new_dir_flag" + + local new_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}') + [ "$old_file_flag" = "$new_file_flag" ] || + error " expect $old_file_flag get $new_file_flag" + + local new_dir_mode=$(stat -c%f $migrate_dir) + [ "$old_dir_mode" = "$new_dir_mode" ] || + error "expect mode $old_dir_mode get $new_dir_mode" + + local new_file_mode=$(stat -c%f $migrate_dir/$tfile) + [ "$old_file_mode" = "$new_file_mode" ] || + error "expect mode $old_file_mode get $new_file_mode" + + diff /etc/passwd ${migrate_dir}/$tfile || + error "$tfile different after migration" + + diff /etc/passwd ${other_dir}/luna || + error "luna different after migration" + + diff /etc/passwd ${migrate_dir}/sofia || + error "sofia different after migration" + + diff /etc/passwd ${other_dir}/zachary || + error "zachary different after migration" + + diff /etc/passwd $migrate_dir/${tfile}_ln || + error "${tfile}_ln different after migration" + diff /etc/passwd $migrate_dir/${tfile}_ln_other || + error "${tfile}_ln_other different after migration" + + stripe_count=$($LFS getstripe -c ${migrate_dir}/dir_default_stripe2) + [ $stripe_count = 2 ] || + error "dir strpe_count $d != 2 after migration." + + stripe_count=$($LFS getstripe -c ${migrate_dir}/${tfile}_stripe2) + [ $stripe_count = 2 ] || + error "file strpe_count $d != 2 after migration." + + rm -rf $DIR/$tdir || error "rm dir failed after migration" +} +run_test 230b "migrate directory" + +test_230c() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + local MDTIDX=1 + local mdt_index + local file + + #If migrating directory fails in the middle, all entries of + #the directory is still accessiable. mkdir -p $DIR/$tdir - $LFS mkdir -i $MDTIDX $remote_dir || - error "create remote directory failed" + stat $DIR/$tdir + createmany -o $DIR/$tdir/f 10 || + error "create files under ${tdir} failed" + + #failed after migrating 5 entries + #OBD_FAIL_MIGRATE_ENTRIES 0x1801 + do_facet mds1 lctl set_param fail_loc=0x20001801 + do_facet mds1 lctl set_param fail_val=5 + local t=`ls $DIR/$tdir | wc -l` + $LFS mv -M $MDTIDX $DIR/$tdir && + error "migrate should failed after 5 entries" + local u=`ls $DIR/$tdir | wc -l` + [ "$u" == "$t" ] || error "$u != $t during migration" - $LFS mkdir -i 0 $remote_dir/new_dir && - error "nested remote directory create succeed!" + for file in $(find $DIR/$tdir); do + stat $file || error "stat $file failed" + done - do_facet mds$((MDTIDX + 1)) lctl set_param mdt.*.enable_remote_dir=1 - $LFS mkdir -i 0 $remote_dir/new_dir || rc=$? - do_facet mds$((MDTIDX + 1)) lctl set_param mdt.*.enable_remote_dir=0 + do_facet mds1 lctl set_param fail_loc=0 + do_facet mds1 lctl set_param fail_val=0 - [ $rc -ne 0 ] && - error "create remote directory failed after set enable_remote_dir" + $LFS mv -M $MDTIDX $DIR/$tdir || + error "migrate open files should failed with open files" + + echo "Finish migration, then checking.." + for file in $(find $DIR/$tdir); do + mdt_index=$($LFS getstripe -M $file) + [ $mdt_index == $MDTIDX ] || + error "$file is not on MDT${MDTIDX}" + done + + rm -rf $DIR/$tdir || error "rm dir failed after migration" +} +run_test 230c "check directory accessiblity if migration is failed" + +test_230d() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + local MDTIDX=1 + local mdt_index + local i + local j - rm -rf $remote_dir || error "first unlink remote directory failed" + mkdir -p $DIR/$tdir - $RUNAS -G$RUNAS_GID $LFS mkdir -i $MDTIDX $DIR/$tfile && - error "chown worked" + for ((i=0; i<100; i++)); do + mkdir -p $DIR/$tdir/dir_${i} + createmany -o $DIR/$tdir/dir_${i}/f 100 || + error "create files under remote dir failed $i" + done - do_facet mds$MDTIDX lctl set_param \ - mdt.*.enable_remote_dir_gid=$RUNAS_GID - $LFS mkdir -i $MDTIDX $remote_dir || rc=$? - do_facet mds$MDTIDX lctl set_param mdt.*.enable_remote_dir_gid=0 + $LFS mv -M $MDTIDX -v $DIR/$tdir || error "migrate remote dir error" - [ $rc -ne 0 ] && - error "create remote dir failed after set enable_remote_dir_gid" + echo "Finish migration, then checking.." + for file in $(find $DIR/$tdir); do + mdt_index=$($LFS getstripe -M $file) + [ $mdt_index == $MDTIDX ] || + error "$file is not on MDT${MDTIDX}" + done - rm -r $DIR/$tdir || error "second unlink remote directory failed" + rm -rf $DIR/$tdir || error "rm dir failed after migration" } -run_test 230b "nested remote directory should be failed" +run_test 230d "check migrate big directory" test_231a() { # For simplicity this test assumes that max_pages_per_rpc # is the same across all OSCs - local max_pages=$($LCTL get_param -n osc.*.max_pages_per_rpc | head -1) + local max_pages=$($LCTL get_param -n osc.*.max_pages_per_rpc | head -n1) local bulk_size=$((max_pages * 4096)) mkdir -p $DIR/$tdir @@ -11729,7 +12508,7 @@ test_232() { } run_test 232 "failed lock should not block umount" -test_233() { +test_233a() { [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.3.64) ] || { skip "Need MDS version at least 2.3.64"; return; } @@ -11737,7 +12516,21 @@ test_233() { stat $MOUNT/.lustre/fid/$fid > /dev/null || error "cannot access $MOUNT using its FID '$fid'" } -run_test 233 "checking that OBF of the FS root succeeds" +run_test 233a "checking that OBF of the FS root succeeds" + +test_233b() { + [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.5.90) ] || + { skip "Need MDS version at least 2.5.90"; return; } + + local fid=$($LFS path2fid $MOUNT/.lustre) + stat $MOUNT/.lustre/fid/$fid > /dev/null || + error "cannot access $MOUNT/.lustre using its FID '$fid'" + + fid=$($LFS path2fid $MOUNT/.lustre/fid) + stat $MOUNT/.lustre/fid/$fid > /dev/null || + error "cannot access $MOUNT/.lustre/fid using its FID '$fid'" +} +run_test 233b "checking that OBF of the FS .lustre succeeds" test_234() { local p="$TMP/sanityN-$TESTNAME.parameters" @@ -11749,11 +12542,16 @@ test_234() { touch $DIR/$tdir/$tfile || error "touch failed" # OBD_FAIL_LLITE_XATTR_ENOMEM $LCTL set_param fail_loc=0x1405 - if [ ! -f /etc/SuSE-release ]; then + # 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 clients have older attr + # 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 $LCTL set_param fail_loc=0x0 rm -rf $DIR/$tdir @@ -11764,7 +12562,7 @@ test_234() { run_test 234 "xattr cache should not crash on ENOMEM" test_235() { - [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.52) ] && + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.52) ] && skip "Need MDS version at least 2.4.52" && return flock_deadlock $DIR/$tfile local RC=$? @@ -11782,7 +12580,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 $DIR/$tdir || error "mkdir $tdir failed" + test_mkdir -p -c1 $DIR/$tdir || error "mkdir $tdir failed" local ref1=/etc/passwd local ref2=/etc/group @@ -11808,6 +12606,492 @@ test_236() { } run_test 236 "Layout swap on open unlinked file" +# test to verify file handle related system calls +# (name_to_handle_at/open_by_handle_at) +# The new system calls are supported in glibc >= 2.14. + +test_237() { + echo "Test file_handle syscalls" > $DIR/$tfile || + error "write failed" + check_fhandle_syscalls $DIR/$tfile || + error "check_fhandle_syscalls failed" +} +run_test 237 "Verify name_to_handle_at/open_by_handle_at syscalls" + +# LU-4659 linkea consistency +test_238() { + local server_version=$(lustre_version_code $SINGLEMDS) + + [[ $server_version -gt $(version_code 2.5.57) ]] || + [[ $server_version -gt $(version_code 2.5.1) && + $server_version -lt $(version_code 2.5.50) ]] || + { skip "Need MDS version at least 2.5.58 or 2.5.2+"; return; } + + touch $DIR/$tfile + ln $DIR/$tfile $DIR/$tfile.lnk + touch $DIR/$tfile.new + mv $DIR/$tfile.new $DIR/$tfile + local fid1=$(lfs path2fid $DIR/$tfile) + local fid2=$(lfs path2fid $DIR/$tfile.lnk) + local path1=$(lfs fid2path $FSNAME $fid1) + [ $tfile == $path1 ] || error "linkea inconsistent: $tfile $fid1 $path1" + local path2=$(lfs fid2path $FSNAME $fid2) + [ $tfile.lnk == $path2 ] || + error "linkea inconsistent: $tfile.lnk $fid2 $path2!" + rm -f $DIR/$tfile* +} +run_test 238 "Verify linkea consistency" + +test_239() { + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.5.60) ] && + skip "Need MDS version at least 2.5.60" && return + local list=$(comma_list $(mdts_nodes)) + + 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) + [ "$changes" -eq 0 ] || error "$changes not synced" +} +run_test 239 "osp_sync test" + +test_240() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + + mkdir -p $DIR/$tdir + + $LFS mkdir -i 0 $DIR/$tdir/d0 || + error "failed to mkdir $DIR/$tdir/d0 on MDT0" + $LFS mkdir -i 1 $DIR/$tdir/d0/d1 || + error "failed to mkdir $DIR/$tdir/d0/d1 on MDT1" + + umount_client $MOUNT || error "umount failed" + #define OBD_FAIL_TGT_DELAY_CONDITIONAL 0x713 + do_facet mds2 lctl set_param fail_loc=0x713 fail_val=1 + mount_client $MOUNT || error "failed to mount client" + + echo "stat $DIR/$tdir/d0/d1, should not fail/ASSERT" + stat $DIR/$tdir/d0/d1 || error "fail to stat $DIR/$tdir/d0/d1" +} +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 + done +} + +test_241_dio() { + for LOOP in $(seq $1); do + dd if=$DIR/$tfile of=/dev/null bs=40960 count=1 \ + iflag=direct 2>/dev/null + done +} + +test_241() { + dd if=/dev/zero of=$DIR/$tfile count=1 bs=40960 + ls -la $DIR/$tfile + cancel_lru_locks osc + test_241_bio 1000 & + PID=$! + test_241_dio 1000 + wait $PID +} +run_test 241 "bio vs dio" + +cleanup_test_300() { + trap 0 + umask $SAVE_UMASK +} +test_striped_dir() { + local mdt_index=$1 + local stripe_count + local stripe_index + + mkdir -p $DIR/$tdir + + SAVE_UMASK=$(umask) + trap cleanup_test_300 RETURN EXIT + + $LFS setdirstripe -i $mdt_index -c 2 -t all_char -m 755 \ + $DIR/$tdir/striped_dir || + error "set striped dir error" + + local mode=$(stat -c%a $DIR/$tdir/striped_dir) + [ "$mode" = "755" ] || error "expect 755 got $mode" + + stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir) + if [ "$stripe_count" != "2" ]; then + error "stripe_count is $stripe_count, expect 2" + fi + + stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir) + if [ "$stripe_index" != "$mdt_index" ]; then + error "stripe_index is $stripe_index, expect $mdt_index" + fi + + [ $(stat -c%h $DIR/$tdir/striped_dir) == '2' ] || + error "nlink error after create striped dir" + + mkdir $DIR/$tdir/striped_dir/a + mkdir $DIR/$tdir/striped_dir/b + + stat $DIR/$tdir/striped_dir/a || + error "create dir under striped dir failed" + stat $DIR/$tdir/striped_dir/b || + error "create dir under striped dir failed" + + [ $(stat -c%h $DIR/$tdir/striped_dir) == '4' ] || + error "nlink error after mkdir" + + rmdir $DIR/$tdir/striped_dir/a + [ $(stat -c%h $DIR/$tdir/striped_dir) == '3' ] || + error "nlink error after rmdir" + + rmdir $DIR/$tdir/striped_dir/b + [ $(stat -c%h $DIR/$tdir/striped_dir) == '2' ] || + error "nlink error after rmdir" + + rmdir $DIR/$tdir/striped_dir || + error "rmdir striped dir error" + + cleanup_test_300 + + true +} + +test_300a() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + + test_striped_dir 0 || error "failed on striped dir on MDT0" + test_striped_dir 1 || error "failed on striped dir on MDT0" +} +run_test 300a "basic striped dir sanity test" + +test_300b() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + local i + local mtime1 + local mtime2 + local mtime3 + + test_mkdir $DIR/$tdir || error "mkdir fail" + $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 + mtime1=$(stat -c %Y $DIR/$tdir/striped_dir) + sleep 1 + touch $DIR/$tdir/striped_dir/file_$i || + error "touch error $i" + mtime2=$(stat -c %Y $DIR/$tdir/striped_dir) + [ $mtime1 -eq $mtime2 ] && + error "mtime not change after create" + sleep 1 + rm -f $DIR/$tdir/striped_dir/file_$i || + error "unlink error $i" + mtime3=$(stat -c %Y $DIR/$tdir/striped_dir) + [ $mtime2 -eq $mtime3 ] && + error "mtime did not change after unlink" + done + true +} +run_test 300b "check ctime/mtime for striped dir" + +test_300c() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + local file_count + + mkdir -p $DIR/$tdir + $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir || + error "set striped dir error" + + chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/striped_dir || + error "chown striped dir failed" + + $RUNAS createmany -o $DIR/$tdir/striped_dir/f 5000 || + error "create 5k files failed" + + file_count=$(ls $DIR/$tdir/striped_dir | wc -l) + + [ "$file_count" = 5000 ] || error "file count $file_count != 5000" + + rm -rf $DIR/$tdir +} +run_test 300c "chown && check ls under striped directory" + +test_300d() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + local stripe_count + local file + + mkdir -p $DIR/$tdir + $SETSTRIPE -c 2 $DIR/$tdir + + #local striped directory + $LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir || + error "set striped dir error" + createmany -o $DIR/$tdir/striped_dir/f 10 || + error "create 10 files failed" + + #remote striped directory + $LFS setdirstripe -i 1 -c 2 $DIR/$tdir/remote_striped_dir || + error "set striped dir error" + createmany -o $DIR/$tdir/remote_striped_dir/f 10 || + error "create 10 files failed" + + for file in $(find $DIR/$tdir); do + stripe_count=$($GETSTRIPE -c $file) + [ $stripe_count -eq 2 ] || + error "wrong stripe $stripe_count for $file" + done + + rm -rf $DIR/$tdir +} +run_test 300d "check default stripe under striped directory" + +test_300e() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + local stripe_count + local file + + mkdir -p $DIR/$tdir + + $LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir || + error "set striped dir error" + + touch $DIR/$tdir/striped_dir/a + touch $DIR/$tdir/striped_dir/b + touch $DIR/$tdir/striped_dir/c + + mkdir $DIR/$tdir/striped_dir/dir_a + mkdir $DIR/$tdir/striped_dir/dir_b + mkdir $DIR/$tdir/striped_dir/dir_c + + $LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir/stp_a || + error "set striped dir under striped dir error" + + $LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir/stp_b || + error "set striped dir under striped dir error" + + $LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir/stp_c || + error "set striped dir under striped dir error" + + mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir/b && + error "rename file under striped dir should fail" + + mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir/dir_b && + error "rename dir under striped dir should fail" + + mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir/stp_b && + error "rename dir under different stripes should fail" + + mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir/c || + error "rename file under striped dir should succeed" + + mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir/dir_c || + error "rename dir under striped dir should succeed" + + rm -rf $DIR/$tdir +} +run_test 300e "check rename under striped directory" + +test_300f() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + local stripe_count + local file + + rm -rf $DIR/$tdir + mkdir -p $DIR/$tdir + + $LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir || + error "set striped dir error" + + $LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir1 || + error "set striped dir error" + + touch $DIR/$tdir/striped_dir/a + mkdir $DIR/$tdir/striped_dir/dir_a + $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir/stp_a || + error "create striped dir under striped dir fails" + + touch $DIR/$tdir/striped_dir1/b + mkdir $DIR/$tdir/striped_dir1/dir_b + $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir/stp_b || + error "create striped dir under striped dir fails" + + mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir1/b && + error "rename file under different striped dir should fail" + + mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir1/dir_b && + error "rename dir under different striped dir should fail" + + mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir1/stp_b && + error "rename striped dir under diff striped dir should fail" + + mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir1/a || + error "rename file under diff striped dirs fails" + + mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir1/dir_a || + error "rename dir under diff striped dirs fails" + + rm -rf $DIR/$tdir +} +run_test 300f "check rename cross striped directory" + +test_300g() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + local stripe_count + local dir + + mkdir $DIR/$tdir + $LFS setdirstripe -i 0 -c $MDSCOUNT -t all_char \ + $DIR/$tdir/striped_dir || + error "set striped dir error" + + $LFS setdirstripe -D -c $MDSCOUNT -t all_char $DIR/$tdir/striped_dir || + error "set default stripe on striped dir error" + + stripe_count=$($LFS getdirstripe -D -c $DIR/$tdir/striped_dir) + [ $stripe_count -eq $MDSCOUNT ] || + error "default stripe wrong expect $MDSCOUNT get $stripe_count" + + mkdir -p $DIR/$tdir/striped_dir/{test1,test2,test3,test4} + + for dir in $(find $DIR/$tdir/striped_dir/*); do + stripe_count=$($LFS getdirstripe -c $dir) + [ $stripe_count -eq $MDSCOUNT ] || + error "expect $MDSCOUNT get $stripe_count for $dir" + done + + rmdir $DIR/$tdir/striped_dir/* || error "rmdir1 failed" + #change default stripe count to 2 + $LFS setdirstripe -D -c 2 -t all_char $DIR/$tdir/striped_dir || + error "set default stripe on striped dir error" + + mkdir -p $DIR/$tdir/striped_dir/{test1,test2,test3,test4} + + rmdir $DIR/$tdir/striped_dir/* || error "rmdir2 failed" + + #change default stripe count to 1 + $LFS setdirstripe -D -c 1 -t all_char $DIR/$tdir/striped_dir || + error "set default stripe on striped dir error" + + mkdir -p $DIR/$tdir/striped_dir/{test1,test2,test3,test4} + for dir in $(find $DIR/$tdir/striped_dir/*); do + stripe_count=$($LFS getdirstripe -c $dir) + [ $stripe_count -eq 1 ] || + error "expect 1 get $stripe_count for $dir" + done + rmdir $DIR/$tdir/striped_dir/* || error "rmdir3 failed" +} +run_test 300g "check default striped directory for striped directory" + +test_300h() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + local stripe_count + local file + + mkdir $DIR/$tdir + + $LFS setdirstripe -i 0 -c$MDSCOUNT -t all_char $DIR/$tdir/striped_dir || + error "set striped dir error" + + createmany -o $DIR/$tdir/striped_dir/f- 10 || + error "create files under striped dir failed" + + # unfortunately, we need to umount to clear dir layout cache for now + # once we fully implement dir layout, we can drop this + umount_client $MOUNT || error "umount failed" + mount_client $MOUNT || error "mount failed" + + #set the stripe to be unknown hash type + #define OBD_FAIL_UNKNOWN_LMV_STRIPE 0x1901 + $LCTL set_param fail_loc=0x1901 + for ((i = 0; i < 10; i++)); do + $CHECKSTAT -t file $DIR/$tdir/striped_dir/f-$i || + error "stat f-$i failed" + rm $DIR/$tdir/striped_dir/f-$i || error "unlink f-$i failed" + done + + touch $DIR/$tdir/striped_dir/f0 && + error "create under striped dir with unknown hash should fail" + + $LCTL set_param fail_loc=0 + + umount_client $MOUNT || error "umount failed" + mount_client $MOUNT || error "mount failed" + + return 0 +} +run_test 300h "client handle unknown hash type striped directory" + +test_400a() { # LU-1606, was conf-sanity test_74 + local extra_flags='' + local out=$TMP/$tfile + local prefix=/usr/include/lustre + local prog + + if ! which $CC > /dev/null 2>&1; then + skip_env "$CC is not installed" + return 0 + fi + + 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 + + for prog in $LUSTRE_TESTS_API_DIR/*.c; do + $CC -Wall -Werror $extra_flags -llustreapi -o $out $prog || + error "client api broken" + done +} +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 + + # We use a hard coded prefix so that this test will not fail + # when run in tree. There are headers in lustre/include/lustre/ + # that are not packaged (like lustre_idl.h) and have more + # complicated include dependencies (like config.h and lnet/types.h). + # Since this test about correct packaging we just skip them when + # they don't exist (see below) rather than try to fixup cppflags. + + if ! which $CC > /dev/null 2>&1; then + skip_env "$CC is not installed" + return 0 + fi + + for header in $prefix/*.h; do + if ! [[ -f "$header" ]]; then + continue + fi + + if [[ "$(basename $header)" == liblustreapi.h ]]; then + continue # liblustreapi.h is deprecated. + fi + + $CC -Wall -Werror -include $header -c -x c /dev/null -o $out || + error "cannot compile '$header'" + done +} +run_test 400b "packaged headers can be compiled" + # # tests that do cleanup/setup should be run at the end # @@ -11817,16 +13101,16 @@ test_900() { local ls #define OBD_FAIL_MGC_PAUSE_PROCESS_LOG 0x903 $LCTL set_param fail_loc=0x903 - # cancel_lru_locks mgc - does not work due to lctl set_param syntax - for ls in /proc/fs/lustre/ldlm/namespaces/MGC*/lru_size; do - echo "clear" > $ls - done + + cancel_lru_locks MGC + FAIL_ON_ERROR=true cleanup FAIL_ON_ERROR=true setup } run_test 900 "umount should not race with any mgc requeue thread" complete $SECONDS +[ -f $EXT2_DEV ] && rm $EXT2_DEV || true check_and_cleanup_lustre if [ "$I_MOUNTED" != "yes" ]; then lctl set_param debug="$OLDDEBUG" 2> /dev/null || true