Replace failure groups only for the batch's newest attempt - #5694
Open
johnsimons wants to merge 1 commit into
Open
Replace failure groups only for the batch's newest attempt#5694johnsimons wants to merge 1 commit into
johnsimons wants to merge 1 commit into
Conversation
Ingestion replaces a message's failure group rows wholesale on every attempt, matching how the Raven persister assigns FailureGroups, so a message that fails again with a different exception moves to the group its latest attempt was classified into. The upsert only lets an attempt supply the payload columns when it is at least as new as the stored one, but the group replacement had no such guard. An older attempt arriving late from a concurrent writer therefore left the row describing one failure and the group rows describing another. Group replacement now applies only to the messages the batch is the newest attempt for, established by reading back the stored LastAttemptedAt inside the batch transaction, where the upsert already holds a row lock on every message involved. The read back compares with <= rather than ==, because PostgreSQL stores timestamps at microsecond precision while DateTime has 100ns ticks. Truncation is monotonic and applies to both sides of the upsert's own guard, so the two stay in step at any column precision.
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.
Ingestion replaces a message's failure group rows wholesale on every attempt, matching how the Raven persister assigns FailureGroups, so a message that fails again with a different exception moves to the group its latest attempt was classified into.
The upsert only lets an attempt supply the payload columns when it is at least as new as the stored one, but the group replacement had no such guard. An older attempt arriving late from a concurrent writer therefore left the row describing one failure and the group rows describing another. Group replacement now applies only to the messages the batch is the newest attempt for, established by reading back the stored LastAttemptedAt inside the batch transaction, where the upsert already holds a row lock on every message involved.
The read back compares with <= rather than ==, because PostgreSQL stores timestamps at microsecond precision while DateTime has 100ns ticks. Truncation is monotonic and applies to both sides of the upsert's own guard, so the two stay in step at any column precision.