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:
@@ -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
|
||||||
|
@@ -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);
|
||||||
|
@@ -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.
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user