From 785a27f6e822c436d25f28e5b2e7c26497c547fd Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Wed, 4 Aug 2010 15:00:38 +0000 Subject: [PATCH] 2010-08-04 Tatsuhiro Tsujikawa 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 --- ChangeLog | 18 ++++++++++++++++++ src/DefaultBtInteractive.cc | 2 ++ src/DefaultPeerStorage.cc | 2 +- src/InitiatorMSEHandshakeCommand.cc | 2 +- src/Peer.cc | 3 ++- src/Peer.h | 13 +++++++++++++ src/PeerConnection.cc | 8 +++++++- src/PeerConnection.h | 7 ++++++- src/PeerInteractionCommand.cc | 2 +- src/PeerReceiveHandshakeCommand.cc | 2 +- src/ReceiverMSEHandshakeCommand.cc | 4 ++-- src/UTPexExtensionMessage.cc | 1 + test/DefaultPeerStorageTest.cc | 5 +++-- test/UTPexExtensionMessageTest.cc | 2 +- 14 files changed, 59 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index b923ebc1..f4554cfc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,21 @@ +2010-08-04 Tatsuhiro Tsujikawa + + 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 Don't use pre-calculate hash value when end-game mode. Throw diff --git a/src/DefaultBtInteractive.cc b/src/DefaultBtInteractive.cc index b1bc3299..c1b25eb4 100644 --- a/src/DefaultBtInteractive.cc +++ b/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()); } diff --git a/src/DefaultPeerStorage.cc b/src/DefaultPeerStorage.cc index 6379088a..52c77603 100644 --- a/src/DefaultPeerStorage.cc +++ b/src/DefaultPeerStorage.cc @@ -308,7 +308,7 @@ void DefaultPeerStorage::onReturningPeer(const SharedHandle& peer) removedPeerSessionUploadLength_ += removedStat.getSessionUploadLength(); cachedTransferStat_ -= removedStat; - if(!peer->isIncomingPeer()) { + if(peer->isDisconnectedGracefully() && !peer->isIncomingPeer()) { peer->startBadCondition(); addDroppedPeer(peer); } diff --git a/src/InitiatorMSEHandshakeCommand.cc b/src/InitiatorMSEHandshakeCommand.cc index 88524e1e..c39d1135 100644 --- a/src/InitiatorMSEHandshakeCommand.cc +++ b/src/InitiatorMSEHandshakeCommand.cc @@ -150,7 +150,7 @@ bool InitiatorMSEHandshakeCommand::executeInternal() { case INITIATOR_RECEIVE_PAD_D: { if(mseHandshake_->receivePad()) { SharedHandle peerConnection - (new PeerConnection(getCuid(), getSocket())); + (new PeerConnection(getCuid(), getPeer(), getSocket())); if(mseHandshake_->getNegotiatedCryptoType() == MSEHandshake::CRYPTO_ARC4){ peerConnection->enableEncryption(mseHandshake_->getEncryptor(), mseHandshake_->getDecryptor()); diff --git a/src/Peer.cc b/src/Peer.cc index a779414a..4451bdad 100644 --- a/src/Peer.cc +++ b/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(); diff --git a/src/Peer.h b/src/Peer.h index 5ab040ad..972a22c9 100644 --- a/src/Peer.h +++ b/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& dpt); size_t countOutstandingUpload() const; diff --git a/src/PeerConnection.cc b/src/PeerConnection.cc index 51ac9998..6d63c950 100644 --- a/src/PeerConnection.cc +++ b/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, 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(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(currentPayloadLength_), static_cast(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(temp)); } + peer_->setDisconnectedGracefully(true); throw DL_ABORT_EX(EX_EOF_FROM_PEER); } resbufLength_ += remaining; diff --git a/src/PeerConnection.h b/src/PeerConnection.h index a8dc885a..0659f414 100644 --- a/src/PeerConnection.h +++ b/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_; SharedHandle 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& socket); + PeerConnection + (cuid_t cuid, + const SharedHandle& peer, + const SharedHandle& socket); ~PeerConnection(); diff --git a/src/PeerInteractionCommand.cc b/src/PeerInteractionCommand.cc index 698df99f..87d4b1c9 100644 --- a/src/PeerInteractionCommand.cc +++ b/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; } diff --git a/src/PeerReceiveHandshakeCommand.cc b/src/PeerReceiveHandshakeCommand.cc index f9ec9767..35f88433 100644 --- a/src/PeerReceiveHandshakeCommand.cc +++ b/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())); } } diff --git a/src/ReceiverMSEHandshakeCommand.cc b/src/ReceiverMSEHandshakeCommand.cc index d3404880..5c6113f7 100644 --- a/src/ReceiverMSEHandshakeCommand.cc +++ b/src/ReceiverMSEHandshakeCommand.cc @@ -104,7 +104,7 @@ bool ReceiverMSEHandshakeCommand::executeInternal() " preference."); } SharedHandle 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 - (new PeerConnection(getCuid(), getSocket())); + (new PeerConnection(getCuid(), getPeer(), getSocket())); if(mseHandshake_->getNegotiatedCryptoType() == MSEHandshake::CRYPTO_ARC4) { peerConnection->enableEncryption(mseHandshake_->getEncryptor(), mseHandshake_->getDecryptor()); diff --git a/src/UTPexExtensionMessage.cc b/src/UTPexExtensionMessage.cc index 5a1b9aa4..4618850f 100644 --- a/src/UTPexExtensionMessage.cc +++ b/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) diff --git a/test/DefaultPeerStorageTest.cc b/test/DefaultPeerStorageTest.cc index 3f423e19..9b1f7149 100644 --- a/test/DefaultPeerStorageTest.cc +++ b/test/DefaultPeerStorageTest.cc @@ -217,6 +217,7 @@ void DefaultPeerStorageTest::testReturnPeer() SharedHandle peer2(new Peer("192.168.0.2", 6889)); peer2->allocateSessionResource(1024*1024, 1024*1024*10); SharedHandle 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() diff --git a/test/UTPexExtensionMessageTest.cc b/test/UTPexExtensionMessageTest.cc index 168aea4f..ea3decfc 100644 --- a/test/UTPexExtensionMessageTest.cc +++ b/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 p = peerStorage_->getPeers()[0]; CPPUNIT_ASSERT_EQUAL(std::string("192.168.0.1"), p->getIPAddress());