summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2012-12-06 00:39:14 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2012-12-06 00:39:14 +0900
commit56c498bcbfa1b7645c75e39142ac9f6c6ca369c6 (patch)
treea539d2585134ce545dcfcaee0ee4436e4049cd10 /src
parent9ed8502e742452568695181014410fe924f45e26 (diff)
Clear write cache on Segment::clear and Piece::clearAllBlock
Diffstat (limited to 'src')
-rw-r--r--src/BtPieceMessage.cc13
-rw-r--r--src/DownloadCommand.cc21
-rw-r--r--src/GrowSegment.cc4
-rw-r--r--src/GrowSegment.h2
-rw-r--r--src/Piece.cc5
-rw-r--r--src/Piece.h2
-rw-r--r--src/PiecedSegment.cc4
-rw-r--r--src/PiecedSegment.h2
-rw-r--r--src/Segment.h3
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;