forked from premiere/premiere-libtorrent
always drop the announcing peer when at capacity
This commit is contained in:
parent
6e24bbe77a
commit
e2fefb074a
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue