Whamcloud - gitweb
LU-12043 llite: move tunable params to sysfs_memparse()
[fs/lustre-release.git] / lustre / tests / sanity.sh
old mode 100644 (file)
new mode 100755 (executable)
index 22af527..541fae3
@@ -64,10 +64,16 @@ if [[ $(uname -m) = aarch64 ]]; then
 fi
 
 # skip nfs tests on kernels >= 4.14.0 until they are fixed
-if [ $LINUX_VERSION_CODE -ge $(version_code 4.14.0) ];then
+if [ $LINUX_VERSION_CODE -ge $(version_code 4.14.0) ]; then
        # bug number:   LU-12661
        ALWAYS_EXCEPT+=" 817"
 fi
+# skip cgroup tests on RHEL8.1 kernels until they are fixed
+if (( $LINUX_VERSION_CODE >= $(version_code 4.18.0) &&
+      $LINUX_VERSION_CODE <  $(version_code 5.4.0) )); then
+       # bug number:   LU-13063
+       ALWAYS_EXCEPT+=" 411"
+fi
 
 #                                  5          12          (min)"
 [ "$SLOW" = "no" ] && EXCEPT_SLOW="27m 64b 68 71 115 135 136 300o"
@@ -550,11 +556,6 @@ test_17g() {
        [ $MDS1_VERSION -le $(version_code 2.3.55) ] &&
                TESTS="4094 4095"
 
-       # skip long symlink name for rhel6.5.
-       # rhel6.5 has a limit (PATH_MAX - sizeof(struct filename))
-       grep -q '6.5' /etc/redhat-release &>/dev/null &&
-               TESTS="59 60 61 4062 4063"
-
        for i in $TESTS; do
                local SYMNAME=$(str_repeat 'x' $i)
                ln -s $SYMNAME $DIR/$tdir/f$i || error "failed $i-char symlink"
@@ -2641,7 +2642,7 @@ test_27I() {
 run_test 27I "check that root dir striping does not break parent dir one"
 
 test_27J() {
-       [[ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.12.51) ]] &&
+       [[ $MDS1_VERSION -le $(version_code 2.12.51) ]] &&
                skip "Need MDS version newer than 2.12.51"
 
        test_mkdir $DIR/$tdir
@@ -2736,7 +2737,7 @@ test_27J() {
 run_test 27J "basic ops on file with foreign LOV"
 
 test_27K() {
-       [[ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.12.49) ]] &&
+       [[ $MDS1_VERSION -le $(version_code 2.12.49) ]] &&
                skip "Need MDS version newer than 2.12.49"
 
        test_mkdir $DIR/$tdir
@@ -7838,7 +7839,7 @@ run_test 65m "normal user can't set filesystem default stripe"
 
 test_65n() {
        [ -n "$FILESET" ] && skip "Not functional for FILESET set"
-       [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.12.50) ]] ||
+       [[ $MDS1_VERSION -ge $(version_code 2.12.50) ]] ||
                skip "Need MDS version at least 2.12.50"
        [[ $PARALLEL != "yes" ]] || skip "skip parallel run"
 
@@ -8931,11 +8932,6 @@ test_101c() {
 }
 run_test 101c "check stripe_size aligned read-ahead ================="
 
-set_read_ahead() {
-       $LCTL get_param -n llite.*.max_read_ahead_mb | head -n 1
-       $LCTL set_param -n llite.*.max_read_ahead_mb $1 > /dev/null 2>&1
-}
-
 test_101d() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run"
 
@@ -8955,7 +8951,10 @@ test_101d() {
        cancel_lru_locks osc
 
        echo Disable read-ahead
-       local old_READAHEAD=$(set_read_ahead 0)
+       local old_RA=$($LCTL get_param -n llite.*.max_read_ahead_mb | head -n 1)
+       $LCTL set_param -n llite.*.max_read_ahead_mb=0
+       stack_trap "$LCTL set_param -n llite.*.max_read_ahead_mb $old_RA" EXIT
+       $LCTL get_param -n llite.*.max_read_ahead_mb
 
        echo Reading the test file $file with read-ahead disabled
        local raOFF=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB")
@@ -8963,7 +8962,7 @@ test_101d() {
        echo Cancel LRU locks on lustre client to flush the client cache
        cancel_lru_locks osc
        echo Enable read-ahead with ${ra_MB}MB
-       set_read_ahead $ra_MB
+       $LCTL set_param -n llite.*.max_read_ahead_mb=$ra_MB
 
        echo Reading the test file $file with read-ahead enabled
        local raON=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB")
@@ -8971,7 +8970,6 @@ test_101d() {
        echo "read-ahead disabled time read $raOFF"
        echo "read-ahead enabled  time read $raON"
 
-       set_read_ahead $old_READAHEAD
        rm -f $file
        wait_delete_completed
 
@@ -11162,6 +11160,27 @@ test_123b () { # statahead(bug 15027)
 }
 run_test 123b "not panic with network error in statahead enqueue (bug 15027)"
 
+test_123c() {
+       [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
+
+       test_mkdir -i 0 -c 1 $DIR/$tdir.0
+       test_mkdir -i 1 -c 1 $DIR/$tdir.1
+       touch $DIR/$tdir.1/{1..3}
+       mv $DIR/$tdir.1/{1..3} $DIR/$tdir.0
+
+       remount_client $MOUNT
+
+       $MULTIOP $DIR/$tdir.0 Q
+
+       # let statahead to complete
+       ls -l $DIR/$tdir.0 > /dev/null
+
+       testid=$(echo $TESTNAME | tr '_' ' ')
+       dmesg | tac | sed "/$testid/,$ d" | grep "Can not initialize inode" &&
+               error "statahead warning" || true
+}
+run_test 123c "Can not initialize inode warning on DNE statahead"
+
 test_124a() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run"
        $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
@@ -12472,33 +12491,22 @@ test_133g() {
        remote_mds_nodsh && skip "remote MDS with nodsh"
        remote_ost_nodsh && skip "remote OST with nodsh"
 
-       # eventually, this can also be replaced with "lctl get_param -R",
-       # but not until that option is always available on the server
        local facet
        for facet in mds1 ost1; do
-               [ $(lustre_version_code $facet) -le $(version_code 2.5.54) ] &&
-                       skip_noexit "Too old lustre on $facet"
-               local facet_proc_dirs=$(do_facet $facet \
-                                       \\\ls -d $proc_regexp 2>/dev/null)
-               echo "${facet}_proc_dirs='$facet_proc_dirs'"
-               [ -z "$facet_proc_dirs" ] && error "no proc_dirs on $facet"
-               do_facet $facet find $facet_proc_dirs \
-                       ! -name req_history \
-                       -exec cat '{}' \\\; &> /dev/null
-
-               do_facet $facet find $facet_proc_dirs \
-                       ! -name req_history \
-                       -type f \
-                       -exec cat '{}' \\\; &> /dev/null ||
-                               error "proc file read failed"
-
-               do_facet $facet find $facet_proc_dirs \
-                       -ignore_readdir_race \
-                       -type f \
-                       -not -name force_lbug \
-                       -not -name changelog_mask \
-                       -exec badarea_io '{}' \\\; ||
-                               error_133 "$facet find $facet_proc_dirs failed"
+               local facet_ver=$(lustre_version_code $facet)
+               if [ $facet_ver -ge $(version_code 2.7.65) ]; then
+                       do_facet $facet "$LCTL get_param -R '*'" &> /dev/null
+               else
+                       log "$facet: too old lustre for get_param -R"
+               fi
+               if [ $facet_ver -ge $(version_code 2.5.54) ]; then
+                       do_facet $facet "$LCTL list_param -R '*' | grep '=' |
+                               tr -d= | egrep -v 'force_lbug|changelog_mask' |
+                               xargs badarea_io" ||
+                                       error_133 "$facet badarea_io failed"
+               else
+                       skip_noexit "$facet: too old lustre for get_param -R"
+               fi
        done
 
        # remount the FS in case writes/reads /proc break the FS
@@ -14312,8 +14320,10 @@ test_160j() {
                skip "Need MDS version at least 2.12.56"
 
        mount_client $MOUNT2 || error "mount_client on $MOUNT2 failed"
+       stack_trap "umount $MOUNT2" EXIT
 
        changelog_register || error "first changelog_register failed"
+       stack_trap "changelog_deregister" EXIT
 
        # generate some changelog
        test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
@@ -14322,10 +14332,13 @@ test_160j() {
 
        # open the changelog device
        exec 3>/dev/changelog-$FSNAME-MDT0000
+       stack_trap "exec 3>&-" EXIT
        exec 4</dev/changelog-$FSNAME-MDT0000
+       stack_trap "exec 4<&-" EXIT
 
        # umount the first lustre mount
        umount $MOUNT
+       stack_trap "mount_client $MOUNT" EXIT
 
        # read changelog
        cat <&4 >/dev/null || error "read changelog failed"
@@ -14337,15 +14350,6 @@ test_160j() {
 
        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"
 
@@ -16189,8 +16193,7 @@ test_224c() { # LU-6441
        save_writethrough $p
        set_cache writethrough on
 
-       local pages_per_rpc=$($LCTL get_param \
-                               osc.*.max_pages_per_rpc)
+       local pages_per_rpc=$($LCTL get_param osc.*.max_pages_per_rpc)
        local at_max=$($LCTL get_param -n at_max)
        local timeout=$($LCTL get_param -n timeout)
        local test_at="at_max"
@@ -20075,7 +20078,7 @@ test_300q() {
 run_test 300q "create remote directory under orphan directory"
 
 test_300r() {
-       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.55) ] &&
+       [ $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
 
@@ -20533,6 +20536,105 @@ test_319() {
 }
 run_test 319 "lost lease lock on migrate error"
 
+test_398a() { # LU-4198
+       $LFS setstripe -c 1 -i 0 $DIR/$tfile
+       $LCTL set_param ldlm.namespaces.*.lru_size=clear
+
+       # request a new lock on client
+       dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
+
+       dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=direct conv=notrunc
+       local lock_count=$($LCTL get_param -n \
+                          ldlm.namespaces.*-OST0000-osc-ffff*.lru_size)
+       [[ $lock_count -eq 0 ]] || error "lock should be cancelled by direct IO"
+
+       $LCTL set_param ldlm.namespaces.*-OST0000-osc-ffff*.lru_size=clear
+
+       # no lock cached, should use lockless IO and not enqueue new lock
+       dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=direct conv=notrunc
+       lock_count=$($LCTL get_param -n \
+                    ldlm.namespaces.*-OST0000-osc-ffff*.lru_size)
+       [[ $lock_count -eq 0 ]] || error "no lock should be held by direct IO"
+}
+run_test 398a "direct IO should cancel lock otherwise lockless"
+
+test_398b() { # LU-4198
+       which fio || skip_env "no fio installed"
+       $LFS setstripe -c -1 $DIR/$tfile
+
+       local size=12
+       dd if=/dev/zero of=$DIR/$tfile bs=1M count=$size
+
+       local njobs=4
+       echo "mix direct rw ${size}M to OST0 by fio with $njobs jobs..."
+       fio --name=rand-rw --rw=randrw --bs=$PAGE_SIZE --direct=1 \
+               --numjobs=$njobs --fallocate=none \
+               --iodepth=16 --allow_file_create=0 --size=$((size/njobs))M \
+               --filename=$DIR/$tfile &
+       bg_pid=$!
+
+       echo "mix buffer rw ${size}M to OST0 by fio with $njobs jobs..."
+       fio --name=rand-rw --rw=randrw --bs=$PAGE_SIZE \
+               --numjobs=$njobs --fallocate=none \
+               --iodepth=16 --allow_file_create=0 --size=$((size/njobs))M \
+               --filename=$DIR/$tfile || true
+       wait $bg_pid
+
+       rm -rf $DIR/$tfile
+}
+run_test 398b "DIO and buffer IO race"
+
+test_398c() { # LU-4198
+       which fio || skip_env "no fio installed"
+
+       saved_debug=$($LCTL get_param -n debug)
+       $LCTL set_param debug=0
+
+       local size=$(lctl get_param -n osc.$FSNAME-OST0000*.kbytesavail | head -1)
+       ((size /= 1024)) # by megabytes
+       ((size /= 2)) # write half of the OST at most
+       [ $size -gt 40 ] && size=40 #reduce test time anyway
+
+       $LFS setstripe -c 1 $DIR/$tfile
+
+       # it seems like ldiskfs reserves more space than necessary if the
+       # writing blocks are not mapped, so it extends the file firstly
+       dd if=/dev/zero of=$DIR/$tfile bs=1M count=$size && sync
+       cancel_lru_locks osc
+
+       # clear and verify rpc_stats later
+       $LCTL set_param osc.${FSNAME}-OST0000-osc-ffff*.rpc_stats=clear
+
+       local njobs=4
+       echo "writing ${size}M to OST0 by fio with $njobs jobs..."
+       fio --name=rand-write --rw=randwrite --bs=$PAGE_SIZE --direct=1 \
+               --numjobs=$njobs --fallocate=none --ioengine=libaio \
+               --iodepth=16 --allow_file_create=0 --size=$((size/njobs))M \
+               --filename=$DIR/$tfile
+       [ $? -eq 0 ] || error "fio write error"
+
+       [ $($LCTL get_param -n \
+        ldlm.namespaces.${FSNAME}-OST0000-osc-ffff*.lock_count) -eq 0 ] ||
+               error "Locks were requested while doing AIO"
+
+       # get the percentage of 1-page I/O
+       pct=$($LCTL get_param osc.${FSNAME}-OST0000-osc-ffff*.rpc_stats |
+               grep -A 1 'pages per rpc' | grep -v 'pages per rpc' |
+               awk '{print $7}')
+       [ $pct -le 50 ] || error "$pct% of I/O are 1-page"
+
+       echo "mix rw ${size}M to OST0 by fio with $njobs jobs..."
+       fio --name=rand-rw --rw=randrw --bs=$PAGE_SIZE --direct=1 \
+               --numjobs=$njobs --fallocate=none --ioengine=libaio \
+               --iodepth=16 --allow_file_create=0 --size=$((size/njobs))M \
+               --filename=$DIR/$tfile
+       [ $? -eq 0 ] || error "fio mixed read write error"
+
+       rm -rf $DIR/$tfile
+       $LCTL set_param debug="$saved_debug"
+}
+run_test 398c "run fio to test AIO"
+
 test_fake_rw() {
        local read_write=$1
        if [ "$read_write" = "write" ]; then
@@ -21046,7 +21148,7 @@ run_test 411 "Slab allocation error with cgroup does not LBUG"
 
 test_412() {
        [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
-       if [ $(lustre_version_code mds1) -lt $(version_code 2.10.55) ]; then
+       if [ $MDS1_VERSION -lt $(version_code 2.10.55) ]; then
                skip "Need server version at least 2.10.55"
        fi
 
@@ -21314,7 +21416,7 @@ run_test 414 "simulate ENOMEM in ptlrpc_register_bulk()"
 
 test_415() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run"
-       [ $(lustre_version_code mds1) -lt $(version_code 2.11.52) ] &&
+       [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
                skip "Need server version at least 2.11.52"
 
        # LU-11102
@@ -21356,7 +21458,7 @@ test_415() {
 run_test 415 "lock revoke is not missing"
 
 test_416() {
-       [ $(lustre_version_code mds1) -lt $(version_code 2.11.55) ] &&
+       [ $MDS1_VERSION -lt $(version_code 2.11.55) ] &&
                skip "Need server version at least 2.11.55"
 
        # define OBD_FAIL_OSD_TXN_START    0x19a
@@ -21811,7 +21913,7 @@ test_422() {
 run_test 422 "kill a process with RPC in progress"
 
 prep_801() {
-       [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] ||
+       [[ $MDS1_VERSION -lt $(version_code 2.9.55) ]] ||
        [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&
                skip "Need server version at least 2.9.55"
 
@@ -22042,7 +22144,7 @@ cleanup_802a() {
 
 test_802a() {
        [[ $mds1_FSTYPE = zfs ]] || skip "ZFS specific test"
-       [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] ||
+       [[ $MDS1_VERSION -lt $(version_code 2.9.55) ]] ||
        [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&
                skip "Need server version at least 2.9.55"
 
@@ -22561,7 +22663,7 @@ test_810() {
 run_test 810 "partial page writes on ZFS (LU-11663)"
 
 test_811() {
-       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.11.56) ] &&
+       [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
                skip "Need MDS version at least 2.11.56"
 
        #define OBD_FAIL_MDS_ORPHAN_DELETE      0x165
@@ -22571,8 +22673,7 @@ test_811() {
        stop mds1
        start mds1 $(mdsdevname 1) $MDS_MOUNT_OPTS
 
-       sleep 5
-       [[ $(do_facet mds1 pgrep orph_.*-MDD | wc -l) -eq 0 ]] ||
+       wait_update_facet mds1 "pgrep orph_.*-MDD | wc -l" "0" ||
                error "MDD orphan cleanup thread not quit"
 }
 run_test 811 "orphan name stub can be cleaned up in startup"
@@ -22892,6 +22993,42 @@ test_819b() {
 }
 run_test 819b "too big niobuf in write"
 
+
+function test_820_start_ost() {
+       sleep 5
+
+       for num in $(seq $OSTCOUNT); do
+               start ost$num $(ostdevname $num) $OST_MOUNT_OPTS
+       done
+}
+
+test_820() {
+       [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
+
+       mkdir $DIR/$tdir
+       umount_client $MOUNT || error "umount failed"
+       for num in $(seq $OSTCOUNT); do
+               stop ost$num
+       done
+
+       # mount client with no active OSTs
+       # so that the client can't initialize max LOV EA size
+       # from OSC notifications
+       mount_client $MOUNT || error "mount failed"
+       # delay OST starting to keep this 0 max EA size for a while
+       test_820_start_ost &
+
+       # create a directory on MDS2
+       test_mkdir -i 1 -c1 $DIR/$tdir/mds2 ||
+               error "Failed to create directory"
+       # 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"
+}
+run_test 820 "update max EA from open intent"
+
 #
 # tests that do cleanup/setup should be run at the end
 #