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
pull/1/head
Tatsuhiro Tsujikawa 2010-08-04 15:00:38 +00:00
parent dfdf2d8e56
commit 785a27f6e8
14 changed files with 59 additions and 12 deletions

View File

@ -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

View File

@ -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());
}

View File

@ -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);
}

View File

@ -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());

View File

@ -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();

View File

@ -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;

View File

@ -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;

View File

@ -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();

View File

@ -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;
}

View File

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

View File

@ -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());

View File

@ -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)

View File

@ -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()

View File

@ -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());