fix #254 Channel.Publish blocks indefinitely #508
+8
−9
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.
I encountered a bug similar to this comment: #254 (comment)
However, in a weak network environment, I get a deadlock after N+1 messages have been sent where N is the size of the buffered channel.
How to Reproduce:
Network Link Conditioner
withVery Bad Network
config)https://github.com/shanbay/gobay/blob/v0.15.0/extensions/busext/amqp.go#L127)
Then it will deadlock.
The sequence of events is:
One()
->resequence()
->confirm()
send ack to channelOne() get lock
->resequence()
->confirm()
send ack to channel -> block (channel buffer == 1) (and lockconfirms.m
is not released)Publish
-> Failed to get lockThis time it will keep blocking; simply because the buffer is 1 but two acks are received at the same time (although I sent messages serially, we can indeed reproduce this extreme case).
I don't think
Publish
needs to use the same lock as the other methods, it's just a self-incrementing. Even if the program is inresequence()
, there may not be a problem withPublish()
running at this point.