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