X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Ftests%2Fsanity.sh;h=878796c127d782bbd9739a587d1bab3bc5b1361f;hp=adcf85b85c9d7c4638e53f2c105ecfe4d5280421;hb=cf72ee174bbf7e60301ddff211b0685dc6c7adab;hpb=c7fbae54c65a826e84b18723720507d6ea855b7f diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index adcf85b..878796c 100755 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -45,8 +45,8 @@ ALWAYS_EXCEPT+=" 42a 42b 42c " ALWAYS_EXCEPT+=" 407 312" if $SHARED_KEY; then - # bug number: LU-9795 LU-9795 LU-9795 LU-9795 - ALWAYS_EXCEPT+=" 17n 60a 133g 300f" + # bug number: LU-14181 LU-14181 + ALWAYS_EXCEPT+=" 64e 64f" fi selinux_status=$(getenforce) @@ -61,6 +61,8 @@ if [[ $(uname -m) = aarch64 ]]; then ALWAYS_EXCEPT+=" $GRANT_CHECK_LIST" # bug number: LU-11671 LU-11667 ALWAYS_EXCEPT+=" 45 317" + # bug number: LU-14067 LU-14067 + ALWAYS_EXCEPT+=" 400a 400b" fi # skip nfs tests on kernels >= 4.12.0 until they are fixed @@ -80,11 +82,16 @@ fi if [ "$mds1_FSTYPE" = "zfs" ]; then # bug number for skipped test: - ALWAYS_EXCEPT="$ALWAYS_EXCEPT " + ALWAYS_EXCEPT+=" " # 13 (min)" [ "$SLOW" = "no" ] && EXCEPT_SLOW="$EXCEPT_SLOW 51b" fi +if [ "$ost1_FSTYPE" = "zfs" ]; then + # bug number for skipped test: LU-1941 LU-1941 LU-1941 LU-1941 + ALWAYS_EXCEPT+=" 130a 130b 130c 130d 130e 130f 130g" +fi + # Get the SLES distro version # # Returns a version string that should only be used in comparing @@ -234,12 +241,13 @@ test_0d() { # LU-3397 [ "$exp_val" == "$imp_val" ] || error "export flags '$exp_val' != import flags '$imp_val'" - # Compare the value of client version + # Compare client versions. Only compare top-3 fields for compatibility exp_client_version=$(awk '/target_version:/ { print $2 }' $temp_exp) - exp_val=$(version_code $exp_client_version) - imp_val=$CLIENT_VERSION + exp_val=$(version_code $(cut -d. -f1,2,3 <<<$exp_client_version)) + imp_val=$(version_code $(lustre_build_version client | cut -d. -f1,2,3)) [ "$exp_val" == "$imp_val" ] || - error "export client version '$exp_val' != '$imp_val'" + error "exp version '$exp_client_version'($exp_val) != " \ + "'$(lustre_build_version client)'($imp_val)" } run_test 0d "check export proc =============================" @@ -1443,6 +1451,23 @@ test_24F () { } run_test 24F "hash order vs readdir (LU-11330)" +test_24G () { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" + + local ino1 + local ino2 + + $LFS mkdir -i 0 $DIR/$tdir-0 || error "mkdir $tdir-0" + $LFS mkdir -i 1 $DIR/$tdir-1 || error "mkdir $tdir-1" + touch $DIR/$tdir-0/f1 || error "touch f1" + ln -s $DIR/$tdir-0/f1 $DIR/$tdir-0/s1 || error "ln s1" + ino1=$(stat -c%i $DIR/$tdir-0/s1) + mv $DIR/$tdir-0/s1 $DIR/$tdir-1 || error "mv s1" + ino2=$(stat -c%i $DIR/$tdir-1/s1) + [ $ino1 -ne $ino2 ] || error "s1 should be migrated" +} +run_test 24G "migrate symlink in rename" + test_25a() { echo '== symlink sanity =============================================' @@ -3333,6 +3358,21 @@ test_31p() { } run_test 31p "remove of open striped directory" +test_31q() { + [ $MDSCOUNT -lt 3 ] && skip_env "needs >= 3 MDTs" + + $LFS mkdir -i 3,1 $DIR/$tdir || error "mkdir failed" + index=$($LFS getdirstripe -i $DIR/$tdir) + [ $index -eq 3 ] || error "first stripe index $index != 3" + index=$($LFS getdirstripe $DIR/$tdir | tail -1 | awk '{print $1}') + [ $index -eq 1 ] || error "second stripe index $index != 1" + + # when "-c " is set, the number of MDTs specified after + # "-i" should equal to the stripe count + $LFS mkdir -i 3,1 -c 3 $DIR/$tdir.2 && error "mkdir should fail" || true +} +run_test 31q "create striped directory on specific MDTs" + cleanup_test32_mount() { local rc=0 trap 0 @@ -5963,6 +6003,8 @@ test_newerXY_base() { ref=$DIR/$tfile.newer.$x$y touch $ref || error "touch $ref failed" fi + + echo "before = $ref" sleep 2 setup_56 $dir $NUMFILES $NUMDIRS "-i0 -c1" "-i0 -c1" sleep 2 @@ -5977,28 +6019,28 @@ test_newerXY_base() { touch $negref || error "touch $negref failed" fi + echo "after = $negref" local cmd="$LFS find $dir -newer$x$y $ref" local nums=$(eval $cmd | wc -l) local expected=$(((NUMFILES + 2) * NUMDIRS + 1)) - [ $nums -eq $expected ] || - error "'$cmd' wrong: found $nums, expected $expected" + [ $nums -eq $expected ] || { ls -lauR --full-time $dir ; + error "'$cmd' wrong: found $nums newer, expected $expected" ; } cmd="$LFS find $dir ! -newer$x$y $negref" nums=$(eval $cmd | wc -l) - [ $nums -eq $expected ] || - error "'$cmd' wrong: found $nums, expected $expected" + [ $nums -eq $expected ] || { ls -lauR --full-time $dir ; + error "'$cmd' wrong: found $nums older, expected $expected" ; } cmd="$LFS find $dir -newer$x$y $ref ! -newer$x$y $negref" nums=$(eval $cmd | wc -l) - [ $nums -eq $expected ] || - error "'$cmd' wrong: found $nums, expected $expected" + [ $nums -eq $expected ] || { ls -lauR --full-time $dir ; + error "'$cmd' wrong: found $nums between, expected $expected"; } rm -rf $DIR/* } test_56oc() { - test_newerXY_base "b" "t" test_newerXY_base "a" "a" test_newerXY_base "a" "m" test_newerXY_base "a" "c" @@ -6008,10 +6050,19 @@ test_56oc() { test_newerXY_base "c" "a" test_newerXY_base "c" "m" test_newerXY_base "c" "c" - test_newerXY_base "b" "b" + + [[ -n "$sles_version" ]] && + echo "skip timestamp tests on SLES, LU-13665" && return 0 + test_newerXY_base "a" "t" test_newerXY_base "m" "t" test_newerXY_base "c" "t" + + [[ $MDS1_VERSION -lt $(version_code 2.13.54) || + $CLIENT_VERSION -lt $(version_code 2.13.54) ]] && + ! btime_supported && echo "btime unsupported" && return 0 + + test_newerXY_base "b" "b" test_newerXY_base "b" "t" } run_test 56oc "check lfs find -newerXY work" @@ -8364,7 +8415,11 @@ test_65n() { local file2_stripe_size=$($LFS getstripe -S $file2) [[ $file2_stripe_size -eq $new_def_stripe_size ]] || + { + echo "file2_stripe_size: '$file2_stripe_size'" + echo "new_def_stripe_size: '$new_def_stripe_size'" error "$file2 didn't inherit stripe size $new_def_stripe_size" + } local dir3=$MOUNT/$tdir-3 mkdir $dir3 || error "mkdir $dir3 failed" @@ -8374,7 +8429,11 @@ test_65n() { local dir3_layout=$(get_layout_param $dir3) local root_dir_layout=$(get_layout_param $MOUNT) [[ "$dir3_layout" = "$root_dir_layout" ]] || + { + echo "dir3_layout: '$dir3_layout'" + echo "root_dir_layout: '$root_dir_layout'" error "$dir3 should show the default layout from $MOUNT" + } # set OST pool on root directory local pool=$TESTNAME @@ -8392,7 +8451,7 @@ test_65n() { local file3_pool=$($LFS getstripe -p $file3) [[ "$file3_pool" = "$pool" ]] || - error "$file3 didn't inherit OST pool $pool" + error "$file3 ('$file3_pool') didn't inherit OST pool '$pool'" local dir4=$MOUNT/$tdir-4 mkdir $dir4 || error "mkdir $dir4 failed" @@ -8403,7 +8462,11 @@ test_65n() { echo "$LFS getstripe -d $MOUNT" $LFS getstripe -d $MOUNT [[ "$dir4_layout" = "$root_dir_layout" ]] || + { + echo "dir4_layout: '$dir4_layout'" + echo "root_dir_layout: '$root_dir_layout'" error "$dir4 should show the default layout from $MOUNT" + } # new file created in $dir4 should inherit the pool from # the filesystem default @@ -8412,7 +8475,7 @@ test_65n() { local file4_pool=$($LFS getstripe -p $file4) [[ "$file4_pool" = "$pool" ]] || - error "$file4 didn't inherit OST pool $pool" + error "$file4 ('$file4_pool') didn't inherit OST pool $pool" # new subdirectory under non-root directory should inherit # the default layout from its parent directory @@ -8425,7 +8488,11 @@ test_65n() { dir4_layout=$(get_layout_param $dir4) local dir5_layout=$(get_layout_param $dir5) [[ "$dir4_layout" = "$dir5_layout" ]] || + { + echo "dir4_layout: '$dir4_layout'" + echo "dir5_layout: '$dir5_layout'" error "$dir5 should inherit the default layout from $dir4" + } # though subdir under ROOT doesn't inherit default layout, but # its sub dir/file should be created with default layout. @@ -8642,7 +8709,7 @@ num_objects() { awk '/lustre_inode_cache/ { print $2; exit }' /proc/slabinfo } -test_76() { # Now for b=20433, added originally in b=1443 +test_76a() { # Now for b=20433, added originally in b=1443 [ $PARALLEL == "yes" ] && skip "skip parallel run" cancel_lru_locks osc @@ -8677,8 +8744,36 @@ test_76() { # Now for b=20433, added originally in b=1443 fi done } -run_test 76 "confirm clients recycle inodes properly ====" +run_test 76a "confirm clients recycle inodes properly ====" + +test_76b() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" + [ $CLIENT_VERSION -ge $(version_code 2.13.55) ] || skip "not supported" + + local count=512 + local before=$(num_objects) + + for i in $(seq $count); do + mkdir $DIR/$tdir + rmdir $DIR/$tdir + done + local after=$(num_objects) + local wait=0 + + while (( after > before )); do + sleep 1 + after=$(num_objects) + wait=$((wait + 1)) + (( wait % 5 == 0 )) && echo "wait $wait seconds objects: $after" + if (( wait > 60 )); then + error "inode slab grew from $before to $after" + fi + done + + echo "slab objects before: $before, after: $after" +} +run_test 76b "confirm clients recycle directory inodes properly ====" export ORIG_CSUM="" set_checksums() @@ -12564,38 +12659,30 @@ test_130e() { local fm_file=$DIR/$tfile $LFS setstripe -S 131072 -c 2 $fm_file || error "setstripe on $fm_file" - [ "$(facet_fstype ost$(($($LFS getstripe -i $fm_file) + 1)))" = "zfs" ] && - skip_env "ORI-366/LU-1941: FIEMAP unimplemented on ZFS" NUM_BLKS=512 EXPECTED_LEN=$(( (NUM_BLKS / 2) * 64 )) - for ((i = 0; i < $NUM_BLKS; i++)) - do - dd if=/dev/zero of=$fm_file count=1 bs=64k seek=$((2*$i)) conv=notrunc > /dev/null 2>&1 + for ((i = 0; i < $NUM_BLKS; i++)); do + dd if=/dev/zero of=$fm_file count=1 bs=64k seek=$((2*$i)) \ + conv=notrunc > /dev/null 2>&1 done filefrag -ves $fm_file || error "filefrag $fm_file failed" filefrag_op=$(filefrag -ve -k $fm_file | sed -n '/ext:/,/found/{/ext:/d; /found/d; p}') - last_lun=$(echo $filefrag_op | cut -d: -f5 | - sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/') + last_lun=$(echo $filefrag_op | cut -d: -f5) IFS=$'\n' tot_len=0 num_luns=1 - for line in $filefrag_op - do - frag_lun=$(echo $line | cut -d: -f5 | - sed -e 's/^[ \t]*/0x/' | sed -e 's/0x0x/0x/') + for line in $filefrag_op; do + frag_lun=$(echo $line | cut -d: -f5) ext_len=$(echo $line | cut -d: -f4) - if (( $frag_lun != $last_lun )); then + if [[ "$frag_lun" != "$last_lun" ]]; then if (( tot_len != $EXPECTED_LEN )); then cleanup_130 - error "FIEMAP on $fm_file failed; returned " \ - "len $tot_len for OST $last_lun instead " \ - "of $EXPECTED_LEN" - return + error "OST$last_lun $tot_len != $EXPECTED_LEN" else (( num_luns += 1 )) tot_len=0 @@ -12606,13 +12693,9 @@ test_130e() { done if (( num_luns != 2 || tot_len != $EXPECTED_LEN )); then cleanup_130 - error "FIEMAP on $fm_file failed; returned wrong number " \ - "of luns or wrong len for OST $last_lun" - return + error "OST$last_lun $num_luns != 2, $tot_len != $EXPECTED_LEN" fi - cleanup_130 - echo "FIEMAP with continuation calls succeeded" } run_test 130e "FIEMAP (test continuation FIEMAP calls)" @@ -12629,14 +12712,38 @@ test_130f() { filefrag_extents=$(filefrag -vek $fm_file | awk '/extents? found/ { print $2 }') if [[ "$filefrag_extents" != "0" ]]; then - error "FIEMAP on $fm_file failed; " \ - "returned $filefrag_extents expected 0" + error "$fm_file: filefrag_extents=$filefrag_extents != 0" fi rm -f $fm_file } run_test 130f "FIEMAP (unstriped file)" +test_130g() { + local file=$DIR/$tfile + local nr=$((OSTCOUNT * 100)) + + $LFS setstripe -C $nr $file || + error "failed to setstripe -C $nr $file" + + dd if=/dev/zero of=$file count=$nr bs=1M + sync + nr=$($LFS getstripe -c $file) + + local extents=$(filefrag -v $file | + sed -n '/ext:/,/found/{/ext:/d; /found/d; p}' | wc -l) + + echo "filefrag list $extents extents in file with stripecount $nr" + if (( extents < nr )); then + $LFS getstripe $file + filefrag -v $file + error "filefrag printed $extents < $nr extents" + fi + + rm -f $file +} +run_test 130g "FIEMAP (overstripe file)" + # Test for writev/readv test_131a() { rwv -f $DIR/$tfile -w -n 3 524288 1048576 1572864 || @@ -13299,6 +13406,7 @@ test_150a() { local TF="$TMP/$tfile" + stack_trap "rm -f $DIR/$tfile; wait_delete_completed" dd if=/dev/urandom of=$TF bs=6096 count=1 || error "dd failed" cp $TF $DIR/$tfile cancel_lru_locks $OSC @@ -13321,58 +13429,89 @@ test_150a() { echo "12345" >>$DIR/$tfile cancel_lru_locks $OSC cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append2)" - - rm -f $TF - true } run_test 150a "truncate/append tests" test_150b() { - [ "$ost1_FSTYPE" != ldiskfs ] && skip "non-ldiskfs backend" - [ $OST1_VERSION -lt $(version_code 2.13.50) ] && - skip "Need OST version at least 2.13.53" + check_for_fallocate + touch $DIR/$tfile + stack_trap "rm -f $DIR/$tfile; wait_delete_completed" check_fallocate $DIR/$tfile || error "fallocate failed" } run_test 150b "Verify fallocate (prealloc) functionality" -test_150c() { - local bytes - local want +test_150bb() { + check_for_fallocate + + touch $DIR/$tfile + stack_trap "rm -f $DIR/$tfile; wait_delete_completed" + dd if=/dev/urandom of=$DIR/$tfile bs=1M count=20 || error "dd failed" + > $DIR/$tfile + fallocate -l $((1048576 * 20)) $DIR/$tfile || error "fallocate failed" + # precomputed md5sum for 20MB of zeroes + local expect="8f4e33f3dc3e414ff94e5fb6905cba8c" + local sum=($(md5sum $DIR/$tfile)) - [ "$ost1_FSTYPE" != ldiskfs ] && skip "non-ldiskfs backend" - [ $OST1_VERSION -lt $(version_code 2.13.50) ] && - skip "Need OST version at least 2.13.53" + [[ "${sum[0]}" == "$expect" ]] || error "fallocate unwritten is not zero" - $LFS setstripe -c $OSTCOUNT -S1M $DIR/$tdir || error "setstripe failed" - fallocate -l ${OSTCOUNT}m $DIR/$tdir || error "fallocate failed" + do_nodes $(comma_list $(osts_nodes)) \ + "$LCTL set_param osd-ldiskfs.*.fallocate_zero_blocks=1" || + error "set osd-ldiskfs.*.fallocate_zero_blocks=1" + + > $DIR/$tfile + fallocate -l $((1048576 * 20)) $DIR/$tfile || error "fallocate failed" + sum=($(md5sum $DIR/$tfile)) + + [[ "${sum[0]}" == "$expect" ]] || error "fallocate zero is not zero" +} +run_test 150bb "Verify fallocate modes both zero space" + +test_150c() { + check_for_fallocate + + stack_trap "rm -f $DIR/$tfile; wait_delete_completed" + $LFS setstripe -c $OSTCOUNT -S1M $DIR/$tfile || error "setstripe failed" + fallocate -l ${OSTCOUNT}m $DIR/$tfile || error "fallocate failed" sync; sync_all_data cancel_lru_locks $OSC sleep 5 - bytes=$(($(stat -c '%b * %B' $DIR/$tdir))) + bytes=$(($(stat -c '%b * %B' $DIR/$tfile))) want=$((OSTCOUNT * 1048576)) # Must allocate all requested space, not more than 5% extra (( $bytes >= $want && $bytes < $want * 105 / 100 )) || error "bytes $bytes is not $want" + + rm -f $DIR/$tfile + # verify fallocate on PFL file + $LFS setstripe -E1M -c1 -E16M -c3 -Eeof -c 4 $DIR/$tfile || + error "Create $DIR/$tfile failed" + fallocate -l $((1048576 * 1024)) $DIR/$tfile || + error "fallocate failed" + sync; sync_all_data + cancel_lru_locks $OSC + sleep 5 + local bytes=$(($(stat -c '%b * %B' $DIR/$tfile))) + local want=$((1024 * 1048576)) + + # Must allocate all requested space, not more than 5% extra + (( $bytes >= $want && $bytes < $want * 105 / 100 )) || + error "bytes $bytes is not $want" } run_test 150c "Verify fallocate Size and Blocks" test_150d() { - local bytes - local want - - [ "$ost1_FSTYPE" != ldiskfs ] && skip "non-ldiskfs backend" - [ $OST1_VERSION -lt $(version_code 2.13.50) ] && - skip "Need OST version at least 2.13.53" + check_for_fallocate + stack_trap "rm -f $DIR/$tfile; wait_delete_completed" $LFS setstripe -c $OSTCOUNT -S1M $DIR/$tdir || error "setstripe failed" fallocate -o 1G -l ${OSTCOUNT}m $DIR/$tdir || error "fallocate failed" sync; sync_all_data cancel_lru_locks $OSC sleep 5 - bytes=$(($(stat -c '%b * %B' $DIR/$tdir))) - want=$((OSTCOUNT * 1048576)) + local bytes=$(($(stat -c '%b * %B' $DIR/$tdir))) + local want=$((OSTCOUNT * 1048576)) # Must allocate all requested space, not more than 5% extra (( $bytes >= $want && $bytes < $want * 105 / 100 )) || @@ -13380,6 +13519,55 @@ test_150d() { } run_test 150d "Verify fallocate Size and Blocks - Non zero start" +test_150e() { + check_for_fallocate + + echo "df before:" + $LFS df + stack_trap "rm -f $DIR/$tfile; wait_delete_completed" + $LFS setstripe -c${OSTCOUNT} $DIR/$tfile || + error "$LFS setstripe -c${OSTCOUNT} $DIR/$tfile failed" + + # Find OST with Minimum Size + min_size_ost=$($LFS df | awk "/$FSNAME-OST/ { print \$4 }" | + sort -un | head -1) + + # Get 100MB per OST of the available space to reduce run time + # else 60% of the available space if we are running SLOW tests + if [ $SLOW == "no" ]; then + local space=$((1024 * 100 * OSTCOUNT)) + else + local space=$(((min_size_ost * 60)/100 * OSTCOUNT)) + fi + + fallocate -l${space}k $DIR/$tfile || + error "fallocate ${space}k $DIR/$tfile failed" + echo "'fallocate -l ${space}k $DIR/$tfile' succeeded" + + # get size immediately after fallocate. This should be correctly + # updated + local size=$(stat -c '%s' $DIR/$tfile) + local used=$(( $(stat -c '%b * %B' $DIR/$tfile) / 1024)) + + # Sleep for a while for statfs to get updated. And not pull from cache. + sleep 2 + + echo "df after fallocate:" + $LFS df + + (( size / 1024 == space )) || error "size $size != requested $space" + [ "$ost1_FSTYPE" != ldiskfs ] || (( used >= space )) || + error "used $used < space $space" + + rm $DIR/$tfile || error "rm failed" + sync + wait_delete_completed + + echo "df after unlink:" + $LFS df +} +run_test 150e "Verify 60% of available OST space consumed by fallocate" + #LU-2902 roc_hit was not able to read all values from lproc function roc_hit_init() { local list=$(comma_list $(osts_nodes)) @@ -15076,8 +15264,7 @@ test_160l() { compare_mtime_changelog $DIR/$tdir/$tfile # Test CL_MTIME during close - dd if=/dev/urandom of=$DIR/$tdir/${tfile}_2 bs=1M count=64 || - error "cannot create file $DIR/$tdir/${tfile}_2" + $MULTIOP $DIR/$tdir/${tfile}_2 O_2w4096c || error "multiop failed" compare_mtime_changelog $DIR/$tdir/${tfile}_2 } run_test 160l "Verify that MTIME changelog records contain the parent FID" @@ -15453,8 +15640,11 @@ test_165a() { local rc local count - do_facet ost1 ofd_access_log_reader --debug=- --trace=- > "${trace}" & + (( $OST1_VERSION >= $(version_code 2.13.54) )) || + skip "OFD access log unsupported" + setup_165 + do_facet ost1 ofd_access_log_reader --debug=- --trace=- > "${trace}" & sleep 5 do_facet ost1 ofd_access_log_reader --list @@ -15486,13 +15676,19 @@ test_165b() { local size local flags + (( $OST1_VERSION >= $(version_code 2.13.54) )) || + skip "OFD access log unsupported" + setup_165 + do_facet ost1 ofd_access_log_reader --debug=- --trace=- > "${trace}" & + sleep 5 - lfs setstripe -c 1 -i 0 "${file}" - $MULTIOP "${file}" oO_CREAT:O_DIRECT:O_WRONLY:w1048576c || error "cannot create '${file}'" do_facet ost1 ofd_access_log_reader --list - do_facet ost1 ofd_access_log_reader --debug=- --trace=- > "${trace}" & + lfs setstripe -c 1 -i 0 "${file}" + $MULTIOP "${file}" oO_CREAT:O_DIRECT:O_WRONLY:w1048576c || + error "cannot create '${file}'" + sleep 5 do_facet ost1 killall -TERM ofd_access_log_reader wait @@ -15528,8 +15724,12 @@ test_165b() { fi do_facet ost1 ofd_access_log_reader --debug=- --trace=- > "${trace}" & - $MULTIOP "${file}" oO_CREAT:O_DIRECT:O_RDONLY:r524288c || error "cannot read '${file}'" sleep 5 + + $MULTIOP "${file}" oO_CREAT:O_DIRECT:O_RDONLY:r524288c || + error "cannot read '${file}'" + sleep 5 + do_facet ost1 killall -TERM ofd_access_log_reader wait rc=$? @@ -15561,89 +15761,202 @@ test_165b() { run_test 165b "ofd access log entries are produced and consumed" test_165c() { + local trace="/tmp/${tfile}.trace" local file="${DIR}/${tdir}/${tfile}" + + (( $OST1_VERSION >= $(version_code 2.13.54) )) || + skip "OFD access log unsupported" + test_mkdir "${DIR}/${tdir}" setup_165 + do_facet ost1 ofd_access_log_reader --debug=- --trace=- > "${trace}" & + sleep 5 lfs setstripe -c 1 -i 0 "${DIR}/${tdir}" # 4096 / 64 = 64. Create twice as many entries. for ((i = 0; i < 128; i++)); do - $MULTIOP "${file}-${i}" oO_CREAT:O_WRONLY:w512c || error "cannot create file" + $MULTIOP "${file}-${i}" oO_CREAT:O_WRONLY:w512c || + error "cannot create file" done sync - do_facet ost1 ofd_access_log_reader --list + + do_facet ost1 killall -TERM ofd_access_log_reader + wait + rc=$? + if ((rc != 0)); then + error "ofd_access_log_reader exited with rc = '${rc}'" + fi + unlinkmany "${file}-%d" 128 } run_test 165c "full ofd access logs do not block IOs" -oal_peek_entry_count() { - do_facet ost1 ofd_access_log_reader --list | awk '$1 == "_entry_count:" { print $2; }' +oal_get_read_count() { + local stats="$1" + + # STATS lustre-OST0001 alr_read_count 1 + + do_facet ost1 cat "${stats}" | + awk '$1 == "STATS" && $3 == "alr_read_count" { count = $4; } + END { print count; }' } -oal_expect_entry_count() { - local entry_count=$(oal_peek_entry_count) - local expect="$1" +oal_expect_read_count() { + local stats="$1" + local count + local expect="$2" + + # Ask ofd_access_log_reader to write stats. + do_facet ost1 killall -USR1 ofd_access_log_reader + + # Allow some time for things to happen. + sleep 1 - if ((entry_count == expect)); then + count=$(oal_get_read_count "${stats}") + if ((count == expect)); then return 0 fi - error_noexit "bad entry count, got ${entry_count}, expected ${expect}" - do_facet ost1 ofd_access_log_reader --list >&2 + error_noexit "bad read count, got ${count}, expected ${expect}" + do_facet ost1 cat "${stats}" >&2 exit 1 } test_165d() { - local trace="/tmp/${tfile}.trace" + local stats="/tmp/${tfile}.stats" local file="${DIR}/${tdir}/${tfile}" local param="obdfilter.${FSNAME}-OST0000.access_log_mask" - local entry_count + + (( $OST1_VERSION >= $(version_code 2.13.54) )) || + skip "OFD access log unsupported" + test_mkdir "${DIR}/${tdir}" setup_165 + do_facet ost1 ofd_access_log_reader --stats="${stats}" & + sleep 5 + lfs setstripe -c 1 -i 0 "${file}" do_facet ost1 lctl set_param "${param}=rw" - $MULTIOP "${file}" oO_CREAT:O_DIRECT:O_WRONLY:w1048576c || error "cannot create '${file}'" - oal_expect_entry_count 1 + $MULTIOP "${file}" oO_CREAT:O_DIRECT:O_WRONLY:w1048576c || + error "cannot create '${file}'" + oal_expect_read_count "${stats}" 1 - $MULTIOP "${file}" oO_CREAT:O_DIRECT:O_RDONLY:r1048576c || error "cannot read '${file}'" - oal_expect_entry_count 2 + $MULTIOP "${file}" oO_CREAT:O_DIRECT:O_RDONLY:r1048576c || + error "cannot read '${file}'" + oal_expect_read_count "${stats}" 2 do_facet ost1 lctl set_param "${param}=r" - $MULTIOP "${file}" oO_CREAT:O_DIRECT:O_WRONLY:w1048576c || error "cannot create '${file}'" - oal_expect_entry_count 2 + $MULTIOP "${file}" oO_CREAT:O_DIRECT:O_WRONLY:w1048576c || + error "cannot create '${file}'" + oal_expect_read_count "${stats}" 2 - $MULTIOP "${file}" oO_CREAT:O_DIRECT:O_RDONLY:r1048576c || error "cannot read '${file}'" - oal_expect_entry_count 3 + $MULTIOP "${file}" oO_CREAT:O_DIRECT:O_RDONLY:r1048576c || + error "cannot read '${file}'" + oal_expect_read_count "${stats}" 3 do_facet ost1 lctl set_param "${param}=w" - $MULTIOP "${file}" oO_CREAT:O_DIRECT:O_WRONLY:w1048576c || error "cannot create '${file}'" - oal_expect_entry_count 4 + $MULTIOP "${file}" oO_CREAT:O_DIRECT:O_WRONLY:w1048576c || + error "cannot create '${file}'" + oal_expect_read_count "${stats}" 4 - $MULTIOP "${file}" oO_CREAT:O_DIRECT:O_RDONLY:r1048576c || error "cannot read '${file}'" - oal_expect_entry_count 4 + $MULTIOP "${file}" oO_CREAT:O_DIRECT:O_RDONLY:r1048576c || + error "cannot read '${file}'" + oal_expect_read_count "${stats}" 4 do_facet ost1 lctl set_param "${param}=0" - $MULTIOP "${file}" oO_CREAT:O_DIRECT:O_WRONLY:w1048576c || error "cannot create '${file}'" - oal_expect_entry_count 4 + $MULTIOP "${file}" oO_CREAT:O_DIRECT:O_WRONLY:w1048576c || + error "cannot create '${file}'" + oal_expect_read_count "${stats}" 4 + + $MULTIOP "${file}" oO_CREAT:O_DIRECT:O_RDONLY:r1048576c || + error "cannot read '${file}'" + oal_expect_read_count "${stats}" 4 - $MULTIOP "${file}" oO_CREAT:O_DIRECT:O_RDONLY:r1048576c || error "cannot read '${file}'" - oal_expect_entry_count 4 + do_facet ost1 killall -TERM ofd_access_log_reader + wait + rc=$? + if ((rc != 0)); then + error "ofd_access_log_reader exited with rc = '${rc}'" + fi } run_test 165d "ofd_access_log mask works" +test_165e() { + local stats="/tmp/${tfile}.stats" + local file0="${DIR}/${tdir}-0/${tfile}" + local file1="${DIR}/${tdir}-1/${tfile}" + + (( $OST1_VERSION >= $(version_code 2.13.54) )) || + skip "OFD access log unsupported" + + [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs" + + test_mkdir -c 1 -i 0 "${DIR}/${tdir}-0" + test_mkdir -c 1 -i 1 "${DIR}/${tdir}-1" + + lfs setstripe -c 1 -i 0 "${file0}" + lfs setstripe -c 1 -i 0 "${file1}" + + setup_165 + do_facet ost1 ofd_access_log_reader -I 1 --stats="${stats}" & + sleep 5 + + $MULTIOP "${file0}" oO_CREAT:O_WRONLY:w512c || + error "cannot create '${file0}'" + sync + oal_expect_read_count "${stats}" 0 + + $MULTIOP "${file1}" oO_CREAT:O_WRONLY:w512c || + error "cannot create '${file1}'" + sync + oal_expect_read_count "${stats}" 1 + + do_facet ost1 killall -TERM ofd_access_log_reader + wait + rc=$? + if ((rc != 0)); then + error "ofd_access_log_reader exited with rc = '${rc}'" + fi +} +run_test 165e "ofd_access_log MDT index filter works" + +test_165f() { + local trace="/tmp/${tfile}.trace" + local rc + local count + + setup_165 + do_facet ost1 timeout 60 ofd_access_log_reader \ + --exit-on-close --debug=- --trace=- > "${trace}" & + sleep 5 + stop ost1 + + wait + rc=$? + + if ((rc != 0)); then + error_noexit "ofd_access_log_reader exited with rc = '${rc}'" + cat "${trace}" + exit 1 + fi +} +run_test 165f "ofd_access_log_reader --exit-on-close works" + test_169() { # do directio so as not to populate the page cache log "creating a 10 Mb file" - $MULTIOP $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file" + $MULTIOP $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || + error "multiop failed while creating a file" log "starting reads" dd if=$DIR/$tfile of=/dev/null bs=4096 & log "truncating the file" - $MULTIOP $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file" + $MULTIOP $DIR/$tfile oO_TRUNC:c || + error "multiop failed while truncating the file" log "killing dd" kill %+ || true # reads might have finished echo "wait until dd is finished" @@ -16022,8 +16335,9 @@ test_184c() { dd if=$ref1 of=$file1 bs=16k & local DD_PID=$! - # Make sure dd starts to copy file - while [ ! -f $file1 ]; do sleep 0.1; done + # Make sure dd starts to copy file, but wait at most 5 seconds + local loops=0 + while [ ! -s $file1 -a $((loops++)) -lt 50 ]; do sleep 0.1; done $LFS swap_layouts $file1 $file2 local rc=$? @@ -16579,6 +16893,13 @@ test_205a() { # Job stats verify_jobstats "touch $DIR/$tfile" $SINGLEMDS fi + if lctl set_param jobid_var=USER jobid_name="S.%j.%e.%u.%H.E"; then + JOBENV="JOBCOMPLEX" + JOBCOMPLEX="S.$USER.touch.$(id -u).$(hostname -s).E" + + verify_jobstats "touch $DIR/$tfile" $SINGLEMDS + fi + # test '%j' access to per-session jobid - if supported if lctl list_param jobid_this_session > /dev/null 2>&1 then @@ -18317,6 +18638,9 @@ test_230q() { local stripe_index local nr_files + # test with fewer files on ZFS + [ "$mds1_FSTYPE" == "zfs" ] && threshold=40 + stack_trap "do_nodes $mdts $LCTL set_param \ mdt.*.dir_split_count=$saved_threshold" stack_trap "do_nodes $mdts $LCTL set_param \ @@ -21519,6 +21843,56 @@ test_300r() { } run_test 300r "test -1 striped directory" +test_300s_helper() { + local count=$1 + + local stripe_dir=$DIR/$tdir/striped_dir.$count + + $LFS mkdir -c $count $stripe_dir || + error "lfs mkdir -c error" + + $LFS getdirstripe $stripe_dir || + error "lfs getdirstripe fails" + + local stripe_count + stripe_count=$($LFS getdirstripe $stripe_dir | + awk '/lmv_stripe_count:/ { print $2 }') + + [ $count -ne $stripe_count ] && + error_noexit "bad stripe count $stripe_count expected $count" + + local dupe_stripes + dupe_stripes=$($LFS getdirstripe $stripe_dir | + awk '/0x/ {count[$1] += 1}; END { + for (idx in count) { + if (count[idx]>1) { + print "index " idx " count " count[idx] + } + } + }') + + if [[ -n "$dupe_stripes" ]] ; then + lfs getdirstripe $stripe_dir + error_noexit "Dupe MDT above: $dupe_stripes " + fi + + rm -rf $stripe_dir || + error_noexit "unlink $stripe_dir fails" +} + +test_300s() { + [ $MDS1_VERSION -lt $(version_code 2.7.55) ] && + skip "Need MDS version at least 2.7.55" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + + mkdir $DIR/$tdir + for count in $(seq 2 $MDSCOUNT); do + test_300s_helper $count + done +} +run_test 300s "test lfs mkdir -c without -i" + + prepare_remote_file() { mkdir $DIR/$tdir/src_dir || error "create remote source failed" @@ -22077,6 +22451,13 @@ test_398d() { # LU-13846 } run_test 398d "run aiocp to verify block size > stripe size" +test_398e() { + dd if=/dev/zero of=$DIR/$tfile bs=1234 count=1 + touch $DIR/$tfile.new + dd if=$DIR/$tfile of=$DIR/$tfile.new bs=1M count=1 oflag=direct +} +run_test 398e "O_Direct open cleared by fcntl doesn't cause hang" + test_fake_rw() { local read_write=$1 if [ "$read_write" = "write" ]; then @@ -23448,6 +23829,261 @@ test_425() { } run_test 425 "lock count should not exceed lru size" +test_426() { + splice-test -r $DIR/$tfile + splice-test -rd $DIR/$tfile + splice-test $DIR/$tfile + splice-test -d $DIR/$tfile +} +run_test 426 "splice test on Lustre" + +lseek_test_430() { + local offset + local file=$1 + + # data at [200K, 400K) + dd if=/dev/urandom of=$file bs=256K count=1 seek=1 || + error "256K->512K dd fails" + # data at [2M, 3M) + dd if=/dev/urandom of=$file bs=1M count=1 seek=2 || + error "2M->3M dd fails" + # data at [4M, 5M) + dd if=/dev/urandom of=$file bs=1M count=1 seek=4 || + error "4M->5M dd fails" + echo "Data at 256K...512K, 2M...3M and 4M...5M" + # start at first component hole #1 + printf "Seeking hole from 1000 ... " + offset=$(lseek_test -l 1000 $file) + echo $offset + [[ $offset == 1000 ]] || error "offset $offset != 1000" + printf "Seeking data from 1000 ... " + offset=$(lseek_test -d 1000 $file) + echo $offset + [[ $offset == 262144 ]] || error "offset $offset != 262144" + + # start at first component data block + printf "Seeking hole from 300000 ... " + offset=$(lseek_test -l 300000 $file) + echo $offset + [[ $offset == 524288 ]] || error "offset $offset != 524288" + printf "Seeking data from 300000 ... " + offset=$(lseek_test -d 300000 $file) + echo $offset + [[ $offset == 300000 ]] || error "offset $offset != 300000" + + # start at the first component but beyond end of object size + printf "Seeking hole from 1000000 ... " + offset=$(lseek_test -l 1000000 $file) + echo $offset + [[ $offset == 1000000 ]] || error "offset $offset != 1000000" + printf "Seeking data from 1000000 ... " + offset=$(lseek_test -d 1000000 $file) + echo $offset + [[ $offset == 2097152 ]] || error "offset $offset != 2097152" + + # start at second component stripe 2 (empty file) + printf "Seeking hole from 1500000 ... " + offset=$(lseek_test -l 1500000 $file) + echo $offset + [[ $offset == 1500000 ]] || error "offset $offset != 1500000" + printf "Seeking data from 1500000 ... " + offset=$(lseek_test -d 1500000 $file) + echo $offset + [[ $offset == 2097152 ]] || error "offset $offset != 2097152" + + # start at second component stripe 1 (all data) + printf "Seeking hole from 3000000 ... " + offset=$(lseek_test -l 3000000 $file) + echo $offset + [[ $offset == 3145728 ]] || error "offset $offset != 3145728" + printf "Seeking data from 3000000 ... " + offset=$(lseek_test -d 3000000 $file) + echo $offset + [[ $offset == 3000000 ]] || error "offset $offset != 3000000" + + dd if=/dev/urandom of=$file bs=640K count=1 seek=1 || + error "2nd dd fails" + echo "Add data block at 640K...1280K" + + # start at before new data block, in hole + printf "Seeking hole from 600000 ... " + offset=$(lseek_test -l 600000 $file) + echo $offset + [[ $offset == 600000 ]] || error "offset $offset != 600000" + printf "Seeking data from 600000 ... " + offset=$(lseek_test -d 600000 $file) + echo $offset + [[ $offset == 655360 ]] || error "offset $offset != 655360" + + # start at the first component new data block + printf "Seeking hole from 1000000 ... " + offset=$(lseek_test -l 1000000 $file) + echo $offset + [[ $offset == 1310720 ]] || error "offset $offset != 1310720" + printf "Seeking data from 1000000 ... " + offset=$(lseek_test -d 1000000 $file) + echo $offset + [[ $offset == 1000000 ]] || error "offset $offset != 1000000" + + # start at second component stripe 2, new data + printf "Seeking hole from 1200000 ... " + offset=$(lseek_test -l 1200000 $file) + echo $offset + [[ $offset == 1310720 ]] || error "offset $offset != 1310720" + printf "Seeking data from 1200000 ... " + offset=$(lseek_test -d 1200000 $file) + echo $offset + [[ $offset == 1200000 ]] || error "offset $offset != 1200000" + + # start beyond file end + printf "Using offset > filesize ... " + lseek_test -l 4000000 $file && error "lseek should fail" + printf "Using offset > filesize ... " + lseek_test -d 4000000 $file && error "lseek should fail" + + printf "Done\n\n" +} + +test_430a() { + $LCTL get_param mdc.*.import | grep -q 'connect_flags:.*seek' || + skip "MDT does not support SEEK_HOLE" + + $LCTL get_param osc.*.import | grep -q 'connect_flags:.*seek' || + skip "OST does not support SEEK_HOLE" + + local file=$DIR/$tdir/$tfile + + mkdir -p $DIR/$tdir + + $LFS setstripe -E 1M -L mdt -E eof -c2 $file + # OST stripe #1 will have continuous data at [1M, 3M) + # OST stripe #2 is empty + echo "Component #1: 1M DoM, component #2: EOF, 2 stripes 1M" + lseek_test_430 $file + rm $file + $LFS setstripe -E 1M -c2 -S 64K -E 10M -c2 -S 1M $file + echo "Component #1: 1M, 2 stripes 64K, component #2: EOF, 2 stripes 1M" + lseek_test_430 $file + rm $file + $LFS setstripe -c2 -S 512K $file + echo "Two stripes, stripe size 512K" + lseek_test_430 $file + rm $file + # FLR with stale mirror + $LFS setstripe -N -E 512K -c1 -S 64K -E eof -c2 -S 512K \ + -N -c2 -S 1M $file + echo "Mirrored file:" + echo "Component #1: 512K, stripe 64K, component #2: EOF, 2 stripes 512K" + echo "Plain 2 stripes 1M" + lseek_test_430 $file + rm $file +} +run_test 430a "lseek: SEEK_DATA/SEEK_HOLE basic functionality" + +test_430b() { + $LCTL get_param osc.*.import | grep -q 'connect_flags:.*seek' || + skip "OST does not support SEEK_HOLE" + + local offset + local file=$DIR/$tdir/$tfile + + mkdir -p $DIR/$tdir + # Empty layout lseek should fail + $MCREATE $file + # seek from 0 + printf "Seeking hole from 0 ... " + lseek_test -l 0 $file && error "lseek should fail" + printf "Seeking data from 0 ... " + lseek_test -d 0 $file && error "lseek should fail" + rm $file + + # 1M-hole file + $LFS setstripe -E 1M -c2 -E eof $file + $TRUNCATE $file 1048576 + printf "Seeking hole from 1000000 ... " + offset=$(lseek_test -l 1000000 $file) + echo $offset + [[ $offset == 1000000 ]] || error "offset $offset != 1000000" + printf "Seeking data from 1000000 ... " + lseek_test -d 1000000 $file && error "lseek should fail" + rm $file + + # full component followed by non-inited one + $LFS setstripe -E 1M -c2 -E eof $file + dd if=/dev/urandom of=$file bs=1M count=1 + printf "Seeking hole from 1000000 ... " + offset=$(lseek_test -l 1000000 $file) + echo $offset + [[ $offset == 1048576 ]] || error "offset $offset != 1048576" + printf "Seeking hole from 1048576 ... " + lseek_test -l 1048576 $file && error "lseek should fail" + # init second component and truncate back + echo "123" >> $file + $TRUNCATE $file 1048576 + printf "Seeking hole from 1000000 ... " + offset=$(lseek_test -l 1000000 $file) + echo $offset + [[ $offset == 1048576 ]] || error "offset $offset != 1048576" + printf "Seeking hole from 1048576 ... " + lseek_test -l 1048576 $file && error "lseek should fail" + # boundary checks for big values + dd if=/dev/urandom of=$file.10g bs=1 count=1 seek=10G + offset=$(lseek_test -d 0 $file.10g) + [[ $offset == 10737418240 ]] || error "offset $offset != 10737418240" + dd if=/dev/urandom of=$file.100g bs=1 count=1 seek=100G + offset=$(lseek_test -d 0 $file.100g) + [[ $offset == 107374182400 ]] || error "offset $offset != 107374182400" + return 0 +} +run_test 430b "lseek: SEEK_DATA/SEEK_HOLE special cases" + +test_430c() { + $LCTL get_param osc.*.import | grep -q 'connect_flags:.*seek' || + skip "OST does not support SEEK_HOLE" + + local file=$DIR/$tdir/$tfile + local start + + mkdir -p $DIR/$tdir + dd if=/dev/urandom of=$file bs=1k count=1 seek=5M + + # cp version 8.33+ prefers lseek over fiemap + if [[ $(cp --version | head -n1 | sed "s/[^0-9]//g") -ge 833 ]]; then + start=$SECONDS + time cp $file /dev/null + (( SECONDS - start < 5 )) || + error "cp: too long runtime $((SECONDS - start))" + + fi + # tar version 1.29+ supports SEEK_HOLE/DATA + if [[ $(tar --version | head -n1 | sed "s/[^0-9]//g") -ge 129 ]]; then + start=$SECONDS + time tar cS $file - | cat > /dev/null + (( SECONDS - start < 5 )) || + error "tar: too long runtime $((SECONDS - start))" + fi +} +run_test 430c "lseek: external tools check" + +test_431() { # LU-14187 + local file=$DIR/$tdir/$tfile + + mkdir -p $DIR/$tdir + $LFS setstripe -c 1 -i 0 $file || error "lfs setstripe failed" + dd if=/dev/urandom of=$file bs=4k count=1 + dd if=/dev/urandom of=$file bs=4k count=1 seek=10 conv=notrunc + dd if=/dev/urandom of=$file bs=4k count=1 seek=12 conv=notrunc + #define OBD_FAIL_OST_RESTART_IO 0x251 + do_facet ost1 "$LCTL set_param fail_loc=0x251" + $LFS setstripe -c 1 -i 0 $file.0 || error "lfs setstripe failed" + cp $file $file.0 + cancel_lru_locks + sync_all_data + echo 3 > /proc/sys/vm/drop_caches + diff $file $file.0 || error "data diff" +} +run_test 431 "Restart transaction for IO" + prep_801() { [[ $MDS1_VERSION -lt $(version_code 2.9.55) ]] || [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] && @@ -23756,7 +24392,7 @@ test_802b() { } run_test 802b "be able to set MDTs to readonly" -test_803() { +test_803a() { [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs" [ $MDS1_VERSION -lt $(version_code 2.10.54) ] && skip "MDS needs to be newer than 2.10.54" @@ -23804,7 +24440,39 @@ test_803() { [ $after_used -le $((before_used + 1)) ] || error "after ($after_used) > before ($before_used) + 1" } -run_test 803 "verify agent object for remote object" +run_test 803a "verify agent object for remote object" + +test_803b() { + [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs" + [ $MDS1_VERSION -lt $(version_code 2.13.56) ] && + skip "MDS needs to be newer than 2.13.56" + [ $PARALLEL == "yes" ] && skip "skip parallel run" + + for i in $(seq 0 $((MDSCOUNT - 1))); do + $LFS mkdir -i $i $DIR/$tdir.$i || error "mkdir $tdir.$i" + done + + local before=0 + local after=0 + + local tmp + + stat $DIR/$tdir.* >/dev/null || error "stat $tdir.*" + for i in $(seq 0 $((MDSCOUNT - 1))); do + tmp=$(do_facet mds$i $LCTL get_param mdt.*-MDT000$i.md_stats | + awk '/getattr/ { print $2 }') + before=$((before + tmp)) + done + stat $DIR/$tdir.* >/dev/null || error "stat $tdir.*" + for i in $(seq 0 $((MDSCOUNT - 1))); do + tmp=$(do_facet mds$i $LCTL get_param mdt.*-MDT000$i.md_stats | + awk '/getattr/ { print $2 }') + after=$((after + tmp)) + done + + [ $before -eq $after ] || error "getattr count $before != $after" +} +run_test 803b "remote object can getattr from cache" test_804() { [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs" @@ -24203,8 +24871,6 @@ run_test 810 "partial page writes on ZFS (LU-11663)" test_812a() { [ $OST1_VERSION -lt $(version_code 2.12.51) ] && skip "OST < 2.12.51 doesn't support this fail_loc" - [ "$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 @@ -24226,8 +24892,6 @@ run_test 812a "do not drop reqs generated when imp is going to idle (LU-11951)" test_812b() { # LU-12378 [ $OST1_VERSION -lt $(version_code 2.12.51) ] && skip "OST < 2.12.51 doesn't support this fail_loc" - [ "$SHARED_KEY" = true ] && - skip "OSC connections never go IDLE with Shared-Keys enabled" $LFS setstripe -c 1 -i 0 $DIR/$tfile || error "setstripe failed" # ensure ost1 is connected @@ -24435,9 +25099,6 @@ 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" @@ -24546,8 +25207,18 @@ test_820() { # open intent should update default EA size # see mdc_update_max_ea_from_body() # notice this is the very first RPC to MDS2 - cp /etc/services $DIR/$tdir/mds2 || - error "Failed to copy files to mds$n" + out=$(cp /etc/services $DIR/$tdir/mds2 2>&1) + ret=$? + echo $out + # With SSK, this situation can lead to -EPERM being returned. + # In that case, simply retry. + if [ $ret -ne 0 ] && $SHARED_KEY; then + if echo "$out" | grep -q "not permitted"; then + cp /etc/services $DIR/$tdir/mds2 + ret=$? + fi + fi + [ $ret -eq 0 ] || error "Failed to copy files to mds$n" } run_test 820 "update max EA from open intent"