diff options
| -rw-r--r-- | ChangeLog | 13 | ||||
| -rw-r--r-- | src/AnnounceList.cc | 16 | ||||
| -rw-r--r-- | src/AnnounceList.h | 4 | ||||
| -rw-r--r-- | src/DefaultBtAnnounce.cc | 12 | ||||
| -rw-r--r-- | src/DefaultBtAnnounce.h | 1 | ||||
| -rw-r--r-- | src/TrackerWatcherCommand.cc | 10 | ||||
| -rw-r--r-- | test/AnnounceListTest.cc | 12 | ||||
| -rw-r--r-- | test/DefaultBtAnnounceTest.cc | 52 |
8 files changed, 91 insertions, 29 deletions
@@ -1,5 +1,18 @@ 2007-11-12 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com> + Do not rotate tiers in announce-list. + * src/DefaultBtAnnounce.{h, cc}: Removed trackerNumTry. + AnnounceList::allTiersFailed() used instead to detect whether all + tiers are tried and failed. + * test/DefaultBtAnnounceTest.cc + * src/AnnounceList.{h, cc}: If all tiers are tried and failed then + allTiersFailed() returns true. To reset tier pointer, call resetTier(); + * test/AnnounceListTest.cc + * src/TrackerWatcherCommand.cc (execute): Removed DlAbortEx catch + clause. Catch RecoverableException instead of DlRetryEx instead. + +2007-11-12 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com> + Implemented checksum validation feature(1 checksum for each file) The validation takes place after the download. * src/PieceHashCheckIntegrityEntry.{h, cc}: New class. diff --git a/src/AnnounceList.cc b/src/AnnounceList.cc index eced1559..c50f7b13 100644 --- a/src/AnnounceList.cc +++ b/src/AnnounceList.cc @@ -103,16 +103,16 @@ void AnnounceList::announceSuccess() { } } -// TODO if currentTier reaches tiers.end(), then getAllTierTried() returns true void AnnounceList::announceFailure() { if(currentTrackerInitialized) { currentTracker++; if(currentTracker == (*currentTier)->urls.end()) { currentTier++; if(currentTier == tiers.end()) { - currentTier = tiers.begin(); + currentTrackerInitialized = false; + } else { + currentTracker = (*currentTier)->urls.begin(); } - currentTracker = (*currentTier)->urls.begin(); } } } @@ -225,3 +225,13 @@ void AnnounceList::shuffle() { random_shuffle(urls.begin(), urls.end()); } } + +bool AnnounceList::allTiersFailed() const +{ + return currentTier == tiers.end(); +} + +void AnnounceList::resetTier() +{ + resetIterator(); +} diff --git a/src/AnnounceList.h b/src/AnnounceList.h index c0123d67..998953f5 100644 --- a/src/AnnounceList.h +++ b/src/AnnounceList.h @@ -115,6 +115,10 @@ public: */ void moveToStoppedAllowedTier(); void moveToCompletedAllowedTier(); + + bool allTiersFailed() const; + + void resetTier(); }; #endif // _D_ANNOUNCE_LIST_H_ diff --git a/src/DefaultBtAnnounce.cc b/src/DefaultBtAnnounce.cc index b9b53256..52e5e895 100644 --- a/src/DefaultBtAnnounce.cc +++ b/src/DefaultBtAnnounce.cc @@ -55,7 +55,6 @@ DefaultBtAnnounce::DefaultBtAnnounce(BtContextHandle btContext, complete(0), incomplete(0), announceList(btContext->getAnnounceTiers()), - trackerNumTry(0), option(option), logger(LogFactory::getInstance()), _randomizer(SimpleRandomizer::getInstance()), @@ -76,7 +75,8 @@ void DefaultBtAnnounce::generateKey() } bool DefaultBtAnnounce::isDefaultAnnounceReady() { - return (trackers == 0 && prevAnnounceTime.elapsed(minInterval)); + return (trackers == 0 && prevAnnounceTime.elapsed(minInterval) && + !announceList.allTiersFailed()); } bool DefaultBtAnnounce::isStoppedAnnounceReady() { @@ -113,6 +113,8 @@ string DefaultBtAnnounce::getAnnounceUrl() { announceList.getEvent() == AnnounceTier::STARTED) { announceList.setEvent(AnnounceTier::STARTED_AFTER_COMPLETION); } + } else { + return ""; } int32_t numWant = 50; if(!btRuntime->lessThanEqMinPeer() || @@ -160,18 +162,16 @@ void DefaultBtAnnounce::announceSuccess() { void DefaultBtAnnounce::announceFailure() { trackers = 0; - trackerNumTry++; announceList.announceFailure(); } bool DefaultBtAnnounce::isAllAnnounceFailed() { - return - trackerNumTry >= option->getAsInt(PREF_TRACKER_MAX_TRIES); + return announceList.allTiersFailed(); } void DefaultBtAnnounce::resetAnnounce() { prevAnnounceTime.reset(); - trackerNumTry = 0; + announceList.resetTier(); } void diff --git a/src/DefaultBtAnnounce.h b/src/DefaultBtAnnounce.h index 774f0699..60deeebb 100644 --- a/src/DefaultBtAnnounce.h +++ b/src/DefaultBtAnnounce.h @@ -62,7 +62,6 @@ private: AnnounceList announceList; string trackerId; string key; - int32_t trackerNumTry; const Option* option; Logger* logger; RandomizerHandle _randomizer; diff --git a/src/TrackerWatcherCommand.cc b/src/TrackerWatcherCommand.cc index 043df899..66f6d06f 100644 --- a/src/TrackerWatcherCommand.cc +++ b/src/TrackerWatcherCommand.cc @@ -71,8 +71,6 @@ bool TrackerWatcherCommand::execute() { if(_trackerRequestGroup.isNull()) { _trackerRequestGroup = createAnnounce(); if(!_trackerRequestGroup.isNull()) { - //e->_requestGroupMan->addReservedGroup(_trackerRequestGroup); - //e->_requestGroupMan->fillRequestGroupFromReserver(e); e->addCommand(_trackerRequestGroup->createInitialCommand(e)); logger->debug("added tracker request command"); } @@ -83,13 +81,7 @@ bool TrackerWatcherCommand::execute() { processTrackerResponse(trackerResponse); btAnnounce->announceSuccess(); btAnnounce->resetAnnounce(); - } catch(DlAbortEx* ex) { - logger->error(EX_EXCEPTION_CAUGHT, ex); - delete ex; - btAnnounce->announceFailure(); - btAnnounce->resetAnnounce(); - } catch(DlRetryEx* ex) { - // TODO Can I remove this catch clause? + } catch(RecoverableException* ex) { logger->error(EX_EXCEPTION_CAUGHT, ex); delete ex; btAnnounce->announceFailure(); diff --git a/test/AnnounceListTest.cc b/test/AnnounceListTest.cc index 56b45cdf..9a5b2e86 100644 --- a/test/AnnounceListTest.cc +++ b/test/AnnounceListTest.cc @@ -44,7 +44,8 @@ void AnnounceListTest::testSingleElementList() { // ANNOUNCE_LIST // [ [ tracker1 ], [ tracker2 ], [ tracker3 ] ] AnnounceList announceList(announces); - + + CPPUNIT_ASSERT(!announceList.allTiersFailed()); string url = announceList.getAnnounce(); string event = announceList.getEventString(); CPPUNIT_ASSERT_EQUAL(string("tracker1"), url); @@ -56,6 +57,9 @@ void AnnounceListTest::testSingleElementList() { url = announceList.getAnnounce(); CPPUNIT_ASSERT_EQUAL(string("tracker3"), url); announceList.announceFailure(); + CPPUNIT_ASSERT(announceList.allTiersFailed()); + announceList.resetTier(); + CPPUNIT_ASSERT(!announceList.allTiersFailed()); // back to the first list url = announceList.getAnnounce(); event = announceList.getEventString(); @@ -86,6 +90,7 @@ void AnnounceListTest::testMultiElementList() { // [ [ tracker1, tracker2, tracker3 ] ] AnnounceList announceList(announces); + CPPUNIT_ASSERT(!announceList.allTiersFailed()); string url = announceList.getAnnounce(); CPPUNIT_ASSERT_EQUAL(string("tracker1"), url); announceList.announceFailure(); @@ -102,8 +107,11 @@ void AnnounceListTest::testMultiElementList() { url = announceList.getAnnounce(); CPPUNIT_ASSERT_EQUAL(string("tracker3"), url); announceList.announceFailure(); - url = announceList.getAnnounce(); + CPPUNIT_ASSERT(announceList.allTiersFailed()); + announceList.resetTier(); + CPPUNIT_ASSERT(!announceList.allTiersFailed()); // back to the first list because there is no other list. + url = announceList.getAnnounce(); CPPUNIT_ASSERT_EQUAL(string("tracker2"), url); } diff --git a/test/DefaultBtAnnounceTest.cc b/test/DefaultBtAnnounceTest.cc index 47276fde..fd7b4be7 100644 --- a/test/DefaultBtAnnounceTest.cc +++ b/test/DefaultBtAnnounceTest.cc @@ -16,9 +16,9 @@ using namespace std; class DefaultBtAnnounceTest:public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(DefaultBtAnnounceTest); - CPPUNIT_TEST(testIsDefaultAnnounceReady); CPPUNIT_TEST(testGetAnnounceUrl); CPPUNIT_TEST(testNoMoreAnnounce); + CPPUNIT_TEST(testIsAllAnnounceFailed); CPPUNIT_TEST_SUITE_END(); private: MockBtContextHandle _btContext; @@ -71,20 +71,14 @@ public: delete _option; } - void testIsDefaultAnnounceReady(); void testGetAnnounceUrl(); void testNoMoreAnnounce(); + void testIsAllAnnounceFailed(); }; CPPUNIT_TEST_SUITE_REGISTRATION(DefaultBtAnnounceTest); -void DefaultBtAnnounceTest::testIsDefaultAnnounceReady() { - DefaultBtAnnounce btAnnounce(_btContext, _option); - - CPPUNIT_ASSERT(btAnnounce.isDefaultAnnounceReady()); -} - void DefaultBtAnnounceTest::testNoMoreAnnounce() { string trackerURI1 = "http://localhost/announce"; @@ -139,6 +133,8 @@ void DefaultBtAnnounceTest::testNoMoreAnnounce() CPPUNIT_ASSERT_EQUAL(string("http://backup/announce?info_hash=%01%23Eg%89%ab%cd%ef%01%23Eg%89%ab%cd%ef%01%23Eg&peer_id=%2daria2%2dultrafastdltl&uploaded=1572864&downloaded=1310720&left=1572864&compact=1&key=AAAAAAAA&numwant=0&no_peer_id=1&port=6989&event=stopped"), btAnnounce.getAnnounceUrl()); btAnnounce.announceSuccess(); + + CPPUNIT_ASSERT(btAnnounce.noMoreAnnounce()); } void DefaultBtAnnounceTest::testGetAnnounceUrl() @@ -175,3 +171,43 @@ void DefaultBtAnnounceTest::testGetAnnounceUrl() CPPUNIT_ASSERT_EQUAL(string("http://localhost/announce?info_hash=%01%23Eg%89%ab%cd%ef%01%23Eg%89%ab%cd%ef%01%23Eg&peer_id=%2daria2%2dultrafastdltl&uploaded=1572864&downloaded=1310720&left=1572864&compact=1&key=AAAAAAAA&numwant=0&no_peer_id=1&port=6989&event=stopped"), btAnnounce.getAnnounceUrl()); } + +void DefaultBtAnnounceTest::testIsAllAnnounceFailed() +{ + string trackerURI1 = "http://localhost/announce"; + Strings uris1; + uris1.push_back(trackerURI1); + AnnounceTierHandle announceTier1 = new AnnounceTier(uris1); + + string trackerURI2 = "http://backup/announce"; + Strings uris2; + uris2.push_back(trackerURI2); + AnnounceTierHandle announceTier2 = new AnnounceTier(uris2); + + + _btContext->addAnnounceTier(announceTier1); + _btContext->addAnnounceTier(announceTier2); + + DefaultBtAnnounce btAnnounce(_btContext, _option); + btAnnounce.setPieceStorage(_pieceStorage); + btAnnounce.setPeerStorage(_peerStorage); + btAnnounce.setBtRuntime(_btRuntime); + btAnnounce.setRandomizer(new FixedNumberRandomizer()); + btAnnounce.generateKey(); + + CPPUNIT_ASSERT_EQUAL(string("http://localhost/announce?info_hash=%01%23Eg%89%ab%cd%ef%01%23Eg%89%ab%cd%ef%01%23Eg&peer_id=%2daria2%2dultrafastdltl&uploaded=1572864&downloaded=1310720&left=1572864&compact=1&key=AAAAAAAA&numwant=50&no_peer_id=1&port=6989&event=started"), btAnnounce.getAnnounceUrl()); + + btAnnounce.announceFailure(); + + CPPUNIT_ASSERT_EQUAL(string("http://backup/announce?info_hash=%01%23Eg%89%ab%cd%ef%01%23Eg%89%ab%cd%ef%01%23Eg&peer_id=%2daria2%2dultrafastdltl&uploaded=1572864&downloaded=1310720&left=1572864&compact=1&key=AAAAAAAA&numwant=50&no_peer_id=1&port=6989&event=started"), btAnnounce.getAnnounceUrl()); + + btAnnounce.announceFailure(); + + CPPUNIT_ASSERT(!btAnnounce.isAnnounceReady()); + CPPUNIT_ASSERT_EQUAL(string(""), btAnnounce.getAnnounceUrl()); + CPPUNIT_ASSERT(btAnnounce.isAllAnnounceFailed()); + + btAnnounce.resetAnnounce(); + + CPPUNIT_ASSERT(!btAnnounce.isAllAnnounceFailed()); +} |
