#!/bin/sh
# PCP QA Test No. 1661
# Test pmproxy libpcp_web discovery file descriptor leaks
#
# Copyright (c) 2019 Red Hat.  All Rights Reserved.
#

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 "Test only runs on Linux"
which pmproxy >/dev/null 2>&1 || _notrun "No pmproxy binary installed"

_cleanup()
{
    _restore_config $PCP_ETC_DIR/pcp/pmlogger
    _service pcp restart 2>&1 | _filter_pcp_stop | _filter_pcp_start
    _wait_for_pmcd
    _wait_for_pmlogger
    echo;echo === restarting pmproxy
    _service pmproxy restart 2>&1 | _filter_pcp_start
    _wait_for_pmproxy
    $sudo rm -rf $tmp.*
}

status=1	# failure is the default!
$sudo rm -rf $tmp $tmp.*
trap "_cleanup; exit \$status" 0 1 2 3 15

# real QA test starts here

# only want the primary logger running
_save_config $PCP_ETC_DIR/pcp/pmlogger
_restore_pmlogger_control

echo;echo === restarting pmproxy service to ensure sane starting condition 
_service pmlogger stop 2>&1 | _filter_pcp_stop
_service pmproxy restart 2>&1 | _filter_pcp_stop | _filter_pcp_start
# give pmproxy a chance to startup
pmsleep 2; _wait_for_pmproxy

pmproxy_pid=`_get_pids_by_name -a pmproxy`
[ -z "$pmproxy_pid" ] && echo === pmproxy not running && status=1 && exit 1

echo;echo === creating archive in new archive directory 
dir=$PCP_LOG_DIR/pmlogger/qa1661
$sudo sh -c ". $PCP_SHARE_DIR/lib/rc-proc.sh; mkdir_and_chown $dir 775 $PCP_USER:$PCP_GROUP"
$sudo sh -c "pmlogger -s 20 -t 1 -c config.default -l$tmp.pmlogger.log $dir/testarchive"

echo;echo === checking pmproxy file descriptors for deleted files, should be none 
$sudo ls -l /proc/$pmproxy_pid/fd | grep 'testarchive.*(deleted)'

echo;echo === compressing the new archives, which also deletes the originals 
$sudo xz $dir/testarchive.{0,meta}
$sudo chown -R $PCP_USER $dir

echo;echo === restarting pmlogger # primary only
_service pmlogger restart 2>&1 | _filter_pcp_start
_wait_for_pmlogger

echo;echo === wait for pmproxy to process filesystem events
pmsleep 5

echo;echo === checking pmproxy file descriptors for deleted files, should be none 
$sudo ls -l /proc/$pmproxy_pid/fd | grep 'testarchive.*(deleted)'

echo;echo === cleaning up
$sudo rm -rf $dir

echo;echo === see $seq.full for pmproxy logs 
cat $PCP_LOG_DIR/pmproxy/pmproxy.log >>$seq.full

# success, all done
status=0
exit
