From 645d3cdb3279fbf3ad61b3d8950cc9c83482f586 Mon Sep 17 00:00:00 2001 From: Arvid Norberg Date: Sat, 20 Sep 2014 19:27:29 +0000 Subject: [PATCH] merge fixes from RC_1_0 --- src/kademlia/routing_table.cpp | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/kademlia/routing_table.cpp b/src/kademlia/routing_table.cpp index ae971f543..1b9e9c3d3 100644 --- a/src/kademlia/routing_table.cpp +++ b/src/kademlia/routing_table.cpp @@ -64,6 +64,14 @@ namespace libtorrent { namespace dht TORRENT_DEFINE_LOG(table) #endif +template +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