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>
|
||||
|
||||
Don't use pre-calculate hash value when end-game mode. Throw
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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
src/Peer.h
13
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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -73,7 +73,7 @@ PeerReceiveHandshakeCommand::PeerReceiveHandshakeCommand
|
|||
peerConnection_(peerConnection)
|
||||
{
|
||||
if(peerConnection_.isNull()) {
|
||||
peerConnection_.reset(new PeerConnection(cuid, getSocket()));
|
||||
peerConnection_.reset(new PeerConnection(cuid, getPeer(), getSocket()));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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());
|
||||
|
|
Loading…
Reference in New Issue