summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2013-04-14 21:12:46 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2013-04-14 21:12:46 +0900
commit8a431bfc891c52cc4f439cb3d0168a831f6ad88c (patch)
treee86fb38315b072cea279472cc687b6698a09ad2f
parent5e245c33971c557f1291ceb44356584098757178 (diff)
Don't wait for AAAA query response if A query response has been received
If we got IPv4 lookup response, we don't wait for IPv6 lookup response. This is because DNS server may drop AAAA query and we have to wait for the long time before timeout. We don't do the inverse, because, based on todays deployment of DNS server, almost all of them can respond A query just fine.
-rw-r--r--src/AsyncNameResolver.h4
-rw-r--r--src/AsyncNameResolverMan.cc11
2 files changed, 14 insertions, 1 deletions
diff --git a/src/AsyncNameResolver.h b/src/AsyncNameResolver.h
index aef111e3..905fe0ec 100644
--- a/src/AsyncNameResolver.h
+++ b/src/AsyncNameResolver.h
@@ -96,6 +96,10 @@ public:
void process(fd_set* rfdsPtr, fd_set* wfdsPtr);
+ int getFamily() const
+ {
+ return family_;
+ }
#ifdef HAVE_LIBCARES
int getsock(sock_t* sockets) const;
diff --git a/src/AsyncNameResolverMan.cc b/src/AsyncNameResolverMan.cc
index 90f08844..89efc78f 100644
--- a/src/AsyncNameResolverMan.cc
+++ b/src/AsyncNameResolverMan.cc
@@ -157,10 +157,14 @@ int AsyncNameResolverMan::getStatus() const
{
size_t success = 0;
size_t error = 0;
+ bool ipv4Success = false;
for(size_t i = 0; i < numResolver_; ++i) {
switch(asyncNameResolver_[i]->getStatus()) {
case AsyncNameResolver::STATUS_SUCCESS:
++success;
+ if(asyncNameResolver_[i]->getFamily() == AF_INET) {
+ ipv4Success = true;
+ }
break;
case AsyncNameResolver::STATUS_ERROR:
++error;
@@ -169,7 +173,12 @@ int AsyncNameResolverMan::getStatus() const
break;
}
}
- if(success == numResolver_) {
+ // If we got IPv4 lookup response, we don't wait for IPv6 lookup
+ // response. This is because DNS server may drop AAAA query and we
+ // have to wait for the long time before timeout. We don't do the
+ // inverse, because, based on todays deployment of DNS server,
+ // almost all of them can respond A query just fine.
+ if((success && ipv4Success) || success == numResolver_) {
return 1;
} else if(error == numResolver_) {
return -1;