diff --git a/nano/node/distributed_work.cpp b/nano/node/distributed_work.cpp index 2e4ac6de1e..5496cb4d04 100644 --- a/nano/node/distributed_work.cpp +++ b/nano/node/distributed_work.cpp @@ -22,6 +22,7 @@ std::shared_ptr nano::distributed_work::peer_request::get_prepared nano::distributed_work::distributed_work (nano::node & node_a, nano::work_request const & request_a, std::chrono::seconds const & backoff_a) : node (node_a), +node_w (node_a.shared ()), request (request_a), backoff (backoff_a), strand (node_a.io_ctx.get_executor ()), @@ -35,23 +36,26 @@ elapsed (nano::timer_state::started, "distributed work generation timer") nano::distributed_work::~distributed_work () { assert (status != work_generation_status::ongoing); - if (!node.stopped && node.websocket_server && node.websocket_server->any_subscriber (nano::websocket::topic::work)) + if (auto node_l = node_w.lock ()) { - nano::websocket::message_builder builder; - if (status == work_generation_status::success) + if (!node_l->stopped && node_l->websocket_server && node_l->websocket_server->any_subscriber (nano::websocket::topic::work)) { - node.websocket_server->broadcast (builder.work_generation (request.root, work_result, request.difficulty, node.network_params.network.publish_threshold, elapsed.value (), winner, bad_peers)); - } - else if (status == work_generation_status::cancelled) - { - node.websocket_server->broadcast (builder.work_cancelled (request.root, request.difficulty, node.network_params.network.publish_threshold, elapsed.value (), bad_peers)); - } - else if (status == work_generation_status::failure_local || status == work_generation_status::failure_peers) - { - node.websocket_server->broadcast (builder.work_failed (request.root, request.difficulty, node.network_params.network.publish_threshold, elapsed.value (), bad_peers)); + nano::websocket::message_builder builder; + if (status == work_generation_status::success) + { + node_l->websocket_server->broadcast (builder.work_generation (request.root, work_result, request.difficulty, node_l->network_params.network.publish_threshold, elapsed.value (), winner, bad_peers)); + } + else if (status == work_generation_status::cancelled) + { + node_l->websocket_server->broadcast (builder.work_cancelled (request.root, request.difficulty, node_l->network_params.network.publish_threshold, elapsed.value (), bad_peers)); + } + else if (status == work_generation_status::failure_local || status == work_generation_status::failure_peers) + { + node_l->websocket_server->broadcast (builder.work_failed (request.root, request.difficulty, node_l->network_params.network.publish_threshold, elapsed.value (), bad_peers)); + } } + stop_once (true); } - stop_once (true); } void nano::distributed_work::start () diff --git a/nano/node/distributed_work.hpp b/nano/node/distributed_work.hpp index 8e3e5a2951..3ff00e71ac 100644 --- a/nano/node/distributed_work.hpp +++ b/nano/node/distributed_work.hpp @@ -86,6 +86,8 @@ class distributed_work final : public std::enable_shared_from_this node_w; nano::work_request request; std::chrono::seconds backoff; diff --git a/nano/rpc_test/rpc.cpp b/nano/rpc_test/rpc.cpp index b45e266876..75127b5906 100644 --- a/nano/rpc_test/rpc.cpp +++ b/nano/rpc_test/rpc.cpp @@ -3118,15 +3118,14 @@ TEST (rpc, work_peer_many) node1.config.work_peers.push_back (std::make_pair (node3.network.endpoint ().address ().to_string (), rpc3.config.port)); node1.config.work_peers.push_back (std::make_pair (node4.network.endpoint ().address ().to_string (), rpc4.config.port)); - for (auto i (0); i < 10; ++i) + std::array, 10> works; + for (auto i (0); i < works.size (); ++i) { nano::keypair key1; - std::atomic work (0); - node1.work_generate (key1.pub, [&work](boost::optional work_a) { - ASSERT_TRUE (work_a.is_initialized ()); + node1.work_generate (key1.pub, [& work = works[i]](boost::optional work_a) { work = *work_a; }); - while (nano::work_validate (key1.pub, work)) + while (nano::work_validate (key1.pub, works[i])) { system1.poll (); system2.poll ();