mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-03-06 14:19:59 -05:00
Guard CBlockIndex::nStatus/nFile/nDataPos/nUndoPos by cs_main
Co-authored-by: Vasil Dimov <vd@FreeBSD.org>
This commit is contained in:
parent
5d59ae0ba8
commit
6ea5682784
5 changed files with 19 additions and 11 deletions
|
@ -164,13 +164,13 @@ public:
|
||||||
int nHeight{0};
|
int nHeight{0};
|
||||||
|
|
||||||
//! Which # file this block is stored in (blk?????.dat)
|
//! Which # file this block is stored in (blk?????.dat)
|
||||||
int nFile{0};
|
int nFile GUARDED_BY(::cs_main){0};
|
||||||
|
|
||||||
//! Byte offset within blk?????.dat where this block's data is stored
|
//! Byte offset within blk?????.dat where this block's data is stored
|
||||||
unsigned int nDataPos{0};
|
unsigned int nDataPos GUARDED_BY(::cs_main){0};
|
||||||
|
|
||||||
//! Byte offset within rev?????.dat where this block's undo data is stored
|
//! Byte offset within rev?????.dat where this block's undo data is stored
|
||||||
unsigned int nUndoPos{0};
|
unsigned int nUndoPos GUARDED_BY(::cs_main){0};
|
||||||
|
|
||||||
//! (memory only) Total amount of work (expected number of hashes) in the chain up to and including this block
|
//! (memory only) Total amount of work (expected number of hashes) in the chain up to and including this block
|
||||||
arith_uint256 nChainWork{};
|
arith_uint256 nChainWork{};
|
||||||
|
@ -198,7 +198,7 @@ public:
|
||||||
//! load to avoid the block index being spuriously rewound.
|
//! load to avoid the block index being spuriously rewound.
|
||||||
//! @sa NeedsRedownload
|
//! @sa NeedsRedownload
|
||||||
//! @sa ActivateSnapshot
|
//! @sa ActivateSnapshot
|
||||||
uint32_t nStatus{0};
|
uint32_t nStatus GUARDED_BY(::cs_main){0};
|
||||||
|
|
||||||
//! block header
|
//! block header
|
||||||
int32_t nVersion{0};
|
int32_t nVersion{0};
|
||||||
|
@ -382,6 +382,7 @@ public:
|
||||||
|
|
||||||
SERIALIZE_METHODS(CDiskBlockIndex, obj)
|
SERIALIZE_METHODS(CDiskBlockIndex, obj)
|
||||||
{
|
{
|
||||||
|
LOCK(::cs_main);
|
||||||
int _nVersion = s.GetVersion();
|
int _nVersion = s.GetVersion();
|
||||||
if (!(s.GetType() & SER_GETHASH)) READWRITE(VARINT_MODE(_nVersion, VarIntMode::NONNEGATIVE_SIGNED));
|
if (!(s.GetType() & SER_GETHASH)) READWRITE(VARINT_MODE(_nVersion, VarIntMode::NONNEGATIVE_SIGNED));
|
||||||
|
|
||||||
|
|
|
@ -818,7 +818,8 @@ static RPCHelpMan getblockfrompeer()
|
||||||
throw JSONRPCError(RPC_MISC_ERROR, "Block header missing");
|
throw JSONRPCError(RPC_MISC_ERROR, "Block header missing");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (index->nStatus & BLOCK_HAVE_DATA) {
|
const bool block_has_data = WITH_LOCK(::cs_main, return index->nStatus & BLOCK_HAVE_DATA);
|
||||||
|
if (block_has_data) {
|
||||||
throw JSONRPCError(RPC_MISC_ERROR, "Block already downloaded");
|
throw JSONRPCError(RPC_MISC_ERROR, "Block already downloaded");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -240,7 +240,8 @@ static RPCHelpMan getrawtransaction()
|
||||||
if (!tx) {
|
if (!tx) {
|
||||||
std::string errmsg;
|
std::string errmsg;
|
||||||
if (blockindex) {
|
if (blockindex) {
|
||||||
if (!(blockindex->nStatus & BLOCK_HAVE_DATA)) {
|
const bool block_has_data = WITH_LOCK(::cs_main, return blockindex->nStatus & BLOCK_HAVE_DATA);
|
||||||
|
if (!block_has_data) {
|
||||||
throw JSONRPCError(RPC_MISC_ERROR, "Block not available");
|
throw JSONRPCError(RPC_MISC_ERROR, "Block not available");
|
||||||
}
|
}
|
||||||
errmsg = "No such transaction found in the provided block";
|
errmsg = "No such transaction found in the provided block";
|
||||||
|
|
|
@ -123,6 +123,7 @@ BOOST_AUTO_TEST_CASE(findCommonAncestor)
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(hasBlocks)
|
BOOST_AUTO_TEST_CASE(hasBlocks)
|
||||||
{
|
{
|
||||||
|
LOCK(::cs_main);
|
||||||
auto& chain = m_node.chain;
|
auto& chain = m_node.chain;
|
||||||
const CChain& active = Assert(m_node.chainman)->ActiveChain();
|
const CChain& active = Assert(m_node.chainman)->ActiveChain();
|
||||||
|
|
||||||
|
|
14
src/txdb.cpp
14
src/txdb.cpp
|
@ -311,19 +311,23 @@ bool CBlockTreeDB::LoadBlockIndexGuts(const Consensus::Params& consensusParams,
|
||||||
CBlockIndex* pindexNew = insertBlockIndex(diskindex.GetBlockHash());
|
CBlockIndex* pindexNew = insertBlockIndex(diskindex.GetBlockHash());
|
||||||
pindexNew->pprev = insertBlockIndex(diskindex.hashPrev);
|
pindexNew->pprev = insertBlockIndex(diskindex.hashPrev);
|
||||||
pindexNew->nHeight = diskindex.nHeight;
|
pindexNew->nHeight = diskindex.nHeight;
|
||||||
pindexNew->nFile = diskindex.nFile;
|
|
||||||
pindexNew->nDataPos = diskindex.nDataPos;
|
|
||||||
pindexNew->nUndoPos = diskindex.nUndoPos;
|
|
||||||
pindexNew->nVersion = diskindex.nVersion;
|
pindexNew->nVersion = diskindex.nVersion;
|
||||||
pindexNew->hashMerkleRoot = diskindex.hashMerkleRoot;
|
pindexNew->hashMerkleRoot = diskindex.hashMerkleRoot;
|
||||||
pindexNew->nTime = diskindex.nTime;
|
pindexNew->nTime = diskindex.nTime;
|
||||||
pindexNew->nBits = diskindex.nBits;
|
pindexNew->nBits = diskindex.nBits;
|
||||||
pindexNew->nNonce = diskindex.nNonce;
|
pindexNew->nNonce = diskindex.nNonce;
|
||||||
pindexNew->nStatus = diskindex.nStatus;
|
|
||||||
pindexNew->nTx = diskindex.nTx;
|
pindexNew->nTx = diskindex.nTx;
|
||||||
|
{
|
||||||
|
LOCK(::cs_main);
|
||||||
|
pindexNew->nFile = diskindex.nFile;
|
||||||
|
pindexNew->nDataPos = diskindex.nDataPos;
|
||||||
|
pindexNew->nUndoPos = diskindex.nUndoPos;
|
||||||
|
pindexNew->nStatus = diskindex.nStatus;
|
||||||
|
}
|
||||||
|
|
||||||
if (!CheckProofOfWork(pindexNew->GetBlockHash(), pindexNew->nBits, consensusParams))
|
if (!CheckProofOfWork(pindexNew->GetBlockHash(), pindexNew->nBits, consensusParams)) {
|
||||||
return error("%s: CheckProofOfWork failed: %s", __func__, pindexNew->ToString());
|
return error("%s: CheckProofOfWork failed: %s", __func__, pindexNew->ToString());
|
||||||
|
}
|
||||||
|
|
||||||
pcursor->Next();
|
pcursor->Next();
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Add table
Reference in a new issue