瀏覽代碼

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.
Tatsuhiro Tsujikawa 12 年之前
父節點
當前提交
8a431bfc89
共有 2 個文件被更改,包括 14 次插入1 次删除
  1. 4 0
      src/AsyncNameResolver.h
  2. 10 1
      src/AsyncNameResolverMan.cc

+ 4 - 0
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;

+ 10 - 1
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;