From cb1893a424d407f18a009e682e902d8ea525ea59 Mon Sep 17 00:00:00 2001 From: Colin LeMahieu Date: Tue, 9 Apr 2024 15:51:12 +0100 Subject: [PATCH] Fix race condition from TSAN where block_sideband is updated by different nodes. --- nano/core_test/node.cpp | 4 ++-- nano/lib/blockbuilders.cpp | 15 +++++++++++++++ nano/lib/blockbuilders.hpp | 2 ++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/nano/core_test/node.cpp b/nano/core_test/node.cpp index 0b7e049b..15b07885 100644 --- a/nano/core_test/node.cpp +++ b/nano/core_test/node.cpp @@ -647,14 +647,14 @@ TEST (node, fork_keep) .work (*system.work.generate (nano::dev::genesis->hash ())) .build (); node1.process_active (send1); - node2.process_active (send1); + node2.process_active (builder.make_block ().from (*send1).build ()); ASSERT_TIMELY_EQ (5s, 1, node1.active.size ()); ASSERT_TIMELY_EQ (5s, 1, node2.active.size ()); system.wallet (0)->insert_adhoc (nano::dev::genesis_key.prv); // Fill node with forked blocks node1.process_active (send2); ASSERT_TIMELY (5s, node1.active.active (*send2)); - node2.process_active (send2); + node2.process_active (builder.make_block ().from (*send2).build ()); ASSERT_TIMELY (5s, node2.active.active (*send2)); auto election1 (node2.active.election (nano::qualified_root (nano::dev::genesis->hash (), nano::dev::genesis->hash ()))); ASSERT_NE (nullptr, election1); diff --git a/nano/lib/blockbuilders.cpp b/nano/lib/blockbuilders.cpp index d8fa600f..034abbe3 100644 --- a/nano/lib/blockbuilders.cpp +++ b/nano/lib/blockbuilders.cpp @@ -516,6 +516,21 @@ nano::send_block_builder::send_block_builder () make_block (); } +nano::send_block_builder & nano::send_block_builder::from (nano::send_block const & other_block) +{ + block->work = other_block.work; + build_state |= build_flags::work_present; + block->signature = other_block.signature; + build_state |= build_flags::signature_present; + block->hashables.balance = other_block.hashables.balance; + build_state |= build_flags::balance_present; + block->hashables.destination = other_block.hashables.destination; + build_state |= build_flags::link_present; + block->hashables.previous = other_block.hashables.previous; + build_state |= build_flags::previous_present; + return *this; +} + nano::send_block_builder & nano::send_block_builder::make_block () { construct_block (); diff --git a/nano/lib/blockbuilders.hpp b/nano/lib/blockbuilders.hpp index 1471c9bb..6f625c33 100644 --- a/nano/lib/blockbuilders.hpp +++ b/nano/lib/blockbuilders.hpp @@ -199,6 +199,8 @@ class send_block_builder : public abstract_builder