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
|
#!/bin/sh
# PCP QA Test No. 1573
# Exercise libpcp_web memory leak without a key server.
#
# Copyright (c) 2020 Red Hat.
#
seq=`basename $0`
echo "QA output created by $seq"
# get standard environment, filters and checks
. ./common.product
. ./common.filter
. ./common.check
_check_series
_cleanup()
{
cd $here
if $need_restore
then
need_restore=false
_service pmlogger stop >/dev/null
$sudo rm -rf $PCP_LOG_DIR/pmlogger
$sudo mv $PCP_LOG_DIR/pmlogger.$seq $PCP_LOG_DIR/pmlogger
_restore_config $PCP_ETC_DIR/pcp/pmlogger
_service pmcd restart 2>&1 | _filter_pcp_restart
_wait_for_pmcd
_service pmlogger restart 2>&1 | _filter_pcp_restart
_wait_for_pmlogger
_restore_config $PCP_SYSCONF_DIR/pmproxy
fi
if $pmproxy_was_running
then
echo "Restart pmproxy ..." >>$seq_full
_service pmproxy restart >>$seq_full 2>&1
_wait_for_pmproxy
else
echo "Stopping pmproxy ..." >>$seq_full
_service pmproxy stop >>$seq_full 2>&1
fi
$sudo rm -rf $tmp $tmp.*
}
status=1 # failure is the default!
need_restore=false
trap "_cleanup; exit \$status" 0 1 2 3 15
pmproxy_was_running=false
[ -f $PCP_RUN_DIR/pmproxy.pid ] && pmproxy_was_running=true
echo "pmproxy_was_running=$pmproxy_was_running" >>$seq_full
# real QA test starts here
_save_config $PCP_SYSCONF_DIR/pmproxy
need_restore=true
# only want the primary logger running
_save_config $PCP_ETC_DIR/pcp/pmlogger
_restore_pmlogger_control
#$sudo rm -f $PCP_SYSCONF_DIR/pmproxy/*
echo "[pmproxy]" > $tmp.conf
echo "pcp.enabled = true" >> $tmp.conf
echo "http.enabled = true" >> $tmp.conf
echo "resp.enabled = true" >> $tmp.conf
echo "secure.enabled = false" >> $tmp.conf
echo "[discover]" >> $tmp.conf
echo "enabled = true" >> $tmp.conf
echo "[pmseries]" >> $tmp.conf
echo "enabled = false" >> $tmp.conf
$sudo cp $tmp.conf $PCP_SYSCONF_DIR/pmproxy/pmproxy.conf
if ! _service pmlogger stop >/dev/null; then _exit 1; fi
# move aside existing logs so we can measure base memory footprint
[ -d $PCP_LOG_DIR/pmlogger.$seq ] && $sudo mv $PCP_LOG_DIR/pmlogger.$seq $PCP_LOG_DIR/pmlogger.$seq.saved
$sudo mv $PCP_LOG_DIR/pmlogger $PCP_LOG_DIR/pmlogger.$seq
$sudo mkdir -p $PCP_LOG_DIR/pmlogger
$sudo chmod 775 $PCP_LOG_DIR/pmlogger
$sudo chown $PCP_USER:$PCP_USER $PCP_LOG_DIR/pmlogger
if ! _service pmproxy restart >>$seq_full 2>&1; then _exit 1; fi
_wait_for_pmproxy || _exit 1
pmproxy_pid=`_get_pids_by_name -a pmproxy`
[ -z "$pmproxy_pid" ] && echo === pmproxy not running && status=1 && exit 1
echo === extract initial rss
pmproxy_rss1=`pminfo -f proc.memory.rss |
$PCP_AWK_PROG '{ if ($2 == "['$pmproxy_pid'") { print $NF} }'`
if [ -z "$pmproxy_rss1" ]
then
$PCP_PS_PROG $PCP_PS_ALL_FLAGS | grep -E '[P]PID|/[p]mproxy( |$)'
pminfo -f proc.memory.rss | grep '[p]mproxy'
echo "Arrgh: cannot find first rss for pid $pmproxy_pid"
status=1
exit
fi
echo === restarting pmlogger # primary only
if ! _service pmlogger restart 2>&1; then _exit 1; fi | _filter_pcp_restart
_wait_for_pmlogger || _exit 1
echo === wait for pmproxy to process filesystem events
pmsleep 4.2
echo === extract updated rss
pmproxy_rss2=`pminfo -f proc.memory.rss |
$PCP_AWK_PROG '{ if ($2 == "['$pmproxy_pid'") { print $NF} }'`
if [ -z "$pmproxy_rss2" ]
then
$PCP_PS_PROG $PCP_PS_ALL_FLAGS | grep -E '[P]PID|/[p]mproxy( |$)'
pminfo -f proc.memory.rss | grep '[p]mproxy'
echo "Arrgh: cannot find second rss for pid $pmproxy_pid"
status=1
exit
fi
echo === checking rss within tolerance
_within_tolerance "rss" $pmproxy_rss1 $pmproxy_rss2 10%
[ $pmproxy_rss2 -gt 10000 ] && echo "Unexpected pmproxy RSS: $pmproxy_rss2, was initially $pmproxy_rss1"
echo "RSS1 for PID $pmproxy_pid is $pmproxy_rss1" >> $seq_full
echo "RSS2 for PID $pmproxy_pid is $pmproxy_rss2" >> $seq_full
cat $PCP_LOG_DIR/pmproxy/pmproxy.log >>$seq_full
[ -f /proc/$pmproxy_pid/maps ] && echo == maps >>$seq_full && $sudo cat /proc/$pmproxy_pid/maps >>$seq_full
echo === see $seq.full for pmproxy rss and logs
# success, all done
status=0
exit
|