mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-11 20:32:35 -03:00
Merge bitcoin/bitcoin#23880: p2p: Serialize cmpctblock at most once in NewPoWValidBlock
fa61dd44f9
p2p: Serialize cmpctblock at most once in NewPoWValidBlock (MarcoFalke) Pull request description: Instead of serializing for each peer, serialize at most once and copy the raw data for each peer. ACKs for top commit: shaavan: reACKfa61dd44f9
theStack: Code-review ACKfa61dd44f9
Tree-SHA512: ed029aeaea67fdac8ddb865069f8166bc0dd8480418c405628e3e1a43b61161584a09a1814668bcd220602e8732e188be2bfed9242aa81bdbd92c64c702ed138
This commit is contained in:
commit
6c72f3192a
1 changed files with 7 additions and 3 deletions
|
@ -41,6 +41,7 @@
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
#include <future>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
#include <typeinfo>
|
#include <typeinfo>
|
||||||
|
@ -1596,6 +1597,8 @@ void PeerManagerImpl::NewPoWValidBlock(const CBlockIndex *pindex, const std::sha
|
||||||
|
|
||||||
bool fWitnessEnabled = DeploymentActiveAt(*pindex, m_chainparams.GetConsensus(), Consensus::DEPLOYMENT_SEGWIT);
|
bool fWitnessEnabled = DeploymentActiveAt(*pindex, m_chainparams.GetConsensus(), Consensus::DEPLOYMENT_SEGWIT);
|
||||||
uint256 hashBlock(pblock->GetHash());
|
uint256 hashBlock(pblock->GetHash());
|
||||||
|
const std::shared_future<CSerializedNetMsg> lazy_ser{
|
||||||
|
std::async(std::launch::deferred, [&] { return msgMaker.Make(NetMsgType::CMPCTBLOCK, *pcmpctblock); })};
|
||||||
|
|
||||||
{
|
{
|
||||||
LOCK(cs_most_recent_block);
|
LOCK(cs_most_recent_block);
|
||||||
|
@ -1605,10 +1608,9 @@ void PeerManagerImpl::NewPoWValidBlock(const CBlockIndex *pindex, const std::sha
|
||||||
fWitnessesPresentInMostRecentCompactBlock = fWitnessEnabled;
|
fWitnessesPresentInMostRecentCompactBlock = fWitnessEnabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_connman.ForEachNode([this, &pcmpctblock, pindex, &msgMaker, fWitnessEnabled, &hashBlock](CNode* pnode) EXCLUSIVE_LOCKS_REQUIRED(::cs_main) {
|
m_connman.ForEachNode([this, pindex, fWitnessEnabled, &lazy_ser, &hashBlock](CNode* pnode) EXCLUSIVE_LOCKS_REQUIRED(::cs_main) {
|
||||||
AssertLockHeld(::cs_main);
|
AssertLockHeld(::cs_main);
|
||||||
|
|
||||||
// TODO: Avoid the repeated-serialization here
|
|
||||||
if (pnode->GetCommonVersion() < INVALID_CB_NO_BAN_VERSION || pnode->fDisconnect)
|
if (pnode->GetCommonVersion() < INVALID_CB_NO_BAN_VERSION || pnode->fDisconnect)
|
||||||
return;
|
return;
|
||||||
ProcessBlockAvailability(pnode->GetId());
|
ProcessBlockAvailability(pnode->GetId());
|
||||||
|
@ -1620,7 +1622,9 @@ void PeerManagerImpl::NewPoWValidBlock(const CBlockIndex *pindex, const std::sha
|
||||||
|
|
||||||
LogPrint(BCLog::NET, "%s sending header-and-ids %s to peer=%d\n", "PeerManager::NewPoWValidBlock",
|
LogPrint(BCLog::NET, "%s sending header-and-ids %s to peer=%d\n", "PeerManager::NewPoWValidBlock",
|
||||||
hashBlock.ToString(), pnode->GetId());
|
hashBlock.ToString(), pnode->GetId());
|
||||||
m_connman.PushMessage(pnode, msgMaker.Make(NetMsgType::CMPCTBLOCK, *pcmpctblock));
|
|
||||||
|
const CSerializedNetMsg& ser_cmpctblock{lazy_ser.get()};
|
||||||
|
m_connman.PushMessage(pnode, CSerializedNetMsg{ser_cmpctblock.data, ser_cmpctblock.m_type});
|
||||||
state.pindexBestHeaderSent = pindex;
|
state.pindexBestHeaderSent = pindex;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in a new issue