diff --git a/src/net_processing.cpp b/src/net_processing.cpp index 8676ad337116d..b6f75dfa00155 100644 --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -309,21 +309,23 @@ struct Peer { /** * (Bitcoin) Initializes a TxRelay struct for this peer. Can be called at most once for a peer. * (Dash) Enables the flag that allows GetTxRelay() to return m_tx_relay */ - TxRelay* SetTxRelay() + TxRelay* SetTxRelay() LOCKS_EXCLUDED(m_tx_relay_mutex) { + LOCK(m_tx_relay_mutex); Assume(!m_can_tx_relay); m_can_tx_relay = true; - return WITH_LOCK(m_tx_relay_mutex, return m_tx_relay.get()); + return m_tx_relay.get(); }; - TxRelay* GetInvRelay() + TxRelay* GetInvRelay() LOCKS_EXCLUDED(m_tx_relay_mutex) { return WITH_LOCK(m_tx_relay_mutex, return m_tx_relay.get()); } - TxRelay* GetTxRelay() + TxRelay* GetTxRelay() LOCKS_EXCLUDED(m_tx_relay_mutex) { - return m_can_tx_relay ? WITH_LOCK(m_tx_relay_mutex, return m_tx_relay.get()) : nullptr; + LOCK(m_tx_relay_mutex); + return m_can_tx_relay ? m_tx_relay.get() : nullptr; }; /** A vector of addresses to send to the peer, limited to MAX_ADDR_TO_SEND. */ @@ -353,8 +355,6 @@ struct Peer { * This field must correlate with whether m_addr_known has been * initialized.*/ std::atomic_bool m_addr_relay_enabled{false}; - /** Whether a peer can relay transactions */ - bool m_can_tx_relay{false}; /** Whether a getaddr request to this peer is outstanding. */ bool m_getaddr_sent GUARDED_BY(NetEventsInterface::g_msgproc_mutex){false}; /** Guards address sending timers. */ @@ -406,6 +406,8 @@ struct Peer { * (non-transaction relay should use GetInvRelay(), which will provide * unconditional access) */ std::unique_ptr m_tx_relay GUARDED_BY(m_tx_relay_mutex){std::make_unique()}; + /** Whether a peer can relay transactions */ + bool m_can_tx_relay GUARDED_BY(m_tx_relay_mutex) {false}; }; using PeerRef = std::shared_ptr; diff --git a/test/functional/feature_llmq_chainlocks.py b/test/functional/feature_llmq_chainlocks.py index 1714393939b00..599d350c7508b 100755 --- a/test/functional/feature_llmq_chainlocks.py +++ b/test/functional/feature_llmq_chainlocks.py @@ -56,11 +56,10 @@ def run_test(self): self.move_to_next_cycle() self.log.info("Cycle H+2C height:" + str(self.nodes[0].getblockcount())) self.mine_cycle_quorum(llmq_type_name="llmq_test_dip0024", llmq_type=103) - - - self.log.info("Mine single block, wait for chainlock") - self.generate(self.nodes[0], 1, sync_fun=self.no_op) self.wait_for_chainlocked_block_all_nodes(self.nodes[0].getbestblockhash()) + + self.log.info("Mine single block, ensure it includes latest chainlock") + self.generate(self.nodes[0], 1, sync_fun=self.sync_blocks) self.test_coinbase_best_cl(self.nodes[0]) # ChainLock locks all the blocks below it so nocl_block_hash should be locked too