X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Fsanity.sh;h=9877521213a88465c53d568d02a2449d30129b61;hb=98ceaf854bb4738305769c5cd1df556ee99aa859;hp=1b7f3e32404709d59854ff00e1050c7cf9514a8c;hpb=9a0a864112550047ae7236c7a904dc7a9955880e;p=fs%2Flustre-release.git diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index 1b7f3e3..9877521 100644 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -53,16 +53,16 @@ fi if [[ $(uname -m) = aarch64 ]]; then # bug number: LU-11596 ALWAYS_EXCEPT+=" $GRANT_CHECK_LIST" - # bug number: LU-11671 LU-11594 LU-11667 LU-11729 - ALWAYS_EXCEPT+=" 45 103a 317 810" + # bug number: LU-11671 LU-11667 LU-4398 + ALWAYS_EXCEPT+=" 45 317 817" fi # 5 12 (min)" [ "$SLOW" = "no" ] && EXCEPT_SLOW="27m 64b 68 71 115 300o" if [ "$mds1_FSTYPE" = "zfs" ]; then - # bug number for skipped test: LU-1957 - ALWAYS_EXCEPT="$ALWAYS_EXCEPT 180" + # bug number for skipped test: + ALWAYS_EXCEPT="$ALWAYS_EXCEPT " # 13 (min)" [ "$SLOW" = "no" ] && EXCEPT_SLOW="$EXCEPT_SLOW 51b" fi @@ -3082,10 +3082,10 @@ test_31n() { run_test 31n "check link count of unlinked file" link_one() { - local TEMPNAME=$(mktemp $1_XXXXXX) - mlink $TEMPNAME $1 2> /dev/null && - echo "$BASHPID: link $TEMPNAME to $1 succeeded" - munlink $TEMPNAME + local tempfile=$(mktemp $1_XXXXXX) + mlink $tempfile $1 2> /dev/null && + echo "$BASHPID: link $tempfile to $1 succeeded" + munlink $tempfile } test_31o() { # LU-2901 @@ -6312,7 +6312,7 @@ check_migrate_links() { # make sure hard links were properly detected, and migration was # performed only once for the entire link set; nonlinked files should # also be migrated - local actual=$(grep -c 'done migrate' <<< "$migrate_out") + local actual=$(grep -c 'done' <<< "$migrate_out") local expected=$(($uniq_count + 1)) [ "$actual" -eq "$expected" ] || @@ -6363,13 +6363,14 @@ test_56xc() { # Test 1: ensure file < 1 GB is always migrated with 1 stripe echo -n "Setting initial stripe for 20MB test file..." - $LFS setstripe -c 2 -i 0 "$dir/20mb" || error "cannot setstripe" + $LFS setstripe -c 2 -i 0 "$dir/20mb" || + error "cannot setstripe 20MB file" echo "done" echo -n "Sizing 20MB test file..." truncate "$dir/20mb" 20971520 || error "cannot create 20MB test file" echo "done" echo -n "Verifying small file autostripe count is 1..." - $LFS_MIGRATE -y -A -C 1 "$dir/20mb" &> /dev/null || + $LFS_MIGRATE -y -A -C 1 "$dir/20mb" || error "cannot migrate 20MB file" local stripe_count=$($LFS getstripe -c "$dir/20mb") || error "cannot get stripe for $dir/20mb" @@ -6382,24 +6383,28 @@ test_56xc() { # sqrt(size_in_gb) + 1 OSTs but is larger than 1GB. The file must # have at least an additional 1KB for each desired stripe for test 3 echo -n "Setting stripe for 1GB test file..." - $LFS setstripe -c 1 -i 0 "$dir/1gb" || error "cannot setstripe" + $LFS setstripe -c 1 -i 0 "$dir/1gb" || error "cannot setstripe 1GB file" echo "done" echo -n "Sizing 1GB test file..." # File size is 1GB + 3KB - truncate "$dir/1gb" 1073744896 &> /dev/null || - error "cannot create 1GB test file" - echo "done" - echo -n "Migrating 1GB file..." - $LFS_MIGRATE -y -A -C 1 "$dir/1gb" &> /dev/null || - error "cannot migrate file" - echo "done" - echo -n "Verifying autostripe count is sqrt(n) + 1..." - stripe_count=$($LFS getstripe -c "$dir/1gb") || - error "cannot get stripe for $dir/1gb" - [ $stripe_count -eq 2 ] || - error "unexpected stripe count $stripe_count (expected 2)" + truncate "$dir/1gb" 1073744896 || error "cannot create 1GB test file" echo "done" + # need at least 512MB per OST for 1GB file to fit in 2 stripes + local avail=$($LCTL get_param -n llite.$FSNAME*.kbytesavail) + if (( avail > 524288 * OSTCOUNT )); then + echo -n "Migrating 1GB file..." + $LFS_MIGRATE -y -A -C 1 "$dir/1gb" || + error "cannot migrate 1GB file" + echo "done" + echo -n "Verifying autostripe count is sqrt(n) + 1..." + stripe_count=$($LFS getstripe -c "$dir/1gb") || + error "cannot getstripe for 1GB file" + [ $stripe_count -eq 2 ] || + error "unexpected stripe count $stripe_count != 2" + echo "done" + fi + # Test 3: File is too large to fit within the available space on # sqrt(n) + 1 OSTs. Simulate limited available space with -X if [ $OSTCOUNT -ge 3 ]; then @@ -6407,15 +6412,15 @@ test_56xc() { # file size (1GB + 3KB) / OST count (3). local kb_per_ost=349526 - echo -n "Migrating 1GB file..." - $LFS_MIGRATE -y -A -C 1 -X $kb_per_ost "$dir/1gb" &>> \ - /dev/null || error "cannot migrate file" + echo -n "Migrating 1GB file with limit..." + $LFS_MIGRATE -y -A -C 1 -X $kb_per_ost "$dir/1gb" || + error "cannot migrate 1GB file with limit" echo "done" stripe_count=$($LFS getstripe -c "$dir/1gb") - echo -n "Verifying autostripe count with limited space..." - [ "$stripe_count" -a $stripe_count -eq 3 ] || - error "unexpected stripe count $stripe_count (wanted 3)" + echo -n "Verifying 1GB autostripe count with limited space..." + [ "$stripe_count" -a $stripe_count -ge 3 ] || + error "unexpected stripe count $stripe_count (min 3)" echo "done" fi @@ -6466,18 +6471,20 @@ test_56z() { # LU-4824 test_mkdir $dir for i in d{0..9}; do test_mkdir $dir/$i + touch $dir/$i/$tfile done - touch $dir/d{0..9}/$tfile $LFS find $DIR/non_existent_dir $dir && error "$LFS find did not return an error" # Make a directory unsearchable. This should NOT be the last entry in # directory order. Arbitrarily pick the 6th entry chmod 700 $($LFS find $dir -type d | sed '6!d') + $RUNAS $LFS find $DIR/non_existent $dir local count=$($RUNAS $LFS find $DIR/non_existent $dir | wc -l) # The user should be able to see 10 directories and 9 files - [ $count == 19 ] || error "$LFS find did not continue after error" + (( count == 19 )) || + error "$LFS find found $count != 19 entries after error" } run_test 56z "lfs find should continue after an error" @@ -6800,9 +6807,9 @@ test_60a() { local pass=true #get fid and record list - fid_list=($(awk '/9_sub.*record/ { print $NF }' /$TMP/$tfile | + fid_list=($(awk '/9_sub.*record/ { print $NF }' $TMP/$tfile | tail -n 4)) - rec_list=($(awk '/9_sub.*record/ { print $((NF-3)) }' /$TMP/$tfile | + rec_list=($(awk '/9_sub.*record/ { print $((NF-3)) }' $TMP/$tfile | tail -n 4)) #remount mgs as ldiskfs or zfs type stop mgs || error "stop mgs failed" @@ -6921,13 +6928,16 @@ run_test 60e "no space while new llog is being created" test_60g() { local pid + local i test_mkdir -c $MDSCOUNT $DIR/$tdir - $LFS setdirstripe -D -i -1 -c $MDSCOUNT $DIR/$tdir ( local index=0 while true; do + $LFS setdirstripe -i $(($index % $MDSCOUNT)) \ + -c $MDSCOUNT $DIR/$tdir/subdir$index \ + 2>/dev/null mkdir $DIR/$tdir/subdir$index 2>/dev/null rmdir $DIR/$tdir/subdir$index 2>/dev/null index=$((index + 1)) @@ -6936,16 +6946,34 @@ test_60g() { pid=$! - for i in $(seq 100); do + for i in {0..100}; do # define OBD_FAIL_OSD_TXN_START 0x19a - do_facet mds1 lctl set_param fail_loc=0x8000019a + local index=$((i % MDSCOUNT + 1)) + + do_facet mds$index $LCTL set_param fail_loc=0x8000019a \ + > /dev/null usleep 100 done kill -9 $pid + for i in $(seq $MDSCOUNT); do + do_facet mds$i $LCTL set_param fail_loc=0 > /dev/null + done + mkdir $DIR/$tdir/new || error "mkdir failed" rmdir $DIR/$tdir/new || error "rmdir failed" + + do_facet mds1 $LCTL lfsck_start -M $(facet_svc mds1) -A -C \ + -t namespace + for i in $(seq $MDSCOUNT); do + wait_update_facet mds$i "$LCTL get_param -n \ + mdd.$(facet_svc mds$i).lfsck_namespace | + awk '/^status/ { print \\\$2 }'" "completed" + done + + ls -R $DIR/$tdir || error "ls failed" + rm -rf $DIR/$tdir || error "rmdir failed" } run_test 60g "transaction abort won't cause MDT hung" @@ -7321,7 +7349,7 @@ cleanup_65k() { do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC activate echo $INACTIVE_OSC "is Activate" - wait_osc_import_state mds ost$ostnum FULL + wait_osc_import_state mds ost$(( ostnum + 1 )) FULL } test_65k() { # bug11679 @@ -7381,7 +7409,7 @@ test_65k() { # bug11679 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC activate echo $INACTIVE_OSC "is Activate" - wait_osc_import_state mds ost$ostnum FULL + wait_osc_import_state mds ost$(( ostnum + 1 )) FULL done } run_test 65k "validate manual striping works properly with deactivated OSCs" @@ -7740,9 +7768,22 @@ CKSUM_TYPES=${CKSUM_TYPES:-$(lctl get_param -n osc.*osc-[^mM]*.checksum_type | set_checksum_type() { lctl set_param -n osc.*osc-[^mM]*.checksum_type $1 - log "set checksum type to $1" - return 0 + rc=$? + log "set checksum type to $1, rc = $rc" + return $rc +} + +get_osc_checksum_type() +{ + # arugment 1: OST name, like OST0000 + ost=$1 + checksum_type=$(lctl get_param -n osc.*${ost}-osc-[^mM]*.checksum_type | + sed 's/.*\[\(.*\)\].*/\1/g') + rc=$? + [ $rc -ne 0 ] && error "failed to get checksum type of $ost, rc = $rc, output = $checksum_type" + echo $checksum_type } + F77_TMP=$TMP/f77-temp F77SZ=8 setup_f77() { @@ -7994,6 +8035,38 @@ test_77k() { # LU-10906 } run_test 77k "enable/disable checksum correctly" +test_77l() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" + $GSS && skip_env "could not run with gss" + + set_checksums 1 + stack_trap "set_checksums $ORIG_CSUM" EXIT + stack_trap "set_checksum_type $ORIG_CSUM_TYPE" EXIT + + set_checksum_type invalid && error "unexpected success of invalid checksum type" + + $LFS setstripe -c 1 -i 0 $DIR/$tfile + for algo in $CKSUM_TYPES; do + set_checksum_type $algo || error "fail to set checksum type $algo" + osc_algo=$(get_osc_checksum_type OST0000) + [ "$osc_algo" != "$algo" ] && error "checksum type is $osc_algo after setting it to $algo" + + # no locks, no reqs to let the connection idle + cancel_lru_locks osc + lru_resize_disable osc + wait_osc_import_state client ost1 IDLE + + # ensure ost1 is connected + stat $DIR/$tfile >/dev/null || error "can't stat" + wait_osc_import_state client ost1 FULL + + osc_algo=$(get_osc_checksum_type OST0000) + [ "$osc_algo" != "$algo" ] && error "checksum type changed from $algo to $osc_algo after reconnection" + done + return 0 +} +run_test 77l "preferred checksum type is remembered after reconnected" + [ "$ORIG_CSUM" ] && set_checksums $ORIG_CSUM || true rm -f $F77_TMP unset F77_TMP @@ -8392,12 +8465,14 @@ test_101c() { cancel_lru_locks osc $LCTL set_param osc.*.rpc_stats 0 $READS -f $DIR/$tfile -s$FILE_LENGTH -b$rsize -n$nreads -t 180 + $LCTL get_param osc.*.rpc_stats for osc_rpc_stats in $($LCTL get_param -N osc.*.rpc_stats); do local stats=$($LCTL get_param -n $osc_rpc_stats) local lines=$(echo "$stats" | awk 'END {print NR;}') local size if [ $lines -le 20 ]; then + echo "continue debug" continue fi for size in 1 2 4 8; do @@ -11012,6 +11087,75 @@ test_127b() { # bug LU-333 } run_test 127b "verify the llite client stats are sane" +test_127c() { # LU-12394 + [ "$OSTCOUNT" -lt "2" ] && skip_env "needs >= 2 OSTs" + local size + local bsize + local reads + local writes + local count + + $LCTL set_param llite.*.extents_stats=1 + stack_trap "$LCTL set_param llite.*.extents_stats=0" EXIT + + # Use two stripes so there is enough space in default config + $LFS setstripe -c 2 $DIR/$tfile + + # Extent stats start at 0-4K and go in power of two buckets + # LL_HIST_START = 12 --> 2^12 = 4K + # We do 3K*2^i, so 3K, 6K, 12K, 24K... hitting each bucket. + # We do not do buckets larger than 64 MiB to avoid ENOSPC issues on + # small configs + for size in 3K 6K 12K 24K 48K 96K 192K 384K 768K 1536K 3M 6M 12M 24M 48M; + do + # Write and read, 2x each, second time at a non-zero offset + dd if=/dev/zero of=$DIR/$tfile bs=$size count=1 + dd if=/dev/zero of=$DIR/$tfile bs=$size count=1 seek=10 + dd if=$DIR/$tfile of=/dev/null bs=$size count=1 + dd if=$DIR/$tfile of=/dev/null bs=$size count=1 seek=10 + rm -f $DIR/$tfile + done + + $LCTL get_param llite.*.extents_stats + + count=2 + for bsize in 4K 8K 16K 32K 64K 128K 256K 512K 1M 2M 4M 8M 16M 32M 64M; + do + local bucket=$($LCTL get_param -n llite.*.extents_stats | + grep -m 1 $bsize) + reads=$(echo $bucket | awk '{print $5}') + writes=$(echo $bucket | awk '{print $9}') + [ "$reads" -eq $count ] || + error "$reads reads in < $bsize bucket, expect $count" + [ "$writes" -eq $count ] || + error "$writes writes in < $bsize bucket, expect $count" + done + + # Test mmap write and read + $LCTL set_param llite.*.extents_stats=c + size=512 + dd if=/dev/zero of=$DIR/$tfile bs=${size}K count=1 + $MULTIOP $DIR/$tfile OSMRUc || error "$MULTIOP $DIR/$tfile failed" + $MULTIOP $DIR/$tfile OSMWUc || error "$MULTIOP $DIR/$tfile failed" + + $LCTL get_param llite.*.extents_stats + + count=$(((size*1024) / PAGE_SIZE)) + + bsize=$((2 * PAGE_SIZE / 1024))K + + bucket=$($LCTL get_param -n llite.*.extents_stats | + grep -m 1 $bsize) + reads=$(echo $bucket | awk '{print $5}') + writes=$(echo $bucket | awk '{print $9}') + # mmap writes fault in the page first, creating an additonal read + [ "$reads" -eq $((2 * count)) ] || + error "$reads reads in < $bsize bucket, expect $count" + [ "$writes" -eq $count ] || + error "$writes writes in < $bsize bucket, expect $count" +} +run_test 127c "test llite extent stats with regular & mmap i/o" + test_128() { # bug 15212 touch $DIR/$tfile $LFS 2>&1 <<-EOF | tee $TMP/$tfile.log @@ -13627,6 +13771,49 @@ test_160i() { } run_test 160i "changelog user register/unregister race" +test_160j() { + remote_mds_nodsh && skip "remote MDS with nodsh" + [[ $MDS1_VERSION -lt $(version_code 2.12.56) ]] && + skip "Need MDS version at least 2.12.56" + + mount_client $MOUNT2 || error "mount_client on $MOUNT2 failed" + + changelog_register || error "first changelog_register failed" + + # generate some changelog + test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed" + createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) || + error "create $DIR/$tdir/${tfile}bis failed" + + # open the changelog device + exec 3>/dev/changelog-$FSNAME-MDT0000 + exec 4/dev/null || error "read changelog failed" + + # clear changelog + local cl_user="${CL_USERS[$SINGLEMDS]%% *}" + changelog_users $SINGLEMDS | grep -q $cl_user || + error "User $cl_user not found in changelog_users" + + printf 'clear:'$cl_user':0' >&3 + + # close + exec 3>&- + exec 4<&- + + # cleanup + changelog_deregister || error "changelog_deregister failed" + + umount $MOUNT2 + mount_client $MOUNT || error "mount_client on $MOUNT failed" +} +run_test 160j "client can be umounted while its chanangelog is being used" + test_161a() { [ $PARALLEL == "yes" ] && skip "skip parallel run" @@ -13823,7 +14010,8 @@ test_161d() { ps -p $pid [[ $? -eq 0 ]] || error "create should be blocked" - local tempfile=$(mktemp) + local tempfile="$(mktemp --tmpdir $tfile.XXXXXX)" + stack_trap "rm -f $tempfile" fid=$(changelog_extract_field "CREAT" "$tfile" "t=") cat $MOUNT/.lustre/fid/$fid 2>/dev/null >$tempfile || error "cat failed" # some delay may occur during ChangeLog publishing and file read just @@ -16696,7 +16884,7 @@ test_243() } run_test 243 "various group lock tests" -test_244() +test_244a() { test_mkdir $DIR/$tdir dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=35 @@ -16704,7 +16892,26 @@ test_244() error "sendfile+grouplock failed" rm -rf $DIR/$tdir } -run_test 244 "sendfile with group lock tests" +run_test 244a "sendfile with group lock tests" + +test_244b() +{ + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + + local threads=50 + local size=$((1024*1024)) + + test_mkdir $DIR/$tdir + for i in $(seq 1 $threads); do + local file=$DIR/$tdir/file_$((i / 10)) + $MULTIOP $file OG1234w$size_$((i % 3))w$size_$((i % 4))g1234c & + local pids[$i]=$! + done + for i in $(seq 1 $threads); do + wait ${pids[$i]} + done +} +run_test 244b "multi-threaded write with group lock" test_245() { local flagname="multi_mod_rpcs" @@ -17476,7 +17683,8 @@ test_256() { #after mount new plainllog is used touch $DIR/$tdir/{11..19} - local tmpfile=$(mktemp -u $tfile.XXXXXX) + local tmpfile="$(mktemp --tmpdir -u $tfile.XXXXXX)" + stack_trap "rm -f $tmpfile" cat_sl=$(do_facet $SINGLEMDS "sync; \ $DEBUGFS -c -R 'dump changelog_catalog $tmpfile' $mdt_dev; \ llog_reader $tmpfile | grep -c type=1064553b") @@ -17488,7 +17696,7 @@ test_256() { cat_sl=$(do_facet $SINGLEMDS "sync; \ $DEBUGFS -c -R 'dump changelog_catalog $tmpfile' $mdt_dev; \ - llog_reader $tmpfile | grep -c type=1064553b; rm -f $tmpfile") + llog_reader $tmpfile | grep -c type=1064553b") if (( cat_sl == 2 )); then error "Empty plain llog was not deleted from changelog catalog" @@ -18112,8 +18320,8 @@ test_271f() { local mdtidx=$($LFS getstripe --mdt-index $DIR/$tdir) cancel_lru_locks mdc - dd if=/dev/urandom of=$tmp bs=200000 count=1 - dd if=$tmp of=$dom bs=200000 count=1 + dd if=/dev/urandom of=$tmp bs=265000 count=1 + dd if=$tmp of=$dom bs=265000 count=1 cancel_lru_locks mdc cat /etc/hosts >> $tmp lctl set_param -n mdc.*.stats=clear @@ -18140,6 +18348,7 @@ test_271f() { local ra=$(get_mdc_stats $mdtidx req_active) local rw=$(get_mdc_stats $mdtidx req_waittime) + [ -z $num ] && num=0 [ $num -eq 1 ] || error "expect 1 READ RPC, $num occured" [ $ra == $rw ] || error "$((ra - rw)) resend occured" echo "... DONE" @@ -18219,12 +18428,12 @@ test_272b() { $LFS migrate -c2 $dom || error "failed to migrate to the new composite layout" - [ $($LFS getstripe -L $dom) == 'mdt' ] && + [ $($LFS getstripe -L $dom) != 'mdt' ] || error "MDT stripe was not removed" cancel_lru_locks mdc local new_md5=$(md5sum $dom) - [ "$old_md5" != "$new_md5" ] && + [ "$old_md5" == "$new_md5" ] || error "$old_md5 != $new_md5" # Skip free space checks with ZFS @@ -18264,7 +18473,7 @@ test_272c() { cancel_lru_locks mdc local new_md5=$(md5sum $dom) - [ "$old_md5" != "$new_md5" ] && + [ "$old_md5" == "$new_md5" ] || error "$old_md5 != $new_md5" # Skip free space checks with ZFS @@ -18278,6 +18487,108 @@ test_272c() { } run_test 272c "DoM migration: DOM file to the OST-striped file (composite)" +test_272d() { + [ $MDS1_VERSION -lt $(version_code 2.12.55) ] && + skip "Need MDS version at least 2.12.55" + + local dom=$DIR/$tdir/$tfile + mkdir -p $DIR/$tdir + $LFS setstripe -E 1M -L mdt -E -1 -c1 $dom + + local mdtidx=$($LFS getstripe -m $dom) + local mdtname=MDT$(printf %04x $mdtidx) + local facet=mds$((mdtidx + 1)) + + dd if=/dev/urandom of=$dom bs=2M count=1 oflag=direct || + error "failed to write data into $dom" + local old_md5=$(md5sum $dom) + cancel_lru_locks mdc + local mdtfree1=$(do_facet $facet \ + lctl get_param -n osd*.*$mdtname.kbytesfree) + + $LFS mirror extend -N -E 2M -c1 -E -1 -c2 $dom || + error "failed mirroring to the new composite layout" + $LFS mirror resync $dom || + error "failed mirror resync" + $LFS mirror split --mirror-id 1 -d $dom || + error "failed mirror split" + + [ $($LFS getstripe -L $dom) != 'mdt' ] || + error "MDT stripe was not removed" + + cancel_lru_locks mdc + local new_md5=$(md5sum $dom) + [ "$old_md5" == "$new_md5" ] || + error "$old_md5 != $new_md5" + + # Skip free space checks with ZFS + if [ "$(facet_fstype $facet)" != "zfs" ]; then + local mdtfree2=$(do_facet $facet \ + lctl get_param -n osd*.*$mdtname.kbytesfree) + [ $mdtfree2 -gt $mdtfree1 ] || + error "MDS space is not freed after DOM mirror deletion" + fi + return 0 +} +run_test 272d "DoM mirroring: OST-striped mirror to DOM file" + +test_272e() { + [ $MDS1_VERSION -lt $(version_code 2.12.55) ] && + skip "Need MDS version at least 2.12.55" + + local dom=$DIR/$tdir/$tfile + mkdir -p $DIR/$tdir + $LFS setstripe -c 2 $dom + + dd if=/dev/urandom of=$dom bs=512K count=1 oflag=direct || + error "failed to write data into $dom" + local old_md5=$(md5sum $dom) + cancel_lru_locks mdc + + $LFS mirror extend -N -E 1M -L mdt -E eof -c2 $dom || + error "failed mirroring to the DOM layout" + $LFS mirror resync $dom || + error "failed mirror resync" + $LFS mirror split --mirror-id 1 -d $dom || + error "failed mirror split" + + [ $($LFS getstripe -L $dom) != 'mdt' ] || + error "MDT stripe was not removed" + + cancel_lru_locks mdc + local new_md5=$(md5sum $dom) + [ "$old_md5" == "$new_md5" ] || + error "$old_md5 != $new_md5" + + return 0 +} +run_test 272e "DoM mirroring: DOM mirror to the OST-striped file" + +test_272f() { + [ $MDS1_VERSION -lt $(version_code 2.12.55) ] && + skip "Need MDS version at least 2.12.55" + + local dom=$DIR/$tdir/$tfile + mkdir -p $DIR/$tdir + $LFS setstripe -c 2 $dom + + dd if=/dev/urandom of=$dom bs=512K count=1 oflag=direct || + error "failed to write data into $dom" + local old_md5=$(md5sum $dom) + cancel_lru_locks mdc + + $LFS migrate -E 1M -L mdt -E eof -c2 -v $dom || + error "failed migrating to the DOM file" + + cancel_lru_locks mdc + local new_md5=$(md5sum $dom) + [ "$old_md5" != "$new_md5" ] && + error "$old_md5 != $new_md5" + + return 0 +} +run_test 272f "DoM migration: OST-striped file to DOM file" + test_273a() { [ $MDS1_VERSION -lt $(version_code 2.11.50) ] && skip "Need MDS version at least 2.11.50" @@ -18356,6 +18667,47 @@ test_276() { } run_test 276 "Race between mount and obd_statfs" +test_277() { + $LCTL set_param ldlm.namespaces.*.lru_size=0 + dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 + local cached_mb=$($LCTL get_param llite.*.max_cached_mb | + grep ^used_mb | awk '{print $2}') + [ $cached_mb -eq 1 ] || error "expected mb 1 got $cached_mb" + dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 \ + oflag=direct conv=notrunc + cached_mb=$($LCTL get_param llite.*.max_cached_mb | + grep ^used_mb | awk '{print $2}') + [ $cached_mb -eq 0 ] || error "expected mb 0 got $cached_mb" +} +run_test 277 "Direct IO shall drop page cache" + +test_278() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + [[ "$(facet_host mds1)" != "$(facet_host mds2)" ]] && + skip "needs the same host for mdt1 mdt2" && return + + local pid1 + local pid2 + +#define OBD_FAIL_OBD_STOP_MDS_RACE 0x60b + do_facet mds2 $LCTL set_param fail_loc=0x8000060c + stop mds2 & + pid2=$! + + stop mds1 + + echo "Starting MDTs" + start mds1 $(mdsdevname 1) $MDS_MOUNT_OPTS + wait $pid2 +#For the error assertion will happen. lu_env_get_key(..., &mdt_thread_key) +#will return NULL + do_facet mds2 $LCTL set_param fail_loc=0 + + start mds2 $(mdsdevname 2) $MDS_MOUNT_OPTS +} +run_test 278 "Race starting MDS between MDTs stop/start" + cleanup_test_300() { trap 0 umask $SAVE_UMASK @@ -19369,14 +19721,13 @@ run_test 316 "lfs mv" test_317() { [ $MDS1_VERSION -lt $(version_code 2.11.53) ] && skip "Need MDS version at least 2.11.53" + if [ "$ost1_FSTYPE" == "zfs" ]; then + skip "LU-10370: no implementation for ZFS" + fi + local trunc_sz local grant_blk_size - if [ "$(facet_fstype $facet)" == "zfs" ]; then - skip "LU-10370: no implementation for ZFS" && return - fi - - stack_trap "rm -f $DIR/$tfile" EXIT grant_blk_size=$($LCTL get_param osc.$FSNAME*.import | awk '/grant_block_size:/ { print $2; exit; }') # @@ -19384,7 +19735,8 @@ test_317() { # blocks count. # dd if=/dev/zero of=$DIR/$tfile bs=5M count=1 conv=fsync || - error "Create file : $DIR/$tfile" + error "Create file $DIR/$tfile failed" + stack_trap "rm -f $DIR/$tfile" EXIT for trunc_sz in 2097152 4097 4000 509 0; do $TRUNCATE $DIR/$tfile $trunc_sz || @@ -20444,6 +20796,234 @@ test_420() } run_test 420 "clear SGID bit on non-directories for non-members" +test_421a() { + local cnt + local fid1 + local fid2 + + [ $MDS1_VERSION -lt $(version_code 2.12.54) ] && + skip "Need MDS version at least 2.12.54" + + test_mkdir $DIR/$tdir + createmany -o $DIR/$tdir/f 3 + cnt=$(ls -1 $DIR/$tdir | wc -l) + [ $cnt != 3 ] && error "unexpected #files: $cnt" + + fid1=$(lfs path2fid $DIR/$tdir/f1) + fid2=$(lfs path2fid $DIR/$tdir/f2) + $LFS rmfid $DIR $fid1 $fid2 || error "rmfid failed" + + stat $DIR/$tdir/f1 && error "f1 still visible on the client" + stat $DIR/$tdir/f2 && error "f2 still visible on the client" + + cnt=$(ls -1 $DIR/$tdir | wc -l) + [ $cnt == 1 ] || error "unexpected #files after: $cnt" + + rm -f $DIR/$tdir/f3 || error "can't remove f3" + createmany -o $DIR/$tdir/f 3 + cnt=$(ls -1 $DIR/$tdir | wc -l) + [ $cnt != 3 ] && error "unexpected #files: $cnt" + + fid1=$(lfs path2fid $DIR/$tdir/f1) + fid2=$(lfs path2fid $DIR/$tdir/f2) + echo "remove using fsname $FSNAME" + $LFS rmfid $FSNAME $fid1 $fid2 || error "rmfid with fsname failed" + + cnt=$(ls -1 $DIR/$tdir | wc -l) + [ $cnt == 1 ] || error "unexpected #files after: $cnt" +} +run_test 421a "simple rm by fid" + +test_421b() { + local cnt + local FID1 + local FID2 + + [ $MDS1_VERSION -lt $(version_code 2.12.54) ] && + skip "Need MDS version at least 2.12.54" + + test_mkdir $DIR/$tdir + createmany -o $DIR/$tdir/f 3 + multiop_bg_pause $DIR/$tdir/f1 o_c || error "multiop failed to start" + MULTIPID=$! + + FID1=$(lfs path2fid $DIR/$tdir/f1) + FID2=$(lfs path2fid $DIR/$tdir/f2) + $LFS rmfid $DIR $FID1 $FID2 && error "rmfid didn't fail" + + kill -USR1 $MULTIPID + wait + + cnt=$(ls $DIR/$tdir | wc -l) + [ $cnt == 2 ] || error "unexpected #files after: $cnt" +} +run_test 421b "rm by fid on open file" + +test_421c() { + local cnt + local FIDS + + [ $MDS1_VERSION -lt $(version_code 2.12.54) ] && + skip "Need MDS version at least 2.12.54" + + test_mkdir $DIR/$tdir + createmany -o $DIR/$tdir/f 3 + touch $DIR/$tdir/$tfile + createmany -l$DIR/$tdir/$tfile $DIR/$tdir/h 180 + cnt=$(ls -1 $DIR/$tdir | wc -l) + [ $cnt != 184 ] && error "unexpected #files: $cnt" + + FID1=$(lfs path2fid $DIR/$tdir/$tfile) + $LFS rmfid $DIR $FID1 || error "rmfid failed" + + cnt=$(ls $DIR/$tdir | wc -l) + [ $cnt == 3 ] || error "unexpected #files after: $cnt" +} +run_test 421c "rm by fid against hardlinked files" + +test_421d() { + local cnt + local FIDS + + [ $MDS1_VERSION -lt $(version_code 2.12.54) ] && + skip "Need MDS version at least 2.12.54" + + test_mkdir $DIR/$tdir + createmany -o $DIR/$tdir/f 4097 + cnt=$(ls -1 $DIR/$tdir | wc -l) + [ $cnt != 4097 ] && error "unexpected #files: $cnt" + + FIDS=$(lfs path2fid $DIR/$tdir/f* | sed "s/[/][^:]*://g") + $LFS rmfid $DIR $FIDS || error "rmfid failed" + + cnt=$(ls $DIR/$tdir | wc -l) + rm -rf $DIR/$tdir + [ $cnt == 0 ] || error "unexpected #files after: $cnt" +} +run_test 421d "rmfid en masse" + +test_421e() { + local cnt + local FID + + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" + [ $MDS1_VERSION -lt $(version_code 2.12.54) ] && + skip "Need MDS version at least 2.12.54" + + mkdir -p $DIR/$tdir + $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir + createmany -o $DIR/$tdir/striped_dir/f 512 + cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l) + [ $cnt != 512 ] && error "unexpected #files: $cnt" + + FIDS=$(lfs path2fid $DIR/$tdir/striped_dir/f* | + sed "s/[/][^:]*://g") + $LFS rmfid $DIR $FIDS || error "rmfid failed" + + cnt=$(ls $DIR/$tdir/striped_dir | wc -l) + rm -rf $DIR/$tdir + [ $cnt == 0 ] || error "unexpected #files after: $cnt" +} +run_test 421e "rmfid in DNE" + +test_421f() { + local cnt + local FID + + [ $MDS1_VERSION -lt $(version_code 2.12.54) ] && + skip "Need MDS version at least 2.12.54" + + test_mkdir $DIR/$tdir + touch $DIR/$tdir/f + cnt=$(ls -1 $DIR/$tdir | wc -l) + [ $cnt != 1 ] && error "unexpected #files: $cnt" + + FID=$(lfs path2fid $DIR/$tdir/f) + $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail (1)" + # rmfid should fail + cnt=$(ls -1 $DIR/$tdir | wc -l) + [ $cnt != 1 ] && error "unexpected #files after (2): $cnt" + + chmod a+rw $DIR/$tdir + ls -la $DIR/$tdir + $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail (2)" + # rmfid should fail + cnt=$(ls -1 $DIR/$tdir | wc -l) + [ $cnt != 1 ] && error "unexpected #files after (3): $cnt" + + rm -f $DIR/$tdir/f + $RUNAS touch $DIR/$tdir/f + FID=$(lfs path2fid $DIR/$tdir/f) + echo "rmfid as root" + $LFS rmfid $DIR $FID || error "rmfid as root failed" + cnt=$(ls -1 $DIR/$tdir | wc -l) + [ $cnt == 0 ] || error "unexpected #files after (4): $cnt" + + rm -f $DIR/$tdir/f + $RUNAS touch $DIR/$tdir/f + cnt=$(ls -1 $DIR/$tdir | wc -l) + [ $cnt != 1 ] && error "unexpected #files (4): $cnt" + FID=$(lfs path2fid $DIR/$tdir/f) + # rmfid w/o user_fid2path mount option should fail + $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail(3)" + cnt=$(ls -1 $DIR/$tdir | wc -l) + [ $cnt == 1 ] || error "unexpected #files after (5): $cnt" + + umount_client $MOUNT || "failed to umount client" + mount_client $MOUNT "$MOUNT_OPTS,user_fid2path" || + "failed to mount client'" + + $RUNAS $LFS rmfid $DIR $FID || error "rmfid failed" + # rmfid should succeed + cnt=$(ls -1 $DIR/$tdir | wc -l) + [ $cnt == 0 ] || error "unexpected #files after (6): $cnt" + + # rmfid shouldn't allow to remove files due to dir's permission + chmod a+rwx $DIR/$tdir + touch $DIR/$tdir/f + ls -la $DIR/$tdir + FID=$(lfs path2fid $DIR/$tdir/f) + $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail" + + umount_client $MOUNT || "failed to umount client" + mount_client $MOUNT "$MOUNT_OPTS" || + "failed to mount client'" + +} +run_test 421f "rmfid checks permissions" + +test_421g() { + local cnt + local FIDS + + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" + [ $MDS1_VERSION -lt $(version_code 2.12.54) ] && + skip "Need MDS version at least 2.12.54" + + mkdir -p $DIR/$tdir + $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir + createmany -o $DIR/$tdir/striped_dir/f 512 + cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l) + [ $cnt != 512 ] && error "unexpected #files: $cnt" + + FIDS=$(lfs path2fid $DIR/$tdir/striped_dir/f* | + sed "s/[/][^:]*://g") + + rm -f $DIR/$tdir/striped_dir/f1* + cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l) + removed=$((512 - cnt)) + + # few files have been just removed, so we expect + # rmfid to fail on their fids + errors=$($LFS rmfid $DIR $FIDS 2>&1 | wc -l) + [ $removed != $errors ] && error "$errors != $removed" + + cnt=$(ls $DIR/$tdir/striped_dir | wc -l) + rm -rf $DIR/$tdir + [ $cnt == 0 ] || error "unexpected #files after: $cnt" +} +run_test 421g "rmfid to return errors properly" + prep_801() { [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] || [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] && @@ -20486,7 +21066,8 @@ test_801a() { echo "Start barrier_freeze at: $(date)" #define OBD_FAIL_BARRIER_DELAY 0x2202 do_facet mgs $LCTL set_param fail_val=5 fail_loc=0x2202 - do_facet mgs $LCTL barrier_freeze $FSNAME 10 & + # Do not reduce barrier time - See LU-11873 + do_facet mgs $LCTL barrier_freeze $FSNAME 20 & sleep 2 local b_status=$(barrier_stat) @@ -20508,7 +21089,8 @@ test_801a() { [ "$b_status" = "'expired'" ] || error "(3) unexpected barrier status $b_status" - do_facet mgs $LCTL barrier_freeze $FSNAME 10 || + # Do not reduce barrier time - See LU-11873 + do_facet mgs $LCTL barrier_freeze $FSNAME 20 || error "(4) fail to freeze barrier" b_status=$(barrier_stat) @@ -20633,7 +21215,8 @@ test_801c() { do_facet mgs $LCTL barrier_rescan $FSNAME || error "(3) Fail to rescan barrier bitmap" - do_facet mgs $LCTL barrier_freeze $FSNAME 10 + # Do not reduce barrier time - See LU-11873 + do_facet mgs $LCTL barrier_freeze $FSNAME 20 b_status=$(barrier_stat) [ "$b_status" = "'frozen'" ] || @@ -21163,20 +21746,29 @@ test_809() { run_test 809 "Verify no SOM xattr store for DoM-only files" test_810() { - local ORIG - local CSUM - - # t10 seem to dislike partial pages - lctl set_param osc.*.checksum_type=adler - lctl set_param fail_loc=0x411 - dd if=/dev/urandom of=$DIR/$tfile bs=10240 count=2 - ORIG=$(md5sum $DIR/$tfile) - lctl set_param ldlm.namespaces.*osc*.lru_size=clear - CSUM=$(md5sum $DIR/$tfile) - set_checksum_type adler - if [ "$ORIG" != "$CSUM" ]; then - error "$ORIG != $CSUM" - fi + [ $PARALLEL == "yes" ] && skip "skip parallel run" + $GSS && skip_env "could not run with gss" + + set_checksums 1 + stack_trap "set_checksums $ORIG_CSUM" EXIT + stack_trap "set_checksum_type $ORIG_CSUM_TYPE" EXIT + + local csum + local before + local after + for csum in $CKSUM_TYPES; do + #define OBD_FAIL_OSC_NO_GRANT 0x411 + $LCTL set_param osc.*.checksum_type=$csum fail_loc=0x411 + for i in "10240 0" "10000 0" "4000 1" "500 1"; do + eval set -- $i + dd if=/dev/urandom of=$DIR/$tfile bs=$1 count=2 seek=$2 + before=$(md5sum $DIR/$tfile) + $LCTL set_param ldlm.namespaces.*osc*.lru_size=clear + after=$(md5sum $DIR/$tfile) + [ "$before" == "$after" ] || + error "$csum: $before != $after bs=$1 seek=$2" + done + done } run_test 810 "partial page writes on ZFS (LU-11663)" @@ -21408,6 +22000,9 @@ test_815() run_test 815 "zero byte tiny write doesn't hang (LU-12382)" test_816() { + [ "$SHARED_KEY" = true ] && + skip "OSC connections never go IDLE with Shared-Keys enabled" + $LFS setstripe -c 1 -i 0 $DIR/$tfile # ensure ost1 is connected stat $DIR/$tfile >/dev/null || error "can't stat" @@ -21428,6 +22023,43 @@ test_816() { } run_test 816 "do not reset lru_resize on idle reconnect" +cleanup_817() { + umount $tmpdir + exportfs -u localhost:$DIR/nfsexp + rm -rf $DIR/nfsexp +} + +test_817() { + systemctl restart nfs-server.service || skip "failed to restart nfsd" + + mkdir -p $DIR/nfsexp + exportfs -orw,no_root_squash localhost:$DIR/nfsexp || + error "failed to export nfs" + + tmpdir=$(mktemp -d /tmp/nfs-XXXXXX) + stack_trap cleanup_817 EXIT + + mount -t nfs -orw localhost:$DIR/nfsexp $tmpdir || + error "failed to mount nfs to $tmpdir" + + cp /bin/true $tmpdir + $DIR/nfsexp/true || error "failed to execute 'true' command" +} +run_test 817 "nfsd won't cache write lock for exec file" + +test_818() { + mkdir $DIR/$tdir + $LFS setstripe -c1 -i0 $DIR/$tfile + $LFS setstripe -c1 -i1 $DIR/$tfile + stop $SINGLEMDS + #define OBD_FAIL_OSP_CANT_PROCESS_LLOG 0x2105 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80002105 + start $SINGLEMDS $(mdsdevname ${SINGLEMDS//mds/}) $MDS_MOUNT_OPTS || + error "start $SINGLEMDS failed" + rm -rf $DIR/$tdir +} +run_test 818 "unlink with failed llog" + # # tests that do cleanup/setup should be run at the end #