summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-06-17 11:43:29 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-06-17 11:43:29 +0000
commitdfe2f993454bea38614bf1ad70d12a7bec947e69 (patch)
treed9ade0f4c9a3a25ba478d92d4a7f20c55fc3a268
parent09502fc3db5462a2a0ae096dc0d3985ca9a190b5 (diff)
2008-06-17 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Filled up pieces based on the number of missing blocks, rather than simplay the number of piece * block length. * src/BtRequestFactory.h * src/DefaultBtInteractive.cc * src/DefaultBtInteractive.h * src/DefaultBtRequestFactory.cc * src/DefaultBtRequestFactory.h * src/Piece.cc * src/Piece.h * test/BitfieldManTest.cc * test/DefaultBtRequestFactoryTest.cc * test/MockBtRequestFactory.h
-rw-r--r--ChangeLog15
-rw-r--r--src/BtRequestFactory.h2
-rw-r--r--src/DefaultBtInteractive.cc21
-rw-r--r--src/DefaultBtInteractive.h2
-rw-r--r--src/DefaultBtRequestFactory.cc24
-rw-r--r--src/DefaultBtRequestFactory.h2
-rw-r--r--src/Piece.cc5
-rw-r--r--src/Piece.h2
-rw-r--r--test/BitfieldManTest.cc12
-rw-r--r--test/DefaultBtRequestFactoryTest.cc15
-rw-r--r--test/MockBtRequestFactory.h2
11 files changed, 87 insertions, 15 deletions
diff --git a/ChangeLog b/ChangeLog
index 186b8bf4..df477adf 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,20 @@
2008-06-17 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
+ Filled up pieces based on the number of missing blocks, rather than
+ simplay the number of piece * block length.
+ * src/BtRequestFactory.h
+ * src/DefaultBtInteractive.cc
+ * src/DefaultBtInteractive.h
+ * src/DefaultBtRequestFactory.cc
+ * src/DefaultBtRequestFactory.h
+ * src/Piece.cc
+ * src/Piece.h
+ * test/BitfieldManTest.cc
+ * test/DefaultBtRequestFactoryTest.cc
+ * test/MockBtRequestFactory.h
+
+2008-06-17 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
+
Made _epEvents a member variable.
* src/DownloadEngine.cc
* src/DownloadEngine.h
diff --git a/src/BtRequestFactory.h b/src/BtRequestFactory.h
index bba4cfc2..ae31966d 100644
--- a/src/BtRequestFactory.h
+++ b/src/BtRequestFactory.h
@@ -56,6 +56,8 @@ public:
virtual size_t countTargetPiece() = 0;
+ virtual size_t countMissingBlock() = 0;
+
virtual void removeCompletedPiece() = 0;
virtual void doChokedAction() = 0;
diff --git a/src/DefaultBtInteractive.cc b/src/DefaultBtInteractive.cc
index a1b45c47..9d24e475 100644
--- a/src/DefaultBtInteractive.cc
+++ b/src/DefaultBtInteractive.cc
@@ -288,26 +288,32 @@ void DefaultBtInteractive::decideInterest() {
}
}
-void DefaultBtInteractive::fillPiece(size_t maxPieceNum) {
+void DefaultBtInteractive::fillPiece(size_t maxMissingBlock) {
if(pieceStorage->hasMissingPiece(peer)) {
+
+ size_t numMissingBlock = btRequestFactory->countMissingBlock();
+
if(peer->peerChoking()) {
if(peer->isFastExtensionEnabled()) {
- while(btRequestFactory->countTargetPiece() < maxPieceNum) {
+
+ while(numMissingBlock < maxMissingBlock) {
PieceHandle piece = pieceStorage->getMissingFastPiece(peer);
if(piece.isNull()) {
break;
} else {
btRequestFactory->addTargetPiece(piece);
+ numMissingBlock += piece->countMissingBlock();
}
}
}
} else {
- while(btRequestFactory->countTargetPiece() < maxPieceNum) {
+ while(numMissingBlock < maxMissingBlock) {
PieceHandle piece = pieceStorage->getMissingPiece(peer);
if(piece.isNull()) {
break;
} else {
btRequestFactory->addTargetPiece(piece);
+ numMissingBlock += piece->countMissingBlock();
}
}
}
@@ -323,14 +329,7 @@ void DefaultBtInteractive::addRequests() {
} else {
MAX_PENDING_REQUEST = 6;
}
- size_t pieceNum;
- if(pieceStorage->isEndGame()) {
- pieceNum = 1;
- } else {
- size_t blocks = DIV_FLOOR(btContext->getPieceLength(), Piece::BLOCK_LENGTH);
- pieceNum = DIV_FLOOR(MAX_PENDING_REQUEST, blocks);
- }
- fillPiece(pieceNum);
+ fillPiece(MAX_PENDING_REQUEST);
size_t reqNumToCreate =
MAX_PENDING_REQUEST <= dispatcher->countOutstandingRequest() ?
diff --git a/src/DefaultBtInteractive.h b/src/DefaultBtInteractive.h
index 0e8a1425..f7f47a33 100644
--- a/src/DefaultBtInteractive.h
+++ b/src/DefaultBtInteractive.h
@@ -122,7 +122,7 @@ private:
void checkHave();
void sendKeepAlive();
void decideInterest();
- void fillPiece(size_t maxPieceNum);
+ void fillPiece(size_t maxMissingBlock);
void addRequests();
void detectMessageFlooding();
void checkActiveInteraction();
diff --git a/src/DefaultBtRequestFactory.cc b/src/DefaultBtRequestFactory.cc
index 3f52642a..616367b4 100644
--- a/src/DefaultBtRequestFactory.cc
+++ b/src/DefaultBtRequestFactory.cc
@@ -186,6 +186,30 @@ void DefaultBtRequestFactory::createRequestMessagesOnEndGame
}
}
+class CountMissingBlock
+{
+private:
+ size_t _numMissingBlock;
+public:
+ CountMissingBlock():_numMissingBlock(0) {}
+
+ size_t getNumMissingBlock()
+ {
+ return _numMissingBlock;
+ }
+
+ void operator()(const SharedHandle<Piece>& piece)
+ {
+ _numMissingBlock += piece->countMissingBlock();
+ }
+};
+
+size_t DefaultBtRequestFactory::countMissingBlock()
+{
+ return std::for_each(pieces.begin(), pieces.end(),
+ CountMissingBlock()).getNumMissingBlock();
+}
+
std::deque<SharedHandle<Piece> >& DefaultBtRequestFactory::getTargetPieces()
{
return pieces;
diff --git a/src/DefaultBtRequestFactory.h b/src/DefaultBtRequestFactory.h
index 49252180..84cf701f 100644
--- a/src/DefaultBtRequestFactory.h
+++ b/src/DefaultBtRequestFactory.h
@@ -72,6 +72,8 @@ public:
return pieces.size();
}
+ virtual size_t countMissingBlock();
+
virtual void removeCompletedPiece();
virtual void doChokedAction();
diff --git a/src/Piece.cc b/src/Piece.cc
index 4745a08d..b06a8eb9 100644
--- a/src/Piece.cc
+++ b/src/Piece.cc
@@ -162,6 +162,11 @@ size_t Piece::countCompleteBlock() const
return bitfield->countBlock()-bitfield->countMissingBlock();
}
+size_t Piece::countMissingBlock() const
+{
+ return bitfield->countMissingBlock();
+}
+
bool Piece::hasBlock(size_t blockIndex) const
{
return bitfield->isBitSet(blockIndex);
diff --git a/src/Piece.h b/src/Piece.h
index dcd9429c..d0940320 100644
--- a/src/Piece.h
+++ b/src/Piece.h
@@ -95,6 +95,8 @@ public:
size_t countCompleteBlock() const;
+ size_t countMissingBlock() const;
+
bool hasBlock(size_t blockIndex) const;
/**
diff --git a/test/BitfieldManTest.cc b/test/BitfieldManTest.cc
index 2ab8e936..75f3ca22 100644
--- a/test/BitfieldManTest.cc
+++ b/test/BitfieldManTest.cc
@@ -26,6 +26,7 @@ class BitfieldManTest:public CppUnit::TestFixture {
CPPUNIT_TEST(testGetMissingIndex_noarg);
CPPUNIT_TEST(testGetMissingUnusedIndex_noarg);
CPPUNIT_TEST(testCountFilteredBlock);
+ CPPUNIT_TEST(testCountMissingBlock);
CPPUNIT_TEST_SUITE_END();
private:
SharedHandle<Randomizer> fixedNumberRandomizer;
@@ -59,6 +60,7 @@ public:
void testGetMissingUnusedLength();
void testSetBitRange();
void testCountFilteredBlock();
+ void testCountMissingBlock();
};
@@ -741,4 +743,14 @@ void BitfieldManTest::testCountFilteredBlock()
CPPUNIT_ASSERT_EQUAL((size_t)0, bt.countFilteredBlock());
}
+void BitfieldManTest::testCountMissingBlock()
+{
+ BitfieldMan bt(1024, 1024*10);
+ CPPUNIT_ASSERT_EQUAL((size_t)10, bt.countMissingBlock());
+ bt.setBit(1);
+ CPPUNIT_ASSERT_EQUAL((size_t)9, bt.countMissingBlock());
+ bt.setAllBit();
+ CPPUNIT_ASSERT_EQUAL((size_t)0, bt.countMissingBlock());
+}
+
} // namespace aria2
diff --git a/test/DefaultBtRequestFactoryTest.cc b/test/DefaultBtRequestFactoryTest.cc
index 3fae76c1..299b6f7d 100644
--- a/test/DefaultBtRequestFactoryTest.cc
+++ b/test/DefaultBtRequestFactoryTest.cc
@@ -123,9 +123,18 @@ public:
CPPUNIT_TEST_SUITE_REGISTRATION(DefaultBtRequestFactoryTest);
void DefaultBtRequestFactoryTest::testAddTargetPiece() {
- SharedHandle<Piece> piece(new Piece(0, 16*1024));
- btRequestFactory->addTargetPiece(piece);
- CPPUNIT_ASSERT_EQUAL((size_t)1, btRequestFactory->countTargetPiece());
+ {
+ SharedHandle<Piece> piece(new Piece(0, 16*1024*10));
+ btRequestFactory->addTargetPiece(piece);
+ CPPUNIT_ASSERT_EQUAL((size_t)1, btRequestFactory->countTargetPiece());
+ }
+ {
+ SharedHandle<Piece> piece(new Piece(1, 16*1024*9));
+ piece->completeBlock(0);
+ btRequestFactory->addTargetPiece(piece);
+ CPPUNIT_ASSERT_EQUAL((size_t)2, btRequestFactory->countTargetPiece());
+ }
+ CPPUNIT_ASSERT_EQUAL((size_t)18, btRequestFactory->countMissingBlock());
}
void DefaultBtRequestFactoryTest::testRemoveCompletedPiece() {
diff --git a/test/MockBtRequestFactory.h b/test/MockBtRequestFactory.h
index 5a9fa7ee..fa0d2721 100644
--- a/test/MockBtRequestFactory.h
+++ b/test/MockBtRequestFactory.h
@@ -17,6 +17,8 @@ public:
virtual size_t countTargetPiece() { return 0; }
+ virtual size_t countMissingBlock() { return 0; }
+
virtual void removeCompletedPiece() {}
virtual void doChokedAction() {}