Selaa lähdekoodia

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

	Reuse URIs when all unused URIs run out.
	* src/OptionHandlerFactory.cc
	* src/RequestGroup.cc
	* src/prefs.cc
	* src/prefs.h
Tatsuhiro Tsujikawa 16 vuotta sitten
vanhempi
commit
d8678a8dd0
5 muutettua tiedostoa jossa 54 lisäystä ja 0 poistoa
  1. 8 0
      ChangeLog
  2. 8 0
      src/OptionHandlerFactory.cc
  3. 34 0
      src/RequestGroup.cc
  4. 2 0
      src/prefs.cc
  5. 2 0
      src/prefs.h

+ 8 - 0
ChangeLog

@@ -1,3 +1,11 @@
+2009-03-13  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
+
+	Reuse URIs when all unused URIs run out.
+	* src/OptionHandlerFactory.cc
+	* src/RequestGroup.cc
+	* src/prefs.cc
+	* src/prefs.h
+
 2009-03-13  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
 
 	Refactored BtMessage subclasses. BtCancelMessage, BtRequestMessage

+ 8 - 0
src/OptionHandlerFactory.cc

@@ -453,6 +453,14 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers()
     op->addTag(TAG_HTTP);
     handlers.push_back(op);
   }
+  {
+    SharedHandle<OptionHandler> op(new BooleanOptionHandler
+				   (PREF_REUSE_URI,
+				    NO_DESCRIPTION,
+				    V_TRUE));
+    op->hide();
+    handlers.push_back(op);
+  }
   {
     SharedHandle<UnitNumberOptionHandler> op(new UnitNumberOptionHandler
 					     (PREF_SEGMENT_SIZE,

+ 34 - 0
src/RequestGroup.cc

@@ -562,6 +562,40 @@ void RequestGroup::createNextCommand(std::deque<Command*>& commands,
 				     unsigned int numCommand,
 				     const std::string& method)
 {
+  if(_option->getAsBool(PREF_REUSE_URI) && _uris.empty()) {
+    std::deque<std::string> uris = _spentUris;
+    std::sort(uris.begin(), uris.end());
+    uris.erase(std::unique(uris.begin(), uris.end()), uris.end());
+
+    std::deque<std::string> errorUris(_uriResults.size());
+    std::transform(_uriResults.begin(), _uriResults.end(),
+		   errorUris.begin(), std::mem_fun_ref(&URIResult::getURI));
+    std::sort(errorUris.begin(), errorUris.end());
+    errorUris.erase(std::unique(errorUris.begin(), errorUris.end()),
+		    errorUris.end());
+     
+    std::deque<std::string> reusableURIs;
+    std::set_difference(uris.begin(), uris.end(),
+			errorUris.begin(), errorUris.end(),
+			std::back_inserter(reusableURIs));
+    size_t ininum = reusableURIs.size();
+    _logger->debug("Found %u reusable URIs",
+		   static_cast<unsigned int>(ininum));
+    // Reuse at least _numConcurrentCommand URIs here to avoid to
+    // run this process repeatedly.
+    if(ininum > 0 && ininum < _numConcurrentCommand) {
+      _logger->debug("fewer than _numConcurrentCommand=%u",
+		     _numConcurrentCommand);
+      for(size_t i = 0; i < _numConcurrentCommand/ininum; ++i) {
+	_uris.insert(_uris.end(), reusableURIs.begin(), reusableURIs.end());
+      }
+      _uris.insert(_uris.end(), reusableURIs.begin(),
+		   reusableURIs.begin()+(_numConcurrentCommand%ininum));
+      _logger->debug("Duplication complete: now %u URIs for reuse",
+		     static_cast<unsigned int>(_uris.size()));
+    }
+  }
+
   std::deque<std::string> pendingURIs;
   for(; numCommand--; ) {    
     std::string uri = _uriSelector->select(_uris);

+ 2 - 0
src/prefs.cc

@@ -160,6 +160,8 @@ const std::string PREF_ENABLE_HTTP_SERVER("enable-http-server");
 const std::string PREF_RESET_URI("reset-uri");
 // value: true | false
 const std::string PREF_DRY_RUN("dry-run");
+// value: true | false
+const std::string PREF_REUSE_URI("reuse-uri");
 
 /**
  * FTP related preferences

+ 2 - 0
src/prefs.h

@@ -164,6 +164,8 @@ extern const std::string PREF_ENABLE_HTTP_SERVER;
 extern const std::string PREF_RESET_URI;
 // value: true | false
 extern const std::string PREF_DRY_RUN;
+// value: true | false
+extern const std::string PREF_REUSE_URI;
 
 /**
  * FTP related preferences