From c78048962cde82ba76f2124a1488d3042e1ea77b Mon Sep 17 00:00:00 2001 From: Bill Williams Date: Wed, 12 Sep 2018 09:41:16 -0700 Subject: [PATCH 1/3] extra messages in send_dg --- src/res_send.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/res_send.c b/src/res_send.c index 8fa6caa..20575cc 100644 --- a/src/res_send.c +++ b/src/res_send.c @@ -578,6 +578,7 @@ __libc_res_nsend(res_state statp, const u_char *buf, int buflen, __show_errno (ETIMEDOUT); /* no answer obtained */ } else __show_errno (terrno); + return (-1); } @@ -1095,6 +1096,8 @@ send_dg(res_state statp, int save_gotsomewhere = *gotsomewhere; int retval; + ucresolv_info ("send_dg retrans %d, retry %d\n", + statp->retrans, statp->retry); retry_reopen: retval = reopen (statp, terrno, ns); if (retval <= 0) @@ -1423,7 +1426,9 @@ send_dg(res_state statp, * To get the rest of answer, * use TCP with same server. */ - ucresolv_info("Answer is truncated. Using same server to get rest of answer.\n"); + ucresolv_info("Answer is truncated (%d of %d) HF %d. " + "Using same server to get rest of answer.\n", + *thisresplenp, *thisanssizp, HFIXEDSZ); Dprint(statp->options & RES_DEBUG, (stdout, ";; truncated answer\n")); *v_circuit = 1; From 0ab7d89de3e73fbe6fb208ab85d0752a6b57dd29 Mon Sep 17 00:00:00 2001 From: Bill Williams Date: Tue, 18 Sep 2018 15:31:55 -0700 Subject: [PATCH 2/3] debug msgs into send_vc --- src/res_send.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/res_send.c b/src/res_send.c index 20575cc..430dede 100644 --- a/src/res_send.c +++ b/src/res_send.c @@ -752,6 +752,7 @@ send_vc(res_state statp, Perror(statp, stderr, "socket(vc)", errno); if (resplen2 != NULL) *resplen2 = 0; + ucresolv_info ("send_vc: cannot create socket\n"); return (-1); } __show_errno (0); @@ -761,6 +762,7 @@ send_vc(res_state statp, : sizeof (struct sockaddr_in6)) < 0) { *terrno = errno; Aerror(statp, stderr, "connect/vc", errno, nsap); + ucresolv_info ("send_vc: cannot connect to socket\n"); return close_and_return_error (statp, resplen2); } statp->_flags |= RES_F_VC; @@ -784,6 +786,8 @@ send_vc(res_state statp, if (TEMP_FAILURE_RETRY (writev(statp->_vcsock, iov, niov)) != explen) { *terrno = errno; Perror(statp, stderr, "write failed", errno); + ucresolv_info ("send_vc: write failed: %d, %s\n", + errno, strerror (errno)); return close_and_return_error (statp, resplen2); } /* @@ -820,8 +824,11 @@ send_vc(res_state statp, //__res_iclose(statp, false); res_nclose(statp); connreset = 1; + ucresolv_info ("send_vc: read len conn reset\n"); goto same_ns; } + ucresolv_info ("send_vc: read len failed, %d %s\n", + errno, strerror(errno)); return close_and_return_error (statp, resplen2); } int rlen = ntohs (rlen16); @@ -885,6 +892,7 @@ send_vc(res_state statp, Dprint(statp->options & RES_DEBUG, (stdout, ";; undersized: %d\n", len)); *terrno = EMSGSIZE; + ucresolv_info ("send_vc: read < HF\n"); return close_and_return_error (statp, resplen2); } @@ -896,6 +904,8 @@ send_vc(res_state statp, if (__glibc_unlikely (n <= 0)) { *terrno = errno; Perror(statp, stderr, "read(vc)", errno); + ucresolv_info ("send_vc: read data failed %d %s\n", + errno, strerror(errno)); return close_and_return_error (statp, resplen2); } if (__glibc_unlikely (truncating)) { @@ -945,6 +955,7 @@ send_vc(res_state statp, * All is well, or the error is fatal. Signal that the * next nameserver ought not be tried. */ + ucresolv_info ("send_vc: read %d\n", resplen); return resplen; } From 0498844ecb2480de09f6abb1ad4de65b20c2081a Mon Sep 17 00:00:00 2001 From: Bill Williams Date: Tue, 9 Oct 2018 16:06:18 -0700 Subject: [PATCH 3/3] backoff delays between retries --- src/res_send.c | 11 ++++++++--- src/ucresolv.h | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/res_send.c b/src/res_send.c index 430dede..8d2319d 100644 --- a/src/res_send.c +++ b/src/res_send.c @@ -399,6 +399,7 @@ __libc_res_nsend(res_state statp, const u_char *buf, int buflen, int *nansp2, int *resplen2, int *ansp2_malloced) { int gotsomewhere, terrno, try, v_circuit, resplen, ns, n; + int retry_wait = 1; ucresolv_debug("UCLIBC __libc_res_nsend\n"); if (statp->nscount == 0) { __show_errno (ESRCH); @@ -568,6 +569,9 @@ __libc_res_nsend(res_state statp, const u_char *buf, int buflen, return (resplen); next_ns: ; } /*foreach ns*/ + if (retry_wait < 31) + retry_wait = (2*retry_wait) + 1; + sleep(retry_wait); } /*foreach retry*/ //__res_iclose(statp, false); res_nclose(statp); @@ -1109,13 +1113,13 @@ send_dg(res_state statp, int retval; ucresolv_info ("send_dg retrans %d, retry %d\n", statp->retrans, statp->retry); - retry_reopen: + retry_reopen: retval = reopen (statp, terrno, ns); if (retval <= 0) { if (resplen2 != NULL) *resplen2 = 0; - ucresolv_debug ("UCLIBC send_dg rtn 1 retry_reopen\n"); + ucresolv_info ("UCLIBC send_dg rtn 1 retry_reopen\n"); return retval; } retry: @@ -1150,6 +1154,7 @@ send_dg(res_state statp, if (nwritten == 0) n = poll (pfd, 1, 0); if (__glibc_unlikely (n == 0)) { + ucresolv_info ("UCLIBC send_dg rtn poll with timeout\n"); n = poll (pfd, 1, ptimeout); need_recompute = 1; } @@ -1399,7 +1404,7 @@ send_dg(res_state statp, next_ns: if (recvresp1 || (buf2 != NULL && recvresp2)) { *resplen2 = 0; - ucresolv_debug ("send_dg rtn 9 next_ns\n"); + ucresolv_info ("UCLIBC send_dg rtn 9 next_ns\n"); return resplen; } if (buf2 != NULL) diff --git a/src/ucresolv.h b/src/ucresolv.h index a1f8144..3ab980f 100644 --- a/src/ucresolv.h +++ b/src/ucresolv.h @@ -81,7 +81,7 @@ # define RES_MAXNDOTS 15 /* should reflect bit field size */ # define RES_MAXRETRANS 30 /* only for resolv.conf/RES_OPTIONS */ # define RES_MAXRETRY 5 /* only for resolv.conf/RES_OPTIONS */ -# define RES_DFLRETRY 2 /* Default #/tries. */ +# define RES_DFLRETRY 5 /* Default #/tries. */ # define RES_MAXTIME 65535 /* Infinity, in milliseconds. */ struct __res_state {