From fac90e5261b811739ada56e06ea793a12f9c2c3d Mon Sep 17 00:00:00 2001 From: MarcoFalke <*~=`'#}+{/-|&$^_@721217.xyz> Date: Tue, 15 Jul 2025 18:14:50 +0200 Subject: [PATCH] test: Check that the GUI interactive reindex works --- src/common/args.cpp | 1 + src/init.cpp | 5 ++-- test/functional/feature_reindex_init.py | 34 +++++++++++++++++++++++++ test/functional/test_runner.py | 1 + 4 files changed, 39 insertions(+), 2 deletions(-) create mode 100755 test/functional/feature_reindex_init.py diff --git a/src/common/args.cpp b/src/common/args.cpp index 71dcd1ac10c..94eb9230fd2 100644 --- a/src/common/args.cpp +++ b/src/common/args.cpp @@ -709,6 +709,7 @@ std::string HelpMessageOpt(const std::string &option, const std::string &message const std::vector TEST_OPTIONS_DOC{ "addrman (use deterministic addrman)", + "reindex_after_failure_noninteractive_yes (When asked for a reindex after failure interactively, simulate as-if answered with 'yes')", "bip94 (enforce BIP94 consensus rules)", }; diff --git a/src/init.cpp b/src/init.cpp index ce858cfd424..f8e4a76119b 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -1737,10 +1737,11 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info) args); if (status == ChainstateLoadStatus::FAILURE && !do_reindex && !ShutdownRequested(node)) { // suggest a reindex - bool do_retry = uiInterface.ThreadSafeQuestion( + bool do_retry{HasTestOption(args, "reindex_after_failure_noninteractive_yes") || + uiInterface.ThreadSafeQuestion( error + Untranslated(".\n\n") + _("Do you want to rebuild the databases now?"), error.original + ".\nPlease restart with -reindex or -reindex-chainstate to recover.", - "", CClientUIInterface::MSG_ERROR | CClientUIInterface::BTN_ABORT); + "", CClientUIInterface::MSG_ERROR | CClientUIInterface::BTN_ABORT)}; if (!do_retry) { return false; } diff --git a/test/functional/feature_reindex_init.py b/test/functional/feature_reindex_init.py new file mode 100755 index 00000000000..d031355e439 --- /dev/null +++ b/test/functional/feature_reindex_init.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 +# Copyright (c) The Bitcoin Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. +"""Test reindex works on init after a db load failure""" + +from test_framework.test_framework import BitcoinTestFramework +from test_framework.util import assert_equal +import os +import shutil + + +class ReindexInitTest(BitcoinTestFramework): + def set_test_params(self): + self.num_nodes = 1 + + def run_test(self): + node = self.nodes[0] + self.stop_nodes() + + self.log.info("Removing the block index leads to init error") + shutil.rmtree(node.blocks_path / "index") + node.assert_start_raises_init_error( + expected_msg=f": Error initializing block database.{os.linesep}" + "Please restart with -reindex or -reindex-chainstate to recover.", + ) + + self.log.info("Allowing the reindex should work fine") + self.start_node(0, extra_args=["-test=reindex_after_failure_noninteractive_yes"]) + assert_equal(node.getblockcount(), 200) + + +if __name__ == "__main__": + ReindexInitTest(__file__).main() diff --git a/test/functional/test_runner.py b/test/functional/test_runner.py index 44c2885bdf8..7c8c15f391d 100755 --- a/test/functional/test_runner.py +++ b/test/functional/test_runner.py @@ -289,6 +289,7 @@ BASE_SCRIPTS = [ 'p2p_leak.py', 'wallet_encryption.py', 'feature_dersig.py', + 'feature_reindex_init.py', 'feature_cltv.py', 'rpc_uptime.py', 'feature_discover.py',