From 2d07483e099b2fe0968505f50ba1d6cc605585d3 Mon Sep 17 00:00:00 2001 From: Matteo Merli Date: Mon, 18 Oct 2021 13:07:12 -0700 Subject: [PATCH 1/2] [C++] Use weak ref to ClientConnection for timeout task --- pulsar-client-cpp/lib/ClientConnection.cc | 24 +++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/pulsar-client-cpp/lib/ClientConnection.cc b/pulsar-client-cpp/lib/ClientConnection.cc index 6f947312f01e6..3118d5c421a1e 100644 --- a/pulsar-client-cpp/lib/ClientConnection.cc +++ b/pulsar-client-cpp/lib/ClientConnection.cc @@ -532,18 +532,26 @@ void ClientConnection::handleResolve(const boost::system::error_code& err, return; } - auto self = shared_from_this(); - connectTimeoutTask_->setCallback([this, self](const PeriodicTask::ErrorCode& ec) { - if (state_ != Ready) { - LOG_ERROR(cnxString_ << "Connection was not established in " << connectTimeoutTask_->getPeriodMs() - << " ms, close the socket"); + auto self = ClientConnectionWeakPtr(shared_from_this()); + + connectTimeoutTask_->setCallback([self](const PeriodicTask::ErrorCode& ec) { + ClientConnectionPtr ptr = self.lock(); + if (!ptr) { + // Connection was already destroyed + return; + } + + if (ptr->state_ != Ready) { + LOG_ERROR(ptr->cnxString_ << "Connection was not established in " + << ptr->connectTimeoutTask_->getPeriodMs() + << " ms, close the socket"); PeriodicTask::ErrorCode err; - socket_->close(err); + ptr->socket_->close(err); if (err) { - LOG_WARN(cnxString_ << "Failed to close socket: " << err.message()); + LOG_WARN(ptr->cnxString_ << "Failed to close socket: " << err.message()); } } - connectTimeoutTask_->stop(); + ptr->connectTimeoutTask_->stop(); }); LOG_DEBUG(cnxString_ << "Connecting to " << endpointIterator->endpoint() << "..."); From f8e53837c4f3abcf8b277a563c70b463539dabc6 Mon Sep 17 00:00:00 2001 From: Matteo Merli Date: Mon, 18 Oct 2021 13:42:56 -0700 Subject: [PATCH 2/2] Fixed formatting --- pulsar-client-cpp/lib/ClientConnection.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pulsar-client-cpp/lib/ClientConnection.cc b/pulsar-client-cpp/lib/ClientConnection.cc index 3118d5c421a1e..4b8a3dc4a420f 100644 --- a/pulsar-client-cpp/lib/ClientConnection.cc +++ b/pulsar-client-cpp/lib/ClientConnection.cc @@ -543,8 +543,7 @@ void ClientConnection::handleResolve(const boost::system::error_code& err, if (ptr->state_ != Ready) { LOG_ERROR(ptr->cnxString_ << "Connection was not established in " - << ptr->connectTimeoutTask_->getPeriodMs() - << " ms, close the socket"); + << ptr->connectTimeoutTask_->getPeriodMs() << " ms, close the socket"); PeriodicTask::ErrorCode err; ptr->socket_->close(err); if (err) {