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;