Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

reduce disk usage saving wallet files #1510

Merged
merged 2 commits into from
Dec 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
38 changes: 21 additions & 17 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 @@ -376,17 +380,17 @@ public void saveWallet(MoneroWallet wallet) {
}

public void saveWallet(MoneroWallet wallet, boolean backup) {
wallet.save();
if (backup) backupWallet(getWalletName(wallet.getPath()));
wallet.save();
}

public void closeWallet(MoneroWallet wallet, boolean save) {
log.info("{}.closeWallet({}, {})", getClass().getSimpleName(), wallet.getPath(), save);
MoneroError err = null;
String path = wallet.getPath();
try {
wallet.close(save);
if (save) backupWallet(getWalletName(path));
if (save) saveWallet(wallet, true);
wallet.close();
} catch (MoneroError e) {
err = e;
}
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 @@ -1424,14 +1428,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 @@ -1809,7 +1813,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 @@ -2002,7 +2006,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
Loading