Sfoglia il codice sorgente

Added PieceStorage::onDownloadIncomplete() virtual function.

In DefaultPieceStorage::onDownloadIncomplete(), we call
StreamPieceSelector::onBitfieldInit().
Added GeomStreamPieceSelectorTest.
Tatsuhiro Tsujikawa 14 anni fa
parent
commit
c7ac147287

+ 3 - 2
src/BtCheckIntegrityEntry.cc

@@ -51,11 +51,12 @@ BtCheckIntegrityEntry::~BtCheckIntegrityEntry() {}
 void BtCheckIntegrityEntry::onDownloadIncomplete
 (std::vector<Command*>& commands, DownloadEngine* e)
 {
+  const SharedHandle<PieceStorage>& ps = getRequestGroup()->getPieceStorage();
+  ps->onDownloadIncomplete();
   if(getRequestGroup()->getOption()->getAsBool(PREF_HASH_CHECK_ONLY)) {
     return;
   }
-  const SharedHandle<DiskAdaptor>& diskAdaptor =
-    getRequestGroup()->getPieceStorage()->getDiskAdaptor();
+  const SharedHandle<DiskAdaptor>& diskAdaptor = ps->getDiskAdaptor();
   if(diskAdaptor->isReadOnlyEnabled()) {
     // Now reopen DiskAdaptor with read only disabled.
     diskAdaptor->closeFile();

+ 5 - 0
src/DefaultPieceStorage.cc

@@ -810,4 +810,9 @@ size_t DefaultPieceStorage::getNextUsedIndex(size_t index)
   return bitfieldMan_->countBlock();
 }
 
+void DefaultPieceStorage::onDownloadIncomplete()
+{
+  streamPieceSelector_->onBitfieldInit();
+}
+
 } // namespace aria2

+ 2 - 0
src/DefaultPieceStorage.h

@@ -272,6 +272,8 @@ public:
 
   virtual size_t getNextUsedIndex(size_t index);
 
+  virtual void onDownloadIncomplete();
+
   /**
    * This method is made private for test purpose only.
    */

+ 2 - 0
src/DefaultStreamPieceSelector.cc

@@ -54,4 +54,6 @@ bool DefaultStreamPieceSelector::select
     (index, minSplitSize, ignoreBitfield, length);
 }
 
+void DefaultStreamPieceSelector::onBitfieldInit() {}
+
 } // namespace aria2

+ 2 - 0
src/DefaultStreamPieceSelector.h

@@ -51,6 +51,8 @@ public:
    size_t minSplitSize,
    const unsigned char* ignoreBitfield,
    size_t length);
+
+  virtual void onBitfieldInit();
 private:
   BitfieldMan* bitfieldMan_;
 };

+ 12 - 2
src/GeomStreamPieceSelector.cc

@@ -41,7 +41,8 @@ GeomStreamPieceSelector::GeomStreamPieceSelector
 (BitfieldMan* bitfieldMan,
  double base)
   : bitfieldMan_(bitfieldMan),
-    base_(base)
+    base_(base),
+    offsetIndex_(0)
 {}
 
 GeomStreamPieceSelector::~GeomStreamPieceSelector() {}
@@ -53,7 +54,16 @@ bool GeomStreamPieceSelector::select
  size_t length)
 {
   return bitfieldMan_->getGeomMissingUnusedIndex
-    (index, minSplitSize, ignoreBitfield, length, base_, 0);
+    (index, minSplitSize, ignoreBitfield, length, base_, offsetIndex_);
+}
+
+void GeomStreamPieceSelector::onBitfieldInit()
+{
+  size_t index;
+  bool r = bitfieldMan_->getFirstMissingIndex(index);
+  if(r) {
+    offsetIndex_ = index;
+  }
 }
 
 } // namespace aria2

+ 3 - 0
src/GeomStreamPieceSelector.h

@@ -51,9 +51,12 @@ public:
    size_t minSplitSize,
    const unsigned char* ignoreBitfield,
    size_t length);
+
+  virtual void onBitfieldInit();
 private:
   BitfieldMan* bitfieldMan_;
   double base_;
+  size_t offsetIndex_;
 };
 
 } // namespace aria2

+ 2 - 0
src/InorderStreamPieceSelector.cc

@@ -54,4 +54,6 @@ bool InorderStreamPieceSelector::select
     (index, minSplitSize, ignoreBitfield, length);
 }
 
+void InorderStreamPieceSelector::onBitfieldInit() {}
+
 } // namespace aria2

+ 2 - 0
src/InorderStreamPieceSelector.h

@@ -51,6 +51,8 @@ public:
    size_t minSplitSize,
    const unsigned char* ignoreBitfield,
    size_t length);
+
+  virtual void onBitfieldInit();
 private:
   BitfieldMan* bitfieldMan_;
 };

+ 3 - 0
src/PieceStorage.h

@@ -283,6 +283,9 @@ public:
   // are not used and not completed. If all pieces after index+1 are
   // used or completed, returns the number of pieces.
   virtual size_t getNextUsedIndex(size_t index) = 0;
+
+  // Called when system detects download is not finished
+  virtual void onDownloadIncomplete() = 0;
 };
 
 typedef SharedHandle<PieceStorage> PieceStorageHandle;

+ 3 - 0
src/StreamCheckIntegrityEntry.cc

@@ -38,6 +38,7 @@
 #include "StreamFileAllocationEntry.h"
 #include "prefs.h"
 #include "Option.h"
+#include "PieceStorage.h"
 
 namespace aria2 {
 
@@ -51,6 +52,8 @@ StreamCheckIntegrityEntry::~StreamCheckIntegrityEntry() {}
 void StreamCheckIntegrityEntry::onDownloadIncomplete
 (std::vector<Command*>& commands, DownloadEngine* e)
 {
+  const SharedHandle<PieceStorage>& ps = getRequestGroup()->getPieceStorage();
+  ps->onDownloadIncomplete();
   if(getRequestGroup()->getOption()->getAsBool(PREF_HASH_CHECK_ONLY)) {
     return;
   }

+ 4 - 0
src/StreamPieceSelector.h

@@ -60,6 +60,10 @@ public:
    size_t minSplitSize,
    const unsigned char* ignoreBitfield,
    size_t length) = 0;
+
+  // Called when initial bitfield was fixed. Optimize
+  // StreamPieceSelector to take advantages of the initial bitfield.
+  virtual void onBitfieldInit() = 0;
 };
 
 } // namespace aria2

+ 2 - 0
src/UnknownLengthPieceStorage.h

@@ -292,6 +292,8 @@ public:
   virtual size_t getNextUsedIndex(size_t index) { return 0; }
 
   void setDiskWriterFactory(const SharedHandle<DiskWriterFactory>& diskWriterFactory);
+
+  virtual void onDownloadIncomplete() {}
 };
 
 typedef SharedHandle<UnknownLengthPieceStorage> UnknownLengthPieceStorageHandle;

+ 50 - 0
test/GeomStreamPieceSelectorTest.cc

@@ -0,0 +1,50 @@
+#include "GeomStreamPieceSelector.h"
+
+#include <cstring>
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#include "Exception.h"
+#include "util.h"
+#include "BitfieldMan.h"
+
+namespace aria2 {
+
+class GeomStreamPieceSelectorTest:public CppUnit::TestFixture {
+
+  CPPUNIT_TEST_SUITE(GeomStreamPieceSelectorTest);
+  CPPUNIT_TEST(testOnBitfieldInit);
+  CPPUNIT_TEST_SUITE_END();
+public:
+  void testOnBitfieldInit();
+};
+
+CPPUNIT_TEST_SUITE_REGISTRATION(GeomStreamPieceSelectorTest);
+
+void GeomStreamPieceSelectorTest::testOnBitfieldInit()
+{
+  BitfieldMan bf(1024, 1024*20);
+  bf.setBitRange(0, 10);
+  GeomStreamPieceSelector sel(&bf, 2);
+  sel.onBitfieldInit();
+  unsigned char igbf[3];
+  memset(igbf, 0, 3);
+  size_t index;
+  // 11111|11111|00000|00000
+  CPPUNIT_ASSERT(sel.select(index, 1024*20, igbf, sizeof(igbf)));
+  CPPUNIT_ASSERT_EQUAL((size_t)11, index);
+  bf.setUseBit(11);
+  // 11111|11111|10000|00000
+  CPPUNIT_ASSERT(sel.select(index, 1024*20, igbf, sizeof(igbf)));
+  CPPUNIT_ASSERT_EQUAL((size_t)12, index);
+  bf.setUseBit(12);
+  // 11111|11111|11000|00000
+  CPPUNIT_ASSERT(sel.select(index, 1024*20, igbf, sizeof(igbf)));
+  CPPUNIT_ASSERT_EQUAL((size_t)13, index);
+  bf.setUseBit(13);
+  // 11111|11111|11100|00000
+  CPPUNIT_ASSERT(sel.select(index, 1024*20, igbf, sizeof(igbf)));
+  CPPUNIT_ASSERT_EQUAL((size_t)15, index);
+}
+
+} // namespace aria2

+ 2 - 1
test/Makefile.am

@@ -80,7 +80,8 @@ aria2c_SOURCES = AllTest.cc\
 	JsonTest.cc\
 	RpcResponseTest.cc\
 	RpcMethodTest.cc\
-	BufferedFileTest.cc
+	BufferedFileTest.cc\
+	GeomStreamPieceSelectorTest.cc
 
 if ENABLE_XML_RPC
 aria2c_SOURCES += XmlRpcRequestParserControllerTest.cc\

+ 2 - 0
test/MockPieceStorage.h

@@ -280,6 +280,8 @@ public:
   {
     return 0;
   }
+
+  virtual void onDownloadIncomplete() {}
 };
 
 } // namespace aria2