Modify inactive cache conditions to prevent multiple insertions for confirmed entries (#2674)

This commit is contained in:
Sergey Kroshnin 2020-03-24 13:58:00 +03:00 committed by GitHub
commit 8382d4ad03
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -939,33 +939,36 @@ void nano::active_transactions::add_inactive_votes_cache (nano::block_hash const
{ {
auto & inactive_by_hash (inactive_votes_cache.get<tag_hash> ()); auto & inactive_by_hash (inactive_votes_cache.get<tag_hash> ());
auto existing (inactive_by_hash.find (hash_a)); auto existing (inactive_by_hash.find (hash_a));
if (existing != inactive_by_hash.end () && (!existing->confirmed || !existing->bootstrap_started)) if (existing != inactive_by_hash.end ())
{ {
auto is_new (false); if (!existing->confirmed || !existing->bootstrap_started)
inactive_by_hash.modify (existing, [representative_a, &is_new](nano::inactive_cache_information & info) { {
auto it = std::find (info.voters.begin (), info.voters.end (), representative_a); auto is_new (false);
is_new = (it == info.voters.end ()); inactive_by_hash.modify (existing, [representative_a, &is_new](nano::inactive_cache_information & info) {
auto it = std::find (info.voters.begin (), info.voters.end (), representative_a);
is_new = (it == info.voters.end ());
if (is_new)
{
info.arrival = std::chrono::steady_clock::now ();
info.voters.push_back (representative_a);
}
});
if (is_new) if (is_new)
{ {
info.arrival = std::chrono::steady_clock::now (); bool confirmed (false);
info.voters.push_back (representative_a); if (inactive_votes_bootstrap_check (existing->voters, hash_a, confirmed) && !existing->bootstrap_started)
} {
}); inactive_by_hash.modify (existing, [](nano::inactive_cache_information & info) {
info.bootstrap_started = true;
if (is_new) });
{ }
bool confirmed (false); if (confirmed && !existing->confirmed)
if (inactive_votes_bootstrap_check (existing->voters, hash_a, confirmed) && !existing->bootstrap_started) {
{ inactive_by_hash.modify (existing, [](nano::inactive_cache_information & info) {
inactive_by_hash.modify (existing, [](nano::inactive_cache_information & info) { info.confirmed = true;
info.bootstrap_started = true; });
}); }
}
if (confirmed && !existing->confirmed)
{
inactive_by_hash.modify (existing, [](nano::inactive_cache_information & info) {
info.confirmed = true;
});
} }
} }
} }