X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Fsanity.sh;h=8cdf3fe2a26a3a9f7b8ad50c38e47392c61a1088;hb=82e494a36e9ea4f51ec163ab15beb9fdda7fa8d6;hp=46f9e8c4eb6f8cd7528e97d0df570154bc8efdb5;hpb=3442db6faf685fbdbd092bdfdc8d273e4990a141;p=fs%2Flustre-release.git diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index 46f9e8c..8cdf3fe 100755 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -5791,6 +5791,92 @@ test_64c() { } run_test 64c "verify grant shrink" +# this does exactly what osc_request.c:osc_announce_cached() does in +# order to calculate max amount of grants to ask from server +want_grant() { + local tgt=$1 + + local page_size=$(get_page_size client) + + local nrpages=$($LCTL get_param -n osc.${tgt}.max_pages_per_rpc) + local rpc_in_flight=$($LCTL get_param -n osc.${tgt}.max_rpcs_in_flight) + + ((rpc_in_flight ++)); + nrpages=$((nrpages * rpc_in_flight)) + + local dirty_max_pages=$($LCTL get_param -n osc.${tgt}.max_dirty_mb) + + dirty_max_pages=$((dirty_max_pages * 1024 * 1024 / page_size)) + + [[ $dirty_max_pages -gt $nrpages ]] && nrpages=$dirty_max_pages + local undirty=$((nrpages * page_size)) + + local max_extent_pages + max_extent_pages=$($LCTL get_param osc.${tgt}.import | + grep grant_max_extent_size | awk '{print $2}') + max_extent_pages=$((max_extent_pages / page_size)) + local nrextents=$(((nrpages + max_extent_pages - 1) / max_extent_pages)) + local grant_extent_tax + grant_extent_tax=$($LCTL get_param osc.${tgt}.import | + grep grant_extent_tax | awk '{print $2}') + + undirty=$((undirty + nrextents * grant_extent_tax)) + + echo $undirty +} + +# this is size of unit for grant allocation. It should be equal to +# what tgt_grant.c:tgt_grant_chunk() calculates +grant_chunk() { + local tgt=$1 + local max_brw_size + local grant_extent_tax + + max_brw_size=$($LCTL get_param osc.${tgt}.import | + grep max_brw_size | awk '{print $2}') + + grant_extent_tax=$($LCTL get_param osc.${tgt}.import | + grep grant_extent_tax | awk '{print $2}') + + echo $(((max_brw_size + grant_extent_tax) * 2)) +} + +test_64d() { + [ $(lustre_version_code ost1) -lt $(version_code 2.10.56) ] && + skip "OST < 2.10.55 doesn't limit grants enough" && return 0 + + local tgt=$($LCTL dl | grep "0000-osc-[^mM]" | awk '{print $4}') + + [[ $($LCTL get_param osc.${tgt}.import | + grep "connect_flags:.*grant_param") ]] || \ + { skip "no grant_param connect flag"; return; } + + local olddebug=$($LCTL get_param -n debug 2> /dev/null) + + $LCTL set_param debug="$OLDDEBUG" 2> /dev/null || true + + local max_cur_granted=$(($(want_grant $tgt) + $(grant_chunk $tgt))) + + $SETSTRIPE $DIR/$tfile -i 0 -c 1 + dd if=/dev/zero of=$DIR/$tfile bs=1M count=1000 & + ddpid=$! + + while true + do + local cur_grant=$($LCTL get_param -n osc.${tgt}.cur_grant_bytes) + if [[ $cur_grant -gt $max_cur_granted ]] + then + kill $ddpid + error "cur_grant $cur_grant > $max_cur_granted" + fi + kill -0 $ddpid + [[ $? -ne 0 ]] && break; + sleep 2 + done + $LCTL set_param debug="$olddebug" 2> /dev/null || true +} +run_test 64d "check grant limit exceed" + # bug 1414 - set/get directories' stripe info test_65a() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return @@ -7044,14 +7130,19 @@ test_101g() { local list=$(comma_list $(osts_nodes)) local p="$TMP/$TESTSUITE-$TESTNAME.parameters" local brw_size="obdfilter.*.brw_size" + local ostver=$(lustre_version_code ost1) + local cliver=$(lustre_version_code client) $LFS setstripe -i 0 -c 1 $DIR/$tfile local orig_mb=$(do_facet ost1 $LCTL get_param -n $brw_size | head -n 1) - if [ $(lustre_version_code ost1) -ge $(version_code 2.8.52) -a \ - $(lustre_version_code client) -ge $(version_code 2.8.52) ]; then - [ $(lustre_version_code ost1) -ge $(version_code 2.9.52) ] && - suffix="M" + if [ $ostver -ge $(version_code 2.8.52) -o \ + \( $ostver -ge $(version_code 2.7.17) -a \ + $ostver -lt $(version_code 2.7.50) \) ] && + [ $cliver -ge $(version_code 2.8.52) -o \ + \( $cliver -ge $(version_code 2.7.17) -a \ + $cliver -lt $(version_code 2.7.50) \) ]; then + [ $ostver -ge $(version_code 2.9.52) ] && suffix="M" if [[ $orig_mb -lt 16 ]]; then save_lustre_params $osts "$brw_size" > $p do_nodes $list $LCTL set_param -n $brw_size=16$suffix || @@ -8507,6 +8598,34 @@ run_test 118m "fdatasync dir =========" [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] && set_resend_count $OLD_RESENDCOUNT +test_118n() +{ + local begin + local end + + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + remote_ost_nodsh && skip "remote OSTs with nodsh" && return + + # Sleep to avoid a cached response. + #define OBD_STATFS_CACHE_SECONDS 1 + sleep 2 + + # Inject a 10 second delay in the OST_STATFS handler. + #define OBD_FAIL_OST_STATFS_DELAY 0x242 + set_nodes_failloc "$(osts_nodes)" 0x242 + + begin=$SECONDS + stat --file-system $MOUNT > /dev/null + end=$SECONDS + + set_nodes_failloc "$(osts_nodes)" 0 + + if ((end - begin > 20)); then + error "statfs took $((end - begin)) seconds, expected 10" + fi +} +run_test 118n "statfs() sends OST_STATFS requests in parallel" + test_119a() # bug 11737 { BSIZE=$((512 * 1024)) @@ -9382,7 +9501,7 @@ test_130a() { skip "ORI-366/LU-1941: FIEMAP unimplemented on ZFS" && return [ $RC != 0 ] && error "filefrag $fm_file failed" - filefrag_op=$(filefrag -ve $fm_file | + filefrag_op=$(filefrag -ve -k $fm_file | sed -n '/ext:/,/found/{/ext:/d; /found/d; p}') lun=$($GETSTRIPE -i $fm_file) @@ -9432,7 +9551,7 @@ test_130b() { error "dd failed on $fm_file" filefrag -ves $fm_file || error "filefrag $fm_file failed" - filefrag_op=$(filefrag -ve $fm_file | + filefrag_op=$(filefrag -ve -k $fm_file | sed -n '/ext:/,/found/{/ext:/d; /found/d; p}') last_lun=$(echo $filefrag_op | cut -d: -f5 | @@ -9491,7 +9610,7 @@ test_130c() { error "dd failed on $fm_file" filefrag -ves $fm_file || error "filefrag $fm_file failed" - filefrag_op=$(filefrag -ve $fm_file | + filefrag_op=$(filefrag -ve -k $fm_file | sed -n '/ext:/,/found/{/ext:/d; /found/d; p}') last_lun=$(echo $filefrag_op | cut -d: -f5 | @@ -9559,7 +9678,7 @@ test_130d() { error "dd failed on $fm_file" filefrag -ves $fm_file || error "filefrag $fm_file failed" - filefrag_op=$(filefrag -ve $fm_file | + filefrag_op=$(filefrag -ve -k $fm_file | sed -n '/ext:/,/found/{/ext:/d; /found/d; p}') last_lun=$(echo $filefrag_op | cut -d: -f5 | @@ -9621,7 +9740,7 @@ test_130e() { done filefrag -ves $fm_file || error "filefrag $fm_file failed" - filefrag_op=$(filefrag -ve $fm_file | + filefrag_op=$(filefrag -ve -k $fm_file | sed -n '/ext:/,/found/{/ext:/d; /found/d; p}') last_lun=$(echo $filefrag_op | cut -d: -f5 | @@ -10063,6 +10182,7 @@ test_133g() { echo "proc_dirs='$proc_dirs'" [ -n "$proc_dirs" ] || error "no proc_dirs on $HOSTNAME" find $proc_dirs \ + -ignore_readdir_race \ -type f \ -not -name force_lbug \ -not -name changelog_mask \ @@ -10078,6 +10198,7 @@ test_133g() { echo "${facet}_proc_dirs='$facet_proc_dirs'" [ -z "$facet_proc_dirs" ] && error "no proc_dirs on $facet" do_facet $facet find $facet_proc_dirs \ + -ignore_readdir_race \ -type f \ -not -name force_lbug \ -not -name changelog_mask \ @@ -12238,6 +12359,8 @@ test_184a() { cmp $ref1 $file2 || error "content compare failed ($ref1 != $file2)" cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)" + + lfsck_verify_pfid $file1 $file2 || error "PFID are not transferred" } run_test 184a "Basic layout swap" @@ -14165,19 +14288,44 @@ test_231b() { } run_test 231b "must not assert on fully utilized OST request buffer" -test_232() { +test_232a() { mkdir -p $DIR/$tdir + $LFS setstripe -c1 -i0 $DIR/$tdir/$tfile + #define OBD_FAIL_LDLM_OST_LVB 0x31c - $LCTL set_param fail_loc=0x31c + do_facet ost1 $LCTL set_param fail_loc=0x31c # ignore dd failure dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1 || true - $LCTL set_param fail_loc=0 + do_facet ost1 $LCTL set_param fail_loc=0 umount_client $MOUNT || error "umount failed" mount_client $MOUNT || error "mount failed" + stop ost1 || error "cannot stop ost1" + start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1" } -run_test 232 "failed lock should not block umount" +run_test 232a "failed lock should not block umount" + +test_232b() { + mkdir -p $DIR/$tdir + $LFS setstripe -c1 -i0 $DIR/$tdir/$tfile + dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1 + sync + cancel_lru_locks osc + + #define OBD_FAIL_LDLM_OST_LVB 0x31c + do_facet ost1 $LCTL set_param fail_loc=0x31c + + # ignore failure + $LFS data_version $DIR/$tdir/$tfile || true + + do_facet ost1 $LCTL set_param fail_loc=0 + umount_client $MOUNT || error "umount failed" + mount_client $MOUNT || error "mount failed" + stop ost1 || error "cannot stop ost1" + start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1" +} +run_test 232b "failed data version lock should not block umount" test_233a() { [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.3.64) ] || @@ -16701,6 +16849,24 @@ test_314() { } run_test 314 "OSP shouldn't fail after last_rcvd update failure" +test_315() { # LU-618 + local file=$DIR/$tfile + rm -f $file + + $MULTIOP $file oO_CREAT:O_DIRECT:O_RDWR:w4096000c + $MULTIOP $file oO_RDONLY:r4096000_c & + PID=$! + + sleep 2 + + local rbytes=$(awk '/read_bytes/ { print $2 }' /proc/$PID/io) + kill -USR1 $PID + + [ $rbytes -gt 4000000 ] || error "read is not accounted ($rbytes)" + rm -f $file +} +run_test 315 "read should be accounted" + test_fake_rw() { local read_write=$1 if [ "$read_write" = "write" ]; then @@ -17504,6 +17670,137 @@ test_802() { } run_test 802 "simulate readonly device" +test_803() { + [[ $MDSCOUNT -lt 2 ]] && skip "needs >= 2 MDTs" && return + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.54) ] && + skip "MDS needs to be newer than 2.10.54" && return + + mkdir -p $DIR/$tdir + # Create some objects on all MDTs to trigger related logs objects + for idx in $(seq $MDSCOUNT); do + $LFS mkdir -c $MDSCOUNT -i $((idx % $MDSCOUNT)) \ + $DIR/$tdir/dir${idx} || + error "Fail to create $DIR/$tdir/dir${idx}" + done + + sync; sleep 5 + echo "before create:" + $LFS df -i $MOUNT + local before_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}') + + for ((i=0; i<10; i++)); do + $LFS mkdir -c 1 -i 1 $DIR/$tdir/foo$i || + error "Fail to create $DIR/$tdir/foo$i" + done + + sync; sleep 5 + echo "after create:" + $LFS df -i $MOUNT + local after_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}') + + [ $after_used -ge $((before_used + 10)) ] || + error "before ($before_used) + 10 > after ($after_used)" + + for ((i=0; i<10; i++)); do + rm -rf $DIR/$tdir/foo$i || + error "Fail to remove $DIR/$tdir/foo$i" + done + + wait_delete_completed + echo "after unlink:" + $LFS df -i $MOUNT + before_used=$after_used + after_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}') + + [ $after_used -le $((before_used - 8)) ] || + error "before ($before_used) - 8 < after ($after_used)" +} +run_test 803 "verify agent object for remote object" + +test_804() { + [[ $MDSCOUNT -lt 2 ]] && skip "needs >= 2 MDTs" && return + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.54) ] && + skip "MDS needs to be newer than 2.10.54" && return + + [ "$(facet_fstype $SINGLEMDS)" != "ldiskfs" ] && + skip "ldiskfs only test" && return 0 + + mkdir -p $DIR/$tdir + $LFS mkdir -c 1 -i 1 $DIR/$tdir/dir0 || + error "Fail to create $DIR/$tdir/dir0" + + local fid=$($LFS path2fid $DIR/$tdir/dir0) + local dev=$(mdsdevname 2) + + do_facet mds2 "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" | + grep ${fid} || error "NOT found agent entry for dir0" + + $LFS mkdir -c $MDSCOUNT -i 0 $DIR/$tdir/dir1 || + error "Fail to create $DIR/$tdir/dir1" + + touch $DIR/$tdir/dir1/foo0 || + error "Fail to create $DIR/$tdir/dir1/foo0" + fid=$($LFS path2fid $DIR/$tdir/dir1/foo0) + local rc=0 + + for idx in $(seq $MDSCOUNT); do + dev=$(mdsdevname $idx) + do_facet mds${idx} \ + "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" | + grep ${fid} && rc=$idx + done + + mv $DIR/$tdir/dir1/foo0 $DIR/$tdir/dir1/foo1 || + error "Fail to rename foo0 to foo1" + if [ $rc -eq 0 ]; then + for idx in $(seq $MDSCOUNT); do + dev=$(mdsdevname $idx) + do_facet mds${idx} \ + "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" | + grep ${fid} && rc=$idx + done + fi + + mv $DIR/$tdir/dir1/foo1 $DIR/$tdir/dir1/foo2 || + error "Fail to rename foo1 to foo2" + if [ $rc -eq 0 ]; then + for idx in $(seq $MDSCOUNT); do + dev=$(mdsdevname $idx) + do_facet mds${idx} \ + "$DEBUGFS -c -R 'ls /REMOTE_PARENT_DIR' $dev" | + grep ${fid} && rc=$idx + done + fi + + [ $rc -ne 0 ] || error "NOT found agent entry for foo" + + ln $DIR/$tdir/dir1/foo2 $DIR/$tdir/dir0/guard || + error "Fail to link to $DIR/$tdir/dir1/foo2" + mv $DIR/$tdir/dir1/foo2 $DIR/$tdir/dir1/foo0 || + error "Fail to rename foo2 to foo0" + unlink $DIR/$tdir/dir1/foo0 || + error "Fail to unlink $DIR/$tdir/dir1/foo0" + rm -rf $DIR/$tdir/dir0 || + error "Fail to rm $DIR/$tdir/dir0" + + for idx in $(seq $MDSCOUNT); do + dev=$(mdsdevname $idx) + rc=0 + + stop mds${idx} + run_e2fsck $(facet_active_host mds$idx) $dev -n || + rc=$? + start mds${idx} $dev $MDS_MOUNT_OPTS || + error "mount mds$idx failed" + df $MOUNT > /dev/null 2>&1 + + # e2fsck should not return error + [ $rc -eq 0 ] || + error "e2fsck detected error on MDT${idx}: rc=$rc" + done +} +run_test 804 "verify agent entry for remote entry" + # # tests that do cleanup/setup should be run at the end #