Skip to content

Commit 0fa26e0

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 48f4abb commit 0fa26e0

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
@@ -359,19 +359,21 @@ int QmlGuiMain(int argc, char* argv[])
359359
NodeModel node_model{*node};
360360
node_model.addStartupWarnings(startup_warnings);
361361
QmlInitExecutor init_executor{*node};
362+
bool shutdown_requested{false};
362363
#ifdef ENABLE_WALLET
363364
std::unique_ptr<WalletQmlController> wallet_controller;
364365
if (wallet_enabled) {
365366
wallet_controller = std::make_unique<WalletQmlController>(*node);
366-
QObject::connect(&init_executor, &QmlInitExecutor::initializeResult, wallet_controller.get(), [wallet_controller = wallet_controller.get()](bool success) {
367-
if (success) {
368-
wallet_controller->initialize();
369-
}
370-
});
367+
QObject::connect(
368+
&init_executor, &QmlInitExecutor::initializeResult, wallet_controller.get(),
369+
[wallet_controller = wallet_controller.get(), node = node.get(), &shutdown_requested](bool success) {
370+
if (success && !shutdown_requested && !node->shutdownRequested()) {
371+
wallet_controller->initialize();
372+
}
373+
});
371374
}
372375
#endif
373376
QObject::connect(&node_model, &NodeModel::requestedInitialize, &init_executor, &QmlInitExecutor::initialize);
374-
bool shutdown_requested{false};
375377
QObject::connect(&node_model, &NodeModel::requestedShutdown, [&] {
376378
if (shutdown_requested) {
377379
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)