merge fixes from RC_1_0
This commit is contained in:
parent
c471bcb49f
commit
645d3cdb32
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue