aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/runfiles/linux.run2
-rw-r--r--tests/zfs-tests/tests/functional/slog/Makefile.am3
-rw-r--r--tests/zfs-tests/tests/functional/slog/slog.cfg4
-rw-r--r--tests/zfs-tests/tests/functional/slog/slog.kshlib1
-rwxr-xr-xtests/zfs-tests/tests/functional/slog/slog_015_pos.ksh201
5 files changed, 207 insertions, 4 deletions
diff --git a/tests/runfiles/linux.run b/tests/runfiles/linux.run
index d9d5d58d6..079bc1a81 100644
--- a/tests/runfiles/linux.run
+++ b/tests/runfiles/linux.run
@@ -585,7 +585,7 @@ tests = ['scrub_mirror_001_pos', 'scrub_mirror_002_pos',
[tests/functional/slog]
tests = ['slog_001_pos', 'slog_002_pos', 'slog_003_pos', 'slog_004_pos',
'slog_005_pos', 'slog_006_pos', 'slog_007_pos', 'slog_008_neg',
- 'slog_009_neg', 'slog_010_neg', 'slog_011_neg']
+ 'slog_009_neg', 'slog_010_neg', 'slog_011_neg', 'slog_015_pos']
# DISABLED:
# clone_001_pos - https://github.com/zfsonlinux/zfs/issues/3484
diff --git a/tests/zfs-tests/tests/functional/slog/Makefile.am b/tests/zfs-tests/tests/functional/slog/Makefile.am
index c37047280..23c07b297 100644
--- a/tests/zfs-tests/tests/functional/slog/Makefile.am
+++ b/tests/zfs-tests/tests/functional/slog/Makefile.am
@@ -17,4 +17,5 @@ dist_pkgdata_SCRIPTS = \
slog_011_neg.ksh \
slog_012_neg.ksh \
slog_013_pos.ksh \
- slog_014_pos.ksh
+ slog_014_pos.ksh \
+ slog_015_pos.ksh
diff --git a/tests/zfs-tests/tests/functional/slog/slog.cfg b/tests/zfs-tests/tests/functional/slog/slog.cfg
index 28cce1aae..5ac9a46c5 100644
--- a/tests/zfs-tests/tests/functional/slog/slog.cfg
+++ b/tests/zfs-tests/tests/functional/slog/slog.cfg
@@ -30,8 +30,8 @@
export SIZE=64M
-export VDIR=/disk-slog
-export VDIR2=/disk2-slog
+export VDIR=$TEST_BASE_DIR/disk-slog
+export VDIR2=$TEST_BASE_DIR/disk2-slog
export VDEV="$VDIR/a $VDIR/b $VDIR/c"
export SDEV="$VDIR/d"
diff --git a/tests/zfs-tests/tests/functional/slog/slog.kshlib b/tests/zfs-tests/tests/functional/slog/slog.kshlib
index 124bfe6d2..0aca19aa2 100644
--- a/tests/zfs-tests/tests/functional/slog/slog.kshlib
+++ b/tests/zfs-tests/tests/functional/slog/slog.kshlib
@@ -39,6 +39,7 @@ function cleanup
if datasetexists $TESTPOOL2 ; then
log_must $ZPOOL destroy -f $TESTPOOL2
fi
+ rm -rf $TESTDIR
}
#
diff --git a/tests/zfs-tests/tests/functional/slog/slog_015_pos.ksh b/tests/zfs-tests/tests/functional/slog/slog_015_pos.ksh
new file mode 100755
index 000000000..71833e7c1
--- /dev/null
+++ b/tests/zfs-tests/tests/functional/slog/slog_015_pos.ksh
@@ -0,0 +1,201 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+
+#
+# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+. $STF_SUITE/tests/functional/slog/slog.kshlib
+
+#
+# DESCRIPTION:
+# Verify slogs are replayed correctly. This test is a direct
+# adaptation of the ziltest.sh script for the ZFS Test Suite.
+#
+# The general idea is to build up an intent log from a bunch of
+# diverse user commands without actually committing them to the
+# file system. Then copy the file system, replay the intent
+# log and compare the file system and the copy.
+#
+# To enable this automated testing of the intent log some minimal
+# support is required of the file system. In particular, a
+# "freeze" command is required to flush the in-flight transactions;
+# to stop the actual committing of transactions; and to ensure no
+# deltas are discarded. All deltas past a freeze point are kept
+# for replay and comparison later. Here is the flow:
+#
+# STRATEGY:
+# 1. Create an empty file system (TESTFS)
+# 2. Freeze TESTFS
+# 3. Run various user commands that create files, directories and ACLs
+# 4. Copy TESTFS to temporary location (TESTDIR)
+# 5. Unmount filesystem
+# <at this stage TESTFS is empty again and unfrozen, and the
+# intent log contains a complete set of deltas to replay it>
+# 6. Remount TESTFS <which replays the intent log>
+# 7. Compare TESTFS against the TESTDIR copy
+#
+
+verify_runnable "global"
+
+log_assert "Replay of intent log succeeds."
+log_onexit cleanup
+
+#
+# 1. Create an empty file system (TESTFS)
+#
+log_must $ZPOOL create $TESTPOOL $VDEV log mirror $LDEV
+log_must $ZFS set compression=on $TESTPOOL
+log_must $ZFS create $TESTPOOL/$TESTFS
+log_must $MKDIR -p $TESTDIR
+
+#
+# This dd command works around an issue where ZIL records aren't created
+# after freezing the pool unless a ZIL header already exists. Create a file
+# synchronously to force ZFS to write one out.
+#
+log_must $GNUDD if=/dev/zero of=/$TESTPOOL/$TESTFS/sync \
+ conv=fdatasync,fsync bs=1 count=1
+
+#
+# 2. Freeze TESTFS
+#
+log_must $ZPOOL freeze $TESTPOOL
+
+#
+# 3. Run various user commands that create files, directories and ACLs
+#
+
+# TX_CREATE
+log_must touch /$TESTPOOL/$TESTFS/a
+
+# TX_RENAME
+log_must mv /$TESTPOOL/$TESTFS/a /$TESTPOOL/$TESTFS/b
+
+# TX_SYMLINK
+log_must touch /$TESTPOOL/$TESTFS/c
+log_must ln -s /$TESTPOOL/$TESTFS/c /$TESTPOOL/$TESTFS/d
+
+# TX_LINK
+log_must touch /$TESTPOOL/$TESTFS/e
+log_must ln /$TESTPOOL/$TESTFS/e /$TESTPOOL/$TESTFS/f
+
+# TX_MKDIR
+log_must mkdir /$TESTPOOL/$TESTFS/dir_to_delete
+
+# TX_RMDIR
+log_must rmdir /$TESTPOOL/$TESTFS/dir_to_delete
+
+# Create a simple validation payload
+log_must $DD if=/dev/urandom of=/$TESTPOOL/$TESTFS/payload bs=1k count=8
+CHECKSUM_BEFORE=$(sha256sum -b /$TESTPOOL/$TESTFS/payload)
+
+# TX_WRITE (small file with ordering)
+log_must $MKFILE 1k /$TESTPOOL/$TESTFS/small_file
+log_must $MKFILE 512b /$TESTPOOL/$TESTFS/small_file
+
+# TX_CREATE, TX_MKDIR, TX_REMOVE, TX_RMDIR
+log_must cp -R /usr/share/dict /$TESTPOOL/$TESTFS
+log_must rm -rf /$TESTPOOL/$TESTFS/dict
+
+# TX_SETATTR
+log_must touch /$TESTPOOL/$TESTFS/setattr
+log_must chmod 567 /$TESTPOOL/$TESTFS/setattr
+log_must chgrp root /$TESTPOOL/$TESTFS/setattr
+log_must touch -cm -t 201311271200 /$TESTPOOL/$TESTFS/setattr
+
+# TX_TRUNCATE (to zero)
+log_must $MKFILE 4k /$TESTPOOL/$TESTFS/truncated_file
+log_must $TRUNCATE -s 0 /$TESTPOOL/$TESTFS/truncated_file
+
+# TX_WRITE (large file)
+log_must $DD if=/dev/urandom of=/$TESTPOOL/$TESTFS/large \
+ bs=128k count=64 oflag=sync
+
+# Write zeroes, which compresss to holes, in the middle of a file
+log_must $DD if=/dev/urandom of=/$TESTPOOL/$TESTFS/holes.1 bs=128k count=8
+log_must $DD if=/dev/zero of=/$TESTPOOL/$TESTFS/holes.1 bs=128k count=2
+
+log_must $DD if=/dev/urandom of=/$TESTPOOL/$TESTFS/holes.2 bs=128k count=8
+log_must $DD if=/dev/zero of=/$TESTPOOL/$TESTFS/holes.2 bs=128k count=2 seek=2
+
+log_must $DD if=/dev/urandom of=/$TESTPOOL/$TESTFS/holes.3 bs=128k count=8
+log_must $DD if=/dev/zero of=/$TESTPOOL/$TESTFS/holes.3 bs=128k count=2 \
+ seek=2 conv=notrunc
+
+# TX_MKXATTR
+log_must $MKDIR /$TESTPOOL/$TESTFS/xattr.dir
+log_must attr -qs fileattr -V HelloWorld /$TESTPOOL/$TESTFS/xattr.dir
+log_must attr -qs tmpattr -V HelloWorld /$TESTPOOL/$TESTFS/xattr.dir
+log_must attr -qr tmpattr /$TESTPOOL/$TESTFS/xattr.dir
+
+log_must touch /$TESTPOOL/$TESTFS/xattr.file
+log_must attr -qs fileattr -V HelloWorld /$TESTPOOL/$TESTFS/xattr.file
+log_must attr -qs tmpattr -V HelloWorld /$TESTPOOL/$TESTFS/xattr.file
+log_must attr -qr tmpattr /$TESTPOOL/$TESTFS/xattr.file
+
+#
+# 4. Copy TESTFS to temporary location (TESTDIR)
+#
+log_must cp -a /$TESTPOOL/$TESTFS/* $TESTDIR
+
+#
+# 5. Unmount filesystem and export the pool
+#
+# At this stage TESTFS is empty again and unfrozen, and the
+# intent log contains a complete set of deltas to replay it.
+#
+log_must $ZFS unmount /$TESTPOOL/$TESTFS
+
+log_note "Verify transactions to replay:"
+log_must $ZDB -iv $TESTPOOL/$TESTFS
+
+log_must $ZPOOL export $TESTPOOL
+
+#
+# 6. Remount TESTFS <which replays the intent log>
+#
+# Import the pool to unfreeze it and claim log blocks. It has to be
+# `zpool import -f` because we can't write a frozen pool's labels!
+#
+log_must $ZPOOL import -f -d $VDIR $TESTPOOL
+
+#
+# 7. Compare TESTFS against the TESTDIR copy
+#
+log_note "Verify current block usage:"
+log_must $ZDB -bcv $TESTPOOL
+
+log_note "Verify copy of xattrs:"
+log_must attr -l /$TESTPOOL/$TESTFS/xattr.dir
+log_must attr -l /$TESTPOOL/$TESTFS/xattr.file
+
+log_note "Verify working set diff:"
+log_must diff -r /$TESTPOOL/$TESTFS $TESTDIR >/dev/null || \
+ diff -r /$TESTPOOL/$TESTFS $TESTDIR
+
+log_note "Verify file checksum:"
+log_note "$CHECKSUM_BEFORE"
+log_must echo "$CHECKSUM_BEFORE" | sha256sum -c
+
+log_pass "Replay of intent log succeeds."