Whamcloud - gitweb
LU-5319 tests: testcases for multiple modify RPCs feature
[fs/lustre-release.git] / lustre / tests / sanity.sh
index cb24847..fdb74d4 100644 (file)
@@ -664,7 +664,7 @@ test_17n() {
                mkdir -p $DIR/$tdir/remote_dir_${i}
                createmany -o $DIR/$tdir/remote_dir_${i}/f 10 ||
                        error "create files under remote dir failed $i"
-               $LFS mv --mdt-index 1 $DIR/$tdir/remote_dir_${i} ||
+               $LFS migrate --mdt-index 1 $DIR/$tdir/remote_dir_${i} ||
                        error "migrate remote dir error $i"
        done
        check_fs_consistency_17n || error "e2fsck report error after migration"
@@ -1357,6 +1357,9 @@ test_27d() {
 run_test 27d "create file with default settings ================"
 
 test_27e() {
+       # LU-5839 adds check for existed layout before setting it
+       [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.56) ]] &&
+               skip "Need MDS version at least 2.7.56" && return
        test_mkdir -p $DIR/d27
        $SETSTRIPE -c 2 $DIR/d27/f12 || error "setstripe failed"
        $SETSTRIPE -c 2 $DIR/d27/f12 && error "setstripe succeeded twice"
@@ -6696,7 +6699,7 @@ grow_xattr() {
        local xsize=${1:-1024}  # in bytes
        local file=$DIR/$tfile
 
-       [ -z $(lctl get_param -n mdc.*.connect_flags | grep xattr) ] &&
+       [ -z "$(lctl get_param -n mdc.*.connect_flags | grep xattr)" ] &&
                skip "must have user_xattr" && return 0
        [ -z "$(which setfattr 2>/dev/null)" ] &&
                skip_env "could not find setfattr" && return 0
@@ -7292,6 +7295,8 @@ free_min_max () {
 
 test_116a() { # was previously test_116()
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+       remote_mds_nodsh && skip "remote MDS with nodsh" && return
+
        [[ $OSTCOUNT -lt 2 ]] && skip_env "$OSTCOUNT < 2 OSTs" && return
 
        echo -n "Free space priority "
@@ -7411,6 +7416,8 @@ run_test 116a "stripe QOS: free space balance ==================="
 
 test_116b() { # LU-2093
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+       remote_mds_nodsh && skip "remote MDS with nodsh" && return
+
 #define OBD_FAIL_MDS_OSC_CREATE_FAIL     0x147
        local old_rr=$(do_facet $SINGLEMDS lctl get_param -n \
                       lo*.$FSNAME-MDT0000-mdtlov.qos_threshold_rr | head -1)
@@ -9374,6 +9381,79 @@ test_133g() {
 }
 run_test 133g "Check for Oopses on bad io area writes/reads in /proc"
 
+test_134a() {
+       [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.54) ]] &&
+               skip "Need MDS version at least 2.7.54" && return
+
+       mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
+       cancel_lru_locks mdc
+
+       local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
+       local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
+       [ $unused -eq 0 ] || "$unused locks are not cleared"
+
+       local nr=1000
+       createmany -o $DIR/$tdir/f $nr ||
+               error "failed to create $nr files in $DIR/$tdir"
+       unused=$($LCTL get_param -n $nsdir.lock_unused_count)
+
+       #define OBD_FAIL_LDLM_WATERMARK_LOW     0x327
+       do_facet mds1 $LCTL set_param fail_loc=0x327
+       do_facet mds1 $LCTL set_param fail_val=500
+       touch $DIR/$tdir/m
+
+       echo "sleep 10 seconds ..."
+       sleep 10
+       local lck_cnt=$($LCTL get_param -n $nsdir.lock_unused_count)
+
+       do_facet mds1 $LCTL set_param fail_loc=0
+       do_facet mds1 $LCTL set_param fail_val=0
+       [ $lck_cnt -lt $unused ] ||
+               error "No locks reclaimed, before:$unused, after:$lck_cnt"
+
+       rm $DIR/$tdir/m
+       unlinkmany $DIR/$tdir/f $nr
+}
+run_test 134a "Server reclaims locks when reaching low watermark"
+
+test_134b() {
+       [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.54) ]] &&
+               skip "Need MDS version at least 2.7.54" && return
+
+       mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
+       cancel_lru_locks mdc
+
+       local low_wm=$(do_facet mds1 $LCTL get_param -n ldlm.watermark_mb_low)
+       # disable reclaim temporarily
+       do_facet mds1 $LCTL set_param ldlm.watermark_mb_low=0
+
+       #define OBD_FAIL_LDLM_WATERMARK_HIGH     0x328
+       do_facet mds1 $LCTL set_param fail_loc=0x328
+       do_facet mds1 $LCTL set_param fail_val=500
+
+       $LCTL set_param debug=+trace
+
+       local nr=600
+       createmany -o $DIR/$tdir/f $nr &
+       local create_pid=$!
+
+       echo "Sleep $TIMEOUT seconds ..."
+       sleep $TIMEOUT
+       if ! ps -p $create_pid  > /dev/null 2>&1; then
+               do_facet mds1 $LCTL set_param fail_loc=0
+               do_facet mds1 $LCTL set_param fail_val=0
+               do_facet mds1 $LCTL set_param ldlm.watermark_mb_low=$low_wm
+               error "createmany finished incorrectly!"
+       fi
+       do_facet mds1 $LCTL set_param fail_loc=0
+       do_facet mds1 $LCTL set_param fail_val=0
+       do_facet mds1 $LCTL set_param ldlm.watermark_mb_low=$low_wm
+       wait $create_pid || return 1
+
+       unlinkmany $DIR/$tdir/f $nr
+}
+run_test 134b "Server rejects lock request when reaching high watermark"
+
 test_140() { #bug-17379
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
         test_mkdir -p $DIR/$tdir || error "Creating dir $DIR/$tdir"
@@ -10080,142 +10160,141 @@ test_156() {
        local AFTER
        local file="$DIR/$tfile"
 
-       [ "$(facet_fstype ost1)" = "zfs" ] &&
-               skip "LU-1956/LU-2261: stats unimplemented on OSD ZFS" &&
+       [ "$(facet_fstype ost1)" = "zfs" -a \
+          $(lustre_version_code ost1 -lt $(version_code 2.6.93)) ] &&
+               skip "LU-1956/LU-2261: stats not implemented on OSD ZFS" &&
                return
 
        roc_hit_init
 
-    log "Turn on read and write cache"
-    set_cache read on
-    set_cache writethrough on
-
-    log "Write data and read it back."
-    log "Read should be satisfied from the cache."
-    dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
-    BEFORE=`roc_hit`
-    cancel_lru_locks osc
-    cat $file >/dev/null
-    AFTER=`roc_hit`
-    if ! let "AFTER - BEFORE == CPAGES"; then
-        error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
-    else
-        log "cache hits:: before: $BEFORE, after: $AFTER"
-    fi
-
-    log "Read again; it should be satisfied from the cache."
-    BEFORE=$AFTER
-    cancel_lru_locks osc
-    cat $file >/dev/null
-    AFTER=`roc_hit`
-    if ! let "AFTER - BEFORE == CPAGES"; then
-        error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
-    else
-        log "cache hits:: before: $BEFORE, after: $AFTER"
-    fi
+       log "Turn on read and write cache"
+       set_cache read on
+       set_cache writethrough on
 
+       log "Write data and read it back."
+       log "Read should be satisfied from the cache."
+       dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
+       BEFORE=$(roc_hit)
+       cancel_lru_locks osc
+       cat $file >/dev/null
+       AFTER=$(roc_hit)
+       if ! let "AFTER - BEFORE == CPAGES"; then
+               error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
+       else
+               log "cache hits:: before: $BEFORE, after: $AFTER"
+       fi
 
-    log "Turn off the read cache and turn on the write cache"
-    set_cache read off
-    set_cache writethrough on
+       log "Read again; it should be satisfied from the cache."
+       BEFORE=$AFTER
+       cancel_lru_locks osc
+       cat $file >/dev/null
+       AFTER=$(roc_hit)
+       if ! let "AFTER - BEFORE == CPAGES"; then
+               error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
+       else
+               log "cache hits:: before: $BEFORE, after: $AFTER"
+       fi
 
-    log "Read again; it should be satisfied from the cache."
-    BEFORE=`roc_hit`
-    cancel_lru_locks osc
-    cat $file >/dev/null
-    AFTER=`roc_hit`
-    if ! let "AFTER - BEFORE == CPAGES"; then
-        error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
-    else
-        log "cache hits:: before: $BEFORE, after: $AFTER"
-    fi
+       log "Turn off the read cache and turn on the write cache"
+       set_cache read off
+       set_cache writethrough on
 
-    log "Read again; it should not be satisfied from the cache."
-    BEFORE=$AFTER
-    cancel_lru_locks osc
-    cat $file >/dev/null
-    AFTER=`roc_hit`
-    if ! let "AFTER - BEFORE == 0"; then
-        error "IN CACHE: before: $BEFORE, after: $AFTER"
-    else
-        log "cache hits:: before: $BEFORE, after: $AFTER"
-    fi
+       log "Read again; it should be satisfied from the cache."
+       BEFORE=$(roc_hit)
+       cancel_lru_locks osc
+       cat $file >/dev/null
+       AFTER=$(roc_hit)
+       if ! let "AFTER - BEFORE == CPAGES"; then
+               error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
+       else
+               log "cache hits:: before: $BEFORE, after: $AFTER"
+       fi
 
-    log "Write data and read it back."
-    log "Read should be satisfied from the cache."
-    dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
-    BEFORE=`roc_hit`
-    cancel_lru_locks osc
-    cat $file >/dev/null
-    AFTER=`roc_hit`
-    if ! let "AFTER - BEFORE == CPAGES"; then
-        error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
-    else
-        log "cache hits:: before: $BEFORE, after: $AFTER"
-    fi
+       log "Read again; it should not be satisfied from the cache."
+       BEFORE=$AFTER
+       cancel_lru_locks osc
+       cat $file >/dev/null
+       AFTER=$(roc_hit)
+       if ! let "AFTER - BEFORE == 0"; then
+               error "IN CACHE: before: $BEFORE, after: $AFTER"
+       else
+               log "cache hits:: before: $BEFORE, after: $AFTER"
+       fi
 
-    log "Read again; it should not be satisfied from the cache."
-    BEFORE=$AFTER
-    cancel_lru_locks osc
-    cat $file >/dev/null
-    AFTER=`roc_hit`
-    if ! let "AFTER - BEFORE == 0"; then
-        error "IN CACHE: before: $BEFORE, after: $AFTER"
-    else
-        log "cache hits:: before: $BEFORE, after: $AFTER"
-    fi
+       log "Write data and read it back."
+       log "Read should be satisfied from the cache."
+       dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
+       BEFORE=$(roc_hit)
+       cancel_lru_locks osc
+       cat $file >/dev/null
+       AFTER=$(roc_hit)
+       if ! let "AFTER - BEFORE == CPAGES"; then
+               error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
+       else
+               log "cache hits:: before: $BEFORE, after: $AFTER"
+       fi
 
+       log "Read again; it should not be satisfied from the cache."
+       BEFORE=$AFTER
+       cancel_lru_locks osc
+       cat $file >/dev/null
+       AFTER=$(roc_hit)
+       if ! let "AFTER - BEFORE == 0"; then
+               error "IN CACHE: before: $BEFORE, after: $AFTER"
+       else
+               log "cache hits:: before: $BEFORE, after: $AFTER"
+       fi
 
-    log "Turn off read and write cache"
-    set_cache read off
-    set_cache writethrough off
+       log "Turn off read and write cache"
+       set_cache read off
+       set_cache writethrough off
 
-    log "Write data and read it back"
-    log "It should not be satisfied from the cache."
-    rm -f $file
-    dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
-    cancel_lru_locks osc
-    BEFORE=`roc_hit`
-    cat $file >/dev/null
-    AFTER=`roc_hit`
+       log "Write data and read it back"
+       log "It should not be satisfied from the cache."
+       rm -f $file
+       dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
+       cancel_lru_locks osc
+       BEFORE=$(roc_hit)
+       cat $file >/dev/null
+       AFTER=$(roc_hit)
        if ! let "AFTER - BEFORE == 0"; then
                error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
        else
                log "cache hits:: before: $BEFORE, after: $AFTER"
        fi
 
-    log "Turn on the read cache and turn off the write cache"
-    set_cache read on
-    set_cache writethrough off
+       log "Turn on the read cache and turn off the write cache"
+       set_cache read on
+       set_cache writethrough off
 
-    log "Write data and read it back"
-    log "It should not be satisfied from the cache."
-    rm -f $file
-    dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
-    BEFORE=`roc_hit`
-    cancel_lru_locks osc
-    cat $file >/dev/null
-    AFTER=`roc_hit`
+       log "Write data and read it back"
+       log "It should not be satisfied from the cache."
+       rm -f $file
+       dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
+       BEFORE=$(roc_hit)
+       cancel_lru_locks osc
+       cat $file >/dev/null
+       AFTER=$(roc_hit)
        if ! let "AFTER - BEFORE == 0"; then
                error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
        else
                log "cache hits:: before: $BEFORE, after: $AFTER"
        fi
 
-    log "Read again; it should be satisfied from the cache."
-    BEFORE=`roc_hit`
-    cancel_lru_locks osc
-    cat $file >/dev/null
-    AFTER=`roc_hit`
-    if ! let "AFTER - BEFORE == CPAGES"; then
-        error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
-    else
-        log "cache hits:: before: $BEFORE, after: $AFTER"
-    fi
+       log "Read again; it should be satisfied from the cache."
+       BEFORE=$(roc_hit)
+       cancel_lru_locks osc
+       cat $file >/dev/null
+       AFTER=$(roc_hit)
+       if ! let "AFTER - BEFORE == CPAGES"; then
+               error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
+       else
+               log "cache hits:: before: $BEFORE, after: $AFTER"
+       fi
 
-    rm -f $file
+       rm -f $file
 }
-run_test 156 "Verification of tunables ============================"
+run_test 156 "Verification of tunables"
 
 #Changelogs
 err17935 () {
@@ -10380,6 +10459,8 @@ test_160b() { # LU-3587
 run_test 160b "Verify that very long rename doesn't crash in changelog"
 
 test_160c() {
+       remote_mds_nodsh && skip "remote MDS with nodsh" && return
+
        local rc=0
        local server_version=$(lustre_version_code $SINGLEMDS)
 
@@ -10699,6 +10780,8 @@ run_test 162b "striped directory path lookup sanity"
 
 # LU-4239: Verify fid2path works with paths 100 or more directories deep
 test_162c() {
+       [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.51) ]] &&
+               skip "Need MDS version at least 2.7.51" && return
        test_mkdir $DIR/$tdir.local
        test_mkdir $DIR/$tdir.remote
        local lpath=$tdir.local
@@ -10963,31 +11046,32 @@ test_181() { # bug 22177
 run_test 181 "Test open-unlinked dir ========================"
 
 test_182() {
-       [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
-       # disable MDC RPC lock wouldn't crash client
        local fcount=1000
-       local tcount=4
+       local tcount=10
 
        mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
-#define OBD_FAIL_MDC_RPCS_SEM          0x804
-       $LCTL set_param fail_loc=0x804
 
-       for (( i=0; i < $tcount; i++ )) ; do
+       $LCTL set_param mdc.*.rpc_stats=clear
+
+       for (( i = 0; i < $tcount; i++ )) ; do
                mkdir $DIR/$tdir/$i
+       done
+
+       for (( i = 0; i < $tcount; i++ )) ; do
                createmany -o $DIR/$tdir/$i/f- $fcount &
        done
        wait
 
-       for (( i=0; i < $tcount; i++ )) ; do
+       for (( i = 0; i < $tcount; i++ )) ; do
                unlinkmany $DIR/$tdir/$i/f- $fcount &
        done
        wait
 
-       rm -rf $DIR/$tdir
+       $LCTL get_param mdc.*.rpc_stats
 
-       $LCTL set_param fail_loc=0
+       rm -rf $DIR/$tdir
 }
-run_test 182 "Disable MDC RPCs semaphore wouldn't crash client ================"
+run_test 182 "Test parallel modify metadata operations ================"
 
 test_183() { # LU-2275
        remote_mds_nodsh && skip "remote MDS with nodsh" && return
@@ -11225,6 +11309,10 @@ test_185() { # LU-2441
 run_test 185 "Volatile file support"
 
 test_187a() {
+       remote_mds_nodsh && skip "remote MDS with nodsh" && return
+       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.3.0) ] &&
+               skip "Need MDS version at least 2.3.0" && return
+
        local dir0=$DIR/$tdir/$testnum
        mkdir -p $dir0 || error "creating dir $dir0"
 
@@ -11242,6 +11330,10 @@ test_187a() {
 run_test 187a "Test data version change"
 
 test_187b() {
+       remote_mds_nodsh && skip "remote MDS with nodsh" && return
+       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.3.0) ] &&
+               skip "Need MDS version at least 2.3.0" && return
+
        local dir0=$DIR/$tdir/$testnum
        mkdir -p $dir0 || error "creating dir $dir0"
 
@@ -11439,36 +11531,41 @@ else
 fi
 
 verify_jobstats() {
-       local cmd=$1
-       local target=$2
-
-       # clear old jobstats
-       do_facet $SINGLEMDS lctl set_param mdt.*.job_stats="clear"
-       do_facet ost1 lctl set_param obdfilter.*.job_stats="clear"
-
-       # use a new JobID for this test, or we might see an old one
-       [ "$JOBENV" = "FAKE_JOBID" ] && FAKE_JOBID=test_id.$testnum.$RANDOM
+       local cmd=($1)
+       shift
+       local facets="$@"
+
+# we don't really need to clear the stats for this test to work, since each
+# command has a unique jobid, but it makes debugging easier if needed.
+#      for facet in $facets; do
+#              local dev=$(convert_facet2label $facet)
+#              # clear old jobstats
+#              do_facet $facet lctl set_param *.$dev.job_stats="clear"
+#      done
+
+       # use a new JobID for each test, or we might see an old one
+       [ "$JOBENV" = "FAKE_JOBID" ] &&
+               FAKE_JOBID=id.$testnum.$(basename ${cmd[0]}).$RANDOM
 
        JOBVAL=${!JOBENV}
-       log "Test: $cmd"
+       log "Test: ${cmd[*]}"
        log "Using JobID environment variable $JOBENV=$JOBVAL"
 
        if [ $JOBENV = "FAKE_JOBID" ]; then
-               FAKE_JOBID=$JOBVAL $cmd
+               FAKE_JOBID=$JOBVAL ${cmd[*]}
        else
-               $cmd
+               ${cmd[*]}
        fi
 
-       if [ "$target" = "mdt" -o "$target" = "both" ]; then
-               FACET="$SINGLEMDS" # will need to get MDS number for DNE
-               do_facet $FACET lctl get_param mdt.*.job_stats |
-                       grep $JOBVAL || error "No job stats found on MDT $FACET"
-       fi
-       if [ "$target" = "ost" -o "$target" = "both" ]; then
-               FACET=ost1
-               do_facet $FACET lctl get_param obdfilter.*.job_stats |
-                       grep $JOBVAL || error "No job stats found on OST $FACET"
-       fi
+       # all files are created on OST0000
+       for facet in $facets; do
+               local stats="*.$(convert_facet2label $facet).job_stats"
+               if [ $(do_facet $facet lctl get_param $stats |
+                      grep -c $JOBVAL) -ne 1 ]; then
+                       do_facet $facet lctl get_param $stats
+                       error "No jobstats for $JOBVAL found on $facet::$stats"
+               fi
+       done
 }
 
 jobstats_set() {
@@ -11478,54 +11575,83 @@ jobstats_set() {
        wait_update $HOSTNAME "$LCTL get_param -n jobid_var" $NEW_JOBENV
 }
 
+cleanup_205() {
+       do_facet $SINGLEMDS \
+               $LCTL set_param mdt.*.job_cleanup_interval=$OLD_INTERVAL
+       [ $OLD_JOBENV != $JOBENV ] && jobstats_set $OLD_JOBENV
+       do_facet $SINGLEMDS lctl --device $MDT0 changelog_deregister $CL_USER
+}
+
 test_205() { # Job stats
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
        remote_mgs_nodsh && skip "remote MGS with nodsh" && return
+       remote_mds_nodsh && skip "remote MDS with nodsh" && return
+       remote_ost_nodsh && skip "remote OST with nodsh" && return
+
        [ -z "$(lctl get_param -n mdc.*.connect_flags | grep jobstats)" ] &&
                skip "Server doesn't support jobstats" && return 0
        [[ $JOBID_VAR = disable ]] && skip "jobstats is disabled" && return
 
-       local cmd
        OLD_JOBENV=$($LCTL get_param -n jobid_var)
        if [ $OLD_JOBENV != $JOBENV ]; then
                jobstats_set $JOBENV
-               trap jobstats_set EXIT
+               trap cleanup_205 EXIT
        fi
 
-       local user=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \
-                    changelog_register -n)
-       echo "Registered as changelog user $user"
+       CL_USER=$(do_facet $SINGLEMDS lctl --device $MDT0 changelog_register -n)
+       echo "Registered as changelog user $CL_USER"
 
+       OLD_INTERVAL=$(do_facet $SINGLEMDS \
+                      lctl get_param -n mdt.*.job_cleanup_interval)
+       local interval_new=5
+       do_facet $SINGLEMDS \
+               $LCTL set_param mdt.*.job_cleanup_interval=$interval_new
+       local start=$SECONDS
+
+       local cmd
        # mkdir
-       cmd="mkdir $DIR/$tfile"
-       verify_jobstats "$cmd" "mdt"
+       cmd="mkdir $DIR/$tdir"
+       verify_jobstats "$cmd" "$SINGLEMDS"
        # rmdir
-       cmd="rm -fr $DIR/$tfile"
-       verify_jobstats "$cmd" "mdt"
+       cmd="rmdir $DIR/$tdir"
+       verify_jobstats "$cmd" "$SINGLEMDS"
+       # mkdir on secondary MDT
+       if [ $MDSCOUNT -gt 1 ]; then
+               cmd="lfs mkdir -i 1 $DIR/$tdir.remote"
+               verify_jobstats "$cmd" "mds2"
+       fi
        # mknod
        cmd="mknod $DIR/$tfile c 1 3"
-       verify_jobstats "$cmd" "mdt"
+       verify_jobstats "$cmd" "$SINGLEMDS"
        # unlink
        cmd="rm -f $DIR/$tfile"
-       verify_jobstats "$cmd" "mdt"
+       verify_jobstats "$cmd" "$SINGLEMDS"
+       # create all files on OST0000 so verify_jobstats can find OST stats
        # open & close
        cmd="$SETSTRIPE -i 0 -c 1 $DIR/$tfile"
-       verify_jobstats "$cmd" "mdt"
+       verify_jobstats "$cmd" "$SINGLEMDS"
        # setattr
        cmd="touch $DIR/$tfile"
-       verify_jobstats "$cmd" "both"
+       verify_jobstats "$cmd" "$SINGLEMDS ost1"
        # write
        cmd="dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=sync"
-       verify_jobstats "$cmd" "ost"
+       verify_jobstats "$cmd" "ost1"
        # read
        cmd="dd if=$DIR/$tfile of=/dev/null bs=1M count=1 iflag=direct"
-       verify_jobstats "$cmd" "ost"
+       verify_jobstats "$cmd" "ost1"
        # truncate
        cmd="$TRUNCATE $DIR/$tfile 0"
-       verify_jobstats "$cmd" "both"
+       verify_jobstats "$cmd" "$SINGLEMDS ost1"
        # rename
-       cmd="mv -f $DIR/$tfile $DIR/jobstats_test_rename"
-       verify_jobstats "$cmd" "mdt"
+       cmd="mv -f $DIR/$tfile $DIR/$tdir.rename"
+       verify_jobstats "$cmd" "$SINGLEMDS"
+       # jobstats expiry - sleep until old stats should be expired
+       local left=$((interval_new - (SECONDS - start)))
+       [ $left -ge 0 ] && echo "sleep $left for expiry" && sleep $((left + 1))
+       cmd="mkdir $DIR/$tdir.expire"
+       verify_jobstats "$cmd" "$SINGLEMDS"
+       [ $(do_facet $SINGLEMDS lctl get_param *.*.job_stats |
+           grep -c "job_id.*mkdir") -gt 1 ] && error "old jobstats not expired"
 
        # Ensure that jobid are present in changelog (if supported by MDS)
        if [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.6.52) ]
@@ -11545,10 +11671,7 @@ test_205() { # Job stats
                        error "Unexpected jobids when jobid_var=$JOBENV"
        fi
 
-       # cleanup
-       rm -f $DIR/jobstats_test_rename
-
-       [ $OLD_JOBENV != $JOBENV ] && jobstats_set $OLD_JOBENV
+       cleanup_205
 }
 run_test 205 "Verify job stats"
 
@@ -11603,9 +11726,9 @@ test_208() {
        # for now as only exclusive open is supported. After generic lease
        # is done, this test suite should be revised. - Jinshan
 
+       remote_mds_nodsh && skip "remote MDS with nodsh" && return
        [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.4.52) ]] ||
                { skip "Need MDS version at least 2.4.52"; return 0; }
-       remote_mds_nodsh && skip "remote MDS with nodsh" && return
 
        echo "==== test 1: verify get lease work"
        $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:eRE+eU || error "get lease error"
@@ -11933,11 +12056,14 @@ run_test 219 "LU-394: Write partial won't cause uncontiguous pages vec at LND"
 test_220() { #LU-325
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
        remote_ost_nodsh && skip "remote OST with nodsh" && return
+       remote_mds_nodsh && skip "remote MDS with nodsh" && return
+       remote_mgs_nodsh && skip "remote MGS with nodsh" && return
        local OSTIDX=0
 
-       test_mkdir -p $DIR/$tdir
-       local OST=$($LFS osts | grep ${OSTIDX}": " | \
-               awk '{print $2}' | sed -e 's/_UUID$//')
+       # create on MDT0000 so the last_id and next_id are correct
+       mkdir $DIR/$tdir
+       local OST=$($LFS df $DIR | awk '/OST:'$OSTIDX'/ { print $1 }')
+       OST=${OST%_UUID}
 
        # on the mdt's osc
        local mdtosc_proc1=$(get_mdtosc_proc_path $SINGLEMDS $OST)
@@ -12103,6 +12229,7 @@ run_test 224c "Don't hang if one of md lost during large bulk RPC"
 MDSSURVEY=${MDSSURVEY:-$(which mds-survey 2>/dev/null || true)}
 test_225a () {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+       remote_mds_nodsh && skip "remote MDS with nodsh" && return
        if [ -z ${MDSSURVEY} ]; then
              skip_env "mds-survey not found" && return
        fi
@@ -12132,7 +12259,7 @@ run_test 225a "Metadata survey sanity with zero-stripe"
 
 test_225b () {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
-
+       remote_mds_nodsh && skip "remote MDS with nodsh" && return
        if [ -z ${MDSSURVEY} ]; then
              skip_env "mds-survey not found" && return
        fi
@@ -12481,8 +12608,8 @@ test_230b() {
        ln -s $migrate_dir/$tfile $migrate_dir/${tfile}_ln
        ln -s $other_dir/$tfile $migrate_dir/${tfile}_ln_other
 
-       $LFS mv -v -M $MDTIDX $migrate_dir ||
-               error "migrate remote dir error"
+       $LFS migrate -m $MDTIDX $migrate_dir ||
+               error "fails on migrating remote dir to MDT1"
 
        echo "migratate to MDT1, then checking.."
        for ((i = 0; i < 10; i++)); do
@@ -12545,8 +12672,9 @@ test_230b() {
 
        #migrate back to MDT0
        MDTIDX=0
-       $LFS mv -v -M $MDTIDX $migrate_dir ||
-               error "migrate remote dir error"
+
+       $LFS migrate -m $MDTIDX $migrate_dir ||
+               error "fails on migrating remote dir to MDT0"
 
        echo "migrate back to MDT0, checking.."
        for file in $(find $migrate_dir); do
@@ -12603,6 +12731,7 @@ run_test 230b "migrate directory"
 
 test_230c() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+       remote_mds_nodsh && skip "remote MDS with nodsh" && return
        [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
        local MDTIDX=1
        local mdt_index
@@ -12622,8 +12751,14 @@ test_230c() {
        do_facet mds1 lctl set_param fail_loc=0x20001801
        do_facet mds1 lctl  set_param fail_val=5
        local t=$(ls $migrate_dir | wc -l)
-       $LFS mv --mdt-index $MDTIDX $migrate_dir &&
+       $LFS migrate --mdt-index $MDTIDX $migrate_dir &&
                error "migrate should fail after 5 entries"
+
+       mkdir $migrate_dir/dir &&
+               error "mkdir succeeds under migrating directory"
+       touch $migrate_dir/file &&
+               error "touch file succeeds under migrating directory"
+
        local u=$(ls $migrate_dir | wc -l)
        [ "$u" == "$t" ] || error "$u != $t during migration"
 
@@ -12634,7 +12769,7 @@ test_230c() {
        do_facet mds1 lctl set_param fail_loc=0
        do_facet mds1 lctl set_param fail_val=0
 
-       $LFS mv -M $MDTIDX $migrate_dir ||
+       $LFS migrate -m $MDTIDX $migrate_dir ||
                error "migrate open files should failed with open files"
 
        echo "Finish migration, then checking.."
@@ -12666,7 +12801,8 @@ test_230d() {
                        error "create files under remote dir failed $i"
        done
 
-       $LFS mv -M $MDTIDX -v $migrate_dir || error "migrate remote dir error"
+       $LFS migrate -m $MDTIDX $migrate_dir ||
+               error "migrate remote dir error"
 
        echo "Finish migration, then checking.."
        for file in $(find $migrate_dir); do
@@ -12977,6 +13113,31 @@ test_244()
 }
 run_test 244 "sendfile with group lock tests"
 
+test_245() {
+       local flagname="multi_mod_rpcs"
+       local connect_data_name="max_mod_rpcs"
+       local out
+
+       # check if multiple modify RPCs flag is set
+       out=$($LCTL get_param mdc.$FSNAME-MDT0000-*.import |
+               grep "connect_flags:")
+       echo "$out"
+
+       echo "$out" | grep -qw $flagname
+       if [ $? -ne 0 ]; then
+               echo "connect flag $flagname is not set"
+               return
+       fi
+
+       # check if multiple modify RPCs data is set
+       out=$($LCTL get_param mdc.$FSNAME-MDT0000-*.import)
+       echo "$out"
+
+       echo "$out" | grep -qw $connect_data_name ||
+               error "import should have connect data $connect_data_name"
+}
+run_test 245 "check mdc connection flag/data: multiple modify RPCs"
+
 test_250() {
        [ "$(facet_fstype ost$(($($GETSTRIPE -i $DIR/$tfile) + 1)))" = "zfs" ] \
         && skip "no 16TB file size limit on ZFS" && return
@@ -13008,6 +13169,58 @@ test_251() {
 }
 run_test 251 "Handling short read and write correctly"
 
+test_252() {
+       local tgt
+       local dev
+       local out
+       local uuid
+       local num
+       local gen
+
+       if [ "$(facet_fstype ost1)" != "ldiskfs" -o \
+            "$(facet_fstype mds1)" != "ldiskfs" ]; then
+               skip "can only run lr_reader on ldiskfs target"
+               return
+       fi
+
+       # check lr_reader on OST0000
+       tgt=ost1
+       dev=$(facet_device $tgt)
+       out=$(do_facet $tgt $LR_READER $dev)
+       [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
+       echo "$out"
+       uuid=$(echo "$out" | grep -i uuid | awk '{ print $2 }')
+       [ "$uuid" == "$(ostuuid_from_index 0)" ] ||
+               error "Invalid uuid returned by $LR_READER on target $tgt"
+       echo -e "uuid returned by $LR_READER is '$uuid'\n"
+
+       # check lr_reader -c on MDT0000
+       tgt=mds1
+       dev=$(facet_device $tgt)
+       if ! do_facet $tgt $LR_READER -h | grep -q OPTIONS; then
+               echo "$LR_READER does not support additional options"
+               return 0
+       fi
+       out=$(do_facet $tgt $LR_READER -c $dev)
+       [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
+       echo "$out"
+       num=$(echo "$out" | grep -c "mdtlov")
+       [ "$num" -eq $((MDSCOUNT - 1)) ] ||
+               error "Invalid number of mdtlov clients returned by $LR_READER"
+       echo -e "Number of mdtlov clients returned by $LR_READER is '$num'\n"
+
+       # check lr_reader -cr on MDT0000
+       out=$(do_facet $tgt $LR_READER -cr $dev)
+       [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
+       echo "$out"
+       echo "$out" | grep -q "^reply_data:$" ||
+               error "$LR_READER should have returned 'reply_data' section"
+       num=$(echo "$out" | grep -c "client_generation")
+       echo -e "Number of reply data returned by $LR_READER is '$num'\n"
+}
+run_test 252 "check lr_reader tool"
+
+
 cleanup_test_300() {
        trap 0
        umask $SAVE_UMASK
@@ -13029,6 +13242,8 @@ test_striped_dir() {
        local mode=$(stat -c%a $DIR/$tdir/striped_dir)
        [ "$mode" = "755" ] || error "expect 755 got $mode"
 
+       $LFS getdirstripe $DIR/$tdir/striped_dir > /dev/null 2>&1 ||
+               error "getdirstripe failed"
        stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir)
        if [ "$stripe_count" != "2" ]; then
                error "stripe_count is $stripe_count, expect 2"
@@ -13396,6 +13611,78 @@ test_300i() {
 }
 run_test 300i "client handle unknown hash type striped directory"
 
+test_300j() {
+       [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.55) ] &&
+               skip "Need MDS version at least 2.7.55" && return
+       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+       local stripe_count
+       local file
+
+       mkdir $DIR/$tdir
+
+       #define OBD_FAIL_SPLIT_UPDATE_REC       0x1702
+       $LCTL set_param fail_loc=0x1702
+       $LFS setdirstripe -i 0 -c$MDSCOUNT -t all_char $DIR/$tdir/striped_dir ||
+               error "set striped dir error"
+
+       createmany -o $DIR/$tdir/striped_dir/f- 10 ||
+               error "create files under striped dir failed"
+
+       $LCTL set_param fail_loc=0
+
+       rm -rf $DIR/$tdir || error "unlink striped dir fails"
+
+       return 0
+}
+run_test 300j "test large update record"
+
+test_300k() {
+       [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.55) ] &&
+               skip "Need MDS version at least 2.7.55" && return
+       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+       local stripe_count
+       local file
+
+       mkdir $DIR/$tdir
+
+       #define OBD_FAIL_LARGE_STRIPE   0x1703
+       $LCTL set_param fail_loc=0x1703
+       $LFS setdirstripe -i 0 -c512 $DIR/$tdir/striped_dir ||
+               error "set striped dir error"
+       $LCTL set_param fail_loc=0
+
+       $LFS getdirstripe $DIR/$tdir/striped_dir ||
+               error "getstripeddir fails"
+       rm -rf $DIR/$tdir/striped_dir ||
+               error "unlink striped dir fails"
+
+       return 0
+}
+run_test 300k "test large striped directory"
+
+test_300l() {
+       [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+       local stripe_index
+
+       test_mkdir -p $DIR/$tdir/striped_dir
+       chown $RUNAS_ID $DIR/$tdir/striped_dir ||
+                       error "chown $RUNAS_ID failed"
+       $LFS setdirstripe -i 1 -D $DIR/$tdir/striped_dir ||
+               error "set default striped dir failed"
+
+       #define OBD_FAIL_MDS_STALE_DIR_LAYOUT    0x158
+       $LCTL set_param fail_loc=0x80000158
+       $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir || error "create dir fails"
+
+       stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/test_dir)
+       [ $stripe_index -eq 1 ] ||
+               error "expect 1 get $stripe_index for $dir"
+}
+run_test 300l "non-root user to create dir under striped dir with stale layout"
+
 prepare_remote_file() {
        mkdir $DIR/$tdir/src_dir ||
                error "create remote source failed"