Call RewindBlockIndex without cs_main held

This commit is contained in:
Pieter Wuille 2019-02-13 15:39:32 -08:00
parent 436f7d735f
commit 880ce7d46b

View file

@ -1474,11 +1474,11 @@ bool AppInitMain(InitInterfaces& interfaces)
uiInterface.InitMessage(_("Loading block index...")); uiInterface.InitMessage(_("Loading block index..."));
LOCK(cs_main);
do { do {
const int64_t load_block_index_start_time = GetTimeMillis(); const int64_t load_block_index_start_time = GetTimeMillis();
bool is_coinsview_empty;
try { try {
LOCK(cs_main);
UnloadBlockIndex(); UnloadBlockIndex();
pcoinsTip.reset(); pcoinsTip.reset();
pcoinsdbview.reset(); pcoinsdbview.reset();
@ -1550,7 +1550,7 @@ bool AppInitMain(InitInterfaces& interfaces)
// The on-disk coinsdb is now in a good state, create the cache // The on-disk coinsdb is now in a good state, create the cache
pcoinsTip.reset(new CCoinsViewCache(pcoinscatcher.get())); pcoinsTip.reset(new CCoinsViewCache(pcoinscatcher.get()));
bool is_coinsview_empty = fReset || fReindexChainState || pcoinsTip->GetBestBlock().IsNull(); is_coinsview_empty = fReset || fReindexChainState || pcoinsTip->GetBestBlock().IsNull();
if (!is_coinsview_empty) { if (!is_coinsview_empty) {
// LoadChainTip sets chainActive based on pcoinsTip's best block // LoadChainTip sets chainActive based on pcoinsTip's best block
if (!LoadChainTip(chainparams)) { if (!LoadChainTip(chainparams)) {
@ -1559,6 +1559,11 @@ bool AppInitMain(InitInterfaces& interfaces)
} }
assert(chainActive.Tip() != nullptr); assert(chainActive.Tip() != nullptr);
} }
} catch (const std::exception& e) {
LogPrintf("%s\n", e.what());
strLoadError = _("Error opening block database");
break;
}
if (!fReset) { if (!fReset) {
// Note that RewindBlockIndex MUST run even if we're about to -reindex-chainstate. // Note that RewindBlockIndex MUST run even if we're about to -reindex-chainstate.
@ -1571,6 +1576,8 @@ bool AppInitMain(InitInterfaces& interfaces)
} }
} }
try {
LOCK(cs_main);
if (!is_coinsview_empty) { if (!is_coinsview_empty) {
uiInterface.InitMessage(_("Verifying blocks...")); uiInterface.InitMessage(_("Verifying blocks..."));
if (fHavePruned && gArgs.GetArg("-checkblocks", DEFAULT_CHECKBLOCKS) > MIN_BLOCKS_TO_KEEP) { if (fHavePruned && gArgs.GetArg("-checkblocks", DEFAULT_CHECKBLOCKS) > MIN_BLOCKS_TO_KEEP) {