From 0c3d683be4e6c0154b6666bdfd484aac3b4f2fe1 Mon Sep 17 00:00:00 2001 From: Patrick Lodder Date: Wed, 4 Aug 2021 00:07:58 +0200 Subject: [PATCH] bugfix: break ActivateBestChain() differently on shutdown Moves the break in ActivateBestChain() when a node is being shut down from the beginning of the loop block to the end, allowing pindexNewTip to be populated with chainActive.Tip() rather than its initial NULL value. Solves issues when shutting down nodes while inside the ActivateBestChain loop. --- src/validation.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/validation.cpp b/src/validation.cpp index 46e586415..35778a2e7 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -2504,9 +2504,6 @@ bool ActivateBestChain(CValidationState &state, const CChainParams& chainparams, CBlockIndex *pindexMostWork = NULL; CBlockIndex *pindexNewTip = NULL; do { - boost::this_thread::interruption_point(); - if (ShutdownRequested()) - break; const CBlockIndex *pindexFork; ConnectTrace connectTrace; @@ -2566,6 +2563,15 @@ bool ActivateBestChain(CValidationState &state, const CChainParams& chainparams, if (pindexFork != pindexNewTip) { uiInterface.NotifyBlockTip(fInitialDownload, pindexNewTip); } + + // Perform the shutdown detection to the end of the loop to prevent + // pindexNewTip being nil + boost::this_thread::interruption_point(); + if (ShutdownRequested()) { + LogPrintf("ActivateBestChain: shutdown requested, breaking loop\n"); + break; + } + } while (pindexNewTip != pindexMostWork); CheckBlockIndex(chainparams.GetConsensus(pindexNewTip->nHeight));