fix #254 Channel.Publish blocks indefinitely #508
  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 ConditionerwithVery Bad Networkconfig)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.mis 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
Publishneeds 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.