That's unfortunate that we call a logging function while holding a lock. Maybe
--- a/src/net_processing.cpp
+++ b/src/net_processing.cpp
@@ -2697,10 +2696,15 @@ void PeerManagerImpl::HeadersDirectFetchBlocks(CNode& pfrom, const Peer& peer, c
void PeerManagerImpl::UpdatePeerStateForReceivedHeaders(CNode& pfrom, Peer& peer,
const CBlockIndex& last_header, bool received_new_header, bool may_have_more_headers)
{
- if (peer.nUnconnectingHeaders > 0) {
- LogPrint(BCLog::NET, "peer=%d: resetting nUnconnectingHeaders (%d -> 0)\n", pfrom.GetId(), peer.nUnconnectingHeaders);
+ int num_unconnecting_headers_msgs;
+ {
+ LOCK(NetEventsInterface::g_msgproc_mutex);
+ num_unconnecting_headers_msgs = peer.nUnconnectingHeaders;
+ peer.nUnconnectingHeaders = 0;
+ }
+ if (num_unconnecting_headers_msgs > 0) {
+ LogPrint(BCLog::NET, "peer=%d: resetting nUnconnectingHeaders (%d -> 0)\n", pfrom.GetId(), num_unconnecting_headers_msgs);
}
- peer.nUnconnectingHeaders = 0;
LOCK(cs_main);
CNodeState *nodestate = State(pfrom.GetId());
and drop EXCLUSIVE_LOCKS_REQUIRED(g_msgproc_mutex) annotation?