From: Darrick J. Wong <djwong@xxxxxxxxxx> By default, online fsck stress testing kicks off the loops for fsstress and online fsck at the same time. However, in certain debugging scenarios it can help if we let fsstress get a head-start in filling up the filesystem. Plumb in a means to delay the start of the scrub loop. Signed-off-by: Darrick J. Wong <djwong@xxxxxxxxxx> --- common/fuzzy | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/common/fuzzy b/common/fuzzy index e42e2ccec1..1df51a6dd8 100644 --- a/common/fuzzy +++ b/common/fuzzy @@ -367,7 +367,8 @@ __stress_one_scrub_loop() { local end="$1" local runningfile="$2" local scrub_tgt="$3" - shift; shift; shift + local scrub_startat="$4" + shift; shift; shift; shift local agcount="$(_xfs_mount_agcount $SCRATCH_MNT)" local xfs_io_args=() @@ -383,6 +384,10 @@ __stress_one_scrub_loop() { fi done + while __stress_scrub_running "$scrub_startat" "$runningfile"; do + sleep 1 + done + while __stress_scrub_running "$end" "$runningfile"; do $XFS_IO_PROG -x "${xfs_io_args[@]}" "$scrub_tgt" 2>&1 | \ __stress_scrub_filter_output @@ -514,22 +519,27 @@ __stress_scrub_check_commands() { # -s Pass this command to xfs_io to test scrub. If zero -s options are # specified, xfs_io will not be run. # -t Run online scrub against this file; $SCRATCH_MNT is the default. +# -w Delay the start of the scrub/repair loop by this number of seconds. +# Defaults to no delay unless XFS_SCRUB_STRESS_DELAY is set. This value +# will be clamped to ten seconds before the end time. _scratch_xfs_stress_scrub() { local one_scrub_args=() local scrub_tgt="$SCRATCH_MNT" local runningfile="$tmp.fsstress" local freeze="${XFS_SCRUB_STRESS_FREEZE}" + local scrub_delay="${XFS_SCRUB_STRESS_DELAY:--1}" __SCRUB_STRESS_FREEZE_PID="" rm -f "$runningfile" touch "$runningfile" OPTIND=1 - while getopts "fs:t:" c; do + while getopts "fs:t:w:" c; do case "$c" in f) freeze=yes;; s) one_scrub_args+=("$OPTARG");; t) scrub_tgt="$OPTARG";; + w) scrub_delay="$OPTARG";; *) return 1; ;; esac done @@ -538,6 +548,9 @@ _scratch_xfs_stress_scrub() { local start="$(date +%s)" local end="$((start + (30 * TIME_FACTOR) ))" + local scrub_startat="$((start + scrub_delay))" + test "$scrub_startat" -gt "$((end - 10))" && + scrub_startat="$((end - 10))" echo "Loop started at $(date --date="@${start}")," \ "ending at $(date --date="@${end}")" >> $seqres.full @@ -551,7 +564,7 @@ _scratch_xfs_stress_scrub() { if [ "${#one_scrub_args[@]}" -gt 0 ]; then __stress_one_scrub_loop "$end" "$runningfile" "$scrub_tgt" \ - "${one_scrub_args[@]}" & + "$scrub_startat" "${one_scrub_args[@]}" & fi # Wait until the designated end time or fsstress dies, then kill all of