grpc 1.21.0 → 1.22.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of grpc might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Makefile +422 -62
- data/include/grpc/grpc_security.h +61 -5
- data/include/grpc/grpc_security_constants.h +1 -1
- data/include/grpc/impl/codegen/gpr_types.h +1 -1
- data/include/grpc/slice.h +2 -2
- data/src/core/ext/filters/client_channel/backup_poller.cc +2 -3
- data/src/core/ext/filters/client_channel/backup_poller.h +5 -2
- data/src/core/ext/filters/client_channel/client_channel.cc +260 -122
- data/src/core/ext/filters/client_channel/client_channel.h +0 -8
- data/src/core/ext/filters/client_channel/client_channel_channelz.cc +3 -84
- data/src/core/ext/filters/client_channel/client_channel_channelz.h +2 -28
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +2 -8
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +5 -4
- data/src/core/ext/filters/client_channel/lb_policy.cc +16 -2
- data/src/core/ext/filters/client_channel/lb_policy.h +92 -98
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +63 -87
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +6 -2
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +35 -87
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +18 -74
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +167 -217
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +216 -190
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.cc +6 -2
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy_registry.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy_registry.h +1 -1
- data/src/core/ext/filters/client_channel/resolver.h +1 -1
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +6 -3
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +0 -1
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +2 -0
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +8 -8
- data/src/core/ext/filters/client_channel/resolver_result_parsing.h +7 -7
- data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +28 -64
- data/src/core/ext/filters/client_channel/resolving_lb_policy.h +4 -12
- data/src/core/ext/filters/client_channel/server_address.cc +4 -6
- data/src/core/ext/filters/client_channel/server_address.h +1 -3
- data/src/core/ext/filters/client_channel/service_config.cc +20 -22
- data/src/core/ext/filters/client_channel/service_config.h +26 -28
- data/src/core/ext/filters/client_channel/subchannel.cc +261 -160
- data/src/core/ext/filters/client_channel/subchannel.h +97 -23
- data/src/core/ext/filters/client_channel/subchannel_interface.h +113 -0
- data/src/core/ext/filters/message_size/message_size_filter.cc +12 -12
- data/src/core/ext/filters/message_size/message_size_filter.h +2 -2
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +50 -2
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +31 -36
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +3 -2
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +71 -52
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +18 -3
- data/src/core/ext/transport/chttp2/transport/hpack_table.cc +5 -12
- data/src/core/ext/transport/chttp2/transport/hpack_table.h +10 -1
- data/src/core/ext/transport/chttp2/transport/internal.h +3 -3
- data/src/core/ext/transport/chttp2/transport/parsing.cc +39 -57
- data/src/core/lib/channel/channelz.cc +136 -19
- data/src/core/lib/channel/channelz.h +36 -40
- data/src/core/lib/channel/channelz_registry.cc +74 -106
- data/src/core/lib/channel/channelz_registry.h +10 -28
- data/src/core/lib/channel/context.h +1 -1
- data/src/core/lib/channel/handshaker.cc +6 -0
- data/src/core/lib/compression/compression.cc +13 -8
- data/src/core/lib/compression/compression_internal.cc +14 -10
- data/src/core/lib/compression/compression_internal.h +1 -1
- data/src/core/lib/compression/stream_compression.cc +3 -2
- data/src/core/lib/compression/stream_compression.h +2 -2
- data/src/core/lib/compression/stream_compression_gzip.cc +9 -9
- data/src/core/lib/gpr/env.h +1 -1
- data/src/core/lib/gpr/string.cc +8 -1
- data/src/core/lib/gpr/string.h +6 -1
- data/src/core/lib/gprpp/fork.cc +1 -1
- data/src/core/lib/gprpp/fork.h +5 -1
- data/src/core/lib/gprpp/global_config.h +9 -0
- data/src/core/lib/gprpp/global_config_custom.h +1 -1
- data/src/core/lib/gprpp/inlined_vector.h +8 -0
- data/src/core/lib/gprpp/map.h +38 -21
- data/src/core/lib/gprpp/memory.h +2 -2
- data/src/core/lib/gprpp/orphanable.h +1 -1
- data/src/core/lib/gprpp/ref_counted.h +9 -4
- data/src/core/lib/http/httpcli.cc +3 -3
- data/src/core/lib/iomgr/buffer_list.h +1 -1
- data/src/core/lib/iomgr/call_combiner.cc +1 -1
- data/src/core/lib/iomgr/call_combiner.h +1 -1
- data/src/core/lib/iomgr/cfstream_handle.cc +3 -2
- data/src/core/lib/iomgr/cfstream_handle.h +4 -0
- data/src/core/lib/iomgr/error.cc +3 -3
- data/src/core/lib/iomgr/error.h +9 -3
- data/src/core/lib/iomgr/error_internal.h +1 -1
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +1 -1
- data/src/core/lib/iomgr/ev_posix.cc +3 -3
- data/src/core/lib/iomgr/ev_posix.h +3 -2
- data/src/core/lib/iomgr/ev_windows.cc +2 -2
- data/src/core/lib/iomgr/iomgr.cc +4 -4
- data/src/core/lib/iomgr/lockfree_event.cc +1 -1
- data/src/core/lib/iomgr/port.h +5 -1
- data/src/core/lib/iomgr/tcp_posix.cc +1 -3
- data/src/core/lib/iomgr/tcp_server.cc +5 -0
- data/src/core/lib/iomgr/tcp_server.h +24 -0
- data/src/core/lib/iomgr/tcp_server_custom.cc +11 -9
- data/src/core/lib/iomgr/tcp_server_posix.cc +72 -11
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -0
- data/src/core/lib/iomgr/tcp_server_windows.cc +11 -9
- data/src/core/lib/iomgr/tcp_uv.cc +5 -6
- data/src/core/lib/iomgr/timer.h +2 -1
- data/src/core/lib/iomgr/udp_server.cc +2 -2
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +1 -1
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +20 -2
- data/src/core/lib/security/credentials/ssl/ssl_credentials.h +2 -2
- data/src/core/lib/security/security_connector/security_connector.h +1 -1
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +1 -1
- data/src/core/lib/security/transport/auth_filters.h +3 -0
- data/src/core/lib/security/transport/client_auth_filter.cc +13 -0
- data/src/core/lib/security/transport/security_handshaker.cc +7 -7
- data/src/core/lib/slice/b64.h +2 -2
- data/src/core/lib/slice/slice.cc +82 -10
- data/src/core/lib/slice/slice_buffer.cc +49 -21
- data/src/core/lib/slice/slice_hash_table.h +2 -2
- data/src/core/lib/slice/slice_intern.cc +15 -16
- data/src/core/lib/slice/slice_internal.h +52 -0
- data/src/core/lib/slice/slice_string_helpers.cc +10 -1
- data/src/core/lib/slice/slice_string_helpers.h +3 -1
- data/src/core/lib/slice/slice_utils.h +50 -0
- data/src/core/lib/slice/slice_weak_hash_table.h +2 -2
- data/src/core/lib/surface/call.cc +14 -8
- data/src/core/lib/surface/channel.cc +89 -97
- data/src/core/lib/surface/channel.h +60 -6
- data/src/core/lib/surface/completion_queue.cc +49 -36
- data/src/core/lib/surface/completion_queue.h +2 -1
- data/src/core/lib/surface/server.cc +8 -8
- data/src/core/lib/surface/validate_metadata.cc +14 -8
- data/src/core/lib/surface/validate_metadata.h +13 -2
- data/src/core/lib/surface/version.cc +1 -1
- data/src/core/lib/transport/metadata.cc +56 -26
- data/src/core/lib/transport/metadata.h +91 -75
- data/src/core/lib/transport/static_metadata.cc +262 -176
- data/src/core/lib/transport/static_metadata.h +272 -180
- data/src/core/lib/transport/transport.cc +1 -1
- data/src/core/lib/transport/transport.h +8 -2
- data/src/core/tsi/alts/handshaker/alts_shared_resource.h +1 -1
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +5 -2
- data/src/ruby/lib/grpc/version.rb +1 -1
- metadata +37 -35
@@ -33,6 +33,7 @@
|
|
33
33
|
#include "src/core/lib/channel/channel_args.h"
|
34
34
|
#include "src/core/lib/channel/channel_trace.h"
|
35
35
|
#include "src/core/lib/channel/channelz.h"
|
36
|
+
#include "src/core/lib/channel/channelz_registry.h"
|
36
37
|
#include "src/core/lib/debug/stats.h"
|
37
38
|
#include "src/core/lib/gpr/string.h"
|
38
39
|
#include "src/core/lib/gprpp/manual_constructor.h"
|
@@ -59,23 +60,6 @@ typedef struct registered_call {
|
|
59
60
|
struct registered_call* next;
|
60
61
|
} registered_call;
|
61
62
|
|
62
|
-
struct grpc_channel {
|
63
|
-
int is_client;
|
64
|
-
grpc_compression_options compression_options;
|
65
|
-
|
66
|
-
gpr_atm call_size_estimate;
|
67
|
-
grpc_resource_user* resource_user;
|
68
|
-
|
69
|
-
gpr_mu registered_call_mu;
|
70
|
-
registered_call* registered_calls;
|
71
|
-
|
72
|
-
grpc_core::RefCountedPtr<grpc_core::channelz::ChannelNode> channelz_channel;
|
73
|
-
|
74
|
-
char* target;
|
75
|
-
};
|
76
|
-
|
77
|
-
#define CHANNEL_STACK_FROM_CHANNEL(c) ((grpc_channel_stack*)((c) + 1))
|
78
|
-
|
79
63
|
static void destroy_channel(void* arg, grpc_error* error);
|
80
64
|
|
81
65
|
grpc_channel* grpc_channel_create_with_builder(
|
@@ -103,18 +87,9 @@ grpc_channel* grpc_channel_create_with_builder(
|
|
103
87
|
grpc_channel_args_destroy(args);
|
104
88
|
return channel;
|
105
89
|
}
|
106
|
-
|
107
90
|
channel->target = target;
|
108
91
|
channel->resource_user = resource_user;
|
109
92
|
channel->is_client = grpc_channel_stack_type_is_client(channel_stack_type);
|
110
|
-
bool channelz_enabled = GRPC_ENABLE_CHANNELZ_DEFAULT;
|
111
|
-
size_t channel_tracer_max_memory =
|
112
|
-
GRPC_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE_DEFAULT;
|
113
|
-
bool internal_channel = false;
|
114
|
-
// this creates the default ChannelNode. Different types of channels may
|
115
|
-
// override this to ensure a correct ChannelNode is created.
|
116
|
-
grpc_core::channelz::ChannelNodeCreationFunc channel_node_create_func =
|
117
|
-
grpc_core::channelz::ChannelNode::MakeChannelNode;
|
118
93
|
gpr_mu_init(&channel->registered_call_mu);
|
119
94
|
channel->registered_calls = nullptr;
|
120
95
|
|
@@ -146,40 +121,16 @@ grpc_channel* grpc_channel_create_with_builder(
|
|
146
121
|
channel->compression_options.enabled_algorithms_bitset =
|
147
122
|
static_cast<uint32_t>(args->args[i].value.integer) |
|
148
123
|
0x1; /* always support no compression */
|
149
|
-
} else if (0 == strcmp(args->args[i].key,
|
150
|
-
GRPC_ARG_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE)) {
|
151
|
-
const grpc_integer_options options = {
|
152
|
-
GRPC_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE_DEFAULT, 0, INT_MAX};
|
153
|
-
channel_tracer_max_memory =
|
154
|
-
(size_t)grpc_channel_arg_get_integer(&args->args[i], options);
|
155
|
-
} else if (0 == strcmp(args->args[i].key, GRPC_ARG_ENABLE_CHANNELZ)) {
|
156
|
-
// channelz will not be enabled by default until all concerns in
|
157
|
-
// https://github.com/grpc/grpc/issues/15986 are addressed.
|
158
|
-
channelz_enabled = grpc_channel_arg_get_bool(
|
159
|
-
&args->args[i], GRPC_ENABLE_CHANNELZ_DEFAULT);
|
160
|
-
} else if (0 == strcmp(args->args[i].key,
|
161
|
-
GRPC_ARG_CHANNELZ_CHANNEL_NODE_CREATION_FUNC)) {
|
124
|
+
} else if (0 == strcmp(args->args[i].key, GRPC_ARG_CHANNELZ_CHANNEL_NODE)) {
|
162
125
|
GPR_ASSERT(args->args[i].type == GRPC_ARG_POINTER);
|
163
126
|
GPR_ASSERT(args->args[i].value.pointer.p != nullptr);
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
} else if (0 == strcmp(args->args[i].key,
|
168
|
-
GRPC_ARG_CHANNELZ_CHANNEL_IS_INTERNAL_CHANNEL)) {
|
169
|
-
internal_channel = grpc_channel_arg_get_bool(&args->args[i], false);
|
127
|
+
channel->channelz_node = static_cast<grpc_core::channelz::ChannelNode*>(
|
128
|
+
args->args[i].value.pointer.p)
|
129
|
+
->Ref();
|
170
130
|
}
|
171
131
|
}
|
172
132
|
|
173
133
|
grpc_channel_args_destroy(args);
|
174
|
-
// we only need to do the channelz bookkeeping for clients here. The channelz
|
175
|
-
// bookkeeping for server channels occurs in src/core/lib/surface/server.cc
|
176
|
-
if (channelz_enabled && channel->is_client) {
|
177
|
-
channel->channelz_channel = channel_node_create_func(
|
178
|
-
channel, channel_tracer_max_memory, !internal_channel);
|
179
|
-
channel->channelz_channel->AddTraceEvent(
|
180
|
-
grpc_core::channelz::ChannelTrace::Severity::Info,
|
181
|
-
grpc_slice_from_static_string("Channel created"));
|
182
|
-
}
|
183
134
|
return channel;
|
184
135
|
}
|
185
136
|
|
@@ -214,11 +165,71 @@ static grpc_channel_args* build_channel_args(
|
|
214
165
|
return grpc_channel_args_copy_and_add(input_args, new_args, num_new_args);
|
215
166
|
}
|
216
167
|
|
217
|
-
|
218
|
-
|
219
|
-
|
168
|
+
namespace {
|
169
|
+
|
170
|
+
void* channelz_node_copy(void* p) {
|
171
|
+
grpc_core::channelz::ChannelNode* node =
|
172
|
+
static_cast<grpc_core::channelz::ChannelNode*>(p);
|
173
|
+
node->Ref().release();
|
174
|
+
return p;
|
175
|
+
}
|
176
|
+
void channelz_node_destroy(void* p) {
|
177
|
+
grpc_core::channelz::ChannelNode* node =
|
178
|
+
static_cast<grpc_core::channelz::ChannelNode*>(p);
|
179
|
+
node->Unref();
|
180
|
+
}
|
181
|
+
int channelz_node_cmp(void* p1, void* p2) { return GPR_ICMP(p1, p2); }
|
182
|
+
const grpc_arg_pointer_vtable channelz_node_arg_vtable = {
|
183
|
+
channelz_node_copy, channelz_node_destroy, channelz_node_cmp};
|
184
|
+
|
185
|
+
void CreateChannelzNode(grpc_channel_stack_builder* builder) {
|
186
|
+
const grpc_channel_args* args =
|
187
|
+
grpc_channel_stack_builder_get_channel_arguments(builder);
|
188
|
+
// Check whether channelz is enabled.
|
189
|
+
const bool channelz_enabled = grpc_channel_arg_get_bool(
|
190
|
+
grpc_channel_args_find(args, GRPC_ARG_ENABLE_CHANNELZ),
|
191
|
+
GRPC_ENABLE_CHANNELZ_DEFAULT);
|
192
|
+
if (!channelz_enabled) return;
|
193
|
+
// Get parameters needed to create the channelz node.
|
194
|
+
const size_t channel_tracer_max_memory = grpc_channel_arg_get_integer(
|
195
|
+
grpc_channel_args_find(args,
|
196
|
+
GRPC_ARG_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE),
|
197
|
+
{GRPC_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE_DEFAULT, 0, INT_MAX});
|
198
|
+
const intptr_t channelz_parent_uuid =
|
199
|
+
grpc_core::channelz::GetParentUuidFromArgs(*args);
|
200
|
+
// Create the channelz node.
|
201
|
+
grpc_core::RefCountedPtr<grpc_core::channelz::ChannelNode> channelz_node =
|
202
|
+
grpc_core::MakeRefCounted<grpc_core::channelz::ChannelNode>(
|
203
|
+
grpc_core::UniquePtr<char>(
|
204
|
+
gpr_strdup(grpc_channel_stack_builder_get_target(builder))),
|
205
|
+
channel_tracer_max_memory, channelz_parent_uuid);
|
206
|
+
channelz_node->AddTraceEvent(
|
207
|
+
grpc_core::channelz::ChannelTrace::Severity::Info,
|
208
|
+
grpc_slice_from_static_string("Channel created"));
|
209
|
+
// Update parent channel node, if any.
|
210
|
+
if (channelz_parent_uuid > 0) {
|
211
|
+
grpc_core::RefCountedPtr<grpc_core::channelz::BaseNode> parent_node =
|
212
|
+
grpc_core::channelz::ChannelzRegistry::Get(channelz_parent_uuid);
|
213
|
+
if (parent_node != nullptr) {
|
214
|
+
grpc_core::channelz::ChannelNode* parent =
|
215
|
+
static_cast<grpc_core::channelz::ChannelNode*>(parent_node.get());
|
216
|
+
parent->AddChildChannel(channelz_node->uuid());
|
217
|
+
}
|
218
|
+
}
|
219
|
+
// Add channelz node to channel args.
|
220
|
+
// We remove the arg for the parent uuid, since we no longer need it.
|
221
|
+
grpc_arg new_arg = grpc_channel_arg_pointer_create(
|
222
|
+
const_cast<char*>(GRPC_ARG_CHANNELZ_CHANNEL_NODE), channelz_node.get(),
|
223
|
+
&channelz_node_arg_vtable);
|
224
|
+
const char* args_to_remove[] = {GRPC_ARG_CHANNELZ_PARENT_UUID};
|
225
|
+
grpc_channel_args* new_args = grpc_channel_args_copy_and_add_and_remove(
|
226
|
+
args, args_to_remove, GPR_ARRAY_SIZE(args_to_remove), &new_arg, 1);
|
227
|
+
grpc_channel_stack_builder_set_channel_arguments(builder, new_args);
|
228
|
+
grpc_channel_args_destroy(new_args);
|
220
229
|
}
|
221
230
|
|
231
|
+
} // namespace
|
232
|
+
|
222
233
|
grpc_channel* grpc_channel_create(const char* target,
|
223
234
|
const grpc_channel_args* input_args,
|
224
235
|
grpc_channel_stack_type channel_stack_type,
|
@@ -241,9 +252,12 @@ grpc_channel* grpc_channel_create(const char* target,
|
|
241
252
|
}
|
242
253
|
return nullptr;
|
243
254
|
}
|
244
|
-
|
245
|
-
|
246
|
-
|
255
|
+
// We only need to do this for clients here. For servers, this will be
|
256
|
+
// done in src/core/lib/surface/server.cc.
|
257
|
+
if (grpc_channel_stack_type_is_client(channel_stack_type)) {
|
258
|
+
CreateChannelzNode(builder);
|
259
|
+
}
|
260
|
+
return grpc_channel_create_with_builder(builder, channel_stack_type);
|
247
261
|
}
|
248
262
|
|
249
263
|
size_t grpc_channel_get_call_size_estimate(grpc_channel* channel) {
|
@@ -421,29 +435,23 @@ grpc_call* grpc_channel_create_registered_call(
|
|
421
435
|
return call;
|
422
436
|
}
|
423
437
|
|
424
|
-
#ifndef NDEBUG
|
425
|
-
#define REF_REASON reason
|
426
|
-
#define REF_ARG , const char* reason
|
427
|
-
#else
|
428
|
-
#define REF_REASON ""
|
429
|
-
#define REF_ARG
|
430
|
-
#endif
|
431
|
-
void grpc_channel_internal_ref(grpc_channel* c REF_ARG) {
|
432
|
-
GRPC_CHANNEL_STACK_REF(CHANNEL_STACK_FROM_CHANNEL(c), REF_REASON);
|
433
|
-
}
|
434
|
-
|
435
|
-
void grpc_channel_internal_unref(grpc_channel* c REF_ARG) {
|
436
|
-
GRPC_CHANNEL_STACK_UNREF(CHANNEL_STACK_FROM_CHANNEL(c), REF_REASON);
|
437
|
-
}
|
438
|
-
|
439
438
|
static void destroy_channel(void* arg, grpc_error* error) {
|
440
439
|
grpc_channel* channel = static_cast<grpc_channel*>(arg);
|
441
|
-
if (channel->
|
442
|
-
channel->
|
440
|
+
if (channel->channelz_node != nullptr) {
|
441
|
+
if (channel->channelz_node->parent_uuid() > 0) {
|
442
|
+
grpc_core::RefCountedPtr<grpc_core::channelz::BaseNode> parent_node =
|
443
|
+
grpc_core::channelz::ChannelzRegistry::Get(
|
444
|
+
channel->channelz_node->parent_uuid());
|
445
|
+
if (parent_node != nullptr) {
|
446
|
+
grpc_core::channelz::ChannelNode* parent =
|
447
|
+
static_cast<grpc_core::channelz::ChannelNode*>(parent_node.get());
|
448
|
+
parent->RemoveChildChannel(channel->channelz_node->uuid());
|
449
|
+
}
|
450
|
+
}
|
451
|
+
channel->channelz_node->AddTraceEvent(
|
443
452
|
grpc_core::channelz::ChannelTrace::Severity::Info,
|
444
453
|
grpc_slice_from_static_string("Channel destroyed"));
|
445
|
-
channel->
|
446
|
-
channel->channelz_channel.reset();
|
454
|
+
channel->channelz_node.reset();
|
447
455
|
}
|
448
456
|
grpc_channel_stack_destroy(CHANNEL_STACK_FROM_CHANNEL(channel));
|
449
457
|
while (channel->registered_calls) {
|
@@ -475,25 +483,9 @@ void grpc_channel_destroy(grpc_channel* channel) {
|
|
475
483
|
GRPC_CHANNEL_INTERNAL_UNREF(channel, "channel");
|
476
484
|
}
|
477
485
|
|
478
|
-
|
479
|
-
|
480
|
-
}
|
481
|
-
|
482
|
-
grpc_compression_options grpc_channel_compression_options(
|
483
|
-
const grpc_channel* channel) {
|
484
|
-
return channel->compression_options;
|
485
|
-
}
|
486
|
-
|
487
|
-
grpc_mdelem grpc_channel_get_reffed_status_elem(grpc_channel* channel, int i) {
|
486
|
+
grpc_mdelem grpc_channel_get_reffed_status_elem_slowpath(grpc_channel* channel,
|
487
|
+
int i) {
|
488
488
|
char tmp[GPR_LTOA_MIN_BUFSIZE];
|
489
|
-
switch (i) {
|
490
|
-
case 0:
|
491
|
-
return GRPC_MDELEM_GRPC_STATUS_0;
|
492
|
-
case 1:
|
493
|
-
return GRPC_MDELEM_GRPC_STATUS_1;
|
494
|
-
case 2:
|
495
|
-
return GRPC_MDELEM_GRPC_STATUS_2;
|
496
|
-
}
|
497
489
|
gpr_ltoa(i, tmp);
|
498
490
|
return grpc_mdelem_from_slices(GRPC_MDSTR_GRPC_STATUS,
|
499
491
|
grpc_slice_from_copied_string(tmp));
|
@@ -59,22 +59,76 @@ grpc_core::channelz::ChannelNode* grpc_channel_get_channelz_node(
|
|
59
59
|
status_code.
|
60
60
|
|
61
61
|
The returned elem is owned by the caller. */
|
62
|
-
grpc_mdelem
|
63
|
-
|
62
|
+
grpc_mdelem grpc_channel_get_reffed_status_elem_slowpath(grpc_channel* channel,
|
63
|
+
int status_code);
|
64
|
+
inline grpc_mdelem grpc_channel_get_reffed_status_elem(grpc_channel* channel,
|
65
|
+
int status_code) {
|
66
|
+
switch (status_code) {
|
67
|
+
case 0:
|
68
|
+
return GRPC_MDELEM_GRPC_STATUS_0;
|
69
|
+
case 1:
|
70
|
+
return GRPC_MDELEM_GRPC_STATUS_1;
|
71
|
+
case 2:
|
72
|
+
return GRPC_MDELEM_GRPC_STATUS_2;
|
73
|
+
}
|
74
|
+
return grpc_channel_get_reffed_status_elem_slowpath(channel, status_code);
|
75
|
+
}
|
64
76
|
|
65
77
|
size_t grpc_channel_get_call_size_estimate(grpc_channel* channel);
|
66
78
|
void grpc_channel_update_call_size_estimate(grpc_channel* channel, size_t size);
|
67
79
|
|
80
|
+
struct registered_call;
|
81
|
+
struct grpc_channel {
|
82
|
+
int is_client;
|
83
|
+
grpc_compression_options compression_options;
|
84
|
+
|
85
|
+
gpr_atm call_size_estimate;
|
86
|
+
grpc_resource_user* resource_user;
|
87
|
+
|
88
|
+
gpr_mu registered_call_mu;
|
89
|
+
registered_call* registered_calls;
|
90
|
+
|
91
|
+
grpc_core::RefCountedPtr<grpc_core::channelz::ChannelNode> channelz_node;
|
92
|
+
|
93
|
+
char* target;
|
94
|
+
};
|
95
|
+
#define CHANNEL_STACK_FROM_CHANNEL(c) ((grpc_channel_stack*)((c) + 1))
|
96
|
+
|
97
|
+
inline grpc_compression_options grpc_channel_compression_options(
|
98
|
+
const grpc_channel* channel) {
|
99
|
+
return channel->compression_options;
|
100
|
+
}
|
101
|
+
|
102
|
+
inline grpc_channel_stack* grpc_channel_get_channel_stack(
|
103
|
+
grpc_channel* channel) {
|
104
|
+
return CHANNEL_STACK_FROM_CHANNEL(channel);
|
105
|
+
}
|
106
|
+
|
107
|
+
inline grpc_core::channelz::ChannelNode* grpc_channel_get_channelz_node(
|
108
|
+
grpc_channel* channel) {
|
109
|
+
return channel->channelz_node.get();
|
110
|
+
}
|
111
|
+
|
68
112
|
#ifndef NDEBUG
|
69
|
-
void grpc_channel_internal_ref(grpc_channel* channel,
|
70
|
-
|
113
|
+
inline void grpc_channel_internal_ref(grpc_channel* channel,
|
114
|
+
const char* reason) {
|
115
|
+
GRPC_CHANNEL_STACK_REF(CHANNEL_STACK_FROM_CHANNEL(channel), reason);
|
116
|
+
}
|
117
|
+
inline void grpc_channel_internal_unref(grpc_channel* channel,
|
118
|
+
const char* reason) {
|
119
|
+
GRPC_CHANNEL_STACK_UNREF(CHANNEL_STACK_FROM_CHANNEL(channel), reason);
|
120
|
+
}
|
71
121
|
#define GRPC_CHANNEL_INTERNAL_REF(channel, reason) \
|
72
122
|
grpc_channel_internal_ref(channel, reason)
|
73
123
|
#define GRPC_CHANNEL_INTERNAL_UNREF(channel, reason) \
|
74
124
|
grpc_channel_internal_unref(channel, reason)
|
75
125
|
#else
|
76
|
-
void grpc_channel_internal_ref(grpc_channel* channel)
|
77
|
-
|
126
|
+
inline void grpc_channel_internal_ref(grpc_channel* channel) {
|
127
|
+
GRPC_CHANNEL_STACK_REF(CHANNEL_STACK_FROM_CHANNEL(channel), "unused");
|
128
|
+
}
|
129
|
+
inline void grpc_channel_internal_unref(grpc_channel* channel) {
|
130
|
+
GRPC_CHANNEL_STACK_UNREF(CHANNEL_STACK_FROM_CHANNEL(channel), "unused");
|
131
|
+
}
|
78
132
|
#define GRPC_CHANNEL_INTERNAL_REF(channel, reason) \
|
79
133
|
grpc_channel_internal_ref(channel)
|
80
134
|
#define GRPC_CHANNEL_INTERNAL_UNREF(channel, reason) \
|
@@ -34,6 +34,7 @@
|
|
34
34
|
#include "src/core/lib/gpr/string.h"
|
35
35
|
#include "src/core/lib/gpr/tls.h"
|
36
36
|
#include "src/core/lib/gprpp/atomic.h"
|
37
|
+
#include "src/core/lib/iomgr/executor.h"
|
37
38
|
#include "src/core/lib/iomgr/pollset.h"
|
38
39
|
#include "src/core/lib/iomgr/timer.h"
|
39
40
|
#include "src/core/lib/profiling/timers.h"
|
@@ -200,7 +201,7 @@ struct cq_vtable {
|
|
200
201
|
bool (*begin_op)(grpc_completion_queue* cq, void* tag);
|
201
202
|
void (*end_op)(grpc_completion_queue* cq, void* tag, grpc_error* error,
|
202
203
|
void (*done)(void* done_arg, grpc_cq_completion* storage),
|
203
|
-
void* done_arg, grpc_cq_completion* storage);
|
204
|
+
void* done_arg, grpc_cq_completion* storage, bool internal);
|
204
205
|
grpc_event (*next)(grpc_completion_queue* cq, gpr_timespec deadline,
|
205
206
|
void* reserved);
|
206
207
|
grpc_event (*pluck)(grpc_completion_queue* cq, void* tag,
|
@@ -354,23 +355,20 @@ static bool cq_begin_op_for_callback(grpc_completion_queue* cq, void* tag);
|
|
354
355
|
// queue. The done argument is a callback that will be invoked when it is
|
355
356
|
// safe to free up that storage. The storage MUST NOT be freed until the
|
356
357
|
// done callback is invoked.
|
357
|
-
static void cq_end_op_for_next(
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
void (*done)(void* done_arg,
|
372
|
-
grpc_cq_completion* storage),
|
373
|
-
void* done_arg, grpc_cq_completion* storage);
|
358
|
+
static void cq_end_op_for_next(
|
359
|
+
grpc_completion_queue* cq, void* tag, grpc_error* error,
|
360
|
+
void (*done)(void* done_arg, grpc_cq_completion* storage), void* done_arg,
|
361
|
+
grpc_cq_completion* storage, bool internal);
|
362
|
+
|
363
|
+
static void cq_end_op_for_pluck(
|
364
|
+
grpc_completion_queue* cq, void* tag, grpc_error* error,
|
365
|
+
void (*done)(void* done_arg, grpc_cq_completion* storage), void* done_arg,
|
366
|
+
grpc_cq_completion* storage, bool internal);
|
367
|
+
|
368
|
+
static void cq_end_op_for_callback(
|
369
|
+
grpc_completion_queue* cq, void* tag, grpc_error* error,
|
370
|
+
void (*done)(void* done_arg, grpc_cq_completion* storage), void* done_arg,
|
371
|
+
grpc_cq_completion* storage, bool internal);
|
374
372
|
|
375
373
|
static grpc_event cq_next(grpc_completion_queue* cq, gpr_timespec deadline,
|
376
374
|
void* reserved);
|
@@ -674,11 +672,10 @@ bool grpc_cq_begin_op(grpc_completion_queue* cq, void* tag) {
|
|
674
672
|
/* Queue a GRPC_OP_COMPLETED operation to a completion queue (with a
|
675
673
|
* completion
|
676
674
|
* type of GRPC_CQ_NEXT) */
|
677
|
-
static void cq_end_op_for_next(
|
678
|
-
|
679
|
-
|
680
|
-
|
681
|
-
void* done_arg, grpc_cq_completion* storage) {
|
675
|
+
static void cq_end_op_for_next(
|
676
|
+
grpc_completion_queue* cq, void* tag, grpc_error* error,
|
677
|
+
void (*done)(void* done_arg, grpc_cq_completion* storage), void* done_arg,
|
678
|
+
grpc_cq_completion* storage, bool internal) {
|
682
679
|
GPR_TIMER_SCOPE("cq_end_op_for_next", 0);
|
683
680
|
|
684
681
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_api_trace) ||
|
@@ -754,11 +751,10 @@ static void cq_end_op_for_next(grpc_completion_queue* cq, void* tag,
|
|
754
751
|
/* Queue a GRPC_OP_COMPLETED operation to a completion queue (with a
|
755
752
|
* completion
|
756
753
|
* type of GRPC_CQ_PLUCK) */
|
757
|
-
static void cq_end_op_for_pluck(
|
758
|
-
|
759
|
-
|
760
|
-
|
761
|
-
void* done_arg, grpc_cq_completion* storage) {
|
754
|
+
static void cq_end_op_for_pluck(
|
755
|
+
grpc_completion_queue* cq, void* tag, grpc_error* error,
|
756
|
+
void (*done)(void* done_arg, grpc_cq_completion* storage), void* done_arg,
|
757
|
+
grpc_cq_completion* storage, bool internal) {
|
762
758
|
GPR_TIMER_SCOPE("cq_end_op_for_pluck", 0);
|
763
759
|
|
764
760
|
cq_pluck_data* cqd = static_cast<cq_pluck_data*> DATA_FROM_CQ(cq);
|
@@ -821,15 +817,19 @@ static void cq_end_op_for_pluck(grpc_completion_queue* cq, void* tag,
|
|
821
817
|
GRPC_ERROR_UNREF(error);
|
822
818
|
}
|
823
819
|
|
820
|
+
static void functor_callback(void* arg, grpc_error* error) {
|
821
|
+
auto* functor = static_cast<grpc_experimental_completion_queue_functor*>(arg);
|
822
|
+
functor->functor_run(functor, error == GRPC_ERROR_NONE);
|
823
|
+
}
|
824
|
+
|
824
825
|
/* Complete an event on a completion queue of type GRPC_CQ_CALLBACK */
|
825
826
|
static void cq_end_op_for_callback(
|
826
827
|
grpc_completion_queue* cq, void* tag, grpc_error* error,
|
827
828
|
void (*done)(void* done_arg, grpc_cq_completion* storage), void* done_arg,
|
828
|
-
grpc_cq_completion* storage) {
|
829
|
+
grpc_cq_completion* storage, bool internal) {
|
829
830
|
GPR_TIMER_SCOPE("cq_end_op_for_callback", 0);
|
830
831
|
|
831
832
|
cq_callback_data* cqd = static_cast<cq_callback_data*> DATA_FROM_CQ(cq);
|
832
|
-
bool is_success = (error == GRPC_ERROR_NONE);
|
833
833
|
|
834
834
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_api_trace) ||
|
835
835
|
(GRPC_TRACE_FLAG_ENABLED(grpc_trace_operation_failures) &&
|
@@ -856,16 +856,25 @@ static void cq_end_op_for_callback(
|
|
856
856
|
cq_finish_shutdown_callback(cq);
|
857
857
|
}
|
858
858
|
|
859
|
-
GRPC_ERROR_UNREF(error);
|
860
|
-
|
861
859
|
auto* functor = static_cast<grpc_experimental_completion_queue_functor*>(tag);
|
862
|
-
|
860
|
+
if (internal) {
|
861
|
+
grpc_core::ApplicationCallbackExecCtx::Enqueue(functor,
|
862
|
+
(error == GRPC_ERROR_NONE));
|
863
|
+
GRPC_ERROR_UNREF(error);
|
864
|
+
} else {
|
865
|
+
GRPC_CLOSURE_SCHED(
|
866
|
+
GRPC_CLOSURE_CREATE(
|
867
|
+
functor_callback, functor,
|
868
|
+
grpc_core::Executor::Scheduler(grpc_core::ExecutorJobType::SHORT)),
|
869
|
+
error);
|
870
|
+
}
|
863
871
|
}
|
864
872
|
|
865
873
|
void grpc_cq_end_op(grpc_completion_queue* cq, void* tag, grpc_error* error,
|
866
874
|
void (*done)(void* done_arg, grpc_cq_completion* storage),
|
867
|
-
void* done_arg, grpc_cq_completion* storage
|
868
|
-
|
875
|
+
void* done_arg, grpc_cq_completion* storage,
|
876
|
+
bool internal) {
|
877
|
+
cq->vtable->end_op(cq, tag, error, done, done_arg, storage, internal);
|
869
878
|
}
|
870
879
|
|
871
880
|
typedef struct {
|
@@ -1343,7 +1352,11 @@ static void cq_finish_shutdown_callback(grpc_completion_queue* cq) {
|
|
1343
1352
|
GPR_ASSERT(cqd->shutdown_called);
|
1344
1353
|
|
1345
1354
|
cq->poller_vtable->shutdown(POLLSET_FROM_CQ(cq), &cq->pollset_shutdown_done);
|
1346
|
-
|
1355
|
+
GRPC_CLOSURE_SCHED(
|
1356
|
+
GRPC_CLOSURE_CREATE(
|
1357
|
+
functor_callback, callback,
|
1358
|
+
grpc_core::Executor::Scheduler(grpc_core::ExecutorJobType::SHORT)),
|
1359
|
+
GRPC_ERROR_NONE);
|
1347
1360
|
}
|
1348
1361
|
|
1349
1362
|
static void cq_shutdown_callback(grpc_completion_queue* cq) {
|