On Tue, Apr 11, 2023 at 11:14:03AM -0700, Darrick J. Wong wrote: > From: Darrick J. Wong <djwong@xxxxxxxxxx> > > Make it so that we can run recovery loop tests for an exact number of > seconds. > > Signed-off-by: Darrick J. Wong <djwong@xxxxxxxxxx> > --- > common/rc | 34 ++++++++++++++++++++++++++++++++++ > tests/generic/019 | 1 + > tests/generic/388 | 2 +- > tests/generic/475 | 2 +- > tests/generic/482 | 5 +++++ > tests/generic/648 | 8 ++++---- > 6 files changed, 46 insertions(+), 6 deletions(-) > > > diff --git a/common/rc b/common/rc > index e89b0a3794..090f3d4938 100644 > --- a/common/rc > +++ b/common/rc > @@ -5078,6 +5078,40 @@ _save_coredump() > $COREDUMP_COMPRESSOR -f "$out_file" > } > > +# Decide if a soak test should continue looping. The sole parameter is the > +# number of soak loops that the test wants to run by default. The actual > +# loop iteration number is stored in SOAK_LOOPIDX until the loop completes. > +# > +# If the test runner set a SOAK_DURATION value, this predicate will keep > +# looping until it has run for at least that long. > +_soak_loop_running() { > + local max_soak_loops="$1" > + > + test -z "$SOAK_LOOPIDX" && SOAK_LOOPIDX=1 > + > + if [ -n "$SOAK_DURATION" ]; then > + if [ -z "$SOAK_DEADLINE" ]; then > + SOAK_DEADLINE="$(( $(date +%s) + SOAK_DURATION))" > + fi > + > + local now="$(date +%s)" > + if [ "$now" -gt "$SOAK_DEADLINE" ]; then > + unset SOAK_DEADLINE > + unset SOAK_LOOPIDX > + return 1 > + fi > + SOAK_LOOPIDX=$((SOAK_LOOPIDX + 1)) > + return 0 > + fi > + > + if [ "$SOAK_LOOPIDX" -gt "$max_soak_loops" ]; then > + unset SOAK_LOOPIDX > + return 1 > + fi > + SOAK_LOOPIDX=$((SOAK_LOOPIDX + 1)) > + return 0 > +} > + > init_rc > > ################################################################################ > diff --git a/tests/generic/019 b/tests/generic/019 > index b68dd90c0d..b81c1d17ba 100755 > --- a/tests/generic/019 > +++ b/tests/generic/019 > @@ -30,6 +30,7 @@ _cleanup() > } > > RUN_TIME=$((20+10*$TIME_FACTOR)) > +test -n "$SOAK_DURATION" && RUN_TIME="$SOAK_DURATION" > NUM_JOBS=$((4*LOAD_FACTOR)) > BLK_DEV_SIZE=`blockdev --getsz $SCRATCH_DEV` > FILE_SIZE=$((BLK_DEV_SIZE * 512)) > diff --git a/tests/generic/388 b/tests/generic/388 > index 9cd737e8eb..4a5be6698c 100755 > --- a/tests/generic/388 > +++ b/tests/generic/388 > @@ -42,7 +42,7 @@ _scratch_mkfs >> $seqres.full 2>&1 > _require_metadata_journaling $SCRATCH_DEV > _scratch_mount > > -for i in $(seq 1 $((50 * TIME_FACTOR)) ); do > +while _soak_loop_running $((50 * TIME_FACTOR)); do > ($FSSTRESS_PROG $FSSTRESS_AVOID -d $SCRATCH_MNT -n 999999 -p 4 >> $seqres.full &) \ > > /dev/null 2>&1 > > diff --git a/tests/generic/475 b/tests/generic/475 > index c426402ede..0cbf5131c2 100755 > --- a/tests/generic/475 > +++ b/tests/generic/475 > @@ -41,7 +41,7 @@ _require_metadata_journaling $SCRATCH_DEV > _dmerror_init > _dmerror_mount > > -for i in $(seq 1 $((50 * TIME_FACTOR)) ); do > +while _soak_loop_running $((50 * TIME_FACTOR)); do > ($FSSTRESS_PROG $FSSTRESS_AVOID -d $SCRATCH_MNT -n 999999 -p $((LOAD_FACTOR * 4)) >> $seqres.full &) \ > > /dev/null 2>&1 > > diff --git a/tests/generic/482 b/tests/generic/482 > index 28c83a232e..b980826b14 100755 > --- a/tests/generic/482 > +++ b/tests/generic/482 > @@ -62,8 +62,13 @@ nr_cpus=$("$here/src/feature" -o) > if [ $nr_cpus -gt 8 ]; then > nr_cpus=8 > fi > + > fsstress_args=$(_scale_fsstress_args -w -d $SCRATCH_MNT -n 512 -p $nr_cpus \ > $FSSTRESS_AVOID) > + > +# XXX dm-logwrites pins kernel memory for every write! > +# test -n "$SOAK_DURATION" && fsstress_args="$fsstress_args --duration=$SOAK_DURATION" Do you expect the second comment is a comment? Others looks good to me. I'll test V2 and merge it if no regression from it. Thanks, Zorro