Pārlūkot izejas kodu

2010-08-04 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>

	Add only gracefully disconnected peer to ut_pex dropped list.  Add
	incoming dropped list to PeerStorage.
	* src/DefaultBtInteractive.cc
	* src/DefaultPeerStorage.cc
	* src/InitiatorMSEHandshakeCommand.cc
	* src/Peer.cc
	* src/Peer.h
	* src/PeerConnection.cc
	* src/PeerConnection.h
	* src/PeerInteractionCommand.cc
	* src/PeerReceiveHandshakeCommand.cc
	* src/ReceiverMSEHandshakeCommand.cc
	* src/UTPexExtensionMessage.cc
	* test/DefaultPeerStorageTest.cc
	* test/UTPexExtensionMessageTest.cc
Tatsuhiro Tsujikawa 15 gadi atpakaļ
vecāks
revīzija
785a27f6e8

+ 18 - 0
ChangeLog

@@ -1,3 +1,21 @@
+2010-08-04  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
+
+	Add only gracefully disconnected peer to ut_pex dropped list.  Add
+	incoming dropped list to PeerStorage.
+	* src/DefaultBtInteractive.cc
+	* src/DefaultPeerStorage.cc
+	* src/InitiatorMSEHandshakeCommand.cc
+	* src/Peer.cc
+	* src/Peer.h
+	* src/PeerConnection.cc
+	* src/PeerConnection.h
+	* src/PeerInteractionCommand.cc
+	* src/PeerReceiveHandshakeCommand.cc
+	* src/ReceiverMSEHandshakeCommand.cc
+	* src/UTPexExtensionMessage.cc
+	* test/DefaultPeerStorageTest.cc
+	* test/UTPexExtensionMessageTest.cc
+
 2010-08-04  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
 
 	Don't use pre-calculate hash value when end-game mode.  Throw

+ 2 - 0
src/DefaultBtInteractive.cc

@@ -451,6 +451,7 @@ void DefaultBtInteractive::checkActiveInteraction()
     const time_t interval = 30;
     if(!peer_->amInterested() && !peer_->peerInterested() &&
        inactiveTime >= interval) {
+      peer_->setDisconnectedGracefully(true);
       // TODO change the message
       throw DL_ABORT_EX
         (StringFormat("Disconnect peer because we are not interested each other"
@@ -463,6 +464,7 @@ void DefaultBtInteractive::checkActiveInteraction()
   {
     const time_t interval = 60;
     if(inactiveTime >= interval) {
+      peer_->setDisconnectedGracefully(true);
       throw DL_ABORT_EX
         (StringFormat(EX_DROP_INACTIVE_CONNECTION, interval).str());
     }

+ 1 - 1
src/DefaultPeerStorage.cc

@@ -308,7 +308,7 @@ void DefaultPeerStorage::onReturningPeer(const SharedHandle<Peer>& peer)
     removedPeerSessionUploadLength_ += removedStat.getSessionUploadLength();
     cachedTransferStat_ -= removedStat;
 
-    if(!peer->isIncomingPeer()) {
+    if(peer->isDisconnectedGracefully() && !peer->isIncomingPeer()) {
       peer->startBadCondition();
       addDroppedPeer(peer);
     }

+ 1 - 1
src/InitiatorMSEHandshakeCommand.cc

@@ -150,7 +150,7 @@ bool InitiatorMSEHandshakeCommand::executeInternal() {
   case INITIATOR_RECEIVE_PAD_D: {
     if(mseHandshake_->receivePad()) {
       SharedHandle<PeerConnection> peerConnection
-        (new PeerConnection(getCuid(), getSocket()));
+        (new PeerConnection(getCuid(), getPeer(), getSocket()));
       if(mseHandshake_->getNegotiatedCryptoType() == MSEHandshake::CRYPTO_ARC4){
         peerConnection->enableEncryption(mseHandshake_->getEncryptor(),
                                          mseHandshake_->getDecryptor());

+ 2 - 1
src/Peer.cc

@@ -55,7 +55,8 @@ Peer::Peer(std::string ipaddr, uint16_t port, bool incoming):
   seeder_(false),
   res_(0),
   incoming_(incoming),
-  localPeer_(false)
+  localPeer_(false),
+  disconnectedGracefully_(false)
 {
   memset(peerId_, 0, PEER_ID_LENGTH);
   resetStatus();

+ 13 - 0
src/Peer.h

@@ -82,6 +82,9 @@ private:
   // If true, this peer is from local network.
   bool localPeer_;
 
+  // If true, this peer is disconnected gracefully.
+  bool disconnectedGracefully_;
+
   // Before calling updateSeeder(),  make sure that
   // allocateSessionResource() is called and res_ is created.
   // Otherwise assertion fails.
@@ -309,6 +312,16 @@ public:
     localPeer_ = flag;
   }
 
+  bool isDisconnectedGracefully() const
+  {
+    return disconnectedGracefully_;
+  }
+
+  void setDisconnectedGracefully(bool f)
+  {
+    disconnectedGracefully_ = f;
+  }
+
   void setBtMessageDispatcher(const WeakHandle<BtMessageDispatcher>& dpt);
 
   size_t countOutstandingUpload() const;

+ 7 - 1
src/PeerConnection.cc

@@ -49,12 +49,15 @@
 #include "ARC4Decryptor.h"
 #include "StringFormat.h"
 #include "util.h"
+#include "Peer.h"
 
 namespace aria2 {
 
-PeerConnection::PeerConnection(cuid_t cuid, const SocketHandle& socket)
+PeerConnection::PeerConnection
+(cuid_t cuid, const SharedHandle<Peer>& peer, const SocketHandle& socket)
 
   :cuid_(cuid),
+   peer_(peer),
    socket_(socket),
    logger_(LogFactory::getInstance()),
    resbuf_(new unsigned char[MAX_PAYLOAD_LEN]),
@@ -127,6 +130,7 @@ bool PeerConnection::receiveMessage(unsigned char* data, size_t& dataLength) {
                        util::itos(cuid_).c_str(),
                        static_cast<unsigned long>(temp));
       }
+      peer_->setDisconnectedGracefully(true);
       throw DL_ABORT_EX(EX_EOF_FROM_PEER);
     }
     lenbufLength_ += remaining;
@@ -162,6 +166,7 @@ bool PeerConnection::receiveMessage(unsigned char* data, size_t& dataLength) {
                        static_cast<unsigned long>(currentPayloadLength_),
                        static_cast<unsigned long>(temp));
       }
+      peer_->setDisconnectedGracefully(true);
       throw DL_ABORT_EX(EX_EOF_FROM_PEER);
     }
     resbufLength_ += remaining;
@@ -212,6 +217,7 @@ bool PeerConnection::receiveHandshake(unsigned char* data, size_t& dataLength,
             ("CUID#%s - In PeerConnection::receiveHandshake(), remain=%lu",
              util::itos(cuid_).c_str(), static_cast<unsigned long>(temp));
         }
+        peer_->setDisconnectedGracefully(true);
         throw DL_ABORT_EX(EX_EOF_FROM_PEER);
       }
       resbufLength_ += remaining;

+ 6 - 1
src/PeerConnection.h

@@ -46,6 +46,7 @@
 namespace aria2 {
 
 class Logger;
+class Peer;
 class SocketCore;
 class ARC4Encryptor;
 class ARC4Decryptor;
@@ -57,6 +58,7 @@ class ARC4Decryptor;
 class PeerConnection {
 private:
   cuid_t cuid_;
+  SharedHandle<Peer> peer_;
   SharedHandle<SocketCore> socket_;
   Logger* logger_;
 
@@ -79,7 +81,10 @@ private:
   ssize_t sendData(const unsigned char* data, size_t length, bool encryption);
 
 public:
-  PeerConnection(cuid_t cuid, const SharedHandle<SocketCore>& socket);
+  PeerConnection
+  (cuid_t cuid,
+   const SharedHandle<Peer>& peer,
+   const SharedHandle<SocketCore>& socket);
 
   ~PeerConnection();
 

+ 1 - 1
src/PeerInteractionCommand.cc

@@ -142,7 +142,7 @@ PeerInteractionCommand::PeerInteractionCommand
 
   PeerConnectionHandle peerConnection;
   if(passedPeerConnection.isNull()) {
-    peerConnection.reset(new PeerConnection(cuid, getSocket()));
+    peerConnection.reset(new PeerConnection(cuid, getPeer(), getSocket()));
   } else {
     peerConnection = passedPeerConnection;
   }

+ 1 - 1
src/PeerReceiveHandshakeCommand.cc

@@ -73,7 +73,7 @@ PeerReceiveHandshakeCommand::PeerReceiveHandshakeCommand
   peerConnection_(peerConnection)
 {
   if(peerConnection_.isNull()) {
-    peerConnection_.reset(new PeerConnection(cuid, getSocket()));
+    peerConnection_.reset(new PeerConnection(cuid, getPeer(), getSocket()));
   }
 }
 

+ 2 - 2
src/ReceiverMSEHandshakeCommand.cc

@@ -104,7 +104,7 @@ bool ReceiverMSEHandshakeCommand::executeInternal()
            " preference.");
       }
       SharedHandle<PeerConnection> peerConnection
-        (new PeerConnection(getCuid(), getSocket()));
+        (new PeerConnection(getCuid(), getPeer(), getSocket()));
       peerConnection->presetBuffer(mseHandshake_->getBuffer(),
                                    mseHandshake_->getBufferLength());
       Command* c = new PeerReceiveHandshakeCommand(getCuid(),
@@ -191,7 +191,7 @@ bool ReceiverMSEHandshakeCommand::executeInternal()
 void ReceiverMSEHandshakeCommand::createCommand()
 {
   SharedHandle<PeerConnection> peerConnection
-    (new PeerConnection(getCuid(), getSocket()));
+    (new PeerConnection(getCuid(), getPeer(), getSocket()));
   if(mseHandshake_->getNegotiatedCryptoType() == MSEHandshake::CRYPTO_ARC4) {
     peerConnection->enableEncryption(mseHandshake_->getEncryptor(),
                                      mseHandshake_->getDecryptor());

+ 1 - 0
src/UTPexExtensionMessage.cc

@@ -98,6 +98,7 @@ std::string UTPexExtensionMessage::toString() const
 void UTPexExtensionMessage::doReceivedAction()
 {
   peerStorage_->addPeer(freshPeers_);
+  peerStorage_->addPeer(droppedPeers_);
 }
 
 bool UTPexExtensionMessage::addFreshPeer(const SharedHandle<Peer>& peer)

+ 3 - 2
test/DefaultPeerStorageTest.cc

@@ -217,6 +217,7 @@ void DefaultPeerStorageTest::testReturnPeer()
   SharedHandle<Peer> peer2(new Peer("192.168.0.2", 6889));
   peer2->allocateSessionResource(1024*1024, 1024*1024*10);
   SharedHandle<Peer> peer3(new Peer("192.168.0.1", 6889));
+  peer2->setDisconnectedGracefully(true);
   ps.addPeer(peer1);
   ps.addPeer(peer2);
   ps.addPeer(peer3);
@@ -225,12 +226,12 @@ void DefaultPeerStorageTest::testReturnPeer()
   CPPUNIT_ASSERT_EQUAL((size_t)2, ps.getPeers().size());
   CPPUNIT_ASSERT(std::find(ps.getPeers().begin(), ps.getPeers().end(), peer2)
                  == ps.getPeers().end());
+  CPPUNIT_ASSERT_EQUAL((size_t)1, ps.getDroppedPeers().size());
 
   ps.returnPeer(peer1); // peer1 is removed from the container
   CPPUNIT_ASSERT_EQUAL((size_t)1, ps.getPeers().size());
   CPPUNIT_ASSERT(std::find(ps.getPeers().begin(), ps.getPeers().end(), peer1) == ps.getPeers().end());
-
-  CPPUNIT_ASSERT_EQUAL((size_t)2, ps.getDroppedPeers().size());
+  CPPUNIT_ASSERT_EQUAL((size_t)1, ps.getDroppedPeers().size());
 }
 
 void DefaultPeerStorageTest::testOnErasingPeer()

+ 1 - 1
test/UTPexExtensionMessageTest.cc

@@ -137,7 +137,7 @@ void UTPexExtensionMessageTest::testDoReceivedAction()
 
   msg.doReceivedAction();
 
-  CPPUNIT_ASSERT_EQUAL((size_t)2, peerStorage_->getPeers().size());
+  CPPUNIT_ASSERT_EQUAL((size_t)4, peerStorage_->getPeers().size());
   {
     SharedHandle<Peer> p = peerStorage_->getPeers()[0];
     CPPUNIT_ASSERT_EQUAL(std::string("192.168.0.1"), p->getIPAddress());