You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by GitBox <gi...@apache.org> on 2019/10/04 06:34:09 UTC

[GitHub] [pulsar] massakam opened a new pull request #5315: [pulsar-client-cpp] Fix bad_weak_ptr error when closing producer

massakam opened a new pull request #5315: [pulsar-client-cpp] Fix bad_weak_ptr error when closing producer
URL: https://github.com/apache/pulsar/pull/5315
 
 
   Master Issue: #5234
   
   ### Motivation
   
   The other day, I fixed a memory leak caused by not being executed the destructor of C++ producer in #5246. However, when running a producer application written in Go in an environment with the modified C++ client library installed, the program occasionally crashes due to a "bad_weak_ptr" error.
   
   ```
   2019/10/01 16:34:30.210 c_client.go:68: [info] INFO  | ProducerImpl:481 | [persistent://massakam/global/test/t1, dc1-904-1012912] Closing producer for topic persistent://massakam/global/test/t1
   2019/10/01 16:34:30.211 c_client.go:68: [info] INFO  | ProducerImpl:463 | Producer - [persistent://massakam/global/test/t1, dc1-904-1012912] , [batchMessageContainer = { BatchContainer [size = 0] [batchSizeInBytes_ = 0] [maxAllowedMessageBatchSizeInBytes_ = 131072] [maxAllowedNumMessagesInBatch_ = 1000] [topicName = persistent://massakam/global/test/t1] [producerName_ = dc1-904-1012912] [batchSizeInBytes_ = 0] [numberOfBatchesSent = 1] [averageBatchSize = 1]}]
   2019/10/01 16:34:30.211 c_client.go:68: [info] INFO  | BatchMessageContainer:171 | [numberOfBatchesSent = 1] [averageBatchSize = 1]
   terminate called after throwing an instance of 'std::bad_weak_ptr'
     what():  2019/10/01 16:34:30.211 c_client.go:68: [info] INFO  | ProducerImpl:463 | Producer - [persistent://massakam/global/test/t1, dc1-904-1012911] , [batchMessageContainer = { BatchContainer [size = 0] [batchSizeInBytes_ = 0] [maxAllowedMessageBatchSizeInBytes_ = 131072] [maxAllowedNumMessagesInBatch_ = 1000] [topicName = persistent://massakam/global/test/t1] [producerName_ = dc1-904-1012911] [batchSizeInBytes_ = 0] [numberOfBatchesSent = 1] [averageBatchSize = 1]}]
   bad_weak_ptr
   2019/10/01 16:34:30.211 c_client.go:68: [info] INFO  | BatchMessageContainer:171 | [numberOfBatchesSent = 1] [averageBatchSize = 1]
   2019/10/01 16:34:30.211 c_client.go:68: [info] INFO  | ProducerImpl:463 | Producer - [persistent://massakam/global/test/t1, dc1-904-1012910] , [batchMessageContainer = { BatchContainer [size = 0] [batchSizeInBytes_ = 0] [maxAllowedMessageBatchSizeInBytes_ = 131072] [maxAllowedNumMessagesInBatch_ = 1000] [topicName = persistent://massakam/global/test/t1] [producerName_ = dc1-904-1012910] [batchSizeInBytes_ = 0] [numberOfBatchesSent = 1] [averageBatchSize = 1]}]
   SIGABRT: abort
   PC=0x7fc78d39d2c7 m=0 sigcode=18446744073709551610
   ```
   
   As a result of the investigation, I found that the destructor was called before the process of closing `ProducerImpl` was completed, and the object was destroyed.
   
   ### Modifications
   
   To keep the `ProducerImpl` object alive, get its own shared pointer at the beginning of `ProducerImpl::closeAsync()`. And the pointer must be passed to `ProducerImpl::handleClose()`. Otherwise, the object will be destroyed before `handleClose()` is called.
   
   So far, this issue has not been reproduced in `ConsumerImpl`, but I fixed it in the same way as `ProducerImpl`.

----------------------------------------------------------------
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.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services