diff options
author | Nick Mathewson <nickm@torproject.org> | 2007-02-28 20:24:23 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2007-02-28 20:24:23 +0000 |
commit | 3008c3b768f2cb8ab735e8ebbda2d4322910b19e (patch) | |
tree | 305dc3660e47d3e733d3928cda6fe621d9c1804b | |
parent | 08c75f4349067815f4d131ca2cd4b425ec8fc38c (diff) | |
download | tor-3008c3b768f2cb8ab735e8ebbda2d4322910b19e.tar.gz tor-3008c3b768f2cb8ab735e8ebbda2d4322910b19e.zip |
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
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | src/or/eventdns.c | 21 |
2 files changed, 19 insertions, 6 deletions
@@ -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 diff --git a/src/or/eventdns.c b/src/or/eventdns.c index bb97c31c74..7270df5052 100644 --- a/src/or/eventdns.c +++ b/src/or/eventdns.c @@ -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,10 +1896,11 @@ evdns_request_transmit(struct request *req) { (unsigned long) req); // ???? Do more? } - req->tx_count++; - req->transmit_me = 0; - return retcode; } + + req->tx_count++; + req->transmit_me = 0; + return retcode; } static void |