Repository navigation
feat(submitqueue): request projection cleanup - write to timestamp-based lookup table - #799
Merged
Merged
Conversation
mnoah1
added this pull request to stack #803
October 7, 2026 17:35
mnoah1
marked this pull request as ready for review
October 7, 2026 17:57
mnoah1
requested review from
a team,
behinddwalls and
sbalabanov
as code owners
October 7, 2026 17:57
mnoah1
force-pushed
the
mnoah1/submitqueue-list-receipt
branch
from
October 7, 2026 17:58
2331282 to
e241aaf
Compare
Summary: First step toward keeping one full request projection in request_summary, with a small time-based lookup instead of duplicating lifecycle data for List. All required response data and receipt time are already captured. ### Changes - Add request_receipt with only (queue, received_at_ms, request_id), its immutable storage contract, and gateway wiring. - Ensure receipt keys after public projection writes, including unchanged/stale-log retries. Keep accepting receipts hidden and surface partial-write failures for existing retry handling. - Keep List reads and the existing queue-summary projection writes in place for a safe cutover. - Add storage, materializer, and integration coverage; document the transition in the RFC. ### Migration plan 1. Deploy the additive table before rolling out these writes. This PR populates receipt keys alongside the existing projection; it does not switch List reads. 2. Upgrade all writers, then backfill existing List membership from request_summary_by_queue keys. Validate keys against public authoritative summaries, exclude accepting receipts, and verify coverage before cutover. 3. In a follow-up, switch List to scan receipt keys and point-read request_summary. Preserve the API, time bounds, ordering, and page tokens; check page latency and keep old projection writes during the rollback window. 4. Once cutover is stable, stop duplicate projection writes, remove RequestQueueSummary and its store/mapper, and retire request_summary_by_queue after the rollback window. The final model stores one full projection plus immutable lookup keys. Backfill tooling, read cutover, and duplicate-data removal are follow-up work. This preserves currently listed history without reconstructing requests predating the original read-model rollout. Test Plan: Before the internal rollout, provision the new table and confirm newly public requests produce matching receipt keys while List continues serving the old projection. Existing automated tests cover retries, concurrency, hidden receipts, and pagination. Revert Plan: Revert the writer rollout; List still uses the existing projection. Leave the additive table in place until no writers depend on it. API Changes: No RPC/proto changes. Gateway storage implementations must provide the new RequestReceiptStore accessor.
mnoah1
force-pushed
the
mnoah1/submitqueue-list-receipt
branch
from
October 7, 2026 18:05
e241aaf to
74e3cc3
Compare
behinddwalls
approved these changes
Oct 7, 2026
Tmwakalasya
pushed a commit
to Tmwakalasya/submitqueue
that referenced
this pull request
Oct 8, 2026
…timestamp and then get request_summary rows (uber#800) ## Summary Builds on uber#799 to serve List from immutable request_receipt keys and authoritative request_summary rows, instead of the duplicated queue-summary projection. ### Changes - Scan receipt keys, then point-read summaries for visible results; keep bounds, string-ID ordering, and page-token format unchanged. - Use the existing RequestSummary response type and wire mapper. - Fail the page on missing, mismatched, or hidden summaries using the existing InternalConsistencyError. - Add controller and gateway integration coverage. Keep legacy projection writes for rollback. ### Rollout Deploy only after uber#799 reaches all writers. No backfill or legacy-read fallback: requests without receipt keys are absent from List. Duplicate-write and old-table removal remain follow-up work. ## Test Plan After CD rollout, confirm new Land requests appear in List with the same summary fields as ID lookup, check continuation pages, and monitor page latency. ## Revert Plan Revert the read cutover to restore the old List path. Legacy projection writes remain active; this PR makes no schema changes. ## API Changes No RPC/proto changes. The Go ListResult now contains RequestSummary values. ## Issue Links None — no separate ticket supplied for this stacked follow-up. ## Stack 1. uber#799 1. @ uber#800 1. uber#801
This branch was previously deployed
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.
Summary
First step toward keeping one full request projection in request_summary, with a small time-based lookup instead of duplicating lifecycle data for List. All required response data and receipt time are already captured.
Changes
Migration plan
Rollout from this PR (CD)
CD deploys the additive request_receipt table and gateway receipt-store/materializer changes, with the table available before receipt writes begin. Public request projections populate receipt keys alongside the existing queue-summary projection. List reads remain unchanged.
Next
Test Plan
After rollout, confirm newly public requests have matching receipt keys while List continues using the existing projection.
Revert Plan
Revert the writer rollout; List still uses the existing projection. Leave the additive table in place until no writers depend on it.
API Changes
No RPC/proto changes. Gateway storage implementations must provide the new RequestReceiptStore accessor.
Issue Links
LINEAR-CODEM-561 — https://linear.app/uber/issue/CODEM-561/clean-up-duplicate-request-projection-in-submitqueue-code
Stack