mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2026-08-11 16:57:39 +00:00
The Marmot subscription since, the processed-event dedup set, and the application ratchet position (group state persists only at commits) are all in-memory only. On restart, relays therefore redeliver the group's entire kind:445 history and the rewound ratchet re-decrypts old application messages as if they had just arrived — wasted decryption work and, when a replay beats the disk restore, duplicate entries appended to the persisted plaintext message log. Two defenses: - MarmotManager.restoreAll() now seeds each restored group's subscription since from the newest persisted decrypted message, minus a one-day overlap window for late/out-of-order publishes. Seeding happens before syncWithGroupManager registers default entries, so even the first filter set sent to relays carries it. The CLI is unaffected: it builds group filters from its own persisted since. - MarmotMessageStore appends are now explicitly idempotent (contract was previously ambiguous and both real stores appended blindly): the Android and CLI file stores skip an entry that is already in the group's log, so replays inside the overlap window cannot grow it. Covered by MarmotManagerRestoreTest in commons jvmTest — placed there rather than androidHostTest because CI only runs :commons:jvmTest (the androidHostTest task currently fails on android.util.Log stubs even for the pre-existing Marmot test).