2009-07-06 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>

Keep CreateRequestCommand in queue when no segment is available so
	that they can pick up pieces which slow BitTorrent peers are
	downloading.
	* src/AbstractCommand.cc
	* src/CreateRequestCommand.cc
	* src/CreateRequestCommand.h
pull/1/head
Tatsuhiro Tsujikawa 2009-07-06 14:35:42 +00:00
parent 69c3dfded4
commit db84b1b652
4 changed files with 31 additions and 2 deletions

View File

@ -1,3 +1,12 @@
2009-07-06 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Keep CreateRequestCommand in queue when no segment is available so
that they can pick up pieces which slow BitTorrent peers are
downloading.
* src/AbstractCommand.cc
* src/CreateRequestCommand.cc
* src/CreateRequestCommand.h
2009-07-06 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net> 2009-07-06 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
--bt-stop-timeout now only checks download speed. --bt-stop-timeout now only checks download speed.

View File

@ -149,7 +149,7 @@ bool AbstractCommand::execute() {
if(_segments.empty()) { if(_segments.empty()) {
// TODO socket could be pooled here if pipelining is enabled... // TODO socket could be pooled here if pipelining is enabled...
logger->info(MSG_NO_SEGMENT_AVAILABLE, cuid); logger->info(MSG_NO_SEGMENT_AVAILABLE, cuid);
return true; return prepareForRetry(1);
} }
} else { } else {
size_t maxSegments = req->getMaxPipelinedRequest(); size_t maxSegments = req->getMaxPipelinedRequest();

View File

@ -44,6 +44,8 @@
#include "SegmentMan.h" #include "SegmentMan.h"
#include "prefs.h" #include "prefs.h"
#include "Option.h" #include "Option.h"
#include "SleepCommand.h"
#include "Logger.h"
namespace aria2 { namespace aria2 {
@ -57,7 +59,7 @@ CreateRequestCommand::CreateRequestCommand(int32_t cuid,
disableReadCheckSocket(); disableReadCheckSocket();
disableWriteCheckSocket(); disableWriteCheckSocket();
} }
bool CreateRequestCommand::executeInternal() bool CreateRequestCommand::executeInternal()
{ {
if(_segments.empty()) { if(_segments.empty()) {
@ -95,4 +97,20 @@ bool CreateRequestCommand::executeInternal()
return true; return true;
} }
bool CreateRequestCommand::prepareForRetry(time_t wait)
{
// We assume that this method is called from AbstractCommand when
// Segment is not available. Normally,
// AbstractCommand::prepareForRetry() does the job, but it creates
// CreateRequestCommand and deletes current one. At the last stage
// of the download, commands are idle and prepareForRetry() is
// called repeatedly. This means that newly created
// CreateRequestCommand is deleted one second later: This is not
// efficient. For this reason, reuse current CreateRequestCommand.
logger->debug("CUID#%d - Reusing CreateRequestCommand", cuid);
SleepCommand* scom = new SleepCommand(cuid, e, _requestGroup, this, wait);
e->commands.push_back(scom);
return false;
}
} // namespace aria2 } // namespace aria2

View File

@ -46,6 +46,8 @@ public:
DownloadEngine* e); DownloadEngine* e);
protected: protected:
virtual bool executeInternal(); virtual bool executeInternal();
virtual bool prepareForRetry(time_t wait);
}; };
} // namespace aria2 } // namespace aria2