Browse Source

2009-03-13 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>

	Fixed the bug that AdaptiveURISelector doesn't select any URI
	when all URIs are tested and their timeout is not reached.
	* src/AdaptiveURISelector.cc
	* src/AdaptiveURISelector.h
Tatsuhiro Tsujikawa 16 năm trước cách đây
mục cha
commit
5c63e74e80
3 tập tin đã thay đổi với 40 bổ sung22 xóa
  1. 7 0
      ChangeLog
  2. 32 22
      src/AdaptiveURISelector.cc
  3. 1 0
      src/AdaptiveURISelector.h

+ 7 - 0
ChangeLog

@@ -1,3 +1,10 @@
+2009-03-13  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
+
+	Fixed the bug that AdaptiveURISelector doesn't select any URI when
+	all URIs are tested and their timeout is not reached.
+	* src/AdaptiveURISelector.cc
+	* src/AdaptiveURISelector.h
+
 2009-03-13  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
 
 	Changed the default value of --http-auth-challenge option to false.

+ 32 - 22
src/AdaptiveURISelector.cc

@@ -151,35 +151,45 @@ std::string AdaptiveURISelector::selectOne(const std::deque<std::string>& uris)
       } else {
 	/* Here we return a mirror which need to be tested again */
 	std::string toReTest = getFirstToTestUri(uris);
-	_logger->debug("AdaptiveURISelector: choosing mirror %s which has not"
-		       " been tested recently for connection #%d",
-		       toReTest.c_str(), _nbConnections);
-	return toReTest;
+	if(toReTest != A2STR::NIL) {
+	  _logger->debug("AdaptiveURISelector: choosing mirror %s which has not"
+			 " been tested recently for connection #%d",
+			 toReTest.c_str(), _nbConnections);
+	  return toReTest;
+	} else {
+	  return getBestMirror(uris);
+	}
       }
     }
     else {
-      /* Here we return one of the bests mirrors */
-      unsigned int max = getMaxDownloadSpeed(uris);
-      unsigned int min = max-(int)(max*0.25);
-      std::deque<std::string> bests = getUrisBySpeed(uris, min);
-      
-      if (bests.size() < 2) {
-	std::string uri = getMaxDownloadSpeedUri(uris);
-	_logger->debug("AdaptiveURISelector: choosing the best mirror :"
-		       " %.2fKB/s %s (other mirrors are at least 25%% slower)",
-		       (float) max/1024, uri.c_str());
-	return uri;
-      } else {
-	std::string uri = selectRandomUri(bests);
-	_logger->debug("AdaptiveURISelector: choosing randomly one of the best"
-		       " mirrors (range [%.2fKB/s, %.2fKB/s]): %s",
-		       (float) min/1024, (float) max/1024, uri.c_str());
-	return uri;
-      }
+      return getBestMirror(uris);
     }
   }
 }
 
+std::string AdaptiveURISelector::getBestMirror
+(const std::deque<std::string>& uris) const
+{
+  /* Here we return one of the bests mirrors */
+  unsigned int max = getMaxDownloadSpeed(uris);
+  unsigned int min = max-(int)(max*0.25);
+  std::deque<std::string> bests = getUrisBySpeed(uris, min);
+  
+  if (bests.size() < 2) {
+    std::string uri = getMaxDownloadSpeedUri(uris);
+    _logger->debug("AdaptiveURISelector: choosing the best mirror :"
+		   " %.2fKB/s %s (other mirrors are at least 25%% slower)",
+		   (float) max/1024, uri.c_str());
+    return uri;
+  } else {
+    std::string uri = selectRandomUri(bests);
+    _logger->debug("AdaptiveURISelector: choosing randomly one of the best"
+		   " mirrors (range [%.2fKB/s, %.2fKB/s]): %s",
+		   (float) min/1024, (float) max/1024, uri.c_str());
+    return uri;
+  }
+}
+
 void AdaptiveURISelector::resetCounters()
 {
   const Option* op = _requestGroup->getOption();

+ 1 - 0
src/AdaptiveURISelector.h

@@ -70,6 +70,7 @@ private:
   std::string getFirstToTestUri(const std::deque<std::string>& uris) const;
   SharedHandle<ServerStat> getServerStats(const std::string& uri) const;
   unsigned int getNbTestedServers(const std::deque<std::string>& uris) const;
+  std::string getBestMirror(const std::deque<std::string>& uris) const;
 public:
   AdaptiveURISelector(const SharedHandle<ServerStatMan>& serverStatMan, 
           const SharedHandle<RequestGroup>& requestGroup);