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
[[ $(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"
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"
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
}
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() {
}
#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"
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 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 4 "Trigger OI scrub automatically if inconsistent OI mapping was found"
+run_test 4c "Auto trigger OI scrub if bad OI mapping was found (3)"
test_5() {
formatall > /dev/null
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
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
#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
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
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!"
# 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 }')
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"
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
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