X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Fsanity.sh;h=c059a2bdd8e29a9af74ad2287e707ae5acc38e94;hb=05ebd8218108dccaa31c1dbc97cd4cc90dfd3f8d;hp=445017257f32f1bdfae89d5a5f29d257510b3c72;hpb=672986cbae63e90262d55bf277643ea046bfa8b2;p=fs%2Flustre-release.git diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index 4450172..c059a2b 100755 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -8,13 +8,15 @@ set -e ONLY=${ONLY:-"$*"} -# bug number for skipped test: 13297 2108 9789 3637 9789 3561 5188 -ALWAYS_EXCEPT=" 42a 42b 42c 42d 45 68b $SANITY_EXCEPT" +# bug number for skipped test: LU-9693 LU-6493 LU-9693 3561 5188 +ALWAYS_EXCEPT=" 42a 42b 42c 45 68b $SANITY_EXCEPT" # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT! -# with LOD/OSP landing -# bug number for skipped tests: LU-2036 LU-8411 -ALWAYS_EXCEPT=" 76 407 $ALWAYS_EXCEPT" +# skipped tests: LU-2036 LU-8411 LU-9096 LU-9054 +ALWAYS_EXCEPT=" 76 407 253 312 $ALWAYS_EXCEPT" + +# Check Grants after these tests +GRANT_CHECK_LIST="$GRANT_CHECK_LIST 42a 42b 42c 42d 42e 63a 63b 64a 64b 64c" is_sles11() # LU-4341 { @@ -79,8 +81,8 @@ init_logging [ "$SLOW" = "no" ] && EXCEPT_SLOW="27m 64b 68 71 115 300o" if [ $(facet_fstype $SINGLEMDS) = "zfs" ]; then - # bug number for skipped test: LU-4536 LU-1957 - ALWAYS_EXCEPT="$ALWAYS_EXCEPT 65ic 180" + # bug number for skipped test: LU-1957 + ALWAYS_EXCEPT="$ALWAYS_EXCEPT 180" # 13 (min)" [ "$SLOW" = "no" ] && EXCEPT_SLOW="$EXCEPT_SLOW 51b" fi @@ -757,13 +759,10 @@ run_test 19d "cat .../f19 (should return error) ==============" test_20() { touch $DIR/$tfile rm $DIR/$tfile - log "1 done" touch $DIR/$tfile rm $DIR/$tfile - log "2 done" touch $DIR/$tfile rm $DIR/$tfile - log "3 done" $CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed" } run_test 20 "touch .../f ; ls -l ... ===========================" @@ -1350,25 +1349,23 @@ test_26f() { rm -r $tfile || error "rm $tfile failed" $CHECKSTAT -a $DIR/$tfile || error "$tfile not gone" } -run_test 26f "rm -r of a directory which has recursive symlink =" +run_test 26f "rm -r of a directory which has recursive symlink" test_27a() { - echo '== stripe sanity ==============================================' test_mkdir -p $DIR/d27 || error "mkdir failed" - $GETSTRIPE $DIR/d27 - $SETSTRIPE -c 1 $DIR/d27/f0 || error "setstripe failed" + $LFS getstripe $DIR/d27 + $LFS setstripe -c 1 $DIR/d27/f0 || error "setstripe failed" $CHECKSTAT -t file $DIR/d27/f0 || error "checkstat failed" - log "== test_27a: write to one stripe file =========================" cp /etc/hosts $DIR/d27/f0 || error } -run_test 27a "one stripe file ==================================" +run_test 27a "one stripe file" test_27b() { [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test" && return test_mkdir -p $DIR/d27 - $SETSTRIPE -c 2 $DIR/d27/f01 || error "setstripe failed" - $GETSTRIPE -c $DIR/d27/f01 - [ $($GETSTRIPE -c $DIR/d27/f01) -eq 2 ] || + $LFS setstripe -c 2 $DIR/d27/f01 || error "setstripe failed" + $LFS getstripe -c $DIR/d27/f01 + [ $($LFS getstripe -c $DIR/d27/f01) -eq 2 ] || error "two-stripe file doesn't have two stripes" dd if=/dev/zero of=$DIR/d27/f01 bs=4k count=4 || error "dd failed" @@ -1377,53 +1374,54 @@ run_test 27b "create and write to two stripe file" test_27d() { test_mkdir -p $DIR/d27 - $SETSTRIPE -c 0 -i -1 -S 0 $DIR/d27/fdef || error "setstripe failed" + $LFS setstripe -c 0 -i -1 -S 0 $DIR/d27/fdef || error "setstripe failed" $CHECKSTAT -t file $DIR/d27/fdef || error "checkstat failed" dd if=/dev/zero of=$DIR/d27/fdef bs=4k count=4 || error } -run_test 27d "create file with default settings ================" +run_test 27d "create file with default settings" test_27e() { # LU-5839 adds check for existed layout before setting it [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.56) ]] && skip "Need MDS version at least 2.7.56" && return test_mkdir -p $DIR/d27 - $SETSTRIPE -c 2 $DIR/d27/f12 || error "setstripe failed" - $SETSTRIPE -c 2 $DIR/d27/f12 && error "setstripe succeeded twice" + $LFS setstripe -c 2 $DIR/d27/f12 || error "setstripe failed" + $LFS setstripe -c 2 $DIR/d27/f12 && error "setstripe succeeded twice" $CHECKSTAT -t file $DIR/d27/f12 || error "checkstat failed" } -run_test 27e "setstripe existing file (should return error) ======" +run_test 27e "setstripe existing file (should return error)" test_27f() { test_mkdir $DIR/$tdir - $SETSTRIPE -S 100 -i 0 -c 1 $DIR/$tdir/$tfile && + $LFS setstripe -S 100 -i 0 -c 1 $DIR/$tdir/$tfile && error "$SETSTRIPE $DIR/$tdir/$tfile failed" $CHECKSTAT -t file $DIR/$tdir/$tfile && error "$CHECKSTAT -t file $DIR/$tdir/$tfile should fail" dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed" - $GETSTRIPE $DIR/$tdir/$tfile || error "$GETSTRIPE failed" + $LFS getstripe $DIR/$tdir/$tfile || error "$LFS getstripe failed" } run_test 27f "setstripe with bad stripe size (should return error)" test_27g() { test_mkdir -p $DIR/d27 $MCREATE $DIR/d27/fnone || error "mcreate failed" - $GETSTRIPE $DIR/d27/fnone 2>&1 | grep "no stripe info" || + $LFS getstripe $DIR/d27/fnone 2>&1 | grep "no stripe info" || error "$DIR/d27/fnone has object" } -run_test 27g "$GETSTRIPE with no objects" +run_test 27g "$LFS getstripe with no objects" test_27i() { test_mkdir $DIR/$tdir touch $DIR/$tdir/$tfile || error "touch failed" - [[ $($GETSTRIPE -c $DIR/$tdir/$tfile) -gt 0 ]] || + [[ $($LFS getstripe -c $DIR/$tdir/$tfile) -gt 0 ]] || error "missing objects" } -run_test 27i "$GETSTRIPE with some objects" +run_test 27i "$LFS getstripe with some objects" test_27j() { test_mkdir -p $DIR/d27 - $SETSTRIPE -i $OSTCOUNT $DIR/d27/f27j && error "setstripe failed"||true + $LFS setstripe -i $OSTCOUNT $DIR/d27/f27j && + error "setstripe failed" || true } run_test 27j "setstripe with bad stripe offset (should return error)" @@ -1432,19 +1430,19 @@ test_27k() { # bug 2844 FILE=$DIR/d27/f27k LL_MAX_BLKSIZE=$((4 * 1024 * 1024)) [ ! -d $DIR/d27 ] && test_mkdir -p $DIR d27 - $SETSTRIPE -S 67108864 $FILE || error "setstripe failed" - BLKSIZE=`stat $FILE | awk '/IO Block:/ { print $7 }'` + $LFS setstripe -S 67108864 $FILE || error "setstripe failed" + BLKSIZE=$(stat $FILE | awk '/IO Block:/ { print $7 }') [ $BLKSIZE -le $LL_MAX_BLKSIZE ] || error "1:$BLKSIZE > $LL_MAX_BLKSIZE" dd if=/dev/zero of=$FILE bs=4k count=1 - BLKSIZE=`stat $FILE | awk '/IO Block:/ { print $7 }'` + BLKSIZE=$(stat $FILE | awk '/IO Block:/ { print $7 }') [ $BLKSIZE -le $LL_MAX_BLKSIZE ] || error "2:$BLKSIZE > $LL_MAX_BLKSIZE" } -run_test 27k "limit i_blksize for broken user apps =============" +run_test 27k "limit i_blksize for broken user apps" test_27l() { test_mkdir -p $DIR/d27 mcreate $DIR/f27l || error "creating file" - $RUNAS $SETSTRIPE -c 1 $DIR/f27l && \ + $RUNAS $SETSTRIPE -c 1 $DIR/f27l && error "setstripe should have failed" || true } run_test 27l "check setstripe permissions (should return error)" @@ -1461,29 +1459,32 @@ test_27m() { fi trap simple_cleanup_common EXIT test_mkdir -p $DIR/$tdir - $SETSTRIPE -i 0 -c 1 $DIR/$tdir/f27m_1 + $LFS setstripe -i 0 -c 1 $DIR/$tdir/f27m_1 dd if=/dev/zero of=$DIR/$tdir/f27m_1 bs=1024 count=$MAXFREE && error "dd should fill OST0" i=2 - while $SETSTRIPE -i 0 -c 1 $DIR/$tdir/f27m_$i; do + while $LFS setstripe -i 0 -c 1 $DIR/$tdir/f27m_$i; do i=$((i + 1)) [ $i -gt 256 ] && break done i=$((i + 1)) touch $DIR/$tdir/f27m_$i - [ `$GETSTRIPE $DIR/$tdir/f27m_$i | grep -A 10 obdidx | awk '{print $1}'| grep -w "0"` ] && + [ $($LFS 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=$((i + 1)) touch $DIR/$tdir/f27m_$i - [ `$GETSTRIPE $DIR/$tdir/f27m_$i | grep -A 10 obdidx | awk '{print $1}'| grep -w "0"` ] && + [ $($LFS 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" simple_cleanup_common } -run_test 27m "create file while OST0 was full ==================" +run_test 27m "create file while OST0 was full" sleep_maxage() { - local DELAY=$(do_facet $SINGLEMDS lctl get_param -n lov.*.qos_maxage | head -n 1 | awk '{print $1 * 2}') - sleep $DELAY + local DELAY=$(do_facet $SINGLEMDS lctl get_param -n lov.*.qos_maxage | + head -n 1 | awk '{print $1 * 2}') + sleep $DELAY } # OSCs keep a NOSPC flag that will be reset after ~5s (qos_maxage) @@ -1549,12 +1550,12 @@ test_27n() { reset_enospc rm -f $DIR/$tdir/$tfile exhaust_precreations 0 0x80000215 - $SETSTRIPE -c -1 $DIR/$tdir + $LFS setstripe -c -1 $DIR/$tdir touch $DIR/$tdir/$tfile || error - $GETSTRIPE $DIR/$tdir/$tfile + $LFS getstripe $DIR/$tdir/$tfile reset_enospc } -run_test 27n "create file with some full OSTs ==================" +run_test 27n "create file with some full OSTs" test_27o() { [[ $OSTCOUNT -lt 2 ]] && skip_env "too few OSTs" && return @@ -1571,7 +1572,7 @@ test_27o() { reset_enospc rm -rf $DIR/$tdir/* } -run_test 27o "create file with all full OSTs (should error) ====" +run_test 27o "create file with all full OSTs (should error)" test_27p() { [[ $OSTCOUNT -lt 2 ]] && skip_env "too few OSTs" && return @@ -1590,11 +1591,11 @@ test_27p() { exhaust_precreations 0 0x80000215 echo foo >> $DIR/$tdir/$tfile || error "append failed" $CHECKSTAT -s 80000004 $DIR/$tdir/$tfile || error "checkstat failed" - $GETSTRIPE $DIR/$tdir/$tfile + $LFS getstripe $DIR/$tdir/$tfile reset_enospc } -run_test 27p "append to a truncated file with some full OSTs ===" +run_test 27p "append to a truncated file with some full OSTs" test_27q() { [[ $OSTCOUNT -lt 2 ]] && skip_env "too few OSTs" && return @@ -1607,7 +1608,8 @@ test_27q() { test_mkdir -p $DIR/$tdir $MCREATE $DIR/$tdir/$tfile || error "mcreate $DIR/$tdir/$tfile failed" - $TRUNCATE $DIR/$tdir/$tfile 80000000 ||error "truncate $DIR/$tdir/$tfile failed" + $TRUNCATE $DIR/$tdir/$tfile 80000000 || + error "truncate $DIR/$tdir/$tfile failed" $CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat failed" exhaust_all_precreations 0x215 @@ -1617,7 +1619,7 @@ test_27q() { reset_enospc } -run_test 27q "append to truncated file with all OSTs full (should error) ===" +run_test 27q "append to truncated file with all OSTs full (should error)" test_27r() { [[ $OSTCOUNT -lt 2 ]] && skip_env "too few OSTs" && return @@ -1629,7 +1631,7 @@ test_27r() { rm -f $DIR/$tdir/$tfile exhaust_precreations 0 0x80000215 - $SETSTRIPE -i 0 -c 2 $DIR/$tdir/$tfile # && error + $LFS setstripe -i 0 -c 2 $DIR/$tdir/$tfile # && error reset_enospc } @@ -1640,7 +1642,7 @@ test_27s() { # bug 10725 local stripe_size=$((4096 * 1024 * 1024)) # 2^32 local stripe_count=0 [ $OSTCOUNT -eq 1 ] || stripe_count=2 - $SETSTRIPE -S $stripe_size -c $stripe_count $DIR/$tdir && + $LFS setstripe -S $stripe_size -c $stripe_count $DIR/$tdir && error "stripe width >= 2^32 succeeded" || true } @@ -1670,26 +1672,26 @@ test_27u() { # bug 4900 do_nodes $list $LCTL set_param fail_loc=0 TLOG=$TMP/$tfile.getstripe - $GETSTRIPE $DIR/$tdir > $TLOG + $LFS getstripe $DIR/$tdir > $TLOG OBJS=$(awk -vobj=0 '($1 == 0) { obj += 1 } END { print obj; }' $TLOG) unlinkmany $DIR/$tdir/t- 1000 trap 0 [[ $OBJS -gt 0 ]] && error "$OBJS objects created on OST-0. See $TLOG" || pass } -run_test 27u "skip object creation on OSC w/o objects ==========" +run_test 27u "skip object creation on OSC w/o objects" test_27v() { # bug 4900 [[ $OSTCOUNT -lt 2 ]] && skip_env "too few OSTs" && return [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - remote_mds_nodsh && skip "remote MDS with nodsh" && return - remote_ost_nodsh && skip "remote OST with nodsh" && return + remote_mds_nodsh && skip "remote MDS with nodsh" && return + remote_ost_nodsh && skip "remote OST with nodsh" && return - exhaust_all_precreations 0x215 - reset_enospc + exhaust_all_precreations 0x215 + reset_enospc - test_mkdir -p $DIR/$tdir - $SETSTRIPE -c 1 $DIR/$tdir # 1 stripe / file + test_mkdir $DIR/$tdir + $LFS setstripe -c 1 $DIR/$tdir # 1 stripe / file touch $DIR/$tdir/$tfile #define OBD_FAIL_TGT_DELAY_PRECREATE 0x705 @@ -1708,35 +1710,35 @@ test_27v() { # bug 4900 sleep $((TIMEOUT / 2 - PROCESS)) reset_enospc } -run_test 27v "skip object creation on slow OST =================" +run_test 27v "skip object creation on slow OST" test_27w() { # bug 10997 - test_mkdir -p $DIR/$tdir || error "mkdir failed" - $SETSTRIPE -S 65536 $DIR/$tdir/f0 || error "setstripe failed" - [ $($GETSTRIPE -S $DIR/$tdir/f0) -ne 65536 ] && - error "stripe size $size != 65536" || true - [ $($GETSTRIPE -d $DIR/$tdir | grep -c "stripe_count") -ne 1 ] && - error "$GETSTRIPE -d $DIR/$tdir failed" || true + test_mkdir $DIR/$tdir || error "mkdir failed" + $LFS setstripe -S 65536 $DIR/$tdir/f0 || error "setstripe failed" + [ $($LFS getstripe -S $DIR/$tdir/f0) -ne 65536 ] && + error "stripe size $size != 65536" || true + [ $($LFS getstripe -d $DIR/$tdir | grep -c "stripe_count") -ne 1 ] && + error "$LFS getstripe -d $DIR/$tdir failed" || true } -run_test 27w "check $SETSTRIPE -S option" +run_test 27w "check $LFS setstripe -S option" test_27wa() { [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping multiple stripe count/offset test" && return - test_mkdir -p $DIR/$tdir || error "mkdir failed" - for i in $(seq 1 $OSTCOUNT); do - offset=$((i - 1)) - $SETSTRIPE -c $i -i $offset $DIR/$tdir/f$i || - error "setstripe -c $i -i $offset failed" - count=$($GETSTRIPE -c $DIR/$tdir/f$i) - index=$($GETSTRIPE -i $DIR/$tdir/f$i) - [ $count -ne $i ] && error "stripe count $count != $i" || true - [ $index -ne $offset ] && - error "stripe offset $index != $offset" || true - done + test_mkdir $DIR/$tdir || error "mkdir failed" + for i in $(seq 1 $OSTCOUNT); do + offset=$((i - 1)) + $LFS setstripe -c $i -i $offset $DIR/$tdir/f$i || + error "setstripe -c $i -i $offset failed" + count=$($LFS getstripe -c $DIR/$tdir/f$i) + index=$($LFS getstripe -i $DIR/$tdir/f$i) + [ $count -ne $i ] && error "stripe count $count != $i" || true + [ $index -ne $offset ] && + error "stripe offset $index != $offset" || true + done } -run_test 27wa "check $SETSTRIPE -c -i options" +run_test 27wa "check $LFS setstripe -c -i options" test_27x() { remote_ost_nodsh && skip "remote OST with nodsh" && return @@ -1747,12 +1749,13 @@ test_27x() { local OST=$(ostname_from_index $OSTIDX) test_mkdir -p $DIR/$tdir - $SETSTRIPE -c 1 $DIR/$tdir # 1 stripe per file + $LFS setstripe -c 1 $DIR/$tdir # 1 stripe per file do_facet ost$((OSTIDX + 1)) lctl set_param -n obdfilter.$OST.degraded 1 sleep_maxage createmany -o $DIR/$tdir/$tfile $OSTCOUNT - for i in `seq 0 $OFFSET`; do - [ `$GETSTRIPE $DIR/$tdir/$tfile$i | grep -A 10 obdidx | awk '{print $1}' | grep -w "$OSTIDX"` ] && + for i in $(seq 0 $OFFSET); do + [ $($LFS getstripe $DIR/$tdir/$tfile$i | grep -A 10 obdidx | + awk '{print $1}' | grep -w "$OSTIDX") ] && error "OST0 was degraded but new created file still use it" done do_facet ost$((OSTIDX + 1)) lctl set_param -n obdfilter.$OST.degraded 0 @@ -1762,16 +1765,16 @@ run_test 27x "create files while OST0 is degraded" test_27y() { [[ $OSTCOUNT -lt 2 ]] && skip_env "$OSTCOUNT < 2 OSTs -- skipping" && return - remote_mds_nodsh && skip "remote MDS with nodsh" && return - remote_ost_nodsh && skip "remote OST with nodsh" && return + remote_mds_nodsh && skip "remote MDS with nodsh" && return + remote_ost_nodsh && skip "remote OST with nodsh" && return [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS $FSNAME-OST0000) - local last_id=$(do_facet $SINGLEMDS lctl get_param -n \ - osc.$mdtosc.prealloc_last_id) - local next_id=$(do_facet $SINGLEMDS lctl get_param -n \ - osc.$mdtosc.prealloc_next_id) - local fcount=$((last_id - next_id)) + local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS $FSNAME-OST0000) + local last_id=$(do_facet $SINGLEMDS lctl get_param -n \ + osc.$mdtosc.prealloc_last_id) + local next_id=$(do_facet $SINGLEMDS lctl get_param -n \ + osc.$mdtosc.prealloc_next_id) + local fcount=$((last_id - next_id)) [[ $fcount -eq 0 ]] && skip "not enough space on OST0" && return [[ $fcount -gt $OSTCOUNT ]] && fcount=$OSTCOUNT @@ -1796,7 +1799,7 @@ test_27y() { OSTIDX=$(index_from_ostuuid $OST) test_mkdir -p $DIR/$tdir - $SETSTRIPE -c 1 $DIR/$tdir # 1 stripe / file + $LFS setstripe -c 1 $DIR/$tdir # 1 stripe / file for OSC in $MDS_OSCS; do OST=$(osc_to_ost $OSC) @@ -1829,8 +1832,8 @@ test_27y() { # sleep 2*lod_qos_maxage seconds waiting for lod qos to notice osp # devices get activated. sleep_maxage - $SETSTRIPE -c -1 $DIR/$tfile - stripecnt=$($GETSTRIPE -c $DIR/$tfile) + $LFS setstripe -c -1 $DIR/$tfile + stripecnt=$($LFS getstripe -c $DIR/$tfile) rm -f $DIR/$tfile [ $stripecnt -ne $OSTCOUNT ] && error "Of $OSTCOUNT OSTs, only $stripecnt is available" @@ -1882,17 +1885,18 @@ check_seq_oid() fi local obj_file="O/$seq/d$((oid %32))/$oid_hex" - local ff + local ff="" # # Don't unmount/remount the OSTs if we don't need to do that. # LU-2577 changes filter_fid to be smaller, so debugfs needs # update too, until that use mount/ll_decode_filter_fid/mount. # Re-enable when debugfs will understand new filter_fid. # - if false && [ $(facet_fstype ost$ost) == ldiskfs ]; then + if [ $(facet_fstype ost$ost) == ldiskfs ]; then ff=$(do_facet ost$ost "$DEBUGFS -c -R 'stat $obj_file' \ $dev 2>/dev/null" | grep "parent=") - else + fi + if [ -z "$ff" ]; then stop ost$ost mount_fstype ost$ost ff=$(do_facet ost$ost $LL_DECODE_FILTER_FID \ @@ -1908,45 +1912,39 @@ check_seq_oid() # /mnt/O/0/d23/23: objid=23 seq=0 parent=[0x200000400:0x1e:0x1] # fid: objid=23 seq=0 parent=[0x200000400:0x1e:0x0] stripe=1 - local ff_parent=$(echo $ff|sed -e 's/.*parent=.//') - local ff_pseq=$(echo $ff_parent | cut -d: -f1) - local ff_poid=$(echo $ff_parent | cut -d: -f2) + # + # fid: parent=[0x200000400:0x1e:0x0] stripe=1 stripe_count=2 \ + # stripe_size=1048576 component_id=1 component_start=0 \ + # component_end=33554432 + local ff_parent=$(sed -e 's/.*parent=.//' <<<$ff) + local ff_pseq=$(cut -d: -f1 <<<$ff_parent) + local ff_poid=$(cut -d: -f2 <<<$ff_parent) local ff_pstripe - if echo $ff_parent | grep -q 'stripe='; then - ff_pstripe=$(echo $ff_parent | sed -e 's/.*stripe=//') - if echo $ff_pstripe | grep -q 'stripe_size='; then - ff_pstripe=$(echo $ff_pstripe | cut -d' ' -f1) - fi + if grep -q 'stripe=' <<<$ff; then + ff_pstripe=$(sed -e 's/.*stripe=//' -e 's/ .*//' <<<$ff) else - # # $LL_DECODE_FILTER_FID does not print "stripe="; look - # into f_ver in this case. See the comment on - # ff_parent. - # - ff_pstripe=$(echo $ff_parent | cut -d: -f3 | - sed -e 's/\]//') + # into f_ver in this case. See comment on ff_parent. + ff_pstripe=$(cut -d: -f3 <<<$ff_parent | sed -e 's/]//') fi - if echo $ff_parent | grep -q 'stripe_count='; then - local ff_scnt=$(echo $ff_parent | - sed -e 's/.*stripe_count=//' | - cut -d' ' -f1) - - [ $lmm_count -eq $ff_scnt ] || + if grep -q 'stripe_count=' <<<$ff; then + local ff_scnt=$(sed -e 's/.*stripe_count=//' \ + -e 's/ .*//' <<<$ff) + [ $lmm_count = $ff_scnt ] || error "FF stripe count $lmm_count != $ff_scnt" fi - - # compare lmm_seq and filter_fid->ff_parent.f_seq - [ $ff_pseq = $lmm_seq ] || - error "FF parent SEQ $ff_pseq != $lmm_seq" - # compare lmm_object_id and filter_fid->ff_parent.f_oid - [ $ff_poid = $lmm_oid ] || - error "FF parent OID $ff_poid != $lmm_oid" + # compare lmm_seq and filter_fid->ff_parent.f_seq + [ $ff_pseq = $lmm_seq ] || + error "FF parent SEQ $ff_pseq != $lmm_seq" + # compare lmm_object_id and filter_fid->ff_parent.f_oid + [ $ff_poid = $lmm_oid ] || + error "FF parent OID $ff_poid != $lmm_oid" (($ff_pstripe == $stripe_nr)) || - error "FF stripe $ff_pstripe != $stripe_nr" + error "FF stripe $ff_pstripe != $stripe_nr" - stripe_nr=$((stripe_nr + 1)) - done + stripe_nr=$((stripe_nr + 1)) + done } test_27z() { @@ -2069,8 +2067,10 @@ test_27D() { pool_add_targets $POOL $ost_range || error "pool_add_targets failed" local skip27D - [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.64) ] && - skip27D = "-s 29,30,31" + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.8.55) ] && + skip27D += "-s 29" + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.9.55) ] && + skip27D += "-s 30,31" llapi_layout_test -d$DIR/$tdir -p$POOL -o$OSTCOUNT $skip27D || error "llapi_layout_test failed" @@ -2110,11 +2110,10 @@ test_27E() { run_test 27E "check that default extended attribute size properly increases" test_27F() { # LU-5346/LU-7975 - [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.8.51) ]] && skip "Need MDS version at least 2.8.51" && return + remote_ost_nodsh && skip "remote OST with nodsh" && return test_mkdir -p $DIR/$tdir rm -f $DIR/$tdir/f0 @@ -4388,6 +4387,8 @@ test_53() { run_test 53 "verify that MDS and OSTs agree on pre-creation ====" test_54a() { + perl -MSocket -e ';' || { skip "no Socket perl module installed" && return; } + $SOCKETSERVER $DIR/socket || error "$SOCKETSERVER $DIR/socket failed: $?" $SOCKETCLIENT $DIR/socket || @@ -4849,8 +4850,22 @@ run_test 56r "check lfs find -size works ==========================" test_56s() { # LU-611 TDIR=$DIR/${tdir}s - setup_56 $NUMFILES $NUMDIRS "-c $OSTCOUNT" + #LU-9369 + setup_56 0 $NUMDIRS + for i in $(seq 1 $NUMDIRS); do + $SETSTRIPE -c $((OSTCOUNT + 1)) $TDIR/dir$i/$tfile + done + EXPECTED=$NUMDIRS + CMD="$LFIND -c $OSTCOUNT $TDIR" + NUMS=$($CMD | wc -l) + [ $NUMS -eq $EXPECTED ] || { + $GETSTRIPE -R $TDIR + error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" + } + rm -rf $TDIR + + setup_56 $NUMFILES $NUMDIRS "-c $OSTCOUNT" if [[ $OSTCOUNT -gt 1 ]]; then $SETSTRIPE -c 1 $TDIR/$tfile.{0,1,2,3} ONESTRIPE=4 @@ -4903,6 +4918,21 @@ run_test 56s "check lfs find -stripe-count works" test_56t() { # LU-611 TDIR=$DIR/${tdir}t + + #LU-9369 + setup_56 0 $NUMDIRS + for i in $(seq 1 $NUMDIRS); do + $SETSTRIPE -S 4M $TDIR/dir$i/$tfile + done + EXPECTED=$NUMDIRS + CMD="$LFIND -S 4M $TDIR" + NUMS=$($CMD | wc -l) + [ $NUMS -eq $EXPECTED ] || { + $GETSTRIPE -R $TDIR + error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" + } + rm -rf $TDIR + setup_56 $NUMFILES $NUMDIRS "--stripe-size 512k" $SETSTRIPE -S 256k $TDIR/$tfile.{0,1,2,3} @@ -5017,54 +5047,59 @@ 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" "-c1" - - local stripe_size - stripe_size=$($GETSTRIPE -S -d $TDIR) || - error "$GETSTRIPE -S -d $TDIR failed" - stripe_size=${stripe_size%% *} - - local file_size=$((stripe_size * OSTCOUNT)) - local file_num=$((NUMDIRS * NUMFILES + NUMFILES)) - local required_space=$((file_num * file_size)) - - local free_space=$($LCTL get_param -n lov.$FSNAME-clilov-*.kbytesavail | - head -n1) - [[ $free_space -le $((required_space / 1024)) ]] && - skip_env "need at least $required_space bytes free space," \ - "have $free_space kbytes" && return - - local dd_bs=65536 - local dd_count=$((file_size / dd_bs)) - - # write data into the files - local i - local j - local file - for i in $(seq 1 $NUMFILES); do - file=$TDIR/file$i - yes | dd bs=$dd_bs count=$dd_count of=$file >/dev/null 2>&1 || - error "write data into $file failed" - done - for i in $(seq 1 $NUMDIRS); do - for j in $(seq 1 $NUMFILES); do - file=$TDIR/dir$i/file$j - yes | dd bs=$dd_bs count=$dd_count of=$file \ - >/dev/null 2>&1 || - error "write data into $file failed" - done - done + rm -rf $TDIR || error "remove $TDIR failed" + setup_56 $NUMFILES $NUMDIRS "-c $OSTCOUNT" "-c1" - local expected=-1 - [[ $OSTCOUNT -gt 1 ]] && expected=$((OSTCOUNT - 1)) + local stripe_size + stripe_size=$($GETSTRIPE -S -d $TDIR) || + error "$GETSTRIPE -S -d $TDIR failed" + stripe_size=${stripe_size%% *} - # lfs_migrate file - local cmd="$LFS_MIGRATE -y -c $expected $TDIR/file1" - echo "$cmd" - eval $cmd || error "$cmd failed" + local file_size=$((stripe_size * OSTCOUNT)) + local file_num=$((NUMDIRS * NUMFILES + NUMFILES)) + local required_space=$((file_num * file_size)) - check_stripe_count $TDIR/file1 $expected + local free_space=$($LCTL get_param -n lov.$FSNAME-clilov-*.kbytesavail | + head -n1) + [[ $free_space -le $((required_space / 1024)) ]] && + skip_env "need $required_space bytes, have $free_space KB" && + return + + local dd_bs=65536 + local dd_count=$((file_size / dd_bs)) + + # write data into the files + local i + local j + local file + for i in $(seq 1 $NUMFILES); do + file=$TDIR/file$i + yes | dd bs=$dd_bs count=$dd_count of=$file &>/dev/null || + error "write data into $file failed" + done + for i in $(seq 1 $NUMDIRS); do + for j in $(seq 1 $NUMFILES); do + file=$TDIR/dir$i/file$j + yes|dd bs=$dd_bs count=$dd_count of=$file &>/dev/null || + error "write data into $file failed" + done + done + + # $LFS_MIGRATE will fail if hard link migration is unsupported + if [[ $(lustre_version_code mds1) -gt $(version_code 2.5.55) ]]; then + createmany -l$TDIR/dir1/file1 $TDIR/dir1/link 200 || + error "creating links to $TDIR/dir1/file1 failed" + fi + + local expected=-1 + [[ $OSTCOUNT -gt 1 ]] && expected=$((OSTCOUNT - 1)) + + # lfs_migrate file + local cmd="$LFS_MIGRATE -y -c $expected $TDIR/file1" + echo "$cmd" + eval $cmd || error "$cmd failed" + + check_stripe_count $TDIR/file1 $expected if [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.6.90) ]; then @@ -5805,23 +5840,6 @@ test_66() { } run_test 66 "update inode blocks count on client ===============" -LLOOP= -LLITELOOPLOAD= -cleanup_68() { - [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - trap 0 - if [ ! -z "$LLOOP" ]; then - if swapon -s | grep -q $LLOOP; then - swapoff $LLOOP || error "swapoff failed" - fi - - $LCTL blockdev_detach $LLOOP || error "detach failed" - rm -f $LLOOP - unset LLOOP - fi - rm -f $DIR/f68* -} - meminfo() { awk '($1 == "'$1':") { print $2 }' /proc/meminfo } @@ -6140,7 +6158,7 @@ test_77c() { error "dd write error: $?" fid=$($LFS path2fid $DIR/$tfile) - if [ $(lustre_version_code ost1) -ge $(version_code 2.5.42.6) ] + if [ $(lustre_version_code ost1) -ge $(version_code 2.9.57) ] then check_ost=true ost_file_prefix=$(do_facet ost1 $LCTL get_param -n debug_path) @@ -6458,6 +6476,17 @@ test_82() { # LU-1031 } run_test 82 "Basic grouplock test ===============================" +test_83() { + local sfile="/boot/System.map-$(uname -r)" + # define OBD_FAIL_LLITE_PTASK_IO_FAIL 0x140d + $LCTL set_param fail_loc=0x140d + cp $sfile $DIR/$tfile || error "write failed" + diff -c $sfile $DIR/$tfile || error "files are different" + $LCTL set_param fail_loc=0 + rm -f $DIR/$tfile +} +run_test 83 "Short write in ptask ===============================" + test_99a() { [ -z "$(which cvs 2>/dev/null)" ] && skip_env "could not find cvs" && return @@ -6523,13 +6552,13 @@ run_test 99f "cvs commit =======================================" test_100() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - [ "$NETTYPE" = tcp ] || \ - { skip "TCP secure port test, not useful for NETTYPE=$NETTYPE" && \ + [[ "$NETTYPE" =~ tcp ]] || + { skip "TCP secure port test, not useful for NETTYPE=$NETTYPE" && return ; } remote_ost_nodsh && skip "remote OST with nodsh" && return remote_mds_nodsh && skip "remote MDS with nodsh" && return - remote_servers || \ + remote_servers || { skip "useless for local single node setup" && return; } netstat -tna | ( rc=1; while read PROT SND RCV LOCAL REMOTE STAT; do @@ -6871,8 +6900,8 @@ test_101g_brw_size_test() { # calculate number of full-sized read and write RPCs rpcs=($($LCTL get_param -n 'osc.*.rpc_stats' | sed -n '/pages per rpc/,/^$/p' | - awk '/'$pages':/ { reads += $2; writes += $5 };' \ - 'END { print reads,writes }')) + awk '/'$pages':/ { reads += $2; writes += $6 }; \ + END { print reads,writes }')) [ ${rpcs[0]} -ne $count ] && error "${rpcs[0]} != $count read RPCs" && return 5 [ ${rpcs[1]} -ne $count ] && error "${rpcs[1]} != $count write RPCs" && @@ -6894,7 +6923,7 @@ test_101g() { if [ $(lustre_version_code ost1) -ge $(version_code 2.8.52) ]; then [ $(lustre_version_code ost1) -ge $(version_code 2.9.52) ] && suffix="M" - if [[ $orig_mb < 16 ]]; then + if [[ $orig_mb -lt 16 ]]; then save_lustre_params $osts "$brw_size" > $p do_nodes $list $LCTL set_param -n $brw_size=16$suffix || error "set 16MB RPC size failed" @@ -6910,7 +6939,7 @@ test_101g() { test_101g_brw_size_test 4 || error "4MB RPC test failed" - if [[ $orig_mb < 16 ]]; then + if [[ $orig_mb -lt 16 ]]; then restore_lustre_params < $p remount_client $MOUNT || error "remount_client restore failed" fi @@ -7001,13 +7030,15 @@ test_102a() { setfattr -x user.author1 $testfile || error "$testfile error deleting user.author1" - getfattr -d -m user $testfile 2> /dev/null | grep "user.author1" && - error "$testfile did not delete trusted.name1 xattr" - - # b10667: setting lustre special xattr be silently discarded echo "set lustre special xattr ..." - setfattr -n "trusted.lov" -v "invalid value" $testfile || - error "$testfile allowed setting trusted.lov" + $LFS setstripe -c1 $testfile + local lovea=$(getfattr -n "trusted.lov" -e hex $testfile | + awk -F "=" '/trusted.lov/ { print $2 }' ) + setfattr -n "trusted.lov" -v $lovea $testfile || + error "$testfile doesn't ignore setting trusted.lov again" + setfattr -n "trusted.lov" -v "invalid_value" $testfile && + error "$testfile allow setting invalid trusted.lov" + rm -f $testfile } run_test 102a "user xattr test ==================================" @@ -7322,8 +7353,13 @@ test_102n() { # LU-4101 mdt: protect internal xattrs # Try to set a garbage xattr. value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4= - setfattr --name=trusted.$name --value="$value" $file1 || - error "setxattr 'trusted.$name' failed" + if [[ x$name == "xlov" ]]; then + setfattr --name=trusted.lov --value="$value" $file1 && + error "setxattr invalid 'trusted.lov' success" + else + setfattr --name=trusted.$name --value="$value" $file1 || + error "setxattr invalid 'trusted.$name' failed" + fi # Try to remove the xattr from $file1. We don't care if this # appears to succeed or fail, we just don't want there to be @@ -7698,31 +7734,113 @@ test_110() { } run_test 110 "filename length checking" +# +# Purpose: To verify dynamic thread (OSS) creation. +# test_115() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - OSTIO_pre=$(ps -e | grep ll_ost_io | awk '{ print $4 }'| sort -n | - tail -1 | cut -c11-20) - [ -z "$OSTIO_pre" ] && skip "no OSS threads" && return + remote_ost_nodsh && skip "remote OST with nodsh" && return + + # Lustre does not stop service threads once they are started. + # Reset number of running threads to default. + stopall + setupall + + local OSTIO_pre + local save_params="$TMP/sanity-$TESTNAME.parameters" + + # Get ll_ost_io count before I/O + OSTIO_pre=$(do_facet ost1 \ + "$LCTL get_param ost.OSS.ost_io.threads_started | cut -d= -f2") + # Exit if lustre is not running (ll_ost_io not running). + [ -z "$OSTIO_pre" ] && error "no OSS threads" + echo "Starting with $OSTIO_pre threads" + local thread_max=$((OSTIO_pre * 2)) + local rpc_in_flight=$((thread_max * 2)) + # Number of I/O Process proposed to be started. + local nfiles + local facets=$(get_facets OST) - NUMTEST=20000 - NUMFREE=$(df -i -P $DIR | tail -n 1 | awk '{ print $4 }') - [[ $NUMFREE -lt $NUMTEST ]] && NUMTEST=$(($NUMFREE - 1000)) - echo "$NUMTEST creates/unlinks" - test_mkdir -p $DIR/$tdir - createmany -o $DIR/$tdir/$tfile $NUMTEST - unlinkmany $DIR/$tdir/$tfile $NUMTEST + save_lustre_params client \ + "osc.*OST*.max_rpcs_in_flight" > $save_params + save_lustre_params $facets \ + "ost.OSS.ost_io.threads_max" >> $save_params + + # Set in_flight to $rpc_in_flight + $LCTL set_param osc.*OST*.max_rpcs_in_flight=$rpc_in_flight || + error "Failed to set max_rpcs_in_flight to $rpc_in_flight" + nfiles=${rpc_in_flight} + # Set ost thread_max to $thread_max + do_facet ost1 \ + "$LCTL set_param ost.OSS.ost_io.threads_max=$thread_max" + + # 5 Minutes should be sufficient for max number of OSS + # threads(thread_max) to be created. + local timeout=300 + + # Start I/O. + local WTL=${WTL:-"$LUSTRE/tests/write_time_limit"} + mkdir -p $DIR/$tdir + for i in $(seq $nfiles); do + local file=$DIR/$tdir/${tfile}-$i + $LFS setstripe -c -1 -i 0 $file + ($WTL $file $timeout)& + done + + # I/O Started - Wait for thread_started to reach thread_max or report + # error if thread_started is more than thread_max. + echo "Waiting for thread_started to reach thread_max" + local thread_started=0 + local end_time=$((SECONDS + timeout)) + + while [ $SECONDS -le $end_time ] ; do + echo -n "." + # Get ost i/o thread_started count. + thread_started=$(do_facet ost1 \ + "$LCTL get_param \ + ost.OSS.ost_io.threads_started | cut -d= -f2") + # Break out if thread_started is equal/greater than thread_max + if [[ $thread_started -ge $thread_max ]]; then + echo ll_ost_io thread_started $thread_started, \ + equal/greater than thread_max $thread_max + break + fi + sleep 1 + done - OSTIO_post=$(ps -e | grep ll_ost_io | awk '{ print $4 }' | sort -n | - tail -1 | cut -c11-20) + # Cleanup - We have the numbers, Kill i/o jobs if running. + jobcount=($(jobs -p)) + for i in $(seq 0 $((${#jobcount[@]}-1))) + do + kill -9 ${jobcount[$i]} + if [ $? -ne 0 ] ; then + echo Warning: \ + Failed to Kill \'WTL\(I/O\)\' with pid ${jobcount[$i]} + fi + done - # don't return an error - [ $OSTIO_post == $OSTIO_pre ] && echo \ - "WARNING: No new ll_ost_io threads were created ($OSTIO_pre)" && - echo "This may be fine, depending on what ran before this test" && - echo "and how fast this system is." && return + # Cleanup files left by WTL binary. + for i in $(seq $nfiles); do + local file=$DIR/$tdir/${tfile}-$i + rm -rf $file + if [ $? -ne 0 ] ; then + echo "Warning: Failed to delete file $file" + fi + done - echo "Started with $OSTIO_pre threads, ended with $OSTIO_post" + restore_lustre_params <$save_params + rm -f $save_params || echo "Warning: delete file '$save_params' failed" + + # Error out if no new thread has started or Thread started is greater + # than thread max. + if [[ $thread_started -le $OSTIO_pre || + $thread_started -gt $thread_max ]]; then + error "ll_ost_io: thread_started $thread_started" \ + "OSTIO_pre $OSTIO_pre, thread_max $thread_max." \ + "No new thread started or thread started greater " \ + "than thread_max." + fi } run_test 115 "verify dynamic thread creation====================" @@ -9072,18 +9190,16 @@ set_dir_limits () { local canondev local node - local LDPROC=/proc/fs/ldiskfs + local ldproc=/proc/fs/ldiskfs local facets=$(get_facets MDS) for facet in ${facets//,/ }; do canondev=$(ldiskfs_canon \ *.$(convert_facet2label $facet).mntdev $facet) - do_facet $facet "test -e $LDPROC/$canondev/max_dir_size" || - LDPROC=/sys/fs/ldiskfs - do_facet $facet "echo $1 >$LDPROC/$canondev/max_dir_size" - do_facet $facet "test -e $LDPROC/$canondev/warning_dir_size" || - LDPROC=/sys/fs/ldiskfs - do_facet $facet "echo $2 >$LDPROC/$canondev/warning_dir_size" + do_facet $facet "test -e $ldproc/$canondev/max_dir_size" || + ldproc=/sys/fs/ldiskfs + do_facet $facet "echo $1 >$ldproc/$canondev/max_dir_size" + do_facet $facet "echo $2 >$ldproc/$canondev/warning_dir_size" done } @@ -9107,62 +9223,54 @@ test_129() { remote_mds_nodsh && skip "remote MDS with nodsh" && return local ENOSPC=28 local EFBIG=27 - local has_warning=0 + local has_warning=false rm -rf $DIR/$tdir mkdir -p $DIR/$tdir # block size of mds1 - local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/}) - local MDSBLOCKSIZE=$($LCTL get_param -n mdc.*MDT0000*.blocksize) - local MAX=$((MDSBLOCKSIZE * 5)) - set_dir_limits $MAX $MAX - local I=$(stat -c%s "$DIR/$tdir") - local J=0 - while [[ $I -le $MAX ]]; do - $MULTIOP $DIR/$tdir/$J Oc + local maxsize=$(($($LCTL get_param -n mdc.*MDT0000*.blocksize) * 5)) + set_dir_limits $maxsize $maxsize + local dirsize=$(stat -c%s "$DIR/$tdir") + local nfiles=0 + while [[ $dirsize -le $maxsize ]]; do + $MULTIOP $DIR/$tdir/file_base_$nfiles Oc rc=$? - if [ $has_warning -eq 0 ]; then - check_mds_dmesg '"is approaching"' && - has_warning=1 + if ! $has_warning; then + check_mds_dmesg '"is approaching"' && has_warning=true fi - #check two errors ENOSPC for new version of ext4 max_dir_size patch - #mainline kernel commit df981d03eeff7971ac7e6ff37000bfa702327ef1 - #and EFBIG for previous versions + # check two errors: + # ENOSPC for new ext4 max_dir_size (kernel commit df981d03ee) + # EFBIG for previous versions included in ldiskfs series if [ $rc -eq $EFBIG -o $rc -eq $ENOSPC ]; then set_dir_limits 0 0 echo "return code $rc received as expected" - createmany -o $DIR/$tdir/$J_file_ 1000 || + createmany -o $DIR/$tdir/file_extra_$nfiles. 5 || error_exit "create failed w/o dir size limit" check_mds_dmesg '"has reached"' || - error_exit "has reached message should be output" + error_exit "reached message should be output" [ $has_warning -eq 0 ] && error_exit "warning message should be output" - I=$(stat -c%s "$DIR/$tdir") + dirsize=$(stat -c%s "$DIR/$tdir") - if [ $(lustre_version_code $SINGLEMDS) -lt \ - $(version_code 2.4.51) ] - then - [[ $I -eq $MAX ]] && return 0 - else - [[ $I -gt $MAX ]] && return 0 - fi - error_exit "current dir size $I, previous limit $MAX" + [[ $dirsize -ge $maxsize ]] && return 0 + error_exit "current dir size $dirsize, " \ + "previous limit $maxsize" elif [ $rc -ne 0 ]; then set_dir_limits 0 0 - error_exit "return code $rc received instead of expected " \ - "$EFBIG or $ENOSPC, files in dir $I" + error_exit "return $rc received instead of expected " \ + "$EFBIG or $ENOSPC, files in dir $dirsize" fi - J=$((J+1)) - I=$(stat -c%s "$DIR/$tdir") + nfiles=$((nfiles + 1)) + dirsize=$(stat -c%s "$DIR/$tdir") done set_dir_limits 0 0 - error "exceeded dir size limit $MAX($MDSCOUNT) : $I bytes" + error "exceeded dir size limit $maxsize($MDSCOUNT) : $dirsize bytes" } run_test 129 "test directory size limit ========================" @@ -9478,19 +9586,24 @@ run_test 130e "FIEMAP (test continuation FIEMAP calls)" # Test for writev/readv test_131a() { - rwv -f $DIR/$tfile -w -n 3 524288 1048576 1572864 || \ - error "writev test failed" - rwv -f $DIR/$tfile -r -v -n 2 1572864 1048576 || \ - error "readv failed" + rwv -f $DIR/$tfile -w -n 3 524288 1048576 1572864 || + error "writev test failed" + rwv -f $DIR/$tfile -r -v -n 2 1572864 1048576 || + error "readv failed" rm -f $DIR/$tfile } run_test 131a "test iov's crossing stripe boundary for writev/readv" test_131b() { - rwv -f $DIR/$tfile -w -a -n 3 524288 1048576 1572864 || \ - error "append writev test failed" - rwv -f $DIR/$tfile -w -a -n 2 1572864 1048576 || \ - error "append writev test failed" + local fsize=$((524288 + 1048576 + 1572864)) + rwv -f $DIR/$tfile -w -a -n 3 524288 1048576 1572864 && + $CHECKSTAT -t file $DIR/$tfile -s $fsize || + error "append writev test failed" + + ((fsize += 1572864 + 1048576)) + rwv -f $DIR/$tfile -w -a -n 2 1572864 1048576 && + $CHECKSTAT -t file $DIR/$tfile -s $fsize || + error "append writev test failed" rm -f $DIR/$tfile } run_test 131b "test append writev" @@ -11161,6 +11274,8 @@ test_160d() { run_test 160d "verify that changelog log catch the migrate event" test_160e() { + remote_mds_nodsh && skip "remote MDS with nodsh" && return + # Create a user CL_USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \ changelog_register -n) @@ -12155,11 +12270,11 @@ default_attr() { check_default_stripe_attr() { ACTUAL=$($GETSTRIPE $* $DIR/$tdir) case $1 in - --stripe-count|--count) + --stripe-count|-c) [ -n "$2" ] && EXPECTED=0 || EXPECTED=$(default_attr count);; - --stripe-size|--size) + --stripe-size|-S) [ -n "$2" ] && EXPECTED=0 || EXPECTED=$(default_attr size);; - --stripe-index|--index) + --stripe-index|-i) EXPECTED=-1;; *) error "unknown getstripe attr '$1'" @@ -12773,8 +12888,8 @@ test_217() { # bug 22430 for node in $(nodes_list); do nid=$(host_nids_address $node $NETTYPE) if [[ $nid = *-* ]] ; then - echo "lctl ping $nid@$NETTYPE" - lctl ping $nid@$NETTYPE + echo "lctl ping $(h2nettype $nid)" + lctl ping $(h2nettype $nid) else echo "skipping $node (no hyphen detected)" fi @@ -13742,8 +13857,12 @@ test_231a() # is the same across all OSCs local max_pages=$($LCTL get_param -n osc.*.max_pages_per_rpc | head -n1) local bulk_size=$((max_pages * 4096)) + local brw_size=$(do_facet ost1 $LCTL get_param -n obdfilter.*.brw_size | + head -n 1) mkdir -p $DIR/$tdir + $LFS setstripe -S ${brw_size}M $DIR/$tdir || + error "failed to set stripe with -S ${brw_size}M option" # clear the OSC stats $LCTL set_param osc.*.stats=0 &>/dev/null @@ -14616,6 +14735,7 @@ ladvise_willread_performance() test_255a() { [ $(lustre_version_code ost1) -lt $(version_code 2.8.54) ] && skip "lustre < 2.8.54 does not support ladvise " && return + remote_ost_nodsh && skip "remote OST with nodsh" && return lfs setstripe -c -1 -i 0 $DIR/$tfile || error "$tfile failed" @@ -14700,6 +14820,8 @@ facet_meminfo() { } test_255b() { + remote_ost_nodsh && skip "remote OST with nodsh" && return + lfs setstripe -c 1 -i 0 $DIR/$tfile ladvise_no_type dontneed $DIR/$tfile && @@ -14796,9 +14918,11 @@ test_256() { #after mount new plainllog is used touch $DIR/$tdir/{11..19} + local TEMP256FILE=$(mktemp TEMP256XXXXXX) cat_sl=$(do_facet mds1 \ - "$DEBUGFS -R \\\"dump changelog_catalog cat.dmp\\\" $mdt_dev; \ - llog_reader cat.dmp | grep \\\"type=1064553b\\\" | wc -l") + "$DEBUGFS -R \\\"dump changelog_catalog $TEMP256FILE\\\" $mdt_dev; \ + llog_reader $TEMP256FILE | grep \\\"type=1064553b\\\" | wc -l") + rm $TEMP256FILE if (( cat_sl != 2 )); then do_facet mds1 $LCTL --device $MDT0 changelog_deregister $cl_user @@ -14807,9 +14931,11 @@ test_256() { $LFS changelog_clear $MDT0 $cl_user 0 + TEMP256FILE=$(mktemp TEMP256XXXXXX) cat_sl=$(do_facet mds1 \ - "$DEBUGFS -R \\\"dump changelog_catalog cat.dmp\\\" $mdt_dev; \ - llog_reader cat.dmp | grep \\\"type=1064553b\\\" | wc -l") + "$DEBUGFS -R \\\"dump changelog_catalog $TEMP256FILE\\\" $mdt_dev; \ + llog_reader $TEMP256FILE | grep \\\"type=1064553b\\\" | wc -l") + rm $TEMP256FILE do_facet mds1 $LCTL --device $MDT0 changelog_deregister $cl_user @@ -14845,6 +14971,39 @@ test_257() { } run_test 257 "xattr locks are not lost" +# Verify we take the i_mutex when security requires it +test_258a() { +#define OBD_FAIL_IMUTEX_SEC 0x141c + $LCTL set_param fail_loc=0x141c + touch $DIR/$tfile + chmod u+s $DIR/$tfile + chmod a+rwx $DIR/$tfile + $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 oflag=append + RC=$? + if [ $RC -ne 0 ]; then + error "error, failed to take i_mutex, rc=$?" + fi + rm -f $DIR/$tfile +} +run_test 258a + +# Verify we do NOT take the i_mutex in the normal case +test_258b() { +#define OBD_FAIL_IMUTEX_NOSEC 0x141d + $LCTL set_param fail_loc=0x141d + touch $DIR/$tfile + chmod a+rwx $DIR + chmod a+rw $DIR/$tfile + $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 oflag=append + RC=$? + if [ $RC -ne 0 ]; then + error "error, took i_mutex unnecessarily, rc=$?" + fi + rm -f $DIR/$tfile + +} +run_test 258b "verify i_mutex security behavior" + test_260() { #define OBD_FAIL_MDC_CLOSE 0x806 $LCTL set_param fail_loc=0x80000806 @@ -15417,6 +15576,8 @@ test_300n() { skip "Need MDS version at least 2.7.55" && return [ $PARALLEL == "yes" ] && skip "skip parallel run" && return [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + remote_mds_nodsh && skip "remote MDS with nodsh" && return + local stripe_index local list=$(comma_list $(mdts_nodes)) @@ -15609,6 +15770,7 @@ test_311() { [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.8.54) ] && skip "lustre < 2.8.54 does not contain LU-4825 fix" && return [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + remote_mds_nodsh && skip "remote MDS with nodsh" && return local old_iused=$($LFS df -i | grep OST0000 | awk '{ print $3 }') @@ -15662,7 +15824,7 @@ zfs_oid_to_objid() local objid=$2 local vdevdir=$(dirname $(facet_vdevice $ost)) - local cmd="$ZDB -e -p $vdevdir -dddd $(facet_device $ost)" + local cmd="$ZDB -e -p $vdevdir -ddddd $(facet_device $ost)" local zfs_zapid=$(do_facet $ost $cmd | grep -w "/O/0/d$((objid%32))" -C 5 | awk '/Object/{getline; print $1}') @@ -15691,12 +15853,15 @@ zfs_object_blksz() { } test_312() { # LU-4856 + remote_ost_nodsh && skip "remote OST with nodsh" && return + [ $(facet_fstype ost1) = "zfs" ] || { skip "the test only applies to zfs" && return; } local max_blksz=$(do_facet ost1 \ $ZFS get -p recordsize $(facet_device ost1) | awk '!/VALUE/{print $3}') + local min_blksz=$(getconf PAGE_SIZE) # to make life a little bit easier $LFS mkdir -c 1 -i 0 $DIR/$tdir @@ -15711,7 +15876,7 @@ test_312() { # LU-4856 # block size change by sequential over write local blksz - for ((bs=4096; bs <= max_blksz; bs <<= 2)); do + for ((bs=$min_blksz; bs <= max_blksz; bs <<= 2)); do dd if=/dev/zero of=$tf bs=$bs count=1 oflag=sync conv=notrunc blksz=$(zfs_object_blksz ost1 $zfs_objid) @@ -15720,18 +15885,18 @@ test_312() { # LU-4856 rm -f $tf # block size change by sequential append write - dd if=/dev/zero of=$tf bs=4K count=1 oflag=sync conv=notrunc + dd if=/dev/zero of=$tf bs=$min_blksz count=1 oflag=sync conv=notrunc oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}') zfs_objid=$(zfs_oid_to_objid ost1 $oid) - for ((count = 1; count < $((max_blksz / 4096)); count *= 2)); do - dd if=/dev/zero of=$tf bs=4K count=$count seek=$count \ + for ((count = 1; count < $((max_blksz / min_blksz)); count *= 2)); do + dd if=/dev/zero of=$tf bs=$min_blksz count=$count seek=$count \ oflag=sync conv=notrunc blksz=$(zfs_object_blksz ost1 $zfs_objid) - blksz=$((blksz / 8192)) # in 2*4K unit - [ $blksz -eq $count ] || - error "blksz error(in 8k): $blksz, expected: $count" + [ $blksz -eq $((2 * count * min_blksz)) ] || + error "blksz error, actual $blksz, " \ + "expected: 2 * $count * $min_blksz" done rm -f $tf @@ -15740,9 +15905,10 @@ test_312() { # LU-4856 oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}') zfs_objid=$(zfs_oid_to_objid ost1 $oid) - dd if=/dev/zero of=$tf bs=8K count=1 oflag=sync conv=notrunc + dd if=/dev/zero of=$tf bs=1K count=1 oflag=sync conv=notrunc blksz=$(zfs_object_blksz ost1 $zfs_objid) - [ $blksz -eq 8192 ] || error "blksz error: $blksz, expected: 8k" + [ $blksz -eq $min_blksz ] || + error "blksz error: $blksz, expected: $min_blksz" dd if=/dev/zero of=$tf bs=64K count=1 oflag=sync conv=notrunc seek=128 blksz=$(zfs_object_blksz ost1 $zfs_objid) @@ -15755,6 +15921,8 @@ test_312() { # LU-4856 run_test 312 "make sure ZFS adjusts its block size by write pattern" test_313() { + remote_ost_nodsh && skip "remote OST with nodsh" && return + local file=$DIR/$tfile rm -f $file $SETSTRIPE -c 1 -i 0 $file || error "setstripe failed" @@ -15827,12 +15995,15 @@ test_fake_rw() { rm -f $DIR/$tfile } test_399a() { # LU-7655 for OST fake write + remote_ost_nodsh && skip "remote OST with nodsh" && return + test_fake_rw write } run_test 399a "fake write should not be slower than normal write" - test_399b() { # LU-8726 for OST fake read + remote_ost_nodsh && skip "remote OST with nodsh" && return + if [ "$(facet_fstype ost1)" != "ldiskfs" ]; then skip "only for ldiskfs" && return 0 fi @@ -16164,9 +16335,9 @@ run_test 406 "DNE support fs default striping" test_407() { [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return - [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.8.55) ]] && skip "Need MDS version at least 2.8.55" && return + remote_mds_nodsh && skip "remote MDS with nodsh" && return $LFS mkdir -i 0 -c 1 $DIR/$tdir.0 || error "$LFS mkdir -i 0 -c 1 $tdir.0 failed" @@ -16237,6 +16408,27 @@ test_409() } run_test 409 "Large amount of cross-MDTs hard links on the same file" +test_410() +{ + # Create a file, and stat it from the kernel + local testfile=$DIR/$tfile + touch $testfile + + local run_id=$RANDOM + local my_ino=$(stat --format "%i" $testfile) + + # Try to insert the module. This will always fail as the + # module is designed to not be inserted. + insmod $LUSTRE/tests/kernel/kinode.ko run_id=$run_id fname=$testfile \ + &> /dev/null + + # Anything but success is a test failure + dmesg | grep -q \ + "lustre_kinode_$run_id: inode numbers are identical: $my_ino" || + error "no inode match" +} +run_test 410 "Test inode number returned from kernel thread" + prep_801() { [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] || [[ $(lustre_version_code ost1) -lt $(version_code 2.9.55) ]] && @@ -16248,58 +16440,79 @@ post_801() { stop_full_debug_logging } +barrier_stat() { + if [ $(lustre_version_code mgs) -le $(version_code 2.10.0) ]; then + local st=$(do_facet mgs $LCTL barrier_stat $FSNAME | + awk '/The barrier for/ { print $7 }') + echo $st + else + local st=$(do_facet mgs $LCTL barrier_stat -s $FSNAME) + echo \'$st\' + fi +} + +barrier_expired() { + local expired + + if [ $(lustre_version_code mgs) -le $(version_code 2.10.0) ]; then + expired=$(do_facet mgs $LCTL barrier_stat $FSNAME | + awk '/will be expired/ { print $7 }') + else + expired=$(do_facet mgs $LCTL barrier_stat -t $FSNAME) + fi + + echo $expired +} + test_801a() { prep_801 + echo "Start barrier_freeze at: $(date)" #define OBD_FAIL_BARRIER_DELAY 0x2202 - do_facet mgs $LCTL set_param fail_val=3 fail_loc=0x2202 + do_facet mgs $LCTL set_param fail_val=5 fail_loc=0x2202 do_facet mgs $LCTL barrier_freeze $FSNAME 10 & - sleep 1 - local b_status=$(do_facet mgs $LCTL barrier_stat $FSNAME | - awk '/The barrier for/ { print $7 }') + sleep 2 + local b_status=$(barrier_stat) + echo "Got barrier status at: $(date)" [ "$b_status" = "'freezing_p1'" ] || error "(1) unexpected barrier status $b_status" do_facet mgs $LCTL set_param fail_val=0 fail_loc=0 wait - b_status=$(do_facet mgs $LCTL barrier_stat $FSNAME | - awk '/The barrier for/ { print $7 }') + b_status=$(barrier_stat) [ "$b_status" = "'frozen'" ] || error "(2) unexpected barrier status $b_status" - local expired=$(do_facet mgs $LCTL barrier_stat $FSNAME | - awk '/will be expired/ { print $7 }') + local expired=$(barrier_expired) echo "sleep $((expired + 3)) seconds, then the barrier will be expired" sleep $((expired + 3)) - b_status=$(do_facet mgs $LCTL barrier_stat $FSNAME | - awk '/The barrier for/ { print $7 }') + b_status=$(barrier_stat) [ "$b_status" = "'expired'" ] || error "(3) unexpected barrier status $b_status" do_facet mgs $LCTL barrier_freeze $FSNAME 10 || error "(4) fail to freeze barrier" - b_status=$(do_facet mgs $LCTL barrier_stat $FSNAME | - awk '/The barrier for/ { print $7 }') + b_status=$(barrier_stat) [ "$b_status" = "'frozen'" ] || error "(5) unexpected barrier status $b_status" + echo "Start barrier_thaw at: $(date)" #define OBD_FAIL_BARRIER_DELAY 0x2202 - do_facet mgs $LCTL set_param fail_val=3 fail_loc=0x2202 + do_facet mgs $LCTL set_param fail_val=5 fail_loc=0x2202 do_facet mgs $LCTL barrier_thaw $FSNAME & - sleep 1 - b_status=$(do_facet mgs $LCTL barrier_stat $FSNAME | - awk '/The barrier for/ { print $7 }') + sleep 2 + b_status=$(barrier_stat) + echo "Got barrier status at: $(date)" [ "$b_status" = "'thawing'" ] || error "(6) unexpected barrier status $b_status" do_facet mgs $LCTL set_param fail_val=0 fail_loc=0 wait - b_status=$(do_facet mgs $LCTL barrier_stat $FSNAME | - awk '/The barrier for/ { print $7 }') + b_status=$(barrier_stat) [ "$b_status" = "'thawed'" ] || error "(7) unexpected barrier status $b_status" @@ -16307,8 +16520,7 @@ test_801a() { do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2203 do_facet mgs $LCTL barrier_freeze $FSNAME - b_status=$(do_facet mgs $LCTL barrier_stat $FSNAME | - awk '/The barrier for/ { print $7 }') + b_status=$(barrier_stat) [ "$b_status" = "'failed'" ] || error "(8) unexpected barrier status $b_status" @@ -16333,8 +16545,7 @@ test_801b() { # 180 seconds should be long enough do_facet mgs $LCTL barrier_freeze $FSNAME 180 - local b_status=$(do_facet mgs $LCTL barrier_stat $FSNAME | - awk '/The barrier for/ { print $7 }') + local b_status=$(barrier_stat) [ "$b_status" = "'frozen'" ] || error "(6) unexpected barrier status $b_status" @@ -16356,8 +16567,7 @@ test_801b() { stat $DIR/$tdir/d5 || error "(7) stat should succeed" # To guarantee taht the 'stat' is not blocked - b_status=$(do_facet mgs $LCTL barrier_stat $FSNAME | - awk '/The barrier for/ { print $7 }') + b_status=$(barrier_stat) [ "$b_status" = "'frozen'" ] || error "(8) unexpected barrier status $b_status" @@ -16370,14 +16580,12 @@ test_801b() { ps -p $mv_pid || error "(12) rename should be blocked" ps -p $rm_pid || error "(13) unlink should be blocked" - b_status=$(do_facet mgs $LCTL barrier_stat $FSNAME | - awk '/The barrier for/ { print $7 }') + b_status=$(barrier_stat) [ "$b_status" = "'frozen'" ] || error "(14) unexpected barrier status $b_status" do_facet mgs $LCTL barrier_thaw $FSNAME - b_status=$(do_facet mgs $LCTL barrier_stat $FSNAME | - awk '/The barrier for/ { print $7 }') + b_status=$(barrier_stat) [ "$b_status" = "'thawed'" ] || error "(15) unexpected barrier status $b_status" @@ -16400,8 +16608,7 @@ test_801c() { do_facet mgs $LCTL barrier_freeze $FSNAME 30 - local b_status=$(do_facet mgs $LCTL barrier_stat $FSNAME | - awk '/The barrier for/ { print $7 }') + local b_status=$(barrier_stat) [ "$b_status" = "'expired'" -o "$b_status" = "'failed'" ] || { do_facet mgs $LCTL barrier_thaw $FSNAME error "(2) unexpected barrier status $b_status" @@ -16412,14 +16619,12 @@ test_801c() { do_facet mgs $LCTL barrier_freeze $FSNAME 10 - b_status=$(do_facet mgs $LCTL barrier_stat $FSNAME | - awk '/The barrier for/ { print $7 }') + b_status=$(barrier_stat) [ "$b_status" = "'frozen'" ] || error "(4) unexpected barrier status $b_status" do_facet mgs $LCTL barrier_thaw $FSNAME - b_status=$(do_facet mgs $LCTL barrier_stat $FSNAME | - awk '/The barrier for/ { print $7 }') + b_status=$(barrier_stat) [ "$b_status" = "'thawed'" ] || error "(5) unexpected barrier status $b_status"