]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Try to improve rrl timing
authorMark Andrews <marka@isc.org>
Wed, 16 Sep 2020 02:40:52 +0000 (12:40 +1000)
committerMark Andrews <marka@isc.org>
Thu, 15 Oct 2020 00:05:12 +0000 (00:05 +0000)
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.

bin/tests/system/rrl/tests.sh
bin/tools/mdig.c
bin/tools/mdig.rst
doc/man/mdig.1in

index 2342e0e71b6aa3c05d8b9d149f91a72904f38e8c..764ccb8e6922e5cac49b89c940a784d7e2f62ab1 100644 (file)
@@ -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
index a69b1e4e8ce610308b9f7ab3fc5848649030f97a..884075b9cf80334ea082a62c241262651b047d1d 100644 (file)
 #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);
index 085d28af6abdccb9975e2c74ca60b4a16a95732a..7f8138c56186510e1d2dee1582ea9616b1dbfc5c 100644 (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
    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.
 
index 29f2058f47261931ddf02964ab956cc29a618865..4c3fe9177d0f89e81865455938d3eef78f64b5e9 100644 (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
 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