Whamcloud - gitweb
LU-11607 tests: replace lustre_version/fstype - large-lun
[fs/lustre-release.git] / lustre / tests / lfsck-performance.sh
index c30ab30..791d5e3 100644 (file)
@@ -13,15 +13,11 @@ init_test_env $@
 . ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh}
 init_logging
 
-#remove it when zfs-based backend iteration is enabled
-[ $(facet_fstype $SINGLEMDS) != ldiskfs ] &&
-       skip "lfsck performance only for ldiskfs" && exit 0
-
 require_dsh_mds || exit 0
 require_dsh_ost || exit 0
 
 [ "$SLOW" = "no" ] &&
-       skip "skip lfsck performance test under non-SLOW mode" && exit 0
+       skip "skip lfsck performance test under non-SLOW mode"
 
 NTHREADS=${NTHREADS:-0}
 UNIT=${UNIT:-8192}
@@ -42,19 +38,19 @@ RLCTL="${RCMD} ${LCTL}"
 MDT_DEV="${FSNAME}-MDT0000"
 MDT_DEVNAME=$(mdsdevname ${SINGLEMDS//mds/})
 START_NAMESPACE="${RLCTL} lfsck_start -M ${MDT_DEV} -t namespace"
-STOP_LFSCK="${RLCTL} lfsck_stop -M ${MDT_DEV}"
+STOP_LFSCK="${RLCTL} lfsck_stop -M ${MDT_DEV} -A"
 SHOW_NAMESPACE="${RLCTL} get_param -n mdd.${MDT_DEV}.lfsck_namespace"
 MNTOPTS_NOSCRUB="-o user_xattr,noscrub"
 remote_mds && ECHOCMD=${RCMD} || ECHOCMD="eval"
 
-LFSCKDIR="$MOUNT/lfsck/"
-
 if [ ${NTHREADS} -eq 0 ]; then
        CPUCORE=$(${RCMD} cat /proc/cpuinfo | grep "processor.*:" | wc -l)
        NTHREADS=$((CPUCORE * 2))
 fi
 
 lfsck_attach() {
+       ${RCMD} "modprobe obdecho"
+
        ${ECHOCMD} "${LCTL} <<-EOF
                attach echo_client lfsck-MDT0000 lfsck-MDT0000_UUID
                setup ${MDT_DEV} mdd
@@ -78,7 +74,7 @@ lfsck_create() {
                test_mkdir ${tdir}
        EOF"
 
-       for ((j=1; j<${threads}; j++)); do
+       for ((j = 1; j < ${threads}; j++)); do
                ${ECHOCMD} "${LCTL} <<-EOF
                        cfg_device ${echodev}
                        test_mkdir ${tdir}${j}
@@ -94,7 +90,7 @@ lfsck_create() {
 
 lfsck_cleanup() {
        do_rpc_nodes $(facet_active_host $SINGLEMDS) unload_modules
-       formatall
+       REFORMAT="yes" cleanup_and_setup_lustre
 }
 
 lfsck_create_nfiles() {
@@ -135,18 +131,22 @@ lfsck_create_nfiles() {
 
 build_test_filter
 
+format_start_mgs () {
+       do_rpc_nodes $(facet_active_host mgs) load_modules_local
+       format_mgs
+       start mgs $(mgsdevname) $MGS_MOUNT_OPTS
+}
+
 test_0() {
        local BCOUNT=0
        local i
 
        stopall
+       combined_mgs_mds || format_start_mgs
        do_rpc_nodes $(facet_active_host $SINGLEMDS) load_modules_local
-       reformat_external_journal
-       add ${SINGLEMDS} $(mkfs_opts ${SINGLEMDS} ${MDT_DEVNAME}) --backfstype \
-               ldiskfs --reformat ${MDT_DEVNAME} $(mdsvdevname 1) > /dev/null ||
-               error "Fail to reformat the MDS!"
+       format_mdt $(facet_number $SINGLEMDS)
 
-       for ((i=$MINCOUNT; i<=$MAXCOUNT; i=$((i * FACTOR)))); do
+       for ((i = $MINCOUNT; i <= $MAXCOUNT; i = $((i * FACTOR)))); do
                local nfiles=$((i - BCOUNT))
 
                echo "+++ start to create for ${i} files set at: $(date) +++"
@@ -174,21 +174,24 @@ test_0() {
                echo "lfsck_namespace speed is ${SPEED}/sec"
                stop ${SINGLEMDS} > /dev/null || error "Fail to stop MDS!"
        done
+       combined_mgs_mds || stop mgs
 }
 run_test 0 "lfsck namespace performance (routine case) without load"
 
 test_1() {
+       [ "$mds1_FSTYPE" != ldiskfs ] &&
+               skip_env "not implemented for ZFS"
+
        local BCOUNT=0
        local i
 
        stopall
+       combined_mgs_mds || format_start_mgs
        do_rpc_nodes $(facet_active_host $SINGLEMDS) load_modules_local
-       reformat_external_journal
-       add ${SINGLEMDS} $(mkfs_opts ${SINGLEMDS} ${MDT_DEVNAME}) --backfstype \
-               ldiskfs --reformat ${MDT_DEVNAME} $(mdsvdevname 1) > /dev/null ||
-               error "Fail to reformat the MDS!"
+       format_mdt $(facet_number $SINGLEMDS)
 
-       for ((i=$MINCOUNT_REPAIR; i<=$MAXCOUNT_REPAIR; i=$((i * FACTOR)))); do
+       for ((i = $MINCOUNT_REPAIR; i <= $MAXCOUNT_REPAIR;
+             i = $((i * FACTOR)))); do
                local nfiles=$((i - BCOUNT))
 
                echo "+++ start to create for ${i} files set at: $(date) +++"
@@ -226,20 +229,19 @@ test_1() {
                echo "lfsck_namespace speed is ${SPEED}/sec"
                stop ${SINGLEMDS} > /dev/null || error "Fail to stop MDS!"
        done
+       combined_mgs_mds || stop mgs
 }
 run_test 1 "lfsck namespace performance (backup/restore) without load"
 
 test_2() {
        local i
 
-       for ((i=$MINCOUNT_REPAIR; i<=$MAXCOUNT_REPAIR; i=$((i * FACTOR)))); do
+       for ((i = $MINCOUNT_REPAIR; i <= $MAXCOUNT_REPAIR;
+             i = $((i * FACTOR)))); do
                stopall
+               combined_mgs_mds || format_start_mgs
                do_rpc_nodes $(facet_active_host $SINGLEMDS) load_modules_local
-               reformat_external_journal
-               add ${SINGLEMDS} $(mkfs_opts ${SINGLEMDS} ${MDT_DEVNAME}) \
-                       --backfstype ldiskfs --reformat ${MDT_DEVNAME} \
-                       $(mdsvdevname 1) > /dev/null ||
-                       error "Fail to reformat the MDS!"
+               format_mdt $(facet_number $SINGLEMDS)
 
                echo "+++ start to create for ${i} files set at: $(date) +++"
                lfsck_create_nfiles ${i} 0 ${NTHREADS} 1 ||
@@ -265,6 +267,7 @@ test_2() {
                echo "lfsck_namespace speed is ${SPEED}/sec"
                stop ${SINGLEMDS} > /dev/null || error "Fail to stop MDS!"
        done
+       combined_mgs_mds || stop mgs
 }
 run_test 2 "lfsck namespace performance (upgrade from 1.8) without load"
 
@@ -276,13 +279,11 @@ test_3() {
        local i
 
        stopall
+       combined_mgs_mds || format_start_mgs
        do_rpc_nodes $(facet_active_host $SINGLEMDS) load_modules_local
-       reformat_external_journal
-       add ${SINGLEMDS} $(mkfs_opts ${SINGLEMDS} ${MDT_DEVNAME}) --backfstype \
-               ldiskfs --reformat ${MDT_DEVNAME} $(mdsvdevname 1) > /dev/null ||
-               error "Fail to reformat the MDS!"
+       format_mdt $(facet_number $SINGLEMDS)
 
-       for ((i=$inc_count; i<=$BASE_COUNT; i=$((i + inc_count)))); do
+       for ((i = $inc_count; i <= $BASE_COUNT; i = $((i + inc_count)))); do
                local nfiles=$((i - BCOUNT))
 
                echo "+++ start to create for ${i} files set at: $(date) +++"
@@ -313,7 +314,7 @@ test_3() {
        local inc_speed=$((FULL_SPEED * INCFACTOR / 100))
        local j
 
-       for ((j=$inc_speed; j<$FULL_SPEED; j=$((j + inc_speed)))); do
+       for ((j = $inc_speed; j < $FULL_SPEED; j = $((j + inc_speed)))); do
                start ${SINGLEMDS} $MDT_DEVNAME $MNTOPTS_NOSCRUB > /dev/null ||
                        error "Fail to start MDS!"
 
@@ -350,17 +351,18 @@ test_3() {
        lfsck_create_nfiles ${nfiles} ${BCOUNT} ${NTHREADS} ||
                error "Fail to create files!"
        echo "+++ end to create for ${i} files set at: $(date) +++"
+       combined_mgs_mds || stop mgs
 }
 run_test 3 "lfsck namespace impact on create performance"
 
 show_layout() {
        local idx=$1
 
-       $RLCTL get_param -n mdd.$(facet_svc mds${idx}).lfsck_layout
+       do_facet mds${idx} \
+               "$LCTL get_param -n mdd.$(facet_svc mds${idx}).lfsck_layout"
 }
 
-layout_test_one()
-{
+layout_test_one() {
        echo "***** Start layout LFSCK on all devices at: $(date) *****"
        $RLCTL lfsck_start -M ${MDT_DEV} -t layout -A -r || return 21
 
@@ -383,12 +385,11 @@ layout_test_one()
        done
 }
 
-layout_gen_one()
-{
+layout_gen_one() {
        local idx1=$1
        local idx2=$2
        local mntpt="/mnt/lustre_lfsck_${idx1}_${idx2}"
-       local basedir="$mntpt/lfsck/$idx1/$idx2"
+       local basedir="$mntpt/$tdir/$idx1/$idx2"
 
        mkdir -p $mntpt || {
                error_noexit "(11) Fail to mkdir $mntpt"
@@ -417,15 +418,14 @@ layout_gen_one()
        umount_client $mntpt
 }
 
-layout_gen_set()
-{
+layout_gen_set() {
        local cnt=$1
 
        echo "##### Start generate test set for subdirs=$cnt at: $(date) #####"
-       for ((k=0; k<$MDSCOUNT; k++)); do
+       for ((k = 0; k < $MDSCOUNT; k++)); do
                $LFS mkdir -i ${k} $LFSCKDIR/${k} || return 10
 
-               for ((l=1; l<=$cnt; l++)); do
+               for ((l = 1; l <= $cnt; l++)); do
                        layout_gen_one ${k} ${l} &
                done
        done
@@ -434,22 +434,22 @@ layout_gen_set()
        echo "##### End generate test set for subdirs=$cnt at: $(date) #####"
 }
 
-t4_test()
-{
+t4_test() {
        local saved_mdscount=$MDSCOUNT
        local saved_ostcount=$OSTCOUNT
 
        echo "stopall"
        stopall > /dev/null || error "(1) Fail to stopall"
 
+       LFSCKDIR="$DIR/$tdir"
        MDSCOUNT=1
-       for ((i=1; i<=$saved_ostcount; i=$((i * 2)))); do
+       for ((i = 1; i <= $saved_ostcount; i = $((i * 2)))); do
                OSTCOUNT=${i}
 
                echo "+++++ Start cycle ostcount=$OSTCOUNT at: $(date) +++++"
                echo
 
-               for ((j=$MINSUBDIR; j<=$MAXSUBDIR; j=$((j * FACTOR)))); do
+               for ((j = $MINSUBDIR; j <= $MAXSUBDIR; j = $((j * FACTOR)))); do
                        echo "formatall"
                        formatall > /dev/null ||
                                error "(2) Fail to formatall, subdirs=${j}"
@@ -459,15 +459,15 @@ t4_test()
                                error "(3) Fail to setupall, subdirs=${j}"
 
                        mkdir $LFSCKDIR ||
-                       error "(4) Fail to mkdir $LFSCKDIR, subdirs=${j}"
+                               error "(4) mkdir $LFSCKDIR, subdirs=${j}"
 
                        $LFS setstripe -c ${OSTCOUNT} -i 0 $LFSCKDIR ||
-                       error "(5) Fail to setstripe on $LFSCKDIR, subdirs=${j}"
+                               error "(5) setstripe on $LFSCKDIR, subdirs=${j}"
 
                        local RC=0
                        layout_gen_set ${j} || RC=$?
                        [ $RC -eq 0 ] ||
-                       error "(6) Fail to generate set $RC, subdirs=${j}"
+                               error "(6) generate set $RC, subdirs=${j}"
 
                        RC=0
                        layout_test_one || RC=$?
@@ -484,9 +484,6 @@ t4_test()
 
        MDSCOUNT=$saved_mdscount
        OSTCOUNT=$saved_ostcount
-
-       echo "formatall"
-       formatall > /dev/null || error "(9) Fail to stopall"
 }
 
 test_4a() {
@@ -497,32 +494,26 @@ run_test 4a "Single MDS lfsck layout performance (routine case) without load"
 test_4b() {
        echo "Inject failure stub to simulate dangling reference"
        #define OBD_FAIL_LFSCK_DANGLING 0x1610
-       for i in $(seq $OSTCOUNT); do
-               do_facet ost${i} $LCTL set_param fail_loc=0x1610
-       done
+       do_nodes $(comma_list $(osts_nodes)) $LCTL set_param fail_loc=0x1610
 
        t4_test
-
-       for i in $(seq $OSTCOUNT); do
-               do_facet ost${i} $LCTL set_param fail_loc=0
-       done
 }
 run_test 4b "Single MDS lfsck layout performance (repairing case) without load"
 
-t5_test()
-{
+t5_test() {
        local saved_mdscount=$MDSCOUNT
 
        echo "stopall"
        stopall > /dev/null || error "(1) Fail to stopall"
 
-       for ((i=1; i<=$saved_mdscount; i++)); do
+       LFSCKDIR="$DIR/$tdir"
+       for ((i = 1; i <= $saved_mdscount; i++)); do
                MDSCOUNT=${i}
 
                echo "+++++ Start cycle mdscount=$MDSCOUNT at: $(date) +++++"
                echo
 
-               for ((j=$MINSUBDIR; j<=$MAXSUBDIR; j=$((j * FACTOR)))); do
+               for ((j = $MINSUBDIR; j <= $MAXSUBDIR; j = $((j * FACTOR)))); do
                        echo "formatall"
                        formatall > /dev/null ||
                                error "(2) Fail to formatall, subdirs=${j}"
@@ -532,15 +523,15 @@ t5_test()
                                error "(3) Fail to setupall, subdirs=${j}"
 
                        mkdir $LFSCKDIR ||
-                       error "(4) Fail to mkdir $LFSCKDIR, subdirs=${j}"
+                               error "(4) mkdir $LFSCKDIR, subdirs=${j}"
 
                        $LFS setstripe -c ${OSTCOUNT} -i 0 $LFSCKDIR ||
-                       error "(5) Fail to setstripe on $LFSCKDIR, subdirs=${j}"
+                               error "(5) setstripe on $LFSCKDIR, subdirs=${j}"
 
                        local RC=0
                        layout_gen_set ${j} || RC=$?
                        [ $RC -eq 0 ] ||
-                       error "(6) Fail to generate set $RC, subdirs=${j}"
+                               error "(6) generate set $RC, subdirs=${j}"
 
                        RC=0
                        layout_test_one || RC=$?
@@ -556,9 +547,6 @@ t5_test()
        done
 
        MDSCOUNT=$saved_mdscount
-
-       echo "formatall"
-       formatall > /dev/null || error "(9) Fail to stopall"
 }
 
 test_5a() {
@@ -569,19 +557,13 @@ run_test 5a "lfsck layout performance (routine case) without load for DNE"
 test_5b() {
        echo "Inject failure stub to simulate dangling reference"
        #define OBD_FAIL_LFSCK_DANGLING 0x1610
-       for i in $(seq $OSTCOUNT); do
-               do_facet ost${i} $LCTL set_param fail_loc=0x1610
-       done
+       do_nodes $(comma_list $(osts_nodes)) $LCTL set_param fail_loc=0x1610
 
        t5_test
-
-       for i in $(seq $OSTCOUNT); do
-               do_facet ost${i} $LCTL set_param fail_loc=0
-       done
 }
 run_test 5b "lfsck layout performance (repairing case) without load for DNE"
 
-layout_fast_create() {
+lfsck_fast_create() {
        local total=$1
        local lbase=$2
        local threads=$3
@@ -607,8 +589,7 @@ layout_fast_create() {
        done
 }
 
-lfsck_detach_error()
-{
+lfsck_detach_error() {
        lfsck_detach
        error "$@"
 }
@@ -621,6 +602,7 @@ test_6() {
 
        local saved_mdscount=$MDSCOUNT
 
+       LFSCKDIR="$DIR/$tdir"
        MDSCOUNT=1
        echo "formatall"
        formatall > /dev/null || error "(2) Fail to formatall"
@@ -659,8 +641,8 @@ test_6() {
        local nfiles=$((inc_count / 2))
 
        lfsck_attach
-       for ((m=0, n=$INCFACTOR; n<100;
-             m=$((m + inc_count)), n=$((n + INCFACTOR)))); do
+       for ((m = 0, n = $INCFACTOR; n < 100;
+             m = $((m + inc_count)), n = $((n + INCFACTOR)))); do
                local sl=$((SPEED * n / 100))
 
                $STOP_LFSCK > /dev/null 2>&1
@@ -671,7 +653,7 @@ test_6() {
                        "(9) Fail to start lfsck_layout with speed ${sl}"
 
                echo "&&&&& Start create files set from ${m} at: $(date) &&&&&"
-               layout_fast_create $nfiles ${m} $NTHREADS ||
+               lfsck_fast_create $nfiles ${m} $NTHREADS ||
                        lfsck_detach_error "(10) Fail to create files"
                echo "&&&&& End create files set from ${m} at: $(date) &&&&&"
        done
@@ -684,7 +666,7 @@ test_6() {
                "(11) Fail to start lfsck_layout with full speed"
 
        echo "&&&&& start to create files set from ${m} at: $(date) &&&&&"
-       layout_fast_create $nfiles ${m} $NTHREADS ||
+       lfsck_fast_create $nfiles ${m} $NTHREADS ||
                lfsck_detach_error "(12) Fail to create files"
        echo "&&&&& end to create files set from ${m} at: $(date) &&&&&"
 
@@ -693,7 +675,7 @@ test_6() {
        echo
        echo "create without lfsck_layout run back-ground"
        echo "&&&&& start to create files set from ${m} at: $(date) &&&&&"
-       layout_fast_create $nfiles ${m} $NTHREADS ||
+       lfsck_fast_create $nfiles ${m} $NTHREADS ||
                lfsck_detach_error "(13) Fail to create files"
        echo "&&&&& end to create files set from ${m} at: $(date) &&&&&"
 
@@ -703,13 +685,361 @@ test_6() {
        stopall > /dev/null || error "(14) Fail to stopall"
 
        MDSCOUNT=$saved_mdscount
+}
+run_test 6 "lfsck layout impact on create performance"
+
+show_namespace() {
+       local idx=$1
+
+       do_facet mds${idx} \
+               "$LCTL get_param -n mdd.$(facet_svc mds${idx}).lfsck_namespace"
+}
+
+namespace_test_one() {
+       echo "***** Start namespace LFSCK on all devices at: $(date) *****"
+       $RLCTL lfsck_start -M ${MDT_DEV} -t namespace -A -r || return 21
+
+       for n in $(seq $MDSCOUNT); do
+               wait_update_facet mds${n} "$LCTL get_param -n \
+                       mdd.$(facet_svc mds${n}).lfsck_namespace |
+                       awk '/^status/ { print \\\$2 }'" "completed" $WTIME || {
+                       show_namespace ${n}
+                       return 22
+               }
+       done
+       echo "***** End namespace LFSCK on all devices at: $(date) *****"
+
+       for n in $(seq $MDSCOUNT); do
+               show_namespace ${n}
+
+               local SPEED=$(show_namespace ${n} |
+                             awk '/^average_speed_total/ { print $2 }')
+               echo
+               echo "lfsck_namespace speed on MDS_${n} is $SPEED objs/sec"
+               echo
+       done
+}
+
+namespace_gen_one() {
+       local idx1=$1
+       local idx2=$2
+       local idx3=$(((idx1 + 1) % MDSCOUNT))
+       local base_mntpt="/mnt/lustre_lfsck_${idx1}"
+       local show_dir="$LFSCKDIR/${idx1}/${idx2}"
+       local work_dir="${base_mntpt}_0/$tdir/${idx1}/${idx2}"
+
+       mkdir $show_dir || return 20
+
+       local count=$((UNIT * 78 / 100)) # 78% regular files
+       local sub_count=$((count / NTHREADS))
+       echo "Creating $count regular files under $show_dir at: $(date)"
+       for ((m = 0; m < $NTHREADS; m++)); do
+               local sub_dir="${base_mntpt}_${m}/$tdir/${idx1}/${idx2}"
+
+               createmany -o ${sub_dir}/f_${m}_ $sub_count > /dev/null &
+       done
+
+       wait || {
+               error_noexit "(21) Fail to gen regular files under $show_dir"
+               return 21
+       }
+
+       count=$((UNIT * 3 / 100)) # 3% local sub-dirs
+       echo "Creating $count local sub-dirs under $show_dir at: $(date)"
+       createmany -d $work_dir/d_l_ $count > /dev/null || {
+               error_noexit "(22) Fail to gen local sub-dir under $show_dir"
+               return 22
+       }
+
+       # 3% * 5 = 15% regular files under local sub-dirs
+       echo "Creating 5 regular files under each local sub-dir at: $(date)"
+       for ((m = 0; m < $count; m++)); do
+               createmany -o $work_dir/d_l_${m}/f_l_ 5 > /dev/null || {
+                       error_noexit \
+                       "(23) Fail to gen regular under $work_dir/d_l_${m}"
+                       return 23
+               }
+       done
+
+       count=$((UNIT * 4 / 1000)) # 0.4% multiple hard-links
+       echo "Creating $count multiple hard-links under $show_dir at: $(date)"
+       for ((m = 0; m < $count; m++)); do
+               ln $work_dir/f_0_${m} $work_dir/f_m_${m} || {
+                       error_noexit \
+                       "(24) Fail to hardlink to $work_dir/f_0_${m}"
+                       return 24
+               }
+       done
+
+       count=$((UNIT * 3 / 1000)) # 0.3% remote sub-dirs
+       echo "Creating $count remote sub-dirs under $show_dir, and 4 regular" \
+               "files under each remote sub-dir at: $(date)"
+       for ((m = 0; m < $count; m++)); do
+               $LFS mkdir -i ${idx3} $work_dir/d_r_${m} || {
+                       error_noexit \
+                       "(25) Fail to remote mkdir $work_dir/d_r_${m}"
+                       return 25
+               }
+
+               # 0.3% * 4 = 1.2% regular files under remote sub-dirs
+               createmany -o $work_dir/d_r_${m}/f_r_ 4 > /dev/null || {
+                       error_noexit \
+                       "(26) Fail to gen regular under $work_dir/d_r_${m}"
+                       return 26
+               }
+       done
+
+       # 0.3% 2-striped sub-dirs + 0.6% shards of the 2-striped sub-dirs
+       count=$((UNIT * 3 / 1000))
+       echo "Creating $count 2-striped sub-dirs under $show_dir," \
+               "and 4 regular files under each striped sub-dir at: $(date)"
+       for ((m = 0; m < $count; m++)); do
+               $LFS setdirstripe -i ${idx1} -c 2 -H all_char \
+                       $work_dir/d_s_${m} || {
+                       error_noexit \
+                       "(27) Fail to make striped-dir $work_dir/d_s_${m}"
+                       return 27
+               }
+
+               # 0.3% * 4 = 1.2% regular files under striped sub-dirs
+               createmany -o $work_dir/d_s_${m}/f_s_ 4 > /dev/null || {
+                       error_noexit \
+                       "(28) Fail to gen regular under $work_dir/d_s_${m}"
+                       return 28
+               }
+       done
+}
+
+namespace_gen_mdt() {
+       local mdt_idx=$1
+       local dir_cnt=$2
+       local base_mntpt="/mnt/lustre_lfsck_${mdt_idx}"
+
+       $LFS mkdir -i ${mdt_idx} $LFSCKDIR/${mdt_idx} || return 10
+
+       for ((m = 0; m < $NTHREADS; m++)); do
+               local mntpt="${base_mntpt}_${m}"
+
+               mkdir -p $mntpt || {
+                       umount ${base_mntpt}_*
+                       error_noexit "(11) Fail to mkdir $mntpt"
+                       return 11
+               }
+
+               mount_client $mntpt || {
+                       umount ${base_mntpt}_*
+                       error_noexit "(12) Fail to mount $mntpt"
+                       return 12
+               }
+       done
+
+       for ((l = 0; l < $dir_cnt; l++)); do
+               namespace_gen_one ${mdt_idx} ${l}
+       done
+
+       umount ${base_mntpt}_*
+}
+
+namespace_gen_set() {
+
+       local cnt=$1
+
+       echo "##### Start generate test set for subdirs=$cnt at: $(date) #####"
+       for ((k = 0; k < $MDSCOUNT; k++)); do
+               namespace_gen_mdt ${k} ${cnt} &
+       done
+       wait
+       echo "##### End generate test set for subdirs=$cnt at: $(date) #####"
+}
+
+t7_test() {
+       local local_loc=$1
+       local saved_mdscount=$MDSCOUNT
+
+       [ $MDSCOUNT -le 8 ] ||
+               error "Too much MDT, test data set on each MDT may be unbalance"
+
+       echo "stopall"
+       stopall > /dev/null || error "(1) Fail to stopall"
+
+       LFSCKDIR="$DIR/$tdir"
+       for ((i = 2; i <= $saved_mdscount; i = $((i + 2)))); do
+               MDSCOUNT=${i}
+
+               echo "+++++ Start cycle mdscount=$MDSCOUNT at: $(date) +++++"
+               echo
+
+               for ((j = $MINSUBDIR; j <= $MAXSUBDIR;
+                     j = $((j + MINSUBDIR)))); do
+                       echo "formatall"
+                       formatall > /dev/null ||
+                               error "(2) Fail to formatall, subdirs=${j}"
+
+                       echo "setupall"
+                       setupall > /dev/null ||
+                               error "(3) Fail to setupall, subdirs=${j}"
+
+                       mkdir $LFSCKDIR ||
+                               error "(4) mkdir $LFSCKDIR, subdirs=${j}"
+
+                       $LFS setstripe -c 1 -i -1 $LFSCKDIR ||
+                               error "(5) Fail to setstripe on $LFSCKDIR"
+
+                       do_nodes $(comma_list $(mdts_nodes)) \
+                               $LCTL set_param fail_loc=$local_loc
+
+                       local RC=0
+                       namespace_gen_set ${j} || RC=$?
+                       [ $RC -eq 0 ] ||
+                               error "(6) generate set $RC, subdirs=${j}"
+
+                       RC=0
+                       namespace_test_one || RC=$?
+                       [ $RC -eq 0 ] ||
+                               error "(7) LFSCK failed with $RC, subdirs=${j}"
+
+                       do_nodes $(comma_list $(mdts_nodes)) \
+                               $LCTL set_param fail_loc=0
+               done
+
+               echo "stopall"
+               stopall > /dev/null || error "(8) Fail to stopall"
+
+               echo
+               echo "----- Stop cycle mdscount=$MDSCOUNT at: $(date) -----"
+       done
+
+       MDSCOUNT=$saved_mdscount
+}
+
+test_7a() {
+       t7_test 0
+}
+run_test 7a "namespace LFSCK performance (routine check) without load for DNE"
+
+test_7b() {
+       echo "Inject failure stub to simulate the case of lost linkEA"
+       #define OBD_FAIL_LFSCK_NO_LINKEA        0x161d
+       t7_test 0x161d
+}
+run_test 7b "namespace LFSCK performance (repairing lost linkEA) for DNE"
+
+test_7c() {
+       echo "Inject failure stub to simulate the case of bad FID-in-dirent"
+       #define OBD_FAIL_FID_INDIR      0x1501
+       t7_test 0x1501
+}
+run_test 7c "namespace LFSCK performance (repairing bad FID-in-dirent) for DNE"
+
+test_8() {
+       [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
+
+       [ $INCFACTOR -gt 25 ] && INCFACTOR=25
 
+       echo "stopall"
+       stopall > /dev/null || error "(1) Fail to stopall"
+
+       local saved_mdscount=$MDSCOUNT
+
+       LFSCKDIR="$DIR/$tdir"
+       MDSCOUNT=2
        echo "formatall"
-       formatall > /dev/null || error "(15) Fail to stopall"
+       formatall > /dev/null || error "(2) Fail to formatall"
+
+       echo "setupall"
+       setupall > /dev/null || error "(3) Fail to setupall"
+
+       mkdir $LFSCKDIR || error "(4) Fail to mkdir $LFSCKDIR"
+
+       $LFS setstripe -c 1 -i 0 $LFSCKDIR ||
+               error "(5) Fail to setstripe on $LFSCKDIR"
+
+       local RC=0
+       namespace_gen_set $TOTSUBDIR || RC=$?
+       [ $RC -eq 0 ] ||
+               error "(6) Fail to generate set $RC, subdirs=$TOTSUBDIR"
+
+       echo
+       echo "***** Start namespace LFSCK at: $(date) *****"
+       $RLCTL lfsck_start -M ${MDT_DEV} -t namespace -A -r ||
+               error "(7) Fail to start namespace LFSCK"
+
+       for n in $(seq $MDSCOUNT); do
+               wait_update_facet mds${n} "$LCTL get_param -n \
+                       mdd.$(facet_svc mds${n}).lfsck_namespace |
+                       awk '/^status/ { print \\\$2 }'" "completed" $WTIME || {
+                       show_namespace ${n}
+                       error "(8) namespace LFSCK cannot finished in time"
+               }
+       done
+       echo "***** End namespace LFSCK at: $(date) *****"
+
+       local SPEED=$(show_namespace 1 |
+                     awk '/^average_speed_phase1/ { print $2 }')
+       echo "lfsck_namespace full_speed is $SPEED objs/sec"
+       echo
+
+       local inc_count=$((BASE_COUNT * INCFACTOR / 100))
+       local nfiles=$((inc_count / 2))
+       local m=0
+
+       lfsck_attach
+
+       local stime=$(date +%s)
+       lfsck_fast_create $nfiles ${m} $NTHREADS ||
+               lfsck_detach_error "(9) Fail to create files"
+       local etime=$(date +%s)
+       echo "created $nfiles without lfsck_namespace run back-ground used" \
+               "$((etime - stime)) seconds"
+       echo
+
+       for ((m = nfiles, n = $INCFACTOR; n < 100;
+             m = $((m + inc_count)), n = $((n + INCFACTOR)))); do
+               local sl=$((SPEED * n / 100))
+
+               $STOP_LFSCK > /dev/null 2>&1
+               echo "start lfsck_namespace with speed ${sl} at: $(date)"
+               $RLCTL lfsck_start -M ${MDT_DEV} -t namespace -A -r -s ${sl} ||
+                       lfsck_detach_error \
+                       "(10) Fail to start lfsck_namespace with speed ${sl}"
+
+               stime=$(date +%s)
+               lfsck_fast_create $nfiles ${m} $NTHREADS ||
+                       lfsck_detach_error "(11) Fail to create files"
+               etime=$(date +%s)
+               echo "created $nfiles with namespace LFSCK run with the" \
+                       "speed limit of ${n}% of full speed used" \
+                       "$((etime - stime)) seconds"
+               echo
+       done
+
+       $STOP_LFSCK > /dev/null 2>&1
+       echo "start lfsck_namespace with full speed at: $(date)"
+       $RLCTL lfsck_start -M ${MDT_DEV} -t namespace -A -r -s 0 ||
+               lfsck_detach_error \
+               "(12) Fail to start lfsck_namespace with full speed"
+
+       stime=$(date +%s)
+       lfsck_fast_create $nfiles ${m} $NTHREADS ||
+               lfsck_detach_error "(13) Fail to create files"
+       etime=$(date +%s)
+       echo "created $nfiles with namespace LFSCK run with full speed used" \
+               "$((etime - stime)) seconds"
+       echo
+
+       $STOP_LFSCK > /dev/null 2>&1
+
+       lfsck_detach
+
+       echo "stopall"
+       stopall > /dev/null || error "(14) Fail to stopall"
+
+       MDSCOUNT=$saved_mdscount
 }
-run_test 6 "lfsck layout impact on create performance"
+run_test 8 "lfsck namespace impact on create performance"
 
 # cleanup the system at last
 lfsck_cleanup
 complete $SECONDS
+check_and_cleanup_lustre
 exit_status