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
|
#!/bin/sh
# PCP QA Test No. 731
# Valgrind access checking for the Linux cgroups metrics
#
# Copyright (c) 2014 Red Hat.
#
seq=`basename $0`
echo "QA output created by $seq"
# get standard environment, filters and checks
. ./common.product
. ./common.filter
. ./common.check
[ $PCP_PLATFORM = linux ] || _notrun "cgroups test, only works with Linux"
_check_valgrind
status=1 # failure is the default!
trap "cd $here; $sudo rm -rf $tmp.*; exit \$status" 0 1 2 3 15
# things just got more complicated because the acct metrics
# initialization _may_ do a fork() and exit() to test if an existing
# process accounting file is being updated ... this creates a child
# process that is guaranteed to have exited, and valgrind may notice.
#
# when this happens we get one HEAP-LEAK-ERROR block for the
# child process and one for the main process. since we expect
# them to be identical and report 0 lost bytes, just report the
# unique lines
#
# and we _may_ have error lines like
# [date] ... Warning: acct: existing pacct file did not grow as expected, file system full?
# [date] ... Info: acct: enable -Dappl3 for more detailed logging
# if the process accounting file exists, but process accounting is turned
# off or the file system is full
#
_my_filter_valgrind()
{
$PCP_AWK_PROG '
/^=== std err ===/ { want = 1 }
want == 1 && $1 == "LEAK" { want = 2 }
want == 2 { # first word in the "interesting" blocks are unique
# LEAK, definitely, indirectly and ERROR
if ($0 == seen[$1]) next
seen[$1] = $0
}
want > 0 { print }' \
| sed \
-e '/Warning: acct: existing pacct file did not grow /d' \
-e '/Info: acct: enable -Dappl3 /d' \
-e "s,$PCP_PMDAS_DIR/,PCP_PMDAS_DIR/,g" \
# end
}
# for pminfo ...
_filter1()
{
cat >$tmp.out
sed -e 1q $tmp.out
echo "Metrics ..."
grep '^cgroup' $tmp.out | LC_COLLATE=POSIX sort
nvalue=`grep 'inst \[' <$tmp.out | wc -l | sed -e 's/ //g'`
echo
echo "and $nvalue instance values."
_my_filter_valgrind <$tmp.out
}
# for pmval ...
_filter2()
{
cat >$tmp.out
echo "`grep -E '^( *[0-9"])|(No values)' <$tmp.out | wc -l | sed -e 's/ *//g'` report lines"
_my_filter_valgrind <$tmp.out
}
# real QA test starts here
root=$tmp.root
export PROC_STATSPATH=$root
pmda=$PCP_PMDAS_DIR/proc/pmda_proc.so,proc_init
trees=`pminfo cgroup | awk -F. '{ print $2 }' | sort -u`
for tgz in $here/linux/cgroups-*.tgz
do
$sudo rm -fr $root
mkdir $root || _fail "root in use when processing $tgz"
cd $root
tar xzf $tgz
base=`basename $tgz`
echo "== Running valgrind for cgroup fetch - $base"
cd $here
_run_valgrind pminfo -L -K clear -K add,3,$pmda -d -f cgroup 2>&1 \
| tee -a $seq_full \
| _filter1
# takes too long to verify everything, so check just first
echo $base | grep -q 001 || continue
for tree in $trees
do
name=`pminfo cgroup.$tree | sed 1q`
echo "== Running valgrind on $tree for multiple fetches - $base"
_run_valgrind pmval -L -K clear -K add,3,$pmda -s 1099 -t 0.00001 $name 2>&1 \
| tee -a $seq_full \
| _filter2
echo "checked cgroup tree $tree via metric $metric" >> $seq_full
done
echo && echo "== done" && echo
done
# success, all done
status=0
exit
|