#!/bin/sh
# PCP QA Test No. 4751
# multi-threaded context-creation

seq=`basename $0`
echo "QA output created by $seq"

# get standard environment, filters and checks
. ./common.product
. ./common.filter
. ./common.check

# On some VMs (especially with relatively small memory configs), helgrind
# gets whacked by the kernel's OOM killer ... so don't waste our time
# even trying to run this test on machines where this has been observed.
#
# Similarly on slow VMs we sometimes also see SIGALRM while calling
# pthread_mutex_lock().  Skip these VMs also.
#
case `hostname`
in
    vm00|vm01|vm02|vm03|vm05|vm07|vm18|vm28|vm30|vm34)
	_notrun "multithread10 and helgrind are not happy campers on `hostname`"
	# NOTREACHED
	;;
esac

_check_valgrind
_get_libpcp_config
$multi_threaded || _notrun "No libpcp threading support"

status=0	# success is the default!
$sudo rm -f $tmp.* /tmp/func?.out $seq.full
trap "rm -f $tmp.* /tmp/func?.out; exit \$status" 0 1 2 3 15

# collect stderr as we go
exec 2>> $seq.full

_filter_ncpu()
{
  tee -a $seq.full | sed -e 's, [0-9]*$, NUMBER,'
}

# depending on network setup, there is a race between ...
# 192.0.2.10 -110 (Connection timed out)
# and
# 192.0.2.10 -101 (Network is unreachable)
# and
# 192.0.2.10 -113 (No route to host)
# so treat 'em as equivalent here ...
#
_filter_connect_fail()
{
    sed \
	-e '/^192\..*-113$/s/-113/-101 or -110 or -113/' \
	-e '/^192\..*-110$/s/-110/-101 or -110 or -113/' \
	-e '/^192\..*-101$/s/-101/-101 or -110 or -113/' \
    # end
}

# real QA test starts here
echo "=== Only one context ===" | tee -a $seq.full
date >> $seq.full
_run_helgrind src/multithread10 localhost
_filter_ncpu <$tmp.valgrind.out
if [ -s $tmp.valgrind.err ]
then
    echo "=== stderr ==="
    cat $tmp.valgrind.err
fi
date >> $seq.full

echo | tee -a $seq.full
echo "=== A couple of localhosts ===" | tee -a $seq.full
date >> $seq.full
_run_helgrind src/multithread10 localhost 127.0.0.1 localhost localhost local: local: localhost
_filter_ncpu <$tmp.valgrind.out | _filter_connect_fail
if [ -s $tmp.valgrind.err ]
then
    echo "=== stderr ==="
    cat $tmp.valgrind.err
fi
date >> $seq.full

echo | tee -a $seq.full
echo "=== A couple of unreachable hosts ===" | tee -a $seq.full
date >> $seq.full
ips=""
for i in 1 2 3 4; do
    for j in 0 1 2 3 4 5 6 7 8 9; do
        ips="$ips 192.0.2.${i}${j}"
    done
done
_run_helgrind src/multithread10 $ips
_filter_ncpu <$tmp.valgrind.out | _filter_connect_fail
if [ -s $tmp.valgrind.err ]
then
    echo "=== filtered stderr ==="
    grep -v 'warn fail multithread10' $tmp.valgrind.err
fi
date >> $seq.full

echo | tee -a $seq.full
echo "=== A mixture of archives and hosts and unreachable hosts ===" | tee -a $seq.full
ips="localhost local: localhost local: localhost local: 127.0.0.1 127.0.0.1 "
for i in 1 2 1 2 ; do
    for j in 0 1 2 3 4 5 6 7 8 9; do
        ips="$ips 192.0.2.${i}${j}"
    done
done
# a snapshot of archives as of our incept date, some of them repeated
archives="
./archives/tzchange-10-a.meta
./archives/tzchange-10-b.meta
./archives/tzchange-11-a.meta
./archives/tzchange-11-b.meta
./archives/tzchange-12-a.meta
./archives/tzchange-12-b.meta
./archives/pcp-vmstat.meta
./archives/pmatop-log.meta
./archives/pmiostat_mark.meta
./archives/proc.meta
./archives/procpid-encode2.meta
./archives/procpid-encode.meta
./archives/eventrec-old.meta
./archives/fcsw_indom.meta
./archives/foo+.meta
./archives/gap2.meta
./archives/gap.meta
./archives/gmt-boring.meta
./archives/instant-1.meta
./archives/instant-base.meta
./archives/interpmark.meta
./archives/kenj-pc-1.meta
./archives/kenj-pc-2.meta
./archives/kenj-pc-diskstat.meta
./archives/20041125.meta
./archives/20071023-08-06-36.meta
./archives/20101004-trunc.meta
./archives/20130706.meta
./archives/20150105.17.57-00.meta
./archives/20150105.17.57.meta
"
date >> $seq.full
_run_helgrind --sudo src/multithread10 $archives $ips $archives $ips
_filter_ncpu <$tmp.valgrind.out | _filter_connect_fail
if [ -s $tmp.valgrind.err ]
then
    echo "=== filtered stderr ==="
    grep -v 'warn fail multithread10' $tmp.valgrind.err
fi
date >> $seq.full

# success, all done
exit
