瀏覽代碼

Clear write cache on Segment::clear and Piece::clearAllBlock

Tatsuhiro Tsujikawa 13 年之前
父節點
當前提交
56c498bcbf
共有 12 個文件被更改,包括 22 次插入40 次删除
  1. 3 10
      src/BtPieceMessage.cc
  2. 3 18
      src/DownloadCommand.cc
  3. 2 2
      src/GrowSegment.cc
  4. 1 1
      src/GrowSegment.h
  5. 4 1
      src/Piece.cc
  6. 1 1
      src/Piece.h
  7. 2 2
      src/PiecedSegment.cc
  8. 1 1
      src/PiecedSegment.h
  9. 2 1
      src/Segment.h
  10. 1 1
      test/GrowSegmentTest.cc
  11. 1 1
      test/MockSegment.h
  12. 1 1
      test/SegmentTest.cc

+ 3 - 10
src/BtPieceMessage.cc

@@ -253,10 +253,7 @@ bool BtPieceMessage::checkPieceHash(const SharedHandle<Piece>& piece)
                                          getPieceStorage()->getDiskAdaptor())
         == downloadContext_->getPieceHash(piece->getIndex());
     } catch(RecoverableException& e) {
-      piece->clearAllBlock();
-      if(piece->getWrDiskCacheEntry()) {
-        piece->clearWrCache(getPieceStorage()->getWrDiskCache());
-      }
+      piece->clearAllBlock(getPieceStorage()->getWrDiskCache());
       throw;
     }
   }
@@ -269,8 +266,7 @@ void BtPieceMessage::onNewPiece(const SharedHandle<Piece>& piece)
      piece->flushWrCache(getPieceStorage()->getWrDiskCache());
      if(piece->getWrDiskCacheEntry()->getError() !=
         WrDiskCacheEntry::CACHE_ERR_SUCCESS) {
-       piece->clearAllBlock();
-       piece->clearWrCache(getPieceStorage()->getWrDiskCache());
+       piece->clearAllBlock(getPieceStorage()->getWrDiskCache());
        throw DOWNLOAD_FAILURE_EXCEPTION2
          (fmt("Write disk cache flush failure index=%lu",
               static_cast<unsigned long>(piece->getIndex())),
@@ -289,10 +285,7 @@ void BtPieceMessage::onWrongPiece(const SharedHandle<Piece>& piece)
   A2_LOG_INFO(fmt(MSG_GOT_WRONG_PIECE,
                   getCuid(),
                   static_cast<unsigned long>(piece->getIndex())));
-  if(piece->getWrDiskCacheEntry()) {
-    piece->clearWrCache(getPieceStorage()->getWrDiskCache());
-  }
-  piece->clearAllBlock();
+  piece->clearAllBlock(getPieceStorage()->getWrDiskCache());
   piece->destroyHashContext();
   getBtRequestFactory()->removeTargetPiece(piece);
 }

+ 3 - 18
src/DownloadCommand.cc

@@ -130,8 +130,7 @@ void flushWrDiskCacheEntry(WrDiskCache* wrDiskCache,
     piece->flushWrCache(wrDiskCache);
     if(piece->getWrDiskCacheEntry()->getError() !=
        WrDiskCacheEntry::CACHE_ERR_SUCCESS) {
-      segment->clear();
-      piece->clearWrCache(wrDiskCache);
+      segment->clear(wrDiskCache);
       throw DOWNLOAD_FAILURE_EXCEPTION2
         (fmt("Write disk cache flush failure index=%lu",
              static_cast<unsigned long>(piece->getIndex())),
@@ -141,17 +140,6 @@ void flushWrDiskCacheEntry(WrDiskCache* wrDiskCache,
 }
 } // namespace
 
-namespace {
-void clearWrDiskCacheEntry(WrDiskCache* wrDiskCache,
-                           const SharedHandle<Segment>& segment)
-{
-  const SharedHandle<Piece>& piece = segment->getPiece();
-  if(piece && piece->getWrDiskCacheEntry()) {
-    piece->clearWrCache(wrDiskCache);
-  }
-}
-} // namespace
-
 bool DownloadCommand::executeInternal() {
   if(getDownloadEngine()->getRequestGroupMan()->doesOverallDownloadSpeedExceed()
      || getRequestGroup()->doesDownloadSpeedExceed()) {
@@ -279,9 +267,7 @@ bool DownloadCommand::executeInternal() {
                 (segment->getSegmentLength(), diskAdaptor);
               validatePieceHash(segment, expectedPieceHash, actualHash);
             } catch(RecoverableException& e) {
-              segment->clear();
-              clearWrDiskCacheEntry(getPieceStorage()->getWrDiskCache(),
-                                    segment);
+              segment->clear(getPieceStorage()->getWrDiskCache());
               getSegmentMan()->cancelSegment(getCuid());
               throw;
             }
@@ -406,8 +392,7 @@ void DownloadCommand::validatePieceHash(const SharedHandle<Segment>& segment,
                     segment->getPosition(),
                     util::toHex(expectedHash).c_str(),
                     util::toHex(actualHash).c_str()));
-    segment->clear();
-    clearWrDiskCacheEntry(getPieceStorage()->getWrDiskCache(), segment);
+    segment->clear(getPieceStorage()->getWrDiskCache());
     getSegmentMan()->cancelSegment(getCuid());
     throw DL_RETRY_EX
       (fmt("Invalid checksum index=%lu",

+ 2 - 2
src/GrowSegment.cc

@@ -59,10 +59,10 @@ std::string GrowSegment::getDigest()
 
 #endif // ENABLE_MESSAGE_DIGEST
 
-void GrowSegment::clear()
+void GrowSegment::clear(WrDiskCache* diskCache)
 {
   writtenLength_ = 0;
-  piece_->clearAllBlock();
+  piece_->clearAllBlock(0);
 }
 
 SharedHandle<Piece> GrowSegment::getPiece() const

+ 1 - 1
src/GrowSegment.h

@@ -104,7 +104,7 @@ public:
 
 #endif // ENABLE_MESSAGE_DIGEST
 
-  virtual void clear();
+  virtual void clear(WrDiskCache* diskCache);
 
   virtual SharedHandle<Piece> getPiece() const;
 };

+ 4 - 1
src/Piece.cc

@@ -78,9 +78,12 @@ void Piece::completeBlock(size_t blockIndex) {
   bitfield_->unsetUseBit(blockIndex);
 }
 
-void Piece::clearAllBlock() {
+void Piece::clearAllBlock(WrDiskCache* diskCache) {
   bitfield_->clearAllBit();
   bitfield_->clearAllUseBit();
+  if(diskCache && wrCache_) {
+    clearWrCache(diskCache);
+  }
 }
 
 void Piece::setAllBlock() {

+ 1 - 1
src/Piece.h

@@ -147,7 +147,7 @@ public:
 
   size_t getBitfieldLength() const;
 
-  void clearAllBlock();
+  void clearAllBlock(WrDiskCache* diskCache);
   void setAllBlock();
 
   std::string toString() const;

+ 2 - 2
src/PiecedSegment.cc

@@ -112,10 +112,10 @@ std::string PiecedSegment::getDigest()
 
 #endif // ENABLE_MESSAGE_DIGEST
 
-void PiecedSegment::clear()
+void PiecedSegment::clear(WrDiskCache* diskCache)
 {
   writtenLength_ = 0;
-  piece_->clearAllBlock();
+  piece_->clearAllBlock(diskCache);
 
 #ifdef ENABLE_MESSAGE_DIGEST
 

+ 1 - 1
src/PiecedSegment.h

@@ -90,7 +90,7 @@ public:
 
 #endif // ENABLE_MESSAGE_DIGEST
 
-  virtual void clear();
+  virtual void clear(WrDiskCache* diskCache);
 
   virtual SharedHandle<Piece> getPiece() const;
 };

+ 2 - 1
src/Segment.h

@@ -45,6 +45,7 @@
 namespace aria2 {
 
 class Piece;
+class WrDiskCache;
 
 class Segment {
 public:
@@ -80,7 +81,7 @@ public:
 
 #endif // ENABLE_MESSAGE_DIGEST
 
-  virtual void clear() = 0;
+  virtual void clear(WrDiskCache* diskCache) = 0;
 
   virtual SharedHandle<Piece> getPiece() const = 0;
 

+ 1 - 1
test/GrowSegmentTest.cc

@@ -37,7 +37,7 @@ void GrowSegmentTest::testClear()
   GrowSegment segment(SharedHandle<Piece>(new Piece()));
   segment.updateWrittenLength(32*1024);
   CPPUNIT_ASSERT_EQUAL(32*1024, segment.getWrittenLength());
-  segment.clear();
+  segment.clear(0);
   CPPUNIT_ASSERT_EQUAL(0, segment.getWrittenLength());
 }
 

+ 1 - 1
test/MockSegment.h

@@ -67,7 +67,7 @@ public:
 
 #endif // ENABLE_MESSAGE_DIGEST
 
-  virtual void clear() {}
+  virtual void clear(WrDiskCache* diskCache) {}
 
   virtual SharedHandle<Piece> getPiece() const
   {

+ 1 - 1
test/SegmentTest.cc

@@ -68,7 +68,7 @@ void SegmentTest::testClear()
   PiecedSegment s(16*1024*10, p);
   s.updateWrittenLength(16*1024*10);
   CPPUNIT_ASSERT_EQUAL(16*1024*10, s.getWrittenLength());
-  s.clear();
+  s.clear(0);
   CPPUNIT_ASSERT_EQUAL(0, s.getWrittenLength());
 }