summaryrefslogtreecommitdiff
path: root/qa/578
diff options
context:
space:
mode:
authorIgor Pashev <pashev.igor@gmail.com>2014-10-26 12:33:50 +0400
committerIgor Pashev <pashev.igor@gmail.com>2014-10-26 12:33:50 +0400
commit47e6e7c84f008a53061e661f31ae96629bc694ef (patch)
tree648a07f3b5b9d67ce19b0fd72e8caa1175c98f1a /qa/578
downloadpcp-debian.tar.gz
Debian 3.9.10debian/3.9.10debian
Diffstat (limited to 'qa/578')
-rwxr-xr-xqa/578362
1 files changed, 362 insertions, 0 deletions
diff --git a/qa/578 b/qa/578
new file mode 100755
index 0000000..7ec6b98
--- /dev/null
+++ b/qa/578
@@ -0,0 +1,362 @@
+#! /bin/sh
+# PCP QA Test No. 578
+# Test for Bug #660497, change openfds metric to be the
+# largest known file descriptor used by pmcd.
+# This means the file descriptor can only ever increase.
+# The following behaviour is expected:
+# the file descriptor will increase when a client or pmda connects
+# the file descriptor will stay the same when a client or pmda disconnects
+#
+# 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
+
+rm -f $seq.out
+if [ $PCP_VER -lt 3600 ]
+then
+ ln $seq.out.1 $seq.out || exit 1
+else
+ ln $seq.out.2 $seq.out || exit 1
+fi
+
+status=1 # failure is the default!
+trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15
+rm -f $seq.full
+
+signal=$PCP_BINADM_DIR/pmsignal
+simple_domain=253
+if [ -x pmobjstyle ]
+then
+ style=`pmobjstyle`
+else
+ style=''
+fi
+
+_start_client()
+{
+ pmval -T 10sec kernel.all.load >$tmp.tmp 2>&1 &
+ echo "=== Started client ===" | tee -a $here/$seq.full
+ sleep 3
+}
+
+# Remove the PMDA and restore pmcd.conf
+#
+_cleanup()
+{
+ [ -f $PCP_PMDAS_DIR/simple/simple.conf.$seq ] && $sudo mv -f $PCP_PMDAS_DIR/simple/simple.conf.$seq $PCP_PMDAS_DIR/simple/simple.conf
+
+ if [ -f $tmp.conf ]
+ then
+ echo "=== Resetting pmcd.conf back to original state ==="
+ $sudo cp $tmp.conf $PCP_PMCDCONF_PATH
+ $sudo cp $tmp.root $PCP_VAR_DIR/pmns/root
+ fi
+ if [ -f $tmp.conf ]
+ then
+ echo "=== Restart PMCD ==="
+ unset PMCD_PORT
+ $sudo $PCP_RC_DIR/pcp restart | _filter_pcp_start
+ _wait_for_pmcd
+ fi
+
+ if grep '^simple' $PCP_PMCDCONF_PATH >/dev/null
+ then
+ :
+ else
+ # simple was not installed, cull namespace
+ #
+ cd $PCP_PMDAS_DIR/simple
+ $sudo ./Remove >/dev/null
+ fi
+
+ if [ -f $tmp.log ]
+ then
+ echo '=== pmcd log' >>$here/$seq.full
+ cat $tmp.log >>$here/$seq.full
+ fi
+
+ rm -rf $tmp.*
+}
+
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_filter_ins()
+{
+ sed \
+ -e 's/.* \(hash table entries\)/ NNN \1/' \
+ -e 's/.* \(non-leaf nodes\)/ NNN \1/' \
+ -e 's/.* \(leaf nodes\)/ NNN \1/' \
+ -e 's/.* \(bytes of symbol table\)/ NNN \1/'
+}
+
+_filter_init()
+{
+ sed \
+ -e "s/$$/PID/g"
+}
+
+_filter_openfds_value()
+{
+ $PCP_AWK_PROG '
+BEGIN { fst_fds = "fst_fds"; sec_fds = "sec_fds"; thr_fds = "thr_fds"; step = 0 }
+$1 == "value" && step == 0 {
+ fst_fds = $2; step = 1; next }
+$1 == "value" && step == 1 {
+ sec_fds = $2; step = 2; next }
+$1 == "value" && step == 2 {
+ thr_fds = $2;
+ if (sec_fds > fst_fds)
+ printf("=== Info: After install, openfds has increased as expected ===\n");
+ else {
+ printf("=== Error: After install, openfds has unexpectedly decreased or stayed the same ===\n");
+ printf("\t previous value %d, current value %d\n", fst_fds, sec_fds);
+ }
+ if (sec_fds == thr_fds)
+ printf("=== Info: After remove, openfds has stayed the same as expected ===\n");
+ else {
+ printf("=== Error: After remove, openfds has unexpectedly changed ===\n")
+ printf("\t previous value %d, current value %d\n", sec_fds, thr_fds);
+ }
+ next;
+ }
+ { next } '
+}
+
+# no random clients, thanks
+#
+port=`_get_port tcp 6060 6070`
+if [ -z "$port" ]
+then
+ echo "Arrggh ... no free TCP port in the range 6060 ... 6070"
+ netstat -an
+ exit
+fi
+PMCD_PORT=$port
+export PMCD_PORT
+
+# Build simple agent
+#
+echo "=== Building simple agent ===" | tee -a $here/$seq.full
+unset ROOT TOOLROOT MAKEFLAGS
+cd $PCP_PMDAS_DIR/simple
+
+# get rid of warnings from simple if no config exists
+[ -f simple.conf ] && $sudo mv simple.conf simple.conf.$seq
+echo "sec,min,hour" >$tmp.simple.conf
+$sudo cp $tmp.simple.conf simple.conf
+
+# Install the simple namespace, I don't bother to remove it again
+#
+$sudo ./Install -N < /dev/null | _filter_ins 2>&1
+echo "Namespace installed"
+
+if $sudo make > $tmp.make 2>&1
+then
+ echo "PMDA built"
+else
+ echo "Unable to build the simple PMDA:"
+ cat $tmp.make
+ exit
+fi
+
+sed -e "/^@ SIMPLE/s/SIMPLE/$simple_domain/" < help \
+| $sudo $PCP_BINADM_DIR/newhelp -v 2 -o help
+echo "Help generated"
+cd $here
+
+# Refresh PMCD
+#
+_renew_pmcd()
+{
+ echo "=== Restarting PMCD with minimal PMDAs ===" | tee -a $here/$seq.full
+ if [ -f $tmp.newconf ]
+ then
+ $sudo cp $tmp.newconf $PCP_PMCDCONF_PATH
+ $sudo $signal -a -s HUP pmcd
+ sleep 4
+ _wait_for_pmcd
+ else
+ echo caller - $1 - has not created $tmp.newconf !!!
+ fi
+}
+
+# Install a standard pmda, but do not mess with the namespace
+#
+_agent_install()
+{
+ agent=$1
+ domain=$2
+ daemon=$3
+ path=$PCP_PMDAS_DIR/$agent
+
+ echo "=== Installing $agent ===" | tee -a $here/$seq.full
+ cp $tmp.newconf $tmp.latest
+ if $daemon
+ then
+ cat << end-of-file >> $tmp.latest
+$agent $domain pipe binary $path/pmda$agent -d $domain
+end-of-file
+ else
+ cat << end-of-file >> $tmp.latest
+$agent $domain dso ${agent}_init $path/${style}pmda_$agent.$DSO_SUFFIX
+end-of-file
+ fi
+
+ $sudo cp $tmp.latest $PCP_PMCDCONF_PATH
+
+ $sudo $signal -a -s HUP pmcd
+ sleep 4
+ _wait_for_pmcd
+
+ if _check_agent $agent true
+ then
+ echo "$agent is alive and well"
+ else
+ echo "Failed to install $agent"
+ exit
+ fi
+}
+
+# Remove a pmda
+#
+_agent_remove()
+{
+ agent=$1
+
+ echo "=== Removing $agent ===" | tee -a $here/$seq.full
+ _renew_pmcd _agent_remove
+
+ if _check_agent $agent true
+ then
+ echo "Failed to remove $agent"
+ exit
+ else
+ echo "$agent was removed"
+ fi
+}
+
+# real QA test starts here
+
+# Copy and replace pmcd.conf
+#
+cp $PCP_PMCDCONF_PATH $tmp.conf
+cp $PCP_VAR_DIR/pmns/root $tmp.root
+
+if [ $PCP_PLATFORM = linux ]
+then
+ cat << end-of-file > $tmp.newconf
+# pmcd.conf generated by QA $seq
+pmcd 2 dso pmcd_init $PCP_PMDAS_DIR/pmcd/pmda_pmcd.so
+linux 60 dso linux_init $PCP_PMDAS_DIR/linux/pmda_linux.so
+end-of-file
+elif [ $PCP_PLATFORM = irix ]
+then
+ cat << end-of-file > $tmp.newconf
+# pmcd.conf generated by QA $seq
+irix 1 dso irix_init libirixpmda.so
+pmcd 2 dso pmcd_init pmda_pmcd.so
+proc 3 dso proc_init pmda_proc.so
+end-of-file
+elif [ $PCP_PLATFORM = darwin ]
+then
+ cat << end-of-file > $tmp.newconf
+# pmcd.conf generated by QA $seq
+pmcd 2 dso pmcd_init $PCP_PMDAS_DIR/pmcd/pmda_pmcd.dylib
+darwin 78 dso darwin_init $PCP_PMDAS_DIR/darwin/pmda_darwin.dylib
+end-of-file
+elif [ $PCP_PLATFORM = solaris ]
+then
+ cat << end-of-file > $tmp.newconf
+# pmcd.conf generated by QA $seq
+pmcd 2 dso pmcd_init $PCP_PMDAS_DIR/pmcd/pmda_pmcd.so
+solaris 75 dso solaris_init $PCP_PMDAS_DIR/solaris/pmda_solaris.so
+end-of-file
+else
+ echo "Arrgh ... need pmcd.conf output for $PCP_PLATFORM"
+ exit 1
+fi
+
+#_renew_pmcd main
+
+if [ -f $tmp.newconf ]
+then
+ $sudo cp $tmp.newconf $PCP_PMCDCONF_PATH
+fi
+
+# Start with a fresh pmcd log
+#
+# need to do this indirectly because system sudo cleanses the environment
+#
+echo "export PMCD_PORT=$PMCD_PORT" >$tmp.start
+echo "$PCP_RC_DIR/pcp restart" >>$tmp.start
+$sudo sh $tmp.start | _filter_pcp_start | _filter_init 2>&1
+_wait_for_pmcd
+
+_test_pmda()
+{
+ pmda_type=$1
+
+ # Test PMDA
+ #
+ echo
+ echo "=== Testing PMDA as a $pmda_type ===" | tee -a $here/$seq.full
+
+ rm -f $tmp.pminfo
+
+ pminfo -f pmcd.openfds >$tmp.pminfo
+ fst_openfds=$openfds_value
+
+ if [ "$pmda_type" != PIPE ]
+ then
+ _agent_install simple $simple_domain false
+ else
+ _agent_install simple $simple_domain true
+ fi
+
+ pminfo -f pmcd.openfds >>$tmp.pminfo
+
+ _agent_remove simple
+ pminfo -f pmcd.openfds >>$tmp.pminfo
+
+ cat $tmp.pminfo | _filter_openfds_value
+}
+
+_test_client()
+{
+ # Test a client
+ #
+ echo "=== Testing a Client ===" | tee -a $here/$seq.full
+
+ rm -f $tmp.pminfo
+
+ pminfo -f pmcd.openfds >$tmp.pminfo
+
+ _start_client
+ pminfo -f pmcd.openfds >>$tmp.pminfo
+
+ wait
+ pminfo -f pmcd.openfds >>$tmp.pminfo
+
+ echo "=== pmval output ===" >>$here/$seq.full
+ cat $tmp.tmp >>$here/$seq.full
+ echo "=== pminfo output ===" >>$here/$seq.full
+ cat $tmp.pminfo >>$here/$seq.full
+
+ cat $tmp.pminfo | _filter_openfds_value
+}
+
+_test_client
+_test_pmda DSO
+_test_pmda PIPE
+
+status=0
+# success, all done
+exit
+