Whamcloud - gitweb
LU-6313 tests: more robust for scrub test_11
[fs/lustre-release.git] / lustre / tests / sanity-scrub.sh
index 5ca94e2..ef08fcf 100644 (file)
@@ -24,7 +24,8 @@ SAVED_OSTSIZE=${OSTSIZE}
 SAVED_OSTCOUNT=${OSTCOUNT}
 # use small MDS + OST size to speed formatting time
 # do not use too small MDSSIZE/OSTSIZE, which affect the default journal size
-MDSSIZE=100000
+# 200M MDT device can guarantee uninitialized groups during the OI scrub
+MDSSIZE=200000
 OSTSIZE=100000
 # no need too much OSTs, to reduce the format/start/stop overhead
 [ $OSTCOUNT -gt 4 ] && OSTCOUNT=4
@@ -48,6 +49,9 @@ setupall
 [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.3.90) ]] &&
        ALWAYS_EXCEPT="$ALWAYS_EXCEPT 1a"
 
+[[ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.6.50) ]] &&
+       ALWAYS_EXCEPT="$ALWAYS_EXCEPT 4"
+
 [[ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.4.1) ]] &&
        ALWAYS_EXCEPT="$ALWAYS_EXCEPT 15"
 
@@ -58,6 +62,9 @@ setupall
 [[ $(lustre_version_code ost1) -lt $(version_code 2.4.50) ]] &&
        ALWAYS_EXCEPT="$ALWAYS_EXCEPT 11 12 13 14"
 
+[[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.5.59) ]] &&
+       SCRUB_ONLY="-t scrub"
+
 build_test_filter
 
 MDT_DEV="${FSNAME}-MDT0000"
@@ -68,8 +75,10 @@ scrub_start() {
        local error_id=$1
        local n
 
+       # use "lfsck_start -A" when we no longer need testing interop
        for n in $(seq $MDSCOUNT); do
-               do_facet mds$n $LCTL lfsck_start -M $(facet_svc mds$n) "$@" ||
+               do_facet mds$n $LCTL lfsck_start -M $(facet_svc mds$n) \
+                       $SCRUB_ONLY "$@" ||
                        error "($error_id) Failed to start OI scrub on mds$n"
        done
 }
@@ -78,6 +87,7 @@ scrub_stop() {
        local error_id=$1
        local n
 
+       # use "lfsck_stop -A" when we no longer need testing interop
        for n in $(seq $MDSCOUNT); do
                do_facet mds$n $LCTL lfsck_stop -M $(facet_svc mds$n) ||
                        error "($error_id) Failed to stop OI scrub on mds$n"
@@ -91,8 +101,8 @@ scrub_status() {
                osd-ldiskfs.$(facet_svc mds$n).oi_scrub
 }
 
-START_SCRUB="do_facet $SINGLEMDS $LCTL lfsck_start -M ${MDT_DEV}"
-START_SCRUB_ON_OST="do_facet ost1 $LCTL lfsck_start -M ${OST_DEV}"
+START_SCRUB="do_facet $SINGLEMDS $LCTL lfsck_start -M ${MDT_DEV} $SCRUB_ONLY"
+START_SCRUB_ON_OST="do_facet ost1 $LCTL lfsck_start -M ${OST_DEV} $SCRUB_ONLY"
 STOP_SCRUB="do_facet $SINGLEMDS $LCTL lfsck_stop -M ${MDT_DEV}"
 SHOW_SCRUB="do_facet $SINGLEMDS \
                $LCTL get_param -n osd-ldiskfs.${MDT_DEV}.oi_scrub"
@@ -119,6 +129,10 @@ scrub_prep() {
                fi
                cp $LUSTRE/tests/*.sh $DIR/$tdir/mds$n ||
                        error "Failed to copy files to mds$n"
+               mkdir -p $DIR/$tdir/mds$n/d_$tfile ||
+                       error "mkdir failed on mds$n"
+               createmany -m $DIR/$tdir/mds$n/d_$tfile/f 2 > \
+                       /dev/null || error "create failed on mds$n"
                if [[ $nfiles -gt 0 ]]; then
                        createmany -m $DIR/$tdir/mds$n/$tfile $nfiles > \
                                /dev/null || error "createmany failed on mds$n"
@@ -235,6 +249,18 @@ scrub_check_data() {
        done
 }
 
+scrub_check_data2() {
+       local filename=$1
+       local error_id=$2
+       local n
+
+       for n in $(seq $MDSCOUNT); do
+               diff -q $LUSTRE/tests/$filename \
+                       $DIR/$tdir/mds$n/$filename ||
+                       error "($error_id) File data check failed"
+       done
+}
+
 scrub_remove_ois() {
        local error_id=$1
        local index=$2
@@ -258,12 +284,28 @@ scrub_backup_restore() {
 }
 
 scrub_enable_auto() {
-       local n
+       do_nodes $(comma_list $(mdts_nodes)) $LCTL set_param -n \
+               osd-ldiskfs.*.auto_scrub=1
+}
 
-       for n in $(seq $MDSCOUNT); do
-               do_facet mds$n $LCTL set_param -n \
-                       osd-ldiskfs.$(facet_svc mds$n).auto_scrub 1
-       done
+full_scrub_ratio() {
+       [[ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.6.50) ]] &&
+               return
+
+       local ratio=$1
+
+       do_nodes $(comma_list $(mdts_nodes)) $LCTL set_param -n \
+               osd-ldiskfs.*.full_scrub_ratio=$ratio
+}
+
+full_scrub_threshold_rate() {
+       [[ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.6.50) ]] &&
+               return
+
+       local rate=$1
+
+       do_nodes $(comma_list $(mdts_nodes)) $LCTL set_param -n \
+               osd-ldiskfs.*.full_scrub_threshold_rate=$rate
 }
 
 test_0() {
@@ -363,7 +405,7 @@ test_3() {
 }
 #run_test 3 "Do not trigger OI scrub when MDT mounts if 'noscrub' specified"
 
-test_4() {
+test_4a() {
        scrub_prep 0
        scrub_backup_restore 1
        echo "starting MDTs with OI scrub disabled"
@@ -371,11 +413,163 @@ test_4() {
        scrub_check_flags 4 inconsistent
        mount_client $MOUNT || error "(5) Fail to start client!"
        scrub_enable_auto
+       full_scrub_ratio 0
        scrub_check_data 6
+       sleep 3
+
        scrub_check_status 7 completed
        scrub_check_flags 8 ""
+
+       local -a updated0
+       for n in $(seq $MDSCOUNT); do
+               updated0[$n]=$(scrub_status $n |
+                              awk '/^sf_items_updated_prior/ { print $2 }')
+       done
+
+       scrub_check_data2 sanity-scrub.sh 9
+       sleep 3
+
+       local -a updated1
+       for n in $(seq $MDSCOUNT); do
+               updated1[$n]=$(scrub_status $n |
+                              awk '/^sf_items_updated_prior/ { print $2 }')
+               [ ${updated0[$n]} -eq ${updated1[$n]} ] ||
+                       error "(10) NOT auto trigger full scrub as expected"
+       done
 }
-run_test 4 "Trigger OI scrub automatically if inconsistent OI mapping was found"
+run_test 4a "Auto trigger OI scrub if bad OI mapping was found (1)"
+
+test_4b() {
+       scrub_prep 5
+       scrub_backup_restore 1
+       echo "starting MDTs with OI scrub disabled"
+       scrub_start_mds 2 "$MOUNT_OPTS_NOSCRUB"
+       scrub_check_flags 4 inconsistent
+       mount_client $MOUNT || error "(5) Fail to start client!"
+       scrub_enable_auto
+       full_scrub_ratio 10
+       full_scrub_threshold_rate 10000
+       scrub_check_data 6
+       sleep 3
+
+       scrub_check_status 7 completed
+       scrub_check_flags 8 ""
+
+       local -a updated0
+       for n in $(seq $MDSCOUNT); do
+               updated0[$n]=$(scrub_status $n |
+                              awk '/^sf_items_updated_prior/ { print $2 }')
+       done
+
+       scrub_check_data2 sanity-scrub.sh 9
+       sleep 3
+
+       scrub_check_status 10 completed
+       scrub_check_flags 11 ""
+
+       local -a updated1
+       for n in $(seq $MDSCOUNT); do
+               updated1[$n]=$(scrub_status $n |
+                              awk '/^sf_items_updated_prior/ { print $2 }')
+               [ ${updated0[$n]} -lt ${updated1[$n]} ] ||
+                       error "(12) Auto trigger full scrub unexpectedly"
+       done
+
+       for n in $(seq $MDSCOUNT); do
+               ls -l $DIR/$tdir/mds$n/*.sh > /dev/null ||
+                       error "(13) fail to ls"
+       done
+       sleep 3
+
+       scrub_check_status 14 completed
+       scrub_check_flags 15 ""
+
+       for n in $(seq $MDSCOUNT); do
+               updated0[$n]=$(scrub_status $n |
+                              awk '/^sf_items_updated_prior/ { print $2 }')
+               [ ${updated0[$n]} -gt ${updated1[$n]} ] ||
+                       error "(16) Auto trigger full scrub unexpectedly"
+       done
+
+       for n in $(seq $MDSCOUNT); do
+               ls -l $DIR/$tdir/mds$n/d_${tfile}/ || error "(17) fail to ls"
+       done
+       sleep 3
+
+       for n in $(seq $MDSCOUNT); do
+               updated1[$n]=$(scrub_status $n |
+                              awk '/^sf_items_updated_prior/ { print $2 }')
+               [ ${updated0[$n]} -eq ${updated1[$n]} ] ||
+                       error "(18) NOT auto trigger full scrub as expected"
+       done
+}
+run_test 4b "Auto trigger OI scrub if bad OI mapping was found (2)"
+
+test_4c() {
+       scrub_prep 500
+       scrub_backup_restore 1
+       echo "starting MDTs with OI scrub disabled"
+       scrub_start_mds 2 "$MOUNT_OPTS_NOSCRUB"
+       scrub_check_flags 4 inconsistent
+       mount_client $MOUNT || error "(5) Fail to start client!"
+       scrub_enable_auto
+       full_scrub_ratio 2
+       full_scrub_threshold_rate 20
+       scrub_check_data 6
+       sleep 3
+
+       scrub_check_status 7 completed
+       scrub_check_flags 8 ""
+
+       local -a updated0
+       for n in $(seq $MDSCOUNT); do
+               updated0[$n]=$(scrub_status $n |
+                              awk '/^sf_items_updated_prior/ { print $2 }')
+       done
+
+       scrub_check_data2 sanity-scrub.sh 9
+       sleep 3
+
+       scrub_check_status 10 completed
+       scrub_check_flags 11 ""
+
+       local -a updated1
+       for n in $(seq $MDSCOUNT); do
+               updated1[$n]=$(scrub_status $n |
+                              awk '/^sf_items_updated_prior/ { print $2 }')
+               [ ${updated0[$n]} -lt ${updated1[$n]} ] ||
+                       error "(12) Auto trigger full scrub unexpectedly"
+       done
+
+       for n in $(seq $MDSCOUNT); do
+               ls -l $DIR/$tdir/mds$n/*.sh > /dev/null ||
+                       error "(13) fail to ls"
+       done
+       sleep 3
+
+       scrub_check_status 14 completed
+       scrub_check_flags 15 ""
+
+       for n in $(seq $MDSCOUNT); do
+               updated0[$n]=$(scrub_status $n |
+                              awk '/^sf_items_updated_prior/ { print $2 }')
+               [ ${updated0[$n]} -gt ${updated1[$n]} ] ||
+                       error "(16) Auto trigger full scrub unexpectedly"
+       done
+
+       for n in $(seq $MDSCOUNT); do
+               ls -l $DIR/$tdir/mds$n/${tfile}1 || error "(17) fail to ls"
+       done
+       sleep 3
+
+       for n in $(seq $MDSCOUNT); do
+               updated1[$n]=$(scrub_status $n |
+                              awk '/^sf_items_updated_prior/ { print $2 }')
+               [ ${updated0[$n]} -eq ${updated1[$n]} ] ||
+                       error "(18) NOT auto trigger full scrub as expected"
+       done
+}
+run_test 4c "Auto trigger OI scrub if bad OI mapping was found (3)"
 
 test_5() {
        formatall > /dev/null
@@ -394,6 +588,7 @@ test_5() {
        do_nodes $(comma_list $(mdts_nodes)) \
                $LCTL set_param fail_val=3 fail_loc=0x190
 
+       full_scrub_ratio 0
        scrub_check_data 6
        umount_client $MOUNT || error "(7) Fail to stop client!"
        scrub_check_status 8 scanning
@@ -426,6 +621,7 @@ test_5() {
        scrub_check_status 15 failed
        mount_client $MOUNT || error "(16) Fail to start client!"
 
+       full_scrub_ratio 0
        #define OBD_FAIL_OSD_SCRUB_DELAY         0x190
        do_nodes $(comma_list $(mdts_nodes)) \
                $LCTL set_param fail_val=3 fail_loc=0x190
@@ -457,8 +653,9 @@ test_6() {
 
        #define OBD_FAIL_OSD_SCRUB_DELAY         0x190
        do_nodes $(comma_list $(mdts_nodes)) \
-               $LCTL set_param fail_val=3 fail_loc=0x190
+               $LCTL set_param fail_val=2 fail_loc=0x190
 
+       full_scrub_ratio 0
        scrub_check_data 6
 
        # Sleep 5 sec to guarantee at least one object processed by OI scrub
@@ -536,6 +733,7 @@ test_7() {
        do_nodes $(comma_list $(mdts_nodes)) \
                $LCTL set_param fail_val=3 fail_loc=0x190
 
+       full_scrub_ratio 0
        scrub_check_data 6
 
        local n
@@ -674,6 +872,7 @@ test_10a() {
        do_nodes $(comma_list $(mdts_nodes)) \
                $LCTL set_param fail_val=1 fail_loc=0x190
 
+       full_scrub_ratio 0
        scrub_check_data 6
        scrub_check_status 7 scanning
        umount_client $MOUNT || error "(8) Fail to stop client!"
@@ -748,14 +947,13 @@ test_11() {
 
        # OI scrub should skip the new created objects for the first accessing
        # notice we're creating a new llog for every OST on every startup
-       # new features can make this even less stable, so we only check
-       # that the number of skipped files is less than 2x the number of files
-       local MAXIMUM=$((CREATED * 2))
+       # new features can make this even less stable, so we only check that
+       # the number of skipped files is more than the number or known created
        local MINIMUM=$((CREATED + 1)) # files + directory
        for n in $(seq $MDSCOUNT); do
                local SKIPPED=$(scrub_status $n | awk '/^noscrub/ { print $2 }')
-               [ $SKIPPED -ge $MAXIMUM -o $SKIPPED -lt $MINIMUM ] &&
-                       error "(5) Expect [ $MINIMUM , $MAXIMUM ) objects" \
+               [ $SKIPPED -lt $MINIMUM ] &&
+                       error "(5) Expect at least $MINIMUM objects" \
                                "skipped on mds$n, but got $SKIPPED"
 
                checked0[$n]=$(scrub_status $n | awk '/^checked/ { print $2 }')
@@ -781,12 +979,11 @@ test_12() {
        check_mount_and_prep
        $SETSTRIPE -c 1 -i 0 $DIR/$tdir
 
-       local count=$(precreated_ost_obj_count 0 0)
-
        #define OBD_FAIL_OSD_COMPAT_INVALID_ENTRY               0x195
        do_facet ost1 $LCTL set_param fail_loc=0x195
-       createmany -o $DIR/$tdir/f $((count + 32))
+       local count=$(precreated_ost_obj_count 0 0)
 
+       createmany -o $DIR/$tdir/f $((count + 32))
        umount_client $MOUNT || error "(1) Fail to stop client!"
 
        stop ost1 || error "(2) Fail to stop ost1"
@@ -820,10 +1017,10 @@ test_13() {
        check_mount_and_prep
        $SETSTRIPE -c 1 -i 0 $DIR/$tdir
 
-       local count=$(precreated_ost_obj_count 0 0)
-
        #define OBD_FAIL_OSD_COMPAT_NO_ENTRY            0x196
        do_facet ost1 $LCTL set_param fail_loc=0x196
+       local count=$(precreated_ost_obj_count 0 0)
+
        createmany -o $DIR/$tdir/f $((count + 32))
        do_facet ost1 $LCTL set_param fail_loc=0
 
@@ -853,10 +1050,10 @@ test_14() {
        check_mount_and_prep
        $SETSTRIPE -c 1 -i 0 $DIR/$tdir
 
-       local count=$(precreated_ost_obj_count 0 0)
-
        #define OBD_FAIL_OSD_COMPAT_NO_ENTRY            0x196
        do_facet ost1 $LCTL set_param fail_loc=0x196
+       local count=$(precreated_ost_obj_count 0 0)
+
        createmany -o $DIR/$tdir/f $((count + 32))
        do_facet ost1 $LCTL set_param fail_loc=0