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