Преглед изворни кода

Fixed assertion error if --retry-wait is used

In CreateRequestCommand, if Request object returned from getRequest()
is still sleeping, CreateRequestCommand pools it back but still holds
its reference. This makes assertion error in
UnknownLengthPieceStroage::hasMissingUnusedPiece() from
AbstractCommand::execute().
Tatsuhiro Tsujikawa пре 13 година
родитељ
комит
0bbda43385
3 измењених фајлова са 13 додато и 0 уклоњено
  1. 5 0
      src/AbstractCommand.cc
  2. 4 0
      src/AbstractCommand.h
  3. 4 0
      src/CreateRequestCommand.cc

+ 5 - 0
src/AbstractCommand.cc

@@ -896,6 +896,11 @@ void AbstractCommand::setRequest(const SharedHandle<Request>& request)
   req_ = request;
 }
 
+void AbstractCommand::resetRequest()
+{
+  req_.reset();
+}
+
 void AbstractCommand::setFileEntry(const SharedHandle<FileEntry>& fileEntry)
 {
   fileEntry_ = fileEntry;

+ 4 - 0
src/AbstractCommand.h

@@ -110,6 +110,10 @@ protected:
 
   void setRequest(const SharedHandle<Request>& request);
 
+  // Resets request_. This method is more efficient than
+  // setRequest(SharedHandle<Request>());
+  void resetRequest();
+
   const SharedHandle<FileEntry>& getFileEntry() const
   {
     return fileEntry_;

+ 4 - 0
src/CreateRequestCommand.cc

@@ -101,6 +101,10 @@ bool CreateRequestCommand::executeInternal()
   } else if(getRequest()->getWakeTime() > global::wallclock()) {
     A2_LOG_DEBUG("This request object is still sleeping.");
     getFileEntry()->poolRequest(getRequest());
+    // Reset request of this command. Without this, request is doubly
+    // counted (1 for pooled and another one in this command) and
+    // AbstractCommand::execute() will behave badly.
+    resetRequest();
     getDownloadEngine()->addCommand(this);
     return false;
   }