Skip to content

Commit 3fd936b

Browse files
committed
qml: skip wallet setup after startup shutdown
Avoid treating a late successful init result as node-ready once shutdown has already been requested. This keeps the wallet controller from rebuilding GUI wallet state while Core is shutting down, fixing qml_test_shutdown hangs during load_on_startup shutdown.
1 parent 88765de commit 3fd936b

3 files changed

Lines changed: 35 additions & 6 deletions

File tree

qml/bitcoin.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -556,19 +556,21 @@ int QmlGuiMain(int argc, char* argv[])
556556
NodeModel node_model{*node};
557557
node_model.addStartupWarnings(startup_warnings);
558558
QmlInitExecutor init_executor{*node};
559+
bool shutdown_requested{false};
559560
#ifdef ENABLE_WALLET
560561
std::unique_ptr<WalletQmlController> wallet_controller;
561562
if (wallet_enabled) {
562563
wallet_controller = std::make_unique<WalletQmlController>(*node);
563-
QObject::connect(&init_executor, &QmlInitExecutor::initializeResult, wallet_controller.get(), [wallet_controller = wallet_controller.get()](bool success) {
564-
if (success) {
565-
wallet_controller->initialize();
566-
}
567-
});
564+
QObject::connect(
565+
&init_executor, &QmlInitExecutor::initializeResult, wallet_controller.get(),
566+
[wallet_controller = wallet_controller.get(), node = node.get(), &shutdown_requested](bool success) {
567+
if (success && !shutdown_requested && !node->shutdownRequested()) {
568+
wallet_controller->initialize();
569+
}
570+
});
568571
}
569572
#endif
570573
QObject::connect(&node_model, &NodeModel::requestedInitialize, &init_executor, &QmlInitExecutor::initialize);
571-
bool shutdown_requested{false};
572574
QObject::connect(&node_model, &NodeModel::requestedShutdown, [&] {
573575
if (shutdown_requested) {
574576
return;

qml/models/nodemodel.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,11 @@ void NodeModel::requestShutdown()
426426

427427
void NodeModel::initializeResult(bool success, interfaces::BlockAndHeaderTipInfo tip_info)
428428
{
429+
if (success && (m_shutdown_requested || m_node.shutdownRequested())) {
430+
requestShutdown();
431+
return;
432+
}
433+
429434
if (!success) {
430435
if (m_startup_failure_dialog_shown) {
431436
requestShutdown();

test/test_nodemodel.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ private Q_SLOTS:
144144
void requestShutdownEmitsOnlyOnce();
145145
void initializationFailureRequestsShutdownWhenCoreWasInterrupted();
146146
void initializationFailureWithoutCoreInterruptOnlySetsErrorState();
147+
void initializationSuccessDuringCoreShutdownSkipsReadyState();
147148
void destructorUnsubscribesCoreSignalsBeforeStoppingPolling();
148149
void nodeNotificationHandlersUpdateModelThroughQueuedSignals();
149150
void blockTipUpdatesQueuedAcrossThreadsRetainPayloadValues();
@@ -413,6 +414,27 @@ void NodeModelTests::initializationFailureWithoutCoreInterruptOnlySetsErrorState
413414
QCOMPARE(initialized_spy.count(), 1);
414415
}
415416

417+
void NodeModelTests::initializationSuccessDuringCoreShutdownSkipsReadyState()
418+
{
419+
NiceMock<MockNode> node;
420+
MempoolState mempool;
421+
InstallDefaultHandlers(node);
422+
InstallMempoolGetters(node, mempool);
423+
ON_CALL(node, shutdownRequested()).WillByDefault(Return(true));
424+
425+
NodeModel model{node};
426+
WaitForInitialMempoolRefresh(mempool);
427+
428+
QSignalSpy shutdown_spy{&model, &NodeModel::requestedShutdown};
429+
QSignalSpy initialized_spy{&model, &NodeModel::nodeInitialized};
430+
QSignalSpy ready_state_spy{&model, &NodeModel::setTimeRatioListInitial};
431+
model.initializeResult(true, {});
432+
433+
QCOMPARE(shutdown_spy.count(), 1);
434+
QCOMPARE(initialized_spy.count(), 0);
435+
QCOMPARE(ready_state_spy.count(), 0);
436+
}
437+
416438
void NodeModelTests::destructorUnsubscribesCoreSignalsBeforeStoppingPolling()
417439
{
418440
NiceMock<MockNode> node;

0 commit comments

Comments
 (0)