mirror of https://github.com/aria2/aria2
				
				
				
			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.hpull/1/head
							parent
							
								
									ff20576d01
								
							
						
					
					
						commit
						5c63e74e80
					
				| 
						 | 
				
			
			@ -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.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue