diff --git a/core/src/main/java/haveno/core/trade/Trade.java b/core/src/main/java/haveno/core/trade/Trade.java index 9051c3e3cf..4df8e3a3bd 100644 --- a/core/src/main/java/haveno/core/trade/Trade.java +++ b/core/src/main/java/haveno/core/trade/Trade.java @@ -1733,14 +1733,16 @@ public abstract class Trade extends XmrWalletBase implements Tradable, Model { } public void onShutDownStarted() { - if (wallet != null) log.info("Preparing to shut down {} {}", getClass().getSimpleName(), getId()); - isShutDownStarted = true; - stopPolling(); + if (!isShutDownStarted) { + if (wallet != null) log.info("Preparing to shut down {} {}", getClass().getSimpleName(), getId()); + isShutDownStarted = true; + stopPolling(); + } } public void shutDown() { if (isShutDown) return; // ignore if already shut down - isShutDownStarted = true; + onShutDownStarted(); if (!isPayoutFinalized()) log.info("Shutting down {} {}", getClass().getSimpleName(), getId()); // unregister p2p message listener diff --git a/core/src/main/java/haveno/core/trade/TradeManager.java b/core/src/main/java/haveno/core/trade/TradeManager.java index c2f1a0607b..84ae87e5b0 100644 --- a/core/src/main/java/haveno/core/trade/TradeManager.java +++ b/core/src/main/java/haveno/core/trade/TradeManager.java @@ -1102,6 +1102,15 @@ public class TradeManager implements PersistedDataHost, DecryptedDirectMessageLi // If trade is in already in critical state (if taker role: taker fee; both roles: after deposit published) // we move the trade to FailedTradesManager public void onMoveInvalidTradeToFailedTrades(Trade trade) { + if (trade.isInitialized()) { + ThreadUtils.execute(() -> { + try { + trade.shutDown(); + } catch (Exception e) { + log.warn("Error shutting down {} {} on move to failed trades", trade.getClass().getSimpleName(), trade.getShortId(), e); + } + }, trade.getId() + "_init"); + } failedTradesManager.add(trade); removeTrade(trade); xmrWalletService.fixReservedOutputs(); @@ -1125,11 +1134,13 @@ public class TradeManager implements PersistedDataHost, DecryptedDirectMessageLi private void addTradeToPendingTrades(Trade trade) { if (!trade.isInitialized()) { - try { - initTrade(trade); - } catch (Exception e) { - log.warn("Error initializing {} {} on move to pending trades", trade.getClass().getSimpleName(), trade.getShortId(), e); - } + ThreadUtils.execute(() -> { + try { + initTrade(trade); + } catch (Exception e) { + log.warn("Error initializing {} {} on move to pending trades", trade.getClass().getSimpleName(), trade.getShortId(), e); + } + }, trade.getId() + "_init"); } addTrade(trade); }