diff --git a/src/kademlia/dht_storage.cpp b/src/kademlia/dht_storage.cpp index e8ca2d56e..1adadc5f8 100644 --- a/src/kademlia/dht_storage.cpp +++ b/src/kademlia/dht_storage.cpp @@ -267,26 +267,12 @@ namespace torrent_entry* v; if (ti == m_map.end()) { - // we don't have this torrent, add it - // do we need to remove another one first? - if (!m_map.empty() && int(m_map.size()) >= m_settings.max_torrents) + if (int(m_map.size()) >= m_settings.max_torrents) { - // we need to remove some. Remove the ones with the - // fewest peers - int num_peers = int(m_map.begin()->second.peers.size()); - auto candidate = m_map.begin(); - for (auto i = m_map.begin() - , end(m_map.end()); i != end; ++i) - { - if (int(i->second.peers.size()) > num_peers) continue; - if (i->first == info_hash) continue; - num_peers = int(i->second.peers.size()); - candidate = i; - } - m_map.erase(candidate); - m_counters.peers -= num_peers; - m_counters.torrents -= 1; + // we're at capacity, drop the announce + return; } + m_counters.torrents += 1; v = &m_map[info_hash]; } @@ -314,13 +300,8 @@ namespace } else if (v->peers.size() >= m_settings.max_peers) { - // when we're at capacity, there's a 50/50 chance of dropping the - // announcing peer or an existing peer - if (random(1)) return; - i = v->peers.lower_bound(peer); - if (i == v->peers.end()) --i; - v->peers.erase(i++); - m_counters.peers -= 1; + // we're at capacity, drop the announce + return; } v->peers.insert(i, peer); m_counters.peers += 1; diff --git a/test/test_dht_storage.cpp b/test/test_dht_storage.cpp index 1c7e16b12..12466238a 100644 --- a/test/test_dht_storage.cpp +++ b/test/test_dht_storage.cpp @@ -111,6 +111,7 @@ TORRENT_TEST(announce_peer) tcp::endpoint const p4 = ep("124.31.75.24", 1); s->announce_peer(n1, p1, "torrent_name", false); + peers = entry(); s->get_peers(n1, udp::v4(), false, false, peers); TEST_EQUAL(peers["n"].string(), "torrent_name") TEST_EQUAL(peers["values"].list().size(), 1) @@ -118,8 +119,9 @@ TORRENT_TEST(announce_peer) s->announce_peer(n2, p2, "torrent_name1", false); s->announce_peer(n2, p3, "torrent_name1", false); s->announce_peer(n3, p4, "torrent_name2", false); - bool r = s->get_peers(n1, udp::v4(), false, false, peers); - TEST_CHECK(!r); + peers = entry(); + s->get_peers(n3, udp::v4(), false, false, peers); + TEST_CHECK(!peers.find_key("values")); } TORRENT_TEST(dual_stack)