2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-09-03 16:15:27 +00:00

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=<now+2> (further extend mdig) instead of the
implicit <now+1> as the trigger second.
This commit is contained in:
Mark Andrews
2020-09-16 12:40:52 +10:00
parent 3562cc7c89
commit 92cdc7b6c7
4 changed files with 77 additions and 12 deletions

View File

@@ -80,7 +80,7 @@ burst () {
eval BURST_DOM="$BURST_DOM_BASE" eval BURST_DOM="$BURST_DOM_BASE"
DOMS="$DOMS $BURST_DOM" DOMS="$DOMS $BURST_DOM"
done 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 | \ $MDIG $ARGS 2>&1 | \
tr -d '\r' | \ tr -d '\r' | \
tee -a full-$FILENAME | \ tee -a full-$FILENAME | \
@@ -92,7 +92,7 @@ burst () {
-e 's/;; .* status: NOERROR.*/NOERROR/p' \ -e 's/;; .* status: NOERROR.*/NOERROR/p' \
-e 's/;; .* status: SERVFAIL.*/SERVFAIL/p' \ -e 's/;; .* status: SERVFAIL.*/SERVFAIL/p' \
-e 's/response failed with timed out.*/drop/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` QNUM=`expr $QNUM + $BURST_LIMIT`
} }
@@ -104,6 +104,8 @@ range () {
# $1=domain $2=IP address $3=# of IP addresses $4=TC $5=drop # $1=domain $2=IP address $3=# of IP addresses $4=TC $5=drop
# $6=NXDOMAIN $7=SERVFAIL or other errors # $6=NXDOMAIN $7=SERVFAIL or other errors
ck_result() { ck_result() {
# wait to the background mdig calls to complete.
wait
BAD=no BAD=no
ADDRS=`egrep "^$2$" mdig.out-$1 2>/dev/null | wc -l` ADDRS=`egrep "^$2$" mdig.out-$1 2>/dev/null | wc -l`
# count simple truncated and truncated NXDOMAIN as TC # count simple truncated and truncated NXDOMAIN as TC

View File

@@ -83,10 +83,15 @@
#define UDPTIMEOUT 5 #define UDPTIMEOUT 5
#define MAXTRIES 0xffffffff #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 isc_mem_t *mctx;
static dns_requestmgr_t *requestmgr; static dns_requestmgr_t *requestmgr;
static const char *batchname; static const char *batchname;
static FILE *batchfp; static FILE *batchfp;
static bool burst = false;
static bool have_ipv4 = false; static bool have_ipv4 = false;
static bool have_ipv6 = false; static bool have_ipv6 = false;
static bool have_src = false; static bool have_src = false;
@@ -1222,18 +1227,29 @@ plus_option(char *option, struct query *query, bool global) {
GLOBAL(); GLOBAL();
besteffort = state; besteffort = state;
break; break;
case 'u': /* bufsize */ case 'u':
FULLCHECK("bufsize"); switch (cmd[2]) {
if (value == NULL) { case 'f': /* bufsize */
goto need_value; FULLCHECK("bufsize");
} if (value == NULL) {
if (!state) { 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; goto invalid_option;
} }
result = parse_uint(&num, value, COMMSIZE,
"buffer size");
CHECK("parse_uint(buffer size)", result);
query->udpsize = num;
break; break;
default: default:
goto invalid_option; 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 */ /*% Main processing routine for mdig */
int int
main(int argc, char *argv[]) { main(int argc, char *argv[]) {
@@ -2152,6 +2183,32 @@ main(int argc, char *argv[]) {
query = ISC_LIST_HEAD(queries); query = ISC_LIST_HEAD(queries);
RUNCHECK(isc_app_onrun(mctx, task, sendqueries, query)); 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(); (void)isc_app_run();
query = ISC_LIST_HEAD(queries); query = ISC_LIST_HEAD(queries);

View File

@@ -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 This option attempts to display [or does not display] the contents of messages which are malformed. The
default is to not display malformed answers. default is to not display malformed answers.
``+burst``
This option delays queries until the start of the next second.
``+[no]cl`` ``+[no]cl``
This option displays [or does not display] the CLASS when printing the record. This option displays [or does not display] the CLASS when printing the record.

View File

@@ -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 This option attempts to display [or does not display] the contents of messages which are malformed. The
default is to not display malformed answers. default is to not display malformed answers.
.TP .TP
.B \fB+burst\fP
This option delays queries until the start of the next second.
.TP
.B \fB+[no]cl\fP .B \fB+[no]cl\fP
This option displays [or does not display] the CLASS when printing the record. This option displays [or does not display] the CLASS when printing the record.
.TP .TP