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())
|
getPieceStorage()->getDiskAdaptor())
|
||||||
== downloadContext_->getPieceHash(piece->getIndex());
|
== downloadContext_->getPieceHash(piece->getIndex());
|
||||||
} catch(RecoverableException& e) {
|
} catch(RecoverableException& e) {
|
||||||
piece->clearAllBlock();
|
piece->clearAllBlock(getPieceStorage()->getWrDiskCache());
|
||||||
if(piece->getWrDiskCacheEntry()) {
|
|
||||||
piece->clearWrCache(getPieceStorage()->getWrDiskCache());
|
|
||||||
}
|
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -269,8 +266,7 @@ void BtPieceMessage::onNewPiece(const SharedHandle<Piece>& piece)
|
||||||
piece->flushWrCache(getPieceStorage()->getWrDiskCache());
|
piece->flushWrCache(getPieceStorage()->getWrDiskCache());
|
||||||
if(piece->getWrDiskCacheEntry()->getError() !=
|
if(piece->getWrDiskCacheEntry()->getError() !=
|
||||||
WrDiskCacheEntry::CACHE_ERR_SUCCESS) {
|
WrDiskCacheEntry::CACHE_ERR_SUCCESS) {
|
||||||
piece->clearAllBlock();
|
piece->clearAllBlock(getPieceStorage()->getWrDiskCache());
|
||||||
piece->clearWrCache(getPieceStorage()->getWrDiskCache());
|
|
||||||
throw DOWNLOAD_FAILURE_EXCEPTION2
|
throw DOWNLOAD_FAILURE_EXCEPTION2
|
||||||
(fmt("Write disk cache flush failure index=%lu",
|
(fmt("Write disk cache flush failure index=%lu",
|
||||||
static_cast<unsigned long>(piece->getIndex())),
|
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,
|
A2_LOG_INFO(fmt(MSG_GOT_WRONG_PIECE,
|
||||||
getCuid(),
|
getCuid(),
|
||||||
static_cast<unsigned long>(piece->getIndex())));
|
static_cast<unsigned long>(piece->getIndex())));
|
||||||
if(piece->getWrDiskCacheEntry()) {
|
piece->clearAllBlock(getPieceStorage()->getWrDiskCache());
|
||||||
piece->clearWrCache(getPieceStorage()->getWrDiskCache());
|
|
||||||
}
|
|
||||||
piece->clearAllBlock();
|
|
||||||
piece->destroyHashContext();
|
piece->destroyHashContext();
|
||||||
getBtRequestFactory()->removeTargetPiece(piece);
|
getBtRequestFactory()->removeTargetPiece(piece);
|
||||||
}
|
}
|
||||||
|
|
|
@ -130,8 +130,7 @@ void flushWrDiskCacheEntry(WrDiskCache* wrDiskCache,
|
||||||
piece->flushWrCache(wrDiskCache);
|
piece->flushWrCache(wrDiskCache);
|
||||||
if(piece->getWrDiskCacheEntry()->getError() !=
|
if(piece->getWrDiskCacheEntry()->getError() !=
|
||||||
WrDiskCacheEntry::CACHE_ERR_SUCCESS) {
|
WrDiskCacheEntry::CACHE_ERR_SUCCESS) {
|
||||||
segment->clear();
|
segment->clear(wrDiskCache);
|
||||||
piece->clearWrCache(wrDiskCache);
|
|
||||||
throw DOWNLOAD_FAILURE_EXCEPTION2
|
throw DOWNLOAD_FAILURE_EXCEPTION2
|
||||||
(fmt("Write disk cache flush failure index=%lu",
|
(fmt("Write disk cache flush failure index=%lu",
|
||||||
static_cast<unsigned long>(piece->getIndex())),
|
static_cast<unsigned long>(piece->getIndex())),
|
||||||
|
@ -141,17 +140,6 @@ void flushWrDiskCacheEntry(WrDiskCache* wrDiskCache,
|
||||||
}
|
}
|
||||||
} // namespace
|
} // 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() {
|
bool DownloadCommand::executeInternal() {
|
||||||
if(getDownloadEngine()->getRequestGroupMan()->doesOverallDownloadSpeedExceed()
|
if(getDownloadEngine()->getRequestGroupMan()->doesOverallDownloadSpeedExceed()
|
||||||
|| getRequestGroup()->doesDownloadSpeedExceed()) {
|
|| getRequestGroup()->doesDownloadSpeedExceed()) {
|
||||||
|
@ -279,9 +267,7 @@ bool DownloadCommand::executeInternal() {
|
||||||
(segment->getSegmentLength(), diskAdaptor);
|
(segment->getSegmentLength(), diskAdaptor);
|
||||||
validatePieceHash(segment, expectedPieceHash, actualHash);
|
validatePieceHash(segment, expectedPieceHash, actualHash);
|
||||||
} catch(RecoverableException& e) {
|
} catch(RecoverableException& e) {
|
||||||
segment->clear();
|
segment->clear(getPieceStorage()->getWrDiskCache());
|
||||||
clearWrDiskCacheEntry(getPieceStorage()->getWrDiskCache(),
|
|
||||||
segment);
|
|
||||||
getSegmentMan()->cancelSegment(getCuid());
|
getSegmentMan()->cancelSegment(getCuid());
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
|
@ -406,8 +392,7 @@ void DownloadCommand::validatePieceHash(const SharedHandle<Segment>& segment,
|
||||||
segment->getPosition(),
|
segment->getPosition(),
|
||||||
util::toHex(expectedHash).c_str(),
|
util::toHex(expectedHash).c_str(),
|
||||||
util::toHex(actualHash).c_str()));
|
util::toHex(actualHash).c_str()));
|
||||||
segment->clear();
|
segment->clear(getPieceStorage()->getWrDiskCache());
|
||||||
clearWrDiskCacheEntry(getPieceStorage()->getWrDiskCache(), segment);
|
|
||||||
getSegmentMan()->cancelSegment(getCuid());
|
getSegmentMan()->cancelSegment(getCuid());
|
||||||
throw DL_RETRY_EX
|
throw DL_RETRY_EX
|
||||||
(fmt("Invalid checksum index=%lu",
|
(fmt("Invalid checksum index=%lu",
|
||||||
|
|
|
@ -59,10 +59,10 @@ std::string GrowSegment::getDigest()
|
||||||
|
|
||||||
#endif // ENABLE_MESSAGE_DIGEST
|
#endif // ENABLE_MESSAGE_DIGEST
|
||||||
|
|
||||||
void GrowSegment::clear()
|
void GrowSegment::clear(WrDiskCache* diskCache)
|
||||||
{
|
{
|
||||||
writtenLength_ = 0;
|
writtenLength_ = 0;
|
||||||
piece_->clearAllBlock();
|
piece_->clearAllBlock(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedHandle<Piece> GrowSegment::getPiece() const
|
SharedHandle<Piece> GrowSegment::getPiece() const
|
||||||
|
|
|
@ -104,7 +104,7 @@ public:
|
||||||
|
|
||||||
#endif // ENABLE_MESSAGE_DIGEST
|
#endif // ENABLE_MESSAGE_DIGEST
|
||||||
|
|
||||||
virtual void clear();
|
virtual void clear(WrDiskCache* diskCache);
|
||||||
|
|
||||||
virtual SharedHandle<Piece> getPiece() const;
|
virtual SharedHandle<Piece> getPiece() const;
|
||||||
};
|
};
|
||||||
|
|
|
@ -78,9 +78,12 @@ void Piece::completeBlock(size_t blockIndex) {
|
||||||
bitfield_->unsetUseBit(blockIndex);
|
bitfield_->unsetUseBit(blockIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Piece::clearAllBlock() {
|
void Piece::clearAllBlock(WrDiskCache* diskCache) {
|
||||||
bitfield_->clearAllBit();
|
bitfield_->clearAllBit();
|
||||||
bitfield_->clearAllUseBit();
|
bitfield_->clearAllUseBit();
|
||||||
|
if(diskCache && wrCache_) {
|
||||||
|
clearWrCache(diskCache);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Piece::setAllBlock() {
|
void Piece::setAllBlock() {
|
||||||
|
|
|
@ -147,7 +147,7 @@ public:
|
||||||
|
|
||||||
size_t getBitfieldLength() const;
|
size_t getBitfieldLength() const;
|
||||||
|
|
||||||
void clearAllBlock();
|
void clearAllBlock(WrDiskCache* diskCache);
|
||||||
void setAllBlock();
|
void setAllBlock();
|
||||||
|
|
||||||
std::string toString() const;
|
std::string toString() const;
|
||||||
|
|
|
@ -112,10 +112,10 @@ std::string PiecedSegment::getDigest()
|
||||||
|
|
||||||
#endif // ENABLE_MESSAGE_DIGEST
|
#endif // ENABLE_MESSAGE_DIGEST
|
||||||
|
|
||||||
void PiecedSegment::clear()
|
void PiecedSegment::clear(WrDiskCache* diskCache)
|
||||||
{
|
{
|
||||||
writtenLength_ = 0;
|
writtenLength_ = 0;
|
||||||
piece_->clearAllBlock();
|
piece_->clearAllBlock(diskCache);
|
||||||
|
|
||||||
#ifdef ENABLE_MESSAGE_DIGEST
|
#ifdef ENABLE_MESSAGE_DIGEST
|
||||||
|
|
||||||
|
|
|
@ -90,7 +90,7 @@ public:
|
||||||
|
|
||||||
#endif // ENABLE_MESSAGE_DIGEST
|
#endif // ENABLE_MESSAGE_DIGEST
|
||||||
|
|
||||||
virtual void clear();
|
virtual void clear(WrDiskCache* diskCache);
|
||||||
|
|
||||||
virtual SharedHandle<Piece> getPiece() const;
|
virtual SharedHandle<Piece> getPiece() const;
|
||||||
};
|
};
|
||||||
|
|
|
@ -45,6 +45,7 @@
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
class Piece;
|
class Piece;
|
||||||
|
class WrDiskCache;
|
||||||
|
|
||||||
class Segment {
|
class Segment {
|
||||||
public:
|
public:
|
||||||
|
@ -80,7 +81,7 @@ public:
|
||||||
|
|
||||||
#endif // ENABLE_MESSAGE_DIGEST
|
#endif // ENABLE_MESSAGE_DIGEST
|
||||||
|
|
||||||
virtual void clear() = 0;
|
virtual void clear(WrDiskCache* diskCache) = 0;
|
||||||
|
|
||||||
virtual SharedHandle<Piece> getPiece() const = 0;
|
virtual SharedHandle<Piece> getPiece() const = 0;
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,7 @@ void GrowSegmentTest::testClear()
|
||||||
GrowSegment segment(SharedHandle<Piece>(new Piece()));
|
GrowSegment segment(SharedHandle<Piece>(new Piece()));
|
||||||
segment.updateWrittenLength(32*1024);
|
segment.updateWrittenLength(32*1024);
|
||||||
CPPUNIT_ASSERT_EQUAL(32*1024, segment.getWrittenLength());
|
CPPUNIT_ASSERT_EQUAL(32*1024, segment.getWrittenLength());
|
||||||
segment.clear();
|
segment.clear(0);
|
||||||
CPPUNIT_ASSERT_EQUAL(0, segment.getWrittenLength());
|
CPPUNIT_ASSERT_EQUAL(0, segment.getWrittenLength());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -67,7 +67,7 @@ public:
|
||||||
|
|
||||||
#endif // ENABLE_MESSAGE_DIGEST
|
#endif // ENABLE_MESSAGE_DIGEST
|
||||||
|
|
||||||
virtual void clear() {}
|
virtual void clear(WrDiskCache* diskCache) {}
|
||||||
|
|
||||||
virtual SharedHandle<Piece> getPiece() const
|
virtual SharedHandle<Piece> getPiece() const
|
||||||
{
|
{
|
||||||
|
|
|
@ -68,7 +68,7 @@ void SegmentTest::testClear()
|
||||||
PiecedSegment s(16*1024*10, p);
|
PiecedSegment s(16*1024*10, p);
|
||||||
s.updateWrittenLength(16*1024*10);
|
s.updateWrittenLength(16*1024*10);
|
||||||
CPPUNIT_ASSERT_EQUAL(16*1024*10, s.getWrittenLength());
|
CPPUNIT_ASSERT_EQUAL(16*1024*10, s.getWrittenLength());
|
||||||
s.clear();
|
s.clear(0);
|
||||||
CPPUNIT_ASSERT_EQUAL(0, s.getWrittenLength());
|
CPPUNIT_ASSERT_EQUAL(0, s.getWrittenLength());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue