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