diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2016-07-02 16:05:22 +0900 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2016-07-02 16:05:22 +0900 |
| commit | f7cbbfd209d8df2dec21da907e48bb09c5429484 (patch) | |
| tree | 7d702840394425a52e8f403ac395165c9fa26cfb /src/DefaultPeerStorage.cc | |
| parent | 9cee162716d0be894e1b87fad78e9737e30356ed (diff) | |
Retain peers obtained earlier
Diffstat (limited to 'src/DefaultPeerStorage.cc')
| -rw-r--r-- | src/DefaultPeerStorage.cc | 63 |
1 files changed, 40 insertions, 23 deletions
diff --git a/src/DefaultPeerStorage.cc b/src/DefaultPeerStorage.cc index dc5353f6..34b1fe89 100644 --- a/src/DefaultPeerStorage.cc +++ b/src/DefaultPeerStorage.cc @@ -54,7 +54,6 @@ namespace aria2 { namespace { const size_t MAX_PEER_LIST_SIZE = 512; -const size_t MAX_PEER_LIST_UPDATE = 100; } // namespace @@ -89,6 +88,14 @@ void DefaultPeerStorage::addUniqPeer(const std::shared_ptr<Peer>& peer) bool DefaultPeerStorage::addPeer(const std::shared_ptr<Peer>& peer) { + if (unusedPeers_.size() >= maxPeerListSize_) { + A2_LOG_DEBUG(fmt("Adding %s:%u is rejected, since unused peer list is full " + "(%lu peers > %lu)", + peer->getIPAddress().c_str(), peer->getPort(), + static_cast<unsigned long>(unusedPeers_.size()), + static_cast<unsigned long>(maxPeerListSize_))); + return false; + } if (isPeerAlreadyAdded(peer)) { A2_LOG_DEBUG(fmt("Adding %s:%u is rejected because it has been already" " added.", @@ -104,7 +111,7 @@ bool DefaultPeerStorage::addPeer(const std::shared_ptr<Peer>& peer) if (peerListSize >= maxPeerListSize_) { deleteUnusedPeer(peerListSize - maxPeerListSize_ + 1); } - unusedPeers_.push_front(peer); + unusedPeers_.push_back(peer); addUniqPeer(peer); A2_LOG_DEBUG(fmt("Now unused peer list contains %lu peers", static_cast<unsigned long>(unusedPeers_.size()))); @@ -114,29 +121,36 @@ bool DefaultPeerStorage::addPeer(const std::shared_ptr<Peer>& peer) void DefaultPeerStorage::addPeer( const std::vector<std::shared_ptr<Peer>>& peers) { - size_t added = 0; - size_t addMax = std::min(maxPeerListSize_, MAX_PEER_LIST_UPDATE); - for (auto itr = std::begin(peers), eoi = std::end(peers); - itr != eoi && added < addMax; ++itr) { - auto& peer = *itr; - if (isPeerAlreadyAdded(peer)) { - A2_LOG_DEBUG(fmt("Adding %s:%u is rejected because it has been already" - " added.", - peer->getIPAddress().c_str(), peer->getPort())); - continue; - } - else if (isBadPeer(peer->getIPAddress())) { - A2_LOG_DEBUG(fmt("Adding %s:%u is rejected because it is marked bad.", - peer->getIPAddress().c_str(), peer->getPort())); - continue; + if (unusedPeers_.size() < maxPeerListSize_) { + for (auto& peer : peers) { + if (isPeerAlreadyAdded(peer)) { + A2_LOG_DEBUG(fmt("Adding %s:%u is rejected because it has been already" + " added.", + peer->getIPAddress().c_str(), peer->getPort())); + continue; + } + else if (isBadPeer(peer->getIPAddress())) { + A2_LOG_DEBUG(fmt("Adding %s:%u is rejected because it is marked bad.", + peer->getIPAddress().c_str(), peer->getPort())); + continue; + } + else { + A2_LOG_DEBUG(fmt(MSG_ADDING_PEER, peer->getIPAddress().c_str(), + peer->getPort())); + } + unusedPeers_.push_back(peer); + addUniqPeer(peer); } - else { + } + else { + for (auto& peer : peers) { A2_LOG_DEBUG( - fmt(MSG_ADDING_PEER, peer->getIPAddress().c_str(), peer->getPort())); + fmt("Adding %s:%u is rejected, since unused peer list is full " + "(%lu peers > %lu)", + peer->getIPAddress().c_str(), peer->getPort(), + static_cast<unsigned long>(unusedPeers_.size()), + static_cast<unsigned long>(maxPeerListSize_))); } - unusedPeers_.push_front(peer); - addUniqPeer(peer); - ++added; } const size_t peerListSize = unusedPeers_.size(); if (peerListSize > maxPeerListSize_) { @@ -220,7 +234,10 @@ void DefaultPeerStorage::addBadPeer(const std::string& ipaddr) void DefaultPeerStorage::deleteUnusedPeer(size_t delSize) { for (; delSize > 0 && !unusedPeers_.empty(); --delSize) { - onErasingPeer(unusedPeers_.back()); + auto& peer = unusedPeers_.back(); + onErasingPeer(peer); + A2_LOG_DEBUG(fmt("Remove peer %s:%u", peer->getIPAddress().c_str(), + peer->getOrigPort())); unusedPeers_.pop_back(); } } |
