summaryrefslogtreecommitdiff
path: root/src/AdaptiveURISelector.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2009-03-13 12:36:18 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2009-03-13 12:36:18 +0000
commit5c63e74e80764da69d19d70bc742f5ae6fe94459 (patch)
treebac183f8041e85e8bddb1481c6c5470d653d1d86 /src/AdaptiveURISelector.cc
parentff20576d019ce4302dedb6ab190e7c4919dc415d (diff)
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
Diffstat (limited to 'src/AdaptiveURISelector.cc')
-rw-r--r--src/AdaptiveURISelector.cc54
1 files changed, 32 insertions, 22 deletions
diff --git a/src/AdaptiveURISelector.cc b/src/AdaptiveURISelector.cc
index c4ff5b04..a9a224b2 100644
--- a/src/AdaptiveURISelector.cc
+++ b/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();