[fix][broker] Fix currently client retries until operation timeout if the topic does not exist #23530
+67
−13
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
#23291 introduces a regression that when the authentication is enabled, if the topic does not exist and cannot be automatically created (e.g. namespace does not exist), broker will respond with a
ServerError.MetadataError
that is converted to a trivialPulsarClientException
, which is not retriable. In this case, the client will loop in sending thePartitionMetadata
request and failing until the operation timeout happens (30 seconds by default)Besides,
PulsarClientImpl#checkPartitions
is incorrect. Even ifforceNoPartitioned
is false,checkPartitions.complete(0)
will still be called.Because
a && b || c || d
is true whena
andb
are false whilec
is true. Without this fix, the producer creation on a topic whose namespace does not exist will fail withAuthorizationError
because it will go to the topic lookup phase.This is not an expected result because the case that the error is not retriable and the timeout error is confusing to users.
Modifications
ServerError.TopicNotFound
whenisTopicOperationAllowed
fails with HTTP 404 error.PulsarClientImpl#checkPartitions
.testTopicNotFound
to cover the fixes above.testNamespaceNotExist
Documentation
doc
doc-required
doc-not-needed
doc-complete
Matching PR in forked repository
PR in forked repository: