Merge pull request #4547 from clemahieu/tsan_fix

Fixes TSAN issues.
This commit is contained in:
clemahieu 2024-04-10 00:57:27 +01:00 committed by GitHub
commit c8fb3a5c4a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 38 additions and 7 deletions

View file

@ -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);

View file

@ -68,10 +68,13 @@ TEST (peer_container, tcp_channel_cleanup_works)
// Disable the confirm_req messages avoiding them to affect the last_packet_set time
node_flags.disable_rep_crawler = true;
auto & node1 = *system.add_node (node_config, node_flags);
auto outer_node1 = nano::test::add_outer_node (system, node_flags);
outer_node1->config.network_params.network.keepalive_period = std::chrono::minutes (10);
auto outer_node2 = nano::test::add_outer_node (system, node_flags);
outer_node2->config.network_params.network.keepalive_period = std::chrono::minutes (10);
auto config1 = node_config;
config1.network_params.network.keepalive_period = std::chrono::minutes (10);
auto outer_node1 = nano::test::add_outer_node (system, config1, node_flags);
auto config2 = config1;
config2.network_params.network.keepalive_period = std::chrono::minutes (10);
auto outer_node2 = nano::test::add_outer_node (system, config2, node_flags);
auto now = std::chrono::steady_clock::now ();
auto channel1 = nano::test::establish_tcp (system, node1, outer_node1->network.endpoint ());
ASSERT_NE (nullptr, channel1);

View file

@ -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 ();

View file

@ -199,6 +199,8 @@ class send_block_builder : public abstract_builder<nano::send_block, send_block_
public:
/** Creates a send block builder by calling make_block() */
send_block_builder ();
/** Initialize from an existing block */
send_block_builder & from (nano::send_block const & block);
/** Creates a new block with fields, signature and work set to sentinel values. All fields must be set or zeroed for build() to succeed. */
send_block_builder & make_block ();
/** Sets all hashables, signature and work to zero. */

View file

@ -24,6 +24,14 @@ std::shared_ptr<nano::transport::channel_tcp> nano::test::establish_tcp (nano::t
return result;
}
std::shared_ptr<nano::node> nano::test::add_outer_node (nano::test::system & system_a, nano::node_config const & config_a, nano::node_flags flags_a)
{
auto outer_node = std::make_shared<nano::node> (system_a.io_ctx, nano::unique_path (), config_a, system_a.work, flags_a);
outer_node->start ();
system_a.nodes.push_back (outer_node);
return outer_node;
}
std::shared_ptr<nano::node> nano::test::add_outer_node (nano::test::system & system_a, nano::node_flags flags_a)
{
auto outer_node = std::make_shared<nano::node> (system_a.io_ctx, system_a.get_available_port (), nano::unique_path (), system_a.work, flags_a);
@ -55,4 +63,4 @@ uint16_t nano::test::speculatively_choose_a_free_tcp_bind_port ()
acceptor.close ();
return port;
}
}

View file

@ -19,6 +19,9 @@ namespace test
/** Waits until a TCP connection is established and returns the TCP channel on success*/
std::shared_ptr<nano::transport::channel_tcp> establish_tcp (nano::test::system &, nano::node &, nano::endpoint const &);
/** Adds a node to the system without establishing connections */
std::shared_ptr<nano::node> add_outer_node (nano::test::system & system, nano::node_config const & config_a, nano::node_flags = nano::node_flags ());
/** Adds a node to the system without establishing connections */
std::shared_ptr<nano::node> add_outer_node (nano::test::system & system, nano::node_flags = nano::node_flags ());