Whamcloud - gitweb
b=12613
[fs/lustre-release.git] / lustre / tests / conf-sanity.sh
1 #!/bin/bash
2 # requirement:
3 #       add uml1 uml2 uml3 in your /etc/hosts
4
5 # FIXME - there is no reason to use all of these different
6 #   return codes, espcially when most of them are mapped to something
7 #   else anyway.  The combination of test number and return code
8 #   figure out what failed.
9
10 set -e
11
12 ONLY=${ONLY:-"$*"}
13
14 # These tests don't apply to mountconf
15 MOUNTCONFSKIP="9 10 11 12 13 13b 14 15 18"
16
17 # bug number for skipped test:
18 ALWAYS_EXCEPT=" $CONF_SANITY_EXCEPT $MOUNTCONFSKIP 16 23"
19 # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
20
21 SRCDIR=`dirname $0`
22 PATH=$PWD/$SRCDIR:$SRCDIR:$SRCDIR/../utils:$PATH
23
24 PTLDEBUG=${PTLDEBUG:--1}
25 SAVE_PWD=$PWD
26 LUSTRE=${LUSTRE:-`dirname $0`/..}
27 RLUSTRE=${RLUSTRE:-$LUSTRE}
28 MOUNTLUSTRE=${MOUNTLUSTRE:-/sbin/mount.lustre}
29 MKFSLUSTRE=${MKFSLUSTRE:-/usr/sbin/mkfs.lustre}
30 HOSTNAME=`hostname`
31
32 . $LUSTRE/tests/test-framework.sh
33 init_test_env $@
34 # use small MDS + OST size to speed formatting time
35 MDSSIZE=40000
36 OSTSIZE=40000
37 . ${CONFIG:=$LUSTRE/tests/cfg/local.sh}
38
39 reformat() {
40         formatall
41 }
42
43 writeconf() {
44     local facet=mds
45     shift
46     stop ${facet} -f
47     rm -f ${facet}active
48     # who knows if/where $TUNEFS is installed?  Better reformat if it fails...
49     do_facet ${facet} "$TUNEFS --writeconf $MDSDEV" || echo "tunefs failed, reformatting instead" && reformat
50 }
51
52 gen_config() {
53         reformat
54         # The MGS must be started before the OSTs for a new fs, so start
55         # and stop to generate the startup logs. 
56         start_mds
57         start_ost
58         sleep 5
59         stop_ost
60         stop_mds
61 }
62
63 start_mds() {
64         echo "start mds service on `facet_active_host mds`"
65         start mds $MDSDEV $MDS_MOUNT_OPTS || return 94
66 }
67
68 stop_mds() {
69         echo "stop mds service on `facet_active_host mds`"
70         # These tests all use non-failover stop
71         stop mds -f  || return 97
72 }
73
74 start_ost() {
75         echo "start ost1 service on `facet_active_host ost1`"
76         start ost1 `ostdevname 1` $OST_MOUNT_OPTS || return 95
77 }
78
79 stop_ost() {
80         echo "stop ost1 service on `facet_active_host ost1`"
81         # These tests all use non-failover stop
82         stop ost1 -f  || return 98
83 }
84
85 start_ost2() {
86         echo "start ost2 service on `facet_active_host ost2`"
87         start ost2 `ostdevname 2` $OST_MOUNT_OPTS || return 92
88 }
89
90 stop_ost2() {
91         echo "stop ost2 service on `facet_active_host ost2`"
92         # These tests all use non-failover stop
93         stop ost2 -f  || return 93
94 }
95
96 mount_client() {
97         local MOUNTPATH=$1
98         echo "mount $FSNAME on ${MOUNTPATH}....."
99         zconf_mount `hostname` $MOUNTPATH  || return 96
100 }
101
102 remount_client() {
103         local SAVEMOUNTOPT=$MOUNTOPT
104         MOUNTOPT="remount,$1"
105         local MOUNTPATH=$2
106         echo "remount '$1' lustre on ${MOUNTPATH}....."
107         zconf_mount `hostname`  $MOUNTPATH  || return 96
108         MOUNTOPT=$SAVEMOUNTOPT
109 }
110
111 umount_client() {
112         local MOUNTPATH=$1
113         echo "umount lustre on ${MOUNTPATH}....."
114         zconf_umount `hostname` $MOUNTPATH || return 97
115 }
116
117 manual_umount_client(){
118         echo "manual umount lustre on ${MOUNT}...."
119         do_facet client "umount -d $MOUNT"
120 }
121
122 setup() {
123         start_ost
124         start_mds
125         mount_client $MOUNT
126 }
127
128 cleanup_nocli() {
129         stop_mds || return 201
130         stop_ost || return 202
131         unload_modules || return 203
132 }
133
134 cleanup() {
135         umount_client $MOUNT || return 200
136         cleanup_nocli || return $?
137 }
138
139 check_mount() {
140         do_facet client "cp /etc/passwd $DIR/a" || return 71
141         do_facet client "rm $DIR/a" || return 72
142         # make sure lustre is actually mounted (touch will block, 
143         # but grep won't, so do it after) 
144         do_facet client "grep $MOUNT' ' /proc/mounts > /dev/null" || return 73
145         echo "setup single mount lustre success"
146 }
147
148 check_mount2() {
149         do_facet client "touch $DIR/a" || return 71     
150         do_facet client "rm $DIR/a" || return 72        
151         do_facet client "touch $DIR2/a" || return 73    
152         do_facet client "rm $DIR2/a" || return 74       
153         echo "setup double mount lustre success"
154 }
155
156 build_test_filter
157
158 if [ "$ONLY" == "setup" ]; then
159         setup
160         exit
161 fi
162
163 if [ "$ONLY" == "cleanup" ]; then
164         cleanup
165         exit
166 fi
167
168 #create single point mountpoint
169
170 gen_config
171
172 init_krb5_env
173
174 test_0() {
175         setup
176         check_mount || return 41
177         cleanup || return $?
178 }
179 run_test 0 "single mount setup"
180
181 test_1() {
182         start_ost
183         echo "start ost second time..."
184         setup
185         check_mount || return 42
186         cleanup || return $?
187 }
188 run_test 1 "start up ost twice (should return errors)"
189
190 test_2() {
191         start_ost
192         start_mds       
193         echo "start mds second time.."
194         start_mds
195         mount_client $MOUNT
196         check_mount || return 43
197         cleanup || return $?
198 }
199 run_test 2 "start up mds twice (should return err)"
200
201 test_3() {
202         setup
203         #mount.lustre returns an error if already in mtab
204         mount_client $MOUNT && return $?
205         check_mount || return 44
206         cleanup || return $?
207 }
208 run_test 3 "mount client twice (should return err)"
209
210 test_4() {
211         setup
212         touch $DIR/$tfile || return 85
213         stop_ost -f
214         cleanup
215         eno=$?
216         # ok for ost to fail shutdown
217         if [ 202 -ne $eno ]; then
218                 return $eno;
219         fi
220         return 0
221 }
222 run_test 4 "force cleanup ost, then cleanup"
223
224 test_5() {
225         setup
226         touch $DIR/$tfile || return 1
227         stop_mds -f || return 2
228
229         # cleanup may return an error from the failed
230         # disconnects; for now I'll consider this successful
231         # if all the modules have unloaded.
232         umount -d $MOUNT &
233         UMOUNT_PID=$!
234         sleep 6
235         echo "killing umount"
236         kill -TERM $UMOUNT_PID
237         echo "waiting for umount to finish"
238         wait $UMOUNT_PID
239         if grep " $MOUNT " /etc/mtab; then
240                 echo "test 5: mtab after failed umount"
241                 umount $MOUNT &
242                 UMOUNT_PID=$!
243                 sleep 2
244                 echo "killing umount"
245                 kill -TERM $UMOUNT_PID
246                 echo "waiting for umount to finish"
247                 wait $UMOUNT_PID
248                 grep " $MOUNT " /etc/mtab && echo "test 5: mtab after second umount" && return 11
249         fi
250
251         manual_umount_client
252         # stop_mds is a no-op here, and should not fail
253         cleanup_nocli || return $?
254         # df may have lingering entry
255         manual_umount_client
256         # mtab may have lingering entry
257         grep -v $MOUNT" " /etc/mtab > $TMP/mtabtemp
258         mv $TMP/mtabtemp /etc/mtab
259 }
260 run_test 5 "force cleanup mds, then cleanup"
261
262 test_5b() {
263         start_ost
264         [ -d $MOUNT ] || mkdir -p $MOUNT
265         grep " $MOUNT " /etc/mtab && echo "test 5b: mtab before mount" && return 10
266         mount_client $MOUNT && return 1
267         grep " $MOUNT " /etc/mtab && echo "test 5b: mtab after failed mount" && return 11
268         umount_client $MOUNT    
269         # stop_mds is a no-op here, and should not fail
270         cleanup_nocli || return $?
271         return 0
272 }
273 run_test 5b "mds down, cleanup after failed mount (bug 2712) (should return errs)"
274
275 test_5c() {
276         start_ost
277         start_mds
278         [ -d $MOUNT ] || mkdir -p $MOUNT
279         grep " $MOUNT " /etc/mtab && echo "test 5c: mtab before mount" && return 10
280         mount -t lustre $MGSNID:/wrong.$FSNAME $MOUNT || :
281         grep " $MOUNT " /etc/mtab && echo "test 5c: mtab after failed mount" && return 11
282         umount_client $MOUNT
283         cleanup_nocli  || return $?
284 }
285 run_test 5c "cleanup after failed mount (bug 2712) (should return errs)"
286
287 test_5d() {
288         start_ost
289         start_mds
290         stop_ost -f
291         grep " $MOUNT " /etc/mtab && echo "test 5d: mtab before mount" && return 10
292         mount_client $MOUNT || return 1
293         cleanup  || return $?
294         grep " $MOUNT " /etc/mtab && echo "test 5d: mtab after unmount" && return 11
295         return 0
296 }
297 run_test 5d "mount with ost down"
298
299 test_5e() {
300         start_ost
301         start_mds
302         # give MDS a chance to connect to OSTs (bz 10476)
303         sleep 5 
304
305 #define OBD_FAIL_PTLRPC_DELAY_SEND       0x506
306         do_facet client "sysctl -w lustre.fail_loc=0x80000506"
307         grep " $MOUNT " /etc/mtab && echo "test 5e: mtab before mount" && return 10
308         mount_client $MOUNT || echo "mount failed (not fatal)"
309         cleanup  || return $?
310         grep " $MOUNT " /etc/mtab && echo "test 5e: mtab after unmount" && return 11
311         return 0
312 }
313 run_test 5e "delayed connect, don't crash (bug 10268)"
314
315 test_6() {
316         setup
317         manual_umount_client
318         mount_client ${MOUNT} || return 87
319         touch $DIR/a || return 86
320         cleanup  || return $?
321 }
322 run_test 6 "manual umount, then mount again"
323
324 test_7() {
325         setup
326         manual_umount_client
327         cleanup_nocli || return $?
328 }
329 run_test 7 "manual umount, then cleanup"
330
331 test_8() {
332         setup
333         mount_client $MOUNT2
334         check_mount2 || return 45
335         umount_client $MOUNT2
336         cleanup  || return $?
337 }
338 run_test 8 "double mount setup"
339
340 test_9() {
341         start_ost
342
343         do_facet ost1 sysctl lnet.debug=\'inode trace\' || return 1
344         do_facet ost1 sysctl lnet.subsystem_debug=\'mds ost\' || return 1
345
346         CHECK_PTLDEBUG="`do_facet ost1 sysctl -n lnet.debug`"
347         if [ "$CHECK_PTLDEBUG" ] && [ "$CHECK_PTLDEBUG" = "trace inode" ];then
348            echo "lnet.debug success"
349         else
350            echo "lnet.debug: want 'trace inode', have '$CHECK_PTLDEBUG'"
351            return 1
352         fi
353         CHECK_SUBSYS="`do_facet ost1 sysctl -n lnet.subsystem_debug`"
354         if [ "$CHECK_SUBSYS" ] && [ "$CHECK_SUBSYS" = "mds ost" ]; then
355            echo "lnet.subsystem_debug success"
356         else
357            echo "lnet.subsystem_debug: want 'mds ost', have '$CHECK_SUBSYS'"
358            return 1
359         fi
360         stop_ost || return $?
361 }
362
363 run_test 9 "test ptldebug and subsystem for mkfs"
364
365 test_10() {
366         echo "generate configuration with the same name for node and mds"
367         OLDXMLCONFIG=$XMLCONFIG
368         XMLCONFIG="broken.xml"
369         [ -f "$XMLCONFIG" ] && rm -f $XMLCONFIG
370         facet="mds"
371         rm -f ${facet}active
372         add_facet $facet
373         echo "the name for node and mds is the same"
374         do_lmc --add mds --node ${facet}_facet --mds ${facet}_facet \
375             --dev $MDSDEV --size $MDSSIZE || return $?
376         do_lmc --add lov --mds ${facet}_facet --lov lov1 --stripe_sz \
377             $STRIPE_BYTES --stripe_cnt $STRIPES_PER_OBJ \
378             --stripe_pattern 0 || return $?
379         add_ost ost --lov lov1 --dev $OSTDEV --size $OSTSIZE
380         facet="client"
381         add_facet $facet --lustre_upcall $UPCALL
382         do_lmc --add mtpt --node ${facet}_facet --mds mds_facet \
383             --lov lov1 --path $MOUNT
384
385         echo "mount lustre"
386         start_ost
387         start_mds
388         mount_client $MOUNT
389         check_mount || return 41
390         cleanup || return $?
391
392         echo "Success!"
393         XMLCONFIG=$OLDXMLCONFIG
394 }
395 run_test 10 "mount lustre with the same name for node and mds"
396
397 test_11() {
398         OLDXMLCONFIG=$XMLCONFIG
399         XMLCONFIG="conf11.xml"
400
401         [ -f "$XMLCONFIG" ] && rm -f $XMLCONFIG
402         add_mds mds --dev $MDSDEV --size $MDSSIZE
403         add_ost ost --dev $OSTDEV --size $OSTSIZE
404         add_client client mds --path $MOUNT --ost ost_svc || return $?
405         echo "Default lov config success!"
406
407         [ -f "$XMLCONFIG" ] && rm -f $XMLCONFIG
408         add_mds mds --dev $MDSDEV --size $MDSSIZE
409         add_ost ost --dev $OSTDEV --size $OSTSIZE
410         add_client client mds --path $MOUNT && return $?
411         echo "--add mtpt with neither --lov nor --ost will return error"
412
413         echo ""
414         echo "Success!"
415         XMLCONFIG=$OLDXMLCONFIG
416 }
417 run_test 11 "use default lov configuration (should return error)"
418
419 test_12() {
420         OLDXMLCONFIG=$XMLCONFIG
421         XMLCONFIG="batch.xml"
422         BATCHFILE="batchfile"
423
424         # test double quote
425         [ -f "$XMLCONFIG" ] && rm -f $XMLCONFIG
426         [ -f "$BATCHFILE" ] && rm -f $BATCHFILE
427         echo "--add net --node $HOSTNAME --nid $HOSTNAME --nettype tcp" > $BATCHFILE
428         echo "--add mds --node $HOSTNAME --mds mds1 --mkfsoptions \"-I 128\"" >> $BATCHFILE
429         # --mkfsoptions "-I 128"
430         do_lmc -m $XMLCONFIG --batch $BATCHFILE || return $?
431         if [ `sed -n '/>-I 128</p' $XMLCONFIG | wc -l` -eq 1 ]; then
432                 echo "matched double quote success"
433         else
434                 echo "matched double quote fail"
435                 return 1
436         fi
437         rm -f $XMLCONFIG
438         rm -f $BATCHFILE
439         echo "--add net --node $HOSTNAME --nid $HOSTNAME --nettype tcp" > $BATCHFILE
440         echo "--add mds --node $HOSTNAME --mds mds1 --mkfsoptions \"-I 128" >> $BATCHFILE
441         # --mkfsoptions "-I 128
442         do_lmc -m $XMLCONFIG --batch $BATCHFILE && return $?
443         echo "unmatched double quote should return error"
444
445         # test single quote
446         rm -f $BATCHFILE
447         echo "--add net --node $HOSTNAME --nid $HOSTNAME --nettype tcp" > $BATCHFILE
448         echo "--add mds --node $HOSTNAME --mds mds1 --mkfsoptions '-I 128'" >> $BATCHFILE
449         # --mkfsoptions '-I 128'
450         do_lmc -m $XMLCONFIG --batch $BATCHFILE || return $?
451         if [ `sed -n '/>-I 128</p' $XMLCONFIG | wc -l` -eq 1 ]; then
452                 echo "matched single quote success"
453         else
454                 echo "matched single quote fail"
455                 return 1
456         fi
457         rm -f $XMLCONFIG
458         rm -f $BATCHFILE
459         echo "--add net --node $HOSTNAME --nid $HOSTNAME --nettype tcp" > $BATCHFILE
460         echo "--add mds --node $HOSTNAME --mds mds1 --mkfsoptions '-I 128" >> $BATCHFILE
461         # --mkfsoptions '-I 128
462         do_lmc -m $XMLCONFIG --batch $BATCHFILE && return $?
463         echo "unmatched single quote should return error"
464
465         # test backslash
466         rm -f $BATCHFILE
467         echo "--add net --node $HOSTNAME --nid $HOSTNAME --nettype tcp" > $BATCHFILE
468         echo "--add mds --node $HOSTNAME --mds mds1 --mkfsoptions \-\I\ \128" >> $BATCHFILE
469         # --mkfsoptions \-\I\ \128
470         do_lmc -m $XMLCONFIG --batch $BATCHFILE || return $?
471         if [ `sed -n '/>-I 128</p' $XMLCONFIG | wc -l` -eq 1 ]; then
472                 echo "backslash followed by a whitespace/letter success"
473         else
474                 echo "backslash followed by a whitespace/letter fail"
475                 return 1
476         fi
477         rm -f $XMLCONFIG
478         rm -f $BATCHFILE
479         echo "--add net --node $HOSTNAME --nid $HOSTNAME --nettype tcp" > $BATCHFILE
480         echo "--add mds --node $HOSTNAME --mds mds1 --mkfsoptions -I\ 128\\" >> $BATCHFILE
481         # --mkfsoptions -I\ 128\
482         do_lmc -m $XMLCONFIG --batch $BATCHFILE && return $?
483         echo "backslash followed by nothing should return error"
484
485         rm -f $BATCHFILE
486         XMLCONFIG=$OLDXMLCONFIG
487 }
488 run_test 12 "lmc --batch, with single/double quote, backslash in batchfile"
489
490 test_13() {
491         OLDXMLCONFIG=$XMLCONFIG
492         XMLCONFIG="conf13-1.xml"
493
494         # check long uuid will be truncated properly and uniquely
495         echo "To generate XML configuration file(with long ost name): $XMLCONFIG"
496         [ -f "$XMLCONFIG" ] && rm -f $XMLCONFIG
497         do_lmc --add net --node $HOSTNAME --nid $HOSTNAME --nettype tcp
498         do_lmc --add mds --node $HOSTNAME --mds mds1_name_longer_than_31characters
499         do_lmc --add mds --node $HOSTNAME --mds mds2_name_longer_than_31characters
500         if [ ! -f "$XMLCONFIG" ]; then
501                 echo "Error:no file $XMLCONFIG created!"
502                 return 1
503         fi
504         EXPECTEDMDS1UUID="e_longer_than_31characters_UUID"
505         EXPECTEDMDS2UUID="longer_than_31characters_UUID_2"
506         FOUNDMDS1UUID=`awk -F"'" '/<mds .*uuid=/' $XMLCONFIG | sed -n '1p' \
507                        | sed "s/ /\n\r/g" | awk -F"'" '/uuid=/{print $2}'`
508         FOUNDMDS2UUID=`awk -F"'" '/<mds .*uuid=/' $XMLCONFIG | sed -n '2p' \
509                        | sed "s/ /\n\r/g" | awk -F"'" '/uuid=/{print $2}'`
510         [ -z "$FOUNDMDS1UUID" ] && echo "MDS1 UUID empty" && return 1
511         [ -z "$FOUNDMDS2UUID" ] && echo "MDS2 UUID empty" && return 1
512         if ([ $EXPECTEDMDS1UUID = $FOUNDMDS1UUID ] && [ $EXPECTEDMDS2UUID = $FOUNDMDS2UUID ]) || \
513            ([ $EXPECTEDMDS1UUID = $FOUNDMDS2UUID ] && [ $EXPECTEDMDS2UUID = $FOUNDMDS1UUID ]); then
514                 echo "Success:long uuid truncated successfully and being unique."
515         else
516                 echo "Error:expected uuid for mds1 and mds2: $EXPECTEDMDS1UUID; $EXPECTEDMDS2UUID"
517                 echo "but:     found uuid for mds1 and mds2: $FOUNDMDS1UUID; $FOUNDMDS2UUID"
518                 return 1
519         fi
520         rm -f $XMLCONFIG
521         XMLCONFIG=$OLDXMLCONFIG
522 }
523 run_test 13 "check new_uuid of lmc operating correctly"
524
525 test_13b() {
526         OLDXMLCONFIG=$XMLCONFIG
527         XMLCONFIG="conf13-1.xml"
528         SECONDXMLCONFIG="conf13-2.xml"
529         # check multiple invocations for lmc generate same XML configuration file
530         rm -f $XMLCONFIG
531         echo "Generate the first XML configuration file"
532         gen_config
533         echo "mv $XMLCONFIG to $SECONDXMLCONFIG"
534         sed -e "s/mtime[^ ]*//" $XMLCONFIG > $SECONDXMLCONFIG || return $?
535         echo "Generate the second XML configuration file"
536         gen_config
537         # don't compare .xml mtime, it will always be different
538         if [ `sed -e "s/mtime[^ ]*//" $XMLCONFIG | diff - $SECONDXMLCONFIG | wc -l` -eq 0 ]; then
539                 echo "Success:multiple invocations for lmc generate same XML file"
540         else
541                 echo "Error: multiple invocations for lmc generate different XML file"
542                 return 1
543         fi
544
545         rm -f $XMLCONFIG $SECONDXMLCONFIG
546         XMLCONFIG=$OLDXMLCONFIG
547 }
548 run_test 13b "check lmc generates consistent .xml file"
549
550 test_14() {
551         rm -f $XMLCONFIG
552
553         # create xml file with --mkfsoptions for ost
554         echo "create xml file with --mkfsoptions for ost"
555         add_mds mds --dev $MDSDEV --size $MDSSIZE
556         add_lov lov1 mds --stripe_sz $STRIPE_BYTES\
557             --stripe_cnt $STRIPES_PER_OBJ --stripe_pattern 0
558         add_ost ost --lov lov1 --dev $OSTDEV --size $OSTSIZE \
559             --mkfsoptions "-Llabel_conf_14"
560         add_client client mds --lov lov1 --path $MOUNT
561
562         FOUNDSTRING=`awk -F"<" '/<mkfsoptions>/{print $2}' $XMLCONFIG`
563         EXPECTEDSTRING="mkfsoptions>-Llabel_conf_14"
564         if [ "$EXPECTEDSTRING" != "$FOUNDSTRING" ]; then
565                 echo "Error: expected: $EXPECTEDSTRING; found: $FOUNDSTRING"
566                 return 1
567         fi
568         echo "Success:mkfsoptions for ost written to xml file correctly."
569
570         # mount lustre to test lconf mkfsoptions-parsing
571         echo "mount lustre"
572         start_ost
573         start_mds
574         mount_client $MOUNT || return $?
575         if [ -z "`do_facet ost1 dumpe2fs -h $OSTDEV | grep label_conf_14`" ]; then
576                 echo "Error: the mkoptions not applied to mke2fs of ost."
577                 return 1
578         fi
579         cleanup
580         echo "lconf mkfsoptions for ost success"
581
582         gen_config
583 }
584 run_test 14 "test mkfsoptions of ost for lmc and lconf"
585
586 cleanup_15() {
587         trap 0
588         [ -f $MOUNTLUSTRE ] && echo "remove $MOUNTLUSTRE" && rm -f $MOUNTLUSTRE
589         if [ -f $MOUNTLUSTRE.sav ]; then
590                 echo "return original $MOUNTLUSTRE.sav to $MOUNTLUSTRE"
591                 mv $MOUNTLUSTRE.sav $MOUNTLUSTRE
592         fi
593 }
594
595 # this only tests the kernel mount command, not anything about lustre.
596 test_15() {
597         MOUNTLUSTRE=${MOUNTLUSTRE:-/sbin/mount.lustre}
598         start_ost
599         start_mds
600
601         echo "mount lustre on ${MOUNT} without $MOUNTLUSTRE....."
602         if [ -f "$MOUNTLUSTRE" ]; then
603                 echo "save $MOUNTLUSTRE to $MOUNTLUSTRE.sav"
604                 mv $MOUNTLUSTRE $MOUNTLUSTRE.sav && trap cleanup_15 EXIT INT
605                 if [ -f $MOUNTLUSTRE ]; then
606                         skip "$MOUNTLUSTRE cannot be moved, skipping test"
607                         return 0
608                 fi
609         fi
610
611         mount_client $MOUNT && error "mount succeeded" && return 1
612         echo "mount lustre on $MOUNT without $MOUNTLUSTRE failed as expected"
613         cleanup_15
614         cleanup || return $?
615 }
616 run_test 15 "zconf-mount without /sbin/mount.lustre (should return error)"
617
618 test_16() {
619         TMPMTPT="${MOUNT%/*}/conf16"
620
621         if [ ! -e "$MDSDEV" ]; then
622             log "no $MDSDEV existing, so mount Lustre to create one"
623             setup
624             check_mount || return 41
625             cleanup || return $?
626         fi
627
628         [ -f "$MDSDEV" ] && LOOPOPT="-o loop"
629
630         log "change the mode of $MDSDEV/OBJECTS,LOGS,PENDING to 555"
631         do_facet mds "mkdir -p $TMPMTPT &&
632                       mount $LOOPOPT -t $FSTYPE $MDSDEV $TMPMTPT &&
633                       chmod 555 $TMPMTPT/{OBJECTS,LOGS,PENDING} &&
634                       umount $TMPMTPT" || return $?
635
636         log "mount Lustre to change the mode of OBJECTS/LOGS/PENDING, then umount Lustre"
637         setup
638         check_mount || return 41
639         cleanup || return $?
640
641         log "read the mode of OBJECTS/LOGS/PENDING and check if they has been changed properly"
642         EXPECTEDOBJECTSMODE=`do_facet mds "debugfs -R 'stat OBJECTS' $MDSDEV 2> /dev/null" | grep 'Mode: ' | sed -e "s/.*Mode: *//" -e "s/ *Flags:.*//"`
643         EXPECTEDLOGSMODE=`do_facet mds "debugfs -R 'stat LOGS' $MDSDEV 2> /dev/null" | grep 'Mode: ' | sed -e "s/.*Mode: *//" -e "s/ *Flags:.*//"`
644         EXPECTEDPENDINGMODE=`do_facet mds "debugfs -R 'stat PENDING' $MDSDEV 2> /dev/null" | grep 'Mode: ' | sed -e "s/.*Mode: *//" -e "s/ *Flags:.*//"`
645
646         if [ "$EXPECTEDOBJECTSMODE" = "0777" ]; then
647                 log "Success:Lustre change the mode of OBJECTS correctly"
648         else
649                 error "Lustre does not change mode of OBJECTS properly"
650         fi
651
652         if [ "$EXPECTEDLOGSMODE" = "0777" ]; then
653                 log "Success:Lustre change the mode of LOGS correctly"
654         else
655                 error "Lustre does not change mode of LOGS properly"
656         fi
657
658         if [ "$EXPECTEDPENDINGMODE" = "0777" ]; then
659                 log "Success:Lustre change the mode of PENDING correctly"
660         else
661                 error "Lustre does not change mode of PENDING properly"
662         fi
663 }
664 run_test 16 "verify that lustre will correct the mode of OBJECTS/LOGS/PENDING"
665
666 test_17() {
667         if [ ! -e "$MDSDEV" ]; then
668             echo "no $MDSDEV existing, so mount Lustre to create one"
669             setup
670             check_mount || return 41
671             cleanup || return $?
672         fi
673
674         echo "Remove mds config log"
675         do_facet mds "debugfs -w -R 'unlink CONFIGS/$FSNAME-MDT0000' $MDSDEV || return \$?" || return $?
676
677         start_ost
678         start_mds && return 42
679         gen_config
680 }
681 run_test 17 "Verify failed mds_postsetup won't fail assertion (2936) (should return errs)"
682
683 test_18() {
684         [ -f $MDSDEV ] && echo "remove $MDSDEV" && rm -f $MDSDEV
685         echo "mount mds with large journal..."
686         local myMDSSIZE=2000000
687         OLD_MDS_MKFS_OPTS=$MDS_MKFS_OPTS
688
689         MDS_MKFS_OPTS="--mgs --mdt --fsname=$FSNAME --device-size=$myMDSSIZE --param sys.timeout=$TIMEOUT $MDSOPT"
690
691         gen_config
692         echo "mount lustre system..."
693         setup
694         check_mount || return 41
695
696         echo "check journal size..."
697         FOUNDSIZE=`do_facet mds "debugfs -c -R 'stat <8>' $MDSDEV" | awk '/Size: / { print $NF; exit;}'`
698         if [ $FOUNDSIZE -gt $((32 * 1024 * 1024)) ]; then
699                 log "Success: mkfs creates large journals. Size: $((FOUNDSIZE >> 20))M"
700         else
701                 error "expected journal size > 32M, found $((FOUNDSIZE >> 20))M"
702         fi
703
704         cleanup || return $?
705
706         MDS_MKFS_OPTS=$OLD_MDS_MKFS_OPTS
707         gen_config
708 }
709 run_test 18 "check mkfs creates large journals"
710
711 test_19a() {
712         start_mds || return 1
713         stop_mds -f || return 2
714 }
715 run_test 19a "start/stop MDS without OSTs"
716
717 test_19b() {
718         start_ost || return 1
719         stop_ost -f || return 2
720 }
721 run_test 19b "start/stop OSTs without MDS"
722
723 test_20() {
724         # first format the ost/mdt
725         start_ost
726         start_mds
727         mount_client $MOUNT
728         check_mount || return 43
729         rm -f $DIR/$tfile
730         remount_client ro $MOUNT || return 44
731         touch $DIR/$tfile && echo "$DIR/$tfile created incorrectly" && return 45
732         [ -e $DIR/$tfile ] && echo "$DIR/$tfile exists incorrectly" && return 46
733         remount_client rw $MOUNT || return 47
734         touch $DIR/$tfile
735         [ ! -f $DIR/$tfile ] && echo "$DIR/$tfile missing" && return 48
736         MCNT=`grep -c $MOUNT /etc/mtab`
737         [ "$MCNT" -ne 1 ] && echo "$MOUNT in /etc/mtab $MCNT times" && return 49
738         umount_client $MOUNT
739         stop_mds
740         stop_ost
741 }
742 run_test 20 "remount ro,rw mounts work and doesn't break /etc/mtab"
743
744 test_21a() {
745         start_mds
746         start_ost
747         stop_ost
748         stop_mds
749 }
750 run_test 21a "start mds before ost, stop ost first"
751
752 test_21b() {
753         start_ost
754         start_mds
755         stop_mds
756         stop_ost
757 }
758 run_test 21b "start ost before mds, stop mds first"
759
760 test_21c() {
761         start_ost
762         start_mds
763         start_ost2
764         stop_ost
765         stop_ost2
766         stop_mds
767 }
768 run_test 21c "start mds between two osts, stop mds last"
769
770 test_22() {
771         #reformat to remove all logs
772         reformat
773         start_mds
774         echo Client mount before any osts are in the logs
775         mount_client $MOUNT
776         check_mount && return 41
777         pass
778
779         echo Client mount with ost in logs, but none running
780         start_ost
781         stop_ost
782         mount_client $MOUNT
783         # check_mount will block trying to contact ost
784         umount_client $MOUNT
785         pass
786
787         echo Client mount with a running ost
788         start_ost
789         mount_client $MOUNT
790         sleep 5 #bz10476
791         check_mount || return 41
792         pass
793
794         cleanup
795 }
796 run_test 22 "start a client before osts (should return errs)"
797
798 test_23() {
799         setup
800         # fail mds
801         stop mds   
802         # force down client so that recovering mds waits for reconnect
803         zconf_umount `hostname` $MOUNT -f
804         # enter recovery on mds
805         start_mds
806         # try to start a new client
807         mount_client $MOUNT &
808         MOUNT_PID=$!
809         sleep 5
810         MOUNT_LUSTRE_PID=`ps -ef | grep mount.lustre | grep -v grep | awk '{print $2}'`
811         echo mount pid is ${MOUNT_PID}, mount.lustre pid is ${MOUNT_LUSTRE_PID}
812         ps --ppid $MOUNT_PID
813         ps --ppid $MOUNT_LUSTRE_PID
814         # FIXME why o why can't I kill these? Manual "ctrl-c" works...
815         kill -TERM $MOUNT_PID
816         echo "waiting for mount to finish"
817         ps -ef | grep mount
818         wait $MOUNT_PID
819
820         stop_mds
821         stop_ost
822 }
823 #this test isn't working yet
824 #run_test 23 "interrupt client during recovery mount delay"
825
826 test_24a() {
827         local fs2mds_HOST=$mds_HOST
828         local fs2ost_HOST=$ost_HOST
829
830         [ -z "$fs2ost_DEV" -o -z "$fs2mds_DEV" ] && [ -b "$MDSDEV" ] && \
831             log "mixed loopback and real device not working" && return
832
833         local fs2mdsdev=${fs2mds_DEV:-${MDSDEV}_2}
834         local fs2ostdev=${fs2ost_DEV:-$(ostdevname 1)_2}
835
836         # test 8-char fsname as well
837         local FSNAME2=test1234
838         add fs2mds $MDS_MKFS_OPTS --fsname=${FSNAME2} --nomgs --mgsnode=$MGSNID --reformat $fs2mdsdev || exit 10
839
840         add fs2ost $OST_MKFS_OPTS --fsname=${FSNAME2} --reformat $fs2ostdev || exit 10
841
842         setup
843         start fs2mds $fs2mdsdev $MDS_MOUNT_OPTS
844         start fs2ost $fs2ostdev $OST_MOUNT_OPTS
845         mkdir -p $MOUNT2
846         mount -t lustre $MGSNID:/${FSNAME2} $MOUNT2 || return 1
847         # 1 still works
848         check_mount || return 2
849         # files written on 1 should not show up on 2
850         cp /etc/passwd $DIR/$tfile
851         sleep 10
852         [ -e $MOUNT2/$tfile ] && error "File bleed" && return 7
853         # 2 should work
854         sleep 5
855         cp /etc/passwd $MOUNT2/b || return 3
856         rm $MOUNT2/b || return 4
857         # 2 is actually mounted
858         grep $MOUNT2' ' /proc/mounts > /dev/null || return 5
859         # failover 
860         facet_failover fs2mds
861         facet_failover fs2ost
862         df
863         umount_client $MOUNT 
864         # the MDS must remain up until last MDT
865         stop_mds
866         MDS=$(do_facet mds "cat $LPROC/devices" | awk '($3 ~ "mdt" && $4 ~ "MDT") { print $4 }')
867         [ -z "$MDS" ] && error "No MDT" && return 8
868         umount $MOUNT2
869         stop fs2mds -f
870         stop fs2ost -f
871         cleanup_nocli || return 6
872 }
873 run_test 24a "Multiple MDTs on a single node"
874
875 test_24b() {
876         local fs2mds_HOST=$mds_HOST
877         [ -z "$fs2mds_DEV" ] && [ -b "$MDSDEV" ] && \
878             log "mixed loopback and real device not working" && return
879
880         local fs2mdsdev=${fs2mds_DEV:-${MDSDEV}_2}
881
882         add fs2mds $MDS_MKFS_OPTS --fsname=${FSNAME}2 --mgs --reformat $fs2mdsdev || exit 10 
883         setup
884         start fs2mds $fs2mdsdev $MDS_MOUNT_OPTS && return 2
885         cleanup || return 6
886 }
887 run_test 24b "Multiple MGSs on a single node (should return err)"
888
889 test_25() {
890         setup
891         check_mount || return 2
892         local MODULES=$($LCTL modules | awk '{ print $2 }')
893         rmmod $MODULES 2>/dev/null || true
894         cleanup || return 6
895 }
896 run_test 25 "Verify modules are referenced"
897
898 test_26() {
899     load_modules
900     # we need modules before mount for sysctl, so make sure...
901     do_facet mds "lsmod | grep -q lustre || modprobe lustre"
902 #define OBD_FAIL_MDS_FS_SETUP            0x135
903     do_facet mds "sysctl -w lustre.fail_loc=0x80000135"
904     start_mds && echo MDS started && return 1
905     cat $LPROC/devices
906     DEVS=$(cat $LPROC/devices | wc -l)
907     [ $DEVS -gt 0 ] && return 2
908     unload_modules || return 203
909 }
910 run_test 26 "MDT startup failure cleans LOV (should return errs)"
911
912 set_and_check() {
913         local myfacet=$1
914         local TEST=$2
915         local PARAM=$3
916         local ORIG=$(do_facet $myfacet "$TEST") 
917         if [ $# -gt 3 ]; then
918             local FINAL=$4
919         else
920             local -i FINAL
921             FINAL=$(($ORIG + 5))
922         fi
923         echo "Setting $PARAM from $ORIG to $FINAL"
924         do_facet mds "$LCTL conf_param $PARAM=$FINAL" || error conf_param failed
925         local RESULT
926         local MAX=90
927         local WAIT=0
928         while [ 1 ]; do
929             sleep 5
930             RESULT=$(do_facet $myfacet "$TEST") 
931             if [ $RESULT -eq $FINAL ]; then
932                 echo "Updated config after $WAIT sec (got $RESULT)"
933                 break
934             fi
935             WAIT=$((WAIT + 5))
936             if [ $WAIT -eq $MAX ]; then
937                 echo "Config update not seen: wanted $FINAL got $RESULT"
938                 return 3
939             fi
940             echo "Waiting $(($MAX - $WAIT)) secs for config update" 
941         done
942 }
943
944 test_27a() {
945         start_ost || return 1
946         start_mds || return 2
947         echo "Requeue thread should have started: " 
948         ps -e | grep ll_cfg_requeue 
949         set_and_check ost1 "cat $LPROC/obdfilter/$FSNAME-OST0000/client_cache_seconds" "$FSNAME-OST0000.ost.client_cache_seconds" || return 3 
950         cleanup_nocli
951 }
952 run_test 27a "Reacquire MGS lock if OST started first"
953
954 test_27b() {
955         setup
956         facet_failover mds
957         set_and_check mds "cat $LPROC/mdt/$FSNAME-MDT0000/identity_acquire_expire" "$FSNAME-MDT0000.mdt.identity_acquire_expire" || return 3
958         set_and_check client "cat $LPROC/mdc/$FSNAME-MDT0000-mdc-*/max_rpcs_in_flight" "$FSNAME-MDT0000.mdc.max_rpcs_in_flight" || return 4
959         cleanup
960 }
961 run_test 27b "Reacquire MGS lock after failover"
962
963 test_28() {
964         setup
965         TEST="cat $LPROC/llite/$FSNAME-*/max_read_ahead_whole_mb"
966         ORIG=$($TEST) 
967         declare -i FINAL
968         FINAL=$(($ORIG + 10))
969         set_and_check client "$TEST" "$FSNAME.llite.max_read_ahead_whole_mb" || return 3
970         set_and_check client "$TEST" "$FSNAME.llite.max_read_ahead_whole_mb" || return 3
971         umount_client $MOUNT || return 200
972         mount_client $MOUNT
973         RESULT=$($TEST)
974         if [ $RESULT -ne $FINAL ]; then
975             echo "New config not seen: wanted $FINAL got $RESULT"
976             return 4
977         else
978             echo "New config success: got $RESULT"
979         fi
980         cleanup
981 }
982 run_test 28 "permanent parameter setting"
983
984 test_29() {
985         [ "$OSTCOUNT" -lt "2" ] && skip "$OSTCOUNT < 2, skipping" && return
986         setup > /dev/null 2>&1
987         start_ost2
988         sleep 10
989
990         local PARAM="$FSNAME-OST0001.osc.active"
991         local PROC_ACT="$LPROC/osc/$FSNAME-OST0001-osc-[^M]*/active"
992         local PROC_UUID="$LPROC/osc/$FSNAME-OST0001-osc-[^M]*/ost_server_uuid"
993         if [ ! -r $PROC_ACT ]; then
994             echo "Can't read $PROC_ACT"
995             ls $LPROC/osc/$FSNAME-*
996             return 1
997         fi
998         ACTV=$(cat $PROC_ACT)
999         DEAC=$((1 - $ACTV))
1000         set_and_check client "cat $PROC_ACT" "$PARAM" $DEAC || return 2
1001         # also check ost_server_uuid status
1002         RESULT=$(grep DEACTIV $PROC_UUID)
1003         if [ -z "$RESULT" ]; then
1004             echo "Live client not deactivated: $(cat $PROC_UUID)"
1005             return 3
1006         else
1007             echo "Live client success: got $RESULT"
1008         fi
1009
1010         # check MDT too 
1011         local MPROC="$LPROC/osc/$FSNAME-OST0001-osc-[M]*/active"
1012         local MAX=30
1013         local WAIT=0
1014         while [ 1 ]; do
1015             sleep 5
1016             RESULT=`do_facet mds " [ -r $MPROC ] && cat $MPROC"`
1017             [ ${PIPESTATUS[0]} = 0 ] || error "Can't read $MPROC"
1018             if [ $RESULT -eq $DEAC ]; then
1019                 echo "MDT deactivated also after $WAIT sec (got $RESULT)"
1020                 break
1021             fi
1022             WAIT=$((WAIT + 5))
1023             if [ $WAIT -eq $MAX ]; then
1024                 echo "MDT not deactivated: wanted $DEAC got $RESULT"
1025                 return 4
1026             fi
1027             echo "Waiting $(($MAX - $WAIT)) secs for MDT deactivated"
1028         done
1029
1030         # test new client starts deactivated
1031         umount_client $MOUNT || return 200
1032         mount_client $MOUNT
1033         RESULT=$(grep DEACTIV $PROC_UUID | grep NEW)
1034         if [ -z "$RESULT" ]; then
1035             echo "New client not deactivated from start: $(cat $PROC_UUID)"
1036             return 5
1037         else
1038             echo "New client success: got $RESULT"
1039         fi
1040
1041         # make sure it reactivates
1042         set_and_check client "cat $PROC_ACT" "$PARAM" $ACTV || return 6
1043
1044         umount_client $MOUNT
1045         stop_ost2
1046         cleanup_nocli
1047         #writeconf to remove all ost2 traces for subsequent tests
1048         writeconf
1049 }
1050 run_test 29 "permanently remove an OST"
1051
1052 test_30() {
1053         # start mds first after writeconf
1054         start_mds
1055         start_ost
1056         mount_client $MOUNT
1057         TEST="cat $LPROC/llite/$FSNAME-*/max_read_ahead_whole_mb"
1058         ORIG=$($TEST) 
1059         for i in $(seq 1 20); do 
1060             set_and_check client "$TEST" "$FSNAME.llite.max_read_ahead_whole_mb" $i || return 3
1061         done
1062         # make sure client restart still works 
1063         umount_client $MOUNT
1064         mount_client $MOUNT || return 4
1065         [ "$($TEST)" -ne "$i" ] && return 5   
1066         set_and_check client "$TEST" "$FSNAME.llite.max_read_ahead_whole_mb" $ORIG || return 6
1067         cleanup
1068 }
1069 run_test 30 "Big config llog"
1070
1071 test_31() { # bug 10734
1072         # ipaddr must not exist
1073         mount -t lustre 4.3.2.1@tcp:/lustre $MOUNT || true
1074         cleanup
1075 }
1076 run_test 31 "Connect to non-existent node (shouldn't crash)"
1077
1078 test_32a() {
1079         # XXX - make this run on client-only systems with real hardware on
1080         #       the OST and MDT
1081         #       there appears to be a lot of assumption here about loopback
1082         #       devices
1083         # or maybe this test is just totally useless on a client-only system
1084         [ -z "$TUNEFS" ] && skip "No tunefs" && return
1085         local DISK1_4=$LUSTRE/tests/disk1_4.zip
1086         [ ! -r $DISK1_4 ] && skip "Cant find $DISK1_4, skipping" && return
1087         unzip -o -j -d $TMP/$tdir $DISK1_4 || { skip "Cant unzip $DISK1_4, skipping" && return ; }
1088         load_modules
1089         sysctl lnet.debug=$PTLDEBUG
1090
1091         $TUNEFS $TMP/$tdir/mds || error "tunefs failed"
1092         # nids are wrong, so client wont work, but server should start
1093         start mds $TMP/$tdir/mds "-o loop,exclude=lustre-OST0000" || return 3
1094         local UUID=$(cat $LPROC/mds/lustre-MDT0000/uuid)
1095         echo MDS uuid $UUID
1096         [ "$UUID" == "mdsA_UUID" ] || error "UUID is wrong: $UUID" 
1097
1098         $TUNEFS --mgsnode=`hostname` $TMP/$tdir/ost1 || error "tunefs failed"
1099         start ost1 $TMP/$tdir/ost1 "-o loop" || return 5
1100         UUID=$(cat $LPROC/obdfilter/lustre-OST0000/uuid)
1101         echo OST uuid $UUID
1102         [ "$UUID" == "ost1_UUID" ] || error "UUID is wrong: $UUID" 
1103
1104         local NID=$($LCTL list_nids | head -1)
1105
1106         echo "OSC changes should return err:" 
1107         $LCTL conf_param lustre-OST0000.osc.max_dirty_mb=15 && return 7
1108         $LCTL conf_param lustre-OST0000.failover.node=$NID && return 8
1109         echo "ok."
1110         echo "MDC changes should succeed:" 
1111         $LCTL conf_param lustre-MDT0000.mdc.max_rpcs_in_flight=9 || return 9
1112         $LCTL conf_param lustre-MDT0000.failover.node=$NID || return 10
1113         echo "ok."
1114
1115         # With a new good MDT failover nid, we should be able to mount a client
1116         # (but it cant talk to OST)
1117         local OLDMOUNTOPT=$MOUNTOPT
1118         MOUNTOPT="exclude=lustre-OST0000"
1119         mount_client $MOUNT
1120         MOUNTOPT=$OLDMOUNTOPT
1121         set_and_check client "cat $LPROC/mdc/*/max_rpcs_in_flight" "lustre-MDT0000.mdc.max_rpcs_in_flight" || return 11
1122
1123         zconf_umount `hostname` $MOUNT -f
1124         cleanup_nocli
1125
1126         # mount a second time to make sure we didnt leave upgrade flag on
1127         $TUNEFS --dryrun $TMP/$tdir/mds || error "tunefs failed"
1128         start mds $TMP/$tdir/mds "-o loop,exclude=lustre-OST0000" || return 12
1129         cleanup_nocli
1130
1131         [ -d $TMP/$tdir ] && rm -rf $TMP/$tdir
1132 }
1133 run_test 32a "Upgrade from 1.4 (not live)"
1134
1135 test_32b() {
1136         # XXX - make this run on client-only systems with real hardware on
1137         #       the OST and MDT
1138         #       there appears to be a lot of assumption here about loopback
1139         #       devices
1140         # or maybe this test is just totally useless on a client-only system
1141         [ -z "$TUNEFS" ] && skip "No tunefs" && return
1142         local DISK1_4=$LUSTRE/tests/disk1_4.zip
1143         [ ! -r $DISK1_4 ] && skip "Cant find $DISK1_4, skipping" && return
1144         unzip -o -j -d $TMP/$tdir $DISK1_4 || { skip "Cant unzip $DISK1_4, skipping" && return ; }
1145         load_modules
1146         sysctl lnet.debug=$PTLDEBUG
1147
1148         # writeconf will cause servers to register with their current nids
1149         $TUNEFS --writeconf $TMP/$tdir/mds || error "tunefs failed"
1150         start mds $TMP/$tdir/mds "-o loop" || return 3
1151         local UUID=$(cat $LPROC/mds/lustre-MDT0000/uuid)
1152         echo MDS uuid $UUID
1153         [ "$UUID" == "mdsA_UUID" ] || error "UUID is wrong: $UUID" 
1154
1155         $TUNEFS --mgsnode=`hostname` $TMP/$tdir/ost1 || error "tunefs failed"
1156         start ost1 $TMP/$tdir/ost1 "-o loop" || return 5
1157         UUID=$(cat $LPROC/obdfilter/lustre-OST0000/uuid)
1158         echo OST uuid $UUID
1159         [ "$UUID" == "ost1_UUID" ] || error "UUID is wrong: $UUID" 
1160
1161         echo "OSC changes should succeed:" 
1162         $LCTL conf_param lustre-OST0000.osc.max_dirty_mb=15 || return 7
1163         $LCTL conf_param lustre-OST0000.failover.node=$NID || return 8
1164         echo "ok."
1165         echo "MDC changes should succeed:" 
1166         $LCTL conf_param lustre-MDT0000.mdc.max_rpcs_in_flight=9 || return 9
1167         echo "ok."
1168
1169         # MDT and OST should have registered with new nids, so we should have
1170         # a fully-functioning client
1171         echo "Check client and old fs contents"
1172         mount_client $MOUNT
1173         set_and_check client "cat $LPROC/mdc/*/max_rpcs_in_flight" "${NEWNAME}-MDT0000.mdc.max_rpcs_in_flight" || return 11
1174         [ "$(cksum $MOUNT/passwd | cut -d' ' -f 1,2)" == "2479747619 779" ] || return 12  
1175         echo "ok."
1176
1177         cleanup
1178         [ -d $TMP/$tdir ] && rm -rf $TMP/$tdir
1179 }
1180 run_test 32b "Upgrade from 1.4 with writeconf"
1181
1182 test_33() { # bug 12333
1183         local FSNAME2=test1234
1184         local fs2mds_HOST=$mds_HOST
1185         local fs2ost_HOST=$ost_HOST
1186
1187         [ -z "$fs2ost_DEV" -o -z "$fs2mds_DEV" ] && [ -b "$MDSDEV" ] && \
1188             log "mixed loopback and real device not working" && return
1189
1190         local fs2mdsdev=${fs2mds_DEV:-${MDSDEV}_2}
1191         local fs2ostdev=${fs2ost_DEV:-$(ostdevname 1)_2}
1192         add fs2mds $MDS_MKFS_OPTS --fsname=${FSNAME2} --reformat $fs2mdsdev || exit 10
1193         add fs2ost $OST_MKFS_OPTS --fsname=${FSNAME2} --index=8191 --mgsnode=`hostname`@tcp --reformat $fs2ostdev || exit 10
1194
1195         start fs2mds $fs2mdsdev $MDS_MOUNT_OPTS
1196         start fs2ost $fs2ostdev $OST_MOUNT_OPTS
1197         mkdir -p $MOUNT2
1198         mount -t lustre $MGSNID:/${FSNAME2} $MOUNT2 || return 1
1199         echo "ok."
1200
1201         umount -d $MOUNT2
1202         stop fs2ost -f
1203         stop fs2mds -f
1204         rm -rf $MOUNT2 $fs2mdsdev $fs2ostdev
1205         cleanup_nocli || return 6
1206 }
1207 run_test 33 "Mount ost with a large index number"
1208
1209 test_35() { # bug 12459
1210         setup
1211
1212         DBG_SAVE="`sysctl -n lnet.debug`"
1213         sysctl -w lnet.debug="ha"
1214
1215         log "Set up a fake failnode for the MDS"
1216         FAKENID="127.0.0.2"
1217         do_facet mds $LCTL conf_param ${FSNAME}-MDT0000.failover.node=$FAKENID || return 4
1218
1219         log "Wait for RECONNECT_INTERVAL seconds (10s)"
1220         sleep 10
1221
1222         MSG="conf-sanity.sh test_33 `date +%F%kh%Mm%Ss`"
1223         $LCTL clear
1224         log "$MSG"
1225         log "Stopping the MDT:"
1226         stop_mds || return 5
1227
1228         df $MOUNT > /dev/null 2>&1 &
1229         DFPID=$!
1230         log "Restarting the MDT:"
1231         start_mds || return 6
1232         log "Wait for df ($DFPID) ... "
1233         wait $DFPID
1234         log "done"
1235         sysctl -w lnet.debug="$DBG_SAVE"
1236
1237         # retrieve from the log the first server that the client tried to
1238         # contact after the connection loss
1239         $LCTL dk $TMP/lustre-log-$TESTNAME.log
1240         NEXTCONN=`awk "/${MSG}/ {start = 1;}
1241                        /import_select_connection.*${FSNAME}-MDT0000-mdc.* using connection/ {
1242                                 if (start) {
1243                                         if (\\\$NF ~ /$FAKENID/)
1244                                                 print \\\$NF;
1245                                         else
1246                                                 print 0;
1247                                         exit;
1248                                 }
1249                        }" $TMP/lustre-log-$TESTNAME.log`
1250         [ "$NEXTCONN" != "0" ] && log "The client didn't try to reconnect to the last active server (tried ${NEXTCONN} instead)" && return 7
1251         cleanup
1252 }
1253 run_test 35 "Reconnect to the last active server first"
1254
1255 test_36() { # 12743
1256         local rc
1257         local FSNAME2=test1234
1258         local fs2mds_HOST=$mds_HOST
1259         local fs2ost_HOST=$ost_HOST
1260         local fs3ost_HOST=$ost_HOST
1261         rc=0
1262
1263         [ -z "$fs2ost_DEV" -o -z "$fs2mds_DEV" ] && [ -b "$MDSDEV" ] && \
1264             log "mixed loopback and real device not working" && return
1265
1266         [ $OSTCOUNT -lt 2 ] && skip "skipping test for single OST" && return
1267
1268         local fs2mdsdev=${fs2mds_DEV:-${MDSDEV}_2}
1269         local fs2ostdev=${fs2ost_DEV:-$(ostdevname 1)_2}
1270         local fs3ostdev=${fs3ost_DEV:-$(ostdevname 2)_2}
1271         add fs2mds $MDS_MKFS_OPTS --fsname=${FSNAME2} --reformat $fs2mdsdev || exit 10
1272         add fs2ost $OST_MKFS_OPTS --mkfsoptions='-b1024' --fsname=${FSNAME2} --mgsnode=`hostname`@tcp --reformat $fs2ostdev || exit 10
1273         add fs3ost $OST_MKFS_OPTS --mkfsoptions='-b4096' --fsname=${FSNAME2} --mgsnode=`hostname`@tcp --reformat $fs3ostdev || exit 10
1274
1275         start fs2mds $fs2mdsdev $MDS_MOUNT_OPTS
1276         start fs2ost $fs2ostdev $OST_MOUNT_OPTS
1277         start fs3ost $fs3ostdev $OST_MOUNT_OPTS
1278         mkdir -p $MOUNT2
1279         mount -t lustre $MGSNID:/${FSNAME2} $MOUNT2 || return 1
1280
1281         dd if=/dev/zero of=$MOUNT2/$tfile bs=1M count=7 || return 2
1282         [ $(grep -c obdfilter $LPROC/devices) -eq 0 ] &&
1283                 skip "skipping test for remote OST" && return
1284         BKTOTAL=`awk 'BEGIN{total=0}; {total+=$1}; END{print total}' \
1285                 $LPROC/obdfilter/*/kbytestotal`
1286         BKFREE=`awk 'BEGIN{free=0}; {free+=$1}; END{print free}' \
1287                $LPROC/obdfilter/*/kbytesfree`
1288         BKAVAIL=`awk 'BEGIN{avail=0}; {avail+=$1}; END{print avail}' \
1289                 $LPROC/obdfilter/*/kbytesavail`
1290         STRING=`df -P $MOUNT2 | tail -n 1 | awk '{print $2","$3","$4}'`
1291         DFTOTAL=`echo $STRING | cut -d, -f1`
1292         DFUSED=`echo $STRING  | cut -d, -f2`
1293         DFAVAIL=`echo $STRING | cut -d, -f3`
1294         DFFREE=$(($DFTOTAL - $DFUSED))
1295
1296         ALLOWANCE=$((64 * $OSTCOUNT))
1297
1298         if [ $DFTOTAL -lt $(($BKTOTAL - $ALLOWANCE)) ] ||  
1299            [ $DFTOTAL -gt $(($BKTOTAL + $ALLOWANCE)) ] ; then
1300                 echo "**** FAIL: df total($DFTOTAL) mismatch OST total($BKTOTAL)"
1301                 rc=1
1302         fi
1303         if [ $DFFREE -lt $(($BKFREE - $ALLOWANCE)) ] || 
1304            [ $DFFREE -gt $(($BKFREE + $ALLOWANCE)) ] ; then
1305                 echo "**** FAIL: df free($DFFREE) mismatch OST free($BKFREE)"
1306                 rc=2
1307         fi
1308         if [ $DFAVAIL -lt $(($BKAVAIL - $ALLOWANCE)) ] || 
1309            [ $DFAVAIL -gt $(($BKAVAIL + $ALLOWANCE)) ] ; then
1310                 echo "**** FAIL: df avail($DFAVAIL) mismatch OST avail($BKAVAIL)"
1311                 rc=3
1312        fi
1313
1314         umount -d $MOUNT2
1315         stop fs3ost -f || return 200
1316         stop fs2ost -f || return 201
1317         stop fs2mds -f || return 202
1318         rm -rf $MOUNT2 $fs2mdsdev $fs2ostdev $fs3ostdev
1319         unload_modules || return 203
1320         return $rc
1321 }
1322 run_test 36 "df report consistency on OSTs with different block size"
1323
1324 umount_client $MOUNT    
1325 cleanup_nocli
1326 cleanup_krb5_env
1327
1328 equals_msg `basename $0`: test complete
1329 [ -f "$TESTSUITELOG" ] && cat $TESTSUITELOG || true