feat(merge): make merge asynchronous via runway#247
Open
behinddwalls wants to merge 1 commit into
Open
Conversation
This was referenced Jun 16, 2026
92d1ef3 to
f89fcb9
Compare
2ee27cf to
a970815
Compare
f89fcb9 to
2b21765
Compare
a970815 to
bc59a27
Compare
2b21765 to
cd3ef63
Compare
bc59a27 to
d9dc61f
Compare
cd3ef63 to
2d17620
Compare
d9dc61f to
7ab64d3
Compare
2d17620 to
4a525e5
Compare
7ab64d3 to
b6042a6
Compare
4a525e5 to
288e995
Compare
b6042a6 to
2a8ea85
Compare
288e995 to
1c0a803
Compare
1c0a803 to
fb39522
Compare
2a8ea85 to
6f9a08f
Compare
This was referenced Jun 17, 2026
6f9a08f to
5d3231c
Compare
fb39522 to
90a02ae
Compare
5d3231c to
eb1ba84
Compare
90a02ae to
39c599f
Compare
eb1ba84 to
eadb853
Compare
39c599f to
9f666f7
Compare
eadb853 to
e77077c
Compare
9f666f7 to
443f9cb
Compare
e77077c to
e0d4543
Compare
443f9cb to
2bad628
Compare
Rework the merge stage from a synchronous in-process pusher call into a runway round-trip, mirroring the merge-conflict check. The merge controller now builds a full runway MergeRequest from the batch's member requests (one MergeStep per request, in Contains order) and publishes it to the runway-owned merger queue, keyed by the batch id as the correlation id. A new mergesignal controller consumes the MergeResult off merger-signal, transitions the batch to Succeeded/Failed, and fans out to conclude and speculate; a mergesignal DLQ reconciler fails the batch on an unprocessable result. The in-process pusher extension is retired from the orchestrator wiring (left in-tree but unused, like mergechecker); removal is a follow-up. workflow.md and extension-contract.md updated to reflect both the check and the merge crossing into runway over the shared MergeRequest/ MergeResult contract.
e0d4543 to
f8bc7f6
Compare
2bad628 to
deee682
Compare
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
Why?
The committing merge ran synchronously inside the orchestrator, blocking the partition lease on a slow, I/O-heavy operation and coupling SubmitQueue to the merger's latency. This moves the merge to an asynchronous round-trip with Runway — mirroring the merge-conflict check (#245), but for the committing merge.
What?
Adds
batch → merge ⇢ (runway) ⇢ mergesignal → conclude/speculate:merge(new) consumes a batch ready to land, builds the fullMergeRequestfrom the batch's member requests (oneMergeStepper request in Contains order, carrying each request's change and land strategy), and publishes it to Runway'smergerqueue keyed by the batch id as the client-owned correlation id.mergesignal(new) consumes Runway'sMergeResultoffmerger-signal, correlates by the echoed id, and transitions the batch toSucceeded(merged) orFailed(could not) — then fans out toconclude(so member requests pick up the outcome) andspeculate(so dependents can re-plan). Purely result-driven; no poll loop.Reuses the Runway merge contract from #260 — the same
MergeRequest/MergeResult, carried on the committingmerger/merger-signaltopics rather than the dry-run check topics. Runway's service implementation is out of scope.Test Plan
./tool/bazel build //..../tool/bazel test //... --test_tag_filters=-integration,-e2e(57 tests pass)Stack