You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by xy...@apache.org on 2022/12/16 05:57:51 UTC

[pulsar-client-cpp] branch main updated: [fix] Use authoritative argument correctly in BinaryProtoLookupService::findBroker (#146)

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

xyz pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/pulsar-client-cpp.git


The following commit(s) were added to refs/heads/main by this push:
     new c8b98c6  [fix] Use authoritative argument correctly in BinaryProtoLookupService::findBroker (#146)
c8b98c6 is described below

commit c8b98c6a6f6c1b19631b2248f43909a6e9c1dfaf
Author: erobot <er...@users.noreply.github.com>
AuthorDate: Fri Dec 16 13:57:45 2022 +0800

    [fix] Use authoritative argument correctly in BinaryProtoLookupService::findBroker (#146)
    
    ### Motivation
    
    Use authoritative argument correctly in BinaryProtoLookupService::findBroker.
    
    In the current code, authoritative field of lookup request is always false. When a bundle is not loaded by any broker, a lookup request with authoritative as false will not trigger broker to load the bundle, and lookup requests will loop between leader broker and the chosen broker. In this case, the lookup will not succeed and result in a large number of lookup requests to the broker as current c++ client do not have lookup redirect limit. If broker return failure after a large number [...]
     of future will result in a large depth of function calls and may cause the stack to overflow.
    
    https://github.com/apache/pulsar-client-cpp/blob/44f3b5240732a035395ec34b977301435dd0ec71/lib/BinaryProtoLookupService.cc#L55
    
    ### Modifications
    
    Use authoritative argument.
---
 lib/BinaryProtoLookupService.cc | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/BinaryProtoLookupService.cc b/lib/BinaryProtoLookupService.cc
index b863d52..b925db4 100644
--- a/lib/BinaryProtoLookupService.cc
+++ b/lib/BinaryProtoLookupService.cc
@@ -38,7 +38,7 @@ auto BinaryProtoLookupService::findBroker(const std::string& address, bool autho
     LOG_DEBUG("find broker from " << address << ", authoritative: " << authoritative << ", topic: " << topic);
     auto promise = std::make_shared<Promise<Result, LookupResult>>();
     // NOTE: we can use move capture for topic since C++14
-    cnxPool_.getConnectionAsync(address).addListener([this, promise, topic, address](
+    cnxPool_.getConnectionAsync(address).addListener([this, promise, topic, address, authoritative](
                                                          Result result,
                                                          const ClientConnectionWeakPtr& weakCnx) {
         if (result != ResultOk) {
@@ -52,7 +52,7 @@ auto BinaryProtoLookupService::findBroker(const std::string& address, bool autho
             return;
         }
         auto lookupPromise = std::make_shared<LookupDataResultPromise>();
-        cnx->newTopicLookup(topic, false, listenerName_, newRequestId(), lookupPromise);
+        cnx->newTopicLookup(topic, authoritative, listenerName_, newRequestId(), lookupPromise);
         lookupPromise->getFuture().addListener([this, cnx, promise, topic, address](
                                                    Result result, const LookupDataResultPtr& data) {
             if (result != ResultOk || !data) {