1*d8849d7dSChunwei Chen#!/bin/ksh -p
2*d8849d7dSChunwei Chen#
3*d8849d7dSChunwei Chen# CDDL HEADER START
4*d8849d7dSChunwei Chen#
5*d8849d7dSChunwei Chen# The contents of this file are subject to the terms of the
6*d8849d7dSChunwei Chen# Common Development and Distribution License (the "License").
7*d8849d7dSChunwei Chen# You may not use this file except in compliance with the License.
8*d8849d7dSChunwei Chen#
9*d8849d7dSChunwei Chen# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*d8849d7dSChunwei Chen# or http://www.opensolaris.org/os/licensing.
11*d8849d7dSChunwei Chen# See the License for the specific language governing permissions
12*d8849d7dSChunwei Chen# and limitations under the License.
13*d8849d7dSChunwei Chen#
14*d8849d7dSChunwei Chen# When distributing Covered Code, include this CDDL HEADER in each
15*d8849d7dSChunwei Chen# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*d8849d7dSChunwei Chen# If applicable, add the following below this CDDL HEADER, with the
17*d8849d7dSChunwei Chen# fields enclosed by brackets "[]" replaced with your own identifying
18*d8849d7dSChunwei Chen# information: Portions Copyright [yyyy] [name of copyright owner]
19*d8849d7dSChunwei Chen#
20*d8849d7dSChunwei Chen# CDDL HEADER END
21*d8849d7dSChunwei Chen#
22*d8849d7dSChunwei Chen
23*d8849d7dSChunwei Chen#
24*d8849d7dSChunwei Chen# Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
25*d8849d7dSChunwei Chen# Use is subject to license terms.
26*d8849d7dSChunwei Chen#
27*d8849d7dSChunwei Chen
28*d8849d7dSChunwei Chen. $STF_SUITE/tests/functional/slog/slog.kshlib
29*d8849d7dSChunwei Chen
30*d8849d7dSChunwei Chen#
31*d8849d7dSChunwei Chen# DESCRIPTION:
32*d8849d7dSChunwei Chen#	Verify slogs are replayed correctly.  This test is a direct
33*d8849d7dSChunwei Chen#	adaptation of the ziltest.sh script for the ZFS Test Suite.
34*d8849d7dSChunwei Chen#
35*d8849d7dSChunwei Chen#	The general idea is to build up an intent log from a bunch of
36*d8849d7dSChunwei Chen#	diverse user commands without actually committing them to the
37*d8849d7dSChunwei Chen#	file system.  Then copy the file system, replay the intent
38*d8849d7dSChunwei Chen#	log and compare the file system and the copy.
39*d8849d7dSChunwei Chen#
40*d8849d7dSChunwei Chen#	To enable this automated testing of the intent log some minimal
41*d8849d7dSChunwei Chen#	support is required of the file system.  In particular, a
42*d8849d7dSChunwei Chen#	"freeze" command is required to flush the in-flight transactions;
43*d8849d7dSChunwei Chen#	to stop the actual committing of transactions; and to ensure no
44*d8849d7dSChunwei Chen#	deltas are discarded. All deltas past a freeze point are kept
45*d8849d7dSChunwei Chen#	for replay and comparison later. Here is the flow:
46*d8849d7dSChunwei Chen#
47*d8849d7dSChunwei Chen# STRATEGY:
48*d8849d7dSChunwei Chen#	1. Create an empty file system (TESTFS)
49*d8849d7dSChunwei Chen#	2. Freeze TESTFS
50*d8849d7dSChunwei Chen#	3. Run various user commands that create files, directories and ACLs
51*d8849d7dSChunwei Chen#	4. Copy TESTFS to temporary location (TESTDIR/copy)
52*d8849d7dSChunwei Chen#	5. Unmount filesystem
53*d8849d7dSChunwei Chen#	   <at this stage TESTFS is empty again and unfrozen, and the
54*d8849d7dSChunwei Chen#	   intent log contains a complete set of deltas to replay it>
55*d8849d7dSChunwei Chen#	6. Remount TESTFS <which replays the intent log>
56*d8849d7dSChunwei Chen#	7. Compare TESTFS against the TESTDIR/copy
57*d8849d7dSChunwei Chen#
58*d8849d7dSChunwei Chen
59*d8849d7dSChunwei Chenverify_runnable "global"
60*d8849d7dSChunwei Chen
61*d8849d7dSChunwei Chen# As long as we are not running slog_015_neg, the test pool could be hanging
62*d8849d7dSChunwei Chen# around.
63*d8849d7dSChunwei Chenpoolexists $TESTPOOL && zpool destroy -f $TESTPOOL
64*d8849d7dSChunwei Chen
65*d8849d7dSChunwei Chenlog_assert "Replay of intent log succeeds."
66*d8849d7dSChunwei Chenlog_onexit cleanup
67*d8849d7dSChunwei Chenlog_must setup
68*d8849d7dSChunwei Chen
69*d8849d7dSChunwei Chen#
70*d8849d7dSChunwei Chen# 1. Create an empty file system (TESTFS)
71*d8849d7dSChunwei Chen#
72*d8849d7dSChunwei Chenlog_must zpool create $TESTPOOL $VDEV log mirror $LDEV
73*d8849d7dSChunwei Chenlog_must zfs set compression=on $TESTPOOL
74*d8849d7dSChunwei Chenlog_must zfs create $TESTPOOL/$TESTFS
75*d8849d7dSChunwei Chen
76*d8849d7dSChunwei Chen#
77*d8849d7dSChunwei Chen# This dd command works around an issue where ZIL records aren't created
78*d8849d7dSChunwei Chen# after freezing the pool unless a ZIL header already exists. Create a file
79*d8849d7dSChunwei Chen# synchronously to force ZFS to write one out.
80*d8849d7dSChunwei Chen#
81*d8849d7dSChunwei Chenlog_must dd if=/dev/zero of=/$TESTPOOL/$TESTFS/sync \
82*d8849d7dSChunwei Chen    oflag=dsync,sync bs=1 count=1
83*d8849d7dSChunwei Chen
84*d8849d7dSChunwei Chen#
85*d8849d7dSChunwei Chen# 2. Freeze TESTFS
86*d8849d7dSChunwei Chen#
87*d8849d7dSChunwei Chenlog_must zpool freeze $TESTPOOL
88*d8849d7dSChunwei Chen
89*d8849d7dSChunwei Chen#
90*d8849d7dSChunwei Chen# 3. Run various user commands that create files, directories and ACLs
91*d8849d7dSChunwei Chen#
92*d8849d7dSChunwei Chen
93*d8849d7dSChunwei Chen# TX_CREATE
94*d8849d7dSChunwei Chenlog_must touch /$TESTPOOL/$TESTFS/a
95*d8849d7dSChunwei Chen
96*d8849d7dSChunwei Chen# TX_RENAME
97*d8849d7dSChunwei Chenlog_must mv /$TESTPOOL/$TESTFS/a /$TESTPOOL/$TESTFS/b
98*d8849d7dSChunwei Chen
99*d8849d7dSChunwei Chen# TX_SYMLINK
100*d8849d7dSChunwei Chenlog_must touch /$TESTPOOL/$TESTFS/c
101*d8849d7dSChunwei Chenlog_must ln -s /$TESTPOOL/$TESTFS/c /$TESTPOOL/$TESTFS/d
102*d8849d7dSChunwei Chen
103*d8849d7dSChunwei Chen# TX_LINK
104*d8849d7dSChunwei Chenlog_must touch /$TESTPOOL/$TESTFS/e
105*d8849d7dSChunwei Chenlog_must ln /$TESTPOOL/$TESTFS/e /$TESTPOOL/$TESTFS/f
106*d8849d7dSChunwei Chen
107*d8849d7dSChunwei Chen# TX_MKDIR
108*d8849d7dSChunwei Chenlog_must mkdir /$TESTPOOL/$TESTFS/dir_to_delete
109*d8849d7dSChunwei Chen
110*d8849d7dSChunwei Chen# TX_RMDIR
111*d8849d7dSChunwei Chenlog_must rmdir /$TESTPOOL/$TESTFS/dir_to_delete
112*d8849d7dSChunwei Chen
113*d8849d7dSChunwei Chen# Create a simple validation payload
114*d8849d7dSChunwei Chenlog_must mkdir -p $TESTDIR
115*d8849d7dSChunwei Chenlog_must dd if=/dev/urandom of=/$TESTPOOL/$TESTFS/payload bs=1k count=8
116*d8849d7dSChunwei Chentypeset checksum=$(sha256digest /$TESTPOOL/$TESTFS/payload)
117*d8849d7dSChunwei Chen
118*d8849d7dSChunwei Chen# TX_WRITE (small file with ordering)
119*d8849d7dSChunwei Chenlog_must mkfile 1k /$TESTPOOL/$TESTFS/small_file
120*d8849d7dSChunwei Chenlog_must mkfile 512b /$TESTPOOL/$TESTFS/small_file
121*d8849d7dSChunwei Chen
122*d8849d7dSChunwei Chen# TX_CREATE, TX_MKDIR, TX_REMOVE, TX_RMDIR
123*d8849d7dSChunwei Chenlog_must cp -R /usr/dict /$TESTPOOL/$TESTFS
124*d8849d7dSChunwei Chenlog_must rm -rf /$TESTPOOL/$TESTFS/dict
125*d8849d7dSChunwei Chen
126*d8849d7dSChunwei Chen# TX_SETATTR
127*d8849d7dSChunwei Chenlog_must touch /$TESTPOOL/$TESTFS/setattr
128*d8849d7dSChunwei Chenlog_must chmod 567 /$TESTPOOL/$TESTFS/setattr
129*d8849d7dSChunwei Chenlog_must chgrp root /$TESTPOOL/$TESTFS/setattr
130*d8849d7dSChunwei Chenlog_must touch -cm -t 201311271200 /$TESTPOOL/$TESTFS/setattr
131*d8849d7dSChunwei Chen
132*d8849d7dSChunwei Chen# TX_TRUNCATE (to zero)
133*d8849d7dSChunwei Chenlog_must mkfile 4k /$TESTPOOL/$TESTFS/truncated_file
134*d8849d7dSChunwei Chenlog_must truncate -s 0 /$TESTPOOL/$TESTFS/truncated_file
135*d8849d7dSChunwei Chen
136*d8849d7dSChunwei Chen# TX_WRITE (large file)
137*d8849d7dSChunwei Chenlog_must dd if=/dev/urandom of=/$TESTPOOL/$TESTFS/large \
138*d8849d7dSChunwei Chen    bs=128k count=64 oflag=sync
139*d8849d7dSChunwei Chen
140*d8849d7dSChunwei Chen# Write zeros, which compress to holes, in the middle of a file
141*d8849d7dSChunwei Chenlog_must dd if=/dev/urandom of=/$TESTPOOL/$TESTFS/holes.1 bs=128k count=8
142*d8849d7dSChunwei Chenlog_must dd if=/dev/zero of=/$TESTPOOL/$TESTFS/holes.1 bs=128k count=2
143*d8849d7dSChunwei Chen
144*d8849d7dSChunwei Chenlog_must dd if=/dev/urandom of=/$TESTPOOL/$TESTFS/holes.2 bs=128k count=8
145*d8849d7dSChunwei Chenlog_must dd if=/dev/zero of=/$TESTPOOL/$TESTFS/holes.2 bs=128k count=2 seek=2
146*d8849d7dSChunwei Chen
147*d8849d7dSChunwei Chenlog_must dd if=/dev/urandom of=/$TESTPOOL/$TESTFS/holes.3 bs=128k count=8
148*d8849d7dSChunwei Chenlog_must dd if=/dev/zero of=/$TESTPOOL/$TESTFS/holes.3 bs=128k count=2 \
149*d8849d7dSChunwei Chen   seek=2 conv=notrunc
150*d8849d7dSChunwei Chen
151*d8849d7dSChunwei Chen# TX_MKXATTR
152*d8849d7dSChunwei Chen# log_must mkdir /$TESTPOOL/$TESTFS/xattr.dir
153*d8849d7dSChunwei Chen# log_must attr -qs fileattr -V HelloWorld /$TESTPOOL/$TESTFS/xattr.dir
154*d8849d7dSChunwei Chen# log_must attr -qs tmpattr -V HelloWorld /$TESTPOOL/$TESTFS/xattr.dir
155*d8849d7dSChunwei Chen# log_must attr -qr tmpattr /$TESTPOOL/$TESTFS/xattr.dir
156*d8849d7dSChunwei Chen
157*d8849d7dSChunwei Chen# log_must touch /$TESTPOOL/$TESTFS/xattr.file
158*d8849d7dSChunwei Chen# log_must attr -qs fileattr -V HelloWorld /$TESTPOOL/$TESTFS/xattr.file
159*d8849d7dSChunwei Chen# log_must attr -qs tmpattr -V HelloWorld /$TESTPOOL/$TESTFS/xattr.file
160*d8849d7dSChunwei Chen# log_must attr -qr tmpattr /$TESTPOOL/$TESTFS/xattr.file
161*d8849d7dSChunwei Chen
162*d8849d7dSChunwei Chen# TX_WRITE, TX_LINK, TX_REMOVE
163*d8849d7dSChunwei Chen# Make sure TX_REMOVE won't affect TX_WRITE if file is not destroyed
164*d8849d7dSChunwei Chenlog_must dd if=/dev/urandom of=/$TESTPOOL/$TESTFS/link_and_unlink bs=128k \
165*d8849d7dSChunwei Chen   count=8
166*d8849d7dSChunwei Chenlog_must ln /$TESTPOOL/$TESTFS/link_and_unlink \
167*d8849d7dSChunwei Chen   /$TESTPOOL/$TESTFS/link_and_unlink.link
168*d8849d7dSChunwei Chenlog_must rm /$TESTPOOL/$TESTFS/link_and_unlink.link
169*d8849d7dSChunwei Chen
170*d8849d7dSChunwei Chen#
171*d8849d7dSChunwei Chen# 4. Copy TESTFS to temporary location (TESTDIR/copy)
172*d8849d7dSChunwei Chen#
173*d8849d7dSChunwei Chenlog_must mkdir -p $TESTDIR/copy
174*d8849d7dSChunwei Chenlog_must cp -a /$TESTPOOL/$TESTFS/* $TESTDIR/copy/
175*d8849d7dSChunwei Chen
176*d8849d7dSChunwei Chen#
177*d8849d7dSChunwei Chen# 5. Unmount filesystem and export the pool
178*d8849d7dSChunwei Chen#
179*d8849d7dSChunwei Chen# At this stage TESTFS is empty again and frozen, the intent log contains
180*d8849d7dSChunwei Chen# a complete set of deltas to replay.
181*d8849d7dSChunwei Chen#
182*d8849d7dSChunwei Chenlog_must zfs unmount /$TESTPOOL/$TESTFS
183*d8849d7dSChunwei Chen
184*d8849d7dSChunwei Chenlog_note "Verify transactions to replay:"
185*d8849d7dSChunwei Chenlog_must zdb -iv $TESTPOOL/$TESTFS
186*d8849d7dSChunwei Chen
187*d8849d7dSChunwei Chenlog_must zpool export $TESTPOOL
188*d8849d7dSChunwei Chen
189*d8849d7dSChunwei Chen#
190*d8849d7dSChunwei Chen# 6. Remount TESTFS <which replays the intent log>
191*d8849d7dSChunwei Chen#
192*d8849d7dSChunwei Chen# Import the pool to unfreeze it and claim log blocks.  It has to be
193*d8849d7dSChunwei Chen# `zpool import -f` because we can't write a frozen pool's labels!
194*d8849d7dSChunwei Chen#
195*d8849d7dSChunwei Chenlog_must zpool import -f -d $VDIR $TESTPOOL
196*d8849d7dSChunwei Chen
197*d8849d7dSChunwei Chen#
198*d8849d7dSChunwei Chen# 7. Compare TESTFS against the TESTDIR/copy
199*d8849d7dSChunwei Chen#
200*d8849d7dSChunwei Chenlog_note "Verify current block usage:"
201*d8849d7dSChunwei Chenlog_must zdb -bcv $TESTPOOL
202*d8849d7dSChunwei Chen
203*d8849d7dSChunwei Chen# log_note "Verify copy of xattrs:"
204*d8849d7dSChunwei Chen# log_must attr -l /$TESTPOOL/$TESTFS/xattr.dir
205*d8849d7dSChunwei Chen# log_must attr -l /$TESTPOOL/$TESTFS/xattr.file
206*d8849d7dSChunwei Chen
207*d8849d7dSChunwei Chenlog_note "Verify working set diff:"
208*d8849d7dSChunwei Chenlog_must diff -r /$TESTPOOL/$TESTFS $TESTDIR/copy
209*d8849d7dSChunwei Chen
210*d8849d7dSChunwei Chenlog_note "Verify file checksum:"
211*d8849d7dSChunwei Chentypeset checksum1=$(sha256digest /$TESTPOOL/$TESTFS/payload)
212*d8849d7dSChunwei Chen[[ "$checksum1" == "$checksum" ]] || \
213*d8849d7dSChunwei Chen    log_fail "checksum mismatch ($checksum1 != $checksum)"
214*d8849d7dSChunwei Chen
215*d8849d7dSChunwei Chenlog_pass "Replay of intent log succeeds."
216