Whamcloud - gitweb
3130bc7c327d472fd5d49adcb1eb807ccf08a5e6
[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
153 }
154
155 # We need at least one setup file to be given.  It can be passed on
156 # the command-line, or it can be found in the home directory, or it
157 # can even be sourced into the current shell environment.
158 setup_opts() {
159         DEF=/etc/lustre/lustre.cfg
160         [ -r $DEF ] && . $DEF && SETUP=y
161
162         for CFG in "$@" ; do
163                 case $CFG  in
164                 *.cfg) [ -r "$CFG" ] && . $CFG && SETUP=y ;;
165                 *) echo "unknown option '$CFG'" 1>&2
166                 esac
167         done
168
169         if [ "$SETUP" != "y" ]; then
170                 echo "error: no config file on command-line and no $DEF" 1>&2
171                 exit -1
172         fi
173         
174         [ -z "$MDS_RSH" ] && MDS_RSH="eval"
175         [ -z "$OST_RSH" ] && OST_RSH="eval"
176         [ -z "$OSC_RSH" ] && OSC_RSH="eval"
177 }
178
179 setup_variables() {
180         [ -z "$OSTNODE" ] && OSTNODE=$SERVER
181         [ -z "$MDSNODE" ] && MDSNODE=$SERVER
182         [ -z "$DLM" ] && DLM=$SERVER
183 }
184
185 setup_portals() {
186         if grep -q portals /proc/modules; then
187                 echo "$0: portals already appears to be set up, skipping"
188                 return 0
189         fi
190
191         if [ -z "$NETWORK" -o -z "$LOCALHOST" -o -z "$SERVER" ]; then
192                 echo "$0: NETWORK or LOCALHOST or SERVER is not set" 1>&2
193                 exit -1
194         fi
195
196         setup_variables
197
198         [ -c /dev/portals ] || mknod /dev/portals c 10 240
199
200         if [  "$USEDEV" = "yes ]; then
201             do_insmod $PORTALS/linux/oslib/portals.o || exit -1
202
203             case $NETWORK in
204             elan)  do_insmod $PORTALS/linux/qswnal/kqswnal.o || exit -1
205                     ;;
206             tcp)   do_insmod $PORTALS/linux/socknal/ksocknal.o || exit -1
207                    ;;
208             *)  fail "$0: unknown NETWORK '$NETWORK'" ;;
209         esac
210
211         start_acceptor
212
213         $PTLCTL <<- EOF
214         setup $NETWORK
215         mynid $LOCALHOST
216         connect $MDSNODE $PORT
217         add_uuid $MDSNODE
218         connect $OSTNODE $PORT
219         add_uuid $OSTNODE
220         connect $DLM $PORT
221         add_uuid $DLM
222         add_uuid self
223         quit
224         EOF
225 }
226
227 setup_lustre() {
228         [ -c /dev/obd ] || mknod /dev/obd c 10 241
229
230         if [ "$USEDEV" = "yes" ]; then
231             do_insmod $LUSTRE/obdclass/obdclass.o || exit -1
232             do_insmod $LUSTRE/ptlrpc/ptlrpc.o || exit -1
233             do_insmod $LUSTRE/ldlm/ldlm.o || exit -1
234             do_insmod $LUSTRE/extN/extN.o || \
235                 echo "info: can't load extN.o module, not fatal if using ext3"
236             do_insmod $LUSTRE/mds/mds.o || exit -1
237             #do_insmod $LUSTRE/mds/mds_ext2.o || exit -1
238             #do_insmod $LUSTRE/mds/mds_ext3.o || exit -1
239             do_insmod $LUSTRE/mds/mds_extN.o || \
240                 echo "info: can't load mds_extN.o module, needs extN.o"
241             do_insmod $LUSTRE/obdecho/obdecho.o || exit -1
242             #do_insmod $LUSTRE/obdext2/obdext2.o || exit -1
243             do_insmod $LUSTRE/obdfilter/obdfilter.o || exit -1
244                 do_insmod $LUSTRE/ost/ost.o || exit -1
245             do_insmod $LUSTRE/osc/osc.o || exit -1
246             do_insmod $LUSTRE/mdc/mdc.o || exit -1
247                 do_insmod $LUSTRE/lov/lov.o || exit -1
248             do_insmod $LUSTRE/llite/llite.o || exit -1
249         fi 
250
251         echo "$R/tmp/lustre-log" > /proc/sys/portals/debug_path
252
253         if $OBDCTL name2dev RPCDEV > /dev/null 2>&1; then
254                 echo "$0: RPCDEV is already configured, skipping"
255                 return 0
256         fi
257
258         $OBDCTL <<- EOF || return $?
259         newdev
260         attach ptlrpc RPCDEV
261         setup
262         quit
263         EOF
264         list_mods
265
266         [ -d /mnt/lustre ] || mkdir /mnt/lustre
267 }
268
269 setup_ldlm() {
270         [ "$SETUP_LDLM" = "y" ] || return 0
271
272         [ -c /dev/portals ] || mknod /dev/portals c 10 240
273
274         $OBDCTL <<- EOF || return $?
275         newdev
276         attach ldlm LDLMDEV
277         setup
278         quit
279         EOF
280         list_mods
281 }
282
283 find_devno() {
284         if [ -z "$1" ]; then
285                 echo "usage: $0 <devname>" 1>&2
286                 return -1
287         fi
288
289         $OBDCTL name2dev $1
290 }
291
292 setup_mds() {
293         [ "$SETUP_MDS" = "y" ] || return 0
294
295         if [ -z "$MDSFS" -o -z "$MDSDEV" ]; then
296                 echo "error: setup_mds: MDSFS or MDSDEV unset" 1>&2
297                 return -1
298         fi
299
300         [ "$1" ] && DO_FS=$1
301         if [ "$DO_FS" != "new_fs" -a "$DO_FS" != "old_fs" ]; then
302                 echo "usage: setup_mds {new_fs|old_fs}" 1>&2
303                 return -1
304         fi
305
306         if $OBDCTL name2dev MDSDEV > /dev/null 2>&1; then
307                 echo "$0: MDSDEV is already configured"
308                 return 0
309         fi
310
311         $DO_FS ${MDSFS} ${MDSDEV} ${MDSSIZE}
312         MDS=${LOOPDEV}
313
314         $OBDCTL <<- EOF || return $?
315         newdev
316         attach mds MDSDEV MDSUUID  
317         setup ${MDS} ${MDSFS}
318         quit
319         EOF
320         list_mods
321 }
322
323 setup_mds_lov() { 
324
325         [ "$SETUP_MDS" = "y" ] || return 0
326
327         if [ -z "$LOVUUID" ]; then
328             echo "No LOV configured"
329             return
330         fi
331
332         $OBDCTL <<- EOF || return $?
333         name2dev MDSDEV
334         connect 
335         lovconfig ${LOVUUID} 1 4096 0 OSCUUID
336         disconnect
337         quit
338         EOF
339
340         list_mods
341 }
342
343
344 setup_ost() {
345         [ "$SETUP_OST" = "y" ] || return 0
346
347         if [ -z "$OSTTYPE" ]; then
348                 echo "error: setup_ost: OSTTYPE unset" 1>&2
349                 return -1
350         fi
351
352         case $OSTTYPE in
353         obdecho)        OBD=
354                         OBDARG=
355                         NEED_FS=n
356                 ;;
357         obdext2)        OBDARG=
358                         NEED_FS=y
359                 ;;
360         obdfilter)      OBDARG=$OSTFS
361                         NEED_FS=y
362                 ;;
363         *)      echo "error: setup_ost: unknown OSTTYPE '$OSTTYPE'" 1>&2
364                 return -1
365                 ;;
366         esac
367
368         if $OBDCTL name2dev OBDDEV > /dev/null 2>&1; then
369                 echo "$0: OBDDEV is already configured"
370                 return 0
371         fi
372
373         if [ "$NEED_FS" = "y" ]; then
374                 [ "$1" ] && DO_FS=$1
375                 if [ -z "$OSTFS" -o -z "$OSTDEV" ]; then
376                         echo "error: setup_ost: OSTFS or OSTDEV unset" 1>&2
377                         return -1
378                 fi
379
380                 if [ "$DO_FS" != "new_fs" -a "$DO_FS" != "old_fs" ]; then
381                         echo "usage: setup_ost {new_fs|old_fs}" 1>&2
382                         return -1
383                 fi
384
385                 $DO_FS ${OSTFS} ${OSTDEV} ${OSTSIZE}
386                 OBD=${LOOPDEV}
387         fi
388
389         $OBDCTL <<- EOF || return $?
390         newdev
391         attach ${OSTTYPE} OBDDEV OBDUUID
392         setup ${OBD} ${OBDARG}
393         quit
394         EOF
395         list_mods
396
397         $OBDCTL <<- EOF || return $?
398         newdev
399         attach ost OSTDEV OSTUUID
400         setup \$OBDDEV
401         quit
402         EOF
403         list_mods
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         list_mods
431 }
432
433 setup_mdc() {
434         set -vx
435         [ "$SETUP_MDC" != "y" ] && return 0
436         [ "$MDC_NAMES" ] || MDC_NAMES=MDCDEV
437
438         for THEMDC in $MDC_NAMES ; do 
439             MDCDEVNO=`find_devno $THEMDC`
440         if $OBDCTL name2dev $THEMDC > /dev/null 2>&1; then
441                 echo "$0: MDCDEV is already configured"
442                 return 0
443         fi
444
445         $OBDCTL <<- EOF || return $?
446         newdev
447         attach mdc $THEMDC  ${THEMDC}-UUID
448         setup MDSUUID $MDSNODE
449         quit
450         EOF
451         done
452         list_mods
453 }
454
455 setup_lov () { 
456         [ "$SETUP_MDC" != "y" ] && return 0
457
458         if [ -z "$LOVUUID" ]; then
459             echo "No LOV configured"
460             return
461         fi
462
463         $OBDCTL <<- EOF || return $?
464         newdev
465         attach lov LOVNAME  ${LOVUUID}
466         setup  MDCDEV-UUID
467         quit
468         EOF
469         list_mods
470 }        
471
472
473 setup_mount() {
474         set -vx
475         [ "$SETUP_MOUNT" != "y" ] && return 0
476         [ "$MDC_NAMES" ] || MDC_NAMES=MDCDEV
477         [ "$OSC_NAMES" ] || OSC_NAMES=OSCDEV
478         [ -z "$MOUNT_LIST" -a "$OSCMT" ] && MOUNT_LIST="MT" && MT="$OSCMT OSCDEV MDCDEV"
479
480         [ "$MOUNT_LIST" ] || fail "error: $0: MOUNT_LIST unset"
481
482         for THEMOUNT in $MOUNT_LIST; do
483             eval "echo \$$THEMOUNT" | while read MTPT THEOSC THEMDC; do
484                 if mount | grep -q $MTPT; then
485                     echo "$0: $MTPT is already mounted"
486                     return 0
487                 fi
488
489                 [ ! -d $MTPT ] && mkdir $MTPT
490                 echo mount -t lustre_lite -o ost=${THEOSC}-UUID,mds=${THEMDC}-UUID none $MTPT
491                 mount -t lustre_lite -o ost=${THEOSC}-UUID,mds=${THEMDC}-UUID none $MTPT
492             done
493         done
494 }
495
496 setup_client() {
497         # setup_osc && setup_mdc && setup_lov  && setup_mount
498         setup_osc && setup_mdc && setup_mount
499 }
500
501 DEBUG_ON="echo 0xffffffff > /proc/sys/portals/debug"
502 DEBUG_OFF="echo 0 > /proc/sys/portals/debug"
503
504 debug_server_off() {
505         [ "$MDS_RSH" ] && echo "Turn OFF debug on MDS" && $MDS_RSH "$DEBUG_OFF"
506         [ "$OST_RSH" ] && echo "Turn OFF debug on OST" && $OST_RSH "$DEBUG_OFF"
507 }
508
509 debug_server_on() {
510         [ "$MDS_RSH" ] && echo "Turn ON debug on MDS" && $MDS_RSH "$DEBUG_ON"
511         [ "$OST_RSH" ] && echo "Turn ON debug on OST" && $OST_RSH "$DEBUG_ON"
512 }
513
514 debug_client_off() {
515         echo "Turning OFF debug on client" && $OSC_RSH "$DEBUG_OFF"
516 }
517
518 debug_client_on() {
519         echo "Turning ON debug on client" && $OSC_RSH "$DEBUG_ON"
520 }
521
522 cleanup_portals() {
523         [ -z "$NETWORK" ] && NETWORK=tcp
524
525         setup_variables
526
527         $PTLCTL <<- EOF
528         setup $NETWORK
529         disconnect
530         del_uuid self
531         del_uuid $MDSNODE
532         del_uuid $OSTNODE
533         del_uuid $DLM
534         quit
535         EOF
536
537         do_rmmod ldlm
538         do_rmmod ptlrpc
539         do_rmmod obdclass
540
541         do_rmmod kptlrouter
542         do_rmmod kqswnal
543         do_rmmod ksocknal
544         do_rmmod portals
545 }
546
547 cleanup_lustre() {
548         killall acceptor
549
550         do_rmmod llite
551         do_rmmod lov
552         do_rmmod mdc
553         do_rmmod osc
554
555         do_rmmod mds_extN
556         do_rmmod mds_ext3
557         do_rmmod mds_ext2
558         do_rmmod mds
559         do_rmmod ost
560         do_rmmod obdecho
561         do_rmmod obdfilter
562         do_rmmod obdext2
563         do_rmmod extN
564
565         losetup -d ${LOOP}0
566         losetup -d ${LOOP}1
567         losetup -d ${LOOP}2
568 }
569
570 cleanup_ldlm() {
571         [ "$SETUP" -a -z "$SETUP_LDLM" ] && return 0
572
573         LDLMDEVNO=`find_devno LDLMDEV`
574         if [ "$LDLMDEVNO" ]; then
575                 $OBDCTL <<- EOF
576                 device $LDLMDEVNO
577                 cleanup
578                 detach
579                 quit
580                 EOF
581         fi
582 }
583
584 cleanup_mds() {
585         [ "$SETUP" -a -z "$SETUP_MDS" ] && return 0
586
587         MDSDEVNO=`find_devno MDSDEV`
588         if [ "$MDSDEVNO" ]; then
589                 $OBDCTL <<- EOF
590                 device $MDSDEVNO
591                 cleanup
592                 detach
593                 quit
594                 EOF
595         fi
596 }
597
598 cleanup_ost() {
599         [ "$SETUP" -a -z "$SETUP_OST" ] && return 0
600
601         OSTDEVNO=`find_devno OSTDEV`
602         if [ "$OSTDEVNO" ]; then
603                 $OBDCTL <<- EOF
604                 device $OSTDEVNO
605                 cleanup
606                 detach
607                 quit
608                 EOF
609         fi
610
611         OBDDEVNO=`find_devno OBDDEV`
612         if [ "$OBDDEVNO" ]; then
613                 $OBDCTL <<- EOF
614                 device $OBDDEVNO
615                 cleanup
616                 detach
617                 quit
618                 EOF
619         fi
620 }
621
622 cleanup_server() {
623         cleanup_ost && cleanup_mds
624 }
625
626 cleanup_mount() {
627         set -vx
628         [ "$SETUP_MOUNT" != "y" ] && return 0
629         [ "$MDC_NAMES" ] || MDC_NAMES=MDCDEV
630         [ "$OSC_NAMES" ] || OSC_NAMES=OSCDEV
631         [ -z "$MOUNT_LIST" -a "$OSCMT" ] && MOUNT_LIST="MT" && MT="$OSCMT OSCDEV MDCDEV"
632
633         [ "$MOUNT_LIST" ] || fail "error: $0: MOUNT_LIST unset"
634
635         for THEMOUNT in $MOUNT_LIST; do
636             eval "echo \$$THEMOUNT" | while read MTPT THEOSC THEMDC; do
637                 if [ "`mount | grep $MTPT`" ]; then
638                     umount $MTPT || fail "unable to unmount $MTPT"
639                 fi
640             done
641         done
642 }
643
644 cleanup_osc() {
645         [ "$SETUP" -a -z "$SETUP_OSC" ] && return 0
646         [ "$OSC_NAMES" ] || OSC_NAMES=OSCDEV
647
648         for THEOSC in $OSC_NAMES ; do 
649             OSCDEVNO=`find_devno $THEOSC`
650             if [ "$OSCDEVNO" ]; then
651                 $OBDCTL <<- EOF
652                 device $OSCDEVNO
653                 cleanup
654                 detach
655                 quit
656                 EOF
657             fi
658         done
659 }
660
661 cleanup_mdc() {
662         [ "$SETUP" -a -z "$SETUP_MDC" ] && return 0
663         [ "$MDC_NAMES" ] || MDC_NAMES=MDCDEV
664
665         for THEMDC in $MDC_NAMES ; do 
666             MDCDEVNO=`find_devno $THEMDC`
667             if [ "$MDCDEVNO" ]; then
668                 $OBDCTL <<- EOF
669                 device $MDCDEVNO
670                 cleanup
671                 detach
672                 quit
673                 EOF
674             fi
675         done
676 }
677
678 cleanup_rpc() {
679         RPCDEVNO=`find_devno RPCDEV`
680         if [ "$RPCDEVNO" ]; then
681                 $OBDCTL <<- EOF
682                 device $RPCDEVNO
683                 cleanup
684                 detach
685                 quit
686                 EOF
687         fi
688 }
689
690 cleanup_client() {
691         cleanup_mount && cleanup_osc && cleanup_mdc && cleanup_rpc
692 }
693
694 fail() { 
695     echo "ERROR: $1" 1>&2
696     [ $2 ] && RC=$2 || RC=1
697     exit $RC
698 }