diff mbox series

generic/648: dmerror must be unmounted

Message ID 20211016021456.3097323-1-zlang@redhat.com (mailing list archive)
State New, archived
Headers show
Series generic/648: dmerror must be unmounted | expand

Commit Message

Zorro Lang Oct. 16, 2021, 2:14 a.m. UTC
Sometimes g/648 fail to unmount dmerror with this error:

   umount: /mnt/xfstests/scratch: target is busy.

Even worse, it will cause all later test cases fail as:

  mount: bad usage
  Try 'mount --help' for more information.
  check: failed to mount $SCRATCH_DEV using specified options
  Interrupted!

So we shouldn't _fail directly if dmerror_unmount fails, use a while
loop to try to make sure it's unmounted.

Signed-off-by: Zorro Lang <zlang@redhat.com>
---
 tests/generic/648 | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

Comments

Darrick J. Wong Oct. 16, 2021, 3:50 a.m. UTC | #1
On Sat, Oct 16, 2021 at 10:14:56AM +0800, Zorro Lang wrote:
> Sometimes g/648 fail to unmount dmerror with this error:
> 
>    umount: /mnt/xfstests/scratch: target is busy.
> 
> Even worse, it will cause all later test cases fail as:
> 
>   mount: bad usage
>   Try 'mount --help' for more information.
>   check: failed to mount $SCRATCH_DEV using specified options
>   Interrupted!
> 
> So we shouldn't _fail directly if dmerror_unmount fails, use a while
> loop to try to make sure it's unmounted.

Can we preserve the "iteration XXX scratch unmount failed" message,
please?

--D

> Signed-off-by: Zorro Lang <zlang@redhat.com>
> ---
>  tests/generic/648 | 8 ++++++--
>  1 file changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/tests/generic/648 b/tests/generic/648
> index 83dd111d..218f207b 100755
> --- a/tests/generic/648
> +++ b/tests/generic/648
> @@ -104,7 +104,7 @@ for i in $(seq 1 $((25 * TIME_FACTOR)) ); do
>  		wait > /dev/null 2>&1
>  		ps -e | grep fsstress > /dev/null 2>&1
>  	done
> -	for ((i = 0; i < 10; i++)); do
> +	for ((j = 0; j < 10; j++)); do
>  		test -e "$snap_aliveflag" || break
>  		sleep 1
>  	done
> @@ -112,7 +112,11 @@ for i in $(seq 1 $((25 * TIME_FACTOR)) ); do
>  	# Mount again to replay log after loading working table, so we have a
>  	# consistent fs after test.
>  	$UMOUNT_PROG $loopmnt
> -	_dmerror_unmount || _fail "iteration $i scratch unmount failed"
> +	_dmerror_unmount > /dev/null 2>&1
> +	while [ $? -ne 0 ]; do
> +		sleep 1
> +		_dmerror_unmount > /dev/null 2>&1
> +	done
>  	_dmerror_load_working_table
>  	if ! _dmerror_mount; then
>  		_metadump_dev $DMERROR_DEV $seqres.scratch.$i.md
> -- 
> 2.31.1
>
Zorro Lang Oct. 16, 2021, 10:09 a.m. UTC | #2
On Fri, Oct 15, 2021 at 08:50:24PM -0700, Darrick J. Wong wrote:
> On Sat, Oct 16, 2021 at 10:14:56AM +0800, Zorro Lang wrote:
> > Sometimes g/648 fail to unmount dmerror with this error:
> > 
> >    umount: /mnt/xfstests/scratch: target is busy.
> > 
> > Even worse, it will cause all later test cases fail as:
> > 
> >   mount: bad usage
> >   Try 'mount --help' for more information.
> >   check: failed to mount $SCRATCH_DEV using specified options
> >   Interrupted!
> > 
> > So we shouldn't _fail directly if dmerror_unmount fails, use a while
> > loop to try to make sure it's unmounted.
> 
> Can we preserve the "iteration XXX scratch unmount failed" message,
> please?

Sure, how about this:
 -	_dmerror_unmount || _fail "iteration $i scratch unmount failed"
 +	_dmerror_unmount >> $seqres.full 2>&1
 +	while [ $? -ne 0 ]; do
 +              echo "iteration $i scratch unmount failed" >> $seqres.full
 +		sleep 1
 +		_dmerror_unmount >> $seqres.full 2>&1
 +	done

Or this (if you don't like the infinite while loop).

 +      is_unmounted=1
 +      for ((j = 0; j < 50; j++)); do
 +              sleep 1
 +              _dmerror_unmount > $tmp.unmount.err 2>&1
 +              if [ $? -eq 0 ];then
 +                      is_unmounted=0
 +                      break
 +              fi
 +      done
 +      if [ $is_unmounted -ne 0 ];then
 +              cat $tmp.unmount.err
 +              _fail "iteration $i scratch unmount failed"
 +      fi

Or other suggestions you have :)

Thanks,
Zorro

> 
> --D
> 
> > Signed-off-by: Zorro Lang <zlang@redhat.com>
> > ---
> >  tests/generic/648 | 8 ++++++--
> >  1 file changed, 6 insertions(+), 2 deletions(-)
> > 
> > diff --git a/tests/generic/648 b/tests/generic/648
> > index 83dd111d..218f207b 100755
> > --- a/tests/generic/648
> > +++ b/tests/generic/648
> > @@ -104,7 +104,7 @@ for i in $(seq 1 $((25 * TIME_FACTOR)) ); do
> >  		wait > /dev/null 2>&1
> >  		ps -e | grep fsstress > /dev/null 2>&1
> >  	done
> > -	for ((i = 0; i < 10; i++)); do
> > +	for ((j = 0; j < 10; j++)); do
> >  		test -e "$snap_aliveflag" || break
> >  		sleep 1
> >  	done
> > @@ -112,7 +112,11 @@ for i in $(seq 1 $((25 * TIME_FACTOR)) ); do
> >  	# Mount again to replay log after loading working table, so we have a
> >  	# consistent fs after test.
> >  	$UMOUNT_PROG $loopmnt
> > -	_dmerror_unmount || _fail "iteration $i scratch unmount failed"
> > +	_dmerror_unmount > /dev/null 2>&1
> > +	while [ $? -ne 0 ]; do
> > +		sleep 1
> > +		_dmerror_unmount > /dev/null 2>&1
> > +	done
> >  	_dmerror_load_working_table
> >  	if ! _dmerror_mount; then
> >  		_metadump_dev $DMERROR_DEV $seqres.scratch.$i.md
> > -- 
> > 2.31.1
> > 
>
Darrick J. Wong Oct. 18, 2021, 4:37 p.m. UTC | #3
On Sat, Oct 16, 2021 at 06:09:37PM +0800, Zorro Lang wrote:
> On Fri, Oct 15, 2021 at 08:50:24PM -0700, Darrick J. Wong wrote:
> > On Sat, Oct 16, 2021 at 10:14:56AM +0800, Zorro Lang wrote:
> > > Sometimes g/648 fail to unmount dmerror with this error:
> > > 
> > >    umount: /mnt/xfstests/scratch: target is busy.
> > > 
> > > Even worse, it will cause all later test cases fail as:
> > > 
> > >   mount: bad usage
> > >   Try 'mount --help' for more information.
> > >   check: failed to mount $SCRATCH_DEV using specified options
> > >   Interrupted!
> > > 
> > > So we shouldn't _fail directly if dmerror_unmount fails, use a while
> > > loop to try to make sure it's unmounted.
> > 
> > Can we preserve the "iteration XXX scratch unmount failed" message,
> > please?
> 
> Sure, how about this:
>  -	_dmerror_unmount || _fail "iteration $i scratch unmount failed"
>  +	_dmerror_unmount >> $seqres.full 2>&1
>  +	while [ $? -ne 0 ]; do
>  +              echo "iteration $i scratch unmount failed" >> $seqres.full
>  +		sleep 1
>  +		_dmerror_unmount >> $seqres.full 2>&1
>  +	done
> 
> Or this (if you don't like the infinite while loop).
> 
>  +      is_unmounted=1
>  +      for ((j = 0; j < 50; j++)); do
>  +              sleep 1
>  +              _dmerror_unmount > $tmp.unmount.err 2>&1
>  +              if [ $? -eq 0 ];then
>  +                      is_unmounted=0
>  +                      break
>  +              fi
>  +      done
>  +      if [ $is_unmounted -ne 0 ];then
>  +              cat $tmp.unmount.err
>  +              _fail "iteration $i scratch unmount failed"
>  +      fi
> 
> Or other suggestions you have :)

I like the second one.  FWIW the reason for "iteration XXX umount
failed" is that reviewers asked for that diagnostic capability so that
it would be easier to figure out how much progress the test made before
something broke.

--D

> 
> Thanks,
> Zorro
> 
> > 
> > --D
> > 
> > > Signed-off-by: Zorro Lang <zlang@redhat.com>
> > > ---
> > >  tests/generic/648 | 8 ++++++--
> > >  1 file changed, 6 insertions(+), 2 deletions(-)
> > > 
> > > diff --git a/tests/generic/648 b/tests/generic/648
> > > index 83dd111d..218f207b 100755
> > > --- a/tests/generic/648
> > > +++ b/tests/generic/648
> > > @@ -104,7 +104,7 @@ for i in $(seq 1 $((25 * TIME_FACTOR)) ); do
> > >  		wait > /dev/null 2>&1
> > >  		ps -e | grep fsstress > /dev/null 2>&1
> > >  	done
> > > -	for ((i = 0; i < 10; i++)); do
> > > +	for ((j = 0; j < 10; j++)); do
> > >  		test -e "$snap_aliveflag" || break
> > >  		sleep 1
> > >  	done
> > > @@ -112,7 +112,11 @@ for i in $(seq 1 $((25 * TIME_FACTOR)) ); do
> > >  	# Mount again to replay log after loading working table, so we have a
> > >  	# consistent fs after test.
> > >  	$UMOUNT_PROG $loopmnt
> > > -	_dmerror_unmount || _fail "iteration $i scratch unmount failed"
> > > +	_dmerror_unmount > /dev/null 2>&1
> > > +	while [ $? -ne 0 ]; do
> > > +		sleep 1
> > > +		_dmerror_unmount > /dev/null 2>&1
> > > +	done
> > >  	_dmerror_load_working_table
> > >  	if ! _dmerror_mount; then
> > >  		_metadump_dev $DMERROR_DEV $seqres.scratch.$i.md
> > > -- 
> > > 2.31.1
> > > 
> > 
>
diff mbox series

Patch

diff --git a/tests/generic/648 b/tests/generic/648
index 83dd111d..218f207b 100755
--- a/tests/generic/648
+++ b/tests/generic/648
@@ -104,7 +104,7 @@  for i in $(seq 1 $((25 * TIME_FACTOR)) ); do
 		wait > /dev/null 2>&1
 		ps -e | grep fsstress > /dev/null 2>&1
 	done
-	for ((i = 0; i < 10; i++)); do
+	for ((j = 0; j < 10; j++)); do
 		test -e "$snap_aliveflag" || break
 		sleep 1
 	done
@@ -112,7 +112,11 @@  for i in $(seq 1 $((25 * TIME_FACTOR)) ); do
 	# Mount again to replay log after loading working table, so we have a
 	# consistent fs after test.
 	$UMOUNT_PROG $loopmnt
-	_dmerror_unmount || _fail "iteration $i scratch unmount failed"
+	_dmerror_unmount > /dev/null 2>&1
+	while [ $? -ne 0 ]; do
+		sleep 1
+		_dmerror_unmount > /dev/null 2>&1
+	done
 	_dmerror_load_working_table
 	if ! _dmerror_mount; then
 		_metadump_dev $DMERROR_DEV $seqres.scratch.$i.md