diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2009-03-13 12:36:18 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2009-03-13 12:36:18 +0000 |
| commit | 5c63e74e80764da69d19d70bc742f5ae6fe94459 (patch) | |
| tree | bac183f8041e85e8bddb1481c6c5470d653d1d86 /src/AdaptiveURISelector.cc | |
| parent | ff20576d019ce4302dedb6ab190e7c4919dc415d (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.cc | 54 |
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(); |
