Skip to content

[fm] Introduce SitrepGuardedInsert.#10564

Merged
mergeconflict merged 3 commits into
mainfrom
mergeconflict/fm-sitrepguardedinsert
Jun 10, 2026
Merged

[fm] Introduce SitrepGuardedInsert.#10564
mergeconflict merged 3 commits into
mainfrom
mergeconflict/fm-sitrepguardedinsert

Conversation

@mergeconflict

@mergeconflict mergeconflict commented Jun 8, 2026

Copy link
Copy Markdown
Contributor

Add the SitrepGuardedInsert Diesel combinator and the SitrepGuardedResource trait: a generic primitive for FM rendezvous to insert a resource row idempotently and guarded against stale-sitrep execution.

The combinator wraps a caller-supplied resource INSERT in a single CTE statement that:

  • aborts (StaleSitrep) unless the executor's expected generation still equals the latest sitrep's generation column;
  • short-circuits (AlreadyExists) if a creation marker already exists for the resource id;
  • on a successful insert, atomically writes a creation marker.

The result is surfaced as a SitrepGuardedInsertOutcome of Created / AlreadyExists / StaleSitrep.

Context: #10248. This PR was previously #10532 but I made a mess of it. This is used in #10533 and #10535 which are split out in hopes of making the review somewhat less miserable.

Add the `SitrepGuardedInsert` Diesel combinator and the
`SitrepGuardedResource` trait: a generic primitive for FM rendezvous to
insert a resource row idempotently and guarded against stale-sitrep
execution.

The combinator wraps a caller-supplied resource INSERT in a single CTE
statement that:

  - aborts (StaleSitrep) unless the executor's expected generation still
    equals the latest sitrep's generation column;
  - short-circuits (AlreadyExists) if a creation marker already exists for
    the resource id;
  - on a successful insert, atomically writes a creation marker, gated by
    `WHERE EXISTS (SELECT 1 FROM new_resource)` so a marker is never
    fabricated for a pre-existing row.

All spliced SQL identifiers come from the trait's `&'static str` consts, so
the query is injection-safe. The result is surfaced as a
`SitrepGuardedInsertOutcome` of Created / AlreadyExists / StaleSitrep.
@mergeconflict mergeconflict requested review from hawkw and smklein June 8, 2026 18:00
@mergeconflict mergeconflict self-assigned this Jun 8, 2026
@mergeconflict mergeconflict added the fault-management Everything related to the fault-management initiative (RFD480 and others) label Jun 8, 2026
@mergeconflict mergeconflict added this to the 21 milestone Jun 8, 2026
Comment thread nexus/db-queries/src/db/sitrep_guard.rs Outdated
Comment thread nexus/db-queries/src/db/sitrep_guard.rs
Comment thread nexus/db-queries/src/db/sitrep_guard.rs Outdated
Comment thread nexus/db-queries/tests/output/sitrep_guarded_insert.sql
@mergeconflict mergeconflict requested a review from smklein June 8, 2026 20:13

@smklein smklein left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remember to hold off on merging until the gate re-opens, but otherwise LGTM

@mergeconflict mergeconflict merged commit 1cad20c into main Jun 10, 2026
18 checks passed
@mergeconflict mergeconflict deleted the mergeconflict/fm-sitrepguardedinsert branch June 10, 2026 14:44
hawkw pushed a commit that referenced this pull request Jun 10, 2026
Add the `SitrepGuardedInsert` Diesel combinator and the
`SitrepGuardedResource` trait: a generic primitive for FM rendezvous to
insert a resource row idempotently and guarded against stale-sitrep
execution.

The combinator wraps a caller-supplied resource INSERT in a single CTE
statement that:

- aborts (StaleSitrep) unless the executor's expected generation still
equals the latest sitrep's generation column;
- short-circuits (AlreadyExists) if a creation marker already exists for
the resource id;
  - on a successful insert, atomically writes a creation marker.

The result is surfaced as a `SitrepGuardedInsertOutcome` of `Created` /
`AlreadyExists` / `StaleSitrep`.

Context: #10248. This PR
was previously #10532 but I made a mess of it. This is used in
#10533 and
#10535 which are split out
in hopes of making the review somewhat less miserable.
mergeconflict added a commit that referenced this pull request Jun 12, 2026
The existing tests for `SitrepGuardedInsert` (from #10564) all ran
against a single-sitrep history, which can't distinguish "the guard
compares against the current sitrep" from "the guard matches any sitrep
in history". This change adds a new parent sitrep in a couple places to
provide better coverage for the guard's behavior.

While we're at it, we also add a brand new test ensuring that we fail
closed in the unexpected case where sitrep history is empty.
mergeconflict added a commit that referenced this pull request Jun 18, 2026
Wire the alert resource through `SitrepGuardedInsert`:

  - `impl SitrepGuardedResource for Alert`;
- schema: `alert_generation` on `fm_sitrep` and the
`rendezvous_alert_created` marker table (migration
fm-alert-resource-deletion);
- `alert_create`'s FM path routes through the combinator, surfacing a
stale sitrep as `Error::Conflict`;
- `SitrepBuilder` tracks `alert_generation`, bumping it when the
outstanding alert-request set changes; the closed-case carry-forward
filter drops fully-satisfied closed cases and keeps those with
unsatisfied alert requests;
- fm_rendezvous reads the expected generation and aborts the alert loop
on a stale mismatch; fm_analysis loads existing markers to drive
carry-forward; omdb displays the new status fields and generation.

Context: #10248, builds on #10564.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

fault-management Everything related to the fault-management initiative (RFD480 and others)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants