From f8c0fa63c0d11d7ee555ae4de454c94f50bded8b Mon Sep 17 00:00:00 2001 From: Ricardo Guilherme Schmidt <3esmit@gmail.com> Date: Fri, 17 Jul 2026 20:10:31 -0300 Subject: [PATCH] fix(amm): cancel cached reads on endpoint change --- apps/amm/src/SequencerClient.cpp | 7 ++++++- apps/amm/tests/cpp/NewPositionRuntimeTest.cpp | 13 +++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/apps/amm/src/SequencerClient.cpp b/apps/amm/src/SequencerClient.cpp index 54083ef..94c0e79 100644 --- a/apps/amm/src/SequencerClient.cpp +++ b/apps/amm/src/SequencerClient.cpp @@ -163,8 +163,13 @@ void SequencerClient::readAccount(const QString& accountId, m_cache.remove(accountId); if (!forceRefresh && m_cache.contains(accountId)) { const WalletAccountRead cached = m_cache.value(accountId); + const quint64 generation = m_generation; QTimer::singleShot(0, this, - [callback = std::move(callback), cached]() mutable { callback(cached); }); + [this, callback = std::move(callback), cached, accountId, + generation]() mutable { + callback(generation == m_generation + ? cached : WalletAccountRead { accountId }); + }); return; } if (forceRefresh && m_activeReadIds.contains(accountId)) { diff --git a/apps/amm/tests/cpp/NewPositionRuntimeTest.cpp b/apps/amm/tests/cpp/NewPositionRuntimeTest.cpp index e83b255..84b5386 100644 --- a/apps/amm/tests/cpp/NewPositionRuntimeTest.cpp +++ b/apps/amm/tests/cpp/NewPositionRuntimeTest.cpp @@ -531,6 +531,13 @@ int main(int argc, char** argv) "forced-refresh sequencer should listen")) return 1; forcedRefreshServer.holdResponses(); + bool staleCachedCompleted = false; + QVector staleCachedRead; + sequencer.readAccounts({ holding.address }, false, + [&](QVector reads) { + staleCachedRead = std::move(reads); + staleCachedCompleted = true; + }); if (!expect(sequencerConfig.resize(0) && sequencerConfig.seek(0), "forced-refresh config should rewind")) return 1; @@ -541,6 +548,12 @@ int main(int argc, char** argv) if (!expect(sequencer.configure(sequencerConfig.fileName()), "forced-refresh sequencer should configure")) return 1; + QCoreApplication::processEvents(QEventLoop::AllEvents, 10); + if (!expect(staleCachedCompleted + && staleCachedRead.size() == 1 + && !staleCachedRead.constFirst().ok(), + "cached read should fail after sequencer reconfiguration")) + return 1; bool ordinaryCompleted = false; bool forcedCompleted = false;