2424#include < fstream>
2525
2626#include " AsioDefines.h"
27+ #include " ClientImpl.h"
2728#include " Commands.h"
2829#include " ConnectionPool.h"
2930#include " ConsumerImpl.h"
@@ -163,7 +164,7 @@ ClientConnection::ClientConnection(const std::string& logicalAddress, const std:
163164 const ClientConfiguration& clientConfiguration,
164165 const AuthenticationPtr& authentication, const std::string& clientVersion,
165166 ConnectionPool& pool, size_t poolIndex)
166- : operationsTimeout_(std::chrono::seconds (clientConfiguration.getOperationTimeoutSeconds() )),
167+ : operationsTimeout_(ClientImpl::getOperationTimeout (clientConfiguration)),
167168 authentication_ (authentication),
168169 serverProtocolVersion_(proto::ProtocolVersion_MIN),
169170 executor_(executor),
@@ -1278,6 +1279,7 @@ void ClientConnection::close(Result result, bool detach) {
12781279 auto pendingConsumerStatsMap = std::move (pendingConsumerStatsMap_);
12791280 auto pendingGetLastMessageIdRequests = std::move (pendingGetLastMessageIdRequests_);
12801281 auto pendingGetNamespaceTopicsRequests = std::move (pendingGetNamespaceTopicsRequests_);
1282+ auto pendingGetSchemaRequests = std::move (pendingGetSchemaRequests_);
12811283
12821284 numOfPendingLookupRequest_ = 0 ;
12831285
@@ -1342,6 +1344,9 @@ void ClientConnection::close(Result result, bool detach) {
13421344 for (auto & kv : pendingGetNamespaceTopicsRequests) {
13431345 kv.second .setFailed (result);
13441346 }
1347+ for (auto & kv : pendingGetSchemaRequests) {
1348+ kv.second .promise .setFailed (result);
1349+ }
13451350}
13461351
13471352bool ClientConnection::isClosed () const { return state_ == Disconnected; }
@@ -1430,6 +1435,7 @@ Future<Result, NamespaceTopicsPtr> ClientConnection::newGetTopicsOfNamespace(
14301435Future<Result, SchemaInfo> ClientConnection::newGetSchema (const std::string& topicName,
14311436 const std::string& version, uint64_t requestId) {
14321437 Lock lock (mutex_);
1438+
14331439 Promise<Result, SchemaInfo> promise;
14341440 if (isClosed ()) {
14351441 lock.unlock ();
@@ -1438,8 +1444,27 @@ Future<Result, SchemaInfo> ClientConnection::newGetSchema(const std::string& top
14381444 return promise.getFuture ();
14391445 }
14401446
1441- pendingGetSchemaRequests_.insert (std::make_pair (requestId, promise));
1447+ auto timer = executor_->createDeadlineTimer ();
1448+ pendingGetSchemaRequests_.emplace (requestId, GetSchemaRequest{promise, timer});
14421449 lock.unlock ();
1450+
1451+ auto weakSelf = weak_from_this ();
1452+ timer->expires_from_now (operationsTimeout_);
1453+ timer->async_wait ([this , weakSelf, requestId](const ASIO_ERROR& ec) {
1454+ auto self = weakSelf.lock ();
1455+ if (!self) {
1456+ return ;
1457+ }
1458+ Lock lock (mutex_);
1459+ auto it = pendingGetSchemaRequests_.find (requestId);
1460+ if (it != pendingGetSchemaRequests_.end ()) {
1461+ auto promise = std::move (it->second .promise );
1462+ pendingGetSchemaRequests_.erase (it);
1463+ lock.unlock ();
1464+ promise.setFailed (ResultTimeout);
1465+ }
1466+ });
1467+
14431468 sendCommand (Commands::newGetSchema (topicName, version, requestId));
14441469 return promise.getFuture ();
14451470}
@@ -1867,7 +1892,7 @@ void ClientConnection::handleGetSchemaResponse(const proto::CommandGetSchemaResp
18671892 Lock lock (mutex_);
18681893 auto it = pendingGetSchemaRequests_.find (response.request_id ());
18691894 if (it != pendingGetSchemaRequests_.end ()) {
1870- Promise<Result, SchemaInfo> getSchemaPromise = it->second ;
1895+ Promise<Result, SchemaInfo> getSchemaPromise = it->second . promise ;
18711896 pendingGetSchemaRequests_.erase (it);
18721897 lock.unlock ();
18731898
0 commit comments