Coverage Report

Created: 2026-04-20 15:59

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
be/src/util/brpc_closure.h
Line
Count
Source
1
// Licensed to the Apache Software Foundation (ASF) under one
2
// or more contributor license agreements.  See the NOTICE file
3
// distributed with this work for additional information
4
// regarding copyright ownership.  The ASF licenses this file
5
// to you under the Apache License, Version 2.0 (the
6
// "License"); you may not use this file except in compliance
7
// with the License.  You may obtain a copy of the License at
8
//
9
//   http://www.apache.org/licenses/LICENSE-2.0
10
//
11
// Unless required by applicable law or agreed to in writing,
12
// software distributed under the License is distributed on an
13
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
// KIND, either express or implied.  See the License for the
15
// specific language governing permissions and limitations
16
// under the License.
17
18
#pragma once
19
20
#include <google/protobuf/stubs/common.h>
21
22
#include <type_traits>
23
#include <utility>
24
25
#include "runtime/query_context.h"
26
#include "runtime/thread_context.h"
27
#include "service/brpc.h" // IWYU pragma: keep
28
29
namespace doris {
30
31
template <typename T>
32
concept HasStatus = requires(T* response) { response->status(); };
33
34
template <typename Response>
35
class DummyBrpcCallback {
36
    ENABLE_FACTORY_CREATOR(DummyBrpcCallback);
37
38
public:
39
    using ResponseType = Response;
40
40
    DummyBrpcCallback() {
41
40
        cntl_ = std::make_shared<brpc::Controller>();
42
40
        call_id_ = cntl_->call_id();
43
40
        response_ = std::make_shared<Response>();
44
40
    }
_ZN5doris17DummyBrpcCallbackINS_23PSendFilterSizeResponseEEC2Ev
Line
Count
Source
40
8
    DummyBrpcCallback() {
41
8
        cntl_ = std::make_shared<brpc::Controller>();
42
8
        call_id_ = cntl_->call_id();
43
8
        response_ = std::make_shared<Response>();
44
8
    }
_ZN5doris17DummyBrpcCallbackINS_20PMergeFilterResponseEEC2Ev
Line
Count
Source
40
10
    DummyBrpcCallback() {
41
10
        cntl_ = std::make_shared<brpc::Controller>();
42
10
        call_id_ = cntl_->call_id();
43
10
        response_ = std::make_shared<Response>();
44
10
    }
_ZN5doris17DummyBrpcCallbackINS_19PTransmitDataResultEEC2Ev
Line
Count
Source
40
22
    DummyBrpcCallback() {
41
22
        cntl_ = std::make_shared<brpc::Controller>();
42
22
        call_id_ = cntl_->call_id();
43
22
        response_ = std::make_shared<Response>();
44
22
    }
Unexecuted instantiation: _ZN5doris17DummyBrpcCallbackINS_23PSyncFilterSizeResponseEEC2Ev
Unexecuted instantiation: _ZN5doris17DummyBrpcCallbackINS_22PPublishFilterResponseEEC2Ev
Unexecuted instantiation: _ZN5doris17DummyBrpcCallbackINS_27PTabletWriterAddBlockResultEEC2Ev
Unexecuted instantiation: _ZN5doris17DummyBrpcCallbackINS_23PTabletWriterOpenResultEEC2Ev
Unexecuted instantiation: _ZN5doris17DummyBrpcCallbackINS_25PTabletWriterCancelResultEEC2Ev
Unexecuted instantiation: _ZN5doris17DummyBrpcCallbackINS_27PTabletWriteSlaveDoneResultEEC2Ev
Unexecuted instantiation: _ZN5doris17DummyBrpcCallbackINS_23PTabletWriteSlaveResultEEC2Ev
45
46
40
    virtual ~DummyBrpcCallback() = default;
_ZN5doris17DummyBrpcCallbackINS_23PSendFilterSizeResponseEED2Ev
Line
Count
Source
46
8
    virtual ~DummyBrpcCallback() = default;
_ZN5doris17DummyBrpcCallbackINS_20PMergeFilterResponseEED2Ev
Line
Count
Source
46
10
    virtual ~DummyBrpcCallback() = default;
_ZN5doris17DummyBrpcCallbackINS_19PTransmitDataResultEED2Ev
Line
Count
Source
46
22
    virtual ~DummyBrpcCallback() = default;
Unexecuted instantiation: _ZN5doris17DummyBrpcCallbackINS_23PSyncFilterSizeResponseEED2Ev
Unexecuted instantiation: _ZN5doris17DummyBrpcCallbackINS_22PPublishFilterResponseEED2Ev
Unexecuted instantiation: _ZN5doris17DummyBrpcCallbackINS_27PTabletWriterAddBlockResultEED2Ev
Unexecuted instantiation: _ZN5doris17DummyBrpcCallbackINS_23PTabletWriterOpenResultEED2Ev
Unexecuted instantiation: _ZN5doris17DummyBrpcCallbackINS_25PTabletWriterCancelResultEED2Ev
Unexecuted instantiation: _ZN5doris17DummyBrpcCallbackINS_27PTabletWriteSlaveDoneResultEED2Ev
Unexecuted instantiation: _ZN5doris17DummyBrpcCallbackINS_23PTabletWriteSlaveResultEED2Ev
47
48
0
    virtual void call() {}
Unexecuted instantiation: _ZN5doris17DummyBrpcCallbackINS_19PTransmitDataResultEE4callEv
Unexecuted instantiation: _ZN5doris17DummyBrpcCallbackINS_23PSendFilterSizeResponseEE4callEv
Unexecuted instantiation: _ZN5doris17DummyBrpcCallbackINS_20PMergeFilterResponseEE4callEv
Unexecuted instantiation: _ZN5doris17DummyBrpcCallbackINS_23PSyncFilterSizeResponseEE4callEv
Unexecuted instantiation: _ZN5doris17DummyBrpcCallbackINS_22PPublishFilterResponseEE4callEv
Unexecuted instantiation: _ZN5doris17DummyBrpcCallbackINS_27PTabletWriterAddBlockResultEE4callEv
Unexecuted instantiation: _ZN5doris17DummyBrpcCallbackINS_23PTabletWriterOpenResultEE4callEv
Unexecuted instantiation: _ZN5doris17DummyBrpcCallbackINS_25PTabletWriterCancelResultEE4callEv
Unexecuted instantiation: _ZN5doris17DummyBrpcCallbackINS_27PTabletWriteSlaveDoneResultEE4callEv
Unexecuted instantiation: _ZN5doris17DummyBrpcCallbackINS_23PTabletWriteSlaveResultEE4callEv
49
50
0
    virtual void join() { brpc::Join(call_id_); }
Unexecuted instantiation: _ZN5doris17DummyBrpcCallbackINS_19PTransmitDataResultEE4joinEv
Unexecuted instantiation: _ZN5doris17DummyBrpcCallbackINS_23PSendFilterSizeResponseEE4joinEv
Unexecuted instantiation: _ZN5doris17DummyBrpcCallbackINS_20PMergeFilterResponseEE4joinEv
Unexecuted instantiation: _ZN5doris17DummyBrpcCallbackINS_23PSyncFilterSizeResponseEE4joinEv
Unexecuted instantiation: _ZN5doris17DummyBrpcCallbackINS_22PPublishFilterResponseEE4joinEv
Unexecuted instantiation: _ZN5doris17DummyBrpcCallbackINS_27PTabletWriterAddBlockResultEE4joinEv
Unexecuted instantiation: _ZN5doris17DummyBrpcCallbackINS_23PTabletWriterOpenResultEE4joinEv
Unexecuted instantiation: _ZN5doris17DummyBrpcCallbackINS_25PTabletWriterCancelResultEE4joinEv
Unexecuted instantiation: _ZN5doris17DummyBrpcCallbackINS_27PTabletWriteSlaveDoneResultEE4joinEv
Unexecuted instantiation: _ZN5doris17DummyBrpcCallbackINS_23PTabletWriteSlaveResultEE4joinEv
51
52
    // according to brpc doc, we MUST save the call_id before rpc done. use this id to join.
53
    // if a rpc is already done then we get the id and join, it's wrong.
54
    brpc::CallId call_id_;
55
    // controller has to be the same lifecycle with the closure, because brpc may use
56
    // it in any stage of the rpc.
57
    std::shared_ptr<brpc::Controller> cntl_;
58
    // We do not know if brpc will use request or response after brpc method returns.
59
    // So that we need keep a shared ptr here to ensure that brpc could use req/rep
60
    // at any stage.
61
    std::shared_ptr<Response> response_;
62
};
63
64
template <typename Response>
65
class HandleErrorBrpcCallback : public DummyBrpcCallback<Response> {
66
    ENABLE_FACTORY_CREATOR(HandleErrorBrpcCallback);
67
68
public:
69
    using ResponseType = Response;
70
    // input context must be held by caller
71
    HandleErrorBrpcCallback(std::weak_ptr<QueryContext> context = {})
72
8
            : _context(std::move(context)) {}
_ZN5doris23HandleErrorBrpcCallbackINS_20PMergeFilterResponseEEC2ESt8weak_ptrINS_12QueryContextEE
Line
Count
Source
72
8
            : _context(std::move(context)) {}
Unexecuted instantiation: _ZN5doris23HandleErrorBrpcCallbackINS_23PSyncFilterSizeResponseEEC2ESt8weak_ptrINS_12QueryContextEE
Unexecuted instantiation: _ZN5doris23HandleErrorBrpcCallbackINS_22PPublishFilterResponseEEC2ESt8weak_ptrINS_12QueryContextEE
73
74
8
    ~HandleErrorBrpcCallback() override = default;
_ZN5doris23HandleErrorBrpcCallbackINS_20PMergeFilterResponseEED2Ev
Line
Count
Source
74
8
    ~HandleErrorBrpcCallback() override = default;
Unexecuted instantiation: _ZN5doris23HandleErrorBrpcCallbackINS_23PSyncFilterSizeResponseEED2Ev
Unexecuted instantiation: _ZN5doris23HandleErrorBrpcCallbackINS_22PPublishFilterResponseEED2Ev
75
76
7
    void call() override {
77
7
        if (this->cntl_->Failed()) {
78
3
            LOG(WARNING) << fmt::format("RPC meet failed: {}", this->cntl_->ErrorText());
79
3
            if (auto ctx = _context.lock()) {
80
1
                ctx->cancel(Status::NetworkError("RPC meet failed: {}", this->cntl_->ErrorText()));
81
1
            }
82
3
            return;
83
3
        }
84
4
        if constexpr (HasStatus<Response>) {
85
4
            if (Status status = Status::create(this->response_->status()); !status.ok()) {
86
3
                if (!status.is<ErrorCode::END_OF_FILE>()) {
87
2
                    LOG(WARNING) << "RPC meet error status: " << status;
88
2
                    if (auto ctx = _context.lock()) {
89
1
                        ctx->cancel(std::move(status));
90
1
                    }
91
2
                }
92
3
            }
93
4
        }
94
4
    }
_ZN5doris23HandleErrorBrpcCallbackINS_20PMergeFilterResponseEE4callEv
Line
Count
Source
76
7
    void call() override {
77
7
        if (this->cntl_->Failed()) {
78
3
            LOG(WARNING) << fmt::format("RPC meet failed: {}", this->cntl_->ErrorText());
79
3
            if (auto ctx = _context.lock()) {
80
1
                ctx->cancel(Status::NetworkError("RPC meet failed: {}", this->cntl_->ErrorText()));
81
1
            }
82
3
            return;
83
3
        }
84
4
        if constexpr (HasStatus<Response>) {
85
4
            if (Status status = Status::create(this->response_->status()); !status.ok()) {
86
3
                if (!status.is<ErrorCode::END_OF_FILE>()) {
87
2
                    LOG(WARNING) << "RPC meet error status: " << status;
88
2
                    if (auto ctx = _context.lock()) {
89
1
                        ctx->cancel(std::move(status));
90
1
                    }
91
2
                }
92
3
            }
93
4
        }
94
4
    }
Unexecuted instantiation: _ZN5doris23HandleErrorBrpcCallbackINS_23PSyncFilterSizeResponseEE4callEv
Unexecuted instantiation: _ZN5doris23HandleErrorBrpcCallbackINS_22PPublishFilterResponseEE4callEv
95
96
private:
97
    std::weak_ptr<QueryContext> _context;
98
};
99
100
// The closure will be deleted after callback.
101
// It could only be created by using shared ptr or unique ptr.
102
// Example:
103
//  std::unique_ptr<AutoReleaseClosure> a(b);
104
//  brpc_call(a.release());
105
// the closure doesn't own the callback, so the callback MUST be kept alive outside.
106
// closure only keep a weak ref. if outside owner destroyed (like query finish), the callback will be ignored.
107
template <typename Request, typename Callback>
108
class AutoReleaseClosure : public google::protobuf::Closure {
109
    using ResponseType = typename Callback::ResponseType;
110
    ENABLE_FACTORY_CREATOR(AutoReleaseClosure);
111
112
public:
113
    AutoReleaseClosure(std::shared_ptr<Request> req, std::shared_ptr<Callback> callback)
114
32
            : request_(std::move(req)), callback_(callback) {
115
32
        this->cntl_ = callback->cntl_;
116
32
        this->response_ = callback->response_;
117
32
    }
_ZN5doris18AutoReleaseClosureINS_22PSendFilterSizeRequestENS_16SyncSizeCallbackEEC2ESt10shared_ptrIS1_ES4_IS2_E
Line
Count
Source
114
1
            : request_(std::move(req)), callback_(callback) {
115
1
        this->cntl_ = callback->cntl_;
116
1
        this->response_ = callback->response_;
117
1
    }
_ZN5doris18AutoReleaseClosureINS_19PMergeFilterRequestENS_23HandleErrorBrpcCallbackINS_20PMergeFilterResponseEEEEC2ESt10shared_ptrIS1_ES6_IS4_E
Line
Count
Source
114
1
            : request_(std::move(req)), callback_(callback) {
115
1
        this->cntl_ = callback->cntl_;
116
1
        this->response_ = callback->response_;
117
1
    }
_ZN5doris18AutoReleaseClosureINS_19PMergeFilterRequestENS_23WeakMergeFilterCallbackEEC2ESt10shared_ptrIS1_ES4_IS2_E
Line
Count
Source
114
2
            : request_(std::move(req)), callback_(callback) {
115
2
        this->cntl_ = callback->cntl_;
116
2
        this->response_ = callback->response_;
117
2
    }
_ZN5doris18AutoReleaseClosureINS_19PTransmitDataParamsENS_20ExchangeSendCallbackINS_19PTransmitDataResultEEEEC2ESt10shared_ptrIS1_ES6_IS4_E
Line
Count
Source
114
28
            : request_(std::move(req)), callback_(callback) {
115
28
        this->cntl_ = callback->cntl_;
116
28
        this->response_ = callback->response_;
117
28
    }
Unexecuted instantiation: _ZN5doris18AutoReleaseClosureINS_22PSyncFilterSizeRequestENS_23HandleErrorBrpcCallbackINS_23PSyncFilterSizeResponseEEEEC2ESt10shared_ptrIS1_ES6_IS4_E
Unexecuted instantiation: _ZN5doris18AutoReleaseClosureINS_23PPublishFilterRequestV2ENS_23HandleErrorBrpcCallbackINS_22PPublishFilterResponseEEEEC2ESt10shared_ptrIS1_ES6_IS4_E
Unexecuted instantiation: _ZN5doris18AutoReleaseClosureINS_24PTabletWriterOpenRequestENS_17DummyBrpcCallbackINS_23PTabletWriterOpenResultEEEEC2ESt10shared_ptrIS1_ES6_IS4_E
Unexecuted instantiation: _ZN5doris18AutoReleaseClosureINS_28PTabletWriterAddBlockRequestENS_18WriteBlockCallbackINS_27PTabletWriterAddBlockResultEEEEC2ESt10shared_ptrIS1_ES6_IS4_E
Unexecuted instantiation: _ZN5doris18AutoReleaseClosureINS_26PTabletWriterCancelRequestENS_17DummyBrpcCallbackINS_25PTabletWriterCancelResultEEEEC2ESt10shared_ptrIS1_ES6_IS4_E
Unexecuted instantiation: _ZN5doris18AutoReleaseClosureINS_28PTabletWriteSlaveDoneRequestENS_17DummyBrpcCallbackINS_27PTabletWriteSlaveDoneResultEEEEC2ESt10shared_ptrIS1_ES6_IS4_E
Unexecuted instantiation: _ZN5doris18AutoReleaseClosureINS_24PTabletWriteSlaveRequestENS_17DummyBrpcCallbackINS_23PTabletWriteSlaveResultEEEEC2ESt10shared_ptrIS1_ES6_IS4_E
118
119
32
    ~AutoReleaseClosure() override = default;
_ZN5doris18AutoReleaseClosureINS_22PSendFilterSizeRequestENS_16SyncSizeCallbackEED2Ev
Line
Count
Source
119
1
    ~AutoReleaseClosure() override = default;
_ZN5doris18AutoReleaseClosureINS_19PMergeFilterRequestENS_23HandleErrorBrpcCallbackINS_20PMergeFilterResponseEEEED2Ev
Line
Count
Source
119
1
    ~AutoReleaseClosure() override = default;
_ZN5doris18AutoReleaseClosureINS_19PMergeFilterRequestENS_23WeakMergeFilterCallbackEED2Ev
Line
Count
Source
119
2
    ~AutoReleaseClosure() override = default;
_ZN5doris18AutoReleaseClosureINS_19PTransmitDataParamsENS_20ExchangeSendCallbackINS_19PTransmitDataResultEEEED2Ev
Line
Count
Source
119
28
    ~AutoReleaseClosure() override = default;
Unexecuted instantiation: _ZN5doris18AutoReleaseClosureINS_22PSyncFilterSizeRequestENS_23HandleErrorBrpcCallbackINS_23PSyncFilterSizeResponseEEEED2Ev
Unexecuted instantiation: _ZN5doris18AutoReleaseClosureINS_23PPublishFilterRequestV2ENS_23HandleErrorBrpcCallbackINS_22PPublishFilterResponseEEEED2Ev
Unexecuted instantiation: _ZN5doris18AutoReleaseClosureINS_24PTabletWriterOpenRequestENS_17DummyBrpcCallbackINS_23PTabletWriterOpenResultEEEED2Ev
Unexecuted instantiation: _ZN5doris18AutoReleaseClosureINS_28PTabletWriterAddBlockRequestENS_18WriteBlockCallbackINS_27PTabletWriterAddBlockResultEEEED2Ev
Unexecuted instantiation: _ZN5doris18AutoReleaseClosureINS_26PTabletWriterCancelRequestENS_17DummyBrpcCallbackINS_25PTabletWriterCancelResultEEEED2Ev
Unexecuted instantiation: _ZN5doris18AutoReleaseClosureINS_28PTabletWriteSlaveDoneRequestENS_17DummyBrpcCallbackINS_27PTabletWriteSlaveDoneResultEEEED2Ev
Unexecuted instantiation: _ZN5doris18AutoReleaseClosureINS_24PTabletWriteSlaveRequestENS_17DummyBrpcCallbackINS_23PTabletWriteSlaveResultEEEED2Ev
120
121
    // Will delete itself. all operations should be done in callback's call(). Run() only do one thing.
122
32
    void Run() override {
123
32
        Defer defer {[&]() { delete this; }};
_ZZN5doris18AutoReleaseClosureINS_22PSendFilterSizeRequestENS_16SyncSizeCallbackEE3RunEvENKUlvE_clEv
Line
Count
Source
123
1
        Defer defer {[&]() { delete this; }};
_ZZN5doris18AutoReleaseClosureINS_19PMergeFilterRequestENS_23HandleErrorBrpcCallbackINS_20PMergeFilterResponseEEEE3RunEvENKUlvE_clEv
Line
Count
Source
123
1
        Defer defer {[&]() { delete this; }};
_ZZN5doris18AutoReleaseClosureINS_19PMergeFilterRequestENS_23WeakMergeFilterCallbackEE3RunEvENKUlvE_clEv
Line
Count
Source
123
2
        Defer defer {[&]() { delete this; }};
_ZZN5doris18AutoReleaseClosureINS_19PTransmitDataParamsENS_20ExchangeSendCallbackINS_19PTransmitDataResultEEEE3RunEvENKUlvE_clEv
Line
Count
Source
123
28
        Defer defer {[&]() { delete this; }};
Unexecuted instantiation: _ZZN5doris18AutoReleaseClosureINS_22PSyncFilterSizeRequestENS_23HandleErrorBrpcCallbackINS_23PSyncFilterSizeResponseEEEE3RunEvENKUlvE_clEv
Unexecuted instantiation: _ZZN5doris18AutoReleaseClosureINS_23PPublishFilterRequestV2ENS_23HandleErrorBrpcCallbackINS_22PPublishFilterResponseEEEE3RunEvENKUlvE_clEv
Unexecuted instantiation: _ZZN5doris18AutoReleaseClosureINS_24PTabletWriterOpenRequestENS_17DummyBrpcCallbackINS_23PTabletWriterOpenResultEEEE3RunEvENKUlvE_clEv
Unexecuted instantiation: _ZZN5doris18AutoReleaseClosureINS_28PTabletWriterAddBlockRequestENS_18WriteBlockCallbackINS_27PTabletWriterAddBlockResultEEEE3RunEvENKUlvE_clEv
Unexecuted instantiation: _ZZN5doris18AutoReleaseClosureINS_26PTabletWriterCancelRequestENS_17DummyBrpcCallbackINS_25PTabletWriterCancelResultEEEE3RunEvENKUlvE_clEv
Unexecuted instantiation: _ZZN5doris18AutoReleaseClosureINS_28PTabletWriteSlaveDoneRequestENS_17DummyBrpcCallbackINS_27PTabletWriteSlaveDoneResultEEEE3RunEvENKUlvE_clEv
Unexecuted instantiation: _ZZN5doris18AutoReleaseClosureINS_24PTabletWriteSlaveRequestENS_17DummyBrpcCallbackINS_23PTabletWriteSlaveResultEEEE3RunEvENKUlvE_clEv
124
32
        if (auto tmp = callback_.lock()) {
125
29
            tmp->call();
126
29
        }
127
32
    }
_ZN5doris18AutoReleaseClosureINS_19PTransmitDataParamsENS_20ExchangeSendCallbackINS_19PTransmitDataResultEEEE3RunEv
Line
Count
Source
122
28
    void Run() override {
123
28
        Defer defer {[&]() { delete this; }};
124
28
        if (auto tmp = callback_.lock()) {
125
28
            tmp->call();
126
28
        }
127
28
    }
_ZN5doris18AutoReleaseClosureINS_22PSendFilterSizeRequestENS_16SyncSizeCallbackEE3RunEv
Line
Count
Source
122
1
    void Run() override {
123
1
        Defer defer {[&]() { delete this; }};
124
1
        if (auto tmp = callback_.lock()) {
125
0
            tmp->call();
126
0
        }
127
1
    }
_ZN5doris18AutoReleaseClosureINS_19PMergeFilterRequestENS_23HandleErrorBrpcCallbackINS_20PMergeFilterResponseEEEE3RunEv
Line
Count
Source
122
1
    void Run() override {
123
1
        Defer defer {[&]() { delete this; }};
124
1
        if (auto tmp = callback_.lock()) {
125
0
            tmp->call();
126
0
        }
127
1
    }
_ZN5doris18AutoReleaseClosureINS_19PMergeFilterRequestENS_23WeakMergeFilterCallbackEE3RunEv
Line
Count
Source
122
2
    void Run() override {
123
2
        Defer defer {[&]() { delete this; }};
124
2
        if (auto tmp = callback_.lock()) {
125
1
            tmp->call();
126
1
        }
127
2
    }
Unexecuted instantiation: _ZN5doris18AutoReleaseClosureINS_22PSyncFilterSizeRequestENS_23HandleErrorBrpcCallbackINS_23PSyncFilterSizeResponseEEEE3RunEv
Unexecuted instantiation: _ZN5doris18AutoReleaseClosureINS_23PPublishFilterRequestV2ENS_23HandleErrorBrpcCallbackINS_22PPublishFilterResponseEEEE3RunEv
Unexecuted instantiation: _ZN5doris18AutoReleaseClosureINS_24PTabletWriterOpenRequestENS_17DummyBrpcCallbackINS_23PTabletWriterOpenResultEEEE3RunEv
Unexecuted instantiation: _ZN5doris18AutoReleaseClosureINS_28PTabletWriterAddBlockRequestENS_18WriteBlockCallbackINS_27PTabletWriterAddBlockResultEEEE3RunEv
Unexecuted instantiation: _ZN5doris18AutoReleaseClosureINS_26PTabletWriterCancelRequestENS_17DummyBrpcCallbackINS_25PTabletWriterCancelResultEEEE3RunEv
Unexecuted instantiation: _ZN5doris18AutoReleaseClosureINS_28PTabletWriteSlaveDoneRequestENS_17DummyBrpcCallbackINS_27PTabletWriteSlaveDoneResultEEEE3RunEv
Unexecuted instantiation: _ZN5doris18AutoReleaseClosureINS_24PTabletWriteSlaveRequestENS_17DummyBrpcCallbackINS_23PTabletWriteSlaveResultEEEE3RunEv
128
129
    // controller has to be the same lifecycle with the closure, because brpc may use
130
    // it in any stage of the rpc.
131
    std::shared_ptr<brpc::Controller> cntl_;
132
    // We do not know if brpc will use request or response after brpc method returns.
133
    // So that we need keep a shared ptr here to ensure that brpc could use req/rep
134
    // at any stage.
135
    std::shared_ptr<Request> request_;
136
    std::shared_ptr<ResponseType> response_;
137
138
private:
139
    std::weak_ptr<Callback> callback_;
140
};
141
142
} // namespace doris