File: 040

package info (click to toggle)
pcp 7.1.0-1
  • links: PTS
  • area: main
  • in suites: forky, sid
  • size: 252,748 kB
  • sloc: ansic: 1,483,656; sh: 182,366; xml: 160,462; cpp: 83,813; python: 24,980; perl: 18,327; yacc: 6,877; lex: 2,864; makefile: 2,738; awk: 165; fortran: 60; java: 52
file content (150 lines) | stat: -rwxr-xr-x 3,362 bytes parent folder | download
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
#! /bin/sh
# PCP QA Test No. 040
# mem leak in pmlogger
#
# 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

trap "$sudo rm -f $tmp.*; exit" 0 1 2 3 15

if ps l -p 1 2>/dev/null | sed -e 1q | grep RSS >/dev/null
then
    ps_arg=l
elif ps -l -p 1 2>/dev/null | sed -e 1q | grep RSS >/dev/null
then
    ps_arg=-l
elif ps -o uid,pid,rss,fname -p 1 2>/dev/null | sed -e 1q | grep RSS >/dev/null
then
    ps_arg="-o uid,pid,rss,fname"
else
    echo "$seq: how do I coerce RSS from your ps?"
fi

rss_field=`ps $ps_arg -p 1 2>/dev/null | $PCP_AWK_PROG '
NR == 1	{ for (i = 1; i <= NF; i++) {
	    if ($i == "RSS") {
		print i
		break
	    }
	  }
	  exit
	}'`
pid_field=`ps $ps_arg -p 1 2>/dev/null | $PCP_AWK_PROG '
NR == 1	{ for (i = 1; i <= NF; i++) {
	    if ($i == "PID") {
		print i
		break
	    }
	  }
	  exit
	}'`
echo "rss_field=$rss_field pid_field=$pid_field" >>$seq_full
ps $ps_arg -p 1 >>$seq_full

_fail()
{
    echo "Arrgh: $1"
    echo "Error: pmlogger virtual or resident size grew ... memory leak?"
    echo "       or maybe pmlogger died, or failed to start"
    echo "       my pmlogger pid=$mylogger"
    echo
    echo "ps output ..."
    cat $tmp.ps
    echo
    echo "pmlogger log ..."
    cat $tmp.log
}

# and NO malloc() hardening ...
#
case $PCP_PLATFORM
in
    openbsd)
    	unset MALLOC_OPTIONS
	;;
esac

# real QA test starts here

cat <<End-of-File >$tmp.config
log mandatory on 20 msec {
    pmcd.control
}
End-of-File

#debug# _start_up_pmlogger -c $tmp.config -Daf,appl2,desperate -l $tmp.log -s 1000 $tmp
_start_up_pmlogger -c $tmp.config -l $tmp.log -s 1000 $tmp
mylogger=$pid
_wait_for_pmlogger $mylogger $tmp.log || _exit 1

seen=0
for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
do
sleep 1
ps $ps_arg -p $mylogger \
    | $PCP_AWK_PROG '
NR == 1			{ print; next }
$'$pid_field' == '$mylogger'	{ print }'
done \
| sed -e '/RSS/d' \
| tee $tmp.ps \
| $PCP_AWK_PROG '{ print $'$rss_field' }' >$tmp.tmp

# expect ...
# - 15 ps observations
# - max < 1.05* min
# - no monotonic increase
#
obs="`wc -l <$tmp.tmp | sed -e 's/ //g'`"
if [ "$obs" -ne 15 ]
then
    _fail "insufficient results ($obs not 15)"
fi
min="`LC_COLLATE=POSIX sort -n <$tmp.tmp | head -1`"
max="`LC_COLLATE=POSIX sort -nr <$tmp.tmp | head -1`"
echo "min rss $min, max rss $max" >>$seq_full
if [ "`expr $max \* 100`" -ge "`expr $min \* 105`" ]
then
    _fail "rss max ($max) more than 1.05 times rss min ($min)"
fi
rm -f $tmp.bad
( cat $tmp.tmp; echo 0 ) | $PCP_AWK_PROG '
BEGIN	{ last = 0 }
NR > 1	{ if ($1 > last) {
	    inc++
	  }
	  else {
	    if (inc > 1) print "[" NR-1 "] " inc " increasing values" >>"'$tmp.bad'"
	  }
	}
	{ last = $1 }'
if [ -s $tmp.bad ]
then
    _fail "rss increasing ...\
`cat $tmp.bad`"
fi

# pmlogger should run for about 20 seconds, and we've spent about
# 15 seconds in the loop above, so allow pmlogger to get close to
# being done before calling _wait_pmlogger_end (otherwise
# _wait_pmlogger_end can lose patience before pmlogger exits)
#
sleep 5

_wait_pmlogger_end $mylogger || _exit 1
cat $tmp.log >>$seq_full
echo
echo "pmlogger log"
_filter_pmlogger_log <$tmp.log

echo "pmResults in archive ... `pmdumplog $tmp | grep '^[0-2]' | wc -l | sed -e 's/ //g'`" >>$seq_full

exit 0