message: Call RewindBlockIndex without cs_main held
diff: @@ -1474,11 +1474,11 @@ bool AppInitMain(InitInterfaces& interfaces)
  uiInterface.InitMessage(_("Loading block index..."));
  - LOCK(cs_main);
  -
  do {
  const int64_t load_block_index_start_time = GetTimeMillis();
  + bool is_coinsview_empty;
  try {
  + LOCK(cs_main);
  UnloadBlockIndex();
  pcoinsTip.reset();
  pcoinsdbview.reset();
  @@ -1550,7 +1550,7 @@ bool AppInitMain(InitInterfaces& interfaces)
  // The on-disk coinsdb is now in a good state, create the cache
  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) {
  // LoadChainTip sets chainActive based on pcoinsTip's best block
  if (!LoadChainTip(chainparams)) {
  @@ -1559,6 +1559,11 @@ bool AppInitMain(InitInterfaces& interfaces)
  }
  assert(chainActive.Tip() != nullptr);
  }
  + } catch (const std::exception& e) {
  + LogPrintf("%s\n", e.what());
  + strLoadError = _("Error opening block database");
  + break;
  + }
  if (!fReset) {
  // 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) {
  uiInterface.InitMessage(_("Verifying blocks..."));
  if (fHavePruned && gArgs.GetArg("-checkblocks", DEFAULT_CHECKBLOCKS) > MIN_BLOCKS_TO_KEEP) {
  