#!/bin/bash
#
# Distributed perftest.
# Runs perftest clients on multiple hosts using ssh.
# 

set -e
usage() {
cat <<EOF
usage: $0 <perftest-args> -- <client-hosts ...> 

Run perftest with clients running on the listed hosts.  Clients are
assigned to hosts publishers first, then subscribers the host list is
used round-robin if there are more clients than hosts. perftest-args should
include a --host <brokerhost>  flag.

Do not pass preftest action flags: --setup, --control, --publish, --subscribe.
The script will pass them to the appropriate client processes.

Note all perftest args must come before  --.

Error: $*
EOF
exit 1
}

collect() { eval $COLLECT=\""\$$COLLECT $*"\"; }
NPUBS=1
NSUBS=1
COLLECT=ARGS
while test $# -gt 0; do
    case $1 in
	--publish|--subscribe|--setup|--control) usage "Don't pass perftest action flags: $1" ;;
	--npubs) collect $1 $2; NPUBS=$2; shift 2 ;;
	--nsubs) collect $1 $2; NSUBS=$2; shift 2 ;;
	--) COLLECT=HOSTS; shift ;; 
	*) collect $1; shift ;;
    esac
done
if [ -z "$HOSTS" ]; then usage "No hosts listed after --"; fi
PATH="`dirname $0`:$PATH"	
PERFTEST="`which perftest` $ARGS" || usage "Can't find perftest executable"

HOSTS=($HOSTS)
start() { ssh ${HOSTS[i % ${#HOSTS[*]}]} $PERFTEST $*& }

$PERFTEST --setup
for (( i=0 ; i < $NPUBS ; ++i)); do start --publish; done
for (( ; i < $NPUBS+$NSUBS ; ++i)); do start --subscribe; done
$PERFTEST --control
