sync idle trades once in background after active trades

This commit is contained in:
woodser 2023-02-10 09:02:26 -05:00
parent 0c4ce623a7
commit 88f0ad543a
2 changed files with 19 additions and 8 deletions

View file

@ -743,6 +743,10 @@ public abstract class Trade implements Tradable, Model {
} }
} }
public boolean isIdling() {
return this instanceof ArbitratorTrade && isDepositsConfirmed() && walletExists(); // arbitrator idles trade after deposits confirm
}
public void syncWallet() { public void syncWallet() {
if (getWallet() == null) throw new RuntimeException("Cannot sync trade wallet because it doesn't exist for " + getClass().getSimpleName() + ", " + getId()); if (getWallet() == null) throw new RuntimeException("Cannot sync trade wallet because it doesn't exist for " + getClass().getSimpleName() + ", " + getId());
if (getWallet().getDaemonConnection() == null) throw new RuntimeException("Cannot sync trade wallet because it's not connected to a Monero daemon for " + getClass().getSimpleName() + ", " + getId()); if (getWallet().getDaemonConnection() == null) throw new RuntimeException("Cannot sync trade wallet because it's not connected to a Monero daemon for " + getClass().getSimpleName() + ", " + getId());
@ -750,7 +754,6 @@ public abstract class Trade implements Tradable, Model {
getWallet().sync(); getWallet().sync();
pollWallet(); pollWallet();
log.info("Done syncing wallet for {} {}", getClass().getSimpleName(), getId()); log.info("Done syncing wallet for {} {}", getClass().getSimpleName(), getId());
updateWalletRefreshPeriod();
} }
private void trySyncWallet() { private void trySyncWallet() {
@ -1634,11 +1637,16 @@ public abstract class Trade implements Tradable, Model {
} }
private void updateSyncing() { private void updateSyncing() {
if (!isIdling()) trySyncWallet(); if (!isIdling()) {
else { trySyncWallet();
updateWalletRefreshPeriod();
} else {
long startSyncingInMs = ThreadLocalRandom.current().nextLong(0, getWalletRefreshPeriod()); // random time to start syncing long startSyncingInMs = ThreadLocalRandom.current().nextLong(0, getWalletRefreshPeriod()); // random time to start syncing
UserThread.runAfter(() -> { UserThread.runAfter(() -> {
if (isInitialized) trySyncWallet(); if (isInitialized) {
trySyncWallet();
updateWalletRefreshPeriod();
}
}, startSyncingInMs / 1000l); }, startSyncingInMs / 1000l);
} }
} }
@ -1744,10 +1752,6 @@ public abstract class Trade implements Tradable, Model {
return xmrWalletService.getConnectionsService().getDefaultRefreshPeriodMs(); return xmrWalletService.getConnectionsService().getDefaultRefreshPeriodMs();
} }
private boolean isIdling() {
return this instanceof ArbitratorTrade && isDepositsConfirmed(); // arbitrator idles trade after deposits confirm
}
private void setStateDepositsPublished() { private void setStateDepositsPublished() {
if (!isDepositsPublished()) setState(State.DEPOSIT_TXS_SEEN_IN_NETWORK); if (!isDepositsPublished()) setState(State.DEPOSIT_TXS_SEEN_IN_NETWORK);
} }

View file

@ -417,6 +417,13 @@ public class TradeManager implements PersistedDataHost, DecryptedDirectMessageLi
String referralId = referralIdService.getOptionalReferralId().orElse(null); String referralId = referralIdService.getOptionalReferralId().orElse(null);
boolean isTorNetworkNode = p2PService.getNetworkNode() instanceof TorNetworkNode; boolean isTorNetworkNode = p2PService.getNetworkNode() instanceof TorNetworkNode;
tradeStatisticsManager.maybeRepublishTradeStatistics(nonFailedTrades, referralId, isTorNetworkNode); tradeStatisticsManager.maybeRepublishTradeStatistics(nonFailedTrades, referralId, isTorNetworkNode);
// sync idle trades once in background after active trades
for (Trade trade : trades) {
if (trade.isIdling()) {
HavenoUtils.submitTask(() -> trade.syncWallet());
}
}
} }
private void initPersistedTrade(Trade trade) { private void initPersistedTrade(Trade trade) {