You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by mm...@apache.org on 2021/09/02 16:54:43 UTC

[pulsar] branch master updated: Fix deadlock caused by ExecutorService::close (#11882)

This is an automated email from the ASF dual-hosted git repository.

mmerli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pulsar.git


The following commit(s) were added to refs/heads/master by this push:
     new 43b4ff6  Fix deadlock caused by ExecutorService::close (#11882)
43b4ff6 is described below

commit 43b4ff6aaeef6969c73af6e3742f57554f76e1ca
Author: Yunze Xu <xy...@163.com>
AuthorDate: Fri Sep 3 00:53:12 2021 +0800

    Fix deadlock caused by ExecutorService::close (#11882)
---
 pulsar-client-cpp/lib/ClientConnection.cc | 6 +++++-
 pulsar-client-cpp/lib/ExecutorService.cc  | 8 +++-----
 2 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/pulsar-client-cpp/lib/ClientConnection.cc b/pulsar-client-cpp/lib/ClientConnection.cc
index fc3582d..3f01063 100644
--- a/pulsar-client-cpp/lib/ClientConnection.cc
+++ b/pulsar-client-cpp/lib/ClientConnection.cc
@@ -569,7 +569,11 @@ void ClientConnection::handleRead(const boost::system::error_code& err, size_t b
 
     if (err || bytesTransferred == 0) {
         if (err) {
-            LOG_ERROR(cnxString_ << "Read failed: " << err.message());
+            if (err == boost::asio::error::operation_aborted) {
+                LOG_DEBUG(cnxString_ << "Read failed: " << err.message());
+            } else {
+                LOG_ERROR(cnxString_ << "Read operation was cancelled");
+            }
         }  // else: bytesTransferred == 0, which means server has closed the connection
         close();
     } else if (bytesTransferred < minReadSize) {
diff --git a/pulsar-client-cpp/lib/ExecutorService.cc b/pulsar-client-cpp/lib/ExecutorService.cc
index e056f0f..e0e382b 100644
--- a/pulsar-client-cpp/lib/ExecutorService.cc
+++ b/pulsar-client-cpp/lib/ExecutorService.cc
@@ -73,11 +73,9 @@ void ExecutorService::close() {
 
     io_service_->stop();
     work_.reset();
-    // If this thread is attempting to join itself, do not. The destructor's
-    // call to close will handle joining if it does not occur here. This also ensures
-    // join is not called twice since it is not re-entrant on windows
-    if (std::this_thread::get_id() != worker_.get_id() && worker_.joinable()) {
-        worker_.join();
+    // Detach the worker thread instead of join to avoid potential deadlock
+    if (worker_.joinable()) {
+        worker_.detach();
     }
 }