[fix][client]Orphan producer when concurrency calling producer closing and reconnection #23853
+155
−52
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.
Motivation
background 1: producer's reconnection[1]
null
closing | closed
connecting
background 2: steps of producer closing[2]
connection
is null:closed
connection
is present:closed
Issue 1: closed producers were reverted mistakenly: the steps to reproduce the issue are as follows
reconnection
close producer
null
closing
null
nowclose
connecting
You can reproduce the issue by
testConcurrencyReconnectAndClose
Issue 2: resending messages encountered a recycled pending message
reconnection
close producer
null
closing
null
nowconnecting
close
logs that encountered the issue 2
Modifications
state
atomically when callingreconnection
, see https://github.com/apache/pulsar/compare/master...poorbarcode:fix/producer_race_condition?expand=1#diff-bcd53f63180847515f1fe1d5b00deb218d023cbfe9cbfade19b44c2babd734ffR194-L196producer. pendingMessages
fails all pending sends when producer.connection is null
to reconnect successfully, which was introduced by [Fix][Client] Fix pending message not complete when closeAsync #23761Documentation
doc
doc-required
doc-not-needed
doc-complete
Matching PR in forked repository
PR in forked repository: x