From e57a070a3fe1d5125fa61667982b9da062eb59de Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Fri, 7 Mar 2008 12:44:20 +0000 Subject: [PATCH] 2008-03-07 Tatsuhiro Tsujikawa Removed subPiece related functions. * src/Piece.{h, cc} : Also rewritten getCompletedLength(). * src/DefaultPieceStorage.{h, cc} * test/PieceTest.cc * test/DefaultPieceStorageTest.cc --- ChangeLog | 8 +++ src/DefaultPieceStorage.cc | 30 ----------- src/DefaultPieceStorage.h | 1 - src/Piece.cc | 91 +-------------------------------- src/Piece.h | 15 +----- test/DefaultPieceStorageTest.cc | 83 ++---------------------------- test/PieceTest.cc | 68 ++---------------------- 7 files changed, 18 insertions(+), 278 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0402404d..f8c1a156 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2008-03-07 Tatsuhiro Tsujikawa + + Removed subPiece related functions. + * src/Piece.{h, cc} : Also rewritten getCompletedLength(). + * src/DefaultPieceStorage.{h, cc} + * test/PieceTest.cc + * test/DefaultPieceStorageTest.cc + 2008-03-07 Tatsuhiro Tsujikawa Use unsigned char for data store. diff --git a/src/DefaultPieceStorage.cc b/src/DefaultPieceStorage.cc index 39f34382..28884d2f 100644 --- a/src/DefaultPieceStorage.cc +++ b/src/DefaultPieceStorage.cc @@ -204,36 +204,6 @@ PieceHandle DefaultPieceStorage::getMissingPiece() return checkOutPiece(bitfieldMan->getSparseMissingUnusedIndex()); } -PieceHandle DefaultPieceStorage::getMissingPiece(const FileEntryHandle& fileEntry) -{ - BitfieldMan temp(*bitfieldMan); - temp.clearFilter(); - temp.addFilter(fileEntry->getOffset(), fileEntry->getLength()); - temp.enableFilter(); - - int32_t firstPieceIndex = START_INDEX(fileEntry->getOffset(), downloadContext->getPieceLength()); - int32_t endPieceIndex = END_INDEX(fileEntry->getOffset(), fileEntry->getLength(), downloadContext->getPieceLength()); - if(!temp.isBitSet(firstPieceIndex) && !temp.isUseBitSet(firstPieceIndex)) { - PieceHandle piece = findUsedPiece(firstPieceIndex); - if(!piece.isNull()) { - if(piece->isRangeComplete(fileEntry->getOffset()-firstPieceIndex*downloadContext->getPieceLength(), - fileEntry->getLength() > downloadContext->getPieceLength() ? - downloadContext->getPieceLength():fileEntry->getLength())) { - temp.setBit(firstPieceIndex); - } - } - } - if(firstPieceIndex != endPieceIndex && !temp.isBitSet(endPieceIndex) && !temp.isUseBitSet(endPieceIndex)) { - PieceHandle piece = findUsedPiece(endPieceIndex); - if(!piece.isNull()) { - if(piece->isRangeComplete(0, fileEntry->getOffset()+fileEntry->getLength()-endPieceIndex*downloadContext->getPieceLength())) { - temp.setBit(endPieceIndex); - } - } - } - return checkOutPiece(temp.getSparseMissingUnusedIndex()); -} - PieceHandle DefaultPieceStorage::getMissingPiece(int32_t index) { if(hasPiece(index) || isPieceUsed(index)) { diff --git a/src/DefaultPieceStorage.h b/src/DefaultPieceStorage.h index 0f14505d..0d354c74 100644 --- a/src/DefaultPieceStorage.h +++ b/src/DefaultPieceStorage.h @@ -100,7 +100,6 @@ public: virtual SharedHandle getMissingFastPiece(const SharedHandle& peer); virtual SharedHandle getMissingPiece(); - virtual SharedHandle getMissingPiece(const SharedHandle& fileEntry); virtual SharedHandle getMissingPiece(int32_t index); diff --git a/src/Piece.cc b/src/Piece.cc index 837bf11d..dcb28d8f 100644 --- a/src/Piece.cc +++ b/src/Piece.cc @@ -85,7 +85,6 @@ bool Piece::operator==(const Piece& piece) const void Piece::completeBlock(int32_t blockIndex) { bitfield->setBit(blockIndex); bitfield->unsetUseBit(blockIndex); - removeSubPiece(blockIndex); } void Piece::clearAllBlock() { @@ -189,97 +188,9 @@ void Piece::setBitfield(const unsigned char* bitfield, int32_t len) this->bitfield->setBitfield(bitfield, len); } -void Piece::addSubPiece(const PieceHandle& subPiece) -{ - _subPieces.push_back(subPiece); -} - -PieceHandle Piece::getSubPiece(int32_t blockIndex) -{ - Pieces::iterator itr = getSubPieceIterator(blockIndex); - if(itr == _subPieces.end()) { - return 0; - } else { - return *itr; - } -} - -void Piece::removeSubPiece(int32_t blockIndex) -{ - Pieces::iterator itr = getSubPieceIterator(blockIndex); - if(itr != _subPieces.end()) { - _subPieces.erase(itr); - } -} - -Pieces::iterator Piece::getSubPieceIterator(int32_t blockIndex) -{ - for(Pieces::iterator itr = _subPieces.begin(); itr != _subPieces.end(); ++itr) { - if((*itr)->getIndex() == blockIndex) { - return itr; - } - } - return _subPieces.end(); -} - -bool Piece::isRangeComplete(int32_t offset, int32_t length) -{ - int32_t startIndex = START_INDEX(offset, _blockLength); - int32_t endIndex = END_INDEX(offset, length, _blockLength); - if(countBlock() <= endIndex) { - endIndex = countBlock()-1; - } - if(startIndex+1 < endIndex) { - if(!bitfield->isBitRangeSet(startIndex+1, endIndex-1)) { - return false; - } - } - if(startIndex == endIndex) { - if(hasBlock(startIndex)) { - return true; - } - PieceHandle subPiece = getSubPiece(startIndex); - if(subPiece.isNull()) { - return false; - } - return subPiece->isRangeComplete(offset, length); - } else { - if(!hasBlock(startIndex)) { - PieceHandle subPiece = getSubPiece(startIndex); - if(subPiece.isNull()) { - return false; - } - if(!subPiece->isRangeComplete(offset-startIndex*_blockLength, length)) { - return false; - } - } - if(!hasBlock(endIndex)) { - PieceHandle subPiece = getSubPiece(endIndex); - if(subPiece.isNull()) { - return false; - } - if(!subPiece->isRangeComplete(0, offset+length-endIndex*_blockLength)) { - return false; - } - } - return true; - } -} - int32_t Piece::getCompletedLength() { - int32_t length = 0; - for(int32_t i = 0; i < countBlock(); ++i) { - if(hasBlock(i)) { - length += getBlockLength(i); - } else { - PieceHandle subPiece = getSubPiece(i); - if(!subPiece.isNull()) { - length += subPiece->getCompletedLength(); - } - } - } - return length; + return bitfield->getCompletedLength(); } } // namespace aria2 diff --git a/src/Piece.h b/src/Piece.h index 1b1c5c1e..8c21f948 100644 --- a/src/Piece.h +++ b/src/Piece.h @@ -51,8 +51,6 @@ private: int32_t length; int32_t _blockLength; BitfieldMan* bitfield; - - std::deque > _subPieces; public: static const int32_t BLOCK_LENGTH = 16*1024; @@ -113,18 +111,7 @@ public: bool isBlockUsed(int32_t index) const; - void addSubPiece(const SharedHandle& subPiece); - - SharedHandle getSubPiece(int32_t blockIndex); - - void removeSubPiece(int32_t blockIndex); - - std::deque >::iterator - getSubPieceIterator(int32_t blockIndex); - - bool isRangeComplete(int32_t offset, int32_t length); - - // Calculates completed length, taking into account SubPieces + // Calculates completed length int32_t getCompletedLength(); /** diff --git a/test/DefaultPieceStorageTest.cc b/test/DefaultPieceStorageTest.cc index a220933f..bc268731 100644 --- a/test/DefaultPieceStorageTest.cc +++ b/test/DefaultPieceStorageTest.cc @@ -24,7 +24,6 @@ class DefaultPieceStorageTest:public CppUnit::TestFixture { CPPUNIT_TEST(testGetPiece); CPPUNIT_TEST(testGetPieceInUsedPieces); CPPUNIT_TEST(testGetPieceCompletedPiece); - CPPUNIT_TEST(testGetMissingPiece_fileEntry); CPPUNIT_TEST(testCancelPiece); CPPUNIT_TEST(testMarkPiecesDone); CPPUNIT_TEST_SUITE_END(); @@ -62,7 +61,6 @@ public: void testGetPiece(); void testGetPieceInUsedPieces(); void testGetPieceCompletedPiece(); - void testGetMissingPiece_fileEntry(); void testCancelPiece(); void testMarkPiecesDone(); }; @@ -172,79 +170,10 @@ void DefaultPieceStorageTest::testGetPieceCompletedPiece() { CPPUNIT_ASSERT_EQUAL(true, pieceGot->pieceComplete()); } -void DefaultPieceStorageTest::testGetMissingPiece_fileEntry() -{ - // - 32KB - // +--------+ - // |11111222| - int32_t pieceLength = 256*1024; - int64_t totalLength = 1*pieceLength; - int32_t blockLength = 16*1024; - std::deque uris1; - uris1.push_back("http://localhost/src/file1.txt"); - std::deque uris2; - uris2.push_back("http://localhost/src/file2.txt"); - SharedHandle file1 = new FileEntry("src/file1.txt", 150*1024, 0/*, uris1*/); - SharedHandle file2 = new FileEntry("src/file2.txt", 106*1024, file1->getLength() /*, uris2*/); - - SharedHandle dctx = new MockBtContext(); - dctx->setPieceLength(pieceLength); - dctx->setTotalLength(totalLength); - dctx->addFileEntry(file1); - dctx->addFileEntry(file2); - - SharedHandle ps = new DefaultPieceStorage(dctx, option); - - SharedHandle p = ps->getMissingPiece(file1); - CPPUNIT_ASSERT(!p.isNull()); - CPPUNIT_ASSERT_EQUAL((int32_t)0, p->getIndex()); - - for(int32_t i = 0; i < 9; ++i) { - p->completeBlock(i); - } - SharedHandle subPiece = new Piece(9, blockLength, 1); - p->addSubPiece(subPiece); - - ps->cancelPiece(p); - - // Piece index = 0 should be retrieved again because the part of file1 is - // not complete - SharedHandle p2 = ps->getMissingPiece(file1); - CPPUNIT_ASSERT(!p2.isNull()); - CPPUNIT_ASSERT_EQUAL((int32_t)0, p2->getIndex()); - - // Make the part of file1 complete - for(int32_t i = 0; i < 6*1024; ++i) { - p2->getSubPiece(9)->completeBlock(i); - } - ps->cancelPiece(p2); - - // Null Piece should be retrieved - CPPUNIT_ASSERT(ps->getMissingPiece(file1).isNull()); - - // Next, I retrive the piece giving file2 - SharedHandle p3 = ps->getMissingPiece(file2); - CPPUNIT_ASSERT(!p3.isNull()); - CPPUNIT_ASSERT_EQUAL((int32_t)0, p3->getIndex()); - - // Make the part of file2 complete - for(int32_t i = 6*1024; i < 16*1024; ++i) { - p3->getSubPiece(9)->completeBlock(i); - } - for(int32_t i = 10; i < 16; ++i) { - p3->completeBlock(i); - } - ps->cancelPiece(p3); - - // Null Piece should be retrieved - CPPUNIT_ASSERT(ps->getMissingPiece(file2).isNull()); -} - void DefaultPieceStorageTest::testCancelPiece() { int32_t pieceLength = 256*1024; int64_t totalLength = 32*pieceLength; // <-- make the number of piece greater than END_GAME_PIECE_NUM - int32_t blockLength = 16*1024; std::deque uris1; uris1.push_back("http://localhost/src/file1.txt"); SharedHandle file1 = new FileEntry("src/file1.txt", totalLength, 0 /*, uris1*/); @@ -256,18 +185,14 @@ void DefaultPieceStorageTest::testCancelPiece() SharedHandle ps = new DefaultPieceStorage(dctx, option); - SharedHandle p = ps->getMissingPiece(file1); + SharedHandle p = ps->getMissingPiece(); + p->completeBlock(0); - SharedHandle subPiece = new Piece(0, blockLength, 1); - subPiece->completeBlock(0); - p->addSubPiece(subPiece); - ps->cancelPiece(p); - // See the sub piece is also hibernated... - SharedHandle p2 = ps->getMissingPiece(file1); + SharedHandle p2 = ps->getMissingPiece(); - CPPUNIT_ASSERT(!p2->getSubPiece(0).isNull()); + CPPUNIT_ASSERT(p2->hasBlock(0)); } void DefaultPieceStorageTest::testMarkPiecesDone() diff --git a/test/PieceTest.cc b/test/PieceTest.cc index 7f841b46..516f3f31 100644 --- a/test/PieceTest.cc +++ b/test/PieceTest.cc @@ -8,8 +8,6 @@ class PieceTest:public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(PieceTest); CPPUNIT_TEST(testCompleteBlock); - CPPUNIT_TEST(testIsRangeComplete); - CPPUNIT_TEST(testIsRangeComplete_subPiece); CPPUNIT_TEST(testGetCompletedLength); CPPUNIT_TEST_SUITE_END(); private: @@ -18,8 +16,6 @@ public: void setUp() {} void testCompleteBlock(); - void testIsRangeComplete(); - void testIsRangeComplete_subPiece(); void testGetCompletedLength(); }; @@ -31,78 +27,22 @@ void PieceTest::testCompleteBlock() int32_t blockLength = 32*1024; Piece p(0, blockLength*10, blockLength); - // 5 is a block index inside the Piece p. - SharedHandle subPiece = new Piece(5, blockLength, 1); - p.addSubPiece(subPiece); - - CPPUNIT_ASSERT(!p.getSubPiece(5).isNull()); - - // When block is complete, then its associated sub piece must be deleted. p.completeBlock(5); - CPPUNIT_ASSERT(p.getSubPiece(5).isNull()); -} - -void PieceTest::testIsRangeComplete() -{ - int32_t blockLength = 16*1024; - Piece p(0, blockLength*10, blockLength); - - CPPUNIT_ASSERT(!p.isRangeComplete(8*1024, 16*1024)); - - p.completeBlock(0); - CPPUNIT_ASSERT(!p.isRangeComplete(8*1024, 16*1024)); - CPPUNIT_ASSERT(p.isRangeComplete(8*1024, 8*1024)); - - p.completeBlock(1); - CPPUNIT_ASSERT(p.isRangeComplete(8*1024, 16*1024)); -} - -void PieceTest::testIsRangeComplete_subPiece() -{ - int32_t blockLength = 16*1024; - Piece p(0, blockLength*10, blockLength); - - CPPUNIT_ASSERT(!p.isRangeComplete(8*1024, 32*1024)); - - SharedHandle startSubPiece = new Piece(0, blockLength, 1); - p.addSubPiece(startSubPiece); - - SharedHandle endSubPiece = new Piece(2, blockLength, 1); - p.addSubPiece(endSubPiece); - - p.completeBlock(1); - - CPPUNIT_ASSERT(!p.isRangeComplete(8*1024, 32*1024)); - - for(int32_t i = 8*1024; i < blockLength; ++i) { - startSubPiece->completeBlock(i); - } - - CPPUNIT_ASSERT(!p.isRangeComplete(8*1024, 32*1024)); - - for(int32_t i = 0; i < 8*1024; ++i) { - endSubPiece->completeBlock(i); - } - CPPUNIT_ASSERT(p.isRangeComplete(8*1024, 32*1024)); + CPPUNIT_ASSERT(p.hasBlock(5)); } void PieceTest::testGetCompletedLength() { int32_t blockLength = 16*1024; - Piece p(0, blockLength*10, blockLength); + Piece p(0, blockLength*10+100, blockLength); - SharedHandle subPiece = new Piece(0, blockLength, 1); - for(int32_t i = 0; i < blockLength-1; ++i) { - subPiece->completeBlock(i); - } - p.addSubPiece(subPiece); - p.completeBlock(1); p.completeBlock(2); p.completeBlock(9); + p.completeBlock(10); // <-- 100 bytes - CPPUNIT_ASSERT_EQUAL(blockLength*3+blockLength-1, p.getCompletedLength()); + CPPUNIT_ASSERT_EQUAL(blockLength*3+100, p.getCompletedLength()); } } // namespace aria2