From 8382d4ad03368d13a6b6048c068b2bf1f1988a6c Mon Sep 17 00:00:00 2001 From: Sergey Kroshnin Date: Tue, 24 Mar 2020 13:58:00 +0300 Subject: [PATCH] Modify inactive cache conditions to prevent multiple insertions for confirmed entries (#2674) --- nano/node/active_transactions.cpp | 51 ++++++++++++++++--------------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/nano/node/active_transactions.cpp b/nano/node/active_transactions.cpp index ffc0ccc7..ebebcadd 100644 --- a/nano/node/active_transactions.cpp +++ b/nano/node/active_transactions.cpp @@ -939,33 +939,36 @@ void nano::active_transactions::add_inactive_votes_cache (nano::block_hash const { auto & inactive_by_hash (inactive_votes_cache.get ()); 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); - 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 (!existing->confirmed || !existing->bootstrap_started) + { + auto is_new (false); + 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) { - info.arrival = std::chrono::steady_clock::now (); - info.voters.push_back (representative_a); - } - }); - - if (is_new) - { - bool confirmed (false); - 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 (confirmed && !existing->confirmed) - { - inactive_by_hash.modify (existing, [](nano::inactive_cache_information & info) { - info.confirmed = true; - }); + bool confirmed (false); + 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 (confirmed && !existing->confirmed) + { + inactive_by_hash.modify (existing, [](nano::inactive_cache_information & info) { + info.confirmed = true; + }); + } } } }