aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPieter Wuille <pieter.wuille@gmail.com>2014-11-25 12:33:43 +0100
committerPieter Wuille <pieter.wuille@gmail.com>2014-11-26 16:36:26 +0100
commit0dd06b2515cd4d1f0be4dcf9060e34f3b9abde76 (patch)
tree4dca1c250a278738af9a94e741b438178abc24a1
parent9b0a8d3152b43b63c99878d0223a1681993ad608 (diff)
Delay writing block indexes in invalidate/reconsider
-rw-r--r--src/main.cpp18
1 files changed, 6 insertions, 12 deletions
diff --git a/src/main.cpp b/src/main.cpp
index eeef513528..5695c8ba51 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -2140,17 +2140,13 @@ bool InvalidateBlock(CValidationState& state, CBlockIndex *pindex) {
// Mark the block itself as invalid.
pindex->nStatus |= BLOCK_FAILED_VALID;
- if (!pblocktree->WriteBlockIndex(CDiskBlockIndex(pindex))) {
- return state.Abort("Failed to update block index");
- }
+ setDirtyBlockIndex.insert(pindex);
setBlockIndexCandidates.erase(pindex);
while (chainActive.Contains(pindex)) {
CBlockIndex *pindexWalk = chainActive.Tip();
pindexWalk->nStatus |= BLOCK_FAILED_CHILD;
- if (!pblocktree->WriteBlockIndex(CDiskBlockIndex(pindexWalk))) {
- return state.Abort("Failed to update block index");
- }
+ setDirtyBlockIndex.insert(pindexWalk);
setBlockIndexCandidates.erase(pindexWalk);
// ActivateBestChain considers blocks already in chainActive
// unconditionally valid already, so force disconnect away from it.
@@ -2183,9 +2179,7 @@ bool ReconsiderBlock(CValidationState& state, CBlockIndex *pindex) {
while (it != mapBlockIndex.end()) {
if (!it->second->IsValid() && it->second->GetAncestor(nHeight) == pindex) {
it->second->nStatus &= ~BLOCK_FAILED_MASK;
- if (!pblocktree->WriteBlockIndex(CDiskBlockIndex(pindex))) {
- return state.Abort("Failed to update block index");
- }
+ setDirtyBlockIndex.insert(it->second);
if (it->second->IsValid(BLOCK_VALID_TRANSACTIONS) && it->second->nChainTx && setBlockIndexCandidates.value_comp()(chainActive.Tip(), it->second)) {
setBlockIndexCandidates.insert(it->second);
}
@@ -2199,9 +2193,9 @@ bool ReconsiderBlock(CValidationState& state, CBlockIndex *pindex) {
// Remove the invalidity flag from all ancestors too.
while (pindex != NULL) {
- pindex->nStatus &= ~BLOCK_FAILED_MASK;
- if (!pblocktree->WriteBlockIndex(CDiskBlockIndex(pindex))) {
- return state.Abort("Failed to update block index");
+ if (pindex->nStatus & BLOCK_FAILED_MASK) {
+ pindex->nStatus &= ~BLOCK_FAILED_MASK;
+ setDirtyBlockIndex.insert(pindex);
}
pindex = pindex->pprev;
}