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

pull/36/head
Tatsuhiro Tsujikawa 2012-12-06 00:39:14 +09:00
parent 9ed8502e74
commit 56c498bcbf
12 changed files with 22 additions and 40 deletions

View File

@ -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);
}

View File

@ -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",

View File

@ -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

View File

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

View File

@ -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() {

View File

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

View File

@ -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

View File

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

View File

@ -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;

View File

@ -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());
}

View File

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

View File

@ -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());
}