update for version 2 logs

This commit is contained in:
ptools
2003-09-30 06:31:43 +00:00
parent 2bbc01d922
commit d952bf7cea
10 changed files with 15193 additions and 54288 deletions
+318 -70
View File
@@ -2,6 +2,8 @@
# XFS QA Test No. 018
#
# xfs_logprint test
# - extended to test for various log version 2 scenarios
# - tests 1 case of user/group quotas
#
#-----------------------------------------------------------------------
# Copyright (c) 2000-2002 Silicon Graphics, Inc. All Rights Reserved.
@@ -52,6 +54,10 @@ status=0 # success is the default!
_cleanup()
{
rm -f $tmp.*
if [ $status -eq 0 ]; then
# don't keep these files around unless something went wrong
rm $seq.trans* $seq.op* $seq.full
fi
echo "*** unmount"
umount $SCRATCH_MNT 2>/dev/null
}
@@ -64,6 +70,76 @@ _full()
echo "" >>$seq.full
}
# Handle the operations which get split over Log Record
# boundaries.
# Oper (379)..... flags: CONTINUE
# ...
# Oper (0)....... flags: WAS_CONT END
#
# or
#
# Oper (379)..... flags: none
# ...
# Oper (0)....... flags: none
#
_filter_opnum()
{
$AWK_PROG '
function extract_opnum(str) {
# e.g. "(379):" => "379"
gsub(/[():]/,"",str)
return str
}
BEGIN {
opnum = -1
#debug = 1
}
/^Oper/ && debug {
printf "line = %s\n", $0
}
/^Oper/ {
was_cont = 0
prev_opnum = opnum
opnum = extract_opnum($2)
}
/^Oper/ && /flags: CONTINUE/ {
$9 = "none" # overwrite CONTINUE flags
$2 = sprintf("(%d):", remember+opnum)
remember += opnum
print
next
}
/^Oper/ && /flags: WAS_CONT END/ {
# skip over was-continued op
# we assume there can be only 1
was_cont = 1
next
}
(was_cont == 1) {
# skip over any continued op stuff
next
}
/^Oper/ && /UNMOUNT/ {
remember = 0
opnum = -1
print
next
}
/^Oper/ && (opnum == 0) {
# have operation 0 with NO continued op
remember += (prev_opnum+1)
}
/^Oper/ && debug { printf "line2 = %s, remember = %d, prev_opnum = %d\n", $0, remember, prev_opnum}
/^Oper/ && (remember > 0) {
# add in opnum accumulation from previous LRs
$2 = sprintf("(%d):", remember+opnum)
print
next
}
{print}
'
}
_filter_logprint()
{
sed '
@@ -83,7 +159,9 @@ _filter_logprint()
s/blkno: [0-9][0-9]*/blkno: <BLKNO>/g;
s/boff: [0-9][0-9]*/boff: <BOFF>/g;
s/len: *[0-9][0-9]*/len:<LEN>/g;
s/skipped [0-9][0-9]* zeroed blocks/skipped <COUNT> zeroed blocks/;
/zeroed blocks/s/[0-9][0-9]*/<COUNT>/g;
/cleared blocks/s/[0-9][0-9]*/<COUNT>/g;
/log tail/s/[0-9][0-9]*/<COUNT>/g;
s/atime:[0-9a-fx]* *mtime:[0-9a-fx]* *ctime:[0-9a-fx]*/atime:<TIME> mtime:<TIME> ctime:<TIME>/;
s/atime 0x[0-9a-f]* mtime 0x[0-9a-f]* ctime 0x[0-9a-f]*/atime <TIME> mtime <TIME> ctime <TIME>/;
s/block [0-9][0-9]*/block <BLOCK>/;
@@ -92,98 +170,268 @@ _filter_logprint()
s/1st: *[0-9][0-9]* *last: *[0-9][0-9]* *cnt: *[0-9][0-9]* *freeblks: *[0-9][0-9]* *longest: *[0-9][0-9]*/1st:<NUM> last:<NUM> cnt:<COUNT> freeblks:<COUNT> longest:<NUM>/;
s/^uuid: *[0-9a-f-][0-9a-f-]* *format: *.*$/uuid: <UUID> format: <FORMAT>/;
/flushiter:/d;
' | _fix_malloc
/version:/,/h_size:/d;
/^---*/d;
/^===*/d;
/^~~~*/d;
/extended-header/d;
/LOG REC AT LSN/d;
/^[ ]*$/d;
s/ */ /g;
s/ $//;
' \
| _fix_malloc
}
_setup_log()
_check_log()
{
rm -f $seq.log
_full "clean_log : xfs_logprint"
_scratch_xfs_logprint -t | tee -a $seq.full \
_scratch_xfs_logprint -t | tee -a $seq.full \
| head | grep -q "<CLEAN>" || _fail "DIRTY LOG"
echo "### xfs_logprint output ###" >>$seq.log
_scratch_xfs_logprint 2>&1 | _filter_logprint >>$seq.log
echo "### xfs_logprint -t -i -s 0 output ###" >>$seq.log
_scratch_xfs_logprint -t -i -s 0 2>&1 | _filter_logprint >>$seq.log
echo "### xfs_logprint -t -b -s 0 output ###" >>$seq.log
_scratch_xfs_logprint -t -b -s 0 2>&1 | _filter_logprint >>$seq.log
echo $seq.log
}
# find the comparison file, depending on which form of quota is
# enabled as this often influences how the test output appears.
# [NB: SCRATCH_DEV must be mounted for this to work]
#
_setup_log_out()
_print_operation()
{
if src/feature -U $SCRATCH_DEV
raw=$seq.op.mnt$mnt.mkfs$mkfs.raw
filtered=$seq.op.mnt$mnt.mkfs$mkfs.filtered
echo "### xfs_logprint output ###" | tee $raw >$filtered
_scratch_xfs_logprint -c 2>&1 \
| tee -a $raw \
| _filter_logprint \
| _filter_opnum \
>>$filtered
}
# start at rec#2 "-s 2" so we skip over UMOUNT record which will always
# be a 512b single header at mkfs time
# and may not match with the FS mounted at a different LR size
# => xlog_do_recovery_pass() can not handle the different hdr sizes
# it assumes them all to be the same between the start..finish
# NB: On IRIX there is no UMOUNT record and so we could start from -s 0.
_print_transaction_inode()
{
raw=$seq.trans_inode.mnt$mnt.mkfs$mkfs.raw
filtered=$seq.trans_inode.mnt$mnt.mkfs$mkfs.filtered
echo "### xfs_logprint -t -i -s 2 output ###" | tee $raw >$filtered
_scratch_xfs_logprint -t -i -s 2 2>&1 \
| tee -a $raw \
| _filter_logprint \
>>$filtered
}
_print_transaction_buf()
{
raw=$seq.trans_buf.mnt$mnt.mkfs$mkfs.raw
filtered=$seq.trans_buf.mnt$mnt.mkfs$mkfs.filtered
echo "### xfs_logprint -t -b -s 2 output ###" | tee $raw >$filtered
_scratch_xfs_logprint -t -b -s 2 2>&1 \
| tee -a $raw \
| _filter_logprint \
>>$filtered
}
#
# will be run with different MKFS and MOUNT options
#
_mkfs_create_log()
{
_mkfs_opts=$1
_mnt_opts=$2
# create the FS
_full "mkfs"
extra_ops="-lsize=2000b $_mkfs_opts"
_scratch_mkfs_xfs $extra_ops >$tmp.mkfs0 2>&1
[ $? -ne 0 ] && \
_notrun "Cannot mkfs for this test using MKFS_OPTIONS specified: $MKFS_OPTIONS $extra_ops"
# check the mkfs settings
_filter_mkfs <$tmp.mkfs0 2>$tmp.mkfs
source $tmp.mkfs
[ $dbsize -eq 4096 ] \
|| _notrun "Logprint test, tailored to 4K blocks ($dbsize in use)"
[ $isize -eq 256 ] \
|| _notrun "Logprint test, tailored to 256b inodes ($isize in use)"
# mount the FS
_full " mount"
_scratch_mount $_mnt_opts >>$seq.full 2>&1 \
|| _fail "mount failed: $_mnt_opts $MOUNT_OPTIONS"
# generate some log traffic - but not too much - life gets a little
# more complicated if the log wraps around. This traffic is
# pretty much arbitary, but could probably be made better than this.
touch $SCRATCH_MNT/{0,1,2,3,4,5,6,7,8,9}{0,1,2,3,4,5,6,7,8,9}
# unmount the FS
_full "umount"
umount $SCRATCH_DEV >>$seq.full 2>&1 \
|| _fail "umount failed"
}
_cmp_output()
{
echo "*** compare logprint: $1 with $2"
if ! diff $1 $2 >/dev/null; then
echo "FAILED: logprint output $1 differs to $2"
status=1
fi
}
_clear_opts()
{
# clear opts
# - remove the log options in mkfs
# - remove the log options in mount
# - remove the quota options in mount
# leave any other options given
MKFS_OPTIONS=`echo $MKFS_OPTIONS | sed -e 's/-l[ ]*[^ $]*//g'`
MOUNT_OPTIONS=`echo $MOUNT_OPTIONS |\
sed -e 's/logbsize=[^ ,]*,*//g' \
-e 's/usrquota,*//g' \
-e 's/grpquota,*//g' \
-e 's/quota,*//g' \
-e 's/uqnoenforce,*//g' \
-e 's/gqnoenforce,*//g' \
-e 's/-o *$//g' \
-e 's/-o *-/-/g' \
`
# export opts
export MKFS_OPTIONS
export MOUNT_OPTIONS
}
#
# Op data of different Log Record sizes will mean that data is
# split at different points and in op printing it will not
# try and decode the data which has been split up.
# So we do a special diff processing to complain of differences
# if no split is involved.
#
# Example diff with forms of:
# "Left over region from split log item"
# "Not printing rest of data"
#
# 2149c2149
# < Left over region from split log item
# ---
# > BUF DATA
# 2888c2888,2889
# < INODE: #regs: 3 Not printing rest of data
# ---
# > INODE: #regs: 3 ino: 0x80 flags: 0x5 dsize: 16
# > blkno: <BLKNO> len:<LEN> boff: <BOFF>
#
_process_op_diff()
{
$AWK_PROG <$1 '
BEGIN { num_splits = 1 }
/^[0-9]/ {
# ensure cmd is a change op
cmd = $1
gsub(/[0-9][0-9]*/,"", cmd)
gsub(/,/,"", cmd)
if (cmd != "c") {
print "bad diff cmd: ", $0
exit 1
}
# ensure a split happened in previous difference
if (num_splits != 1 && num_splits != 2) {
print num_splits, " split(s) found prior to diff cmd: ", $0
num_splits = 1 # shut-up end condition
exit 1
}
num_splits = 0
next
}
/Left over region/ || /Not printing rest/ {
num_splits++
next
}
{ next }
END {
if (num_splits != 1 && num_splits != 2) {
print num_splits, " split(s) found prior to diff end"
exit 1
}
}
'
return $?
}
_cmp_op_output()
{
echo "*** compare logprint: $1 with $2"
diff $1 $2 >$filtered.diff
if ! _process_op_diff $filtered.diff
then
if src/feature -G $SCRATCH_DEV
then
echo $seq.ugquota
else
echo $seq.usrquota
fi
elif src/feature -G $SCRATCH_DEV
then
echo $seq.grpquota
else
echo $seq.noquota
echo "FAILED: logprint output $1 differs to $2 considering splits"
status=1
fi
}
# real QA test starts here
# prelim
_require_scratch
rm -f $seq.trans* $seq.op* $seq.full
_clear_opts
echo "*** init FS"
umount $SCRATCH_DEV >/dev/null 2>&1
_full "mkfs"
cat >$tmp.seq.params <<EOF
# mkfs-opt mount-opt
-lversion=1 -ologbsize=32k
-lversion=2 -ologbsize=32k
-lversion=2 -ologbsize=64k
-lversion=2 -ologbsize=128k
-lversion=2 -ologbsize=256k
# NB: Stripe only affects LRs which weren't full when written out
# So if we wrote out 32K LR then the stripe has no effect
# In our case, it is likely that the LRs will be full but
# it may no be the case in all QA environments where the LR
# may be forced out early.
# -lversion=2,su=4096 -ologbsize=32k
EOF
_scratch_mkfs_xfs -lsize=2000b >$tmp.mkfs0 2>&1
[ $? -ne 0 ] && \
_notrun "Cannot mkfs for this test using MKFS_OPTIONS specified"
_filter_mkfs <$tmp.mkfs0 2>$tmp.mkfs
source $tmp.mkfs
[ $dbsize -eq 4096 ] \
|| _notrun "Logprint test, tailored to 4K blocks ($dbsize in use)"
[ $isize -eq 256 ] \
|| _notrun "Logprint test, tailored to 256b inodes ($isize in use)"
[ $lversion -eq 1 ] \
|| _notrun "Logprint test, tailored to v1 log format (v$lversion in use)"
# do the work for various log params which
# should not effect the data content of the log
cat $tmp.seq.params \
| while read mkfs mnt
do
if [ "$mkfs" != "#" ]; then
_mkfs_create_log $mkfs $mnt
_check_log
rm -f $seq.log $seq.full
_print_operation
_cmp_op_output $seq.noquota.op $filtered
_full " mount"
_scratch_mount >>$seq.full 2>&1 \
|| _fail "mount failed"
_print_transaction_inode
_cmp_output $seq.noquota.trans_inode $filtered
base=`_setup_log_out`
_print_transaction_buf
_cmp_output $seq.noquota.trans_buf $filtered
fi
done
# generate some log traffic - but not too much - life gets a little
# more complicated if the log wraps around. This traffic is
# pretty much arbitary, but could probably be made better than this.
# do a simple quota test to ensure DQUOT data is happening
mkfs="-lversion=1"
mnt="-ousrquota,grpquota"
_mkfs_create_log $mkfs $mnt
_check_log
_print_transaction_inode
_cmp_output $seq.ugquota.trans_inode $filtered
touch $SCRATCH_MNT/{0,1,2,3,4,5,6,7,8,9}{0,1,2,3,4,5,6,7,8,9}
_full "umount"
umount $SCRATCH_DEV >>$seq.full 2>&1 \
|| _fail "umount failed"
mine=`_setup_log`
echo "*** compare logprint"
if ! diff $mine $base >/dev/null; then
echo "FAILED: logprint output $mine differs to $base"
exit 1
fi
rm $seq.full
exit