#!/bin/bash
# Copyright 2006-2017, Matthew Welland.
#
# This file is part of Megatest.
#
# Megatest is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Megatest is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Megatest. If not, see <http://www.gnu.org/licenses/>.
echo manyservers.sh pid $$
logdir=$PWD/log-manysrv
function reset {
rm -f .homehost .server .server.lock links/.db/monitor.db .starting-server
}
function launch_many_servers {
# count = $1
# logdir = $2
# prefx = $3
perl -e 'foreach my $i (1 ... '$1'){print "'$2'/'$3'-srv-$i.log\n"}' | \
xargs -P $1 -n 1 megatest -server - -run-id 0 -daemonize -log
}
function get_srv_pids {
ps auwx | grep "mtest -server" | grep $logdir | grep -v grep | awk '{print $2}'
}
if [[ -e $logdir ]]; then rm -rf $logdir; fi
if [[ ! -e $logdir ]]; then mkdir $logdir; fi
reset
simultaneous_servers=20
server_collision_resolution_delay=15
server_timeout_delay=65
echo "Launching $simultaneous_servers simultaneous servers"
launch_many_servers $simultaneous_servers $logdir "first"
echo "Sleeping $server_collision_resolution_delay seconds to allow new servers to die because one is already running."
sleep $server_collision_resolution_delay
pids=`get_srv_pids`
pids_left=`echo $pids | wc -w`
echo "pids_left=$pids_left"
echo "after $server_collision_resolution_delay seconds: servers remaining=$pids_left; expecting 1"
if [[ $pids_left == 1 ]]; then
echo "All servers but 1 terminated. Still good."
else
if [[ $pids_left == 0 ]]; then
echo "All servers died too soon. Not good. Aborting."
echo "TEST FAIL"
exit 1
else
echo "Too many servers left. Not good. Aborting."
echo "TEST FAIL"
echo $pids | xargs kill
sleep 5
pids=`get_srv_pids`
pids_left=`echo $pids | wc -w`
if [[ ! ( $pids_left == 0 ) ]]; then
echo $pids | xargs kill -9
fi
exit 1
fi
fi
echo "launching another volley of $simultaneous_servers. THey should all perish. right away, leaving the one server running."
launch_many_servers $simultaneous_servers $logdir "second"
sleep $server_collision_resolution_delay
pids=`get_srv_pids`
pids_left=`echo $pids | wc -w`
echo "pids_left=$pids_left"
echo "after $server_collision_resolution_delay seconds: servers remaining=$pids_left; expecting 1"
if [[ $pids_left == 1 ]]; then
echo "All servers but 1 terminated. So far so good."
else
if [[ $pids_left == 0 ]]; then
echo "All servers died too soon. Not good. Aborting."
echo "TEST FAIL"
exit 1
else
echo "Too many servers left. Not good. Aborting."
echo "TEST FAIL"
echo $pids | xargs kill
sleep 5
pids=`get_srv_pids`
pids_left=`echo $pids | wc -w`
if [[ ! ( $pids_left == 0 ) ]]; then
echo $pids | xargs kill -9
fi
exit 1
fi
fi
echo "sleeping for awhile ($server_timeout_delay seconds) to let server exit on its own for no-request timeout"
sleep $server_timeout_delay
pids=`get_srv_pids`
pids_left=`echo $pids | wc -w`
echo "after $server_timeout_delay seconds: servers remaining=$pids_left; expecting 0"
if [[ $pids_left == 0 ]]; then
echo "No servers remain. This is good."
echo "TEST PASS"
exit 0
else
echo "Too many servers left. Not good. Aborting."
echo "TEST FAIL"
echo $pids | xargs kill
sleep 5
pids=`get_srv_pids`
pids_left=`echo $pids | wc -w`
if [[ ! ( $pids_left == 0 ) ]]; then
echo $pids | xargs kill -9
fi
exit 1
fi