1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
|
#! /bin/sh
# PCP QA Test No. 243
# Multiple PMCDs test
#
# Copyright (c) 1995-2002 Silicon Graphics, Inc. All Rights Reserved.
#
seq=`basename $0`
echo "QA output created by $seq"
# get standard filters
. ./common.product
. ./common.filter
. ./common.check
[ $PCP_PLATFORM = darwin ] && _notrun "Who knows what the darwin networking code is doing, don't bother with this test"
rm -f $seq.out
_get_libpcp_config
if $ipv6 ; then
ln $seq.out.ipv6 $seq.out || exit 1
else
ln $seq.out.nonipv6 $seq.out || exit 1
fi
_filter_info()
{
sed -e '/PMNS file "DEFAULT" is unchanged/d'
}
_filter_err()
{
_filter_pmcd_log \
| _filter_info \
| sed \
-e 's/ __pmBind: / bind: /g' \
-e 's/may already be running/is already running/g' \
-e '/Log for pmcd/,/INADDR_ANY/c\
... boring stuff deleted' \
-e '/ok FD 44321 ipv6 INADDR_ANY/d' \
-e '/OpenRequestSocket.*unix.*bind: Address already in use/{
N
d
}' \
-e 's/ INADDR_ANY/ 0x0/g' \
-e "s@$tmp@TMP@g" \
#end
}
signal=$PCP_BINADM_DIR/pmsignal
_needclean=true
mkdir $tmp
chmod ugo+rwx $tmp
cd $tmp
_cleanup()
{
cd $here
if $_needclean
then
_needclean=false
$signal -s TERM $my_pmcd_pid
pmsleep 1.5
unset PMCD_SOCKET
echo "Restart and ping pmcd ..."
_service pmcd restart 2>&1 | _filter_pcp_restart
_wait_for_pmcd
_restore_auto_restart pmcd
_service pmlogger restart 2>&1 | _filter_pcp_restart
_wait_for_pmlogger
pmprobe pmcd.control.debug
fi
rm -rf $tmp $tmp.*
}
status=1
trap "_cleanup; exit \$status" 0 1 2 3 15
_stop_auto_restart pmcd
# real QA test starts here
if ! _service pmlogger stop 2>&1; then _exit 1; fi \
| _filter_pcp_stop
_wait_pmlogger_end || _exit 1
if ! _service pmcd stop 2>&1; then _exit 1; fi \
| _filter_pcp_stop
_wait_pmcd_end || _exit 1
# Note: start pmcd with -f so that its PID stays the same (no daemon)
#
export PMCD_SOCKET=$tmp/pmcd.socket
$PCP_PMCD_PROG -f -x err1 &
my_pmcd_pid=$!
_wait_for_pmcd || _exit 1
echo "Checking for startup errors ..."
[ -f err1 ] && _filter_err <err1
# Save pmcd log file to date ...
#
# Although _wait_for_pmcd() returns and pmcd is alive, the log file
# may not have been created yet ... be a little patient
#
for i in 1 2 3 4 5 6 7 8 9 10
do
[ -f pmcd.log ] && break
pmsleep 0.2
done
if [ -f pmcd.log ]
then
_filter_info < pmcd.log > pmcd.log1.$$
else
echo "No pmcd.log, pmcd failed to start?"
$PCP_PS_PROG $PCP_PS_ALL_FLAGS | grep -E '[P]PID|/[p]mcd( |$)'
exit
fi
# Try to start another pmcd. This should fail because the socket is
# already in use.
#
echo
echo "Trying to start another PMCD over the top of the first one."
echo "Expect \"bind: Address already in use\"...:"
$PCP_PMCD_PROG -f -x err2 -l $tmp.log 2>&1 | _filter_err &
# EADDRINUSE errors now have 4x250 msec delay while we retry before giving
# up, and this happens once per socket type, so up to 3 times ... and then
# wait a little longer ...
pmsleep 3.5
ls -l err2 >>$seq_full 2>&1
echo "Checking for startup errors ..."
if [ -f err2 ]
then
echo "+++ err for second pmcd +++" >>$seq_full
cat err2 >>$seq_full 2>&1
_filter_err <err2
fi
ls -l $tmp.log >>$seq_full 2>&1
echo "+++ log file for second pmcd +++" >>$seq_full
cat $tmp.log >>$seq_full 2>&1
# Make sure that there are no changes to the pmcd log file
#
echo "Checking that the original pmcd log hasn't changed ..."
_filter_info < pmcd.log > pmcd.log2.$$
if diff pmcd.log2.$$ pmcd.log1.$$
then
status=0
else
echo "+++ log file for first pmcd (1) +++" >>$seq_full
cat pmcd.log2.$$ >>$seq_full
echo "+++ log file for first pmcd (2) +++" >>$seq_full
cat pmcd.log1.$$ >>$seq_full
fi
|