Skip to content

Commit

Permalink
refactor: create helper function RelayRecoveredSig inside peerman
Browse files Browse the repository at this point in the history
this commit should have a few benefits:
1. previous logic using ForEachNode results in locking m_nodes_mutex, a highly contended RecursiveMutex, AND m_peer_mutex(in GetPeerRef)
2. prior also resulted in calling .find over the m_peer_map for each node. Basically old logic was (probably) O(n(nlogn) the new logic results in acquiring m_peer_mutex once and looping over the list of peers, (probably) O(n)
3. Moves networking logic out of llmq/ and into actual net_processing.cpp

refactor: create helper function RelayRecoveredSig inside peerman

this commit should have a few benefits:
1. previous logic using ForEachNode results in locking m_nodes_mutex, a highly contended RecursiveMutex, AND m_peer_mutex(in GetPeerRef)
2. prior also resulted in calling .find over the m_peer_map for each node. Basically old logic was (probably) O(n(nlogn) the new logic results in acquiring m_peer_mutex once and looping over the list of peers, (probably) O(n)
3. Moves networking logic out of llmq/ and into actual net_processing.cpp
  • Loading branch information
PastaPastaPasta committed Nov 21, 2024
1 parent 0f39da9 commit 9ef40dc
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 9 deletions.
7 changes: 1 addition & 6 deletions src/llmq/signing.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -633,12 +633,7 @@ void CSigningManager::ProcessRecoveredSig(const std::shared_ptr<const CRecovered
WITH_LOCK(cs_pending, pendingReconstructedRecoveredSigs.erase(recoveredSig->GetHash()));

if (m_mn_activeman != nullptr) {
CInv inv(MSG_QUORUM_RECOVERED_SIG, recoveredSig->GetHash());
connman.ForEachNode([&](const CNode* pnode) {
if (pnode->fSendRecSigs) {
Assert(m_peerman)->PushInventory(pnode->GetId(), inv);
}
});
Assert(m_peerman)->RelayRecoveredSig(recoveredSig->GetHash());
}

auto listeners = WITH_LOCK(cs_listeners, return recoveredSigsListeners);
Expand Down
2 changes: 0 additions & 2 deletions src/net.h
Original file line number Diff line number Diff line change
Expand Up @@ -976,8 +976,6 @@ class CNode
// If true, we will send him CoinJoin queue messages
std::atomic<bool> fSendDSQueue{false};

// If true, we will announce/send him plain recovered sigs (usually true for full nodes)
std::atomic<bool> fSendRecSigs{false};
// If true, we will send him all quorum related messages, even if he is not a member of our quorums
std::atomic<bool> qwatch{false};

Expand Down
17 changes: 16 additions & 1 deletion src/net_processing.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,8 @@ struct Peer {
std::atomic<std::chrono::microseconds> m_ping_start{0us};
/** Whether a ping has been requested by the user */
std::atomic<bool> m_ping_queued{false};
/** Whether the peer has requested to receive llmq recovered signatures */
std::atomic<bool> m_wants_recsigs{false};

struct TxRelay {
mutable RecursiveMutex m_bloom_filter_mutex;
Expand Down Expand Up @@ -607,6 +609,7 @@ class PeerManagerImpl final : public PeerManager
void RelayInvFiltered(CInv &inv, const CTransaction &relatedTx, const int minProtoVersion) override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
void RelayInvFiltered(CInv &inv, const uint256 &relatedTxHash, const int minProtoVersion) override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
void RelayTransaction(const uint256& txid) override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
void RelayRecoveredSig(const uint256& sigHash) override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
void SetBestHeight(int height) override { m_best_height = height; };
void Misbehaving(const NodeId pnode, const int howmuch, const std::string& message = "") override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
void ProcessMessage(CNode& pfrom, const std::string& msg_type, CDataStream& vRecv,
Expand Down Expand Up @@ -2339,6 +2342,18 @@ void PeerManagerImpl::RelayTransaction(const uint256& txid)
};
}

void PeerManagerImpl::RelayRecoveredSig(const uint256& sigHash)
{
LOCK(m_peer_mutex);
const CInv inv{MSG_QUORUM_RECOVERED_SIG, sigHash};
for(auto& it : m_peer_map) {
Peer& peer = *it.second;
if (!peer.m_wants_recsigs) continue;

PushInv(peer, inv);
};
}

void PeerManagerImpl::RelayAddress(NodeId originator,
const CAddress& addr,
bool fReachable)
Expand Down Expand Up @@ -3948,7 +3963,7 @@ void PeerManagerImpl::ProcessMessage(
if (msg_type == NetMsgType::QSENDRECSIGS) {
bool b;
vRecv >> b;
pfrom.fSendRecSigs = b;
peer->m_wants_recsigs = b;
return;
}

Expand Down
3 changes: 3 additions & 0 deletions src/net_processing.h
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,9 @@ class PeerManager : public CValidationInterface, public NetEventsInterface
virtual void RelayTransaction(const uint256& txid)
EXCLUSIVE_LOCKS_REQUIRED(cs_main) = 0;

/** Relay recovered sigs to all interested peers */
virtual void RelayRecoveredSig(const uint256& sigHash) = 0;

/** Set the best height */
virtual void SetBestHeight(int height) = 0;

Expand Down

0 comments on commit 9ef40dc

Please sign in to comment.