Some qa to test out simple replay of the logs by causing

file system to shutdown.
Simple log replay test.
This commit is contained in:
ptools
2004-02-10 03:10:49 +00:00
parent 1deaada7ef
commit 9f5c3ca42e
5 changed files with 414 additions and 1 deletions
Executable
+145
View File
@@ -0,0 +1,145 @@
#! /bin/sh
# XFS QA Test No. 084
#
# To test log replay by shutdown of file system
# This is the first simple initial test to ensure that
# the goingdown ioctl is working and recovery of
# create transactions is working.
#
#-----------------------------------------------------------------------
# Copyright (c) 2000-2003 Silicon Graphics, Inc. All Rights Reserved.
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of version 2 of the GNU General Public License as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it would be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
# Further, this software is distributed without any warranty that it is
# free of the rightful claim of any third person regarding infringement
# or the like. Any license provided herein, whether implied or
# otherwise, applies only to this software file. Patent licenses, if
# any, provided herein do not apply to combinations of this program with
# other software, or any other product whatsoever.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write the Free Software Foundation, Inc., 59
# Temple Place - Suite 330, Boston MA 02111-1307, USA.
#
# Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
# Mountain View, CA 94043, or:
#
# http://www.sgi.com
#
# For further information regarding this notice, see:
#
# http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
#-----------------------------------------------------------------------
#
# creator
owner=tes@melbourne.sgi.com
seq=`basename $0`
echo "QA output created by $seq"
here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default!
trap "_cleanup; exit \$status" 0 1 2 3 15
# get standard environment, filters and checks
. ./common.rc
. ./common.filter
. ./common.log
# real QA test starts here
_do_logprint()
{
xfs_logprint -t $SCRATCH_DEV | tee -a $seq.full >$tmp.logprint
if grep -q "<DIRTY>" $tmp.logprint; then
echo "dirty log"
fi
if grep -q "<CLEAN>" $tmp.logprint; then
echo "clean log"
fi
}
_cleanup()
{
rm -f $tmp.*
kill $pid
}
rm -f $seq.full
rm -f $tmp.log
tail -f /var/log/messages >$tmp.log &
pid=$!
cp $tmp.log $tmp.log.orig # note the original log
_require_scratch
echo "mkfs"
_scratch_mkfs_xfs >>$seq.full 2>&1 \
|| _fail "mkfs scratch failed"
echo "mount"
_scratch_mount >>$seq.full 2>&1 \
|| _fail "mount failed: $MOUNT_OPTIONS"
echo "touch files"
touch $SCRATCH_MNT/{0,1,2,3,4,5,6,7,8,9}{0,1,2,3,4,5,6,7,8,9}
echo "godown"
src/godown -v -f $SCRATCH_MNT >> $seq.full
echo "unmount"
umount $SCRATCH_MNT
echo "logprint after going down..."
_do_logprint
# curious if FS consistent at start
if false; then
if /usr/sbin/xfs_check $SCRATCH_DEV; then
echo "*** checked ok ***"
fi
fi
echo "mount with replay"
_scratch_mount $mnt >>$seq.full 2>&1 \
|| _fail "mount failed: $mnt $MOUNT_OPTIONS"
sleep 2
# compare with what has now been added to the log
comm -13 $tmp.log.orig $tmp.log >$tmp.comm
echo "$tmp.comm" >>$seq.full
cat $tmp.comm >>$seq.full
echo "check syslog for recovery..."
grep recovery $tmp.comm |\
sed -e 's/.*Start/Start/' -e 's/system:.*/system/' \
-e 's/.*End/End/'
echo "ls $SCRATCH_MNT"
ls $SCRATCH_MNT
echo "unmount"
umount $SCRATCH_MNT
echo "logprint after mount and replay..."
_do_logprint
if _check_scratch_fs; then
echo "filesystem is checked ok"
else
echo "filesystem is NOT ok"
fi
# success, all done
status=0
exit
+117
View File
@@ -0,0 +1,117 @@
QA output created by 085
mkfs
mount
touch files
godown
unmount
logprint after going down...
dirty log
mount with replay
check syslog for recovery...
Starting XFS recovery on filesystem
Ending XFS recovery on filesystem
ls /mnt/scratch
00
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
unmount
logprint after mount and replay...
clean log
filesystem is checked ok
+1
View File
@@ -145,3 +145,4 @@ ioctl nathans@sgi.com
082 logprint
083 rw auto
084 ioctl rw auto
085 logprint auto
+2 -1
View File
@@ -37,7 +37,8 @@ TARGETS = alloc acl_get bstat devzero dirstress fault feature \
fill fill2 getpagesize holes xfsctl loggen lstat64 \
nametest permname randholes runas truncfile usemem \
fstest mmapcat append_reader append_writer \
dirperf metaperf enospc_unlink resvtest scaleread
dirperf metaperf enospc_unlink resvtest scaleread \
godown
ifeq ($(ENABLE_DBM), yes)
TARGETS += dbtest
endif
+149
View File
@@ -0,0 +1,149 @@
/*
* Copyright (c) 2004 Silicon Graphics, Inc. All Rights Reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of version 2 of the GNU General Public License as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it would be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* Further, this software is distributed without any warranty that it is
* free of the rightful claim of any third person regarding infringement
* or the like. Any license provided herein, whether implied or
* otherwise, applies only to this software file. Patent licenses, if
* any, provided herein do not apply to combinations of this program with
* other software, or any other product whatsoever.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write the Free Software Foundation, Inc., 59
* Temple Place - Suite 330, Boston MA 02111-1307, USA.
*
* Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
* Mountain View, CA 94043, or:
*
* http://www.sgi.com
*
* For further information regarding this notice, see:
*
* http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
*/
#include <xfs/libxfs.h>
/* These should be in libxfs.h */
#ifndef XFS_IOC_GOINGDOWN
#define XFS_IOC_GOINGDOWN _IOR ('X', 125, __uint32_t)
#endif
#ifndef XFS_FSOP_GOING_FLAGS_DEFAULT
#define XFS_FSOP_GOING_FLAGS_DEFAULT 0x0 /* going down */
#endif
#ifndef XFS_FSOP_GOING_FLAGS_LOGFLUSH
#define XFS_FSOP_GOING_FLAGS_LOGFLUSH 0x1 /* flush log */
#endif
#ifndef XFS_FSOP_GOING_FLAGS_NOLOGFLUSH
#define XFS_FSOP_GOING_FLAGS_NOLOGFLUSH 0x2 /* don't flush log */
#endif
static char *progname;
static void
usage(void)
{
fprintf(stderr, "usage: %s [-f] [-v] mnt-dir\n", progname);
}
int
main(int argc, char *argv[])
{
int c;
int flag;
int flushlog_opt = 0;
int verbose_opt = 0;
struct stat st;
char *mnt_dir;
int fd;
progname = argv[0];
while ((c = getopt(argc, argv, "fv")) != -1) {
switch (c) {
case 'f':
flushlog_opt = 1;
break;
case 'v':
verbose_opt = 1;
break;
case '?':
usage();
return 1;
}
}
/* process required cmd argument */
if (optind == argc-1) {
mnt_dir = argv[optind];
}
else {
usage();
return 1;
}
if ((stat(mnt_dir, &st)) == -1) {
fprintf(stderr, "%s: error on stat \"%s\": %s\n",
progname, mnt_dir, strerror(errno));
return 1;
}
if (!S_ISDIR(st.st_mode)) {
fprintf(stderr, "%s: argument \"%s\" is not a directory\n",
progname, mnt_dir);
return 1;
}
#if 0
{
struct statvfs stvfs;
if ((statvfs(mnt_dir, &stvfs)) == -1) {
fprintf(stderr, "%s: error on statfs \"%s\": %s\n",
progname, mnt_dir, strerror(errno));
return 1;
}
if (strcmp(stvfs.f_basetype, "xfs") != 0) {
fprintf(stderr, "%s: filesys for \"%s\" is not XFS:\"%s\"\n",
progname, mnt_dir, stvfs.f_basetype);
return 1;
}
}
#endif
flag = (flushlog_opt ? XFS_FSOP_GOING_FLAGS_LOGFLUSH
: XFS_FSOP_GOING_FLAGS_NOLOGFLUSH);
if (verbose_opt) {
printf("Opening \"%s\"\n", mnt_dir);
}
if ((fd = open(mnt_dir, O_RDONLY)) == -1) {
fprintf(stderr, "%s: error on open of \"%s\": %s\n",
progname, mnt_dir, strerror(errno));
return 1;
}
if (verbose_opt) {
printf("Calling XFS_IOC_GOINGDOWN\n");
}
if ((xfsctl(mnt_dir, fd, XFS_IOC_GOINGDOWN, &flag)) == -1) {
fprintf(stderr, "%s: error on xfsctl(GOINGDOWN) of \"%s\": %s\n",
progname, mnt_dir, strerror(errno));
return 1;
}
close(fd);
return 0;
}