Whamcloud - gitweb
- landing of b_fid after merge with b_hd_cleanup_merge.
[fs/lustre-release.git] / lustre / tests / sanity-cmobd.sh
1 #!/bin/bash
2 set -e
3
4 ONLY=${ONLY:-"$*"}
5 # bug number for skipped test: 
6 ALWAYS_EXCEPT=${ALWAYS_EXCEPT:-""}
7 # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
8
9 [ "$ALWAYS_EXCEPT$EXCEPT" ] && echo "Skipping tests: $ALWAYS_EXCEPT $EXCEPT"
10
11 SRCDIR=`dirname $0`
12 export PATH=$PWD/$SRCDIR:$SRCDIR:$SRCDIR/../utils:$PATH
13
14 TMP=${TMP:-/tmp}
15 FSTYPE=${FSTYPE:-ext3}
16
17 CHECKSTAT=${CHECKSTAT:-"checkstat -v"}
18 CREATETEST=${CREATETEST:-createtest}
19 LFS=${LFS:-lfs}
20 LSTRIPE=${LSTRIPE:-"$LFS setstripe"}
21 LFIND=${LFIND:-"$LFS find"}
22 LVERIFY=${LVERIFY:-ll_dirstripe_verify}
23 LCTL=${LCTL:-lctl}
24 MCREATE=${MCREATE:-mcreate}
25 OPENFILE=${OPENFILE:-openfile}
26 OPENUNLINK=${OPENUNLINK:-openunlink}
27 TOEXCL=${TOEXCL:-toexcl}
28 TRUNCATE=${TRUNCATE:-truncate}
29 MUNLINK=${MUNLINK:-munlink}
30 SOCKETSERVER=${SOCKETSERVER:-socketserver}
31 SOCKETCLIENT=${SOCKETCLIENT:-socketclient}
32 IOPENTEST1=${IOPENTEST1:-iopentest1}
33 IOPENTEST2=${IOPENTEST2:-iopentest2}
34 PTLDEBUG=${PTLDEBUG:-0}
35 MODE=${MODE:mds}
36
37 if [ $UID -ne 0 ]; then
38         RUNAS_ID="$UID"
39         RUNAS=""
40 else
41         RUNAS_ID=${RUNAS_ID:-500}
42         RUNAS=${RUNAS:-"runas -u $RUNAS_ID"}
43 fi
44
45 export NAME=${NAME:-cmobd}
46
47 SAVE_PWD=$PWD
48
49 clean() {
50         echo -n "cln.."
51         sh llmountcleanup.sh > /dev/null || exit 20
52         I_MOUNTED=no
53 }
54 CLEAN=${CLEAN:-clean}
55
56 start() {
57         echo -n "mnt.."
58         sh llrmount.sh > /dev/null || exit 10
59         I_MOUNTED=yes
60         echo "done"
61 }
62 START=${START:-start}
63
64 log() {
65         echo "$*"
66         lctl mark "$*" 2> /dev/null || true
67 }
68
69 trace() {
70         log "STARTING: $*"
71         strace -o $TMP/$1.strace -ttt $*
72         RC=$?
73         log "FINISHED: $*: rc $RC"
74         return 1
75 }
76 TRACE=${TRACE:-""}
77
78 check_kernel_version() {
79         VERSION_FILE=/proc/fs/lustre/kernel_version
80         WANT_VER=$1
81         [ ! -f $VERSION_FILE ] && echo "can't find kernel version" && return 1
82         GOT_VER=`cat $VERSION_FILE`
83         [ $GOT_VER -ge $WANT_VER ] && return 0
84         log "test needs at least kernel version $WANT_VER, running $GOT_VER"
85         return 1
86 }
87
88 run_one() {
89         if ! mount | grep -q $DIR; then
90                 $START
91         fi
92         echo $PTLDEBUG >/proc/sys/portals/debug 
93         log "== test $1: $2"
94         export TESTNAME=test_$1
95         test_$1 || error "test_$1: exit with rc=$?"
96         unset TESTNAME
97         pass
98         cd $SAVE_PWD
99         $CLEAN
100 }
101
102 build_test_filter() {
103         for O in $ONLY; do
104             eval ONLY_${O}=true
105         done
106         for E in $EXCEPT $ALWAYS_EXCEPT; do
107             eval EXCEPT_${E}=true
108         done
109 }
110
111 _basetest() {
112     echo $*
113 }
114
115 basetest() {
116     IFS=abcdefghijklmnopqrstuvwxyz _basetest $1
117 }
118
119 run_test() {
120          base=`basetest $1`
121          if [ "$ONLY" ]; then
122                  testname=ONLY_$1
123                  if [ ${!testname}x != x ]; then
124                         run_one $1 "$2"
125                         return $?
126                  fi
127                  testname=ONLY_$base
128                  if [ ${!testname}x != x ]; then
129                          run_one $1 "$2"
130                          return $?
131                  fi
132                  echo -n "."
133                  return 0
134         fi
135         testname=EXCEPT_$1
136         if [ ${!testname}x != x ]; then
137                  echo "skipping excluded test $1"
138                  return 0
139         fi
140         testname=EXCEPT_$base
141         if [ ${!testname}x != x ]; then
142                  echo "skipping excluded test $1 (base $base)"
143                  return 0
144         fi
145         run_one $1 "$2"
146         return $?
147 }
148
149 [ "$SANITYLOG" ] && rm -f $SANITYLOG || true
150
151 error() { 
152         log "FAIL: $@"
153         if [ "$SANITYLOG" ]; then
154                 echo "FAIL: $TESTNAME $@" >> $SANITYLOG
155         else
156                 exit 1
157         fi
158 }
159
160 pass() { 
161         echo PASS
162 }
163
164 MOUNT="`mount | awk '/^'$NAME' .* lustre_lite / { print $3 }'`"
165 if [ -z "$MOUNT" ]; then
166         sh llmount.sh
167         MOUNT="`mount | awk '/^'$NAME' .* lustre_lite / { print $3 }'`"
168         [ -z "$MOUNT" ] && error "NAME=$NAME not mounted"
169         I_MOUNTED=yes
170 fi
171
172 [ `echo $MOUNT | wc -w` -gt 1 ] && error "NAME=$NAME mounted more than once"
173
174 DIR=${DIR:-$MOUNT}
175 [ -z "`echo $DIR | grep $MOUNT`" ] && echo "$DIR not in $MOUNT" && exit 99
176
177 [ -f $DIR/d52a/foo ] && chattr -a $DIR/d52a/foo
178 [ -f $DIR/d52b/foo ] && chattr -i $DIR/d52b/foo
179 rm -rf $DIR/[Rdfs][1-9]*
180
181 build_test_filter
182
183 echo preparing for tests involving mounts
184 EXT2_DEV=${EXT2_DEV:-/tmp/SANITY.LOOP}
185 touch $EXT2_DEV
186 mke2fs -j -F $EXT2_DEV 8000 > /dev/null
187
188 lsync() {
189         name=$1
190         device=`$LCTL device_list | grep " $name " | awk '{print $1}'`
191         
192         [ -z $device ] && {
193                 echo "Can't find device $name"
194                 return 1
195         }
196         
197 ${LCTL} << EOF
198 device $device
199 lsync
200 EOF
201         return $?
202 }
203
204 test_1a() {
205         rm -fr $DIR/1a0 > /dev/null
206
207         echo "mkdir $DIR/1a0"
208         mkdir $DIR/1a0 || error
209         echo "cache flush on $NAME"
210         lsync $NAME >/dev/null || error
211         
212         echo "touch $DIR/1a0/f0"
213         touch $DIR/1a0/f0 || error
214         echo "cache flush on $NAME"
215         lsync $NAME >/dev/null || error
216         
217         echo "chmod +x $DIR/1a0/f0"
218         chmod +x $DIR/1a0/f0 || error
219         echo "cache flush on $NAME"
220         lsync $NAME >/dev/null || error
221         
222         echo "mv $DIR/1a0/f0 $DIR/1a0/f01"
223         mv $DIR/1a0/f0 $DIR/1a0/f01 || error
224         echo "cache flush on $NAME"
225         lsync $NAME >/dev/null || error
226         
227         echo "rm $DIR/1a0/f01"
228         rm $DIR/1a0/f01 || error
229         echo "cache flush on $NAME"
230         lsync $NAME >/dev/null || error
231         
232         echo "touch $DIR/1a0/f01"
233         touch $DIR/1a0/f01 || error
234         echo "cache flush on $NAME"
235         lsync $NAME >/dev/null || error
236         
237         echo "ln $DIR/1a0/f01 $DIR/1a0/f01h"
238         ln $DIR/1a0/f01 $DIR/1a0/f01h || error
239         echo "cache flush on $NAME"
240         lsync $NAME >/dev/null || error
241         
242         echo "ln -s $DIR/1a0/f01 $DIR/1a0/f01s"
243         ln -s $DIR/1a0/f01 $DIR/1a0/f01s || error
244
245         rm -fr $DIR/1a0 > /dev/null
246         echo "cache flush on $NAME"
247         lsync $NAME >/dev/null || error
248 }
249 run_test 1a " WB test (lsync after each MD operation)============="
250
251 test_1b() {
252         echo "mkdir $DIR/1b0"
253         mkdir $DIR/1b0 || error
254         echo "touch $DIR/1b0/f0"
255         touch $DIR/1b0/f0 || error
256         echo "chmod +x $DIR/1b0/f0"
257         chmod +x $DIR/1b0/f0 || error
258         echo "mv $DIR/1b0/f0 $DIR/1b0/f01"
259         mv $DIR/1b0/f0 $DIR/1b0/f01 || error
260         echo "rm $DIR/1b0/f01"
261         rm $DIR/1b0/f01 || error
262         echo "touch $DIR/1b0/f01"
263         touch $DIR/1b0/f01 || error
264         echo "ln $DIR/1b0/f01 $DIR/1b0/f01h"
265         ln $DIR/1b0/f01 $DIR/1b0/f01h || error
266         echo "ln -s $DIR/1b0/f01 $DIR/1b0/f01s"
267         ln -s $DIR/1b0/f01 $DIR/1b0/f01s || error
268
269         rm -fr $DIR/1b0 > /dev/null
270         echo "cache flush on $NAME"
271         lsync $NAME >/dev/null || error
272 }
273 run_test 1b " WB test (lsync after bunch of MD operarions)============="
274
275 test_2a() {
276         echo "mkdir $DIR/2a0"
277         mkdir $DIR/2a0 || error 
278         echo "createmany -o $DIR/2a0/f 4000"
279         createmany -o $DIR/2a0/f 4000
280         echo "cache flush on $NAME"
281         lsync $NAME >/dev/null || error
282 }
283
284 test_2b() {
285         echo "find $DIR/2a0 -type f -exec rm -f {} \;"
286         find $DIR/2a0 -type f -exec rm -f {} \;
287         rmdir $DIR/2a0 || error
288         echo "cache flush on $NAME"
289         lsync $NAME >/dev/null || error
290 }
291
292 [ "x$MODE" = "xlmv" ] && {
293 run_test 2a " WB test (flush createmany on master LMV) ======================"
294 run_test 2b " WB test (flush delmany on master LMV) ========================="
295 }
296
297 TMPDIR=$OLDTMPDIR
298 TMP=$OLDTMP
299 HOME=$OLDHOME
300
301 log "cleanup: ========================================================"
302 if [ "`mount | grep ^$NAME`" ]; then
303         rm -rf $DIR/[Rdfs][1-9]*
304         if [ "$I_MOUNTED" = "yes" ]; then
305                 sh llmountcleanup.sh || error
306         fi
307 fi
308
309 echo "=========================== finished ============================"
310 [ -f "$SANITYLOG" ] && cat $SANITYLOG && exit 1 || true