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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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