From: Libor Peltan Date: Mon, 14 Apr 2025 12:33:04 +0000 (+0200) Subject: kdig: implemented message read delay... X-Git-Tag: v3.5.0~112^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e82d2618dad59ec1ca5d75906fbc1f6dbcbfca1c;p=thirdparty%2Fknot-dns.git kdig: implemented message read delay... ...in order to debug slow XFRs and their interferences --- diff --git a/doc/man_kdig.rst b/doc/man_kdig.rst index 358f34b8ea..02e64ac5e1 100644 --- a/doc/man_kdig.rst +++ b/doc/man_kdig.rst @@ -308,6 +308,9 @@ Options **+**\ [\ **no**\ ]\ **edns**\[\ =\ *N*\] Use EDNS version (default is 0). +**+**\ [\ **no**\ ]\ **msgdelay**\ =\ *T* + Wait the specified number of milliseconds before receiving each AXFR/IXFR message. + **+**\ [\ **no**\ ]\ **timeout**\ =\ *T* Set the wait-for-reply interval in seconds (default is 5 seconds). This timeout applies to each query attempt. Zero value or *notimeout* is interpreted as diff --git a/src/utils/kdig/kdig_exec.c b/src/utils/kdig/kdig_exec.c index 873a8ec368..4a47c4f099 100644 --- a/src/utils/kdig/kdig_exec.c +++ b/src/utils/kdig/kdig_exec.c @@ -1025,6 +1025,8 @@ static int process_xfr_packet(const knot_pkt_t *query, while (true) { reply = NULL; + usleep(query_ctx->msgdelay * 1000LU); + // Receive a reply message. in_len = net_receive(net, in, sizeof(in)); t_end = time_now(); diff --git a/src/utils/kdig/kdig_params.c b/src/utils/kdig/kdig_params.c index 03ece548c1..a37def275e 100644 --- a/src/utils/kdig/kdig_params.c +++ b/src/utils/kdig/kdig_params.c @@ -1261,6 +1261,27 @@ static int opt_noedns(const char *arg, void *query) return KNOT_EOK; } +static int opt_msgdelay(const char *arg, void *query) +{ + query_t *q = query; + + if (str_to_u32(arg, &q->msgdelay) != KNOT_EOK) { + ERR("invalid +msgdelay=%s", arg); + return KNOT_EINVAL; + } + + return KNOT_EOK; +} + +static int opt_nomsgdelay(const char *arg, void *query) +{ + query_t *q = query; + + q->msgdelay = 0; + + return KNOT_EOK; +} + static int opt_timeout(const char *arg, void *query) { query_t *q = query; @@ -1645,6 +1666,9 @@ static const param_t kdig_opts2[] = { { "edns", ARG_OPTIONAL, opt_edns }, { "noedns", ARG_NONE, opt_noedns }, + { "msgdelay", ARG_REQUIRED, opt_msgdelay }, + { "nomsgdelay", ARG_NONE, opt_nomsgdelay }, + { "timeout", ARG_REQUIRED, opt_timeout }, { "notimeout", ARG_NONE, opt_notimeout }, @@ -2400,6 +2424,7 @@ static void print_help(void) " +[no]alignment[=N] Pad with EDNS(0) to blocksize (%u or specify size).\n" " +[no]subnet=SUBN Set EDNS(0) client subnet addr/prefix.\n" " +[no]edns[=N] Use EDNS(=version).\n" + " +[no]msgdelay=T Wait this ms before receiving each XFR message.\n" " +[no]timeout=T Set wait for reply interval in seconds.\n" " +[no]retry=N Set number of retries.\n" " +[no]expire Set the EXPIRE EDNS option.\n" diff --git a/src/utils/kdig/kdig_params.h b/src/utils/kdig/kdig_params.h index 7667fc3354..24c8bc27b4 100644 --- a/src/utils/kdig/kdig_params.h +++ b/src/utils/kdig/kdig_params.h @@ -79,6 +79,8 @@ struct query { int32_t udp_size; /*!< Number of UDP retries. */ uint32_t retries; + /*!< Wait this milliseconds before receiving each XFR message. */ + uint32_t msgdelay; /*!< Wait for network response in seconds (-1 means forever). */ int32_t wait; /*!< Ignore truncated response. */