fix: prevent context timeout when messages delivered successfully - #1448
Open
anakys1997-stack wants to merge 1 commit into
Open
fix: prevent context timeout when messages delivered successfully#1448anakys1997-stack wants to merge 1 commit into
anakys1997-stack wants to merge 1 commit into
Conversation
Implement double-check pattern in Writer.WriteMessages to prevent returning context.DeadlineExceeded when messages have been successfully delivered to the broker. The issue occurred when both ctx.Done() and batch.done channels were ready simultaneously. Go's pseudo-random select could choose ctx.Done() even when the delivery promise held a successful response. The fix adds a non-blocking check on the batch.done channel before returning ctx.Err(), ensuring successful deliveries are not lost. Fixes segmentio#2
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.
Description
Implement double-check pattern in Writer.WriteMessages to prevent returning context.DeadlineExceeded when messages have been successfully delivered to the broker.
Problem
The issue occurred when both ctx.Done() and batch.done channels were ready simultaneously. Go's pseudo-random select could choose ctx.Done() even when the delivery promise held a successful response, causing:
Solution
The fix adds a non-blocking check on the batch.done channel before returning ctx.Err():
go select { case <-done: // Double-check if delivery completed before or concurrently select { case <-batch.done: if batch.err != nil { hasErrors = true } default: return ctx.Err() } case <-batch.done: if batch.err != nil { hasErrors = true } }Testing
Added two unit tests:
Fixes #2