Skip to content

refactor: extract shared request-termination helper - #448

Merged
ubettigole merged 2 commits into
mainfrom
abettigole/request_terminator
Jul 28, 2026
Merged

refactor: extract shared request-termination helper#448
ubettigole merged 2 commits into
mainfrom
abettigole/request_terminator

Conversation

@ubettigole

@ubettigole ubettigole commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Summary

Extract the duplicated "transition a request to a terminal state and publish its terminal log" logic into a single TerminateRequest helper in submitqueue/core/request, and route conclude, dlq, cancel, and validate through it.

Changes:

  • Add corerequest.TerminateRequest(ctx, store, registry, requestID, targetState, lastError, metadata) that performs the idempotent 3-way CAS (success / already-target-state / diverged / not-found), publishes the terminal RequestLog, and returns a TerminationResult{Outcome, BeforeState, AfterState} plus a separate error. Version arithmetic stays caller-side and storage.ErrVersionMismatch is passed through as retryable.
  • Replace terminalStateToStatus's switch with a terminalStatusByState map lookup.
  • conclude: reconcile each batch member through the helper, keeping per-outcome logs and metrics at the call site. A request referenced by the batch but missing from the store stays a hard error (retry, eventually DLQ).
  • dlq: failRequest now delegates to the helper, keeping its NotFound tolerance and its reconcile/divergence log messages.
  • cancel: cancelRequest delegates to the helper (Cancelling to Cancelled); the helper's re-read reports divergence cleanly instead of a spurious version-mismatch retry.
  • validate: on an expected rejection (duplicate detected or custom validator failure), terminate the request to Error and ack instead of dead-lettering it; genuine infra failures still return errors so they go to the DLQ.
  • Add table-driven tests for TerminateRequest and update the conclude, cancel, and validate tests.

Co-Authored-By: Claude Opus 4.8 (1M context) [email protected]

Test Plan

Unit tests

Issues

Extract the duplicated "transition a request to a terminal state and publish its terminal log" logic into a single TerminateRequest helper in submitqueue/core/request, and route conclude, dlq, cancel, and validate through it.

Changes:
- Add corerequest.TerminateRequest(ctx, store, registry, requestID, targetState, lastError, metadata) that performs the idempotent 3-way CAS (reconcile / already-terminal / diverged / not-found), publishes the terminal RequestLog, and returns a TerminationResult{Outcome, BeforeState, AfterState} plus a separate error. Version arithmetic stays caller-side and storage.ErrVersionMismatch is passed through as retryable.
- Replace terminalStateToStatus's switch with a terminalStatusByState map lookup.
- conclude: reconcile each batch member through the helper, keeping per-outcome logs and metrics at the call site. A request referenced by the batch but missing from the store stays a hard error (retry, eventually DLQ).
- dlq: failRequest now delegates to the helper, keeping its NotFound tolerance and its reconcile/divergence log messages.
- cancel: cancelRequest delegates to the helper (Cancelling to Cancelled); the helper's re-read reports divergence cleanly instead of a spurious version-mismatch retry.
- validate: on an expected rejection (duplicate detected or custom validator failure), terminate the request to Error and ack instead of dead-lettering it; genuine infra failures still return errors.
- Add table-driven tests for TerminateRequest and update the conclude, cancel, and validate tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
@ubettigole
ubettigole force-pushed the abettigole/request_terminator branch from 074719d to c8f16da Compare July 27, 2026 23:37
@ubettigole
ubettigole marked this pull request as ready for review July 27, 2026 23:37
@ubettigole
ubettigole requested review from a team, behinddwalls and sbalabanov as code owners July 27, 2026 23:37
@ubettigole
ubettigole added this pull request to the merge queue Jul 28, 2026
Merged via the queue into main with commit 6c828b8 Jul 28, 2026
15 checks passed
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