mirror of
https://github.com/Retropex/bitcoin.git
synced 2025-05-29 21:42:32 +02:00
rpc: reduce LOCK(cs_main) scope in GetBlockChecked and getblock
This commit is contained in:
parent
7d253c943f
commit
f00808e932
@ -579,18 +579,20 @@ static RPCHelpMan getblockheader()
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
static CBlock GetBlockChecked(BlockManager& blockman, const CBlockIndex* pblockindex) EXCLUSIVE_LOCKS_REQUIRED(::cs_main)
|
static CBlock GetBlockChecked(BlockManager& blockman, const CBlockIndex* pblockindex)
|
||||||
{
|
{
|
||||||
AssertLockHeld(::cs_main);
|
|
||||||
CBlock block;
|
CBlock block;
|
||||||
if (blockman.IsBlockPruned(pblockindex)) {
|
{
|
||||||
throw JSONRPCError(RPC_MISC_ERROR, "Block not available (pruned data)");
|
LOCK(cs_main);
|
||||||
|
if (blockman.IsBlockPruned(pblockindex)) {
|
||||||
|
throw JSONRPCError(RPC_MISC_ERROR, "Block not available (pruned data)");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ReadBlockFromDisk(block, pblockindex, Params().GetConsensus())) {
|
if (!ReadBlockFromDisk(block, pblockindex, Params().GetConsensus())) {
|
||||||
// Block not found on disk. This could be because we have the block
|
// Block not found on disk. This could be because we have the block
|
||||||
// header in our index but not yet have the block or did not accept the
|
// header in our index but not yet have the block or did not accept the
|
||||||
// block.
|
// block. Or if the block was pruned right after we released the lock above.
|
||||||
throw JSONRPCError(RPC_MISC_ERROR, "Block not found on disk");
|
throw JSONRPCError(RPC_MISC_ERROR, "Block not found on disk");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -721,7 +723,6 @@ static RPCHelpMan getblock()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CBlock block;
|
|
||||||
const CBlockIndex* pblockindex;
|
const CBlockIndex* pblockindex;
|
||||||
const CBlockIndex* tip;
|
const CBlockIndex* tip;
|
||||||
ChainstateManager& chainman = EnsureAnyChainman(request.context);
|
ChainstateManager& chainman = EnsureAnyChainman(request.context);
|
||||||
@ -733,10 +734,10 @@ static RPCHelpMan getblock()
|
|||||||
if (!pblockindex) {
|
if (!pblockindex) {
|
||||||
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block not found");
|
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block not found");
|
||||||
}
|
}
|
||||||
|
|
||||||
block = GetBlockChecked(chainman.m_blockman, pblockindex);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const CBlock block{GetBlockChecked(chainman.m_blockman, pblockindex)};
|
||||||
|
|
||||||
if (verbosity <= 0)
|
if (verbosity <= 0)
|
||||||
{
|
{
|
||||||
CDataStream ssBlock(SER_NETWORK, PROTOCOL_VERSION | RPCSerializationFlags());
|
CDataStream ssBlock(SER_NETWORK, PROTOCOL_VERSION | RPCSerializationFlags());
|
||||||
|
Loading…
Reference in New Issue
Block a user