BewareMyPower opened a new pull request, #15161:
URL: https://github.com/apache/pulsar/pull/15161

   Fixes #15078
   
   ### Motivation
   
   When a partitioned producer is created and some of the partitioned
   failed to create, `closeAsync` will be called immediately, even if other
   partitions were still in progress of creating the associated single
   producers.
   
   Since `closeAsync` is called before calling `setFailed` on the
   `partitionedProducerCreatedPromise_` field, there is a race condition
   that all single producers are closed before the promise is set. Then the
   promise will be set with `ResultUnknownError`, see
   
https://github.com/apache/pulsar/blob/4aeeed5dab9dfe9493526f36d539b3ef29cf6fe5/pulsar-client-cpp/lib/PartitionedProducerImpl.cc#L317
   
   ### Modifications
   
   Only after all single producers failed or succeeded then call
   `closeAsync` if one of them failed. And ensure
   `partitionedProducerCreatedPromise_` was completed before calling
   `closeAsync`.
   
   This PR also makes the state of a partitioned producer atomic because
   using a mutex to protect it makes code hard to write.
   
   ### Verifying this change
   
   Create a separate namespace `public/test-backlog-quotas` to test the
   case when the backlog quota exceeds. Then add
   `testBacklogQuotasExceeded` test to make some backlog via creating a
   consumer and sending some messages to a partition of the topic.
   
   In this test, only 1 partition has backlog and will fail with the
   related error. So the test verifies that `createProducer` could return a
   correct error instead of `ResultUnknownError`.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to