Use ping instead of get_peers if current bucket is full.

This commit is contained in:
Thomas Yuan 2015-09-11 16:43:21 -04:00
parent 50ccce6eed
commit f9fa8ffdec
3 changed files with 28 additions and 7 deletions

View File

@ -187,6 +187,8 @@ public:
void check_invariant() const;
#endif
bool is_full(int bucket) const;
private:
dht_logger* m_log;

View File

@ -564,14 +564,21 @@ void node::send_single_refresh(udp::endpoint const& ep, int bucket
e["y"] = "q";
entry& a = e["a"];
// use get_peers instead of find_node. We'll get nodes in the response
// either way.
e["q"] = "get_peers";
a["info_hash"] = target.to_string();
m_counters.inc_stats_counter(counters::dht_get_peers_out);
if (m_table.is_full(bucket))
{
// current bucket is full, just ping it.
e["q"] = "ping";
m_counters.inc_stats_counter(counters::dht_ping_out);
}
else
{
// use get_peers instead of find_node. We'll get nodes in the response
// either way.
e["q"] = "get_peers";
a["info_hash"] = target.to_string();
m_counters.inc_stats_counter(counters::dht_get_peers_out);
}
// e["q"] = "find_node";
// a["target"] = target.to_string();
m_rpc.invoke(e, ep, o);
}

View File

@ -1235,5 +1235,17 @@ void routing_table::check_invariant() const
}
#endif
bool routing_table::is_full(int bucket) const
{
int num_buckets = m_buckets.size();
if (num_buckets == 0) return false;
if (bucket >= num_buckets) return false;
table_t::const_iterator i = m_buckets.begin();
std::advance(i, bucket);
return (i->live_nodes.size() >= bucket_limit(bucket)
&& i->replacements.size() >= m_bucket_size);
}
} } // namespace libtorrent::dht