mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2026-08-10 08:27:04 +00:00
Reviewer davotoula (PR #3483) flagged two commons/relayClient issues on FeedMetadataCoordinator that both bite the Android app once WoT is wired there: 5. loadKind3Batched / loadMetadataBatched marked pubkeys as sent BEFORE any relay EOSE'd. On flaky-network cold-starts where every index relay timed out, the pubkeys stayed permanently marked and WoT was silently empty for the whole session — the next call short-circuited. Fix: pubkeys enter `queuedKind3Pubkeys` / `queuedPubkeys` only after ≥1 EOSE; on zero-EOSE timeout they roll out of the new `inFlightBatched*` sets so a subsequent call retries. 6. `val eoseReceived = mutableSetOf<NormalizedRelayUrl>()` was mutated from per-relay `onEose` callbacks the client dispatches on `Dispatchers.IO`. Concurrent `add()`/`size` on an unsynchronised HashSet could drop entries or throw CME, forcing the batch to wait the full timeout instead of firing early. Fix: `BatchEoseGate` funnels EOSE notifications through a `Channel` so a single consumer coroutine is the sole reader/writer of the `seen` set — KMP-safe, no `synchronized {}` or JVM-only atomics. Tests exercise: - zero-EOSE timeout → retry re-fires - ≥1 EOSE → next call short-circuits - full-EOSE from 20 relays hammered from Dispatchers.IO in parallel - clear() releases in-flight dedup - same semantics on loadMetadataBatched Plan: commons/plans/2026-07-06-fix-wot-outbox-model-and-review-fixes-plan.md