Whamcloud - gitweb
land 0.5.20.3 b_devel onto HEAD (b_devel will remain)
[fs/lustre-release.git] / lustre / tests / sanity.sh
1 #!/bin/bash
2
3 set -e
4
5 SRCDIR=`dirname $0`
6 PATH=$SRCDIR:$SRCDIR/../utils:$PATH
7
8 CHECKSTAT=${CHECKSTAT:-"./checkstat -v"}
9 CREATETEST=${CREATETEST:-createtest}
10 LFIND=${LFIND:-lfind}
11 LSTRIPE=${LSTRIPE:-lstripe}
12 MCREATE=${MCREATE:-mcreate}
13 TOEXCL=${TOEXCL:-toexcl}
14
15 MOUNT=${MOUNT:-/mnt/lustre}
16 DIR=${DIR:-$MOUNT}
17 export NAME=$NAME
18 clean() {
19         echo -n "cln.."
20         sh llmountcleanup.sh > /dev/null || exit 20
21 }
22 CLEAN=${CLEAN:-clean}
23 start() {
24         echo -n "mnt.."
25         sh llrmount.sh > /dev/null || exit 10
26         echo "done"
27 }
28 START=${START:-start}
29
30 log() {
31         echo "$*"
32         lctl mark "$*"
33 }
34
35 error() { 
36     echo FAIL
37     exit 1
38 }
39
40 pass() { 
41     echo PASS
42 }
43
44 mount | grep $MOUNT || sh llmount.sh
45
46 log '== touch .../f ; rm .../f ======================== test 0'
47 touch $DIR/f
48 $CHECKSTAT -t file $DIR/f || error 
49 rm $DIR/f
50 $CHECKSTAT -a $DIR/f || error
51 pass
52 $CLEAN
53 $START
54
55 log '== mkdir .../d1; mkdir .../d1/d2 ================= test 1'
56 mkdir $DIR/d1
57 mkdir $DIR/d1/d2
58 $CHECKSTAT -t dir $DIR/d1/d2 || error
59 pass
60 $CLEAN
61 $START
62
63 log '== rmdir .../d1/d2; rmdir .../d1 ================= test 1b'
64 rmdir $DIR/d1/d2
65 rmdir $DIR/d1
66 $CHECKSTAT -a $DIR/d1 || error
67 pass
68 $CLEAN
69 $START
70
71 log '== mkdir .../d2; touch .../d2/f ================== test 2'
72 mkdir $DIR/d2
73 touch $DIR/d2/f
74 $CHECKSTAT -t file $DIR/d2/f || error
75 pass
76 $CLEAN
77 $START
78
79 log '== rm -r .../d2; touch .../d2/f ================== test 2b'
80 rm -r $DIR/d2
81 $CHECKSTAT -a $DIR/d2 || error
82 pass
83 $CLEAN
84 $START
85
86 log '== mkdir .../d3 ================================== test 3'
87 mkdir $DIR/d3
88 $CHECKSTAT -t dir $DIR/d3 || error
89 pass
90 $CLEAN
91 $START
92 log '== touch .../d3/f ================================ test 3b'
93 touch $DIR/d3/f
94 $CHECKSTAT -t file $DIR/d3/f || error
95 pass
96 $CLEAN
97 $START
98 log '== rm -r .../d3 ================================== test 3c'
99 rm -r $DIR/d3
100 $CHECKSTAT -a $DIR/d3 || error
101 pass
102 $CLEAN
103 $START
104
105 log '== mkdir .../d4 ================================== test 4'
106 mkdir $DIR/d4
107 $CHECKSTAT -t dir $DIR/d4 || error
108 pass
109 $CLEAN
110 $START
111 log '== mkdir .../d4/d2 =============================== test 4b'
112 mkdir $DIR/d4/d2
113 $CHECKSTAT -t dir $DIR/d4/d2 || error
114 pass
115 $CLEAN
116 $START
117
118 log '== mkdir .../d5; mkdir .../d5/d2; chmod .../d5/d2 = test 5'
119 mkdir $DIR/d5
120 mkdir $DIR/d5/d2
121 chmod 0707 $DIR/d5/d2
122 $CHECKSTAT -t dir -p 0707 $DIR/d5/d2 || error
123 pass
124 $CLEAN
125 $START
126
127 log '== touch .../f6; chmod .../f6 ==================== test 6'
128 touch $DIR/f6
129 chmod 0666 $DIR/f6
130 $CHECKSTAT -t file -p 0666 $DIR/f6 || error
131 pass
132 $CLEAN
133 $START
134
135 log '== mkdir .../d7; mcreate .../d7/f; chmod .../d7/f = test 7'
136 mkdir $DIR/d7
137 $MCREATE $DIR/d7/f
138 chmod 0666 $DIR/d7/f
139 $CHECKSTAT -t file -p 0666 $DIR/d7/f || error
140 pass
141 $CLEAN
142 $START
143
144 log '== mkdir .../d7; mcreate .../d7/f2; echo foo > .../d7/f2 = test 7b'
145 $MCREATE $DIR/d7/f2
146 log -n foo > $DIR/d7/f2
147 [ "`cat $DIR/d7/f2`" = "foo" ] || error
148 $CHECKSTAT -t file -s 3 $DIR/d7/f2 || error
149 pass
150 $CLEAN
151 $START
152
153 log '== mkdir .../d8; touch .../d8/f; chmod .../d8/f == test 8'
154 mkdir $DIR/d8
155 touch $DIR/d8/f
156 chmod 0666 $DIR/d8/f
157 $CHECKSTAT -t file -p 0666 $DIR/d8/f || error
158 pass
159 $CLEAN
160 $START
161
162
163 log '== mkdir .../d9 .../d9/d2 .../d9/d2/d3 =========== test 9'
164 mkdir $DIR/d9
165 mkdir $DIR/d9/d2
166 mkdir $DIR/d9/d2/d3
167 $CHECKSTAT -t dir $DIR/d9/d2/d3 || error
168 pass
169 $CLEAN
170 $START
171
172
173 log '== mkdir .../d10 .../d10/d2; touch .../d10/d2/f = test 10'
174 mkdir $DIR/d10
175 mkdir $DIR/d10/d2
176 touch $DIR/d10/d2/f
177 $CHECKSTAT -t file $DIR/d10/d2/f || error
178 pass
179 $CLEAN
180 $START
181
182 log '== mkdir .../d11 d11/d2; chmod .../d11/d2 ======= test 11'
183 mkdir $DIR/d11
184 mkdir $DIR/d11/d2
185 chmod 0666 $DIR/d11/d2
186 chmod 0705 $DIR/d11/d2
187 $CHECKSTAT -t dir -p 0705 $DIR/d11/d2 || error
188 pass
189 $CLEAN
190 $START
191
192 log '== mkdir .../d12; touch .../d12/f; chmod .../d12/f == test 12'
193 mkdir $DIR/d12
194 touch $DIR/d12/f
195 chmod 0666 $DIR/d12/f
196 chmod 0654 $DIR/d12/f
197 $CHECKSTAT -t file -p 0654 $DIR/d12/f || error
198 pass
199 $CLEAN
200 $START
201
202 log '== mkdir .../d13; creat .../d13/f;  .../d13/f; > .../d13/f == test 13'
203 mkdir $DIR/d13
204 dd if=/dev/zero of=$DIR/d13/f count=10
205 >  $DIR/d13/f
206 $CHECKSTAT -t file -s 0 $DIR/d13/f || error
207 pass
208 $CLEAN
209 $START
210
211 log '================================================== test 14'
212 mkdir $DIR/d14
213 touch $DIR/d14/f
214 rm $DIR/d14/f
215 $CHECKSTAT -a $DIR/d14/f || error
216 pass
217 $CLEAN
218 $START
219
220 log '================================================== test 15'
221 mkdir $DIR/d15
222 touch $DIR/d15/f
223 mv $DIR/d15/f $DIR/d15/f2
224 $CHECKSTAT -t file $DIR/d15/f2 || error
225 pass
226 $CLEAN
227 $START
228
229 log '================================================== test 16'
230 mkdir $DIR/d16
231 touch $DIR/d16/f
232 rm -rf $DIR/d16/f
233 $CHECKSTAT -a $DIR/d16/f || error
234 pass
235 $CLEAN
236 $START
237
238 log '== symlinks: create, remove (dangling and real) == test 17'
239 mkdir $DIR/d17
240 touch $DIR/d17/f
241 ln -s $DIR/d17/f $DIR/d17/l-exist
242 ln -s no-such-file $DIR/d17/l-dangle
243 ls -l $DIR/d17
244 $CHECKSTAT -l $DIR/d17/f $DIR/d17/l-exist || error
245 $CHECKSTAT -f -t f $DIR/d17/l-exist || error
246 $CHECKSTAT -l no-such-file $DIR/d17/l-dangle || error
247 $CHECKSTAT -fa $DIR/d17/l-dangle || error
248 rm -f $DIR/l-dangle
249 rm -f $DIR/l-exist
250 $CHECKSTAT -a $DIR/l-dangle || error
251 $CHECKSTAT -a $DIR/l-exist || error
252 pass
253 $CLEAN
254 $START
255
256 log "== touch .../f ; ls ... ========================= test 18"
257 touch $DIR/f
258 ls $DIR || error
259 pass
260 $CLEAN
261 $START
262
263 log "== touch .../f ; ls -l ... ====================== test 19"
264 touch $DIR/f
265 ls -l $DIR
266 rm $DIR/f
267 $CHECKSTAT -a $DIR/f || error
268 pass
269 $CLEAN
270 $START
271
272 log "== touch .../f ; ls -l ... ====================== test 20"
273 touch $DIR/f
274 rm $DIR/f
275 log "1 done"
276 touch $DIR/f
277 rm $DIR/f
278 log "2 done"
279 touch $DIR/f
280 rm $DIR/f
281 log "3 done"
282 $CHECKSTAT -a $DIR/f || error
283 pass
284 $CLEAN
285 $START
286
287 log '== write to dangling link ======================== test 21'
288 mkdir $DIR/d21
289 [ -f $DIR/d21/dangle ] && rm -f $DIR/d21/dangle
290 ln -s dangle $DIR/d21/link
291 echo foo >> $DIR/d21/link
292 cat $DIR/d21/dangle
293 $CHECKSTAT -t link $DIR/d21/link || error
294 $CHECKSTAT -f -t file $DIR/d21/link || error
295 pass
296 $CLEAN
297 $START
298
299 log '== unpack tar archive as non-root user =========== test 22'
300 mkdir $DIR/d22
301 which sudo && chown 4711 $DIR/d22
302 SUDO=`which sudo 2> /dev/null` && SUDO="$SUDO -u #4711" || SUDO=""
303 echo '**** FIX THIS TEST ****'
304 SUDO=""
305 $SUDO tar cf - /etc/hosts /etc/sysconfig/network | $SUDO tar xfC - $DIR/d22
306 ls -lR $DIR/d22/etc
307 $CHECKSTAT -t dir $DIR/d22/etc || error
308 [ -z "$SUDO" ] || $CHECKSTAT -u \#4711 $DIR/d22/etc || error
309 pass
310 $CLEAN
311 $START
312
313 log '== O_CREAT|O_EXCL in subdir ====================== test 23'
314 mkdir $DIR/d23
315 $TOEXCL $DIR/d23/f23
316 $TOEXCL -e $DIR/d23/f23 || error
317 pass
318 $CLEAN
319 $START
320
321 echo '== rename sanity ================================= test24'
322 echo '-- same directory rename'
323 log '-- test 24-R1: touch a ; rename a b'
324 mkdir $DIR/R1
325 touch $DIR/R1/f
326 mv $DIR/R1/f $DIR/R1/g
327 $CHECKSTAT -t file $DIR/R1/g || error
328 pass
329 $CLEAN
330 $START
331
332 log '-- test 24-R2: touch a b ; rename a b;'
333 mkdir $DIR/R2
334 touch $DIR/R2/{f,g}
335 mv $DIR/R2/f $DIR/R2/g
336 $CHECKSTAT -a $DIR/R2/f || error
337 $CHECKSTAT -t file $DIR/R2/g || error
338 pass
339 $CLEAN
340 $START
341
342 log '-- test 24-R3: mkdir a  ; rename a b;'
343 mkdir $DIR/R3
344 mkdir $DIR/R3/f
345 mv $DIR/R3/f $DIR/R3/g
346 $CHECKSTAT -a $DIR/R3/f || error
347 $CHECKSTAT -t dir $DIR/R3/g || error
348 pass
349 $CLEAN
350 $START
351
352 log '-- test 24-R4: mkdir a b ; rename a b;'
353 mkdir $DIR/R4
354 mkdir $DIR/R4/{f,g}
355 perl -e "rename \"$DIR/R4/f\", \"$DIR/R4/g\";"
356 $CHECKSTAT -a $DIR/R4/f || error
357 $CHECKSTAT -t dir $DIR/R4/g || error
358 pass
359 $CLEAN
360 $START
361
362 echo '-- cross directory renames --' 
363 log '-- test 24-R5: touch a ; rename a b'
364 mkdir $DIR/R5{a,b}
365 touch $DIR/R5a/f
366 mv $DIR/R5a/f $DIR/R5b/g
367 $CHECKSTAT -a $DIR/R5a/f || error
368 $CHECKSTAT -t file $DIR/R5b/g || error
369 pass
370 $CLEAN
371 $START
372
373 log '-- test 24-R6: touch a ; rename a b'
374 mkdir $DIR/R6{a,b}
375 touch $DIR/R6a/f $DIR/R6b/g
376 mv $DIR/R6a/f $DIR/R6b/g
377 $CHECKSTAT -a $DIR/R6a/f || error
378 $CHECKSTAT -t file $DIR/R6b/g || error
379 pass
380 $CLEAN
381 $START
382
383 log '-- test 24-R7: touch a ; rename a b'
384 mkdir $DIR/R7{a,b}
385 mkdir $DIR/R7a/f
386 mv $DIR/R7a/f $DIR/R7b/g
387 $CHECKSTAT -a $DIR/R7a/f || error
388 $CHECKSTAT -t dir $DIR/R7b/g || error
389 pass
390 $CLEAN
391 $START
392
393 log '-- test 24-R8: touch a ; rename a b'
394 mkdir $DIR/R8{a,b}
395 mkdir $DIR/R8a/f $DIR/R8b/g
396 perl -e "rename \"$DIR/R8a/f\", \"$DIR/R8b/g\";"
397 $CHECKSTAT -a $DIR/R8a/f || error
398 $CHECKSTAT -t dir $DIR/R8b/g || error
399 pass
400 $CLEAN
401 $START
402
403 echo "-- rename error cases"
404 log "-- test 24-R9 target error: touch f ; mkdir a ; rename f a"
405 mkdir $DIR/R9
406 mkdir $DIR/R9/a
407 touch $DIR/R9/f
408 perl -e "rename \"$DIR/R9/f\", \"$DIR/R9/a\";"
409 $CHECKSTAT -t file $DIR/R9/f || error
410 $CHECKSTAT -t dir  $DIR/R9/a || error
411 $CHECKSTAT -a file $DIR/R9/a/f || error
412 pass
413 $CLEAN
414 $START
415
416 log "--test 24-R10 source does not exist" 
417 mkdir $DIR/R10
418 perl -e "rename \"$DIR/R10/f\", \"$DIR/R10/g\"" 
419 $CHECKSTAT -t dir $DIR/R10 || error
420 $CHECKSTAT -a $DIR/R10/f || error
421 $CHECKSTAT -a $DIR/R10/g || error
422 pass
423 $CLEAN
424 $START
425
426 echo '== symlink sanity ================================ test25'
427 log "--test 25.1 create file in symlinked directory"
428 mkdir $DIR/d25
429 ln -s d25 $DIR/s25
430 touch $DIR/s25/foo
431 pass
432 $CLEAN
433 $START
434
435 log "--test 25.2 lookup file in symlinked directory"
436 $CHECKSTAT -t file $DIR/s25/foo
437 pass
438 $CLEAN
439 $START
440
441 log "--test 26 multiple component symlink"
442 mkdir $DIR/d26
443 mkdir $DIR/d26/d26-2
444 ln -s d26/d26-2 $DIR/s26
445 touch $DIR/s26/foo
446 pass
447 $CLEAN
448 $START
449
450 log "--test 26.1 multiple component symlink at the end of a lookup"
451 ln -s d26/d26-2/foo $DIR/s26-2
452 touch $DIR/s26-2
453 pass
454 $CLEAN
455 $START
456
457 log "--test 26.2 a chain of symlinks"
458 mkdir $DIR/d26.2
459 touch $DIR/d26.2/foo
460 ln -s d26.2 $DIR/s26.2-1
461 ln -s s26.2-1 $DIR/s26.2-2
462 ln -s s26.2-2 $DIR/s26.2-3
463 chmod 0666 $DIR/s26.2-3/foo
464 pass
465 $CLEAN
466 $START
467
468 # recursive symlinks (bug 439)
469 log "--test 26.3 create multiple component recursive symlink"
470 ln -s d26-3/foo $DIR/d26-3
471 pass
472 $CLEAN
473 $START
474
475 log "--test 26.3 unlink multiple component recursive symlink"
476 rm $DIR/d26-3
477 pass
478 $CLEAN
479 $START
480
481 echo '== stripe sanity ================================= test27'
482 log "--test 27.1 create one stripe"
483 mkdir $DIR/d27
484 $LSTRIPE $DIR/d27/f0 8192 0 1
485 $CHECKSTAT -t file $DIR/d27/f0
486 log "--test 27.2 write to one stripe file"
487 cp /etc/hosts $DIR/d27/f0
488 pass
489
490 log "--test 27.3 create two stripe file f01"
491 $LSTRIPE $DIR/d27/f01 8192 0 2
492 log "--test 27.4 write to two stripe file file f01"
493 dd if=/dev/zero of=$DIR/d27/f01 bs=4k count=4
494 pass
495
496 log "--test 27.5 create file with default settings"
497 $LSTRIPE $DIR/d27/fdef 0 -1 0
498 $CHECKSTAT -t file $DIR/d27/fdef
499 #dd if=/dev/zero of=$DIR/d27/fdef bs=4k count=4
500
501 log "--test 27.6 lstripe existing file (should return error)"
502 $LSTRIPE $DIR/d27/f12 8192 1 2
503 ! $LSTRIPE $DIR/d27/f12 8192 1 2
504 $CHECKSTAT -t file $DIR/d27/f12
505 #dd if=/dev/zero of=$DIR/d27/f12 bs=4k count=4
506 pass
507
508
509 log "--test 27.7 lstripe with bad stripe size (should return error on LOV)"
510 $LSTRIPE $DIR/d27/fbad 100 1 2 || /bin/true
511 dd if=/dev/zero of=$DIR/d27/f12 bs=4k count=4
512 pass
513 $CLEAN
514 $START
515
516 log "--test 27.8 lfind "
517 $LFIND $DIR/d27
518 pass
519 $CLEAN
520 $START
521
522 log '== create/mknod/mkdir with bad file types ======== test28'
523 mkdir $DIR/d28
524 $CREATETEST $DIR/d28/ct || error
525 pass
526
527 log '== IT_GETATTR regression  ======================== test29'
528 mkdir $DIR/d29
529 touch $DIR/d29/foo
530 ls -l $DIR/d29
531 MDCDIR=${MDCDIR:-/proc/fs/lustre/ldlm/ldlm/MDC_*}
532 LOCKCOUNTORIG=`cat $MDCDIR/lock_count`
533 LOCKUNUSEDCOUNTORIG=`cat $MDCDIR/lock_unused_count`
534 ls -l $DIR/d29
535 LOCKCOUNTCURRENT=`cat $MDCDIR/lock_count`
536 LOCKUNUSEDCOUNTCURRENT=`cat $MDCDIR/lock_unused_count`
537 if [ $LOCKCOUNTCURRENT -gt $LOCKCOUNTORIG ] || [ $LOCKUNUSEDCOUNTCURRENT -gt $LOCKUNUSEDCOUNTORIG ]; then
538     error
539 fi
540 pass
541 $CLEAN
542 $START
543
544 log '== run binary from Lustre (execve) =============== test30'
545 cp `which ls` $DIR
546 $DIR/ls /
547 $CLEAN
548 $START
549
550 log '== open-unlink file ============================== test31'
551 ./openunlink $DIR/f31 $DIR/f31 || error
552 pass
553
554 log '== cleanup ============================================='
555 rm -r $DIR/[Rdfs][1-9]* $DIR/ls
556
557 echo '======================= finished ======================='
558 exit