2009-01-18 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>

Added --bt-max-peers option to specify the maximum number of
	peers per torrent. 0 means unlimited number of peers.
	* src/ActivePeerConnectionCommand.cc
	* src/BtRuntime.h
	* src/DefaultPeerStorage.cc
	* src/DefaultPeerStorage.h
	* src/OptionHandlerFactory.cc
	* src/RequestGroup.cc
	* src/option_processing.cc
	* src/prefs.cc
	* src/prefs.h
	* src/usage_text.h
	* test/DefaultPeerStorageTest.cc
pull/1/head
Tatsuhiro Tsujikawa 2009-01-18 10:11:08 +00:00
parent 809a28fbae
commit ca2567f2a2
12 changed files with 104 additions and 18 deletions

View File

@ -1,3 +1,19 @@
2009-01-18 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Added --bt-max-peers option to specify the maximum number of peers
per torrent. 0 means unlimited number of peers.
* src/ActivePeerConnectionCommand.cc
* src/BtRuntime.h
* src/DefaultPeerStorage.cc
* src/DefaultPeerStorage.h
* src/OptionHandlerFactory.cc
* src/RequestGroup.cc
* src/option_processing.cc
* src/prefs.cc
* src/prefs.h
* src/usage_text.h
* test/DefaultPeerStorageTest.cc
2009-01-18 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net> 2009-01-18 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Added --bt-hash-check-seed option. If true is given to this Added --bt-hash-check-seed option. If true is given to this

View File

@ -90,10 +90,18 @@ bool ActivePeerConnectionCommand::execute() {
(!_pieceStorage->downloadFinished() && (!_pieceStorage->downloadFinished() &&
(tstat.getDownloadSpeed() < _thresholdSpeed || (tstat.getDownloadSpeed() < _thresholdSpeed ||
_btRuntime->lessThanMinPeers()))) { _btRuntime->lessThanMinPeers()))) {
unsigned int numConnection = _pieceStorage->downloadFinished() ?
std::min(_numNewConnection, unsigned int numConnection = 0;
BtRuntime::MAX_PEERS-_btRuntime->getConnections()) : if(_pieceStorage->downloadFinished()) {
_numNewConnection; if(_btRuntime->getMaxPeers() > _btRuntime->getConnections()) {
numConnection =
std::min(_numNewConnection,
_btRuntime->getMaxPeers()-_btRuntime->getConnections());
}
} else {
numConnection = _numNewConnection;
}
for(unsigned int numAdd = numConnection; for(unsigned int numAdd = numConnection;
numAdd > 0 && _peerStorage->isPeerAvailable(); --numAdd) { numAdd > 0 && _peerStorage->isPeerAvailable(); --numAdd) {
PeerHandle peer = _peerStorage->getUnusedPeer(); PeerHandle peer = _peerStorage->getUnusedPeer();

View File

@ -47,8 +47,14 @@ private:
bool halt; bool halt;
unsigned int connections; unsigned int connections;
bool _ready; bool _ready;
// Maximum number of peers to hold connections at the same time.
// 0 means unlimited.
unsigned int _maxPeers;
// Minimum number of peers. This value is used for getting more peers from
// tracker. 0 means always the number of peers is under minimum.
unsigned int _minPeers;
static const unsigned int MIN_PEERS = 40; static const unsigned int DEFAULT_MIN_PEERS = 40;
public: public:
BtRuntime(): BtRuntime():
@ -56,7 +62,9 @@ public:
port(0), port(0),
halt(false), halt(false),
connections(0), connections(0),
_ready(false) _ready(false),
_maxPeers(DEFAULT_MAX_PEERS),
_minPeers(DEFAULT_MIN_PEERS)
{} {}
~BtRuntime() {} ~BtRuntime() {}
@ -87,17 +95,40 @@ public:
void decreaseConnections() { connections--; } void decreaseConnections() { connections--; }
bool lessThanMaxPeers() const { return connections < MAX_PEERS; } bool lessThanMaxPeers() const
{
return _maxPeers == 0 || connections < _maxPeers;
}
bool lessThanMinPeers() const { return connections < MIN_PEERS; } bool lessThanMinPeers() const
{
return _minPeers == 0 || connections < _minPeers;
}
bool lessThanEqMinPeers() const { return connections <= MIN_PEERS; } bool lessThanEqMinPeers() const
{
return _minPeers == 0 || connections <= _minPeers;
}
bool ready() { return _ready; } bool ready() { return _ready; }
void setReady(bool go) { _ready = go; } void setReady(bool go) { _ready = go; }
static const unsigned int MAX_PEERS = 55; void setMaxPeers(unsigned int maxPeers)
{
_maxPeers = maxPeers;
_minPeers = maxPeers*0.8;
if(_minPeers == 0 && maxPeers != 0) {
_minPeers = maxPeers;
}
}
unsigned int getMaxPeers() const
{
return _maxPeers;
}
static const unsigned int DEFAULT_MAX_PEERS = 55;
}; };
typedef SharedHandle<BtRuntime> BtRuntimeHandle; typedef SharedHandle<BtRuntime> BtRuntimeHandle;

View File

@ -49,12 +49,13 @@
namespace aria2 { namespace aria2 {
static const int MAX_PEER_LIST_SIZE = 1024;
DefaultPeerStorage::DefaultPeerStorage(const BtContextHandle& btContext, DefaultPeerStorage::DefaultPeerStorage(const BtContextHandle& btContext,
const Option* option): const Option* option):
btContext(btContext), btContext(btContext),
option(option), option(option),
logger(LogFactory::getInstance()), logger(LogFactory::getInstance()),
maxPeerListSize(BtRuntime::MAX_PEERS+(BtRuntime::MAX_PEERS >> 2)),
removedPeerSessionDownloadLength(0), removedPeerSessionDownloadLength(0),
removedPeerSessionUploadLength(0), removedPeerSessionUploadLength(0),
_seederStateChoke(new BtSeederStateChoke()), _seederStateChoke(new BtSeederStateChoke()),
@ -84,11 +85,22 @@ bool DefaultPeerStorage::isPeerAlreadyAdded(const PeerHandle& peer)
return std::find_if(peers.begin(), peers.end(), FindIdenticalPeer(peer)) != peers.end(); return std::find_if(peers.begin(), peers.end(), FindIdenticalPeer(peer)) != peers.end();
} }
static size_t calculateMaxPeerListSize(const SharedHandle<BtRuntime>& btRuntime)
{
if(btRuntime.isNull()) {
return MAX_PEER_LIST_SIZE;
}
return btRuntime->getMaxPeers() == 0 ?
MAX_PEER_LIST_SIZE :
btRuntime->getMaxPeers()+(btRuntime->getMaxPeers() >> 2);
}
bool DefaultPeerStorage::addPeer(const PeerHandle& peer) { bool DefaultPeerStorage::addPeer(const PeerHandle& peer) {
if(isPeerAlreadyAdded(peer)) { if(isPeerAlreadyAdded(peer)) {
logger->debug("Adding %s:%u is rejected because it has been already added.", peer->ipaddr.c_str(), peer->port); logger->debug("Adding %s:%u is rejected because it has been already added.", peer->ipaddr.c_str(), peer->port);
return false; return false;
} }
size_t maxPeerListSize = calculateMaxPeerListSize(_btRuntime);
if(peers.size() >= maxPeerListSize) { if(peers.size() >= maxPeerListSize) {
deleteUnusedPeer(peers.size()-maxPeerListSize+1); deleteUnusedPeer(peers.size()-maxPeerListSize+1);
} }

View File

@ -55,7 +55,6 @@ private:
const Option* option; const Option* option;
std::deque<SharedHandle<Peer> > peers; std::deque<SharedHandle<Peer> > peers;
Logger* logger; Logger* logger;
size_t maxPeerListSize;
uint64_t removedPeerSessionDownloadLength; uint64_t removedPeerSessionDownloadLength;
uint64_t removedPeerSessionUploadLength; uint64_t removedPeerSessionUploadLength;
@ -93,10 +92,6 @@ public:
virtual void executeChoke(); virtual void executeChoke();
void setMaxPeerListSize(size_t size) { this->maxPeerListSize = size; }
size_t getMaxPeerListSize() const { return maxPeerListSize; }
void deleteUnusedPeer(size_t delSize); void deleteUnusedPeer(size_t delSize);
void onErasingPeer(const SharedHandle<Peer>& peer); void onErasingPeer(const SharedHandle<Peer>& peer);

View File

@ -735,6 +735,16 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers()
op->addTag(TAG_BITTORRENT); op->addTag(TAG_BITTORRENT);
handlers.push_back(op); handlers.push_back(op);
} }
{
SharedHandle<OptionHandler> op(new NumberOptionHandler
(PREF_BT_MAX_PEERS,
TEXT_BT_MAX_PEERS,
"55",
0));
op->addTag(TAG_BITTORRENT);
handlers.push_back(op);
}
{ {
SharedHandle<OptionHandler> op(new ParameterOptionHandler SharedHandle<OptionHandler> op(new ParameterOptionHandler
(PREF_BT_MIN_CRYPTO_LEVEL, (PREF_BT_MIN_CRYPTO_LEVEL,

View File

@ -231,6 +231,7 @@ void RequestGroup::createInitialCommand(std::deque<Command*>& commands,
BtRuntimeHandle btRuntime(new BtRuntime()); BtRuntimeHandle btRuntime(new BtRuntime());
btRuntime->setListenPort(_option->getAsInt(PREF_LISTEN_PORT)); btRuntime->setListenPort(_option->getAsInt(PREF_LISTEN_PORT));
btRuntime->setMaxPeers(_option->getAsInt(PREF_BT_MAX_PEERS));
btRegistry->registerBtRuntime(btContext->getInfoHashAsString(), btRegistry->registerBtRuntime(btContext->getInfoHashAsString(),
btRuntime); btRuntime);
_btRuntime = btRuntime; _btRuntime = btRuntime;

View File

@ -219,6 +219,7 @@ Option* option_processing(int argc, char* const argv[])
{ PREF_DHT_FILE_PATH.c_str(), required_argument, &lopt, 35 }, { PREF_DHT_FILE_PATH.c_str(), required_argument, &lopt, 35 },
{ PREF_MAX_OVERALL_UPLOAD_LIMIT.c_str(), required_argument, &lopt, 36 }, { PREF_MAX_OVERALL_UPLOAD_LIMIT.c_str(), required_argument, &lopt, 36 },
{ PREF_BT_HASH_CHECK_SEED.c_str(), optional_argument, &lopt, 37 }, { PREF_BT_HASH_CHECK_SEED.c_str(), optional_argument, &lopt, 37 },
{ PREF_BT_MAX_PEERS.c_str(), required_argument, &lopt, 38 },
#endif // ENABLE_BITTORRENT #endif // ENABLE_BITTORRENT
#ifdef ENABLE_METALINK #ifdef ENABLE_METALINK
{ PREF_METALINK_FILE.c_str(), required_argument, NULL, 'M' }, { PREF_METALINK_FILE.c_str(), required_argument, NULL, 'M' },
@ -349,6 +350,9 @@ Option* option_processing(int argc, char* const argv[])
case 37: case 37:
cmdstream << PREF_BT_HASH_CHECK_SEED << "=" << optarg << "\n"; cmdstream << PREF_BT_HASH_CHECK_SEED << "=" << optarg << "\n";
break; break;
case 38:
cmdstream << PREF_BT_MAX_PEERS << "=" << optarg << "\n";
break;
case 100: case 100:
cmdstream << PREF_METALINK_VERSION << "=" << optarg << "\n"; cmdstream << PREF_METALINK_VERSION << "=" << optarg << "\n";
break; break;

View File

@ -271,6 +271,8 @@ const std::string PREF_BT_MAX_OPEN_FILES("bt-max-open-files");
const std::string PREF_BT_SEED_UNVERIFIED("bt-seed-unverified"); const std::string PREF_BT_SEED_UNVERIFIED("bt-seed-unverified");
// values: true | false // values: true | false
const std::string PREF_BT_HASH_CHECK_SEED("bt-hash-check-seed"); const std::string PREF_BT_HASH_CHECK_SEED("bt-hash-check-seed");
// values: 1*digit
const std::string PREF_BT_MAX_PEERS("bt-max-peers");
/** /**
* Metalink related preferences * Metalink related preferences

View File

@ -275,6 +275,8 @@ extern const std::string PREF_BT_MAX_OPEN_FILES;
extern const std::string PREF_BT_SEED_UNVERIFIED; extern const std::string PREF_BT_SEED_UNVERIFIED;
// values: true | false // values: true | false
extern const std::string PREF_BT_HASH_CHECK_SEED; extern const std::string PREF_BT_HASH_CHECK_SEED;
// values: 1*digit
extern const std::string PREF_BT_MAX_PEERS;
/** /**
* Metalink related preferences * Metalink related preferences

View File

@ -305,6 +305,10 @@ _(" --bt-max-open-files=NUM Specify maximum number of files to open in each
#define TEXT_BT_SEED_UNVERIFIED \ #define TEXT_BT_SEED_UNVERIFIED \
_(" --bt-seed-unverified[=true|false] Seed previously downloaded files without\n"\ _(" --bt-seed-unverified[=true|false] Seed previously downloaded files without\n"\
" verifying piece hashes.") " verifying piece hashes.")
#define TEXT_BT_MAX_PEERS \
_(" --bt-max-peers=NUM Specify the maximum number of peers per torrent.\n"\
" 0 means unlimited.\n"\
" See also --bt-request-peer-speed-limit option.")
#define TEXT_METALINK_FILE \ #define TEXT_METALINK_FILE \
_(" -M, --metalink-file=METALINK_FILE The file path to the .metalink file.") _(" -M, --metalink-file=METALINK_FILE The file path to the .metalink file.")
#define TEXT_METALINK_SERVERS \ #define TEXT_METALINK_SERVERS \

View File

@ -97,6 +97,9 @@ void DefaultPeerStorageTest::testDeleteUnusedPeer() {
void DefaultPeerStorageTest::testAddPeer() { void DefaultPeerStorageTest::testAddPeer() {
DefaultPeerStorage ps(btContext, option); DefaultPeerStorage ps(btContext, option);
SharedHandle<BtRuntime> btRuntime(new BtRuntime());
btRuntime->setMaxPeers(3);
ps.setBtRuntime(btRuntime);
SharedHandle<Peer> peer1(new Peer("192.168.0.1", 6889)); SharedHandle<Peer> peer1(new Peer("192.168.0.1", 6889));
SharedHandle<Peer> peer2(new Peer("192.168.0.2", 6889)); SharedHandle<Peer> peer2(new Peer("192.168.0.2", 6889));
@ -113,8 +116,6 @@ void DefaultPeerStorageTest::testAddPeer() {
// the number of peers doesn't change. // the number of peers doesn't change.
CPPUNIT_ASSERT_EQUAL((size_t)3, ps.countPeer()); CPPUNIT_ASSERT_EQUAL((size_t)3, ps.countPeer());
ps.setMaxPeerListSize(3);
SharedHandle<Peer> peer4(new Peer("192.168.0.4", 6889)); SharedHandle<Peer> peer4(new Peer("192.168.0.4", 6889));
peer1->usedBy(1); peer1->usedBy(1);