Selaa lähdekoodia

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.
Tatsuhiro Tsujikawa 18 vuotta sitten
vanhempi
commit
aef50efed0

+ 13 - 0
ChangeLog

@@ -1,3 +1,16 @@
+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)

+ 13 - 3
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();
+}

+ 4 - 0
src/AnnounceList.h

@@ -115,6 +115,10 @@ public:
    */
   void moveToStoppedAllowedTier();
   void moveToCompletedAllowedTier();
+
+  bool allTiersFailed() const;
+
+  void resetTier();
 };
 
 #endif // _D_ANNOUNCE_LIST_H_

+ 6 - 6
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

+ 0 - 1
src/DefaultBtAnnounce.h

@@ -62,7 +62,6 @@ private:
   AnnounceList announceList;
   string trackerId;
   string key;
-  int32_t trackerNumTry;
   const Option* option;
   Logger* logger;
   RandomizerHandle _randomizer;

+ 1 - 9
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();

+ 10 - 2
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);
 }
 

+ 44 - 8
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());  
+}