Skip to content

Commit

Permalink
save and backup wallet files once per 5 minutes on polling
Browse files Browse the repository at this point in the history
  • Loading branch information
woodser committed Dec 27, 2024
1 parent 3e55427 commit 60a3e97
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 16 deletions.
4 changes: 3 additions & 1 deletion core/src/main/java/haveno/core/trade/Trade.java
Original file line number Diff line number Diff line change
Expand Up @@ -901,6 +901,7 @@ public void changeWalletPassword(String oldPassword, String newPassword) {
}
}

@Override
public void requestSaveWallet() {

// save wallet off main thread
Expand All @@ -911,6 +912,7 @@ public void requestSaveWallet() {
}, getId());
}

@Override
public void saveWallet() {
synchronized (walletLock) {
if (!walletExists()) {
Expand Down Expand Up @@ -2675,7 +2677,7 @@ else if (hasFailedTx && isPayoutPublished()) {
pollInProgress = false;
}
}
requestSaveWallet();
saveWalletWithDelay();
}
}

Expand Down
19 changes: 18 additions & 1 deletion core/src/main/java/haveno/core/xmr/wallet/XmrWalletBase.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,13 @@ public abstract class XmrWalletBase {
// constants
public static final int SYNC_PROGRESS_TIMEOUT_SECONDS = 120;
public static final int DIRECT_SYNC_WITHIN_BLOCKS = 100;
public static final int SAVE_WALLET_DELAY_SECONDS = 300;

// inherited
protected MoneroWallet wallet;
@Getter
protected final Object walletLock = new Object();
protected Timer saveWalletDelayTimer;
@Getter
protected XmrConnectionService xmrConnectionService;
protected boolean wasWalletSynced;
Expand Down Expand Up @@ -146,8 +148,23 @@ public boolean requestSwitchToNextBestConnection(MoneroRpcConnection sourceConne
return false;
}

public void saveWalletWithDelay() {
// delay writing to disk to avoid frequent write operations
if (saveWalletDelayTimer == null) {
saveWalletDelayTimer = UserThread.runAfter(() -> {
requestSaveWallet();
UserThread.execute(() -> saveWalletDelayTimer = null);
}, SAVE_WALLET_DELAY_SECONDS, TimeUnit.SECONDS);
}
}

// --------------------------------- ABSTRACT -----------------------------

public abstract void saveWallet();

public abstract void requestSaveWallet();

protected abstract void onConnectionChanged(MoneroRpcConnection connection);


// ------------------------------ PRIVATE HELPERS -------------------------

Expand Down
32 changes: 18 additions & 14 deletions core/src/main/java/haveno/core/xmr/wallet/XmrWalletService.java
Original file line number Diff line number Diff line change
Expand Up @@ -245,16 +245,20 @@ public long getWalletCreationDate() {
return user.getWalletCreationDate();
}

public void saveMainWallet() {
saveMainWallet(!(Utilities.isWindows() && wallet != null));
@Override
public void saveWallet() {
saveWallet(!(Utilities.isWindows() && wallet != null));
}

public void saveMainWallet(boolean backup) {
saveWallet(getWallet(), backup);
public void saveWallet(boolean backup) {
synchronized (walletLock) {
saveWallet(getWallet(), backup);
}
}

public void requestSaveMainWallet() {
ThreadUtils.submitToPool(() -> saveMainWallet()); // save wallet off main thread
@Override
public void requestSaveWallet() {
ThreadUtils.submitToPool(() -> saveWallet()); // save wallet off main thread
}

public boolean isWalletAvailable() {
Expand Down Expand Up @@ -443,7 +447,7 @@ public MoneroTxWallet createTx(MoneroTxConfig txConfig) {
if (Boolean.TRUE.equals(txConfig.getRelay())) {
cachedTxs.addFirst(tx);
cacheWalletInfo();
requestSaveMainWallet();
requestSaveWallet();
}
return tx;
}
Expand All @@ -453,7 +457,7 @@ public MoneroTxWallet createTx(MoneroTxConfig txConfig) {
public String relayTx(String metadata) {
synchronized (walletLock) {
String txId = wallet.relayTx(metadata);
requestSaveMainWallet();
requestSaveWallet();
return txId;
}
}
Expand Down Expand Up @@ -552,7 +556,7 @@ public void freezeOutputs(Collection<String> keyImages) {
// freeze outputs
for (String keyImage : unfrozenKeyImages) wallet.freezeOutput(keyImage);
cacheWalletInfo();
requestSaveMainWallet();
requestSaveWallet();
}
}

Expand All @@ -574,7 +578,7 @@ public void thawOutputs(Collection<String> keyImages) {
// thaw outputs
for (String keyImage : frozenKeyImages) wallet.thawOutput(keyImage);
cacheWalletInfo();
requestSaveMainWallet();
requestSaveWallet();
}
}

Expand Down Expand Up @@ -1411,14 +1415,14 @@ private void doMaybeInitMainWallet(boolean sync, int numSyncAttempts) {
HavenoUtils.havenoSetup.getWalletInitialized().set(true);

// save but skip backup on initialization
saveMainWallet(false);
saveWallet(false);
} catch (Exception e) {
if (isClosingWallet || isShutDownStarted || HavenoUtils.havenoSetup.getWalletInitialized().get()) return; // ignore if wallet closing, shut down started, or app already initialized
log.warn("Error initially syncing main wallet: {}", e.getMessage());
if (numSyncAttempts <= 1) {
log.warn("Failed to sync main wallet. Opening app without syncing", numSyncAttempts);
HavenoUtils.havenoSetup.getWalletInitialized().set(true);
saveMainWallet(false);
saveWallet(false);

// reschedule to init main wallet
UserThread.runAfter(() -> {
Expand Down Expand Up @@ -1796,7 +1800,7 @@ private void changeWalletPasswords(String oldPassword, String newPassword) {
tasks.add(() -> {
try {
wallet.changePassword(oldPassword, newPassword);
saveMainWallet();
saveWallet();
} catch (Exception e) {
log.warn("Error changing main wallet password: " + e.getMessage() + "\n", e);
throw e;
Expand Down Expand Up @@ -1989,7 +1993,7 @@ else if (isWalletConnectedToDaemon()) {
if (wallet != null && !isShutDownStarted) {
try {
cacheWalletInfo();
requestSaveMainWallet();
saveWalletWithDelay();
} catch (Exception e) {
log.warn("Error caching wallet info: " + e.getMessage() + "\n", e);
}
Expand Down

0 comments on commit 60a3e97

Please sign in to comment.