Whamcloud - gitweb
LU-12865 tests: fix sanity 160f to be more robust
[fs/lustre-release.git] / lustre / tests / sanity.sh
index a794bbf..c3aa385 100644 (file)
@@ -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 LU-12781
-       ALWAYS_EXCEPT+=" 17n     60a     133g    300f    272a"
+       # bug number:    LU-9795 LU-9795 LU-9795 LU-9795
+       ALWAYS_EXCEPT+=" 17n     60a     133g    300f"
 fi
 
 selinux_status=$(getenforce)
@@ -59,12 +59,18 @@ fi
 if [[ $(uname -m) = aarch64 ]]; then
        # bug number:    LU-11596
        ALWAYS_EXCEPT+=" $GRANT_CHECK_LIST"
-       # bug number:    LU-11671 LU-11667 LU-4398
-       ALWAYS_EXCEPT+=" 45       317      817"
+       # bug number:    LU-11671 LU-11667
+       ALWAYS_EXCEPT+=" 45       317"
+fi
+
+# skip nfs tests on kernels >= 4.14.0 until they are fixed
+if [ $LINUX_VERSION_CODE -ge $(version_code 4.14.0) ];then
+       # bug number:   LU-12661
+       ALWAYS_EXCEPT+=" 817"
 fi
 
 #                                  5          12          (min)"
-[ "$SLOW" = "no" ] && EXCEPT_SLOW="27m 64b 68 71 115 300o"
+[ "$SLOW" = "no" ] && EXCEPT_SLOW="27m 64b 68 71 115 135 136 300o"
 
 if [ "$mds1_FSTYPE" = "zfs" ]; then
        # bug number for skipped test:
@@ -4981,7 +4987,7 @@ test_49() { # LU-1030
        [ $PARALLEL == "yes" ] && skip "skip parallel run"
        remote_ost_nodsh && skip "remote OST with nodsh"
 
-       # get ost1 size - lustre-OST0000
+       # get ost1 size - $FSNAME-OST0000
        ost1_size=$(do_facet ost1 $LFS df | grep ${ost1_svc} |
                awk '{ print $4 }')
        # write 800M at maximum
@@ -5744,6 +5750,65 @@ test_56ob() {
 }
 run_test 56ob "check lfs find -atime -mtime -ctime with units"
 
+test_newerXY_base() {
+       local x=$1
+       local y=$2
+       local dir=$DIR/$tdir
+       local ref
+       local negref
+
+       if [ $y == "t" ]; then
+               ref="\"$(date +"%Y-%m-%d %H:%M:%S")\""
+       else
+               ref=$DIR/$tfile.newer
+               touch $ref || error "touch $ref failed"
+       fi
+       sleep 2
+       setup_56 $dir $NUMFILES $NUMDIRS "-i0 -c1" "-i0 -c1"
+       sleep 2
+       if [ $y == "t" ]; then
+               negref="\"$(date +"%Y-%m-%d %H:%M:%S")\""
+       else
+               negref=$DIR/$tfile.newerneg
+               touch $negref || error "touch $negref failed"
+       fi
+
+       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"
+
+       cmd="$LFS find $dir ! -newer$x$y $negref"
+       nums=$(eval $cmd | wc -l)
+       [ $nums -eq $expected ] ||
+               error "'$cmd' wrong: found $nums, 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"
+
+       rm -rf $DIR/*
+}
+
+test_56oc() {
+       test_newerXY_base "a" "a"
+       test_newerXY_base "a" "m"
+       test_newerXY_base "a" "c"
+       test_newerXY_base "m" "a"
+       test_newerXY_base "m" "m"
+       test_newerXY_base "m" "c"
+       test_newerXY_base "c" "a"
+       test_newerXY_base "c" "m"
+       test_newerXY_base "c" "c"
+       test_newerXY_base "a" "t"
+       test_newerXY_base "m" "t"
+       test_newerXY_base "c" "t"
+}
+run_test 56oc "check lfs find -newerXY work"
+
 test_56p() {
        [ $RUNAS_ID -eq $UID ] &&
                skip_env "RUNAS_ID = UID = $UID -- skipping"
@@ -7816,8 +7881,13 @@ test_65n() {
 
        local dir3=$MOUNT/$tdir-3
        mkdir $dir3 || error "mkdir $dir3 failed"
-       ! getfattr -n trusted.lov $dir3 &> /dev/null ||
-               error "$dir3 shouldn't have LOV EA"
+       # $dir3 shouldn't have LOV EA, but "lfs getstripe -d $dir3" should show
+       # the root layout, which is the actual default layout that will be used
+       # when new files are created in $dir3.
+       local dir3_layout=$(get_layout_param $dir3)
+       local root_dir_layout=$(get_layout_param $MOUNT)
+       [[ "$dir3_layout" = "$root_dir_layout" ]] ||
+               error "$dir3 should show the default layout from $MOUNT"
 
        # set OST pool on root directory
        local pool=$TESTNAME
@@ -7839,8 +7909,14 @@ test_65n() {
 
        local dir4=$MOUNT/$tdir-4
        mkdir $dir4 || error "mkdir $dir4 failed"
-       ! getfattr -n trusted.lov $dir4 &> /dev/null ||
-               error "$dir4 shouldn't have LOV EA"
+       local dir4_layout=$(get_layout_param $dir4)
+       root_dir_layout=$(get_layout_param $MOUNT)
+       echo "$LFS getstripe -d $dir4"
+       $LFS getstripe -d $dir4
+       echo "$LFS getstripe -d $MOUNT"
+       $LFS getstripe -d $MOUNT
+       [[ "$dir4_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
@@ -7859,7 +7935,7 @@ test_65n() {
        local dir5=$dir4/$tdir-5
        mkdir $dir5 || error "mkdir $dir5 failed"
 
-       local dir4_layout=$(get_layout_param $dir4)
+       dir4_layout=$(get_layout_param $dir4)
        local dir5_layout=$(get_layout_param $dir5)
        [[ "$dir4_layout" = "$dir5_layout" ]] ||
                error "$dir5 should inherit the default layout from $dir4"
@@ -8521,31 +8597,35 @@ test_80() { # bug 10718
        [ $PARALLEL == "yes" ] && skip "skip parallel run"
 
        # relax strong synchronous semantics for slow backends like ZFS
-       local soc="obdfilter.*.sync_on_lock_cancel"
-       local soc_old=$(do_facet ost1 lctl get_param -n $soc | head -n1)
-       local hosts=
-       if [ "$soc_old" != "never" ] &&
-               [ "$ost1_FSTYPE" != "ldiskfs" ]; then
-                       hosts=$(for host in $(seq -f "ost%g" 1 $OSTCOUNT); do
-                               facet_active_host $host; done | sort -u)
-                       do_nodes $hosts lctl set_param $soc=never
-       fi
+       if [ "$ost1_FSTYPE" != "ldiskfs" ]; then
+               local soc="obdfilter.*.sync_lock_cancel"
+               local save=$(do_facet ost1 $LCTL get_param -n $soc | head -n1)
 
-        dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1M
-        sync; sleep 1; sync
-        local BEFORE=`date +%s`
-        cancel_lru_locks osc
-        local AFTER=`date +%s`
-        local DIFF=$((AFTER-BEFORE))
-        if [ $DIFF -gt 1 ] ; then
-                error "elapsed for 1M@1T = $DIFF"
-        fi
+               # "sync_on_lock_cancel" was broken by v2_11_55_0-26-g7059644e9a
+               if [ -z "$save" ]; then
+                       soc="obdfilter.*.sync_on_lock_cancel"
+                       save=$(do_facet ost1 $LCTL get_param -n $soc | head -n1)
+               fi
 
-        [ -n "$hosts" ] && do_nodes $hosts lctl set_param $soc=$soc_old
+               if [ "$save" != "never" ]; then
+                       local hosts=$(comma_list $(osts_nodes))
 
-        rm -f $DIR/$tfile
+                       do_nodes $hosts $LCTL set_param $soc=never
+                       stack_trap "do_nodes $hosts $LCTL set_param $soc=$save"
+               fi
+       fi
+
+       dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1M
+       sync; sleep 1; sync
+       local before=$(date +%s)
+       cancel_lru_locks osc
+       local after=$(date +%s)
+       local diff=$((after - before))
+       [ $diff -le 1 ] || error "elapsed for 1M@1T = $diff"
+
+       rm -f $DIR/$tfile
 }
-run_test 80 "Page eviction is equally fast at high offsets too  ===="
+run_test 80 "Page eviction is equally fast at high offsets too"
 
 test_81a() { # LU-456
        [ $PARALLEL == "yes" ] && skip "skip parallel run"
@@ -12534,6 +12614,73 @@ test_134b() {
 }
 run_test 134b "Server rejects lock request when reaching lock_limit_mb"
 
+test_135() {
+       remote_mds_nodsh && skip "remote MDS with nodsh"
+       [[ $MDS1_VERSION -lt $(version_code 2.13.50) ]] &&
+               skip "Need MDS version at least 2.13.50"
+       local fname
+
+       mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
+
+#define OBD_FAIL_PLAIN_RECORDS 0x1319
+       #set only one record at plain llog
+       do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1319 fail_val=1
+
+       #fill already existed plain llog each 64767
+       #wrapping whole catalog
+       createmany -o -u $DIR/$tdir/$tfile- $((64767 * 1))
+
+       createmany -o $DIR/$tdir/$tfile_ 64700
+       for (( i = 0; i < 64700; i = i + 2 ))
+       do
+               rm $DIR/$tdir/$tfile_$i &
+               rm $DIR/$tdir/$tfile_$((i + 1)) &
+               local pid=$!
+               wait $pid
+       done
+
+       #waiting osp synchronization
+       wait_delete_completed
+}
+run_test 135 "Race catalog processing"
+
+test_136() {
+       remote_mds_nodsh && skip "remote MDS with nodsh"
+       [[ $MDS1_VERSION -lt $(version_code 2.13.50) ]] &&
+               skip "Need MDS version at least 2.13.50"
+       local fname
+
+       mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
+       $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
+
+       #fill already existed 2 plain llogs each 64767
+       #wrapping whole catalog
+       createmany -o -u $DIR/$tdir/$tfile- $((64767 * 1))
+       createmany -o -u $DIR/$tdir/$tfile- $((64767 * 3 / 2))
+       wait_delete_completed
+
+       createmany -o $DIR/$tdir/$tfile_ 10
+       sleep 25
+
+       do_facet $SINGLEMDS $LCTL set_param fail_val=3
+       for (( i = 0; i < 10; i = i + 3 ))
+       do
+               rm $DIR/$tdir/$tfile_$i &
+               rm $DIR/$tdir/$tfile_$((i + 1)) &
+               local pid=$!
+               wait $pid
+               sleep 7
+               rm $DIR/$tdir/$tfile_$((i + 2)) &
+       done
+
+       #waiting osp synchronization
+       wait_delete_completed
+}
+run_test 136 "Race catalog processing 2"
+
 test_140() { #bug-17379
        [ $PARALLEL == "yes" ] && skip "skip parallel run"
 
@@ -13718,14 +13865,17 @@ test_160f() {
 
        # generate some changelog records to accumulate on each MDT
        test_mkdir -c $MDSCOUNT $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"
 
        # check changelogs have been generated
+       local start=$SECONDS
+       local idle_time=$((MDSCOUNT * 5 + 5))
        local nbcl=$(changelog_dump | wc -l)
        [[ $nbcl -eq 0 ]] && error "no changelogs found"
 
-       for param in "changelog_max_idle_time=10" \
+       for param in "changelog_max_idle_time=$idle_time" \
                     "changelog_gc=1" \
                     "changelog_min_gc_interval=2" \
                     "changelog_min_free_cat_entries=3"; do
@@ -13737,8 +13887,11 @@ test_160f() {
                do_nodes $mdts $LCTL set_param mdd.*.$param
        done
 
-       # force cl_user2 to be idle (1st part)
-       sleep 9
+       # force cl_user2 to be idle (1st part), but also cancel the
+       # cl_user1 records so that it is not evicted later in the test.
+       local sleep1=$((idle_time / 2))
+       echo "$(date +%s): sleep1 $sleep1/${idle_time}s"
+       sleep $sleep1
 
        # simulate changelog catalog almost full
        #define OBD_FAIL_CAT_FREE_RECORDS       0x1313
@@ -13774,13 +13927,16 @@ test_160f() {
                              "$user_rec1, but is $user_rec2"
        done
 
-       # force cl_user2 to be idle (2nd part) and to reach
-       # changelog_max_idle_time
-       sleep 2
+       # force cl_user2 idle (2nd part) to just exceed changelog_max_idle_time
+       local sleep2=$((idle_time - (SECONDS - start) + 1))
+       echo "$(date +%s): sleep2 $sleep2/${idle_time}s"
+       sleep $sleep2
 
-       # generate one more changelog to trigger fail_loc
-       createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
-               error "create $DIR/$tdir/${tfile}bis failed"
+       # Generate one more changelog to trigger GC at fail_loc for cl_user2.
+       # cl_user1 should be OK because it recently processed records.
+       echo "$(date +%s): creating $((MDSCOUNT * 2)) files"
+       createmany -m $DIR/$tdir/${tfile}b $((MDSCOUNT * 2)) ||
+               error "create $DIR/$tdir/${tfile}b failed"
 
        # ensure gc thread is done
        for i in $(mdts_nodes); do
@@ -18908,7 +19064,7 @@ test_272a() {
                error "md5sum differ: $old_md5, $new_md5"
 
        [ $($LFS getstripe -c $dom) -eq 2 ] ||
-               error "migrate stripe count bad: $(LFS getstripe -c $dom) != 2"
+               error "bad final stripe count: $($LFS getstripe -c $dom) != 2"
 }
 run_test 272a "DoM migration: new layout with the same DOM component"
 
@@ -19698,8 +19854,9 @@ test_300k() {
 
        # this test needs a huge transaction
        local kb
-       kb=$(do_facet $SINGLEMDS lctl get_param -n osd*.lustre-MDT0000.kbytestotal)
-       [ $kb -lt $((1024*1024)) ] && skip "too small mds: $kb"
+       kb=$(do_facet $SINGLEMDS "$LCTL get_param -n \
+            osd*.$FSNAME-MDT0000.kbytestotal")
+       [ $kb -lt $((1024*1024)) ] && skip "MDT0 too small: $kb"
 
        local stripe_count
        local file
@@ -20381,7 +20538,7 @@ test_fake_rw() {
 
        $LFS setstripe -c 1 -i 0 $DIR/$tfile
 
-       # get ost1 size - lustre-OST0000
+       # get ost1 size - $FSNAME-OST0000
        local ost1_avail_size=$($LFS df | awk /${ost1_svc}/'{ print $4 }')
        local blocks=$((ost1_avail_size/2/1024)) # half avail space by megabytes
        [ $blocks -gt 1000 ] && blocks=1000 # 1G in maximum
@@ -20923,13 +21080,13 @@ test_qos_mkdir() {
                lmv.*.qos_maxage=$lmv_qos_maxage > /dev/null" EXIT
 
        lod_qos_prio_free=$(do_facet mds1 $LCTL get_param -n \
-               lod.lustre-MDT0000-mdtlov.mdt_qos_prio_free | head -n1)
+               lod.$FSNAME-MDT0000-mdtlov.mdt_qos_prio_free | head -n1)
        lod_qos_prio_free=${lod_qos_prio_free%%%}
        lod_qos_threshold_rr=$(do_facet mds1 $LCTL get_param -n \
-               lod.lustre-MDT0000-mdtlov.mdt_qos_threshold_rr | head -n1)
+               lod.$FSNAME-MDT0000-mdtlov.mdt_qos_threshold_rr | head -n1)
        lod_qos_threshold_rr=${lod_qos_threshold_rr%%%}
        lod_qos_maxage=$(do_facet mds1 $LCTL get_param -n \
-               lod.lustre-MDT0000-mdtlov.qos_maxage | awk '{ print $1 }')
+               lod.$FSNAME-MDT0000-mdtlov.qos_maxage | awk '{ print $1 }')
        stack_trap "do_nodes $mdts $LCTL set_param \
                lod.*.mdt_qos_prio_free=$lod_qos_prio_free > /dev/null" EXIT
        stack_trap "do_nodes $mdts $LCTL set_param \
@@ -22101,7 +22258,7 @@ test_805() {
        local usedkb
        local old
        local quota
-       local pref="osd-zfs.lustre-MDT0000."
+       local pref="osd-zfs.$FSNAME-MDT0000."
 
        # limit available space on MDS dataset to meet nospace issue
        # quickly. then ZFS 0.7.2 can use reserved space if asked
@@ -22409,7 +22566,7 @@ test_811() {
 }
 run_test 811 "orphan name stub can be cleaned up in startup"
 
-test_812() {
+test_812a() {
        [ $OST1_VERSION -lt $(version_code 2.12.51) ] &&
                skip "OST < 2.12.51 doesn't support this fail_loc"
        [ "$SHARED_KEY" = true ] &&
@@ -22430,7 +22587,31 @@ test_812() {
 
        stat $DIR/$tfile >/dev/null || error "can't stat file"
 }
-run_test 812 "do not drop reqs generated when imp is going to idle (LU-11951)"
+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
+       stat $DIR/$tfile >/dev/null || error "can't stat"
+       wait_osc_import_state client ost1 FULL
+       # no locks, no reqs to let the connection idle
+       cancel_lru_locks osc
+
+       # delay OST_DISCONNECT on OST1 to put OSC into intermediate state
+#define OBD_FAIL_OST_DISCONNECT_DELAY   0x245
+       do_facet ost1 "$LCTL set_param fail_loc=0x245 fail_val=8"
+       wait_osc_import_state client ost1 CONNECTING
+       do_facet ost1 "$LCTL set_param fail_loc=0 fail_val=0"
+
+       $LFS quota -u 0 $DIR/ || error "lfs quota should succeed"
+       wait_osc_import_state client ost1 IDLE
+}
+run_test 812b "do not drop no resend request for idle connect"
 
 test_813() {
        local file_heat_sav=$($LCTL get_param -n llite.*.file_heat 2>/dev/null)
@@ -22718,6 +22899,31 @@ test_900() {
 }
 run_test 900 "umount should not race with any mgc requeue thread"
 
+# LUS-6253/LU-11185
+test_901() {
+       local oldc
+       local newc
+       local olds
+       local news
+       [ $PARALLEL == "yes" ] && skip "skip parallel run"
+
+       # some get_param have a bug to handle dot in param name
+       cancel_lru_locks MGC
+       oldc=$($LCTL get_param -n 'ldlm.namespaces.MGC*.lock_count')
+       olds=$(do_facet mgs $LCTL get_param -n 'ldlm.namespaces.MGS*.lock_count')
+       umount_client $MOUNT || error "umount failed"
+       mount_client $MOUNT || error "mount failed"
+       cancel_lru_locks MGC
+       newc=$($LCTL get_param -n 'ldlm.namespaces.MGC*.lock_count')
+       news=$(do_facet mgs $LCTL get_param -n 'ldlm.namespaces.MGS*.lock_count')
+
+       [ $oldc -lt $newc ] && error "mgc lock leak ($oldc != $newc)"
+       [ $olds -lt $news ] && error "mgs lock leak ($olds != $news)"
+
+       return 0
+}
+run_test 901 "don't leak a mgc lock on client umount"
+
 complete $SECONDS
 [ -f $EXT2_DEV ] && rm $EXT2_DEV || true
 check_and_cleanup_lustre