Whamcloud - gitweb
LU-11753 obdclass: lu_dirent record length missing '0'
[fs/lustre-release.git] / lustre / tests / sanity.sh
index a92bf03..8b1bc51 100755 (executable)
@@ -20,6 +20,13 @@ if $SHARED_KEY; then
        ALWAYS_EXCEPT="$ALWAYS_EXCEPT   17n     60a     133g    300f"
 fi
 
+if [[ $(uname -m) = aarch64 ]]; then
+       # bug number:    LU-11596 (all below)
+       ALWAYS_EXCEPT+=" 42d 42e 63a 63b 64a 64b 64c"
+       # bug number:    LU-11671 LU-11665 LU-11594 LU-11667 LU-11729
+       ALWAYS_EXCEPT+=" 45       101c     103a     317      810"
+fi
+
 # Check Grants after these tests
 GRANT_CHECK_LIST="$GRANT_CHECK_LIST 42a 42b 42c 42d 42e 63a 63b 64a 64b 64c"
 SRCDIR=$(cd $(dirname $0); echo $PWD)
@@ -110,10 +117,8 @@ elif [ -r /etc/os-release ]; then
 
                if [[ $ubuntu_version -gt $(version_code 16.0.0) ]]; then
                        # bug number for skipped test:
-                       #                LU-10334 LU-10335 LU-10335 LU-10335
-                       ALWAYS_EXCEPT+=" 103a     130a     130b     130c"
-                       #                LU-10335 LU-10335 LU-10366
-                       ALWAYS_EXCEPT+=" 130d     130e     410"
+                       #                LU-10334 LU-10366
+                       ALWAYS_EXCEPT+=" 103a     410"
                fi
        fi
 fi
@@ -15463,6 +15468,68 @@ test_230j() {
 }
 run_test 230j "DoM file data not changed after dir migration"
 
+test_230k() {
+       [ $MDSCOUNT -lt 4 ] && skip "needs >= 4 MDTs"
+       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.11.56) ] &&
+               skip "Need MDS version at least 2.11.56"
+
+       local total=20
+       local files_on_starting_mdt=0
+
+       $LFS mkdir -i -1 -c 2 $DIR/$tdir || error "mkdir failed"
+       $LFS getdirstripe $DIR/$tdir
+       for i in $(seq $total); do
+               echo $((i*i - i)) > $DIR/$tdir/$tfile.$i || error "write failed"
+               [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 0 ]] &&
+                       files_on_starting_mdt=$((files_on_starting_mdt + 1))
+       done
+
+       echo "$files_on_starting_mdt files on MDT0"
+
+       $LFS migrate -m 1,3 $DIR/$tdir || error "migrate -m 1,3 failed"
+       $LFS getdirstripe $DIR/$tdir
+
+       files_on_starting_mdt=0
+       for i in $(seq $total); do
+               $(echo $((i*i - i)) | cmp $DIR/$tdir/$tfile.$i -) ||
+                       error "file $tfile.$i mismatch after migration"
+               [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 1 ]] &&
+                       files_on_starting_mdt=$((files_on_starting_mdt + 1))
+       done
+
+       echo "$files_on_starting_mdt files on MDT1 after migration"
+       [[ $files_on_starting_mdt -eq $total ]] && error "all files on MDT1"
+
+       $LFS migrate -m 0 -c 2 $DIR/$tdir || error "migrate -m 0 -c 2 failed"
+       $LFS getdirstripe $DIR/$tdir
+
+       files_on_starting_mdt=0
+       for i in $(seq $total); do
+               $(echo $((i*i - i)) | cmp $DIR/$tdir/$tfile.$i -) ||
+                       error "file $tfile.$i mismatch after 2nd migration"
+               [[ $($LFS getstripe -m $DIR/$tdir/$tfile.$i) -eq 0 ]] &&
+                       files_on_starting_mdt=$((files_on_starting_mdt + 1))
+       done
+
+       echo "$files_on_starting_mdt files on MDT0 after 2nd migration"
+       [[ $files_on_starting_mdt -eq $total ]] && error "all files on MDT0"
+
+       true
+}
+run_test 230k "file data not changed after dir migration"
+
+test_230l() {
+       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
+       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.11.56) ] &&
+               skip "Need MDS version at least 2.11.56"
+
+       $LFS mkdir -i 0 -c 1 $DIR/$tdir || error "mkdir failed"
+       createmany -o $DIR/$tdir/f___________________________________ 1000 ||
+               error "create files under remote dir failed $i"
+       $LFS migrate -m 1 $DIR/$tdir || error "migrate failed"
+}
+run_test 230l "readdir between MDTs won't crash"
+
 test_231a()
 {
        # For simplicity this test assumes that max_pages_per_rpc
@@ -16778,7 +16845,7 @@ run_test 260 "Check mdc_close fail"
 ### Data-on-MDT sanity tests ###
 test_270a() {
        [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] &&
-               skip "Need MDS version at least 2.10.55"
+               skip "Need MDS version at least 2.10.55 for DoM"
 
        # create DoM file
        local dom=$DIR/$tdir/dom_file
@@ -16787,14 +16854,13 @@ test_270a() {
        mkdir -p $DIR/$tdir
 
        # basic checks for DoM component creation
-       $LFS setstripe -E 1024K -E 1024K -L mdt $dom 2>/dev/null &&
+       $LFS setstripe -E 1024K -E 2048K -L mdt $dom 2>/dev/null &&
                error "Can set MDT layout to non-first entry"
 
-       $LFS setstripe -E 1024K -L mdt -E 1024K -L mdt $dom 2>/dev/null &&
+       $LFS setstripe -E 1024K -L mdt -E 2048K -L mdt $dom 2>/dev/null &&
                error "Can define multiple entries as MDT layout"
 
-       $LFS setstripe -E 1M -L mdt $dom ||
-               error "Can't create DoM layout"
+       $LFS setstripe -E 1M -L mdt $dom || error "Can't create DoM layout"
 
        [ $($LFS getstripe -L $dom) == "mdt" ] || error "bad pattern"
        [ $($LFS getstripe -c $dom) == 0 ] || error "bad stripe count"
@@ -16806,46 +16872,61 @@ test_270a() {
        local space_check=1
 
        # Skip free space checks with ZFS
-       if [ "$(facet_fstype $facet)" == "zfs" ]; then
-               space_check=0
-       fi
+       [ "$(facet_fstype $facet)" == "zfs" ] && space_check=0
 
        # write
        sync
+       local size_tmp=$((65536 * 3))
        local mdtfree1=$(do_facet $facet \
-               lctl get_param -n osd*.*$mdtname.kbytesfree)
-       dd if=/dev/urandom of=$tmp bs=1024 count=100
+                        lctl get_param -n osd*.*$mdtname.kbytesfree)
+
+       dd if=/dev/urandom of=$tmp bs=1024 count=$((size_tmp / 1024))
        # check also direct IO along write
-       dd if=$tmp of=$dom bs=102400 count=1 oflag=direct
+       # IO size must be a multiple of PAGE_SIZE on all platforms (ARM=64KB)
+       dd if=$tmp of=$dom bs=65536 count=$((size_tmp / 65536)) oflag=direct
        sync
        cmp $tmp $dom || error "file data is different"
-       [ $(stat -c%s $dom) == 102400 ] || error "bad size after write"
+       [ $(stat -c%s $dom) == $size_tmp ] ||
+               error "bad size after write: $(stat -c%s $dom) != $size_tmp"
        if [ $space_check == 1 ]; then
                local mdtfree2=$(do_facet $facet \
-                               lctl get_param -n osd*.*$mdtname.kbytesfree)
-               [ $(($mdtfree1 - $mdtfree2)) -ge 102 ] ||
-                       error "MDT free space is wrong after write"
+                                lctl get_param -n osd*.*$mdtname.kbytesfree)
+
+               # increase in usage from by $size_tmp
+               [ $(($mdtfree1 - $mdtfree2)) -ge $((size_tmp / 1024)) ] ||
+                       error "MDT free space wrong after write: " \
+                             "$mdtfree1 >= $mdtfree2 + $size_tmp/1024"
        fi
 
        # truncate
-       $TRUNCATE $dom 10000
-       [ $(stat -c%s $dom) == 10000 ] || error "bad size after truncate"
+       local size_dom=10000
+
+       $TRUNCATE $dom $size_dom
+       [ $(stat -c%s $dom) == $size_dom ] ||
+               error "bad size after truncate: $(stat -c%s $dom) != $size_dom"
        if [ $space_check == 1 ]; then
                mdtfree1=$(do_facet $facet \
                                lctl get_param -n osd*.*$mdtname.kbytesfree)
-               [ $(($mdtfree1 - $mdtfree2)) -ge 92 ] ||
-                       error "MDT free space is wrong after truncate"
+               # decrease in usage from $size_tmp to new $size_dom
+               [ $(($mdtfree1 - $mdtfree2)) -ge \
+                 $(((size_tmp - size_dom) / 1024)) ] ||
+                       error "MDT free space is wrong after truncate: " \
+                             "$mdtfree1 >= $mdtfree2 + ($size_tmp - $size_dom) / 1024"
        fi
 
        # append
        cat $tmp >> $dom
        sync
-       [ $(stat -c%s $dom) == 112400 ] || error "bad size after append"
+       size_dom=$((size_dom + size_tmp))
+       [ $(stat -c%s $dom) == $size_dom ] ||
+               error "bad size after append: $(stat -c%s $dom) != $size_dom"
        if [ $space_check == 1 ]; then
                mdtfree2=$(do_facet $facet \
                                lctl get_param -n osd*.*$mdtname.kbytesfree)
-               [ $(($mdtfree1 - $mdtfree2)) -ge 102 ] ||
-                       error "MDT free space is wrong after append"
+               # increase in usage by $size_tmp from previous
+               [ $(($mdtfree1 - $mdtfree2)) -ge $((size_tmp / 1024)) ] ||
+                       error "MDT free space is wrong after append: " \
+                             "$mdtfree1 >= $mdtfree2 + $size_tmp/1024"
        fi
 
        # delete
@@ -16853,22 +16934,25 @@ test_270a() {
        if [ $space_check == 1 ]; then
                mdtfree1=$(do_facet $facet \
                                lctl get_param -n osd*.*$mdtname.kbytesfree)
-               [ $(($mdtfree1 - $mdtfree2)) -ge 112 ] ||
-                       error "MDT free space is wrong after removal"
+               # decrease in usage by $size_dom from previous
+               [ $(($mdtfree1 - $mdtfree2)) -ge $((size_dom / 1024)) ] ||
+                       error "MDT free space is wrong after removal: " \
+                             "$mdtfree1 >= $mdtfree2 + $size_dom/1024"
        fi
 
        # combined striping
        $LFS setstripe -E 1024K -L mdt -E EOF $dom ||
                error "Can't create DoM + OST striping"
 
-       dd if=/dev/urandom of=$tmp bs=1024 count=2000
+       size_tmp=2031616 # must be a multiple of PAGE_SIZE=65536 on ARM
+       dd if=/dev/urandom of=$tmp bs=1024 count=$((size_tmp / 1024))
        # check also direct IO along write
-       dd if=$tmp of=$dom bs=102400 count=20 oflag=direct
+       dd if=$tmp of=$dom bs=65536 count=$((size_tmp / 65536)) oflag=direct
        sync
        cmp $tmp $dom || error "file data is different"
-       [ $(stat -c%s $dom) == 2048000 ] || error "bad size after write"
-       rm $dom
-       rm $tmp
+       [ $(stat -c%s $dom) == $size_tmp ] ||
+               error "bad size after write: $(stat -c%s $dom) != $size_tmp"
+       rm $dom $tmp
 
        return 0
 }
@@ -19217,7 +19301,6 @@ test_415() {
 }
 run_test 415 "lock revoke is not missing"
 
-
 test_416() {
        [ $(lustre_version_code mds1) -lt $(version_code 2.11.55) ] &&
                skip "Need server version at least 2.11.55"
@@ -19231,6 +19314,42 @@ test_416() {
 }
 run_test 416 "transaction start failure won't cause system hung"
 
+cleanup_417() {
+       trap 0
+       do_nodes $(comma_list $(mdts_nodes)) \
+               "$LCTL set_param -n mdt.*MDT*.enable_dir_migration=1"
+       do_nodes $(comma_list $(mdts_nodes)) \
+               "$LCTL set_param -n mdt.*MDT*.enable_remote_dir=1"
+       do_nodes $(comma_list $(mdts_nodes)) \
+               "$LCTL set_param -n mdt.*MDT*.enable_striped_dir=1"
+}
+
+test_417() {
+       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+       [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.11.56) ]] &&
+               skip "Need MDS version at least 2.11.56" && return
+
+       trap cleanup_417 RETURN EXIT
+
+       $LFS mkdir -i 1 $DIR/$tdir.1 || error "create remote dir $tdir.1 failed"
+       do_nodes $(comma_list $(mdts_nodes)) \
+               "$LCTL set_param -n mdt.*MDT*.enable_dir_migration=0"
+       $LFS migrate -m 0 $DIR/$tdir.1 &&
+               error "migrate dir $tdir.1 should fail"
+
+       do_nodes $(comma_list $(mdts_nodes)) \
+               "$LCTL set_param -n mdt.*MDT*.enable_remote_dir=0"
+       $LFS mkdir -i 1 $DIR/$tdir.2 &&
+               error "create remote dir $tdir.2 should fail"
+
+       do_nodes $(comma_list $(mdts_nodes)) \
+               "$LCTL set_param -n mdt.*MDT*.enable_striped_dir=0"
+       $LFS mkdir -c 2 $DIR/$tdir.3 &&
+               error "create striped dir $tdir.3 should fail"
+       true
+}
+run_test 417 "disable remote dir, striped dir and dir migration"
+
 prep_801() {
        [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] ||
        [[ $(lustre_version_code ost1) -lt $(version_code 2.9.55) ]] &&
@@ -19516,11 +19635,12 @@ test_803() {
        done
 
        sync; sleep 3
+       wait_delete_completed # ensure old test cleanups are finished
        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
+       for i in {1..10}; do
                $LFS mkdir -c 1 -i 1 $DIR/$tdir/foo$i ||
                        error "Fail to create $DIR/$tdir/foo$i"
        done
@@ -19530,10 +19650,11 @@ test_803() {
        $LFS df -i $MOUNT
        local after_used=$($LFS df -i | grep MDT0000_UUID | awk '{print $3}')
 
-       [ $after_used -ge $((before_used + 10)) ] ||
+       # allow for an llog to be cleaned up during the test
+       [ $after_used -ge $((before_used + 10 - 1)) ] ||
                error "before ($before_used) + 10 > after ($after_used)"
 
-       for ((i=0; i<10; i++)); do
+       for i in {1..10}; do
                rm -rf $DIR/$tdir/foo$i ||
                        error "Fail to remove $DIR/$tdir/foo$i"
        done
@@ -19542,11 +19663,11 @@ test_803() {
        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)"
+       # allow for an llog to be created during the test
+       [ $after_used -le $((before_used + 1)) ] ||
+               error "after ($after_used) > before ($before_used) + 1"
 }
 run_test 803 "verify agent object for remote object"
 
@@ -19887,6 +20008,51 @@ test_808() {
 }
 run_test 808 "Check trusted.som xattr not logged in Changelogs"
 
+check_som_nodata()
+{
+       $LFS getsom $1
+       [[ $? -eq 61 ]] || error "DoM-only file $1 has SOM xattr"
+}
+
+test_809() {
+       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.11.56) ] &&
+               skip "Need MDS version at least 2.11.56" && return
+
+       $LFS setstripe -E 1M -L mdt $DIR/$tfile ||
+               error "failed to create DoM-only file $DIR/$tfile"
+       touch $DIR/$tfile || error "touch $tfile failed"
+       check_som_nodata $DIR/$tfile
+
+       dd if=/dev/zero of=$DIR/$tfile bs=2048 count=1 ||
+               error "write $tfile failed"
+       check_som_nodata $DIR/$tfile
+
+       $TRUNCATE $DIR/$tfile 1234
+       check_som_nodata $DIR/$tfile
+
+       $TRUNCATE $DIR/$tfile 4097
+       check_som_nodata $DIR/$file
+}
+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
+}
+run_test 810 "partial page writes on ZFS (LU-11663)"
+
 #
 # tests that do cleanup/setup should be run at the end
 #