2 # @(#)sfs_mgr 2.1 97/10/23
4 # Copyright (c) 1992-1997,2001 by Standard Performance Evaluation Corporation
6 # Standard Performance Evaluation Corporation (SPEC)
7 # 6585 Merchant Palce, Suite 100
9 # This product contains benchmarks acquired from several sources who
10 # understand and agree with SPEC's goal of creating fair and objective
11 # benchmarks to measure computer performance.
13 # This copyright notice is placed here only to protect SPEC in the
14 # event the source is misused in any manner that is contrary to the
15 # spirit, the goals and the intent of SPEC.
17 # The source code is provided to the user or company under the license
18 # agreement for the SPEC Benchmark Suite for this product.
20 # *****************************************************************
22 # * Copyright 1991,1992 Legato Systems, Inc. *
23 # * Copyright 1991,1992 Auspex Systems, Inc. *
24 # * Copyright 1991,1992 Data General Corporation *
25 # * Copyright 1991,1992 Digital Equipment Corporation *
26 # * Copyright 1991,1992 Interphase Corporation *
27 # * Copyright 1991,1992 Sun Microsystems, Inc. *
29 # *****************************************************************
31 # Usage sfs_mgr [-r <rc file>] [-s <suffix>] [-v <level>]
33 # Teelucksingh - Creation (6/17/91)
35 # Starts SFS (sfs_mcr) on clients with parameters
36 # specified in sfs_rc .
37 # Starts Prime-client program (sfs_prime)
38 # Can have multiple runs with incrementing load
39 # Summarized result(s) placed in sfsres.<suffix>
40 # Log of multi-client run placed in sfslog.<suffix>
41 # Individual client result(s) placed in sfs<cnnn>.<suffix>
45 # --------------- defined constants and strings --------------
48 STARline='************************************************************************'
49 RHOSTSCKMSG1="Ensure permissions in .rhosts or hosts.equiv allows remote operation."
50 RHOSTSCKMSG2="Or check target directory/file existence or permissions."
51 USAGE="usage: $0 [-r <rc file>] [-s <suffix>] [-v <level>]"
53 # ----------------- variable initialization ------------------
58 # --------------- program initialization phase ---------------
60 # get the command line arguments
98 # pass in environment variables from sfs_rc
100 if [ ! -r "$RC_FILE" ]; then
101 echo "sfs_mgr: missing or protected rc file $RC_FILE"
107 # Make sure WORK_DIR is defined
109 if [ "$WORK_DIR" = "" ]
111 echo "sfs_mgr: WORK_DIR not defined, check sfs_rc file, exiting."
116 # Prime client output files
118 P_OUTFILE=$WORK_DIR/sfsres.$SUFFIX
119 P_SUMFILE=$WORK_DIR/sfssum.$SUFFIX
120 P_LOGFILE=$WORK_DIR/sfslog.$SUFFIX
121 P_VALFILE=$WORK_DIR/sfsval.$SUFFIX
126 SFS_PNT_PID="/tmp/sfs_pnt_pid"
127 SFS_PRM_PID="/tmp/sfs_prm_pid"
128 SFS_SYNCD_PID="/tmp/sfs_syncd_pid"
131 # --------------------
132 # Setup machine/OS dependant parameters
134 # decide whether to use BSD (which one) or SYSV variant of commands
136 # do echo test to get no end-of-line character
139 if [ "$op" = "\c" ]; then
148 # do test to see whether to use hostname or uname
150 if sh -c "hostname > /dev/null 2>&1" > /dev/null 2>&1
152 HOSTNAME_VAL=`hostname`
153 elif sh -c "uname -n > /dev/null 2>&1" > /dev/null 2>&1
155 HOSTNAME_VAL=`uname -n`
157 echo "sfs_mgr: can't use hostname(1) or uname(1), exiting."
158 echo "sfs_mgr: can't use hostname(1) or uname(1), exiting." \
164 # Make sure RSH is defined, if not set reasonable default
165 # RSH_CMD overrides RSH if set
167 if [ "$RSH_CMD" != "" ]
178 # If CPP is not already defined then
179 # try to find cpp in the common places, if not there then let PATH find it
181 if [ "$CPP" = "" ]; then
185 elif [ -f /usr/ccs/lib/cpp ]
194 # trap for signals used by sfs programs
196 if [ "$TRAP_NUMS" = "" ]
198 echo "#include <signal.h>" > /tmp/sfs_tmp1
199 echo "myprint SIGINT SIGALRM SIGTERM SIGUSR1 SIGUSR2" >> /tmp/sfs_tmp1
200 cat /tmp/sfs_tmp1 | $CPP | grep myprint | \
201 awk '{print $2 " " $3 " " $4 " " $5 " " $6}' > /tmp/sfs_tmp2
202 TRAP_NUMS=`cat /tmp/sfs_tmp2`
204 rm -f /tmp/sfs_tmp1 /tmp/sfs_tmp2
206 # --------------------
209 # Get NFS version number
212 if [ "$NFS_VERSION" != "" ]
214 if [ "$NFS_VERSION" = "3" ]
217 elif [ "$NFS_VERSION" != "2" ]
219 echo "sfs_mgr: Illegal NFS version number: $NFS_VERSION" \
221 echo "sfs_mgr: Illegal NFS version number: $NFS_VERSION"
227 # print logfile header information
229 echo '========================================================================'\
231 echo " " >>$P_LOGFILE
232 echo "SFS NFS Benchmark Prime Client Logfile." >>$P_LOGFILE
233 echo " Creation Date: `date`" >>$P_LOGFILE
234 echo " Prime Client hostname: $HOSTNAME_VAL" >>$P_LOGFILE
237 # check for mixfile and block-size file
242 if [ "$MIXFILE" != "" -a ! -r "$WORK_DIR/$MIXFILE" ]
244 echo "sfs_mgr: error missing or protected mixfile $WORK_DIR/$MIXFILE" \
246 echo "sfs_mgr: error missing or protected mixfile $WORK_DIR/$MIXFILE"
251 # check for block size file
253 if [ "$BLOCK_FILE" != "" -a ! -r "$WORK_DIR/$BLOCK_FILE" ]
255 echo "sfs_mgr: error missing or protected block size file \
256 $WORK_DIR/$BLOCK_FILE" >> $P_LOGFILE 2>&1
257 echo "sfs_mgr: error missing or protected block size file \
258 $WORK_DIR/$BLOCK_FILE"
266 for i in $CLIENTS; do
267 NUM_CLIENTS=`expr $NUM_CLIENTS + 1`
269 # hack: First try a simple remote "echo" to
270 # /dev/null. If the $RSH fails, then we don't have
271 # permission to execute the remote command sfs_mcr.
272 # The initial probe is necessary because we must
273 # background the sfs_mcr rsh because we're looping
274 # on all clients, and spawn a bunch, and the rsh won't
275 # detach from the command. So, the probe.
277 $RSH $i -l $SFS_USER "echo >/dev/null" >/dev/null 2>&1 </dev/null
278 if [ $? -ne 0 ]; then
279 echo "sfs_mgr: test rsh to $i failed"
280 echo " $RHOSTSCKMSG1"
281 echo "sfs_mgr: test rsh to $i failed" >> $P_LOGFILE
282 echo " $RHOSTSCKMSG1" >> $P_LOGFILE
286 # Get canonical hostname of client $i and see if it is the prime client.
287 client_name=`$RSH $i -l $SFS_USER 'hostname || uname -n' 2>/dev/null </dev/null`
288 if [ "$client_name" = $HOSTNAME_VAL ]
290 PRIME_CLIENT_NUM=$NUM_CLIENTS
294 # Also check to make sure the work directory exists
296 exists=`$RSH $i -l $SFS_USER sh -c \"if [ -d $WORK_DIR ]\; then echo 0 \; else echo 1 \; fi\" </dev/null`
297 if [ "$exists" != 0 ]; then
298 echo "sfs_mgr: $WORK_DIR on $i does not exist"
299 echo "sfs_mgr: $WORK_DIR on $i does not exist" >> $P_LOGFILE
303 # propagate the mixfile to remote clients
305 if [ "$MIXFILE" != "" ]; then
306 rcp "$WORK_DIR/$MIXFILE" \
307 "$SFS_USER"@"$i":"$WORK_DIR/$MIXFILE" >> $P_LOGFILE 2>&1
308 if [ $? -ne 0 ]; then
310 "sfs_mgr: can't rcp mix file $WORK_DIR/$MIXFILE to client $i."
311 echo " $RHOSTSCKMSG1"
312 echo " $RHOSTSCKMSG2"
314 "sfs_mgr: can't rcp mix file $WORK_DIR/$MIXFILE to client $i." \
316 echo " $RHOSTSCKMSG1" >> $P_LOGFILE
317 echo " $RHOSTSCKMSG2" >> $P_LOGFILE
322 # propagate block size file to remote clients
324 if [ "$BLOCK_FILE" != "" ]; then
325 rcp "$WORK_DIR/$BLOCK_FILE" \
326 "$SFS_USER"@"$i":"$WORK_DIR/$BLOCK_FILE" >> $P_LOGFILE 2>&1
327 if [ $? -ne 0 ]; then
329 "sfs_mgr: can't rcp block size file $WORK_DIR/$BLOCK_FILE to client $i."
330 echo " $RHOSTSCKMSG1"
331 echo " $RHOSTSCKMSG2"
333 "sfs_mgr: can't rcp block size file $WORK_DIR/$BLOCK_FILE to client $i." \
335 echo " $RHOSTSCKMSG1" >> $P_LOGFILE
336 echo " $RHOSTSCKMSG2" >> $P_LOGFILE
342 if [ "$NUM_CLIENTS" -eq 0 ]; then
343 echo "Cannot run SFS with no clients."
344 echo "Assign value to CLIENT variable in sfs_rc."
345 echo "Cannot run SFS with no clients." >> $P_LOGFILE
346 echo "Assign value to CLIENT variable in sfs_rc." >> $P_LOGFILE
351 echo " Number of Clients: $NUM_CLIENTS" >>$P_LOGFILE
352 echo " Client hostname(s): $CLIENTS" >>$P_LOGFILE
353 echo " " >>$P_LOGFILE
356 # Loop invariant setup
357 # -------------------
359 # check for program that starts external monitoring
361 if [ "$PRIME_MON_SCRIPT" != "" -a ! -x "$WORK_DIR/$PRIME_MON_SCRIPT" ]
363 echo "sfs_mgr: error missing or not executeable program \
364 $WORK_DIR/$PRIME_MON_SCRIPT" >> $P_LOGFILE 2>&1
365 echo "sfs_mgr: error missing or not executeable program \
366 $WORK_DIR/$PRIME_MON_SCRIPT"
371 # Set default number of procs if missing
374 if [ "$PRCS" = "" ]; then
378 if [ "$MNT_POINTS" = "" ]; then
379 echo "sfs_mgr: MNT_POINTS not specified" >> $P_LOGFILE 2>&1
380 echo "sfs_mgr: MNT_POINTS not specified"
384 set `echo $MNT_POINTS`
386 MPC=`expr $NUM_CLIENTS \* $PRCS`
387 if [ $NUM_MNTS -ne 1 -a $NUM_MNTS -ne $PRCS -a $NUM_MNTS -ne $MPC ]; then
389 if [ $PROCS -ne $MPC ]; then
392 echo "sfs_mgr: incorrect number of MNT_POINTS ($NUM_MNTS) must be $PROCS $ESTR" >> $P_LOGFILE 2>&1
393 echo "sfs_mgr: incorrect number of MNT_POINTS ($NUM_MNTS) must be $PROCS $ESTR"
403 # clean up any 'old' sfs processes
405 if [ -f $SFS_PRM_PID ]; then
406 kill -2 `cat $SFS_PRM_PID` > /dev/null 2>&1
409 if [ -f $SFS_PNT_PID ]; then
410 kill -2 `cat $SFS_PNT_PID` > /dev/null 2>&1
413 if [ -f $SFS_SYNCD_PID ]; then
414 kill -2 `cat $SFS_SYNCD_PID` > /dev/null 2>&1
419 # Prime Client sfs_syncd logfile
421 S_LOGFILE=$WORK_DIR/syncd_$PRIME_CLIENT_NUM.log
424 # Determine the number of test runs (TOTAL_RUNS)
425 # from user supplied values in sfs_rc
431 # get the number of LOAD elements (NUM_LOADS)
434 NUM_LOADS=`expr $NUM_LOADS + 1`
437 # if NUM_LOADS > 1 then the number of test runs (TOTAL_RUNS) = NUM_LOADS and
438 # Report conflict if user specifies multiple LOAD elements as well as
441 # if NUM_LOADS <= 1 then the number of test runs (TOTAL_RUNS) = NUM_RUNS
443 if [ "$NUM_LOADS" -gt 1 ]; then
444 TOTAL_RUNS=$NUM_LOADS
446 if [ "$NUM_RUNS" -gt 1 ]; then
447 echo "Cannot specify an array of LOAD values as well as NUM_RUNS >1."
448 echo "Cannot specify an array of LOAD values as well as NUM_RUNS >1." \
454 if [ "$NUM_LOADS" -eq 0 ]; then
459 while [ "$i" -lt "$NUM_RUNS" ]; do
460 LOAD_ARRAY="$LOAD_ARRAY `expr $LOAD + $i \* $INCR_LOAD`"
466 # Loop invariant parameters
467 # create parameter strings here ... from sfs_rc values.
468 # - SFS_PARAM : sfs parameters
469 # - SFS_VPARAM : sfs validation parameters
470 # - SFS_PRIME_PARAM : sfs_prime parameters
477 if [ "$RUNTIME" -ne 0 ]; then
478 SFS_PARAM="$SFS_PARAM -t $RUNTIME"
479 SFS_PRIME_PARAM="$SFS_PRIME_PARAM -t $RUNTIME"
483 # get mixfile filename, if specified
485 if [ "$MIXFILE" != "" ]; then
486 SFS_PARAM="$SFS_PARAM -m $WORK_DIR/$MIXFILE"
487 SFS_PRIME_PARAM="$SFS_PRIME_PARAM -m $WORK_DIR/$MIXFILE"
491 # get sfs DEBUG level
493 if [ "$DEBUG" != "" ]; then
494 SFS_PARAM="$SFS_PARAM -d $DEBUG"
495 SFS_PRIME_PARAM="$SFS_PRIME_PARAM -d $DEBUG"
499 # get access percentage
501 if [ "$ACCESS_PCNT" -ne 0 ]; then
502 SFS_PARAM="$SFS_PARAM -a $ACCESS_PCNT"
503 SFS_PRIME_PARAM="$SFS_PRIME_PARAM -a $ACCESS_PCNT"
507 # get append percentage
509 if [ "$APPEND_PCNT" -ne 0 ]; then
510 SFS_PARAM="$SFS_PARAM -A $APPEND_PCNT"
511 SFS_PRIME_PARAM="$SFS_PRIME_PARAM -A $APPEND_PCNT"
517 if [ "$BLOCK_SIZE" -ne 0 ]; then
518 SFS_PARAM="$SFS_PARAM -B $BLOCK_SIZE"
519 SFS_PRIME_PARAM="$SFS_PRIME_PARAM -B $BLOCK_SIZE"
523 # get block size filename, if specified
525 if [ "$BLOCK_FILE" != "" ]; then
526 SFS_PARAM="$SFS_PARAM -b $WORK_DIR/$BLOCK_FILE"
527 SFS_PRIME_PARAM="$SFS_PRIME_PARAM -b $WORK_DIR/$BLOCK_FILE"
531 # get maximum number of outstanding biod reads
533 if [ "$BIOD_MAX_READS" != "" ]; then
534 SFS_PARAM="$SFS_PARAM -R $BIOD_MAX_READS"
535 SFS_PRIME_PARAM="$SFS_PRIME_PARAM -R $BIOD_MAX_READS"
539 # get maximum number of outstanding biod writes
541 if [ "$BIOD_MAX_WRITES" != "" ]; then
542 SFS_PARAM="$SFS_PARAM -W $BIOD_MAX_WRITES"
543 SFS_PRIME_PARAM="$SFS_PRIME_PARAM -W $BIOD_MAX_WRITES"
547 # get directory count
549 if [ "$DIR_COUNT" -ne 0 ]; then
550 SFS_PARAM="$SFS_PARAM -D $DIR_COUNT"
556 if [ -n "$FILE_COUNT" ]; then
557 if [ "$FILE_COUNT" -ne 0 ]; then
558 SFS_PARAM="$SFS_PARAM -F $FILE_COUNT"
563 # get symbolic link count
565 if [ "$SYMLINK_COUNT" -ne 0 ]; then
566 SFS_PARAM="$SFS_PARAM -S $SYMLINK_COUNT"
570 # set flag for raw data dump if option set
572 if [ "$DUMP" != "" ]; then
573 SFS_PARAM="$SFS_PARAM -z"
574 SFS_PRIME_PARAM="$SFS_PRIME_PARAM -z"
578 # set flag for NFS/TCP if variable is "1" or "on"
582 if [ "$TCP" = "1" -o "$TCP" = "on" ]; then
583 SFS_PARAM="$SFS_PARAM -Q"
584 SFS_VPARAM="$SFS_VPARAM -Q"
585 SFS_PRIME_PARAM="$SFS_PRIME_PARAM -Q"
590 # get number of processes
592 if [ "$PROCS" -ne 0 ]; then
593 SFS_PARAM="$SFS_PARAM -p $PROCS"
594 SFS_PRIME_PARAM="$SFS_PRIME_PARAM -p $PROCS"
598 # get warm-up value (allow 0 warmup)
600 if [ "$WARMUP_TIME" != "" ]; then
601 SFS_PARAM="$SFS_PARAM -w $WARMUP_TIME"
602 SFS_PRIME_PARAM="$SFS_PRIME_PARAM -w $WARMUP_TIME"
606 # get sfs_prime sleep value
608 if [ "${PRIME_SLEEP:-0}" -gt 0 ]; then
609 SFS_PRIME_PARAM="$SFS_PRIME_PARAM -s $PRIME_SLEEP"
613 # get file set percentage delta
615 if [ "$FILESET_DELTA" != "" ]; then
616 SFS_PARAM="$SFS_PARAM -f $FILESET_DELTA"
617 SFS_PRIME_PARAM="$SFS_PRIME_PARAM -f $FILESET_DELTA"
621 # get sfs_prime timeout value
623 if [ "${PRIME_TIMEOUT:-0}" -gt 0 ]; then
624 SFS_PRIME_PARAM="$SFS_PRIME_PARAM -x $PRIME_TIMEOUT"
628 # get populate only flag
630 if [ "$POPULATE" != "" ]; then
631 SFS_PARAM="$SFS_PARAM -P"
635 # check for program that starts external monitoring
637 if [ "$PRIME_MON_SCRIPT" != "" ]; then
638 SFS_PRIME_PARAM="$SFS_PRIME_PARAM -k $WORK_DIR/$PRIME_MON_SCRIPT"
639 # check for parameters to the monitor program; use a different method
640 # to test for nonempty because the arguments may start with a hyphen,
641 # which would confuse the "test" command.
642 if [ "x$PRIME_MON_ARGS" != "x" ]; then
643 SFS_PRIME_PARAM="$SFS_PRIME_PARAM -K '$PRIME_MON_ARGS'"
646 echo "" >> $P_LOGFILE
650 # Add clients to prime
652 SFS_PRIME_PARAM="$SFS_PRIME_PARAM $CLIENTS"
655 # get prime client hostname
657 SFS_PARAM="$SFS_PARAM -M $HOSTNAME_VAL"
659 #### End client loop invariant section
663 if [ "$VALIDATE" -gt 0 ]; then
664 echo "Executing SFS NFS Validation ..."
666 # if validate option used then take the first client
667 # from the CLIENT array and run the SFS validation
668 # suite using the first element on the MOUNT_PNTS list.
673 set `echo $MNT_POINTS`
676 if [ $NUM_MNTS -eq 1 -a -f "$WORK_DIR/$VALID_MOUNT_PNT" ]
679 # If the mount point and is actually a file
680 # name then we assume that it is a file containing a list
681 # of mount points one line per client, possibly of the format
684 MNT_PTS=`while read CLNT_LINE MNT_LINE
686 if [ $VALID_CLIENT = $CLNT_LINE ]
691 done < $WORK_DIR/$VALID_MOUNT_PNT`
697 echo "Starting SFS NFS validation on client ($VALID_CLIENT)"
698 echo " $SFS_DIR/$SFS_PROG $SFS_VPARAM -V $VALID_LEVEL $VALID_MOUNT_PNT"
699 echo "Starting SFS Validation suite on client ($VALID_CLIENT)" \
701 echo " $SFS_DIR/$SFS_PROG $SFS_VPARAM -V $VALID_LEVEL $VALID_MOUNT_PNT" \
704 # Get canonical hostname of $VALID_CLIENT and see if it is the prime client.
705 client_name=`$RSH $VALID_CLIENT -l $SFS_USER 'hostname || uname -n' 2>/dev/null </dev/null`
706 if [ "$client_name" = $HOSTNAME_VAL ]; then
707 $SFS_DIR/$SFS_PROG $SFS_VPARAM -V $VALID_LEVEL $VALID_MOUNT_PNT \
709 # if error then clean-up and exit
710 if [ $? -ne 0 ]; then
711 echo "SFS NFS validation failed."
712 echo "See $P_VALFILE for results."
715 echo "SFS NFS validation completed successfully."
716 echo "See $P_VALFILE for results."
720 $RSH $VALID_CLIENT -l $SFS_USER \
722 $SFS_DIR/$SFS_PROG $SFS_VPARAM -V $VALID_LEVEL $VALID_MOUNT_PNT )" \
724 if [ $? -ne 0 ]; then
726 "sfs_mgr: can't run validation pass of sfs on client $VALID_CLIENT."
727 echo " $RHOSTSCKMSG1"
729 "sfs_mgr: can't run validation pass of sfs on client $VALID_CLIENT." \
731 echo " $RHOSTSCKMSG1" >> $P_LOGFILE
734 # if error then clean-up and exit
735 tail -1 $P_VALFILE | grep -s 'validation completed successfully'
736 if [ $? -ne 0 ]; then
737 echo "SFS NFS validation failed."
738 echo "See $P_VALFILE for results."
739 echo "SFS NFS validation failed." >> $P_LOGFILE
740 echo "See $P_VALFILE for results." >> $P_LOGFILE
743 echo "SFS NFS validation completed successfully."
744 echo "See $P_VALFILE for results."
745 echo "SFS NFS validation completed successfully." >> $P_LOGFILE
746 echo "See $P_VALFILE for results." >> $P_LOGFILE
754 # Prime client /tmp logfiles - used for clean up
756 PRIME_LOG_FILES="/tmp/sfs_PC_sync \
757 /tmp/sfs_x$PRIME_CLIENT_NUM \
758 /tmp/sfs_CL$PRIME_CLIENT_NUM \
759 /tmp/sfs_mpr$PRIME_CLIENT_NUM \
767 for LOAD_INDEX in $LOAD_ARRAY; do
768 LOAD_VALUE=`expr $LOAD_INDEX / $NUM_CLIENTS`
770 export LOAD_VALUE LOAD_INDEX SUFFIX WORK_DIR
773 echo "$STARline" >> $P_LOGFILE
774 echo "$STARline" >> $P_OUTFILE
777 # clean up /tmp files
779 for i in $PRIME_LOG_FILES; do
784 echo "sfs_mgr: error could not remove file - $i"
785 echo "sfs_mgr: error could not remove file - $i" >> $P_LOGFILE
791 # restart the sfs_syncd process
793 if [ -f $SFS_SYNCD_PID ]; then
794 kill -2 `cat $SFS_SYNCD_PID` > /dev/null 2>&1
800 echo "Test Run $RUN of $TOTAL_RUNS" >>$P_LOGFILE
801 echo " " >>$P_LOGFILE
803 $ECHO_NONL " Executing run $RUN of $TOTAL_RUNS ... $NONL"
804 sh -c "$SFS_DIR/sfs_syncd >> $S_LOGFILE 2>&1 &"
806 echo "Started: sfs_syncd on Prime-Client ($HOSTNAME_VAL)" \
810 # start sfs on all the clients
813 for i in $CLIENTS; do
815 # compose client's logfile name
817 if [ "$CLIENTS_NUM" -lt 10 ]; then
818 C_LOGFILE="$WORK_DIR"/sfsc00"$CLIENTS_NUM"."$SUFFIX"
819 elif [ "$CLIENTS_NUM" -lt 100 ]; then
820 C_LOGFILE="$WORK_DIR"/sfsc0"$CLIENTS_NUM"."$SUFFIX"
822 C_LOGFILE="$WORK_DIR"/sfsc"$CLIENTS_NUM"."$SUFFIX"
826 # compose client's sfs_syncd logfile name
828 S_LOGFILE=$WORK_DIR/syncd_$CLIENTS_NUM.log
830 if [ $NUM_MNTS -eq 1 -a -f "$WORK_DIR/$MNT_POINTS" ]
833 # If there is only one mount point and it is actually a file
834 # name then we assume that it is a file containing a list
835 # of mount points one line per client, possibly of the format
838 MNT_PTS=`while read CLNT_LINE MNT_LINE
840 if [ $i = $CLNT_LINE ]
845 done < $WORK_DIR/$MNT_POINTS`
848 # construct MNT_PTS for this particular CLIENTS_NUM (client)
849 # from MNT_POINTS, using total number of CLIENTS
850 # and PRCS [number of processes per client]
852 # PRCS must be a multiple of NUM_MNTS,
853 # no need to resequence the list of mount points
855 MNT_PTS="$MNT_POINTS"
859 # if prime client in $CLIENT then start sfs locally
861 client_name=`$RSH $i -l $SFS_USER 'hostname || uname -n' 2>/dev/null </dev/null`
862 if [ "$client_name" = $HOSTNAME_VAL ]; then
863 echo "`date` $i start:" >>$P_LOGFILE
864 echo " $SFS_PROG -N $CLIENTS_NUM -l $LOAD_VALUE $SFS_PARAM $MNT_PTS" \
868 $SFS_DIR/$SFS_PROG -N $CLIENTS_NUM -l $LOAD_VALUE $SFS_PARAM $MNT_PTS \
872 # Cause remote client to cleanup
874 $RSH $i -l $SFS_USER "( cd $WORK_DIR; \
875 $SFS_DIR/sfs_mcr cleanup )" >>/dev/null 2>&1 </dev/null
878 # remotely start sfs_mcr script on clients
880 echo "`date` $i start:" >>$P_LOGFILE
881 echo " $SFS_PROG -N $CLIENTS_NUM -l $LOAD_VALUE $SFS_PARAM $MNT_PTS" \
884 $RSH $i -l $SFS_USER "( cd $WORK_DIR; \
885 $SFS_DIR/sfs_mcr $SFS_PROG $SFS_DIR \
886 $S_LOGFILE $C_LOGFILE $CLIENTS_NUM \
887 -l $LOAD_VALUE $SFS_PARAM $MNT_PTS ) &"\
888 >>/dev/null 2>&1 </dev/null &
892 # increment client num
894 CLIENTS_NUM=`expr $CLIENTS_NUM + 1`
898 # start the Prime client program, sfs_prime,
899 # and wait for completion
902 $SFS_DIR/sfs_prime -l $LOAD_VALUE -C $P_SUMFILE $SFS_PRIME_PARAM \
903 > /tmp/sfs_mpr$PRIME_CLIENT_NUM 2>> $P_LOGFILE
906 # if error then clean-up set error flag, and break out
908 if [ $? -ne 0 ]; then
909 echo "sfs_mgr: sfs_prime returned an error, exiting"
910 echo "sfs_mgr: sfs_prime returned an error, exiting" \
912 if [ -f $SFS_PNT_PID ]; then
913 kill -2 `cat $SFS_PNT_PID` > /dev/null 2>&1
916 if [ -f $SFS_SYNCD_PID ]; then
917 kill -2 `cat $SFS_SYNCD_PID` > /dev/null 2>&1
921 break # break out of for loop
927 cat /tmp/sfs_mpr$PRIME_CLIENT_NUM >> $P_LOGFILE
928 cat /tmp/sfs_mpr$PRIME_CLIENT_NUM >> $P_OUTFILE
929 rm /tmp/sfs_mpr$PRIME_CLIENT_NUM >> $P_LOGFILE 2>&1
932 # increment RUN value and reset SFS_PARAM
937 echo "" >> $P_LOGFILE
938 echo "$STARline" >> $P_LOGFILE
939 echo "$STARline" >> $P_OUTFILE
942 # test run(s) completed
944 done # END OF MAIN CLIENT LOOP: 'for LOAD_INDEX in $LOAD_ARRAY'
947 # copy log files from clients
950 for i in $CLIENTS; do
952 # compose client's logfile name
954 if [ "$CLIENTS_NUM" -lt 10 ]; then
955 C_LOGFILE="$WORK_DIR"/sfsc00"$CLIENTS_NUM"."$SUFFIX"
956 elif [ "$CLIENTS_NUM" -lt 100 ]; then
957 C_LOGFILE="$WORK_DIR"/sfsc0"$CLIENTS_NUM"."$SUFFIX"
959 C_LOGFILE="$WORK_DIR"/sfsc"$CLIENTS_NUM"."$SUFFIX"
962 # Copy over the logfiles. We copy the files to a temporary
963 # file on the chance that either the prime client is also
964 # a load generating client and we might rcp a file over
965 # itself, or the $WORK_DIR is NFS mounted by all clients,
966 # in which case we don't want to really remove the remote
967 # file since it is the same as the 'local' file on the
968 # prime. While not necessarily efficient, this is correct.
970 client_name=`$RSH $i -l $SFS_USER 'hostname || uname -n' 2>/dev/null </dev/null`
971 if [ $client_name != $HOSTNAME_VAL ]; then
973 # copy to temporary file: of different name than target
974 # in off chance /tmp is our $WORK_DIR
976 rcp "$SFS_USER"@"$i":"$C_LOGFILE" \
977 /tmp/sfs"$CLIENTS_NUM"."$SUFFIX"
978 if [ $? -ne 0 ]; then
979 echo "sfs_mgr: can't rcp $C_LOGFILE from client $i."
980 echo " $RHOSTSCKMSG1"
981 echo " $RHOSTSCKMSG2"
982 echo "sfs_mgr: can't rcp $C_LOGFILE from client $i." >> $P_LOGFILE
983 echo " $RHOSTSCKMSG1" >> $P_LOGFILE
984 echo " $RHOSTSCKMSG2" >> $P_LOGFILE
987 $RSH $i -l $SFS_USER "/bin/rm $C_LOGFILE"
988 if [ $? -ne 0 ]; then
989 echo "sfs_mgr: can't remove $C_LOGFILE on client $i."
990 echo " $RHOSTSCKMSG1"
991 echo "sfs_mgr: can't remove $C_LOGFILE on client $i." >> $P_LOGFILE
992 echo " $RHOSTSCKMSG1" >> $P_LOGFILE
995 mv /tmp/sfs"$CLIENTS_NUM"."$SUFFIX" "$C_LOGFILE"
997 CLIENTS_NUM=`expr $CLIENTS_NUM + 1`
1001 # if we got an error, terminate sfs_mgr
1003 if [ "$error" = TRUE ]; then
1008 # copy 'raw data dump' files from clients
1009 # only do this for one point, the final one--it dosn't make
1010 # sense to concatenate dumps from different loads
1012 if [ "$DUMP" != "" ]; then
1014 for i in $CLIENTS; do
1016 # compose client's raw dump logfile name
1018 if [ "$CLIENTS_NUM" -lt 10 ]; then
1019 CLNTNUM=00"$CLIENTS_NUM"
1020 elif [ "$CLIENTS_NUM" -lt 100 ]; then
1021 CLNTNUM=0"$CLIENTS_NUM"
1023 CLNTNUM="$CLIENTS_NUM"
1026 if [ "$PRC" = "" ]; then
1030 while [ $PRCJ -lt $PRC ]; do
1031 if [ "$PRCJ" -lt 10 ]; then
1033 elif [ "$PRCJ" -lt 100 ]; then
1038 RAWFILE=c${CLNTNUM}-p${PROCNUM}
1040 # copy over the logfiles
1041 # clean out (remove) originals
1043 client_name=`$RSH $i -l $SFS_USER 'hostname || uname -n' 2>/dev/null </dev/null`
1044 if [ $client_name != $HOSTNAME_VAL ]; then
1045 $RSH $i -l $SFS_USER \
1046 cat /tmp/"$RAWFILE" \
1047 >> "$WORK_DIR"/"$RAWFILE"."$SUFFIX"
1048 $RSH $i -l $SFS_USER \
1049 /bin/rm /tmp/"$RAWFILE"
1051 cat /tmp/"$RAWFILE" \
1052 >> "$WORK_DIR"/"$RAWFILE"."$SUFFIX"
1053 /bin/rm /tmp/"$RAWFILE"
1055 PRCJ=`expr $PRCJ + 1`
1057 CLIENTS_NUM=`expr $CLIENTS_NUM + 1`
1062 # cleanup processes before ending
1064 if [ -f $SFS_PRM_PID ]; then
1065 kill -2 `cat $SFS_PRM_PID` > /dev/null 2>&1
1068 if [ -f $SFS_PNT_PID ]; then
1069 kill -2 `cat $SFS_PNT_PID` > /dev/null 2>&1
1072 if [ -f $SFS_SYNCD_PID ]; then
1073 kill -2 `cat $SFS_SYNCD_PID` > /dev/null 2>&1
1074 rm -f $SFS_SYNCD_PID
1078 # cleanup temporary files
1080 for i in $PRIME_LOG_FILES; do
1085 echo "sfs_mgr: error could not remove file - $i"
1086 echo "sfs_mgr: error could not remove file - $i" >> $P_LOGFILE
1092 echo '========================================================================'\ >>$P_LOGFILE