#! /bin/sh # PCP QA Test No. 326 # Check PMCD state change notification, aka PMCD reset # # 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 signal=$PCP_BINADM_DIR/pmsignal status=1 done_clean=false LOCALHOST=`hostname` [ $PCP_VER -lt 3806 ] && LOCALHOST=`echo $LOCALHOST | sed -e 's/\..*//'` _cleanup() { if $done_clean then : else echo echo "Restore pmcd.conf and restart PMCD ..." [ -f $tmp.pmcd.conf ] && $sudo mv $tmp.pmcd.conf $PCP_PMCDCONF_PATH _restore_primary_logger $sudo $PCP_RC_DIR/pcp restart | _filter_pcp_start rm -f $tmp.* _wait_for_pmcd _wait_for_pmlogger done_clean=true fi exit $status } $sudo rm -rf $tmp.* $seq.full trap "_cleanup" 0 1 2 3 15 timezone=`pmprobe -v pmcd.timezone | $PCP_AWK_PROG '{print $3}'` _filter_host() { # filter this, as we now fetch pmcd.hostname, sneakily sed \ -e "/ value \"$REALHOST\"/d" \ -e "/ value \"$LOCALHOST\"/d" } _filter_pmval() { sed \ -e '1,/^interval:/d' \ -e 's/[0-9][0-9]:[0-9][0-9]:[0-9][0-9]\.[0-9][0-9][0-9]/TIMESTAMP/g' \ | $PCP_AWK_PROG ' /No values available/ { print; next } 0 <= $2 && $2 < 1.1 { $2 = "non-negative number, less than 1.1" } { print }' \ | uniq } trap "_cleanup" 0 1 2 3 15 rm -f $seq.full # real QA test starts here PMDA_PMCD_PATH=$PCP_PMDAS_DIR/pmcd/pmda_pmcd.$DSO_SUFFIX # copy the pmcd config file to restore state later. cp $PCP_PMCDCONF_PATH $tmp.pmcd.conf # start from a known starting point $sudo $PCP_RC_DIR/pcp stop >/dev/null 2>&1 cat <$tmp.tmp # temporary for qa/$seq pmcd 2 dso pmcd_init $PMDA_PMCD_PATH sample 29 pipe binary $PCP_PMDAS_DIR/sample/pmdasample -d 29 End-of-File $sudo cp $tmp.tmp $PCP_PMCDCONF_PATH _writable_primary_logger $sudo $PCP_RC_DIR/pcp restart | _filter_pcp_start _wait_for_pmcd if [ -d $PCP_LOG_DIR/pmlogger ] then LOGGING_DIR=$PCP_LOG_DIR/pmlogger else LOGGING_DIR=$PCP_LOG_DIR fi _wait_for_pmlogger -P $LOGGING_DIR/$LOCALHOST/pmlogger.log echo 'connect primary log mandatory on 500 msec { pmcd.numagents sample.milliseconds }' \ | pmlc # run for 20 seconds pmval -s 40 -t 0.5 -Z "$timezone" -D fetch pmcd.numagents >$tmp.pmval 2>&1 & sleep 3 echo "=== kill sample PMDA process ===" $sudo $signal -a -s TERM pmdasample pminfo -v sample >/dev/null 2>&1 sleep 3 echo "=== SIGHUP PMCD ===" $sudo $signal -a -s HUP pmcd sleep 3 echo "=== drop sample PMDA, like Remove ===" cat <$tmp.tmp # temporary for qa/$seq pmcd 2 dso pmcd_init $PMDA_PMCD_PATH End-of-File $sudo cp $tmp.tmp $PCP_PMCDCONF_PATH $sudo $signal -a -s HUP pmcd sleep 3 echo "=== add sample PMDA, like Install ===" cat <$tmp.tmp # temporary for qa/$seq pmcd 2 dso pmcd_init $PMDA_PMCD_PATH sample 29 pipe binary $PCP_PMDAS_DIR/sample/pmdasample -d 29 End-of-File $sudo cp $tmp.tmp $PCP_PMCDCONF_PATH $sudo $signal -a -s HUP pmcd sleep 3 wait # if desperate! #echo >>$seq.full #cat $PCP_PMCDLOG_PATH >>$seq.full echo echo "Trace of observed state changes and PMDA count ..." egrep '(state changes)|( value )' $tmp.pmval \ | _filter_host \ | uniq echo echo "primary logger ..." echo 'connect primary log mandatory off { pmcd.numagents sample.milliseconds } flush' \ | pmlc sleep 2 # if desperate! #echo >>$seq.full #echo "pmlogger log ..." >>$seq.full #_filter_pmlogger_log <$LOGGING_DIR/$LOCALHOST/pmlogger.log >>$seq.full echo "archive contents ..." pmafm $LOGGING_DIR/$LOCALHOST/Latest pmdumplog >$tmp.out 2>&1 egrep '()|(pmcd.numagents)' $tmp.out \ | _filter_pmdumplog \ | uniq # note clip after 4 filtered lines to avoid extra values that sometimes # appear due to non-determinism in pmlogger fetch samples # echo echo "sanity check with pmval | filter ..." pmafm $LOGGING_DIR/$LOCALHOST/Latest pmval -t 1 sample.milliseconds 2>&1 \ | _filter_pmval \ | sed -e 4q # if desperate! #echo >>$seq.full #echo "unfiltered pmval live output" >>$seq.full #cat $tmp.pmval >>$seq.full # if desperate! #echo >>$seq.full #echo "unfiltered pmval archive output" >>$seq.full #pmafm $LOGGING_DIR/$LOCALHOST/Latest pmval -t 1 sample.milliseconds >>$seq.full 2>&1 status=0 exit