]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - tests/zfs-tests/tests/functional/slog/slog_replay_fs_002.ksh
Vendor import of openzfs master @ 184df27eef0abdc7ab2105b21257f753834b936b
[FreeBSD/FreeBSD.git] / tests / zfs-tests / tests / functional / slog / slog_replay_fs_002.ksh
1 #!/bin/ksh -p
2 #
3 # CDDL HEADER START
4 #
5 # The contents of this file are subject to the terms of the
6 # Common Development and Distribution License (the "License").
7 # You may not use this file except in compliance with the License.
8 #
9 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 # or http://www.opensolaris.org/os/licensing.
11 # See the License for the specific language governing permissions
12 # and limitations under the License.
13 #
14 # When distributing Covered Code, include this CDDL HEADER in each
15 # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 # If applicable, add the following below this CDDL HEADER, with the
17 # fields enclosed by brackets "[]" replaced with your own identifying
18 # information: Portions Copyright [yyyy] [name of copyright owner]
19 #
20 # CDDL HEADER END
21 #
22
23 #
24 # Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
25 # Use is subject to license terms.
26 #
27
28 . $STF_SUITE/tests/functional/slog/slog.kshlib
29
30 #
31 # DESCRIPTION:
32 #       Verify slog replay correctly when TX_REMOVEs are followed by
33 #       TX_CREATEs.
34 #
35 # STRATEGY:
36 #       1. Create a file system (TESTFS) with a lot of files
37 #       2. Freeze TESTFS
38 #       3. Remove all files then create a lot of files
39 #       4. Copy TESTFS to temporary location (TESTDIR/copy)
40 #       5. Unmount filesystem
41 #          <at this stage TESTFS is empty again and unfrozen, and the
42 #          intent log contains a complete set of deltas to replay it>
43 #       6. Remount TESTFS <which replays the intent log>
44 #       7. Compare TESTFS against the TESTDIR/copy
45 #
46
47 verify_runnable "global"
48
49 function cleanup_fs
50 {
51         cleanup
52 }
53
54 log_assert "Replay of intent log succeeds."
55 log_onexit cleanup_fs
56 log_must setup
57
58 #
59 # 1. Create a file system (TESTFS) with a lot of files
60 #
61 log_must zpool create $TESTPOOL $VDEV log mirror $LDEV
62 log_must zfs set compression=on $TESTPOOL
63 log_must zfs create $TESTPOOL/$TESTFS
64
65 # Prep for the test of TX_REMOVE followed by TX_CREATE
66 dnsize=(legacy auto 1k 2k 4k 8k 16k)
67 NFILES=200
68 log_must mkdir /$TESTPOOL/$TESTFS/dir0
69 log_must eval 'for i in $(seq $NFILES); do zfs set dnodesize=${dnsize[$RANDOM % ${#dnsize[@]}]} $TESTPOOL/$TESTFS; touch /$TESTPOOL/$TESTFS/dir0/file.$i; done'
70
71 #
72 # Reimport to reset dnode allocation pointer.
73 # This is to make sure we will have TX_REMOVE and TX_CREATE on same id
74 #
75 log_must zpool export $TESTPOOL
76 log_must zpool import -f -d $VDIR $TESTPOOL
77
78 #
79 # This dd command works around an issue where ZIL records aren't created
80 # after freezing the pool unless a ZIL header already exists. Create a file
81 # synchronously to force ZFS to write one out.
82 #
83 log_must dd if=/dev/zero of=/$TESTPOOL/$TESTFS/sync \
84     conv=fdatasync,fsync bs=1 count=1
85
86 #
87 # 2. Freeze TESTFS
88 #
89 log_must zpool freeze $TESTPOOL
90
91 #
92 # 3. Remove all files then create a lot of files
93 #
94 # TX_REMOVE followed by TX_CREATE
95 log_must eval 'rm -f /$TESTPOOL/$TESTFS/dir0/*'
96 log_must eval 'for i in $(seq $NFILES); do zfs set dnodesize=${dnsize[$RANDOM % ${#dnsize[@]}]} $TESTPOOL/$TESTFS; touch /$TESTPOOL/$TESTFS/dir0/file.$i; done'
97
98 #
99 # 4. Copy TESTFS to temporary location (TESTDIR/copy)
100 #
101 log_must mkdir -p $TESTDIR/copy
102 log_must cp -a /$TESTPOOL/$TESTFS/* $TESTDIR/copy/
103
104 #
105 # 5. Unmount filesystem and export the pool
106 #
107 # At this stage TESTFS is empty again and frozen, the intent log contains
108 # a complete set of deltas to replay.
109 #
110 log_must zfs unmount /$TESTPOOL/$TESTFS
111
112 log_note "Verify transactions to replay:"
113 log_must zdb -iv $TESTPOOL/$TESTFS
114
115 log_must zpool export $TESTPOOL
116
117 #
118 # 6. Remount TESTFS <which replays the intent log>
119 #
120 # Import the pool to unfreeze it and claim log blocks.  It has to be
121 # `zpool import -f` because we can't write a frozen pool's labels!
122 #
123 log_must zpool import -f -d $VDIR $TESTPOOL
124
125 #
126 # 7. Compare TESTFS against the TESTDIR/copy
127 #
128 log_note "Verify current block usage:"
129 log_must zdb -bcv $TESTPOOL
130
131 log_note "Verify number of files"
132 log_must test "$(ls /$TESTPOOL/$TESTFS/dir0 | wc -l)" -eq $NFILES
133
134 log_note "Verify working set diff:"
135 log_must diff -r /$TESTPOOL/$TESTFS $TESTDIR/copy
136
137 log_pass "Replay of intent log succeeds."