From a5ce48c752e7ab1c0a1460237021b594e6c1f496 Mon Sep 17 00:00:00 2001 From: woodser <13068859+woodser@users.noreply.github.com> Date: Wed, 9 Apr 2025 10:40:55 -0400 Subject: [PATCH] shut down p2p service last to fix timeout on shut down --- .../haveno/core/app/HavenoExecutable.java | 29 ++++++++++--------- .../app/misc/ExecutableForAppWithP2p.java | 21 +++++++------- .../main/java/haveno/core/trade/Trade.java | 2 +- .../core/trade/protocol/TradeProtocol.java | 5 ++-- 4 files changed, 30 insertions(+), 27 deletions(-) diff --git a/core/src/main/java/haveno/core/app/HavenoExecutable.java b/core/src/main/java/haveno/core/app/HavenoExecutable.java index 92cd43e827..8f2998eb0d 100644 --- a/core/src/main/java/haveno/core/app/HavenoExecutable.java +++ b/core/src/main/java/haveno/core/app/HavenoExecutable.java @@ -366,36 +366,37 @@ public abstract class HavenoExecutable implements GracefulShutDownHandler, Haven log.error("Failed to notify all services to prepare for shutdown: {}\n", e.getMessage(), e); } - injector.getInstance(TradeManager.class).shutDown(); injector.getInstance(PriceFeedService.class).shutDown(); injector.getInstance(ArbitratorManager.class).shutDown(); injector.getInstance(TradeStatisticsManager.class).shutDown(); injector.getInstance(AvoidStandbyModeService.class).shutDown(); // shut down open offer manager - log.info("Shutting down OpenOfferManager, OfferBookService, and P2PService"); + log.info("Shutting down OpenOfferManager"); injector.getInstance(OpenOfferManager.class).shutDown(() -> { - // shut down offer book service - injector.getInstance(OfferBookService.class).shutDown(); + // listen for shut down of wallets setup + injector.getInstance(WalletsSetup.class).shutDownComplete.addListener((ov, o, n) -> { - // shut down p2p service - injector.getInstance(P2PService.class).shutDown(() -> { + // shut down p2p service + log.info("Shutting down P2P service"); + injector.getInstance(P2PService.class).shutDown(() -> { - // shut down monero wallets and connections - log.info("Shutting down wallet and connection services"); - injector.getInstance(WalletsSetup.class).shutDownComplete.addListener((ov, o, n) -> { - // done shutting down log.info("Graceful shutdown completed. Exiting now."); module.close(injector); completeShutdown(resultHandler, EXIT_SUCCESS, systemExit); }); - injector.getInstance(BtcWalletService.class).shutDown(); - injector.getInstance(XmrWalletService.class).shutDown(); - injector.getInstance(XmrConnectionService.class).shutDown(); - injector.getInstance(WalletsSetup.class).shutDown(); }); + + // shut down trade and wallet services + log.info("Shutting down trade and wallet services"); + injector.getInstance(OfferBookService.class).shutDown(); + injector.getInstance(TradeManager.class).shutDown(); + injector.getInstance(BtcWalletService.class).shutDown(); + injector.getInstance(XmrWalletService.class).shutDown(); + injector.getInstance(XmrConnectionService.class).shutDown(); + injector.getInstance(WalletsSetup.class).shutDown(); }); } catch (Throwable t) { log.error("App shutdown failed with exception: {}\n", t.getMessage(), t); diff --git a/core/src/main/java/haveno/core/app/misc/ExecutableForAppWithP2p.java b/core/src/main/java/haveno/core/app/misc/ExecutableForAppWithP2p.java index 0437bca6b4..9c8016d506 100644 --- a/core/src/main/java/haveno/core/app/misc/ExecutableForAppWithP2p.java +++ b/core/src/main/java/haveno/core/app/misc/ExecutableForAppWithP2p.java @@ -127,25 +127,21 @@ public abstract class ExecutableForAppWithP2p extends HavenoExecutable { } JsonFileManager.shutDownAllInstances(); - injector.getInstance(TradeManager.class).shutDown(); injector.getInstance(PriceFeedService.class).shutDown(); injector.getInstance(ArbitratorManager.class).shutDown(); injector.getInstance(TradeStatisticsManager.class).shutDown(); injector.getInstance(AvoidStandbyModeService.class).shutDown(); // shut down open offer manager - log.info("Shutting down OpenOfferManager, OfferBookService, and P2PService"); + log.info("Shutting down OpenOfferManager"); injector.getInstance(OpenOfferManager.class).shutDown(() -> { - // shut down offer book service - injector.getInstance(OfferBookService.class).shutDown(); + // listen for shut down of wallets setup + injector.getInstance(WalletsSetup.class).shutDownComplete.addListener((ov, o, n) -> { - // shut down p2p service - injector.getInstance(P2PService.class).shutDown(() -> { - - // shut down monero wallets and connections - log.info("Shutting down wallet and connection services"); - injector.getInstance(WalletsSetup.class).shutDownComplete.addListener((ov, o, n) -> { + // shut down p2p service + log.info("Shutting down P2P service"); + injector.getInstance(P2PService.class).shutDown(() -> { module.close(injector); PersistenceManager.flushAllDataToDiskAtShutdown(() -> { @@ -155,6 +151,11 @@ public abstract class ExecutableForAppWithP2p extends HavenoExecutable { UserThread.runAfter(() -> System.exit(HavenoExecutable.EXIT_SUCCESS), 1); }); }); + + // shut down trade and wallet services + log.info("Shutting down trade and wallet services"); + injector.getInstance(OfferBookService.class).shutDown(); + injector.getInstance(TradeManager.class).shutDown(); injector.getInstance(BtcWalletService.class).shutDown(); injector.getInstance(XmrWalletService.class).shutDown(); injector.getInstance(XmrConnectionService.class).shutDown(); diff --git a/core/src/main/java/haveno/core/trade/Trade.java b/core/src/main/java/haveno/core/trade/Trade.java index 1a0b513e1e..8930966ba5 100644 --- a/core/src/main/java/haveno/core/trade/Trade.java +++ b/core/src/main/java/haveno/core/trade/Trade.java @@ -2541,7 +2541,7 @@ public abstract class Trade extends XmrWalletBase implements Tradable, Model { if (pollWallet) doPollWallet(); } catch (Exception e) { - ThreadUtils.execute(() -> requestSwitchToNextBestConnection(sourceConnection), getId()); + if (!isShutDownStarted) ThreadUtils.execute(() -> requestSwitchToNextBestConnection(sourceConnection), getId()); throw e; } } diff --git a/core/src/main/java/haveno/core/trade/protocol/TradeProtocol.java b/core/src/main/java/haveno/core/trade/protocol/TradeProtocol.java index 74a50f44f4..c425f343ef 100644 --- a/core/src/main/java/haveno/core/trade/protocol/TradeProtocol.java +++ b/core/src/main/java/haveno/core/trade/protocol/TradeProtocol.java @@ -257,12 +257,13 @@ public abstract class TradeProtocol implements DecryptedDirectMessageListener, D } public void maybeSendDepositsConfirmedMessages() { - if (!trade.isInitialized() || trade.isShutDownStarted()) return; + if (!trade.isInitialized() || trade.isShutDownStarted()) return; // skip if shutting down ThreadUtils.execute(() -> { + if (!trade.isInitialized() || trade.isShutDownStarted()) return; if (!trade.isDepositsConfirmed() || trade.isDepositsConfirmedAcked() || trade.isPayoutPublished() || depositsConfirmedTasksCalled) return; depositsConfirmedTasksCalled = true; synchronized (trade.getLock()) { - if (!trade.isInitialized() || trade.isShutDownStarted()) return; // skip if shutting down + if (!trade.isInitialized() || trade.isShutDownStarted()) return; latchTrade(); expect(new Condition(trade)) .setup(tasks(getDepositsConfirmedTasks())