<!-- Describe the issue -->

When our chainstate activation sequence fails and we're running the GUI, we ask the user via a question box whether or not they'd like to re-run the sequence with `fReindex = true`. Fun fact: despite the fact that this sequence is wrapped in a while loop, we only run it twice at most.

https://github.com/bitcoin/bitcoin/blob/7ecb309c4ed1bb9ae6b9a12cbb4f083328edc125/src/init.cpp#L1539-L1556

If they answer yes, the sequence will always fail, because a chainstate will have already been initialized in the original run and `InitializeChainstate` will throw a `std::logic_error`:

https://github.com/bitcoin/bitcoin/blob/7ecb309c4ed1bb9ae6b9a12cbb4f083328edc125/src/validation.cpp#L4573-L4594

This always reproduces. To reproduce:
```
gdb ./src/qt/bitcoin-qt
(gdb) b InitializeChainstate
(gdb) # add breakpoint for the "if (!fLoaded && !ShutdownRequested()) {" line
(gdb) r  # should stop at the breakpoint for InitializeChainstate
(gdb) c  # to advance to the breakpoint for the "if (!fLoaded && !ShutdownRequested()) {" line
(gdb) set fLoaded=false
(gdb) c  # should stop at the breakpoint for InitializeChainstate
(gdb) n  # step through InitializeChainstate to see that it throws
```

We expect the re-run of the chainstate activation sequence to not always fail.

CChainState& c2 = WITH_LOCK(::cs_main, return manager.InitializeChainstate(
        &mempool, snapshot_blockhash));
    chainstates.push_back(&c2);
    BOOST_CHECK_EQUAL(manager.SnapshotBlockhash().value(), snapshot_blockhash);
    c2.InitCoinsDB(
        1 << 23, true, false);
    WITH_LOCK(::cs_main, c2.InitCoinsCache(1 << 23));
    
    c2.LoadGenesisBlock();
    BlockValidationState _;
    BOOST_CHECK(c2.ActivateBestChain(_, nullptr));
    BOOST_CHECK(manager.IsSnapshotActive());
    BOOST_CHECK(!manager.IsSnapshotValidated());
    BOOST_CHECK_EQUAL(&c2, &manager.ActiveChainstate());
    BOOST_CHECK(&c1 != &manager.ActiveChainstate());
    auto all2 = manager.GetAll();
    BOOST_CHECK_EQUAL_COLLECTIONS(all2.begin(), all2.end(), chainstates.begin(), chainstates.end());
    auto& active_chain2 = manager.ActiveChain();
    BOOST_CHECK_EQUAL(&active_chain2, &c2.m_chain);
    BOOST_CHECK_EQUAL(manager.ActiveHeight(), 0);
    auto active_tip2 = manager.ActiveTip();
    auto exp_tip2 = c2.m_chain.Tip();
    BOOST_CHECK_EQUAL(active_tip2, exp_tip2);
    
    
    BOOST_CHECK(exp_tip != exp_tip2);
    
    SyncWithValidationInterfaceQueue();
}
BOOST_AUTO_TEST_CASE(chainstatemanager_rebalance_caches)