Merge branch '1308-fix-tcp-system-test' into 'master'
Fix "tcp" system test Closes #1308 See merge request isc-projects/bind9!2549
This commit is contained in:
@@ -208,12 +208,12 @@ DISABLED_BITS=384
|
||||
# the error using the description of the tested variable provided in $3
|
||||
# and return 1.
|
||||
assert_int_equal() {
|
||||
expected="$1"
|
||||
found="$2"
|
||||
found="$1"
|
||||
expected="$2"
|
||||
description="$3"
|
||||
|
||||
if [ "${expected}" -ne "${found}" ]; then
|
||||
echo_i "incorrect ${description}: expected ${expected}, got ${found}"
|
||||
echo_i "incorrect ${description}: got ${found}, expected ${expected}"
|
||||
return 1
|
||||
fi
|
||||
|
||||
@@ -338,6 +338,26 @@ nextpartpeek() {
|
||||
nextpartread $1 2> /dev/null
|
||||
}
|
||||
|
||||
# retry: keep running a command until it succeeds, up to $1 times, with
|
||||
# one-second intervals
|
||||
retry() {
|
||||
__retries="${1}"
|
||||
shift
|
||||
|
||||
while :; do
|
||||
if "$@"; then
|
||||
return 0
|
||||
fi
|
||||
__retries=$((__retries-1))
|
||||
if [ "${__retries}" -gt 0 ]; then
|
||||
echo_i "retrying"
|
||||
sleep 1
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
rndc_reload() {
|
||||
echo_i "`$RNDC -c ../common/rndc.conf -s $2 -p ${CONTROLPORT} reload $3 2>&1 | sed 's/^/'$1' /'`"
|
||||
# reloading single zone is synchronous, if we're reloading whole server
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
rm -f */named.memstats
|
||||
rm -f */named.run
|
||||
rm -f */named.conf
|
||||
rm -f */named.stats
|
||||
rm -f */named.stats*
|
||||
rm -f ans6/ans.run*
|
||||
rm -f dig.out*
|
||||
rm -f rndc.out*
|
||||
|
||||
@@ -9,58 +9,70 @@
|
||||
# See the COPYRIGHT file distributed with this work for additional
|
||||
# information regarding copyright ownership.
|
||||
|
||||
SYSTEMTESTTOP=..
|
||||
. $SYSTEMTESTTOP/conf.sh
|
||||
set -e
|
||||
|
||||
DIGOPTS="-p ${PORT}"
|
||||
RNDCCMD="$RNDC -p ${CONTROLPORT} -c ../common/rndc.conf"
|
||||
SEND="$PERL $SYSTEMTESTTOP/send.pl 10.53.0.6 ${CONTROLPORT}"
|
||||
SYSTEMTESTTOP=..
|
||||
# shellcheck source=../conf.sh
|
||||
. "$SYSTEMTESTTOP/conf.sh"
|
||||
|
||||
dig_with_opts() {
|
||||
"${DIG}" -p "${PORT}" "$@"
|
||||
}
|
||||
|
||||
rndccmd() {
|
||||
"${RNDC}" -p "${CONTROLPORT}" -c ../common/rndc.conf -s "$@"
|
||||
}
|
||||
|
||||
status=0
|
||||
n=0
|
||||
|
||||
echo_i "initialize counters"
|
||||
$RNDCCMD -s 10.53.0.1 stats > /dev/null 2>&1
|
||||
$RNDCCMD -s 10.53.0.2 stats > /dev/null 2>&1
|
||||
ntcp10=`grep "TCP requests received" ns1/named.stats | tail -1 | awk '{print $1}'`
|
||||
ntcp20=`grep "TCP requests received" ns2/named.stats | tail -1 | awk '{print $1}'`
|
||||
#echo ntcp10 ':' "$ntcp10"
|
||||
#echo ntcp20 ':' "$ntcp20"
|
||||
|
||||
echo_i "check TCP transport"
|
||||
n=$((n + 1))
|
||||
echo_i "initializing TCP statistics ($n)"
|
||||
ret=0
|
||||
$DIG $DIGOPTS @10.53.0.3 txt.example. > dig.out.3
|
||||
rndccmd 10.53.0.1 stats || ret=1
|
||||
rndccmd 10.53.0.2 stats || ret=1
|
||||
mv ns1/named.stats ns1/named.stats.test$n
|
||||
mv ns2/named.stats ns2/named.stats.test$n
|
||||
ntcp10="$(grep "TCP requests received" ns1/named.stats.test$n | tail -1 | awk '{print $1}')"
|
||||
ntcp20="$(grep "TCP requests received" ns2/named.stats.test$n | tail -1 | awk '{print $1}')"
|
||||
if [ $ret != 0 ]; then echo_i "failed"; fi
|
||||
status=$((status + ret))
|
||||
|
||||
n=$((n + 1))
|
||||
echo_i "checking TCP request statistics (resolver) ($n)"
|
||||
ret=0
|
||||
dig_with_opts @10.53.0.3 txt.example. > dig.out.test$n
|
||||
sleep 1
|
||||
$RNDCCMD -s 10.53.0.1 stats > /dev/null 2>&1
|
||||
$RNDCCMD -s 10.53.0.2 stats > /dev/null 2>&1
|
||||
ntcp11=`grep "TCP requests received" ns1/named.stats | tail -1 | awk '{print $1}'`
|
||||
ntcp21=`grep "TCP requests received" ns2/named.stats | tail -1 | awk '{print $1}'`
|
||||
#echo ntcp11 ':' "$ntcp11"
|
||||
#echo ntcp21 ':' "$ntcp21"
|
||||
rndccmd 10.53.0.1 stats || ret=1
|
||||
rndccmd 10.53.0.2 stats || ret=1
|
||||
mv ns1/named.stats ns1/named.stats.test$n
|
||||
mv ns2/named.stats ns2/named.stats.test$n
|
||||
ntcp11="$(grep "TCP requests received" ns1/named.stats.test$n | tail -1 | awk '{print $1}')"
|
||||
ntcp21="$(grep "TCP requests received" ns2/named.stats.test$n | tail -1 | awk '{print $1}')"
|
||||
if [ "$ntcp10" -ge "$ntcp11" ]; then ret=1; fi
|
||||
if [ "$ntcp20" -ne "$ntcp21" ]; then ret=1; fi
|
||||
if [ $ret != 0 ]; then echo_i "failed"; fi
|
||||
status=`expr $status + $ret`
|
||||
status=$((status + ret))
|
||||
|
||||
echo_i "check TCP forwarder"
|
||||
n=$((n + 1))
|
||||
echo_i "checking TCP request statistics (forwarder) ($n)"
|
||||
ret=0
|
||||
$DIG $DIGOPTS @10.53.0.4 txt.example. > dig.out.4
|
||||
dig_with_opts @10.53.0.4 txt.example. > dig.out.test$n
|
||||
sleep 1
|
||||
$RNDCCMD -s 10.53.0.1 stats > /dev/null 2>&1
|
||||
$RNDCCMD -s 10.53.0.2 stats > /dev/null 2>&1
|
||||
ntcp12=`grep "TCP requests received" ns1/named.stats | tail -1 | awk '{print $1}'`
|
||||
ntcp22=`grep "TCP requests received" ns2/named.stats | tail -1 | awk '{print $1}'`
|
||||
#echo ntcp12 ':' "$ntcp12"
|
||||
#echo ntcp22 ':' "$ntcp22"
|
||||
rndccmd 10.53.0.1 stats || ret=1
|
||||
rndccmd 10.53.0.2 stats || ret=1
|
||||
mv ns1/named.stats ns1/named.stats.test$n
|
||||
mv ns2/named.stats ns2/named.stats.test$n
|
||||
ntcp12="$(grep "TCP requests received" ns1/named.stats.test$n | tail -1 | awk '{print $1}')"
|
||||
ntcp22="$(grep "TCP requests received" ns2/named.stats.test$n | tail -1 | awk '{print $1}')"
|
||||
if [ "$ntcp11" -ne "$ntcp12" ]; then ret=1; fi
|
||||
if [ "$ntcp21" -ge "$ntcp22" ];then ret=1; fi
|
||||
if [ $ret != 0 ]; then echo_i "failed"; fi
|
||||
status=`expr $status + $ret`
|
||||
status=$((status + ret))
|
||||
|
||||
# -------- TCP high-water tests ----------
|
||||
n=0
|
||||
|
||||
refresh_tcp_stats() {
|
||||
$RNDCCMD -s 10.53.0.5 status > rndc.out.$n || ret=1
|
||||
rndccmd 10.53.0.5 status > rndc.out.$n || ret=1
|
||||
TCP_CUR="$(sed -n "s/^tcp clients: \([0-9][0-9]*\).*/\1/p" rndc.out.$n)"
|
||||
TCP_LIMIT="$(sed -n "s/^tcp clients: .*\/\([0-9][0-9]*\)/\1/p" rndc.out.$n)"
|
||||
TCP_HIGH="$(sed -n "s/^TCP high-water: \([0-9][0-9]*\)/\1/p" rndc.out.$n)"
|
||||
@@ -69,7 +81,7 @@ refresh_tcp_stats() {
|
||||
wait_for_log() {
|
||||
msg=$1
|
||||
file=$2
|
||||
for i in 1 2 3 4 5 6 7 8 9 10; do
|
||||
for _ in 1 2 3 4 5 6 7 8 9 10; do
|
||||
nextpart "$file" | grep "$msg" > /dev/null && return
|
||||
sleep 1
|
||||
done
|
||||
@@ -80,8 +92,8 @@ wait_for_log() {
|
||||
# Send a command to the tool script listening on 10.53.0.6.
|
||||
send_command() {
|
||||
nextpart ans6/ans.run > /dev/null
|
||||
echo "$*" | $SEND
|
||||
wait_for_log "result=OK" ans6/ans.run
|
||||
echo "$*" | "${PERL}" "${SYSTEMTESTTOP}/send.pl" 10.53.0.6 "${CONTROLPORT}"
|
||||
wait_for_log "result=" ans6/ans.run
|
||||
}
|
||||
|
||||
# Instructs ans6 to open $1 TCP connections to 10.53.0.5.
|
||||
@@ -102,7 +114,7 @@ ret=0
|
||||
refresh_tcp_stats
|
||||
assert_int_equal "${TCP_CUR}" 1 "current TCP clients count" || ret=1
|
||||
if [ $ret != 0 ]; then echo_i "failed"; fi
|
||||
status=`expr $status + $ret`
|
||||
status=$((status + ret))
|
||||
|
||||
# Ensure the TCP high-water statistic gets updated after some TCP connections
|
||||
# are established.
|
||||
@@ -112,11 +124,14 @@ ret=0
|
||||
OLD_TCP_CUR="${TCP_CUR}"
|
||||
TCP_ADDED=9
|
||||
open_connections "${TCP_ADDED}"
|
||||
refresh_tcp_stats
|
||||
assert_int_equal "${TCP_CUR}" $((OLD_TCP_CUR + TCP_ADDED)) "current TCP clients count" || ret=1
|
||||
assert_int_equal "${TCP_HIGH}" $((OLD_TCP_CUR + TCP_ADDED)) "TCP high-water value" || ret=1
|
||||
check_stats_added() {
|
||||
refresh_tcp_stats
|
||||
assert_int_equal "${TCP_CUR}" $((OLD_TCP_CUR + TCP_ADDED)) "current TCP clients count" || return 1
|
||||
assert_int_equal "${TCP_HIGH}" $((OLD_TCP_CUR + TCP_ADDED)) "TCP high-water value" || return 1
|
||||
}
|
||||
retry 2 check_stats_added || ret=1
|
||||
if [ $ret != 0 ]; then echo_i "failed"; fi
|
||||
status=`expr $status + $ret`
|
||||
status=$((status + ret))
|
||||
|
||||
# Ensure the TCP high-water statistic remains unchanged after some TCP
|
||||
# connections are closed.
|
||||
@@ -127,11 +142,14 @@ OLD_TCP_CUR="${TCP_CUR}"
|
||||
OLD_TCP_HIGH="${TCP_HIGH}"
|
||||
TCP_REMOVED=5
|
||||
close_connections "${TCP_REMOVED}"
|
||||
refresh_tcp_stats
|
||||
assert_int_equal "${TCP_CUR}" $((OLD_TCP_CUR - TCP_REMOVED)) "current TCP clients count" || ret=1
|
||||
assert_int_equal "${TCP_HIGH}" "${OLD_TCP_HIGH}" "TCP high-water value" || ret=1
|
||||
check_stats_removed() {
|
||||
refresh_tcp_stats
|
||||
assert_int_equal "${TCP_CUR}" $((OLD_TCP_CUR - TCP_REMOVED)) "current TCP clients count" || return 1
|
||||
assert_int_equal "${TCP_HIGH}" "${OLD_TCP_HIGH}" "TCP high-water value" || return 1
|
||||
}
|
||||
retry 2 check_stats_removed || ret=1
|
||||
if [ $ret != 0 ]; then echo_i "failed"; fi
|
||||
status=`expr $status + $ret`
|
||||
status=$((status + ret))
|
||||
|
||||
# Ensure the TCP high-water statistic never exceeds the configured TCP clients
|
||||
# limit.
|
||||
@@ -139,11 +157,14 @@ n=$((n + 1))
|
||||
echo_i "TCP high-water: ensure tcp-clients is an upper bound ($n)"
|
||||
ret=0
|
||||
open_connections $((TCP_LIMIT + 1))
|
||||
refresh_tcp_stats
|
||||
assert_int_equal "${TCP_CUR}" "${TCP_LIMIT}" "current TCP clients count" || ret=1
|
||||
assert_int_equal "${TCP_HIGH}" "${TCP_LIMIT}" "TCP high-water value" || ret=1
|
||||
check_stats_limit() {
|
||||
refresh_tcp_stats
|
||||
assert_int_equal "${TCP_CUR}" "${TCP_LIMIT}" "current TCP clients count" || return 1
|
||||
assert_int_equal "${TCP_HIGH}" "${TCP_LIMIT}" "TCP high-water value" || return 1
|
||||
}
|
||||
retry 2 check_stats_limit || ret=1
|
||||
if [ $ret != 0 ]; then echo_i "failed"; fi
|
||||
status=`expr $status + $ret`
|
||||
status=$((status + ret))
|
||||
|
||||
echo_i "exit status: $status"
|
||||
[ $status -eq 0 ] || exit 1
|
||||
|
||||
Reference in New Issue
Block a user