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
pull/1/head
Tatsuhiro Tsujikawa 2009-03-13 12:27:40 +00:00
parent 15582ed8cd
commit d8678a8dd0
5 changed files with 54 additions and 0 deletions

View File

@ -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> 2009-03-13 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Refactored BtMessage subclasses. BtCancelMessage, BtRequestMessage Refactored BtMessage subclasses. BtCancelMessage, BtRequestMessage

View File

@ -453,6 +453,14 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers()
op->addTag(TAG_HTTP); op->addTag(TAG_HTTP);
handlers.push_back(op); 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 SharedHandle<UnitNumberOptionHandler> op(new UnitNumberOptionHandler
(PREF_SEGMENT_SIZE, (PREF_SEGMENT_SIZE,

View File

@ -562,6 +562,40 @@ void RequestGroup::createNextCommand(std::deque<Command*>& commands,
unsigned int numCommand, unsigned int numCommand,
const std::string& method) 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; std::deque<std::string> pendingURIs;
for(; numCommand--; ) { for(; numCommand--; ) {
std::string uri = _uriSelector->select(_uris); std::string uri = _uriSelector->select(_uris);

View File

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

View File

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