merge fixes from RC_1_0

This commit is contained in:
Arvid Norberg 2014-09-20 19:27:29 +00:00
parent c471bcb49f
commit 645d3cdb32
1 changed files with 21 additions and 9 deletions

View File

@ -64,6 +64,14 @@ namespace libtorrent { namespace dht
TORRENT_DEFINE_LOG(table)
#endif
template <typename T, typename K>
void erase_one(T& container, K const& key)
{
typename T::iterator i = container.find(key);
TORRENT_ASSERT(i != container.end());
container.erase(i);
}
routing_table::routing_table(node_id const& id, int bucket_size
, dht_settings const& settings)
: m_settings(settings)
@ -433,13 +441,15 @@ node_entry* routing_table::find_node(udp::endpoint const& ep
void routing_table::remove_node(node_entry* n
, routing_table::table_t::iterator bucket)
{
INVARIANT_CHECK;
if (!bucket->replacements.empty()
&& n >= &bucket->replacements[0]
&& n < &bucket->replacements[0] + bucket->replacements.size())
{
int idx = n - &bucket->replacements[0];
TORRENT_ASSERT(m_ips.count(n->endpoint.address().to_v4().to_bytes()) > 0);
m_ips.erase(n->endpoint.address().to_v4().to_bytes());
erase_one(m_ips, n->endpoint.address().to_v4().to_bytes());
bucket->replacements.erase(bucket->replacements.begin() + idx);
}
@ -449,7 +459,7 @@ void routing_table::remove_node(node_entry* n
{
int idx = n - &bucket->live_nodes[0];
TORRENT_ASSERT(m_ips.count(n->endpoint.address().to_v4().to_bytes()) > 0);
m_ips.erase(n->endpoint.address().to_v4().to_bytes());
erase_one(m_ips, n->endpoint.address().to_v4().to_bytes());
bucket->live_nodes.erase(bucket->live_nodes.begin() + idx);
}
}
@ -551,7 +561,7 @@ bool routing_table::add_node(node_entry e)
j->timeout_count = 0;
j->update_rtt(e.rtt);
e = *j;
m_ips.erase(j->addr().to_v4().to_bytes());
erase_one(m_ips, j->addr().to_v4().to_bytes());
rb.erase(j);
}
@ -624,7 +634,7 @@ bool routing_table::add_node(node_entry e)
{
// j points to a node that has not been pinged.
// Replace it with this new one
m_ips.erase(j->addr().to_v4().to_bytes());
erase_one(m_ips, j->addr().to_v4().to_bytes());
*j = e;
m_ips.insert(e.addr().to_v4().to_bytes());
// TORRENT_LOG(table) << "replacing unpinged node: " << e.id << " " << e.addr();
@ -646,7 +656,7 @@ bool routing_table::add_node(node_entry e)
{
// i points to a node that has been marked
// as stale. Replace it with this new one
m_ips.erase(j->addr().to_v4().to_bytes());
erase_one(m_ips, j->addr().to_v4().to_bytes());
*j = e;
m_ips.insert(e.addr().to_v4().to_bytes());
// TORRENT_LOG(table) << "replacing stale node: " << e.id << " " << e.addr();
@ -749,7 +759,7 @@ bool routing_table::add_node(node_entry e)
if (j != b.end() && (force_replace || j->rtt > e.rtt))
{
m_ips.erase(j->addr().to_v4().to_bytes());
erase_one(m_ips, j->addr().to_v4().to_bytes());
*j = e;
m_ips.insert(e.addr().to_v4().to_bytes());
#ifdef TORRENT_DHT_VERBOSE_LOGGING
@ -790,7 +800,7 @@ bool routing_table::add_node(node_entry e)
// less reliable than this one, that has been pinged
j = std::find_if(rb.begin(), rb.end(), boost::bind(&node_entry::pinged, _1) == false);
if (j == rb.end()) j = rb.begin();
m_ips.erase(j->addr().to_v4().to_bytes());
erase_one(m_ips, j->addr().to_v4().to_bytes());
rb.erase(j);
}
@ -877,6 +887,8 @@ void routing_table::split_bucket()
new_bucket.push_back(*j);
else if (int(new_replacement_bucket.size()) < m_bucket_size)
new_replacement_bucket.push_back(*j);
else
erase_one(m_ips, j->addr().to_v4().to_bytes());
}
j = rb.erase(j);
}
@ -943,13 +955,13 @@ void routing_table::node_failed(node_id const& id, udp::endpoint const& ep)
// has never responded at all, remove it
if (j->fail_count() >= m_settings.max_fail_count || !j->pinged())
{
m_ips.erase(j->addr().to_v4().to_bytes());
erase_one(m_ips, j->addr().to_v4().to_bytes());
b.erase(j);
}
return;
}
m_ips.erase(j->addr().to_v4().to_bytes());
erase_one(m_ips, j->addr().to_v4().to_bytes());
b.erase(j);
// sort by RTT first, to find the node with the lowest