Whamcloud - gitweb
b=20057 Autovetting and test-framework enhancements
[fs/lustre-release.git] / lustre / tests / insanity.sh
1 #!/bin/sh
2 # Test multiple failures, AKA Test 17
3
4 set -e
5
6 LUSTRE=${LUSTRE:-`dirname $0`/..}
7 . $LUSTRE/tests/test-framework.sh
8
9 init_test_env $@
10
11 . ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh}
12 init_logging
13 #              
14 ALWAYS_EXCEPT="10  $INSANITY_EXCEPT"
15
16 if [ "$FAILURE_MODE" = "HARD" ]; then
17     mixed_ost_devs && CONFIG_EXCEPTIONS="0 2 4 5 6 8" && \
18         echo -n "Several ost services on one ost node are used with FAILURE_MODE=$FAILURE_MODE. " && \
19         echo "Except the tests: $CONFIG_EXCEPTIONS" && \
20         ALWAYS_EXCEPT="$ALWAYS_EXCEPT $CONFIG_EXCEPTIONS"
21 fi
22
23 #
24 [ "$SLOW" = "no" ] && EXCEPT_SLOW=""
25
26 SETUP=${SETUP:-""}
27 CLEANUP=${CLEANUP:-""}
28
29 build_test_filter
30
31 SINGLECLIENT=${SINGLECLIENT:-$HOSTNAME}
32 LIVE_CLIENT=${LIVE_CLIENT:-$SINGLECLIENT}
33 FAIL_CLIENTS=${FAIL_CLIENTS:-$RCLIENTS}
34
35 assert_env mds_HOST MDS_MKFS_OPTS
36 assert_env ost_HOST OST_MKFS_OPTS OSTCOUNT
37 assert_env LIVE_CLIENT FSNAME
38
39 require_dsh_mds || exit 0
40 require_dsh_ost || exit 0
41
42 # FAIL_CLIENTS list should not contain the LIVE_CLIENT
43 FAIL_CLIENTS=$(echo " $FAIL_CLIENTS " | sed -re "s/\s+$LIVE_CLIENT\s+/ /g")
44
45 DIR=${DIR:-$MOUNT}
46 TESTDIR=$DIR/d0.$(basename $0 .sh)
47
48 #####
49 # fail clients round robin
50
51 # list of failable clients
52 FAIL_LIST=($FAIL_CLIENTS)
53 FAIL_NUM=${#FAIL_LIST[*]}
54 FAIL_NEXT=0
55 typeset -i  FAIL_NEXT
56 DOWN_NUM=0   # number of nodes currently down
57
58 # set next client to fail
59 set_fail_client() {
60     FAIL_CLIENT=${FAIL_LIST[$FAIL_NEXT]}
61     FAIL_NEXT=$(( (FAIL_NEXT+1) % FAIL_NUM ))
62     echo "fail $FAIL_CLIENT, next is $FAIL_NEXT"
63 }
64
65 fail_clients() {
66     num=$1
67
68     log "Request clients to fail: ${num}. Num of clients to fail: ${FAIL_NUM}, already failed: $DOWN_NUM"
69     if [ -z "$num"  ] || [ "$num" -gt $((FAIL_NUM - DOWN_NUM)) ]; then
70         num=$((FAIL_NUM - DOWN_NUM)) 
71     fi
72     
73     if [ -z "$num" ] || [ "$num" -le 0 ]; then
74         log "No clients failed!"
75         return
76     fi
77
78     client_mkdirs
79
80     for i in `seq $num`; do
81        set_fail_client
82        client=$FAIL_CLIENT
83        DOWN_CLIENTS="$DOWN_CLIENTS $client"
84        shutdown_client $client
85     done
86
87     echo "down clients: $DOWN_CLIENTS"
88
89     for client in $DOWN_CLIENTS; do
90         boot_node $client
91     done
92     DOWN_NUM=`echo $DOWN_CLIENTS | wc -w`
93     client_rmdirs
94 }
95
96 reintegrate_clients() {
97     for client in $DOWN_CLIENTS; do
98         wait_for_host $client
99         echo "Restarting $client"
100         zconf_mount $client $MOUNT || return 1
101     done
102     DOWN_CLIENTS=""
103     DOWN_NUM=0
104 }
105
106 start_ost() {
107     start ost$1 `ostdevname $1` $OST_MOUNT_OPTS
108 }
109
110 trap exit INT
111
112 client_touch() {
113     file=$1
114     for c in $LIVE_CLIENT $FAIL_CLIENTS;  do
115         if echo $DOWN_CLIENTS | grep -q $c; then continue; fi
116         $PDSH $c touch $TESTDIR/${c}_$file || return 1
117     done
118 }
119
120 client_rm() {
121     file=$1
122     for c in $LIVE_CLIENT $FAIL_CLIENTS;  do
123         $PDSH $c rm $TESTDIR/${c}_$file
124     done
125 }
126
127 client_mkdirs() {
128     for c in $LIVE_CLIENT $FAIL_CLIENTS;  do
129         echo "$c mkdir $TESTDIR/$c"
130         $PDSH $c "mkdir $TESTDIR/$c && ls -l $TESTDIR/$c"
131     done
132 }
133
134 client_rmdirs() {
135     for c in $LIVE_CLIENT $FAIL_CLIENTS;  do
136         echo "rmdir $TESTDIR/$c"
137         $PDSH $LIVE_CLIENT "rmdir $TESTDIR/$c"
138     done
139 }
140
141 clients_recover_osts() {
142     facet=$1
143 #    do_node $CLIENTS "$LCTL "'--device %OSC_`hostname`_'"${facet}_svc_MNT_client_facet recover"
144 }
145
146 check_and_setup_lustre
147
148 rm -rf $TESTDIR
149 mkdir -p $TESTDIR
150
151 # 9 Different Failure Modes Combinations
152 echo "Starting Test 17 at `date`"
153
154 test_0() {
155     fail $SINGLEMDS
156
157     for i in $(seq $OSTCOUNT) ; do
158         fail ost$i
159     done
160     return 0
161 }
162 run_test 0 "Fail all nodes, independently"
163
164 ############### First Failure Mode ###############
165 test_1() {
166 echo "Don't do a MDS - MDS Failure Case"
167 echo "This makes no sense"
168 }
169 run_test 1 "MDS/MDS failure"
170 ###################################################
171
172 ############### Second Failure Mode ###############
173 test_2() {
174     echo "Verify Lustre filesystem is up and running"
175     [ -z "$(mounted_lustre_filesystems)" ] && error "Lustre is not running"
176
177     clients_up
178
179     shutdown_facet $SINGLEMDS
180     reboot_facet $SINGLEMDS
181
182     # prepare for MDS failover
183     change_active $SINGLEMDS
184     reboot_facet $SINGLEMDS
185
186     clients_up &
187     DFPID=$!
188     sleep 5
189
190     shutdown_facet ost1
191
192     echo "Reintegrating OST"
193     reboot_facet ost1
194     wait_for ost1
195     start_ost 1 || return 2
196
197     wait_for $SINGLEMDS
198     start $SINGLEMDS `mdsdevname 1` $MDS_MOUNT_OPTS || return $?
199
200     #Check FS
201     wait $DFPID
202     clients_recover_osts ost1
203     echo "Verify reintegration"
204     clients_up || return 1
205
206 }
207 run_test 2 "Second Failure Mode: MDS/OST `date`"
208 ###################################################
209
210
211 ############### Third Failure Mode ###############
212 test_3() {
213     #Create files
214     echo "Verify Lustre filesystem is up and running"
215     [ -z "$(mounted_lustre_filesystems)" ] && error "Lustre is not running"
216     
217     #MDS Portion
218     fail $SINGLEMDS
219     #Check FS
220
221     echo "Test Lustre stability after MDS failover"
222     clients_up
223
224     #CLIENT Portion
225     echo "Failing 2 CLIENTS"
226     fail_clients 2
227     
228     #Check FS
229     echo "Test Lustre stability after CLIENT failure"
230     clients_up
231     
232     #Reintegration
233     echo "Reintegrating CLIENTS"
234     reintegrate_clients || return 1
235
236     clients_up || return 3
237     sleep 2 # give it a little time for fully recovered before next test
238 }
239 run_test 3  "Thirdb Failure Mode: MDS/CLIENT `date`"
240 ###################################################
241
242 ############### Fourth Failure Mode ###############
243 test_4() {
244     echo "Fourth Failure Mode: OST/MDS `date`"
245
246     #OST Portion
247     shutdown_facet ost1
248  
249     #Check FS
250     echo "Test Lustre stability after OST failure"
251     clients_up &
252     DFPIDA=$!
253     sleep 5
254
255     #MDS Portion
256     shutdown_facet $SINGLEMDS
257     reboot_facet $SINGLEMDS
258
259     # prepare for MDS failover
260     change_active $SINGLEMDS
261     reboot_facet $SINGLEMDS
262
263     clients_up &
264     DFPIDB=$!
265     sleep 5
266
267     #Reintegration
268     echo "Reintegrating OST"
269     reboot_facet ost1
270     wait_for ost1
271     start_ost 1
272     
273     wait_for $SINGLEMDS
274     start $SINGLEMDS `mdsdevname 1` $MDS_MOUNT_OPTS
275     #Check FS
276     
277     wait $DFPIDA
278     wait $DFPIDB
279     clients_recover_osts ost1
280     echo "Test Lustre stability after MDS failover"
281     clients_up || return 1
282 }
283 run_test 4 "Fourth Failure Mode: OST/MDS `date`"
284 ###################################################
285
286 ############### Fifth Failure Mode ###############
287 test_5() {
288     [ $OSTCOUNT -lt 2 ] && skip_env "$OSTCOUNT < 2, not enough OSTs" && return 0
289
290     echo "Fifth Failure Mode: OST/OST `date`"
291
292     #Create files
293     echo "Verify Lustre filesystem is up and running"
294     [ -z "$(mounted_lustre_filesystems)" ] && error "Lustre is not running"
295
296     clients_up
297     
298     #OST Portion
299     shutdown_facet ost1
300     reboot_facet ost1
301     
302     #Check FS
303     echo "Test Lustre stability after OST failure"
304     clients_up &
305     DFPIDA=$!
306     sleep 5
307     
308     #OST Portion
309     shutdown_facet ost2
310     reboot_facet ost2
311
312     #Check FS
313     echo "Test Lustre stability after OST failure"
314     clients_up &
315     DFPIDB=$!
316     sleep 5
317
318     #Reintegration
319     echo "Reintegrating OSTs"
320     wait_for ost1
321     start_ost 1
322     wait_for ost2
323     start_ost 2
324     
325     clients_recover_osts ost1
326     clients_recover_osts ost2
327     sleep $TIMEOUT
328
329     wait $DFPIDA
330     wait $DFPIDB
331     clients_up || return 2
332 }
333 run_test 5 "Fifth Failure Mode: OST/OST `date`"
334 ###################################################
335
336 ############### Sixth Failure Mode ###############
337 test_6() {
338     echo "Sixth Failure Mode: OST/CLIENT `date`"
339
340     #Create files
341     echo "Verify Lustre filesystem is up and running"
342     [ -z "$(mounted_lustre_filesystems)" ] && error "Lustre is not running"
343
344     clients_up
345     client_touch testfile || return 2
346         
347     #OST Portion
348     shutdown_facet ost1
349     reboot_facet ost1
350
351     #Check FS
352     echo "Test Lustre stability after OST failure"
353     clients_up &
354     DFPIDA=$!
355     echo DFPIDA=$DFPIDA
356     sleep 5
357
358     #CLIENT Portion
359     echo "Failing CLIENTs"
360     fail_clients
361     
362     #Check FS
363     echo "Test Lustre stability after CLIENTs failure"
364     clients_up &
365     DFPIDB=$!
366     echo DFPIDB=$DFPIDB
367     sleep 5
368     
369     #Reintegration
370     echo "Reintegrating OST/CLIENTs"
371     wait_for ost1
372     start_ost 1
373     reintegrate_clients || return 1
374     sleep 5 
375
376     wait_remote_prog "stat -f" $((TIMEOUT * 3 + 20)) 
377     wait $DFPIDA
378     wait $DFPIDB
379
380     echo "Verifying mount"
381     [ -z "$(mounted_lustre_filesystems)" ] && return 3
382     clients_up
383 }
384 run_test 6 "Sixth Failure Mode: OST/CLIENT `date`"
385 ###################################################
386
387
388 ############### Seventh Failure Mode ###############
389 test_7() {
390     echo "Seventh Failure Mode: CLIENT/MDS `date`"
391
392     #Create files
393     echo "Verify Lustre filesystem is up and running"
394     [ -z "$(mounted_lustre_filesystems)" ] && error "Lustre is not running"
395
396     clients_up
397     client_touch testfile  || return 1
398
399     #CLIENT Portion
400     echo "Part 1: Failing CLIENT"
401     fail_clients 2
402     
403     #Check FS
404     echo "Test Lustre stability after CLIENTs failure"
405     clients_up
406     $PDSH $LIVE_CLIENT "ls -l $TESTDIR"
407     $PDSH $LIVE_CLIENT "rm -f $TESTDIR/*_testfile"
408     
409     #Sleep
410     echo "Wait 1 minutes"
411     sleep 60
412
413     #Create files
414     echo "Verify Lustre filesystem is up and running"
415     [ -z "$(mounted_lustre_filesystems)" ] && return 2
416
417     clients_up
418     client_rm testfile
419
420     #MDS Portion
421     fail $SINGLEMDS
422
423     $PDSH $LIVE_CLIENT "ls -l $TESTDIR"
424     $PDSH $LIVE_CLIENT "rm -f $TESTDIR/*_testfile"
425
426     #Reintegration
427     echo "Reintegrating CLIENTs"
428     reintegrate_clients || return 2
429     clients_up
430     
431     #Sleep
432     echo "wait 1 minutes"
433     sleep 60
434 }
435 run_test 7 "Seventh Failure Mode: CLIENT/MDS `date`"
436 ###################################################
437
438
439 ############### Eighth Failure Mode ###############
440 test_8() {
441     echo "Eighth Failure Mode: CLIENT/OST `date`"
442
443     #Create files
444     echo "Verify Lustre filesystem is up and running"
445     [ -z "$(mounted_lustre_filesystems)" ] && error "Lustre is not running"
446
447     clients_up
448     client_touch testfile
449         
450     #CLIENT Portion
451     echo "Failing CLIENTs"
452     fail_clients 2
453
454     #Check FS
455     echo "Test Lustre stability after CLIENTs failure"
456     clients_up
457     $PDSH $LIVE_CLIENT "ls -l $TESTDIR"
458     $PDSH $LIVE_CLIENT "rm -f $TESTDIR/*_testfile"
459
460     #Sleep
461     echo "Wait 1 minutes"
462     sleep 60
463
464     #Create files
465     echo "Verify Lustre filesystem is up and running"
466     [ -z "$(mounted_lustre_filesystems)" ] && error "Lustre is not running"
467
468     clients_up
469     client_touch testfile
470
471
472     #OST Portion
473     shutdown_facet ost1
474     reboot_facet ost1
475
476     #Check FS
477     echo "Test Lustre stability after OST failure"
478     clients_up &
479     DFPID=$!
480     sleep 5
481     #non-failout hangs forever here
482     #$PDSH $LIVE_CLIENT "ls -l $TESTDIR"
483     #$PDSH $LIVE_CLIENT "rm -f $TESTDIR/*_testfile"
484     
485     #Reintegration
486     echo "Reintegrating CLIENTs/OST"
487     reintegrate_clients || return 3
488     wait_for ost1
489     start_ost 1
490     wait $DFPID
491     clients_up || return 1
492     client_touch testfile2 || return 2
493
494     #Sleep
495     echo "Wait 1 minutes"
496     sleep 60
497 }
498 run_test 8 "Eighth Failure Mode: CLIENT/OST `date`"
499 ###################################################
500
501
502 ############### Ninth Failure Mode ###############
503 test_9() {
504     echo 
505
506     #Create files
507     echo "Verify Lustre filesystem is up and running"
508     [ -z "$(mounted_lustre_filesystems)" ] && error "Lustre is not running"
509
510     clients_up
511     client_touch testfile || return 1
512         
513     #CLIENT Portion
514     echo "Failing CLIENTs"
515     fail_clients 2
516
517     #Check FS
518     echo "Test Lustre stability after CLIENTs failure"
519     clients_up
520     $PDSH $LIVE_CLIENT "ls -l $TESTDIR" || return 1
521     $PDSH $LIVE_CLIENT "rm -f $TESTDIR/*_testfile" || return 2
522
523     #Sleep
524     echo "Wait 1 minutes"
525     sleep 60
526
527     #Create files
528     echo "Verify Lustre filesystem is up and running"
529     client_up $LIVE_CLIENT || return 3
530     client_touch testfile || return 4
531
532     #CLIENT Portion
533     echo "Failing CLIENTs"
534     fail_clients 2
535     
536     #Check FS
537     echo "Test Lustre stability after CLIENTs failure"
538     clients_up
539     $PDSH $LIVE_CLIENT "ls -l $TESTDIR" || return 5
540     $PDSH $LIVE_CLIENT "rm -f $TESTDIR/*_testfile" || return 6
541
542     #Reintegration
543     echo "Reintegrating  CLIENTs/CLIENTs"
544     reintegrate_clients || return 7
545     clients_up
546     
547     #Sleep
548     echo "Wait 1 minutes"
549     sleep 60
550 }
551 run_test 9 "Ninth Failure Mode: CLIENT/CLIENT `date`"
552 ###################################################
553
554 test_10() {
555     #Run availability after all failures
556     DURATION=${DURATION:-$((2 * 60 * 60))} # 6 hours default
557     LOADTEST=${LOADTEST:-metadata-load.py}
558     $PWD/availability.sh $CONFIG $DURATION $CLIENTS || return 1
559 }
560 run_test 10 "Running Availability for 6 hours..."
561
562 equals_msg `basename $0`: test complete, cleaning up
563 check_and_cleanup_lustre
564 [ -f "$TESTSUITELOG" ] && cat $TESTSUITELOG && grep -q FAIL $TESTSUITELOG && exit 1 || true