Delay writing block indexes in invalidate/reconsider

This commit is contained in:
Pieter Wuille 2014-11-25 12:33:43 +01:00
parent 798faec3ea
commit 3dd8ed72e5

View file

@ -2137,17 +2137,13 @@ bool InvalidateBlock(CValidationState& state, CBlockIndex *pindex) {
// Mark the block itself as invalid. // Mark the block itself as invalid.
pindex->nStatus |= BLOCK_FAILED_VALID; pindex->nStatus |= BLOCK_FAILED_VALID;
if (!pblocktree->WriteBlockIndex(CDiskBlockIndex(pindex))) { setDirtyBlockIndex.insert(pindex);
return state.Abort("Failed to update block index");
}
setBlockIndexCandidates.erase(pindex); setBlockIndexCandidates.erase(pindex);
while (chainActive.Contains(pindex)) { while (chainActive.Contains(pindex)) {
CBlockIndex *pindexWalk = chainActive.Tip(); CBlockIndex *pindexWalk = chainActive.Tip();
pindexWalk->nStatus |= BLOCK_FAILED_CHILD; pindexWalk->nStatus |= BLOCK_FAILED_CHILD;
if (!pblocktree->WriteBlockIndex(CDiskBlockIndex(pindexWalk))) { setDirtyBlockIndex.insert(pindexWalk);
return state.Abort("Failed to update block index");
}
setBlockIndexCandidates.erase(pindexWalk); setBlockIndexCandidates.erase(pindexWalk);
// ActivateBestChain considers blocks already in chainActive // ActivateBestChain considers blocks already in chainActive
// unconditionally valid already, so force disconnect away from it. // unconditionally valid already, so force disconnect away from it.
@ -2180,9 +2176,7 @@ bool ReconsiderBlock(CValidationState& state, CBlockIndex *pindex) {
while (it != mapBlockIndex.end()) { while (it != mapBlockIndex.end()) {
if (!it->second->IsValid() && it->second->GetAncestor(nHeight) == pindex) { if (!it->second->IsValid() && it->second->GetAncestor(nHeight) == pindex) {
it->second->nStatus &= ~BLOCK_FAILED_MASK; it->second->nStatus &= ~BLOCK_FAILED_MASK;
if (!pblocktree->WriteBlockIndex(CDiskBlockIndex(pindex))) { setDirtyBlockIndex.insert(it->second);
return state.Abort("Failed to update block index");
}
if (it->second->IsValid(BLOCK_VALID_TRANSACTIONS) && it->second->nChainTx && setBlockIndexCandidates.value_comp()(chainActive.Tip(), it->second)) { if (it->second->IsValid(BLOCK_VALID_TRANSACTIONS) && it->second->nChainTx && setBlockIndexCandidates.value_comp()(chainActive.Tip(), it->second)) {
setBlockIndexCandidates.insert(it->second); setBlockIndexCandidates.insert(it->second);
} }
@ -2196,9 +2190,9 @@ bool ReconsiderBlock(CValidationState& state, CBlockIndex *pindex) {
// Remove the invalidity flag from all ancestors too. // Remove the invalidity flag from all ancestors too.
while (pindex != NULL) { while (pindex != NULL) {
pindex->nStatus &= ~BLOCK_FAILED_MASK; if (pindex->nStatus & BLOCK_FAILED_MASK) {
if (!pblocktree->WriteBlockIndex(CDiskBlockIndex(pindex))) { pindex->nStatus &= ~BLOCK_FAILED_MASK;
return state.Abort("Failed to update block index"); setDirtyBlockIndex.insert(pindex);
} }
pindex = pindex->pprev; pindex = pindex->pprev;
} }