Thread (12 messages) 12 messages, 3 authors, 2021-03-29

Re: [RFC PATCH v3 2/3] xfs: basic functionality test for shrinking free space in the last AG

From: Gao Xiang <hidden>
Date: 2021-03-29 02:43:58
Also in: fstests

Hi Eryu,

On Mon, Mar 29, 2021 at 10:14:26AM +0800, Eryu Guan wrote:
On Mon, Mar 29, 2021 at 04:06:03AM +0800, Gao Xiang wrote:
quoted
On Mon, Mar 29, 2021 at 12:32:39AM +0800, Eryu Guan wrote:
quoted
On Mon, Mar 15, 2021 at 07:19:25PM +0800, Gao Xiang wrote:
quoted
Add basic test to make sure the functionality works as expected.

Signed-off-by: Gao Xiang <redacted>
---
 tests/xfs/990     | 70 +++++++++++++++++++++++++++++++++++++++++++++++
 tests/xfs/990.out | 12 ++++++++
 tests/xfs/group   |  1 +
 3 files changed, 83 insertions(+)
 create mode 100755 tests/xfs/990
 create mode 100644 tests/xfs/990.out
diff --git a/tests/xfs/990 b/tests/xfs/990
new file mode 100755
index 00000000..3c79186e
--- /dev/null
+++ b/tests/xfs/990
@@ -0,0 +1,70 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2021 Red Hat, Inc.  All Rights Reserved.
+#
+# FS QA Test 990
+#
+# XFS shrinkfs basic functionality test
+#
+# This test attempts to shrink with a small size (512K), half AG size and
+# an out-of-bound size (agsize + 1) to observe if it works as expected.
+#
+seq=`basename $0`
+seqres=$RESULT_DIR/$seq
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=1    # failure is the default!
+trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+
+test_shrink()
+{
+	$XFS_GROWFS_PROG -D"$1" $SCRATCH_MNT >> $seqres.full 2>&1
+	ret=$?
I'm not sure what's the output of xfs_growfs when shrinking filesystem,
if it's easy to do filter, but it'd be good if we could just dump the
output and let .out file match & check the test result.
Not quite sure if it's of some use (e.g. also need to update expected output
when output changed), since I think just make sure the shrinked size is as
expected and xfs_repair won't argue anything on the new size, that would be
enough.
quoted
quoted
+
+	_scratch_unmount
+	_repair_scratch_fs >> $seqres.full
_repair_scratch_fs will fix corruption if there's any, and always return 0 if
completes without problems. Is _check_scratch_fs() what you want?
I didn't notice this, will update.
quoted
quoted
+	_scratch_mount >> $seqres.full
+
+	$XFS_INFO_PROG $SCRATCH_MNT 2>&1 | _filter_mkfs 2>$tmp.growfs >/dev/null
+	. $tmp.growfs
+	[ $ret -eq 0 -a $1 -eq $dblocks ]
Just dump the expected size after shrink if possible.
er... my idea is that I don't want to continue the test case
if any fails... if dump the expected size to output, I need to
fix blocksize as well, not sure if it's necessary.
quoted
quoted
+}
+
+# real QA test starts here
+_supported_fs xfs
Still missing _require_scratch
No, _require_xfs_shrink will include that, just as _require_xfs_scratch_rmapbt.
Then include the "scratch" part in the helper name, so it's clear that
it requires the SCRATCH_DEV, i.e. _require_xfs_scratch_shrink
ok, will rename this later. I'm working on the other stuff now.
quoted
quoted
quoted
+_require_xfs_shrink
+
+rm -f $seqres.full
+echo "Format and mount"
+_scratch_mkfs -dsize="$((512 * 1024 * 1024))" -dagcount=3 2>&1 | \
+	tee -a $seqres.full | _filter_mkfs 2>$tmp.mkfs
Better to explain why mkfs with agcount=3
just because agcount = 1 is forbidden on purpose, and I need to make sure
shrinking to 2 AG is not possible yet. So agcount = 3 is the minimum number.

It's just a functionality test, so agcount = 3 also makes the result
determinatively.
Yeah, I'd guess the reason, but it'd be great to make it clear in
comments.
ok, will try to add some description.
quoted
quoted
quoted
+. $tmp.mkfs
+t_dblocks=$dblocks
+_scratch_mount >> $seqres.full
+
+echo "Shrink fs (small size)"
+test_shrink $((t_dblocks-512*1024/dbsize)) || \
+	_fail "Shrink fs (small size) failure"
If it's possible to turn test_shrink to .out file matching way, _fail is
not needed and below.
The same as above. I could try to fix blocksize if the opinion is strong.
quoted
quoted
+
+echo "Shrink fs (half AG)"
+test_shrink $((t_dblocks-agsize/2)) || \
+	_fail "Shrink fs (half AG) failure"
+
+echo "Shrink fs (out-of-bound)"
+test_shrink $((t_dblocks-agsize-1)) && \
+	_fail "Shrink fs (out-of-bound) failure"
+[ $dblocks -ne $((t_dblocks-agsize/2)) ] && \
+	_fail "dblocks changed after shrinking failure"
+
+$XFS_INFO_PROG $SCRATCH_MNT >> $seqres.full
+echo "*** done"
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/990.out b/tests/xfs/990.out
new file mode 100644
index 00000000..812f89ef
--- /dev/null
+++ b/tests/xfs/990.out
@@ -0,0 +1,12 @@
+QA output created by 990
+Format and mount
+meta-data=DDEV isize=XXX agcount=N, agsize=XXX blks
+data     = bsize=XXX blocks=XXX, imaxpct=PCT
+         = sunit=XXX swidth=XXX, unwritten=X
+naming   =VERN bsize=XXX
+log      =LDEV bsize=XXX blocks=XXX
+realtime =RDEV extsz=XXX blocks=XXX, rtextents=XXX
+Shrink fs (small size)
+Shrink fs (half AG)
+Shrink fs (out-of-bound)
+*** done
diff --git a/tests/xfs/group b/tests/xfs/group
index e861cec9..a7981b67 100644
--- a/tests/xfs/group
+++ b/tests/xfs/group
@@ -525,3 +525,4 @@
 525 auto quick mkfs
 526 auto quick mkfs
 527 auto quick quota
+990 auto quick growfs
Maybe it's time to add a new 'shrinkfs' group?
not sure if it needs, since shrinkfs reuses growfs ioctl.
Ok, I have no strong preference on this, just think it's a bit easier to
run only shrink tests by ./check -g shrinkfs.
Currently only 2 test cases are available. ok, if that is needed, I could
add a new shrinkfs group.

(Also noted that xfsprogs patch haven't been merged yet. So I think the
 testcase needs to be formally merged after xfsprogs side is settled.)

Thanks,
Gao Xiang
Thanks,
Eryu
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help