From: Mark Andrews Date: Wed, 16 Sep 2020 02:40:52 +0000 (+1000) Subject: Try to improve rrl timing X-Git-Tag: v9.17.7~56^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=92cdc7b6c7eec674fa03e7f87854cd5528c37f48;p=thirdparty%2Fbind9.git Try to improve rrl timing Add a +burst option to mdig so that we have a second to setup the mdig calls then they run at the start of the next second. RRL uses 'queries in a second' as a approximation to 'queries per second'. Getting the bursts of traffic to all happen in the same second should prevent false negatives in the system test. We now have a second to setup the traffic in. Then the traffic should be sent at the start of the next second. If that still fails we should move to +burst= (further extend mdig) instead of the implicit as the trigger second. --- diff --git a/bin/tests/system/rrl/tests.sh b/bin/tests/system/rrl/tests.sh index 2342e0e71b6..764ccb8e692 100644 --- a/bin/tests/system/rrl/tests.sh +++ b/bin/tests/system/rrl/tests.sh @@ -80,7 +80,7 @@ burst () { eval BURST_DOM="$BURST_DOM_BASE" DOMS="$DOMS $BURST_DOM" done - ARGS="+nocookie +continue +time=1 +tries=1 -p ${PORT} $* @$ns2 $DOMS" + ARGS="+burst +nocookie +continue +time=1 +tries=1 -p ${PORT} $* @$ns2 $DOMS" $MDIG $ARGS 2>&1 | \ tr -d '\r' | \ tee -a full-$FILENAME | \ @@ -92,7 +92,7 @@ burst () { -e 's/;; .* status: NOERROR.*/NOERROR/p' \ -e 's/;; .* status: SERVFAIL.*/SERVFAIL/p' \ -e 's/response failed with timed out.*/drop/p' \ - -e 's/;; communications error to.*/drop/p' >> $FILENAME + -e 's/;; communications error to.*/drop/p' >> $FILENAME & QNUM=`expr $QNUM + $BURST_LIMIT` } @@ -104,6 +104,8 @@ range () { # $1=domain $2=IP address $3=# of IP addresses $4=TC $5=drop # $6=NXDOMAIN $7=SERVFAIL or other errors ck_result() { + # wait to the background mdig calls to complete. + wait BAD=no ADDRS=`egrep "^$2$" mdig.out-$1 2>/dev/null | wc -l` # count simple truncated and truncated NXDOMAIN as TC diff --git a/bin/tools/mdig.c b/bin/tools/mdig.c index a69b1e4e8ce..884075b9cf8 100644 --- a/bin/tools/mdig.c +++ b/bin/tools/mdig.c @@ -83,10 +83,15 @@ #define UDPTIMEOUT 5 #define MAXTRIES 0xffffffff +#define NS_PER_US 1000 /*%< Nanoseconds per microsecond. */ +#define US_PER_SEC 1000000 /*%< Microseconds per second. */ +#define US_PER_MS 1000 /*%< Microseconds per millisecond. */ + static isc_mem_t *mctx; static dns_requestmgr_t *requestmgr; static const char *batchname; static FILE *batchfp; +static bool burst = false; static bool have_ipv4 = false; static bool have_ipv6 = false; static bool have_src = false; @@ -1222,18 +1227,29 @@ plus_option(char *option, struct query *query, bool global) { GLOBAL(); besteffort = state; break; - case 'u': /* bufsize */ - FULLCHECK("bufsize"); - if (value == NULL) { - goto need_value; - } - if (!state) { + case 'u': + switch (cmd[2]) { + case 'f': /* bufsize */ + FULLCHECK("bufsize"); + if (value == NULL) { + goto need_value; + } + if (!state) { + goto invalid_option; + } + result = parse_uint(&num, value, COMMSIZE, + "buffer size"); + CHECK("parse_uint(buffer size)", result); + query->udpsize = num; + break; + case 'r': /* burst */ + FULLCHECK("burst"); + GLOBAL(); + burst = state; + break; + default: goto invalid_option; } - result = parse_uint(&num, value, COMMSIZE, - "buffer size"); - CHECK("parse_uint(buffer size)", result); - query->udpsize = num; break; default: goto invalid_option; @@ -2044,6 +2060,21 @@ parse_args(bool is_batchfile, int argc, char **argv) { } } +#ifdef WIN32 +static void +usleep(unsigned int usec) { + HANDLE timer; + LARGE_INTEGER ft; + + ft.QuadPart = -(10 * (__int64)usec); + + timer = CreateWaitableTimer(NULL, TRUE, NULL); + SetWaitableTimer(timer, &ft, 0, NULL, NULL, 0); + WaitForSingleObject(timer, INFINITE); + CloseHandle(timer); +} +#endif + /*% Main processing routine for mdig */ int main(int argc, char *argv[]) { @@ -2152,6 +2183,32 @@ main(int argc, char *argv[]) { query = ISC_LIST_HEAD(queries); RUNCHECK(isc_app_onrun(mctx, task, sendqueries, query)); + /* + * Stall to the start of a new second. + */ + if (burst) { + isc_time_t start, now; + RUNCHECK(isc_time_now(&start)); + /* + * Sleep to 1ms of the end of the second then run a busy loop + * until the second changes. + */ + do { + RUNCHECK(isc_time_now(&now)); + if (isc_time_seconds(&start) == isc_time_seconds(&now)) + { + int us = US_PER_SEC - + (isc_time_nanoseconds(&now) / + NS_PER_US); + if (us > US_PER_MS) { + usleep(us - US_PER_MS); + } + } else { + break; + } + } while (1); + } + (void)isc_app_run(); query = ISC_LIST_HEAD(queries); diff --git a/bin/tools/mdig.rst b/bin/tools/mdig.rst index 085d28af6ab..7f8138c5618 100644 --- a/bin/tools/mdig.rst +++ b/bin/tools/mdig.rst @@ -130,6 +130,9 @@ The global query options are: This option attempts to display [or does not display] the contents of messages which are malformed. The default is to not display malformed answers. +``+burst`` + This option delays queries until the start of the next second. + ``+[no]cl`` This option displays [or does not display] the CLASS when printing the record. diff --git a/doc/man/mdig.1in b/doc/man/mdig.1in index 29f2058f472..4c3fe9177d0 100644 --- a/doc/man/mdig.1in +++ b/doc/man/mdig.1in @@ -132,6 +132,9 @@ default is to display it. This option attempts to display [or does not display] the contents of messages which are malformed. The default is to not display malformed answers. .TP +.B \fB+burst\fP +This option delays queries until the start of the next second. +.TP .B \fB+[no]cl\fP This option displays [or does not display] the CLASS when printing the record. .TP