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
-13538
View File
File diff suppressed because it is too large Load Diff
-12500
View File
File diff suppressed because it is too large Load Diff
+5513
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+46 -1
View File
@@ -6,5 +6,50 @@ data = bsize=XXX blocks=XXX, imaxpct=PCT
naming =VERN bsize=XXX
log =LDEV bsize=XXX blocks=XXX
realtime =RDEV extsz=XXX blocks=XXX, rtextents=XXX
*** compare logprint
*** compare logprint: 018.noquota.op with 018.op.mnt-ologbsize=32k.mkfs-lversion=1.filtered
*** compare logprint: 018.noquota.trans_inode with 018.trans_inode.mnt-ologbsize=32k.mkfs-lversion=1.filtered
*** compare logprint: 018.noquota.trans_buf with 018.trans_buf.mnt-ologbsize=32k.mkfs-lversion=1.filtered
meta-data=DDEV isize=XXX agcount=N, agsize=XXX blks
data = bsize=XXX blocks=XXX, imaxpct=PCT
= sunit=XXX swidth=XXX, unwritten=X
naming =VERN bsize=XXX
log =LDEV bsize=XXX blocks=XXX
realtime =RDEV extsz=XXX blocks=XXX, rtextents=XXX
*** compare logprint: 018.noquota.op with 018.op.mnt-ologbsize=32k.mkfs-lversion=2.filtered
*** compare logprint: 018.noquota.trans_inode with 018.trans_inode.mnt-ologbsize=32k.mkfs-lversion=2.filtered
*** compare logprint: 018.noquota.trans_buf with 018.trans_buf.mnt-ologbsize=32k.mkfs-lversion=2.filtered
meta-data=DDEV isize=XXX agcount=N, agsize=XXX blks
data = bsize=XXX blocks=XXX, imaxpct=PCT
= sunit=XXX swidth=XXX, unwritten=X
naming =VERN bsize=XXX
log =LDEV bsize=XXX blocks=XXX
realtime =RDEV extsz=XXX blocks=XXX, rtextents=XXX
*** compare logprint: 018.noquota.op with 018.op.mnt-ologbsize=64k.mkfs-lversion=2.filtered
*** compare logprint: 018.noquota.trans_inode with 018.trans_inode.mnt-ologbsize=64k.mkfs-lversion=2.filtered
*** compare logprint: 018.noquota.trans_buf with 018.trans_buf.mnt-ologbsize=64k.mkfs-lversion=2.filtered
meta-data=DDEV isize=XXX agcount=N, agsize=XXX blks
data = bsize=XXX blocks=XXX, imaxpct=PCT
= sunit=XXX swidth=XXX, unwritten=X
naming =VERN bsize=XXX
log =LDEV bsize=XXX blocks=XXX
realtime =RDEV extsz=XXX blocks=XXX, rtextents=XXX
*** compare logprint: 018.noquota.op with 018.op.mnt-ologbsize=128k.mkfs-lversion=2.filtered
*** compare logprint: 018.noquota.trans_inode with 018.trans_inode.mnt-ologbsize=128k.mkfs-lversion=2.filtered
*** compare logprint: 018.noquota.trans_buf with 018.trans_buf.mnt-ologbsize=128k.mkfs-lversion=2.filtered
meta-data=DDEV isize=XXX agcount=N, agsize=XXX blks
data = bsize=XXX blocks=XXX, imaxpct=PCT
= sunit=XXX swidth=XXX, unwritten=X
naming =VERN bsize=XXX
log =LDEV bsize=XXX blocks=XXX
realtime =RDEV extsz=XXX blocks=XXX, rtextents=XXX
*** compare logprint: 018.noquota.op with 018.op.mnt-ologbsize=256k.mkfs-lversion=2.filtered
*** compare logprint: 018.noquota.trans_inode with 018.trans_inode.mnt-ologbsize=256k.mkfs-lversion=2.filtered
*** compare logprint: 018.noquota.trans_buf with 018.trans_buf.mnt-ologbsize=256k.mkfs-lversion=2.filtered
meta-data=DDEV isize=XXX agcount=N, agsize=XXX blks
data = bsize=XXX blocks=XXX, imaxpct=PCT
= sunit=XXX swidth=XXX, unwritten=X
naming =VERN bsize=XXX
log =LDEV bsize=XXX blocks=XXX
realtime =RDEV extsz=XXX blocks=XXX, rtextents=XXX
*** compare logprint: 018.ugquota.trans_inode with 018.trans_inode.mnt-ousrquota,grpquota.mkfs-lversion=1.filtered
*** unmount
-14641
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
-13538
View File
File diff suppressed because it is too large Load Diff