perf(wallet): avoid redundant async snapshot saves

This commit is contained in:
Ricardo Guilherme Schmidt
2026-07-17 20:26:29 -03:00
parent 9b72b08c2d
commit 9d4af6a5f7
2 changed files with 29 additions and 12 deletions
+5 -12
View File
@@ -609,18 +609,11 @@ void LogosWalletProvider::loadSnapshotAsync(quint64 generation, SnapshotCallback
state->snapshot.publicAccountReads.append(
state->publicReads.at(index));
}
m_impl->logos->logos_execution_zone.saveAsync(
[this, generation, state](int result) mutable {
if (generation != m_generation)
return;
if (result != WALLET_FFI_SUCCESS)
state->snapshot.failure = WalletFailure::SaveFailed;
if (state->snapshot.ok()) {
m_snapshot = state->snapshot;
m_snapshotReady = true;
}
state->callback(std::move(state->snapshot));
});
if (state->snapshot.ok()) {
m_snapshot = state->snapshot;
m_snapshotReady = true;
}
state->callback(std::move(state->snapshot));
};
if (entries.isEmpty()) {
@@ -52,6 +52,7 @@ private slots:
void adoptsOpenWalletAndCachesSnapshots();
void opensConfiguredWalletWhenNoSharedSessionExists();
void opensAndReadsAsynchronously();
void avoidsSavingAfterUnchangedAsynchronousSnapshots();
void createsAndPersistsWallet();
void validatesCompletePublicAccountPayloads();
void fallsBackToBalanceWhenPublicReadFails();
@@ -182,6 +183,29 @@ void LogosWalletProviderTest::opensAndReadsAsynchronously()
QVERIFY(batchRead);
}
void LogosWalletProviderTest::avoidsSavingAfterUnchangedAsynchronousSnapshots()
{
LogosModules modules;
modules.logos_execution_zone.sequencerAddress = QStringLiteral("http://sequencer");
modules.logos_execution_zone.currentBlockHeight = 12;
modules.logos_execution_zone.lastSyncedBlock = 12;
LogosWalletProvider provider(&modules);
bool connected = false;
provider.connectAsync({}, [&connected](WalletSession session) {
connected = session.ok();
});
QVERIFY(connected);
QCOMPARE(modules.logos_execution_zone.saveCalls, 0);
bool refreshed = false;
provider.snapshotAsync(true, [&refreshed](WalletSnapshot snapshot) {
refreshed = snapshot.ok();
});
QVERIFY(refreshed);
QCOMPARE(modules.logos_execution_zone.saveCalls, 0);
}
void LogosWalletProviderTest::createsAndPersistsWallet()
{
QTemporaryDir directory;