Whamcloud - gitweb
029d251eeebd4c9dd43e10ed8f0af7e05b6b5a46
[fs/lustre-release.git] / lustre / tests / common.sh
1 #!/bin/sh
2 export PATH=$PATH:/sbin:/usr/sbin
3
4 [ -d /r ] && R=/r
5
6 # check if running in source directory
7 # will probably need to create variable for each module.
8 if [ -f $SRCDIR/Makefile.am ]; then
9     USEDEV=yes
10     PORTALS=$SRCDIR/../../portals
11     LUSTRE=$SRCDIR/..
12
13     PTLCTL=$PORTALS/linux/utils/ptlctl
14     DBGCTL=$PORTALS/linux/utils/debugctl
15     ACCEPTOR=$PORTALS/linux/utils/acceptor
16
17     OBDCTL=$LUSTRE/utils/obdctl
18 else
19     USEDEV=no
20     # should have configure set the paths here
21     BINDIR=/usr/sbin
22     PORTALS=/lib/modules
23     LUSTRE=/lib/modules
24
25     PTLCTL=$BINDIR/ptlctl
26     DBGCTL=$BINDIR/debugctl
27     ACCEPTOR=$BINDIR/acceptor
28     OBDCTL=$BINDIR/obdctl
29 fi
30
31 LOOPNUM=0; export LOOPNUM
32 if [ -b /dev/loop0 ]; then
33         LOOP=/dev/loop
34 elif [ -b /dev/loop/0 ]; then
35         LOOP=/dev/loop/
36 else
37         echo "Cannot find /dev/loop0 or /dev/loop/0" 1>&2 && exit -1
38 fi
39
40 do_insmod() {
41         MODULE=$1
42         BASE=`echo $MODULE | sed -e "s^.*/^^" -e "s/\.o$//"`
43
44         [ "$MODULE" ] || fail "usage: $0 <module>"
45         [ -f $MODULE ] || echo "$0: module '$MODULE' not found" 1>&2
46         lsmod | grep -q "\<$BASE\>" && return 0
47         insmod  $MODULE
48 }
49
50 do_rmmod() {
51         MODULE=$1
52         [ "$MODULE" ] || fail "usage: $0 <module>"
53         lsmod | grep -q $MODULE || return 0
54         rmmod $MODULE || lsmod | sed "s/^/$MODULE failed: /"
55 }
56
57 # Return the next unused loop device on stdout and in the $LOOPDEV
58 # environment variable.
59 next_loop_dev() {
60         NEXT=
61         while [ -b ${LOOP}${LOOPNUM} ]; do
62                 LOOPDEV=${LOOP}${LOOPNUM}
63                 losetup ${LOOPDEV} > /dev/null 2>&1 || NEXT=${LOOPDEV}
64                 LOOPNUM=`expr ${LOOPNUM} + 1`
65                 [ "$NEXT" ] && echo ${NEXT} && break
66         done
67 }
68
69 # Create a new filesystem.  If we are using a loopback device, we check
70 # for existing "template" filesystems instead of creating a new one,
71 # because it is _much_ faster to gunzip the empty filesystem instead of
72 # creating a new one from scratch.  Conversely, if we are creating a
73 # filesystem on a device we use mkfs, because that only writes sparsely
74 # to the device.  The empty filesystems are also highly compressed (1000:1)
75 # so they don't take too much space.
76 #
77 new_fs_usage() {
78         echo "new_fs <fstype> {device | file} [size]" 1>&2
79         exit -1
80 }
81 new_fs () {
82         EFILE="$1_$3.gz"
83         MKFS="mkfs.$1"
84         MKFSOPT="-b 4096"
85
86         [ "$1" = "ext3" ] && MKFS="mkfs.ext2 -j"
87         if [ "$1" = "extN" ]; then
88                 MKFS="mkfs.ext2 -j"
89                 EFILE="ext3_$3.gz"
90         fi
91
92         if [ -b "$2" ]; then
93                 [ $# -lt 2 -o $# -gt 3 ] && new_fs_usage
94
95                 PM="/proc/mounts"
96                 [ -r "$PM" ] || PM="/etc/mtab"
97
98                 grep "$2 " $PM 1>&2 && echo "$0: $2 is in $PM!" 1>&2 && exit -1
99
100                 $MKFS $MKFSOPT $2 $3 || exit -1
101                 LOOPDEV=$2      # Not really a loop device
102         else
103                 [ $# -ne 3 ] && new_fs_usage
104
105                 if [ -r "$EFILE" ]; then
106                         echo "using prepared filesystem $EFILE for $2"
107                         zcat "$EFILE" > $2 || exit -1
108                         sync
109                 else
110                         echo "creating new sparse filesystem on $2"
111                         dd if=/dev/zero of=$2 bs=1k seek=$3 count=1 1>&2 || exit -1
112                         $MKFS $MKFSOPT -F $2 1>&2 || exit -1
113                 fi
114                 LOOPDEV=`next_loop_dev`
115                 losetup ${LOOPDEV} $2 1>&2 || exit -1
116         fi
117
118         # Enable hash-indexed directories for extN filesystems
119 #       [ "$1" = "extN" ] && echo "feature FEATURE_C5" | debugfs -w $2
120 }
121
122 # Set up to use an existing filesystem.  We take the same parameters as
123 # new_fs, even though we only use the <fstype> and <file> parameters, to
124 # make it easy to convert between new_fs and old_fs in testing scripts.
125 old_fs () {
126         [ -e $2 ] || exit -1
127
128         if [ -b "$2" ]; then
129                 LOOPDEV=$2      # Not really a loop device
130         else
131                 LOOPDEV=`next_loop_dev`
132                 losetup ${LOOPDEV} $2 1>&2 || exit -1
133         fi
134 }
135
136 list_mods() {
137         $DBGCTL modules > $R/tmp/ogdb
138         echo "The GDB module script is in $R/tmp/ogdb"
139         [ "$DEBUG_WAIT" = "yes" ] && echo -n "Press ENTER to continue" && read
140 }
141
142 # start acceptor for a given network and port.
143 # not all networks need an acceptor
144 start_acceptor() {
145     case $NETWORK in
146     elan)   [ "$PORT" ] && fail "$0: NETWORK is elan but PORT is set"
147         ;;
148     tcp)    [ "$PORT" ] || fail "$0: NETWORK is tcp but PORT is not set"
149         $ACCEPTOR $PORT
150         ;;
151     *)  fail "$0: unknown NETWORK '$NETWORK'" ;;
152     esac
153
154 }
155
156 # We need at least one setup file to be given.  It can be passed on
157 # the command-line, or it can be found in the home directory, or it
158 # can even be sourced into the current shell environment.
159 setup_opts() {
160         DEF=/etc/lustre/lustre.cfg
161         [ -r $DEF ] && . $DEF && SETUP=y
162
163         for CFG in "$@" ; do
164                 case $CFG  in
165                 *.cfg) [ -r "$CFG" ] && . $CFG && SETUP=y ;;
166                 *) echo "unknown option '$CFG'" 1>&2
167                 esac
168         done
169
170         if [ "$SETUP" != "y" ]; then
171                 echo "error: no config file on command-line and no $DEF" 1>&2
172                 exit -1
173         fi
174         
175         [ -z "$MDS_RSH" ] && MDS_RSH="eval"
176         [ -z "$OST_RSH" ] && OST_RSH="eval"
177         [ -z "$OSC_RSH" ] && OSC_RSH="eval"
178 }
179
180 setup_variables() {
181         [ -z "$OSTNODE" ] && OSTNODE=$SERVER
182         [ -z "$MDSNODE" ] && MDSNODE=$SERVER
183         [ -z "$DLM" ] && DLM=$SERVER
184 }
185
186 setup_portals() {
187         if grep -q portals /proc/modules; then
188                 echo "$0: portals already appears to be set up, skipping"
189                 return 0
190         fi
191
192         if [ -z "$NETWORK" -o -z "$LOCALHOST" -o -z "$SERVER" ]; then
193                 echo "$0: NETWORK or LOCALHOST or SERVER is not set" 1>&2
194                 exit -1
195         fi
196
197         setup_variables
198
199         [ -c /dev/portals ] || mknod /dev/portals c 10 240
200
201         if [  "$USEDEV" = "yes" ]; then
202             do_insmod $PORTALS/linux/oslib/portals.o || exit -1
203
204             case $NETWORK in
205             elan)  do_insmod $PORTALS/linux/qswnal/kqswnal.o || exit -1
206                     ;;
207             tcp)   do_insmod $PORTALS/linux/socknal/ksocknal.o || exit -1
208                    ;;
209             *)  fail "$0: unknown NETWORK '$NETWORK'" ;;
210             esac
211         fi
212
213         start_acceptor
214
215         $PTLCTL <<- EOF
216         setup $NETWORK
217         mynid $LOCALHOST
218         connect $MDSNODE $PORT
219         add_uuid $MDSNODE
220         connect $OSTNODE $PORT
221         add_uuid $OSTNODE
222         connect $DLM $PORT
223         add_uuid $DLM
224         add_uuid self
225         quit
226 EOF
227 }
228
229 setup_lustre() {
230         [ -c /dev/obd ] || mknod /dev/obd c 10 241
231
232         if [ "$USEDEV" = "yes" ]; then
233             do_insmod $LUSTRE/obdclass/obdclass.o || exit -1
234             do_insmod $LUSTRE/ptlrpc/ptlrpc.o || exit -1
235             do_insmod $LUSTRE/ldlm/ldlm.o || exit -1
236             do_insmod $LUSTRE/extN/extN.o || \
237                 echo "info: can't load extN.o module, not fatal if using ext3"
238             do_insmod $LUSTRE/mds/mds.o || exit -1
239             #do_insmod $LUSTRE/mds/mds_ext2.o || exit -1
240             #do_insmod $LUSTRE/mds/mds_ext3.o || exit -1
241             do_insmod $LUSTRE/mds/mds_extN.o || \
242                 echo "info: can't load mds_extN.o module, needs extN.o"
243             do_insmod $LUSTRE/obdecho/obdecho.o || exit -1
244             #do_insmod $LUSTRE/obdext2/obdext2.o || exit -1
245             do_insmod $LUSTRE/obdfilter/obdfilter.o || exit -1
246                 do_insmod $LUSTRE/ost/ost.o || exit -1
247             do_insmod $LUSTRE/osc/osc.o || exit -1
248             do_insmod $LUSTRE/mdc/mdc.o || exit -1
249                 do_insmod $LUSTRE/lov/lov.o || exit -1
250             do_insmod $LUSTRE/llite/llite.o || exit -1
251         fi 
252
253         echo "$R/tmp/lustre-log" > /proc/sys/portals/debug_path
254
255         if $OBDCTL name2dev RPCDEV > /dev/null 2>&1; then
256                 echo "$0: RPCDEV is already configured, skipping"
257                 return 0
258         fi
259
260         $OBDCTL <<- EOF || return $?
261         newdev
262         attach ptlrpc RPCDEV
263         setup
264         quit
265         EOF
266         list_mods
267
268         [ -d /mnt/lustre ] || mkdir /mnt/lustre
269 }
270
271 setup_ldlm() {
272         [ "$SETUP_LDLM" = "y" ] || return 0
273
274         [ -c /dev/portals ] || mknod /dev/portals c 10 240
275
276         $OBDCTL <<- EOF || return $?
277         newdev
278         attach ldlm LDLMDEV
279         setup
280         quit
281         EOF
282         list_mods
283 }
284
285 find_devno() {
286         if [ -z "$1" ]; then
287                 echo "usage: $0 <devname>" 1>&2
288                 return -1
289         fi
290
291         $OBDCTL name2dev $1
292 }
293
294 setup_mds() {
295         [ "$SETUP_MDS" = "y" ] || return 0
296
297         if [ -z "$MDSFS" -o -z "$MDSDEV" ]; then
298                 echo "error: setup_mds: MDSFS or MDSDEV unset" 1>&2
299                 return -1
300         fi
301
302         [ "$1" ] && DO_FS=$1
303         if [ "$DO_FS" != "new_fs" -a "$DO_FS" != "old_fs" ]; then
304                 echo "usage: setup_mds {new_fs|old_fs}" 1>&2
305                 return -1
306         fi
307
308         if $OBDCTL name2dev MDSDEV > /dev/null 2>&1; then
309                 echo "$0: MDSDEV is already configured"
310                 return 0
311         fi
312
313         $DO_FS ${MDSFS} ${MDSDEV} ${MDSSIZE}
314         MDS=${LOOPDEV}
315
316         $OBDCTL <<- EOF || return $?
317         newdev
318         attach mds MDSDEV MDSUUID  
319         setup ${MDS} ${MDSFS}
320         quit
321         EOF
322         list_mods
323 }
324
325 setup_mds_lov() { 
326
327         [ "$SETUP_MDS" = "y" ] || return 0
328
329         if [ -z "$LOVUUID" ]; then
330             echo "No LOV configured"
331             return
332         fi
333
334         $OBDCTL <<- EOF || return $?
335         name2dev MDSDEV
336         connect 
337         lovconfig ${LOVUUID} 1 4096 0 OSCUUID
338         disconnect
339         quit
340         EOF
341
342         list_mods
343 }
344
345
346 setup_ost() {
347         [ "$SETUP_OST" = "y" ] || return 0
348
349         if [ -z "$OSTTYPE" ]; then
350                 echo "error: setup_ost: OSTTYPE unset" 1>&2
351                 return -1
352         fi
353
354         case $OSTTYPE in
355         obdecho)        OBD=
356                         OBDARG=
357                         NEED_FS=n
358                 ;;
359         obdext2)        OBDARG=
360                         NEED_FS=y
361                 ;;
362         obdfilter)      OBDARG=$OSTFS
363                         NEED_FS=y
364                 ;;
365         *)      echo "error: setup_ost: unknown OSTTYPE '$OSTTYPE'" 1>&2
366                 return -1
367                 ;;
368         esac
369
370         if $OBDCTL name2dev OBDDEV > /dev/null 2>&1; then
371                 echo "$0: OBDDEV is already configured"
372                 return 0
373         fi
374
375         if [ "$NEED_FS" = "y" ]; then
376                 [ "$1" ] && DO_FS=$1
377                 if [ -z "$OSTFS" -o -z "$OSTDEV" ]; then
378                         echo "error: setup_ost: OSTFS or OSTDEV unset" 1>&2
379                         return -1
380                 fi
381
382                 if [ "$DO_FS" != "new_fs" -a "$DO_FS" != "old_fs" ]; then
383                         echo "usage: setup_ost {new_fs|old_fs}" 1>&2
384                         return -1
385                 fi
386
387                 $DO_FS ${OSTFS} ${OSTDEV} ${OSTSIZE}
388                 OBD=${LOOPDEV}
389         fi
390
391         $OBDCTL <<- EOF || return $?
392         newdev
393         attach ${OSTTYPE} OBDDEV OBDUUID
394         setup ${OBD} ${OBDARG}
395         quit
396         EOF
397         list_mods
398
399         $OBDCTL <<- EOF || return $?
400         newdev
401         attach ost OSTDEV OSTUUID
402         setup \$OBDDEV
403         quit
404         EOF
405         list_mods
406 }
407
408 setup_server() {
409         #setup_mds $1 && setup_mds_lov $1 && setup_ost $1
410         setup_mds $1 && setup_ost $1
411 }
412
413 setup_osc() {
414         set -vx
415         [ "$SETUP_OSC" != "y" ] && return 0
416         [ "$OSC_NAMES" ] || OSC_NAMES=OSCDEV
417
418         for THEOSC in $OSC_NAMES ; do 
419             OSCDEVNO=`find_devno $THEOSC`
420             if $OBDCTL name2dev $THEOSC > /dev/null 2>&1; then
421                 echo "$0: OSCDEV is already configured"
422                 return 0
423             fi
424
425         $OBDCTL <<- EOF || return $rc
426         newdev
427         attach osc $THEOSC ${THEOSC}-UUID
428         setup OBDUUID $OSTNODE
429         quit
430         EOF
431         done
432         list_mods
433 }
434
435 setup_mdc() {
436         set -vx
437         [ "$SETUP_MDC" != "y" ] && return 0
438         [ "$MDC_NAMES" ] || MDC_NAMES=MDCDEV
439
440         for THEMDC in $MDC_NAMES ; do 
441             MDCDEVNO=`find_devno $THEMDC`
442         if $OBDCTL name2dev $THEMDC > /dev/null 2>&1; then
443                 echo "$0: MDCDEV is already configured"
444                 return 0
445         fi
446
447         $OBDCTL <<- EOF || return $?
448         newdev
449         attach mdc $THEMDC  ${THEMDC}-UUID
450         setup MDSUUID $MDSNODE
451         quit
452         EOF
453         done
454         list_mods
455 }
456
457 setup_lov () { 
458         [ "$SETUP_MDC" != "y" ] && return 0
459
460         if [ -z "$LOVUUID" ]; then
461             echo "No LOV configured"
462             return
463         fi
464
465         $OBDCTL <<- EOF || return $?
466         newdev
467         attach lov LOVNAME  ${LOVUUID}
468         setup  MDCDEV-UUID
469         quit
470         EOF
471         list_mods
472 }        
473
474
475 setup_mount() {
476         set -vx
477         [ "$SETUP_MOUNT" != "y" ] && return 0
478         [ "$MDC_NAMES" ] || MDC_NAMES=MDCDEV
479         [ "$OSC_NAMES" ] || OSC_NAMES=OSCDEV
480         [ -z "$MOUNT_LIST" -a "$OSCMT" ] && MOUNT_LIST="MT" && MT="$OSCMT OSCDEV MDCDEV"
481
482         [ "$MOUNT_LIST" ] || fail "error: $0: MOUNT_LIST unset"
483
484         for THEMOUNT in $MOUNT_LIST; do
485             eval "echo \$$THEMOUNT" | while read MTPT THEOSC THEMDC; do
486                 if mount | grep -q $MTPT; then
487                     echo "$0: $MTPT is already mounted"
488                     return 0
489                 fi
490
491                 [ ! -d $MTPT ] && mkdir $MTPT
492                 echo mount -t lustre_lite -o ost=${THEOSC}-UUID,mds=${THEMDC}-UUID none $MTPT
493                 mount -t lustre_lite -o ost=${THEOSC}-UUID,mds=${THEMDC}-UUID none $MTPT
494             done
495         done
496 }
497
498 setup_client() {
499         # setup_osc && setup_mdc && setup_lov  && setup_mount
500         setup_osc && setup_mdc && setup_mount
501 }
502
503 DEBUG_ON="echo 0xffffffff > /proc/sys/portals/debug"
504 DEBUG_OFF="echo 0 > /proc/sys/portals/debug"
505
506 debug_server_off() {
507         [ "$MDS_RSH" ] && echo "Turn OFF debug on MDS" && $MDS_RSH "$DEBUG_OFF"
508         [ "$OST_RSH" ] && echo "Turn OFF debug on OST" && $OST_RSH "$DEBUG_OFF"
509 }
510
511 debug_server_on() {
512         [ "$MDS_RSH" ] && echo "Turn ON debug on MDS" && $MDS_RSH "$DEBUG_ON"
513         [ "$OST_RSH" ] && echo "Turn ON debug on OST" && $OST_RSH "$DEBUG_ON"
514 }
515
516 debug_client_off() {
517         echo "Turning OFF debug on client" && $OSC_RSH "$DEBUG_OFF"
518 }
519
520 debug_client_on() {
521         echo "Turning ON debug on client" && $OSC_RSH "$DEBUG_ON"
522 }
523
524 cleanup_portals() {
525         [ -z "$NETWORK" ] && NETWORK=tcp
526
527         setup_variables
528
529         $PTLCTL <<- EOF
530         setup $NETWORK
531         disconnect
532         del_uuid self
533         del_uuid $MDSNODE
534         del_uuid $OSTNODE
535         del_uuid $DLM
536         quit
537         EOF
538
539         do_rmmod ldlm
540         do_rmmod ptlrpc
541         do_rmmod obdclass
542
543         do_rmmod kptlrouter
544         do_rmmod kqswnal
545         do_rmmod ksocknal
546         do_rmmod portals
547 }
548
549 cleanup_lustre() {
550         killall acceptor
551
552         do_rmmod llite
553         do_rmmod lov
554         do_rmmod mdc
555         do_rmmod osc
556
557         do_rmmod mds_extN
558         do_rmmod mds_ext3
559         do_rmmod mds_ext2
560         do_rmmod mds
561         do_rmmod ost
562         do_rmmod obdecho
563         do_rmmod obdfilter
564         do_rmmod obdext2
565         do_rmmod extN
566
567         losetup -d ${LOOP}0
568         losetup -d ${LOOP}1
569         losetup -d ${LOOP}2
570 }
571
572 cleanup_ldlm() {
573         [ "$SETUP" -a -z "$SETUP_LDLM" ] && return 0
574
575         LDLMDEVNO=`find_devno LDLMDEV`
576         if [ "$LDLMDEVNO" ]; then
577                 $OBDCTL <<- EOF
578                 device $LDLMDEVNO
579                 cleanup
580                 detach
581                 quit
582                 EOF
583         fi
584 }
585
586 cleanup_mds() {
587         [ "$SETUP" -a -z "$SETUP_MDS" ] && return 0
588
589         MDSDEVNO=`find_devno MDSDEV`
590         if [ "$MDSDEVNO" ]; then
591                 $OBDCTL <<- EOF
592                 device $MDSDEVNO
593                 cleanup
594                 detach
595                 quit
596                 EOF
597         fi
598 }
599
600 cleanup_ost() {
601         [ "$SETUP" -a -z "$SETUP_OST" ] && return 0
602
603         OSTDEVNO=`find_devno OSTDEV`
604         if [ "$OSTDEVNO" ]; then
605                 $OBDCTL <<- EOF
606                 device $OSTDEVNO
607                 cleanup
608                 detach
609                 quit
610                 EOF
611         fi
612
613         OBDDEVNO=`find_devno OBDDEV`
614         if [ "$OBDDEVNO" ]; then
615                 $OBDCTL <<- EOF
616                 device $OBDDEVNO
617                 cleanup
618                 detach
619                 quit
620                 EOF
621         fi
622 }
623
624 cleanup_server() {
625         cleanup_ost && cleanup_mds
626 }
627
628 cleanup_mount() {
629         set -vx
630         [ "$SETUP_MOUNT" != "y" ] && return 0
631         [ "$MDC_NAMES" ] || MDC_NAMES=MDCDEV
632         [ "$OSC_NAMES" ] || OSC_NAMES=OSCDEV
633         [ -z "$MOUNT_LIST" -a "$OSCMT" ] && MOUNT_LIST="MT" && MT="$OSCMT OSCDEV MDCDEV"
634
635         [ "$MOUNT_LIST" ] || fail "error: $0: MOUNT_LIST unset"
636
637         for THEMOUNT in $MOUNT_LIST; do
638             eval "echo \$$THEMOUNT" | while read MTPT THEOSC THEMDC; do
639                 if [ "`mount | grep $MTPT`" ]; then
640                     umount $MTPT || fail "unable to unmount $MTPT"
641                 fi
642             done
643         done
644 }
645
646 cleanup_osc() {
647         [ "$SETUP" -a -z "$SETUP_OSC" ] && return 0
648         [ "$OSC_NAMES" ] || OSC_NAMES=OSCDEV
649
650         for THEOSC in $OSC_NAMES ; do 
651             OSCDEVNO=`find_devno $THEOSC`
652             if [ "$OSCDEVNO" ]; then
653                 $OBDCTL <<- EOF
654                 device $OSCDEVNO
655                 cleanup
656                 detach
657                 quit
658                 EOF
659             fi
660         done
661 }
662
663 cleanup_mdc() {
664         [ "$SETUP" -a -z "$SETUP_MDC" ] && return 0
665         [ "$MDC_NAMES" ] || MDC_NAMES=MDCDEV
666
667         for THEMDC in $MDC_NAMES ; do 
668             MDCDEVNO=`find_devno $THEMDC`
669             if [ "$MDCDEVNO" ]; then
670                 $OBDCTL <<- EOF
671                 device $MDCDEVNO
672                 cleanup
673                 detach
674                 quit
675                 EOF
676             fi
677         done
678 }
679
680 cleanup_rpc() {
681         RPCDEVNO=`find_devno RPCDEV`
682         if [ "$RPCDEVNO" ]; then
683                 $OBDCTL <<- EOF
684                 device $RPCDEVNO
685                 cleanup
686                 detach
687                 quit
688                 EOF
689         fi
690 }
691
692 cleanup_client() {
693         cleanup_mount && cleanup_osc && cleanup_mdc && cleanup_rpc
694 }
695
696 fail() { 
697     echo "ERROR: $1" 1>&2
698     [ $2 ] && RC=$2 || RC=1
699     exit $RC
700 }