Skip to contentSkip to conversation

xfstests: very basic defragmentation testing for xfs & ext4

PATCH In review Eric Sandeen 4 participants 7 messages Jul 15, 2009 – Aug 10, 2009

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 xfstests: very basic defragmentation testing for xfs & ext4

Test a few very basic defragmentation scenarios.

This test creates some files, runs defrag on them, and compares the before/after fragmentation as well as file md5sums and timestamps.

(md5sums may just be reading buffered data though, suggestions?)

The test currently expects to find e4defrag in /usr/bin

It should be relatively easy to add more interestingly fragmented files to the tests, as well as to test that memory-mapped files aren't touched, etc - but this gives us a framework.

---

group +1 -0
@@ -326,3 +326,4 @@ prealloc
 215 auto metadata quick
 216 log metadata auto quick
 217 log metadata auto
+218 auto fsr quick
218 new file +131 -0

131 lines not on this page · raw message

218.out new file +19 -0
@@ -0,0 +1,19 @@
+QA output created by 218
+Empty file:
+Before: 0
+After: 0
+Sparse file (no blocks):
+Before: 0
+After: 0
+Contiguous file:
+Before: 1
+After: 1
+Write backwards sync, but contiguous - should defrag to 1 extent
+Before: 10
+After: 1
+Write backwards sync leaving holes - defrag should do nothing
+Before: 16
+After: 16
+Write forwards sync leaving holes - defrag should do nothing
+Before: 16
+After: 16

_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs

#1 lore raw
Quoted 6 lines · Eric Sandeen

This test creates some files, runs defrag on them, and compares the before/after fragmentation as well as file md5sums and timestamps.

(md5sums may just be reading buffered data though, suggestions?)

(umount; mount)?

Cheers, Andreas
--
Andreas Dilger
Sr. Staff Engineer, Lustre Group
Sun Microsystems of Canada, Inc.

_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs

#2 lore raw
Quoted 9 lines · Andreas Dilger
Quoted 6 lines · Eric Sandeen

This test creates some files, runs defrag on them, and compares the before/after fragmentation as well as file md5sums and timestamps.

(md5sums may just be reading buffered data though, suggestions?)

(umount; mount)?

I suppose that'd work :)

-Eric

Quoted 1 line

Cheers, Andreas

_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs

#3 lore raw
In reply to Eric Sandeen
Quoted 8 lines · Eric Sandeen

Test a few very basic defragmentation scenarios.

This test creates some files, runs defrag on them, and compares the before/after fragmentation as well as file md5sums and timestamps.

(md5sums may just be reading buffered data though, suggestions?)

As Andreas said unmount it before.

Quoted 5 lines

The test currently expects to find e4defrag in
/usr/bin

218 new file +1 -0
+_supported_fs xfs ext4
 

218 line 64

Quoted 10 lines
218 new file +10 -0
+fragfile=$SCRATCH_MNT/fragfile.$$
+
+if [ "$FSTYP" == "xfs" ]; then
+	DEFRAG=/usr/sbin/xfs_fsr
+else
+	DEFRAG=/usr/bin/e4defrag
+fi
+
+_require_command $DEFRAG
+_require_command /usr/sbin/filefrag

I think we're much better off adding a helpers for this in a new common.defrag (or adding it somwhere).

Then set a DEFRAF_PROG variable there, and add a _require_defrag ala

_require_defrag()

{
    case "$FSTYP" in
    xfs)
        DEFRAG_PROG=/usr/sbin/xfs_fsr
	;;
    ext4)
        DEFRAG_PROG=/usr/bin/e4defrag
	;;
    *)
        _notrun "defragmentation not supported for fstype \"$FSTYP\""
	;;
    esac

    _require_command $DEFRAG
    _require_command /usr/sbin/filefrag
}

_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs

#4 lore raw
Quoted 1 line · Christoph Hellwig

On Wed, Jul 15, 2009 at 03:21:11PM -0500, Eric Sandeen wrote:

...

Quoted 24 lines
Quoted 2 lines

(md5sums may just be reading buffered data though, suggestions?)

As Andreas said unmount it before.

Quoted 5 lines

The test currently expects to find e4defrag in
/usr/bin

218 new file +1 -0
+_supported_fs xfs ext4
 

218 line 64

Quoted 10 lines
218 new file +10 -0
+fragfile=$SCRATCH_MNT/fragfile.$$
+
+if [ "$FSTYP" == "xfs" ]; then
+	DEFRAG=/usr/sbin/xfs_fsr
+else
+	DEFRAG=/usr/bin/e4defrag
+fi
+
+_require_command $DEFRAG
+_require_command /usr/sbin/filefrag

I think we're much better off adding a helpers for this in a new common.defrag (or adding it somwhere).

Quoted 2 lines

Then set a DEFRAF_PROG variable there, and add a _require_defrag ala

Both ideas sound good, will send a V2.

-Eric

_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs

#5 lore raw

PATCH v2 1/1 xfstests 218: very basic defragmentation testing for xfs & ext4

In reply to Eric Sandeen

Test a few very basic defragmentation scenarios.

This test creates some files, runs defrag on them, and compares the before/after fragmentation as well as file md5sums and timestamps.

The test currently expects to find e4defrag in /usr/bin

It should be relatively easy to add more interestingly fragmented files to the tests, as well as to test that memory-mapped files aren't touched, etc - but this gives us a framework.

V2: remount before checking file contents, and create common.defrag.

---

218 new file +96 -0
new file mode 100755
index 0000000..8c8afe7
@@ -0,0 +1,96 @@
+#! /bin/sh
+# FS QA Test No. 218
+#
+# Basic defragmentation sanity tests
+#
+#-----------------------------------------------------------------------
+# Copyright (c) 2009 Eric Sandeen.  All Rights Reserved.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it would be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write the Free Software Foundation,
+# Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#-----------------------------------------------------------------------
+#
+# creator
[email protected]
+
+seq=`basename $0`
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=tmp/$$
+status=1	# failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_cleanup()
+{
+    cd /
+    rm -f $tmp.*
+    _cleanup_testdir
+}
+
+# get standard environment, filters and checks
+. ./common.rc
+. ./common.filter
+. ./common.defrag
+
+# real QA test starts here
+_supported_fs xfs ext4
+_supported_os Linux
+
+_setup_testdir
+# We require scratch so that we'll have free contiguous space
+_require_scratch
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount
+
+_require_defrag
+
+fragfile=$SCRATCH_MNT/fragfile.$$
+
+rm -f $fragfile
+
+# Craft some fragmented files, defrag them, check the result.
+
+echo "zero-length file:" | tee -a $seq.full
+touch $fragfile
+_defrag $fragfile
+
+echo "Sparse file (no blocks):" | tee -a $seq.full
+xfs_io -F -f -c "truncate 1m" $fragfile
+_defrag $fragfile
+
+echo "Contiguous file:" | tee -a $seq.full
+dd if=/dev/zero of=$fragfile bs=4k count=4 &>/dev/null
+_defrag $fragfile
+
+echo "Write backwards sync, but contiguous - should defrag to 1 extent" | tee -a $seq.full
+for I in `seq 9 -1 0`; do
+	dd if=/dev/zero of=$fragfile bs=4k count=1 conv=notrunc seek=$I oflag=sync &>/dev/null
+done
+_defrag $fragfile
+
+echo "Write backwards sync leaving holes - defrag should do nothing" | tee -a $seq.full
+for I in `seq 31 -2 0`; do
+	dd if=/dev/zero of=$fragfile bs=4k count=1 conv=notrunc seek=$I oflag=sync &>/dev/null
+done
+_defrag $fragfile
+
+echo "Write forwards sync leaving holes - defrag should do nothing" | tee -a $seq.full
+for I in `seq 0 2 31`; do
+	dd if=/dev/zero of=$fragfile bs=4k count=1 conv=notrunc seek=$I oflag=sync &>/dev/null
+done
+_defrag $fragfile
+
+rm -f $seq.full
+status=0
+exit
218.out new file +19 -0
new file mode 100644
index 0000000..7559cdd
@@ -0,0 +1,19 @@
+QA output created by 218
+zero-length file:
+Before: 0
+After: 0
+Sparse file (no blocks):
+Before: 0
+After: 0
+Contiguous file:
+Before: 1
+After: 1
+Write backwards sync, but contiguous - should defrag to 1 extent
+Before: 10
+After: 1
+Write backwards sync leaving holes - defrag should do nothing
+Before: 16
+After: 16
+Write forwards sync leaving holes - defrag should do nothing
+Before: 16
+After: 16
common.defrag new file +68 -0

68 lines not on this page · raw message

common.rc +11 -0
index 0d655ca..82b0d51 100644
@@ -198,6 +198,17 @@ _scratch_mount()
     _mount -t $FSTYP `_scratch_mount_options $*`
 }
 
+_scratch_unmount()
+{
+    $UMOUNT_PROG $SCRATCH_DEV
+}
+
+_scratch_remount()
+{
+    _scratch_unmount
+    _scratch_mount
+}
+
 _test_mount()
 {
     _test_options mount
group +1 -0
index 7a67ce7..b11f6a1 100644
@@ -327,3 +327,4 @@ prealloc
 215 auto metadata quick
 216 log metadata auto quick
 217 log metadata auto
+218 auto fsr quick

_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs

Reviewed-by on v2 1/1
#6 lore raw

Re: [PATCH V2] xfstests 218: very basic defragmentation testing for xfs & ext4

Quoted 9 lines · Eric Sandeen

Test a few very basic defragmentation scenarios.

This test creates some files, runs defrag on them, and compares the before/after fragmentation as well as file md5sums and timestamps.

The test currently expects to find e4defrag in /usr/bin

Quoted 7 lines

It should be relatively easy to add more interestingly fragmented files to the tests, as well as to test that memory-mapped files aren't touched, etc - but this gives us a framework.

V2: remount before checking file contents, and create common.defrag.

The patch loks good to me,

Unfortunately it still fails on my Debian testing system with:

QA output created by 218
zero-length file:
-Before: 0
-After: 0
+Before: 1
+After: 1
Sparse file (no blocks):
-Before: 0
-After: 0
+Before: 1
+After: 1

But that's due to a bug in filefrag that I have already reported to the Debian BTS.

_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs