Periodic rep crawler weights update (#2319)
* Periodic rep crawler weights update Also update probable rep with response only if channel was changed * Fix MSVC build
This commit is contained in:
parent
e68ae64e4c
commit
f93fb30233
2 changed files with 38 additions and 15 deletions
|
|
@ -37,6 +37,7 @@ void nano::rep_crawler::ongoing_crawl ()
|
||||||
auto now (std::chrono::steady_clock::now ());
|
auto now (std::chrono::steady_clock::now ());
|
||||||
auto total_weight_l (total_weight ());
|
auto total_weight_l (total_weight ());
|
||||||
cleanup_reps ();
|
cleanup_reps ();
|
||||||
|
update_weights ();
|
||||||
query (get_crawl_targets (total_weight_l));
|
query (get_crawl_targets (total_weight_l));
|
||||||
auto sufficient_weight (total_weight_l > node.config.online_weight_minimum.number ());
|
auto sufficient_weight (total_weight_l > node.config.online_weight_minimum.number ());
|
||||||
// If online weight drops below minimum, reach out to preconfigured peers
|
// If online weight drops below minimum, reach out to preconfigured peers
|
||||||
|
|
@ -117,28 +118,30 @@ void nano::rep_crawler::query (std::shared_ptr<nano::transport::channel> channel
|
||||||
|
|
||||||
bool nano::rep_crawler::response (std::shared_ptr<nano::transport::channel> channel_a, nano::account const & rep_account_a, nano::amount const & weight_a)
|
bool nano::rep_crawler::response (std::shared_ptr<nano::transport::channel> channel_a, nano::account const & rep_account_a, nano::amount const & weight_a)
|
||||||
{
|
{
|
||||||
auto updated (false);
|
auto updated_or_inserted (false);
|
||||||
nano::lock_guard<std::mutex> lock (probable_reps_mutex);
|
nano::lock_guard<std::mutex> lock (probable_reps_mutex);
|
||||||
auto existing (probable_reps.find (rep_account_a));
|
auto existing (probable_reps.find (rep_account_a));
|
||||||
if (existing != probable_reps.end ())
|
if (existing != probable_reps.end ())
|
||||||
{
|
{
|
||||||
probable_reps.modify (existing, [weight_a, &updated, rep_account_a, channel_a](nano::representative & info) {
|
probable_reps.modify (existing, [weight_a, &updated_or_inserted, rep_account_a, channel_a](nano::representative & info) {
|
||||||
info.last_response = std::chrono::steady_clock::now ();
|
info.last_response = std::chrono::steady_clock::now ();
|
||||||
|
|
||||||
if (info.weight < weight_a)
|
// Update if representative channel was changed
|
||||||
|
if (info.channel->get_endpoint () != channel_a->get_endpoint ())
|
||||||
{
|
{
|
||||||
updated = true;
|
assert (info.account == rep_account_a);
|
||||||
|
updated_or_inserted = true;
|
||||||
info.weight = weight_a;
|
info.weight = weight_a;
|
||||||
info.channel = channel_a;
|
info.channel = channel_a;
|
||||||
info.account = rep_account_a;
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
probable_reps.insert (nano::representative (rep_account_a, weight_a, channel_a));
|
probable_reps.insert (nano::representative (rep_account_a, weight_a, channel_a));
|
||||||
|
updated_or_inserted = true;
|
||||||
}
|
}
|
||||||
return updated;
|
return updated_or_inserted;
|
||||||
}
|
}
|
||||||
|
|
||||||
nano::uint128_t nano::rep_crawler::total_weight () const
|
nano::uint128_t nano::rep_crawler::total_weight () const
|
||||||
|
|
@ -166,15 +169,8 @@ std::vector<nano::representative> nano::rep_crawler::representatives_by_weight (
|
||||||
nano::lock_guard<std::mutex> lock (probable_reps_mutex);
|
nano::lock_guard<std::mutex> lock (probable_reps_mutex);
|
||||||
for (auto i (probable_reps.get<tag_weight> ().begin ()), n (probable_reps.get<tag_weight> ().end ()); i != n; ++i)
|
for (auto i (probable_reps.get<tag_weight> ().begin ()), n (probable_reps.get<tag_weight> ().end ()); i != n; ++i)
|
||||||
{
|
{
|
||||||
auto weight (i->weight.number ());
|
assert (i->weight.number () > 0);
|
||||||
if (weight > 0)
|
result.push_back (*i);
|
||||||
{
|
|
||||||
result.push_back (*i);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
@ -234,6 +230,30 @@ void nano::rep_crawler::cleanup_reps ()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void nano::rep_crawler::update_weights ()
|
||||||
|
{
|
||||||
|
nano::lock_guard<std::mutex> lock (probable_reps_mutex);
|
||||||
|
for (auto i (probable_reps.get<tag_last_request> ().begin ()), n (probable_reps.get<tag_last_request> ().end ()); i != n;)
|
||||||
|
{
|
||||||
|
auto weight (node.ledger.weight (i->account));
|
||||||
|
if (weight > 0)
|
||||||
|
{
|
||||||
|
if (i->weight.number () != weight)
|
||||||
|
{
|
||||||
|
probable_reps.get<tag_last_request> ().modify (i, [weight](nano::representative & info) {
|
||||||
|
info.weight = weight;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Erase non representatives
|
||||||
|
i = probable_reps.get<tag_last_request> ().erase (i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<nano::representative> nano::rep_crawler::representatives (size_t count_a)
|
std::vector<nano::representative> nano::rep_crawler::representatives (size_t count_a)
|
||||||
{
|
{
|
||||||
std::vector<representative> result;
|
std::vector<representative> result;
|
||||||
|
|
|
||||||
|
|
@ -133,6 +133,9 @@ private:
|
||||||
/** Clean representatives with inactive channels */
|
/** Clean representatives with inactive channels */
|
||||||
void cleanup_reps ();
|
void cleanup_reps ();
|
||||||
|
|
||||||
|
/** Update representatives weights from ledger */
|
||||||
|
void update_weights ();
|
||||||
|
|
||||||
/** Protects the probable_reps container */
|
/** Protects the probable_reps container */
|
||||||
mutable std::mutex probable_reps_mutex;
|
mutable std::mutex probable_reps_mutex;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue