From 992f82eb5a2e2512bb04b7a550bb8b9fc1eb7321 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Mon, 29 Dec 2008 13:58:21 +0000 Subject: [PATCH] 2008-12-29 Tatsuhiro Tsujikawa Fixed the bug that BitTorrent download doesn't finish when REJECT message is received before CHOKE message. The old implementation doen't clear the use-bit of the piece when recieved REJECT message. * src/DefaultBtMessageDispatcher.cc * test/DefaultBtMessageDispatcherTest.cc --- ChangeLog | 9 +++++++++ src/DefaultBtMessageDispatcher.cc | 1 + test/DefaultBtMessageDispatcherTest.cc | 15 ++++++++++++--- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1662508c..1131ffc7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2008-12-29 Tatsuhiro Tsujikawa + + Fixed the bug that BitTorrent download doesn't finish when REJECT + message is received before CHOKE message. The old implementation + doen't clear the use-bit of the piece when recieved REJECT + message. + * src/DefaultBtMessageDispatcher.cc + * test/DefaultBtMessageDispatcherTest.cc + 2008-12-25 Tatsuhiro Tsujikawa * Release 1.1.1 diff --git a/src/DefaultBtMessageDispatcher.cc b/src/DefaultBtMessageDispatcher.cc index 53eccae5..81fe64df 100644 --- a/src/DefaultBtMessageDispatcher.cc +++ b/src/DefaultBtMessageDispatcher.cc @@ -408,6 +408,7 @@ void DefaultBtMessageDispatcher::removeOutstandingRequest(const RequestSlot& slo std::deque::iterator i = std::lower_bound(requestSlots.begin(), requestSlots.end(), slot); if(i != requestSlots.end() && (*i) == slot) { + AbortOutstandingRequest(slot.getPiece(), cuid)(*i); requestSlots.erase(i); } } diff --git a/test/DefaultBtMessageDispatcherTest.cc b/test/DefaultBtMessageDispatcherTest.cc index 8d8ba205..192892d3 100644 --- a/test/DefaultBtMessageDispatcherTest.cc +++ b/test/DefaultBtMessageDispatcherTest.cc @@ -385,16 +385,25 @@ void DefaultBtMessageDispatcherTest::testGetOutstandingRequest() { } void DefaultBtMessageDispatcherTest::testRemoveOutstandingRequest() { - RequestSlot slot(1, 1024, 16*1024, 10); + SharedHandle piece(new Piece(1, 1024*1024)); + size_t blockIndex = 0; + CPPUNIT_ASSERT(piece->getMissingUnusedBlockIndex(blockIndex)); + uint32_t begin = blockIndex*piece->getBlockLength(); + size_t length = piece->getBlockLength(blockIndex); + RequestSlot slot(piece->getIndex(), begin, length, blockIndex, piece); btMessageDispatcher->addOutstandingRequest(slot); - RequestSlot s2 = btMessageDispatcher->getOutstandingRequest(1, 1024, 16*1024); + RequestSlot s2 = btMessageDispatcher->getOutstandingRequest + (piece->getIndex(), begin, length); CPPUNIT_ASSERT(!RequestSlot::isNull(s2)); + CPPUNIT_ASSERT(piece->isBlockUsed(blockIndex)); btMessageDispatcher->removeOutstandingRequest(s2); - RequestSlot s3 = btMessageDispatcher->getOutstandingRequest(1, 1024, 16*1024); + RequestSlot s3 = btMessageDispatcher->getOutstandingRequest + (piece->getIndex(), begin, length); CPPUNIT_ASSERT(RequestSlot::isNull(s3)); + CPPUNIT_ASSERT(!piece->isBlockUsed(blockIndex)); } } // namespace aria2