r12000@catbus: nickm | 2007-02-28 15:12:21 -0500

Try to fix eventdns bug 326 again, this time by noting that rcode 2 (serverfailed) does not really mean "The server is useless."


svn:r9687
This commit is contained in:
Nick Mathewson 2007-02-28 20:24:23 +00:00
parent 08c75f4349
commit 3008c3b768
2 changed files with 19 additions and 6 deletions

View File

@ -14,6 +14,10 @@ Changes in version 0.1.2.9-??? - 2007-??-??
to INT32_MAX.
- Fix a potential race condition in the rpm installer. Found by
Stefan Nordhausen.
- Try to fix eventdns warnings once and for all: do not treat a dns rcode
of 2 as indicating that the server is completely bad; it sometimes
means that the server is just bad for the request in question. (may fix
the last of bug 326.)
Changes in version 0.1.2.8-beta - 2007-02-26

View File

@ -696,7 +696,6 @@ reply_handle(struct request *const req, u16 flags, u32 ttl, struct reply *reply)
}
switch(error) {
case DNS_ERR_SERVERFAILED:
case DNS_ERR_NOTIMPL:
case DNS_ERR_REFUSED:
// we regard these errors as marking a bad nameserver
@ -708,6 +707,15 @@ reply_handle(struct request *const req, u16 flags, u32 ttl, struct reply *reply)
if (!request_reissue(req)) return;
}
break;
case DNS_ERR_SERVERFAILED:
// rcode 2 (servfailed) sometimes means "we are broken" and
// sometimes (with some binds) means "that request was very
// confusing." Treat this as a timeout, not a failure.
/*XXXX refactor the parts of */
log(EVDNS_LOG_DEBUG, "Got a SERVERFAILED from nameserver %s; "
"will allow the request to time out.",
debug_nota(req->ns->address));
break;
default:
// we got a good reply from the nameserver
nameserver_up(req->ns);
@ -1876,9 +1884,9 @@ evdns_request_transmit(struct request *req) {
case 2:
// failed in some other way
retcode = 1;
// fall through
break;
default:
// all ok
// transmitted; we need to check for timeout.
log(EVDNS_LOG_DEBUG,
"Setting timeout for request %lx", (unsigned long) req);
evtimer_set(&req->timeout_event, evdns_request_timeout_callback, req);
@ -1888,11 +1896,12 @@ evdns_request_transmit(struct request *req) {
(unsigned long) req);
// ???? Do more?
}
}
req->tx_count++;
req->transmit_me = 0;
return retcode;
}
}
static void
nameserver_probe_callback(int result, char type, int count, int ttl, void *addresses, void *arg) {