sync wallet directly within 100 blocks of target height

This commit is contained in:
woodser 2024-08-06 05:15:36 -04:00
parent 443c2f4cdb
commit 0105c1436a
3 changed files with 23 additions and 4 deletions

View File

@ -2631,8 +2631,15 @@ public abstract class Trade extends XmrWalletBase implements Tradable, Model {
private void syncWalletIfBehind() {
synchronized (walletLock) {
if (isWalletBehind()) {
// TODO: local tests have timing failures unless sync called directly
if (xmrConnectionService.getTargetHeight() - walletHeight.get() < XmrWalletBase.DIRECT_SYNC_WITHIN_BLOCKS) {
xmrWalletService.syncWallet(wallet);
} else {
syncWithProgress();
}
walletHeight.set(wallet.getHeight());
}
}
}

View File

@ -26,6 +26,7 @@ public class XmrWalletBase {
// constants
public static final int SYNC_PROGRESS_TIMEOUT_SECONDS = 60;
public static final int DIRECT_SYNC_WITHIN_BLOCKS = 100;
// inherited
protected MoneroWallet wallet;
@ -59,12 +60,17 @@ public class XmrWalletBase {
}
public void syncWithProgress() {
syncWithProgress(false);
}
public void syncWithProgress(boolean repeatSyncToLatestHeight) {
synchronized (walletLock) {
// set initial state
isSyncingWithProgress = true;
syncProgressError = null;
updateSyncProgress(walletHeight.get());
long targetHeightAtStart = xmrConnectionService.getTargetHeight();
// test connection changing on startup before wallet synced
if (testReconnectOnStartup) {
@ -106,7 +112,7 @@ public class XmrWalletBase {
return;
}
updateSyncProgress(height);
if (height >= xmrConnectionService.getTargetHeight()) {
if (height >= (repeatSyncToLatestHeight ? xmrConnectionService.getTargetHeight() : targetHeightAtStart)) {
setWalletSyncedWithProgress();
syncProgressLatch.countDown();
}

View File

@ -1358,7 +1358,7 @@ public class XmrWalletService extends XmrWalletBase {
long time = System.currentTimeMillis();
MoneroRpcConnection sourceConnection = xmrConnectionService.getConnection();
try {
syncWithProgress(); // blocking
syncWithProgress(true); // repeat sync to latest target height
} catch (Exception e) {
log.warn("Error syncing wallet with progress on startup: " + e.getMessage());
forceCloseMainWallet();
@ -1768,9 +1768,15 @@ public class XmrWalletService extends XmrWalletBase {
// sync wallet if behind daemon
if (walletHeight.get() < xmrConnectionService.getTargetHeight()) {
synchronized (walletLock) { // avoid long sync from blocking other operations
// TODO: local tests have timing failures unless sync called directly
if (xmrConnectionService.getTargetHeight() - walletHeight.get() < XmrWalletBase.DIRECT_SYNC_WITHIN_BLOCKS) {
syncMainWallet();
} else {
syncWithProgress();
}
}
}
// fetch transactions from pool and store to cache
// TODO: ideally wallet should sync every poll and then avoid updating from pool on fetching txs?