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