Skip to content

feat(stovepipe): extend fixers to batch issues across multiple backends - #1033

Merged
mnoah1 merged 1 commit into
mnoah1/stovepipe-repair-statefrom
mnoah1/stovepipe-batch-repairs
Nov 10, 2026
Merged

mnoah1 merged 1 commit into
mnoah1/stovepipe-repair-statefrom
mnoah1/stovepipe-batch-repairs

Conversation

@mnoah1

@mnoah1 mnoah1 commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

Why?

The existing fix controller selects one eligible issue and suppresses further submissions once any issue in the build has a fix ID. That build-wide limit prevents newly opened issues and additional fixer backends from receiving independent repair requests.

What?

Replace the build-wide gate with eligibility per issue opening and executor. Read every page of the build's observations, select still-open issues first seen in that build, and offer each registered executor all of its pending issues in one Submit call. Each backend chooses how to group submissions and enforce its own limits; a failure in one backend does not suppress another.

Extend the fixer contract to return stable, named executor registrations and accept batches of issue openings. Each submission receipt identifies an accepted fix ID or terminal skip; several issues may share one fix ID. Create pending repair rows before submission, retain valid receipts even alongside errors, preserve executor metadata through versioned updates, and restore history on replay without resubmitting durable outcomes.

Migrate the controller, reference-server wiring, and DLQ recovery together to the storage from #1032. DLQ recovery restores every durable acceptance or skip, records unknown acceptance for pending work, and never submits repair work.

Test Plan

./tool/bazel test //stovepipe/... //service/stovepipe/server:go_default_test --test_output=errors passes all 30 test targets. The fix-controller tests exercise paginated batches, independent backends, partial acceptance, failed pending writes preventing dispatch, metadata preservation during version conflicts, retry without resubmitting durable outcomes, preserved retry classification, and DLQ recovery of accepted, skipped, and unknown outcomes without submitting work. Local lint, module-tidy, Gazelle, and mock-generation checks pass.

Full repository Bazel build (./tool/bazel build //...) passes all 643 targets, including both web images.

Revert Plan

Revert this PR as one unit to restore the previous fixer contract, dispatch, and DLQ recovery behavior. The storage foundation in #1032 and its additive table can remain.

Issue Links

None — completes the fixer extension on top of #1032; no issue was provided.

Stack

  1. feat(stovepipe): store fixer submissions per issue and backend #1032
  2. @ feat(stovepipe): extend fixers to batch issues across multiple backends #1033

@mnoah1
mnoah1 force-pushed the mnoah1/stovepipe-batch-repairs branch from 05e1426 to 1148984 Compare November 6, 2026 22:11
@mnoah1
mnoah1 changed the base branch from mnoah1/stovepipe-repair-state to mnoah1/stovepipe-fixer-contract November 6, 2026 22:11
@mnoah1
mnoah1 added this pull request to stack #1038 November 6, 2026 22:26
@mnoah1 mnoah1 changed the title feat(stovepipe): dispatch pending issues to named batch repair executors feat(stovepipe): offer newly opened issues to every registered fixer Nov 6, 2026
@mnoah1
mnoah1 marked this pull request as ready for review November 6, 2026 22:31
@mnoah1
mnoah1 requested review from a team, behinddwalls and sbalabanov as code owners November 6, 2026 22:31
@mnoah1
mnoah1 removed this pull request from stack #1038 November 10, 2026 17:14
Summary:
Resolve named fixer registrations and offer each backend its pending issue openings in one batch. Create repair rows before dispatch, retain per-issue acceptance or skips, preserve executor-owned metadata, and restore durable history without resubmitting recorded work. Migrate the contract, controller, reference-server wiring, and DLQ recovery together so dispatch and recovery use the same per-executor records.

Test Plan:
Run the Stovepipe and reference-server Bazel suite covering pagination, independent backends, partial acceptance, pending writes, metadata version conflicts, history replay, and DLQ recovery without submission. Run lint, tidy, Gazelle, and mock generation checks. GitHub CI validates all builds and integration tests.

Revert Plan:
Revert this PR as one unit to restore the previous fixer contract, dispatch, and recovery behavior. The storage foundation and additive table can remain.
@mnoah1
mnoah1 force-pushed the mnoah1/stovepipe-batch-repairs branch from 1148984 to da4488f Compare November 10, 2026 17:15
@mnoah1 mnoah1 changed the title feat(stovepipe): offer newly opened issues to every registered fixer feat(stovepipe): extend fixers to batch issues across multiple backends Nov 10, 2026
@mnoah1
mnoah1 changed the base branch from mnoah1/stovepipe-fixer-contract to mnoah1/stovepipe-repair-state November 10, 2026 17:15
@mnoah1
mnoah1 added this pull request to stack #1068 November 10, 2026 17:16
@mnoah1
mnoah1 added this pull request to the merge queue Nov 10, 2026
Merged via the queue into main with commit 3daefec Nov 10, 2026
22 checks passed
@mnoah1
mnoah1 deleted the mnoah1/stovepipe-batch-repairs branch November 10, 2026 17:45
Tmwakalasya pushed a commit to Tmwakalasya/submitqueue that referenced this pull request Nov 11, 2026
…1032)

## Why?

The existing fixer flow stores one fix ID on a build issue. That cannot
independently track several backends repairing the same issue opening,
or retain backend metadata before a submission is accepted. Extending
the fixer to multiple issues and backends needs durable state for each
issue/backend pair.

## What?

Add an `IssueRepair` record and queue-scoped store keyed by issue
opening and executor ID, with a MySQL schema, generated mocks, and
storage tests. Each row retains an accepted fix ID or terminal skip
reason, executor-owned `map[string]string` metadata, and a version for
conditional updates. Empty fix ID and skip reason mean the submission is
pending.

This PR provides the storage foundation while preserving existing
dispatch behavior. uber#1033 extends the fixer contract, dispatch, and DLQ
recovery together to use these records independently for each backend.

## Test Plan
`./tool/bazel test //stovepipe/...
//service/stovepipe/server:go_default_test --test_output=errors` passes
all 30 targets, including pending creation, metadata round trips,
accepted/skipped updates, stale-version rejection, and existing service
wiring. Local lint, module-tidy, Gazelle, and mock-generation checks
pass.

Full repository Bazel build (`./tool/bazel build //...`) passes all 643
targets, including both web images.

## Revert Plan
Revert dependent dispatcher changes first, then revert this PR. The
additive table can remain.

## Issue Links

None — storage foundation for uber#1033; no issue was provided.

## Stack

1. @ uber#1032
1. uber#1033
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants