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

   Fixes #17392
   
   ### Motivation
   
   All timers in `ProducerImpl` are `std::shared_ptr` objects that can be
   reset with `nullptr` in `ProducerImpl::cancelTimers`. It could lead to
   null pointer access in some cases.
   
   See
   https://github.com/apache/pulsar/issues/17392#issuecomment-1233929427
   for the analysis.
   
   Generally it's not necessary to hold a nullable pointer to the timer.
   However, to resolve the cyclic reference issue, #5246 reset the shared
   pointer to reduce the reference count manually. It's not a good solution
   because we have to perform null check for timers everywhere. The null
   check still has some race condition issue like:
   
   Thread 1:
   
   ```c++
   if (timer) {  // [1] timer is not nullptr
       timer->async_wait(/* ... */);  // [3] timer is null now, see [2] below
   }
   ```
   
   Thread 2:
   
   ```c++
   timer.reset();  // [2]
   ```
   
   The best solution is to capture `weak_ptr` in timer's callback and call
   `lock()` to check if the referenced object is still valid.
   
   ### Modifications
   - Change the type of `sendTimer_` and `batchTimer_` to `deadline_timer`,
     not a `shared_ptr`.
   - Use `PeriodicTask` instead of the `deadline_timer` for token refresh.
   - Migrate `weak_from_this()` method from C++17 and capture
     `weak_from_this()` instead of `shared_from_this()` in callbacks.
   
   ### Verifying this change
   
   Run the `testResendViaSendCallback` for many times and we can see it
   won't fail after this patch.
   
   ```bash
   ./tests/main --gtest_filter='BasicEndToEndTest.testResendViaSendCallback' 
--gtest_repeat=30
   ```
   
   ### Documentation
   
   Check the box below or label this PR directly.
   
   Need to update docs? 
   
   - [ ] `doc-required` 
   (Your PR needs to update docs and you will update later)
     
   - [x] `doc-not-needed` 
   (Please explain why)
     
   - [ ] `doc` 
   (Your PR contains doc changes)
   
   - [ ] `doc-complete`
   (Docs have been already added)


-- 
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