fix: acknowledge maintenance outputs after publication - #605
Merged
Merged
Conversation
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.
Maintenance DAG outputs were marked published before the downstream store accepted them. If the store failed, retrying the same lineage silently skipped its state.
Before this PR, a temporary store failure followed by replay could produce zero accepted outputs. After this PR, each maintained output is acknowledged only after the store accepts it; retry skips accepted outputs and resends failed ones. A registry lock makes the acceptance/acknowledgement boundary exclusive across concurrent retries. Unmaintained batches keep the ordinary batched sink path.
Verification: the new installed-DAG/fail-once-sink regression failed on the original implementation (zero accepted outputs instead of one). All three maintenance runtime tests pass after the fix, including failure before any acceptance and failure after the first output in a two-output batch. Direct rustfmt and
git diff --checkpass.Scope: this preserves in-process retry idempotency. Durable restart recovery and bounded commit-registry retention remain separate work. Maintained outputs are submitted individually because the generic sink does not return per-output batch acceptance; a sink that accepts a write and then reports failure still needs its own idempotent storage contract. No throughput improvement is claimed.