Whamcloud - gitweb
LU-14286 osd-ldiskfs: don't read unwritten blocks
[fs/lustre-release.git] / lustre / tests / sanity.sh
index e01bdc8..fcde344 100755 (executable)
@@ -44,6 +44,11 @@ ALWAYS_EXCEPT+="               42a     42b     42c "
 # bug number:    LU-8411 LU-9054
 ALWAYS_EXCEPT+=" 407     312"
 
+if $SHARED_KEY; then
+       # bug number:    LU-14181 LU-14181
+       ALWAYS_EXCEPT+=" 64e      64f"
+fi
+
 selinux_status=$(getenforce)
 if [ "$selinux_status" != "Disabled" ]; then
        # bug number:
@@ -77,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
@@ -231,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 ============================="
 
@@ -3347,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 <stripe_count>" 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
@@ -12633,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
@@ -12675,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)"
@@ -12698,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 ||
@@ -13368,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
@@ -13390,9 +13429,6 @@ 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"
 
@@ -13401,10 +13437,27 @@ test_150b() {
        [ $OST1_VERSION -lt $(version_code 2.13.50) ] &&
                skip "Need OST version at least 2.13.53"
        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_150bb() {
+       [ "$ost1_FSTYPE" != ldiskfs ] && skip "non-ldiskfs backend"
+       [ $OST1_VERSION -lt $(version_code 2.13.50) ] &&
+               skip "Need OST version at least 2.13.53"
+       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"
+       local sum=($(md5sum $DIR/$tfile))
+       local expect="8f4e33f3dc3e414ff94e5fb6905cba8c"
+
+       [[ "${sum[0]}" == "$expect" ]] || error "fallocated file is not zero"
+}
+run_test 150bb "Verify fallocate zeroes space"
+
 test_150c() {
        local bytes
        local want
@@ -13413,17 +13466,34 @@ test_150c() {
        [ $OST1_VERSION -lt $(version_code 2.13.50) ] &&
                skip "Need OST version at least 2.13.53"
 
-       $LFS setstripe -c $OSTCOUNT -S1M $DIR/$tdir || error "setstripe failed"
-       fallocate -l ${OSTCOUNT}m $DIR/$tdir || error "fallocate failed"
+       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
+       bytes=$(($(stat -c '%b * %B' $DIR/$tfile)))
+       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"
 
@@ -13435,6 +13505,7 @@ test_150d() {
        [ $OST1_VERSION -lt $(version_code 2.13.50) ] &&
                skip "Need OST version at least 2.13.53"
 
+       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
@@ -13456,6 +13527,7 @@ test_150e() {
 
        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"
 
@@ -13463,8 +13535,13 @@ test_150e() {
        min_size_ost=$($LFS df | awk "/$FSNAME-OST/ { print \$4 }" |
                       sort -un | head -1)
 
-       # Get 90% of the available space
-       local space=$(((min_size_ost * 90)/100 * OSTCOUNT))
+       # 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"
@@ -13492,7 +13569,7 @@ test_150e() {
        echo "df after unlink:"
        $LFS df
 }
-run_test 150e "Verify 90% of available OST space consumed by fallocate"
+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() {
@@ -23925,7 +24002,10 @@ test_430b() {
        [[ $offset == 1000000 ]] || error "offset $offset != 1000000"
        printf "Seeking data from 1000000 ... "
        lseek_test -d 1000000 $file && error "lseek should fail"
-       # full first component, non-inited second one
+       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)
@@ -23936,7 +24016,6 @@ test_430b() {
        # init second component and truncate back
        echo "123" >> $file
        $TRUNCATE $file 1048576
-       ls -lia $file
        printf "Seeking hole from 1000000 ... "
        offset=$(lseek_test -l 1000000 $file)
        echo $offset
@@ -23982,6 +24061,25 @@ test_430c() {
 }
 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) ]] &&
@@ -25105,8 +25203,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"