diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2012-12-06 00:39:14 +0900 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2012-12-06 00:39:14 +0900 |
| commit | 56c498bcbfa1b7645c75e39142ac9f6c6ca369c6 (patch) | |
| tree | a539d2585134ce545dcfcaee0ee4436e4049cd10 /src | |
| parent | 9ed8502e742452568695181014410fe924f45e26 (diff) | |
Clear write cache on Segment::clear and Piece::clearAllBlock
Diffstat (limited to 'src')
| -rw-r--r-- | src/BtPieceMessage.cc | 13 | ||||
| -rw-r--r-- | src/DownloadCommand.cc | 21 | ||||
| -rw-r--r-- | src/GrowSegment.cc | 4 | ||||
| -rw-r--r-- | src/GrowSegment.h | 2 | ||||
| -rw-r--r-- | src/Piece.cc | 5 | ||||
| -rw-r--r-- | src/Piece.h | 2 | ||||
| -rw-r--r-- | src/PiecedSegment.cc | 4 | ||||
| -rw-r--r-- | src/PiecedSegment.h | 2 | ||||
| -rw-r--r-- | src/Segment.h | 3 |
9 files changed, 19 insertions, 37 deletions
diff --git a/src/BtPieceMessage.cc b/src/BtPieceMessage.cc index f2e7dccd..108b39ce 100644 --- a/src/BtPieceMessage.cc +++ b/src/BtPieceMessage.cc @@ -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); } diff --git a/src/DownloadCommand.cc b/src/DownloadCommand.cc index 09a62fd3..7e932dcd 100644 --- a/src/DownloadCommand.cc +++ b/src/DownloadCommand.cc @@ -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", diff --git a/src/GrowSegment.cc b/src/GrowSegment.cc index af9c2748..10c73719 100644 --- a/src/GrowSegment.cc +++ b/src/GrowSegment.cc @@ -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 diff --git a/src/GrowSegment.h b/src/GrowSegment.h index 9014f321..b108ef40 100644 --- a/src/GrowSegment.h +++ b/src/GrowSegment.h @@ -104,7 +104,7 @@ public: #endif // ENABLE_MESSAGE_DIGEST - virtual void clear(); + virtual void clear(WrDiskCache* diskCache); virtual SharedHandle<Piece> getPiece() const; }; diff --git a/src/Piece.cc b/src/Piece.cc index 1f7e4596..f1e59cd9 100644 --- a/src/Piece.cc +++ b/src/Piece.cc @@ -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() { diff --git a/src/Piece.h b/src/Piece.h index 9905d7d7..ed605e9b 100644 --- a/src/Piece.h +++ b/src/Piece.h @@ -147,7 +147,7 @@ public: size_t getBitfieldLength() const; - void clearAllBlock(); + void clearAllBlock(WrDiskCache* diskCache); void setAllBlock(); std::string toString() const; diff --git a/src/PiecedSegment.cc b/src/PiecedSegment.cc index 314512f5..ab100d9a 100644 --- a/src/PiecedSegment.cc +++ b/src/PiecedSegment.cc @@ -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 diff --git a/src/PiecedSegment.h b/src/PiecedSegment.h index f282d7d3..94d423d4 100644 --- a/src/PiecedSegment.h +++ b/src/PiecedSegment.h @@ -90,7 +90,7 @@ public: #endif // ENABLE_MESSAGE_DIGEST - virtual void clear(); + virtual void clear(WrDiskCache* diskCache); virtual SharedHandle<Piece> getPiece() const; }; diff --git a/src/Segment.h b/src/Segment.h index 4f37888c..bc87cec9 100644 --- a/src/Segment.h +++ b/src/Segment.h @@ -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; |
