shut down p2p service last to fix timeout on shut down

This commit is contained in:
woodser 2025-04-09 10:40:55 -04:00 committed by woodser
parent ad38e3b80c
commit 974c6a0d86
4 changed files with 30 additions and 27 deletions

View file

@ -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); 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(PriceFeedService.class).shutDown();
injector.getInstance(ArbitratorManager.class).shutDown(); injector.getInstance(ArbitratorManager.class).shutDown();
injector.getInstance(TradeStatisticsManager.class).shutDown(); injector.getInstance(TradeStatisticsManager.class).shutDown();
injector.getInstance(AvoidStandbyModeService.class).shutDown(); injector.getInstance(AvoidStandbyModeService.class).shutDown();
// shut down open offer manager // shut down open offer manager
log.info("Shutting down OpenOfferManager, OfferBookService, and P2PService"); log.info("Shutting down OpenOfferManager");
injector.getInstance(OpenOfferManager.class).shutDown(() -> { injector.getInstance(OpenOfferManager.class).shutDown(() -> {
// shut down offer book service // listen for shut down of wallets setup
injector.getInstance(OfferBookService.class).shutDown(); injector.getInstance(WalletsSetup.class).shutDownComplete.addListener((ov, o, n) -> {
// shut down p2p service // shut down p2p service
injector.getInstance(P2PService.class).shutDown(() -> { 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 // done shutting down
log.info("Graceful shutdown completed. Exiting now."); log.info("Graceful shutdown completed. Exiting now.");
module.close(injector); module.close(injector);
completeShutdown(resultHandler, EXIT_SUCCESS, systemExit); 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) { } catch (Throwable t) {
log.error("App shutdown failed with exception: {}\n", t.getMessage(), t); log.error("App shutdown failed with exception: {}\n", t.getMessage(), t);

View file

@ -127,25 +127,21 @@ public abstract class ExecutableForAppWithP2p extends HavenoExecutable {
} }
JsonFileManager.shutDownAllInstances(); JsonFileManager.shutDownAllInstances();
injector.getInstance(TradeManager.class).shutDown();
injector.getInstance(PriceFeedService.class).shutDown(); injector.getInstance(PriceFeedService.class).shutDown();
injector.getInstance(ArbitratorManager.class).shutDown(); injector.getInstance(ArbitratorManager.class).shutDown();
injector.getInstance(TradeStatisticsManager.class).shutDown(); injector.getInstance(TradeStatisticsManager.class).shutDown();
injector.getInstance(AvoidStandbyModeService.class).shutDown(); injector.getInstance(AvoidStandbyModeService.class).shutDown();
// shut down open offer manager // shut down open offer manager
log.info("Shutting down OpenOfferManager, OfferBookService, and P2PService"); log.info("Shutting down OpenOfferManager");
injector.getInstance(OpenOfferManager.class).shutDown(() -> { injector.getInstance(OpenOfferManager.class).shutDown(() -> {
// shut down offer book service // listen for shut down of wallets setup
injector.getInstance(OfferBookService.class).shutDown(); injector.getInstance(WalletsSetup.class).shutDownComplete.addListener((ov, o, n) -> {
// shut down p2p service // shut down p2p service
injector.getInstance(P2PService.class).shutDown(() -> { 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) -> {
module.close(injector); module.close(injector);
PersistenceManager.flushAllDataToDiskAtShutdown(() -> { PersistenceManager.flushAllDataToDiskAtShutdown(() -> {
@ -155,6 +151,11 @@ public abstract class ExecutableForAppWithP2p extends HavenoExecutable {
UserThread.runAfter(() -> System.exit(HavenoExecutable.EXIT_SUCCESS), 1); 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(BtcWalletService.class).shutDown();
injector.getInstance(XmrWalletService.class).shutDown(); injector.getInstance(XmrWalletService.class).shutDown();
injector.getInstance(XmrConnectionService.class).shutDown(); injector.getInstance(XmrConnectionService.class).shutDown();

View file

@ -2541,7 +2541,7 @@ public abstract class Trade extends XmrWalletBase implements Tradable, Model {
if (pollWallet) doPollWallet(); if (pollWallet) doPollWallet();
} catch (Exception e) { } catch (Exception e) {
ThreadUtils.execute(() -> requestSwitchToNextBestConnection(sourceConnection), getId()); if (!isShutDownStarted) ThreadUtils.execute(() -> requestSwitchToNextBestConnection(sourceConnection), getId());
throw e; throw e;
} }
} }

View file

@ -257,12 +257,13 @@ public abstract class TradeProtocol implements DecryptedDirectMessageListener, D
} }
public void maybeSendDepositsConfirmedMessages() { public void maybeSendDepositsConfirmedMessages() {
if (!trade.isInitialized() || trade.isShutDownStarted()) return; if (!trade.isInitialized() || trade.isShutDownStarted()) return; // skip if shutting down
ThreadUtils.execute(() -> { ThreadUtils.execute(() -> {
if (!trade.isInitialized() || trade.isShutDownStarted()) return;
if (!trade.isDepositsConfirmed() || trade.isDepositsConfirmedAcked() || trade.isPayoutPublished() || depositsConfirmedTasksCalled) return; if (!trade.isDepositsConfirmed() || trade.isDepositsConfirmedAcked() || trade.isPayoutPublished() || depositsConfirmedTasksCalled) return;
depositsConfirmedTasksCalled = true; depositsConfirmedTasksCalled = true;
synchronized (trade.getLock()) { synchronized (trade.getLock()) {
if (!trade.isInitialized() || trade.isShutDownStarted()) return; // skip if shutting down if (!trade.isInitialized() || trade.isShutDownStarted()) return;
latchTrade(); latchTrade();
expect(new Condition(trade)) expect(new Condition(trade))
.setup(tasks(getDepositsConfirmedTasks()) .setup(tasks(getDepositsConfirmedTasks())