From f13be5085b28d6e5957971d853872eb2cf3f910c Mon Sep 17 00:00:00 2001 From: MarcoFalke Date: Mon, 19 Apr 2021 09:01:43 +0200 Subject: [PATCH] Merge #21713: Refactor ProcessNewBlock to reduce code duplication MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 9a0653553a0ec403b4e7c6713466e0c7fa10ec94 Refactor ProcessNewBlock to reduce code duplication (R E Broadley) Pull request description: There are probably a few issues with this code (maybe there's even a reason this code is duplicated as it currently is), so apologies in advance that I'm still a little (maybe very) bad with C++ ACKs for top commit: MarcoFalke: ACK 9a0653553a0ec403b4e7c6713466e0c7fa10ec94 💻 promag: Code review ACK 9a0653553a0ec403b4e7c6713466e0c7fa10ec94. theStack: Code-review ACK 9a0653553a0ec403b4e7c6713466e0c7fa10ec94 🌴 Tree-SHA512: f8634ffad4b2370204d1a0945db4e27248b9e579d9912784da432b8ee3303cae424fa9f7500000dcfb31e6d29d04a8f7d322d17a6fe3d4adaddd10c539458a8c --- src/net_processing.cpp | 41 +++++++++++++++++------------------------ 1 file changed, 17 insertions(+), 24 deletions(-) mode change 100644 => 100755 src/net_processing.cpp diff --git a/src/net_processing.cpp b/src/net_processing.cpp old mode 100644 new mode 100755 index a53d9ee917..2f6f48ed3f --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -473,6 +473,8 @@ private: void ProcessGetData(CNode& pfrom, Peer& peer, const std::atomic& interruptMsgProc) LOCKS_EXCLUDED(cs_main) EXCLUSIVE_LOCKS_REQUIRED(peer.m_getdata_requests_mutex); + void ProcessBlock(CNode& pfrom, const std::shared_ptr& pblock, bool fForceProcessing); + /** Relay map */ typedef std::map MapRelay; MapRelay mapRelay GUARDED_BY(cs_main); @@ -2783,6 +2785,18 @@ std::pair static ValidateDSTX(CTxMemPool& memp return {true, false}; } +void PeerManagerImpl::ProcessBlock(CNode& pfrom, const std::shared_ptr& pblock, bool fForceProcessing) +{ + bool fNewBlock = false; + m_chainman.ProcessNewBlock(m_chainparams, pblock, fForceProcessing, &fNewBlock); + if (fNewBlock) { + pfrom.nLastBlockTime = GetTime(); + } else { + LOCK(cs_main); + mapBlockSource.erase(pblock->GetHash()); + } +} + void PeerManagerImpl::ProcessMessage( CNode& pfrom, const std::string& msg_type, @@ -3850,7 +3864,6 @@ void PeerManagerImpl::ProcessMessage( LOCK(cs_main); mapBlockSource.emplace(pblock->GetHash(), std::make_pair(pfrom.GetId(), false)); } - bool fNewBlock = false; // Setting fForceProcessing to true means that we bypass some of // our anti-DoS protections in AcceptBlock, which filters // unrequested blocks that might be trying to waste our resources @@ -3860,13 +3873,7 @@ void PeerManagerImpl::ProcessMessage( // we have a chain with at least nMinimumChainWork), and we ignore // compact blocks with less work than our tip, it is safe to treat // reconstructed compact blocks as having been requested. - m_chainman.ProcessNewBlock(m_chainparams, pblock, /*fForceProcessing=*/true, &fNewBlock); - if (fNewBlock) { - pfrom.nLastBlockTime = GetTime(); - } else { - LOCK(cs_main); - mapBlockSource.erase(pblock->GetHash()); - } + ProcessBlock(pfrom, pblock, /*fForceProcessing=*/true); LOCK(cs_main); // hold cs_main for CBlockIndex::IsValid() if (pindex->IsValid(BLOCK_VALID_TRANSACTIONS)) { // Clear download state for this block, which is in @@ -3943,20 +3950,13 @@ void PeerManagerImpl::ProcessMessage( } } // Don't hold cs_main when we call into ProcessNewBlock if (fBlockRead) { - bool fNewBlock = false; // Since we requested this block (it was in mapBlocksInFlight), force it to be processed, // even if it would not be a candidate for new tip (missing previous block, chain not long enough, etc) // This bypasses some anti-DoS logic in AcceptBlock (eg to prevent // disk-space attacks), but this should be safe due to the // protections in the compact block handler -- see related comment // in compact block optimistic reconstruction handling. - m_chainman.ProcessNewBlock(m_chainparams, pblock, /*fForceProcessing=*/true, &fNewBlock); - if (fNewBlock) { - pfrom.nLastBlockTime = GetTime(); - } else { - LOCK(cs_main); - mapBlockSource.erase(pblock->GetHash()); - } + ProcessBlock(pfrom, pblock, /*fForceProcessing=*/true); } return; } @@ -4021,14 +4021,7 @@ void PeerManagerImpl::ProcessMessage( // cs_main in ProcessNewBlock is fine. mapBlockSource.emplace(hash, std::make_pair(pfrom.GetId(), true)); } - bool fNewBlock = false; - m_chainman.ProcessNewBlock(m_chainparams, pblock, forceProcessing, &fNewBlock); - if (fNewBlock) { - pfrom.nLastBlockTime = GetTime(); - } else { - LOCK(cs_main); - mapBlockSource.erase(pblock->GetHash()); - } + ProcessBlock(pfrom, pblock, forceProcessing); return; }