@@ -3410,7 +3410,7 @@ bool CChainState::MarkConflictingBlock(BlockValidationState& state, CBlockIndex
34103410 return true ;
34113411}
34123412
3413- void CChainState::ResetBlockFailureFlags (CBlockIndex *pindex) {
3413+ void CChainState::ResetBlockFailureFlags (CBlockIndex *pindex, bool ignore_chainlocks ) {
34143414 AssertLockHeld (cs_main);
34153415
34163416 if (!pindex) {
@@ -3429,9 +3429,14 @@ void CChainState::ResetBlockFailureFlags(CBlockIndex *pindex) {
34293429 for (auto & [_, block_index] : m_blockman.m_block_index ) {
34303430 if (!block_index.IsValid () && block_index.GetAncestor (nHeight) == pindex) {
34313431 block_index.nStatus &= ~BLOCK_FAILED_MASK;
3432+ if (ignore_chainlocks) {
3433+ block_index.nStatus &= ~BLOCK_CONFLICT_CHAINLOCK;
3434+ }
34323435 m_blockman.m_dirty_blockindex .insert (&block_index);
3433- if (block_index.IsValid (BLOCK_VALID_TRANSACTIONS) && !(block_index.nStatus & BLOCK_CONFLICT_CHAINLOCK) && block_index.HaveTxsDownloaded () && setBlockIndexCandidates.value_comp ()(m_chain.Tip (), &block_index)) {
3434- setBlockIndexCandidates.insert (&block_index);
3436+ if (block_index.IsValid (BLOCK_VALID_TRANSACTIONS) && block_index.HaveTxsDownloaded () && setBlockIndexCandidates.value_comp ()(m_chain.Tip (), &block_index)) {
3437+ if (ignore_chainlocks || !(block_index.nStatus & BLOCK_CONFLICT_CHAINLOCK)) {
3438+ setBlockIndexCandidates.insert (&block_index);
3439+ }
34353440 }
34363441 if (&block_index == m_chainman.m_best_invalid ) {
34373442 // Reset invalid block marker if it was pointing to one of those.
@@ -3443,11 +3448,16 @@ void CChainState::ResetBlockFailureFlags(CBlockIndex *pindex) {
34433448
34443449 // Remove the invalidity flag from all ancestors too.
34453450 while (pindex != nullptr ) {
3446- if (pindex->nStatus & BLOCK_FAILED_MASK) {
3451+ if (pindex->nStatus & ( BLOCK_FAILED_MASK | BLOCK_CONFLICT_CHAINLOCK) ) {
34473452 pindex->nStatus &= ~BLOCK_FAILED_MASK;
3453+ if (ignore_chainlocks) {
3454+ pindex->nStatus &= ~BLOCK_CONFLICT_CHAINLOCK;
3455+ }
34483456 m_blockman.m_dirty_blockindex .insert (pindex);
3449- if (pindex->IsValid (BLOCK_VALID_TRANSACTIONS) && !(pindex->nStatus & BLOCK_CONFLICT_CHAINLOCK) && pindex->HaveTxsDownloaded () && setBlockIndexCandidates.value_comp ()(m_chain.Tip (), pindex)) {
3450- setBlockIndexCandidates.insert (pindex);
3457+ if (pindex->IsValid (BLOCK_VALID_TRANSACTIONS) && pindex->HaveTxsDownloaded () && setBlockIndexCandidates.value_comp ()(m_chain.Tip (), pindex)) {
3458+ if (ignore_chainlocks || !(pindex->nStatus & BLOCK_CONFLICT_CHAINLOCK)) {
3459+ setBlockIndexCandidates.insert (pindex);
3460+ }
34513461 }
34523462 if (pindex == m_chainman.m_best_invalid ) {
34533463 // Reset invalid block marker if it was pointing to one of those.
0 commit comments