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