mirror of https://github.com/aria2/aria2
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.ccpull/1/head
parent
dfdf2d8e56
commit
785a27f6e8
18
ChangeLog
18
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>
|
2010-08-04 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
|
||||||
|
|
||||||
Don't use pre-calculate hash value when end-game mode. Throw
|
Don't use pre-calculate hash value when end-game mode. Throw
|
||||||
|
|
|
@ -451,6 +451,7 @@ void DefaultBtInteractive::checkActiveInteraction()
|
||||||
const time_t interval = 30;
|
const time_t interval = 30;
|
||||||
if(!peer_->amInterested() && !peer_->peerInterested() &&
|
if(!peer_->amInterested() && !peer_->peerInterested() &&
|
||||||
inactiveTime >= interval) {
|
inactiveTime >= interval) {
|
||||||
|
peer_->setDisconnectedGracefully(true);
|
||||||
// TODO change the message
|
// TODO change the message
|
||||||
throw DL_ABORT_EX
|
throw DL_ABORT_EX
|
||||||
(StringFormat("Disconnect peer because we are not interested each other"
|
(StringFormat("Disconnect peer because we are not interested each other"
|
||||||
|
@ -463,6 +464,7 @@ void DefaultBtInteractive::checkActiveInteraction()
|
||||||
{
|
{
|
||||||
const time_t interval = 60;
|
const time_t interval = 60;
|
||||||
if(inactiveTime >= interval) {
|
if(inactiveTime >= interval) {
|
||||||
|
peer_->setDisconnectedGracefully(true);
|
||||||
throw DL_ABORT_EX
|
throw DL_ABORT_EX
|
||||||
(StringFormat(EX_DROP_INACTIVE_CONNECTION, interval).str());
|
(StringFormat(EX_DROP_INACTIVE_CONNECTION, interval).str());
|
||||||
}
|
}
|
||||||
|
|
|
@ -308,7 +308,7 @@ void DefaultPeerStorage::onReturningPeer(const SharedHandle<Peer>& peer)
|
||||||
removedPeerSessionUploadLength_ += removedStat.getSessionUploadLength();
|
removedPeerSessionUploadLength_ += removedStat.getSessionUploadLength();
|
||||||
cachedTransferStat_ -= removedStat;
|
cachedTransferStat_ -= removedStat;
|
||||||
|
|
||||||
if(!peer->isIncomingPeer()) {
|
if(peer->isDisconnectedGracefully() && !peer->isIncomingPeer()) {
|
||||||
peer->startBadCondition();
|
peer->startBadCondition();
|
||||||
addDroppedPeer(peer);
|
addDroppedPeer(peer);
|
||||||
}
|
}
|
||||||
|
|
|
@ -150,7 +150,7 @@ bool InitiatorMSEHandshakeCommand::executeInternal() {
|
||||||
case INITIATOR_RECEIVE_PAD_D: {
|
case INITIATOR_RECEIVE_PAD_D: {
|
||||||
if(mseHandshake_->receivePad()) {
|
if(mseHandshake_->receivePad()) {
|
||||||
SharedHandle<PeerConnection> peerConnection
|
SharedHandle<PeerConnection> peerConnection
|
||||||
(new PeerConnection(getCuid(), getSocket()));
|
(new PeerConnection(getCuid(), getPeer(), getSocket()));
|
||||||
if(mseHandshake_->getNegotiatedCryptoType() == MSEHandshake::CRYPTO_ARC4){
|
if(mseHandshake_->getNegotiatedCryptoType() == MSEHandshake::CRYPTO_ARC4){
|
||||||
peerConnection->enableEncryption(mseHandshake_->getEncryptor(),
|
peerConnection->enableEncryption(mseHandshake_->getEncryptor(),
|
||||||
mseHandshake_->getDecryptor());
|
mseHandshake_->getDecryptor());
|
||||||
|
|
|
@ -55,7 +55,8 @@ Peer::Peer(std::string ipaddr, uint16_t port, bool incoming):
|
||||||
seeder_(false),
|
seeder_(false),
|
||||||
res_(0),
|
res_(0),
|
||||||
incoming_(incoming),
|
incoming_(incoming),
|
||||||
localPeer_(false)
|
localPeer_(false),
|
||||||
|
disconnectedGracefully_(false)
|
||||||
{
|
{
|
||||||
memset(peerId_, 0, PEER_ID_LENGTH);
|
memset(peerId_, 0, PEER_ID_LENGTH);
|
||||||
resetStatus();
|
resetStatus();
|
||||||
|
|
13
src/Peer.h
13
src/Peer.h
|
@ -82,6 +82,9 @@ private:
|
||||||
// If true, this peer is from local network.
|
// If true, this peer is from local network.
|
||||||
bool localPeer_;
|
bool localPeer_;
|
||||||
|
|
||||||
|
// If true, this peer is disconnected gracefully.
|
||||||
|
bool disconnectedGracefully_;
|
||||||
|
|
||||||
// Before calling updateSeeder(), make sure that
|
// Before calling updateSeeder(), make sure that
|
||||||
// allocateSessionResource() is called and res_ is created.
|
// allocateSessionResource() is called and res_ is created.
|
||||||
// Otherwise assertion fails.
|
// Otherwise assertion fails.
|
||||||
|
@ -309,6 +312,16 @@ public:
|
||||||
localPeer_ = flag;
|
localPeer_ = flag;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool isDisconnectedGracefully() const
|
||||||
|
{
|
||||||
|
return disconnectedGracefully_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setDisconnectedGracefully(bool f)
|
||||||
|
{
|
||||||
|
disconnectedGracefully_ = f;
|
||||||
|
}
|
||||||
|
|
||||||
void setBtMessageDispatcher(const WeakHandle<BtMessageDispatcher>& dpt);
|
void setBtMessageDispatcher(const WeakHandle<BtMessageDispatcher>& dpt);
|
||||||
|
|
||||||
size_t countOutstandingUpload() const;
|
size_t countOutstandingUpload() const;
|
||||||
|
|
|
@ -49,12 +49,15 @@
|
||||||
#include "ARC4Decryptor.h"
|
#include "ARC4Decryptor.h"
|
||||||
#include "StringFormat.h"
|
#include "StringFormat.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
#include "Peer.h"
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
PeerConnection::PeerConnection(cuid_t cuid, const SocketHandle& socket)
|
PeerConnection::PeerConnection
|
||||||
|
(cuid_t cuid, const SharedHandle<Peer>& peer, const SocketHandle& socket)
|
||||||
|
|
||||||
:cuid_(cuid),
|
:cuid_(cuid),
|
||||||
|
peer_(peer),
|
||||||
socket_(socket),
|
socket_(socket),
|
||||||
logger_(LogFactory::getInstance()),
|
logger_(LogFactory::getInstance()),
|
||||||
resbuf_(new unsigned char[MAX_PAYLOAD_LEN]),
|
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(),
|
util::itos(cuid_).c_str(),
|
||||||
static_cast<unsigned long>(temp));
|
static_cast<unsigned long>(temp));
|
||||||
}
|
}
|
||||||
|
peer_->setDisconnectedGracefully(true);
|
||||||
throw DL_ABORT_EX(EX_EOF_FROM_PEER);
|
throw DL_ABORT_EX(EX_EOF_FROM_PEER);
|
||||||
}
|
}
|
||||||
lenbufLength_ += remaining;
|
lenbufLength_ += remaining;
|
||||||
|
@ -162,6 +166,7 @@ bool PeerConnection::receiveMessage(unsigned char* data, size_t& dataLength) {
|
||||||
static_cast<unsigned long>(currentPayloadLength_),
|
static_cast<unsigned long>(currentPayloadLength_),
|
||||||
static_cast<unsigned long>(temp));
|
static_cast<unsigned long>(temp));
|
||||||
}
|
}
|
||||||
|
peer_->setDisconnectedGracefully(true);
|
||||||
throw DL_ABORT_EX(EX_EOF_FROM_PEER);
|
throw DL_ABORT_EX(EX_EOF_FROM_PEER);
|
||||||
}
|
}
|
||||||
resbufLength_ += remaining;
|
resbufLength_ += remaining;
|
||||||
|
@ -212,6 +217,7 @@ bool PeerConnection::receiveHandshake(unsigned char* data, size_t& dataLength,
|
||||||
("CUID#%s - In PeerConnection::receiveHandshake(), remain=%lu",
|
("CUID#%s - In PeerConnection::receiveHandshake(), remain=%lu",
|
||||||
util::itos(cuid_).c_str(), static_cast<unsigned long>(temp));
|
util::itos(cuid_).c_str(), static_cast<unsigned long>(temp));
|
||||||
}
|
}
|
||||||
|
peer_->setDisconnectedGracefully(true);
|
||||||
throw DL_ABORT_EX(EX_EOF_FROM_PEER);
|
throw DL_ABORT_EX(EX_EOF_FROM_PEER);
|
||||||
}
|
}
|
||||||
resbufLength_ += remaining;
|
resbufLength_ += remaining;
|
||||||
|
|
|
@ -46,6 +46,7 @@
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
class Logger;
|
class Logger;
|
||||||
|
class Peer;
|
||||||
class SocketCore;
|
class SocketCore;
|
||||||
class ARC4Encryptor;
|
class ARC4Encryptor;
|
||||||
class ARC4Decryptor;
|
class ARC4Decryptor;
|
||||||
|
@ -57,6 +58,7 @@ class ARC4Decryptor;
|
||||||
class PeerConnection {
|
class PeerConnection {
|
||||||
private:
|
private:
|
||||||
cuid_t cuid_;
|
cuid_t cuid_;
|
||||||
|
SharedHandle<Peer> peer_;
|
||||||
SharedHandle<SocketCore> socket_;
|
SharedHandle<SocketCore> socket_;
|
||||||
Logger* logger_;
|
Logger* logger_;
|
||||||
|
|
||||||
|
@ -79,7 +81,10 @@ private:
|
||||||
ssize_t sendData(const unsigned char* data, size_t length, bool encryption);
|
ssize_t sendData(const unsigned char* data, size_t length, bool encryption);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PeerConnection(cuid_t cuid, const SharedHandle<SocketCore>& socket);
|
PeerConnection
|
||||||
|
(cuid_t cuid,
|
||||||
|
const SharedHandle<Peer>& peer,
|
||||||
|
const SharedHandle<SocketCore>& socket);
|
||||||
|
|
||||||
~PeerConnection();
|
~PeerConnection();
|
||||||
|
|
||||||
|
|
|
@ -142,7 +142,7 @@ PeerInteractionCommand::PeerInteractionCommand
|
||||||
|
|
||||||
PeerConnectionHandle peerConnection;
|
PeerConnectionHandle peerConnection;
|
||||||
if(passedPeerConnection.isNull()) {
|
if(passedPeerConnection.isNull()) {
|
||||||
peerConnection.reset(new PeerConnection(cuid, getSocket()));
|
peerConnection.reset(new PeerConnection(cuid, getPeer(), getSocket()));
|
||||||
} else {
|
} else {
|
||||||
peerConnection = passedPeerConnection;
|
peerConnection = passedPeerConnection;
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,7 +73,7 @@ PeerReceiveHandshakeCommand::PeerReceiveHandshakeCommand
|
||||||
peerConnection_(peerConnection)
|
peerConnection_(peerConnection)
|
||||||
{
|
{
|
||||||
if(peerConnection_.isNull()) {
|
if(peerConnection_.isNull()) {
|
||||||
peerConnection_.reset(new PeerConnection(cuid, getSocket()));
|
peerConnection_.reset(new PeerConnection(cuid, getPeer(), getSocket()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -104,7 +104,7 @@ bool ReceiverMSEHandshakeCommand::executeInternal()
|
||||||
" preference.");
|
" preference.");
|
||||||
}
|
}
|
||||||
SharedHandle<PeerConnection> peerConnection
|
SharedHandle<PeerConnection> peerConnection
|
||||||
(new PeerConnection(getCuid(), getSocket()));
|
(new PeerConnection(getCuid(), getPeer(), getSocket()));
|
||||||
peerConnection->presetBuffer(mseHandshake_->getBuffer(),
|
peerConnection->presetBuffer(mseHandshake_->getBuffer(),
|
||||||
mseHandshake_->getBufferLength());
|
mseHandshake_->getBufferLength());
|
||||||
Command* c = new PeerReceiveHandshakeCommand(getCuid(),
|
Command* c = new PeerReceiveHandshakeCommand(getCuid(),
|
||||||
|
@ -191,7 +191,7 @@ bool ReceiverMSEHandshakeCommand::executeInternal()
|
||||||
void ReceiverMSEHandshakeCommand::createCommand()
|
void ReceiverMSEHandshakeCommand::createCommand()
|
||||||
{
|
{
|
||||||
SharedHandle<PeerConnection> peerConnection
|
SharedHandle<PeerConnection> peerConnection
|
||||||
(new PeerConnection(getCuid(), getSocket()));
|
(new PeerConnection(getCuid(), getPeer(), getSocket()));
|
||||||
if(mseHandshake_->getNegotiatedCryptoType() == MSEHandshake::CRYPTO_ARC4) {
|
if(mseHandshake_->getNegotiatedCryptoType() == MSEHandshake::CRYPTO_ARC4) {
|
||||||
peerConnection->enableEncryption(mseHandshake_->getEncryptor(),
|
peerConnection->enableEncryption(mseHandshake_->getEncryptor(),
|
||||||
mseHandshake_->getDecryptor());
|
mseHandshake_->getDecryptor());
|
||||||
|
|
|
@ -98,6 +98,7 @@ std::string UTPexExtensionMessage::toString() const
|
||||||
void UTPexExtensionMessage::doReceivedAction()
|
void UTPexExtensionMessage::doReceivedAction()
|
||||||
{
|
{
|
||||||
peerStorage_->addPeer(freshPeers_);
|
peerStorage_->addPeer(freshPeers_);
|
||||||
|
peerStorage_->addPeer(droppedPeers_);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool UTPexExtensionMessage::addFreshPeer(const SharedHandle<Peer>& peer)
|
bool UTPexExtensionMessage::addFreshPeer(const SharedHandle<Peer>& peer)
|
||||||
|
|
|
@ -217,6 +217,7 @@ void DefaultPeerStorageTest::testReturnPeer()
|
||||||
SharedHandle<Peer> peer2(new Peer("192.168.0.2", 6889));
|
SharedHandle<Peer> peer2(new Peer("192.168.0.2", 6889));
|
||||||
peer2->allocateSessionResource(1024*1024, 1024*1024*10);
|
peer2->allocateSessionResource(1024*1024, 1024*1024*10);
|
||||||
SharedHandle<Peer> peer3(new Peer("192.168.0.1", 6889));
|
SharedHandle<Peer> peer3(new Peer("192.168.0.1", 6889));
|
||||||
|
peer2->setDisconnectedGracefully(true);
|
||||||
ps.addPeer(peer1);
|
ps.addPeer(peer1);
|
||||||
ps.addPeer(peer2);
|
ps.addPeer(peer2);
|
||||||
ps.addPeer(peer3);
|
ps.addPeer(peer3);
|
||||||
|
@ -225,12 +226,12 @@ void DefaultPeerStorageTest::testReturnPeer()
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)2, ps.getPeers().size());
|
CPPUNIT_ASSERT_EQUAL((size_t)2, ps.getPeers().size());
|
||||||
CPPUNIT_ASSERT(std::find(ps.getPeers().begin(), ps.getPeers().end(), peer2)
|
CPPUNIT_ASSERT(std::find(ps.getPeers().begin(), ps.getPeers().end(), peer2)
|
||||||
== ps.getPeers().end());
|
== ps.getPeers().end());
|
||||||
|
CPPUNIT_ASSERT_EQUAL((size_t)1, ps.getDroppedPeers().size());
|
||||||
|
|
||||||
ps.returnPeer(peer1); // peer1 is removed from the container
|
ps.returnPeer(peer1); // peer1 is removed from the container
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)1, ps.getPeers().size());
|
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(std::find(ps.getPeers().begin(), ps.getPeers().end(), peer1) == ps.getPeers().end());
|
||||||
|
CPPUNIT_ASSERT_EQUAL((size_t)1, ps.getDroppedPeers().size());
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)2, ps.getDroppedPeers().size());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DefaultPeerStorageTest::testOnErasingPeer()
|
void DefaultPeerStorageTest::testOnErasingPeer()
|
||||||
|
|
|
@ -137,7 +137,7 @@ void UTPexExtensionMessageTest::testDoReceivedAction()
|
||||||
|
|
||||||
msg.doReceivedAction();
|
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];
|
SharedHandle<Peer> p = peerStorage_->getPeers()[0];
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("192.168.0.1"), p->getIPAddress());
|
CPPUNIT_ASSERT_EQUAL(std::string("192.168.0.1"), p->getIPAddress());
|
||||||
|
|
Loading…
Reference in New Issue