Fix read-after-write race in the web cache#240
Merged
Conversation
DeployexWeb.Cache.set/2 was an asynchronous GenServer.cast while get/1 reads the ETS table directly, so a get right after a set could observe the previous value. This surfaced as a flaky UiSettingsTest failure where the setup wrote the cache and the test read a stale entry. The write is now a synchronous GenServer.call, guaranteeing that any subsequent read observes it. Risk assessment: - Impact: UI settings writes (nav menu toggle) become synchronous. The caller now waits for the cache GenServer, which only does an ETS insert, so the latency is negligible. - Blast radius: DeployexWeb.Cache only; the single caller today is Cache.UiSettings. - Regression risk: very low. A call can time out if the cache server is overloaded, but it handles rare, tiny writes. - Rollback: revert this commit.
thiagoesteves
added a commit
that referenced
this pull request
Jul 8, 2026
…guide (#244) * Update changelog with 0.9.5 entries and document changelog maintenance Add the missing 0.9.5 entries for the merged PRs: #239, #240, #241 and #242 as bug fixes, and #237 (CloudWatch log group retention) as an enhancement. Document the changelog maintenance rules in AGENTS.md so agents know how to add entries, and remove the outdated note that said the changelog must not be edited manually. Risk assessment: - Impact: documentation only, no runtime behavior changes. - Blast radius: CHANGELOG.md and AGENTS.md. - Regression risk: none, docs-only diff. - Rollback: revert this commit. * Updated changelog
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
DeployexWeb.Cache.set/2 was an asynchronous GenServer.cast while get/1 reads the ETS table directly, so a get right after a set could observe the previous value. This surfaced as a flaky UiSettingsTest failure where the setup wrote the cache and the test read a stale entry.
The write is now a synchronous GenServer.call, guaranteeing that any subsequent read observes it.
Risk assessment:
Co-Authored-By: Claude Fable 5 noreply@anthropic.com