mirror of https://github.com/aria2/aria2
				
				
				
			Clear write cache on Segment::clear and Piece::clearAllBlock
							parent
							
								
									9ed8502e74
								
							
						
					
					
						commit
						56c498bcbf
					
				| 
						 | 
				
			
			@ -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);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -104,7 +104,7 @@ public:
 | 
			
		|||
 | 
			
		||||
#endif // ENABLE_MESSAGE_DIGEST
 | 
			
		||||
 | 
			
		||||
  virtual void clear();
 | 
			
		||||
  virtual void clear(WrDiskCache* diskCache);
 | 
			
		||||
 | 
			
		||||
  virtual SharedHandle<Piece> getPiece() const;
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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() {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -147,7 +147,7 @@ public:
 | 
			
		|||
 | 
			
		||||
  size_t getBitfieldLength() const;
 | 
			
		||||
 | 
			
		||||
  void clearAllBlock();
 | 
			
		||||
  void clearAllBlock(WrDiskCache* diskCache);
 | 
			
		||||
  void setAllBlock();
 | 
			
		||||
 | 
			
		||||
  std::string toString() const;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -90,7 +90,7 @@ public:
 | 
			
		|||
 | 
			
		||||
#endif // ENABLE_MESSAGE_DIGEST
 | 
			
		||||
 | 
			
		||||
  virtual void clear();
 | 
			
		||||
  virtual void clear(WrDiskCache* diskCache);
 | 
			
		||||
 | 
			
		||||
  virtual SharedHandle<Piece> getPiece() const;
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -67,7 +67,7 @@ public:
 | 
			
		|||
 | 
			
		||||
#endif // ENABLE_MESSAGE_DIGEST
 | 
			
		||||
 | 
			
		||||
  virtual void clear() {}
 | 
			
		||||
  virtual void clear(WrDiskCache* diskCache) {}
 | 
			
		||||
 | 
			
		||||
  virtual SharedHandle<Piece> getPiece() const
 | 
			
		||||
  {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue