Whamcloud - gitweb
- added test_3b which emulates recursive mount. Does not pass yet.
[fs/lustre-release.git] / lustre / tests / lfscktest.sh
1 #!/bin/bash
2 set -vx
3 #set -e
4
5 . ./lfscktest_config.sh
6
7 sh llmount.sh || exit 1
8
9 #Create mount points on target OST and MDS
10 #Create test directory 
11 mkdir -p $OST_MOUNTPT
12 mkdir -p $MDS_MOUNTPT
13 mkdir -p $TEST_DIR
14
15 export PATH=$LFSCK_PATH:`dirname $0`:`dirname $0`/../utils:$PATH
16
17 # Create some files on the filesystem
18 for i in `seq 0 3`; do
19         mkdir -p ${MOUNT}/d$i
20         for j in `seq 0 5`; do
21                 mkdir -p  ${MOUNT}/d$i/d$j
22                 for k in `seq 1 5`; do
23                         FILE="${MOUNT}/d$i/d$j/test$k"
24                         echo "creating $FILE"
25                         dd if=/dev/zero bs=4k count=1 of=$FILE
26                 done
27         done
28 done
29
30 # Create Files to be modified
31 file_name=${TESTNAME}
32 for FILE in `seq -f ${TEST_DIR}/${file_name}.%g 0 40`; do
33         dd if=/dev/zero count=1 bs=64K of=$FILE || exit 1
34 done
35
36 #Create some more files
37 for i in `seq 21 23`; do
38         mkdir -p ${MOUNT}/d$i
39         for j in `seq 0 5`; do
40                 mkdir -p  ${MOUNT}/d$i/d$j
41                 for k in `seq 0 5`; do
42                         FILE="${MOUNT}/d$i/d$j/test$k"
43                         echo "creating $FILE"
44                         dd if=/dev/zero bs=4k count=1 of=$FILE
45                 done
46         done
47 done
48
49 # Get objids for a file on the OST
50 OST_TEST_FILE_OBJIDS=""
51 for i in `seq 0 19`; do
52         OST_TEST_FILE=${TEST_DIR}/${file_name}.$i
53         ##Get the file OBJID
54         OST_TEST_FILE_OBJID=`$LFIND -v -o $OST_UUID $OST_TEST_FILE|grep '\*$' | awk '{ print $2 }'` || exit 1
55         if [ "$OST_TEST_FILE_OBJID" ]; then
56                 echo "REMOVING OBJID $OST_TEST_FILE_OBJID on $OST_UUID from $OST_TEST_FILE"
57         fi
58         OST_TEST_FILE_OBJIDS="$OST_TEST_FILE_OBJIDS $OST_TEST_FILE_OBJID"
59 done
60
61 MDS_FILES=""
62 for i in `seq 20 39`; do
63         TEST_FILE=${TEST_DIR}/${file_name}.$i
64         echo "REMOVING MDS FILE $TEST_FILE which has info:"
65         $LFIND -v $TEST_FILE  || exit 1
66         MDS_FILES="$MDS_FILES ${TESTNAME}/${file_name}.$i"
67 done
68
69 sh llmountcleanup.sh || exit 1
70 # Remove objects associated with files
71 echo "removing objects: $OST_TEST_FILE_OBJIDS"
72 for i in $OST_TEST_FILE_OBJIDS; do
73         z=`expr $i % 32`
74         debugfs -w -R "rm O/0/d$z/$i" "$OSTDEV" || exit 1
75 done
76
77 mount "-o" loop $MDSDEV $MDS_MOUNTPT
78
79 #Remove files from mds
80 for i in $MDS_FILES; do
81         rm $MDS_MOUNTPT/ROOT/$i || (umount $MDS_MOUNTPT && exit 1)
82 done
83
84 #Create EAs on files so objects are referenced twice from different mds files
85 for i in `seq 0 19`; do
86         touch $MDS_MOUNTPT/ROOT/${TESTNAME}/${TESTNAME}.bad.$i
87         copy_attr $MDS_MOUNTPT/ROOT/${TESTNAME}/${TESTNAME}.$i $MDS_MOUNTPT/ROOT/${TESTNAME}/${TESTNAME}.bad.$i || (umount $MDS_MOUNTPT && exit 1)
88         i=`expr $i + 1`
89 done
90 umount $MDS_MOUNTPT 
91 rmdir $MDS_MOUNTPT
92 rmdir $OST_MOUNTPT
93
94 # Run e2fsck to get mds and ost info
95 # a return status of 1 indicates e2fsck successfuly fixed problems found
96
97 e2fsck -d -f -y --mdsdb $GPATH/mdsdb $MDSDEV
98 RET=$?
99 [ $RET -ne 0 -a $RET -ne 1 ] && exit 1
100 i=0
101 OSTDB_LIST=""
102 while [ $i -lt $NUM_OSTS ]; do
103         e2fsck -d -f -y --mdsdb $GPATH/mdsdb --ostdb $GPATH/ostdb-$i $TMP/ost`expr $i + 1`-`hostname`
104         RET=$?
105         [ $RET -ne 0 -a $RET -ne 1 ] && exit 1
106         if [ -z "${OSTDB_LIST}" ]; then
107                 OSTDB_LIST=${GPATH}/ostdb-$i
108         else
109                 OSTDB_LIST=${GPATH}/ostdb-$i,${OSTDB_LIST}
110         fi
111         i=`expr $i + 1`
112 done
113
114 #Remount filesystem
115 sh llrmount.sh  || exit 1
116
117 lfsck -l --mdsdb $GPATH/mdsdb --ostdb ${OSTDB_LIST} ${MOUNT} || exit 1  
118
119 #Cleanup 
120 rm $GPATH/mdsdb
121 rm $GPATH/ostdb-*
122 sh llmountcleanup.sh || exit 1