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