2022-03-31 14:43:53

by Ritesh Harjani

[permalink] [raw]
Subject: [PATCHv3 3/4] generic/678: Add a new shutdown recovery test

From: Ritesh Harjani <[email protected]>

In certain cases (it is noted with ext4 fast_commit feature) that, replay phase
may not delete the right range of blocks (after sudden FS shutdown)
due to some operations which depends on inode->i_size (which during replay of
an inode with fast_commit could be 0 for sometime).
This fstest is added to test for such scenarios for all generic fs.

This test case is based on the test case shared via Xin Yin.

Signed-off-by: Ritesh Harjani <[email protected]>
---
tests/generic/678 | 72 +++++++++++++++++++++++++++++++++++++++++++
tests/generic/678.out | 7 +++++
2 files changed, 79 insertions(+)
create mode 100755 tests/generic/678
create mode 100644 tests/generic/678.out

diff --git a/tests/generic/678 b/tests/generic/678
new file mode 100755
index 00000000..46a7be6c
--- /dev/null
+++ b/tests/generic/678
@@ -0,0 +1,72 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2022 IBM Corporation. All Rights Reserved.
+#
+# FS QA Test 678
+#
+# This test with ext4 fast_commit feature w/o below patch missed to delete the right
+# range during replay phase, since it depends upon inode->i_size (which might not be
+# stable during replay phase, at least for ext4).
+# 0b5b5a62b945a141: ext4: use ext4_ext_remove_space() for fast commit replay delete range
+# (Based on test case shared by Xin Yin <[email protected]>)
+#
+
+. ./common/preamble
+_begin_fstest auto shutdown quick log recoveryloop
+
+# Override the default cleanup function.
+_cleanup()
+{
+ cd /
+ rm -r -f $tmp.*
+}
+
+# Import common functions.
+. ./common/filter
+. ./common/punch
+
+# real QA test starts here
+
+# Modify as appropriate.
+_supported_fs generic
+_require_scratch
+_require_xfs_io_command "fpunch"
+_require_xfs_io_command "fzero"
+_require_xfs_io_command "fiemap"
+_require_scratch_shutdown
+
+t1=$SCRATCH_MNT/foo
+t2=$SCRATCH_MNT/bar
+
+_scratch_mkfs > $seqres.full 2>&1
+
+_scratch_mount >> $seqres.full 2>&1
+
+bs=$(_get_file_block_size $SCRATCH_MNT)
+
+# create and write data to t1
+$XFS_IO_PROG -f -c "pwrite 0 $((100*$bs))" $t1 | _filter_xfs_io_numbers
+
+# fzero certain range in between with -k
+$XFS_IO_PROG -c "fzero -k $((40*$bs)) $((20*$bs))" $t1
+
+# create and fsync a new file t2
+$XFS_IO_PROG -f -c "fsync" $t2
+
+# fpunch within the i_size of a file
+$XFS_IO_PROG -c "fpunch $((30*$bs)) $((20*$bs))" $t1
+
+# fsync t1 to trigger journal operation
+$XFS_IO_PROG -c "fsync" $t1
+
+# shutdown FS now for replay journal to kick in next mount
+_scratch_shutdown -v >> $seqres.full 2>&1
+
+_scratch_cycle_mount
+
+# check fiemap reported is valid or not
+$XFS_IO_PROG -c "fiemap -v" $t1 | _filter_fiemap_flags $bs
+
+# success, all done
+status=0
+exit
diff --git a/tests/generic/678.out b/tests/generic/678.out
new file mode 100644
index 00000000..e0992edd
--- /dev/null
+++ b/tests/generic/678.out
@@ -0,0 +1,7 @@
+QA output created by 678
+wrote XXXX/XXXX bytes at offset XXXX
+XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+0: [0..29]: none
+1: [30..49]: hole
+2: [50..59]: unwritten
+3: [60..99]: nonelast
--
2.31.1


2022-04-04 04:25:49

by Dave Chinner

[permalink] [raw]
Subject: Re: [PATCHv3 3/4] generic/678: Add a new shutdown recovery test

On Thu, Mar 31, 2022 at 06:24:22PM +0530, Ritesh Harjani wrote:
> From: Ritesh Harjani <[email protected]>
>
> In certain cases (it is noted with ext4 fast_commit feature) that, replay phase
> may not delete the right range of blocks (after sudden FS shutdown)
> due to some operations which depends on inode->i_size (which during replay of
> an inode with fast_commit could be 0 for sometime).
> This fstest is added to test for such scenarios for all generic fs.
>
> This test case is based on the test case shared via Xin Yin.
>
> Signed-off-by: Ritesh Harjani <[email protected]>
> ---
> tests/generic/678 | 72 +++++++++++++++++++++++++++++++++++++++++++
> tests/generic/678.out | 7 +++++
> 2 files changed, 79 insertions(+)
> create mode 100755 tests/generic/678
> create mode 100644 tests/generic/678.out
>
> diff --git a/tests/generic/678 b/tests/generic/678
> new file mode 100755
> index 00000000..46a7be6c
> --- /dev/null
> +++ b/tests/generic/678
> @@ -0,0 +1,72 @@
> +#! /bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +# Copyright (c) 2022 IBM Corporation. All Rights Reserved.
> +#
> +# FS QA Test 678
> +#
> +# This test with ext4 fast_commit feature w/o below patch missed to delete the right
> +# range during replay phase, since it depends upon inode->i_size (which might not be
> +# stable during replay phase, at least for ext4).
> +# 0b5b5a62b945a141: ext4: use ext4_ext_remove_space() for fast commit replay delete range
> +# (Based on test case shared by Xin Yin <[email protected]>)
> +#
> +
> +. ./common/preamble
> +_begin_fstest auto shutdown quick log recoveryloop
> +
> +# Override the default cleanup function.
> +_cleanup()
> +{
> + cd /
> + rm -r -f $tmp.*
> +}

It's the same as the default cleanup function.

Cheers,

Dave.

--
Dave Chinner
[email protected]

2022-04-05 13:38:06

by Ritesh Harjani

[permalink] [raw]
Subject: Re: [PATCHv3 3/4] generic/678: Add a new shutdown recovery test

On 22/04/04 09:38AM, Dave Chinner wrote:
> On Thu, Mar 31, 2022 at 06:24:22PM +0530, Ritesh Harjani wrote:
> > From: Ritesh Harjani <[email protected]>
> >
> > In certain cases (it is noted with ext4 fast_commit feature) that, replay phase
> > may not delete the right range of blocks (after sudden FS shutdown)
> > due to some operations which depends on inode->i_size (which during replay of
> > an inode with fast_commit could be 0 for sometime).
> > This fstest is added to test for such scenarios for all generic fs.
> >
> > This test case is based on the test case shared via Xin Yin.
> >
> > Signed-off-by: Ritesh Harjani <[email protected]>
> > ---
> > tests/generic/678 | 72 +++++++++++++++++++++++++++++++++++++++++++
> > tests/generic/678.out | 7 +++++
> > 2 files changed, 79 insertions(+)
> > create mode 100755 tests/generic/678
> > create mode 100644 tests/generic/678.out
> >
> > diff --git a/tests/generic/678 b/tests/generic/678
> > new file mode 100755
> > index 00000000..46a7be6c
> > --- /dev/null
> > +++ b/tests/generic/678
> > @@ -0,0 +1,72 @@
> > +#! /bin/bash
> > +# SPDX-License-Identifier: GPL-2.0
> > +# Copyright (c) 2022 IBM Corporation. All Rights Reserved.
> > +#
> > +# FS QA Test 678
> > +#
> > +# This test with ext4 fast_commit feature w/o below patch missed to delete the right
> > +# range during replay phase, since it depends upon inode->i_size (which might not be
> > +# stable during replay phase, at least for ext4).
> > +# 0b5b5a62b945a141: ext4: use ext4_ext_remove_space() for fast commit replay delete range
> > +# (Based on test case shared by Xin Yin <[email protected]>)
> > +#
> > +
> > +. ./common/preamble
> > +_begin_fstest auto shutdown quick log recoveryloop
> > +
> > +# Override the default cleanup function.
> > +_cleanup()
> > +{
> > + cd /
> > + rm -r -f $tmp.*
> > +}
>
> It's the same as the default cleanup function.
>

Sure, will remove this definition from here in next revision.
Since it is available in common/preamble now.

-ritesh

> Cheers,
>
> Dave.
>
> --
> Dave Chinner
> [email protected]