Whamcloud - gitweb
LU-13321 tests: force even DNE file distribution
[fs/lustre-release.git] / lustre / tests / sanity.sh
index c8b399a..3ff0118 100755 (executable)
@@ -31,8 +31,8 @@ GRANT_CHECK_LIST=${GRANT_CHECK_LIST:-""}
 export PARALLEL=${PARALLEL:-"no"}
 
 TRACE=${TRACE:-""}
-LUSTRE_TESTS_API_DIR=${LUSTRE_TESTS_API_DIR:-${LUSTRE}/tests/clientapi}
 LUSTRE=${LUSTRE:-$(dirname $0)/..}
+LUSTRE_TESTS_API_DIR=${LUSTRE_TESTS_API_DIR:-${LUSTRE}/tests/clientapi}
 . $LUSTRE/tests/test-framework.sh
 init_test_env $@
 
@@ -75,7 +75,7 @@ if (( $LINUX_VERSION_CODE >= $(version_code 4.18.0) &&
        ALWAYS_EXCEPT+=" 411"
 fi
 
-#                                  5          12          (min)"
+#                                  5          12     8   12  (min)"
 [ "$SLOW" = "no" ] && EXCEPT_SLOW="27m 64b 68 71 115 135 136 300o"
 
 if [ "$mds1_FSTYPE" = "zfs" ]; then
@@ -3749,6 +3749,46 @@ test_33g() {
 }
 run_test 33g "nonroot user create already existing root created file"
 
+test_33h() {
+       [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
+       [ $MDS1_VERSION -lt $(version_code 2.13.50) ] &&
+               skip "Need MDS version at least 2.13.50"
+
+       test_mkdir -c $MDSCOUNT -H crush $DIR/$tdir ||
+               error "mkdir $tdir failed"
+       touch $DIR/$tdir/$tfile || error "touch $tfile failed"
+
+       local index=$($LFS getstripe -m $DIR/$tdir/$tfile)
+       local index2
+
+       for fname in $DIR/$tdir/$tfile.bak \
+                    $DIR/$tdir/$tfile.SAV \
+                    $DIR/$tdir/$tfile.orig \
+                    $DIR/$tdir/$tfile~; do
+               touch $fname  || error "touch $fname failed"
+               index2=$($LFS getstripe -m $fname)
+               [ $index -eq $index2 ] ||
+                       error "$fname MDT index mismatch $index != $index2"
+       done
+
+       local failed=0
+       for i in {1..50}; do
+               for fname in $(mktemp -u $DIR/$tdir/.$tfile.XXXXXX) \
+                            $(mktemp $DIR/$tdir/$tfile.XXXXXXXX); do
+                       touch $fname  || error "touch $fname failed"
+                       index2=$($LFS getstripe -m $fname)
+                       if [[ $index != $index2 ]]; then
+                               failed=$((failed + 1))
+                               echo "$fname MDT index mismatch $index != $index2"
+                       fi
+               done
+       done
+       echo "$failed MDT index mismatches"
+       (( failed < 4 )) || error "MDT index mismatch $failed times"
+
+}
+run_test 33h "temp file is located on the same MDT as target"
+
 TEST_34_SIZE=${TEST_34_SIZE:-2000000000000}
 test_34a() {
        rm -f $DIR/f34
@@ -7573,8 +7613,8 @@ run_test 63b "async write errors should be returned to fsync ==="
 test_64a () {
        [ $PARALLEL == "yes" ] && skip "skip parallel run"
 
-       df $DIR
-       lctl get_param -n osc.*[oO][sS][cC][_-]*.cur* | grep "[0-9]"
+       lfs df $DIR
+       lctl get_param osc.*[oO][sS][cC][_-]*.cur* | grep "=[1-9]"
 }
 run_test 64a "verify filter grant calculations (in kernel) ====="
 
@@ -8237,28 +8277,27 @@ num_inodes() {
 test_76() { # Now for bug 20433, added originally in bug 1443
        [ $PARALLEL == "yes" ] && skip "skip parallel run"
 
-       local CPUS=$(getconf _NPROCESSORS_ONLN 2>/dev/null)
-
        cancel_lru_locks osc
-       BEFORE_INODES=$(num_inodes)
-       echo "before inodes: $BEFORE_INODES"
-       local COUNT=1000
-       [ "$SLOW" = "no" ] && COUNT=100
-       for i in $(seq $COUNT); do
+       local cpus=$(getconf _NPROCESSORS_ONLN 2>/dev/null)
+       local before=$(num_inodes)
+       local count=$((512 * cpus))
+       [ "$SLOW" = "no" ] && count=$((64 * cpus))
+
+       echo "before inodes: $before"
+       for i in $(seq $count); do
                touch $DIR/$tfile
                rm -f $DIR/$tfile
        done
        cancel_lru_locks osc
-       AFTER_INODES=$(num_inodes)
-       echo "after inodes: $AFTER_INODES"
-       local wait=0
-       while [[ $((AFTER_INODES-1*${CPUS:-1})) -gt $BEFORE_INODES ]]; do
-               sleep 2
-               AFTER_INODES=$(num_inodes)
-               wait=$((wait+2))
-               echo "wait $wait seconds inodes: $AFTER_INODES"
-               if [ $wait -gt 30 ]; then
-                       error "inode slab grew from $BEFORE_INODES to $AFTER_INODES"
+       local after=$(num_inodes)
+       echo "after inodes: $after"
+       while (( after > before + 8 * ${cpus:-1} )); do
+               sleep 1
+               after=$(num_inodes)
+               wait=$((wait + 1))
+               (( wait % 5 == 0 )) && echo "wait $wait seconds inodes: $after"
+               if (( wait > 30 )); then
+                       error "inode slab grew from $before to $after"
                fi
        done
 }
@@ -12740,7 +12779,7 @@ test_136() {
        local fname
 
        mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
-       $SETSTRIPE -c 1 -i 0 $DIR/$tdir || error "failed to set striping"
+       $LFS setstripe -c 1 -i 0 $DIR/$tdir || error "failed to set striping"
        #set only one record at plain llog
 #define OBD_FAIL_CATALOG_FULL_CHECK                0x131a
        do_facet $SINGLEMDS $LCTL set_param fail_loc=0x131a fail_val=1
@@ -13953,7 +13992,9 @@ test_160f() {
        local i
 
        # generate some changelog records to accumulate on each MDT
-       test_mkdir -c $MDSCOUNT $DIR/$tdir || error "test_mkdir $tdir failed"
+       # use fnv1a because created files should be evenly distributed
+       test_mkdir -c $MDSCOUNT -H fnv_1a_64 $DIR/$tdir ||
+               error "test_mkdir $tdir failed"
        log "$(date +%s): creating first files"
        createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
                error "create $DIR/$tdir/$tfile failed"
@@ -14079,7 +14120,9 @@ test_160g() {
        local i
 
        # generate some changelog records to accumulate on each MDT
-       test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
+       # use fnv1a because created files should be evenly distributed
+       test_mkdir -c $MDSCOUNT -H fnv_1a_64 $DIR/$tdir ||
+               error "mkdir $tdir failed"
        createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
                error "create $DIR/$tdir/$tfile failed"
 
@@ -14193,7 +14236,9 @@ test_160h() {
        local i
 
        # generate some changelog records to accumulate on each MDT
-       test_mkdir -c $MDSCOUNT $DIR/$tdir || error "test_mkdir $tdir failed"
+       # use fnv1a because created files should be evenly distributed
+       test_mkdir -c $MDSCOUNT -H fnv_1a_64 $DIR/$tdir ||
+               error "test_mkdir $tdir failed"
        createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
                error "create $DIR/$tdir/$tfile failed"
 
@@ -14342,7 +14387,9 @@ test_160i() {
        changelog_register || error "first changelog_register failed"
 
        # generate some changelog records to accumulate on each MDT
-       test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
+       # use fnv1a because created files should be evenly distributed
+       test_mkdir -c $MDSCOUNT -H fnv_1a_64 $DIR/$tdir ||
+               error "mkdir $tdir failed"
        createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
                error "create $DIR/$tdir/$tfile failed"
 
@@ -14407,7 +14454,9 @@ test_160j() {
        stack_trap "changelog_deregister" EXIT
 
        # generate some changelog
-       test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
+       # use fnv1a because created files should be evenly distributed
+       test_mkdir -c $MDSCOUNT -H fnv_1a_64 $DIR/$tdir ||
+               error "mkdir $tdir failed"
        createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
                error "create $DIR/$tdir/${tfile}bis failed"
 
@@ -14430,7 +14479,6 @@ test_160j() {
                error "User $cl_user not found in changelog_users"
 
        printf 'clear:'$cl_user':0' >&3
-
 }
 run_test 160j "client can be umounted  while its chanangelog is being used"
 
@@ -16683,6 +16731,27 @@ test_230b() {
        ln -s $migrate_dir/$tfile $migrate_dir/${tfile}_ln
        ln -s $other_dir/$tfile $migrate_dir/${tfile}_ln_other
 
+       local len
+       local lnktgt
+
+       # inline symlink
+       for len in 58 59 60; do
+               lnktgt=$(str_repeat 'l' $len)
+               touch $migrate_dir/$lnktgt
+               ln -s $lnktgt $migrate_dir/${len}char_ln
+       done
+
+       # PATH_MAX
+       for len in 4094 4095; do
+               lnktgt=$(str_repeat 'l' $len)
+               ln -s $lnktgt $migrate_dir/${len}char_ln
+       done
+
+       # NAME_MAX
+       for len in 254 255; do
+               touch $migrate_dir/$(str_repeat 'l' $len)
+       done
+
        $LFS migrate -m $MDTIDX $migrate_dir ||
                error "fails on migrating remote dir to MDT1"
 
@@ -16690,7 +16759,8 @@ test_230b() {
        for ((i = 0; i < 10; i++)); do
                for file in $(find $migrate_dir/dir_${i}); do
                        mdt_index=$($LFS getstripe -m $file)
-                       [ $mdt_index == $MDTIDX ] ||
+                       # broken symlink getstripe will fail
+                       [ $mdt_index -ne $MDTIDX ] && stat -L $file &&
                                error "$file is not on MDT${MDTIDX}"
                done
        done
@@ -16754,7 +16824,7 @@ test_230b() {
        echo "migrate back to MDT0, checking.."
        for file in $(find $migrate_dir); do
                mdt_index=$($LFS getstripe -m $file)
-               [ $mdt_index == $MDTIDX ] ||
+               [ $mdt_index -ne $MDTIDX ] && stat -L $file &&
                        error "$file is not on MDT${MDTIDX}"
        done
 
@@ -20474,7 +20544,7 @@ test_316() {
        chown nobody $DIR/$tdir/d
        touch $DIR/$tdir/d/file
 
-       $LFS mv -M1 $DIR/$tdir/d || error "lfs mv failed"
+       $LFS mv -m1 $DIR/$tdir/d || error "lfs mv failed"
 }
 run_test 316 "lfs mv"
 
@@ -20556,9 +20626,8 @@ test_318() {
                           llite.*.max_read_ahead_async_active 2>/dev/null)
        [ $max_active -ne 256 ] && error "expected 256 but got $max_active"
 
-       # currently reset to 0 is unsupported, leave it 512 for now.
-       $LCTL set_param llite.*.max_read_ahead_async_active=0 &&
-               error "set max_read_ahead_async_active should fail"
+       $LCTL set_param llite.*.max_read_ahead_async_active=0 ||
+               error "set max_read_ahead_async_active should succeed"
 
        $LCTL set_param llite.*.max_read_ahead_async_active=512
        max_active=$($LCTL get_param -n \
@@ -20801,6 +20870,10 @@ test_400a() { # LU-1606, was conf-sanity test_74
        local prefix=/usr/include/lustre
        local prog
 
+       # Oleg removes c files in his test rig so test if any c files exist
+       [ -z "$(ls -A $LUSTRE_TESTS_API_DIR)" ] && \
+               skip_env "Needed c test files are missing"
+
        if ! [[ -d $prefix ]]; then
                # Assume we're running in tree and fixup the include path.
                extra_flags+=" -I$LUSTRE/../lnet/include/uapi -I$LUSTRE/include/uapi -I$LUSTRE/include"
@@ -20808,7 +20881,7 @@ test_400a() { # LU-1606, was conf-sanity test_74
        fi
 
        for prog in $LUSTRE_TESTS_API_DIR/*.c; do
-               $CC -Wall -Werror $extra_flags -o $out $prog -llustreapi ||
+               $CC -Wall -Werror -std=c99 $extra_flags -o $out $prog -llustreapi ||
                        error "client api broken"
        done
        rm -f $out
@@ -20840,7 +20913,7 @@ test_400b() { # LU-1606, LU-5011
                        continue # lustre_ioctl.h is internal header
                fi
 
-               $CC -Wall -Werror -include $header -c -x c /dev/null -o $out ||
+               $CC -Wall -Werror -std=c99 -include $header -c -x c /dev/null -o $out ||
                        error "cannot compile '$header'"
        done
        rm -f $out