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.

Files changed (141) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +422 -62
  3. data/include/grpc/grpc_security.h +61 -5
  4. data/include/grpc/grpc_security_constants.h +1 -1
  5. data/include/grpc/impl/codegen/gpr_types.h +1 -1
  6. data/include/grpc/slice.h +2 -2
  7. data/src/core/ext/filters/client_channel/backup_poller.cc +2 -3
  8. data/src/core/ext/filters/client_channel/backup_poller.h +5 -2
  9. data/src/core/ext/filters/client_channel/client_channel.cc +260 -122
  10. data/src/core/ext/filters/client_channel/client_channel.h +0 -8
  11. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +3 -84
  12. data/src/core/ext/filters/client_channel/client_channel_channelz.h +2 -28
  13. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +2 -8
  14. data/src/core/ext/filters/client_channel/health/health_check_client.cc +5 -4
  15. data/src/core/ext/filters/client_channel/lb_policy.cc +16 -2
  16. data/src/core/ext/filters/client_channel/lb_policy.h +92 -98
  17. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +63 -87
  18. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +6 -2
  19. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +35 -87
  20. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +18 -74
  21. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +167 -217
  22. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +216 -190
  23. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.cc +6 -2
  24. data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -1
  25. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +1 -1
  26. data/src/core/ext/filters/client_channel/lb_policy_registry.h +1 -1
  27. data/src/core/ext/filters/client_channel/resolver.h +1 -1
  28. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +6 -3
  29. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +0 -1
  30. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +2 -0
  31. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +8 -8
  32. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +7 -7
  33. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +28 -64
  34. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +4 -12
  35. data/src/core/ext/filters/client_channel/server_address.cc +4 -6
  36. data/src/core/ext/filters/client_channel/server_address.h +1 -3
  37. data/src/core/ext/filters/client_channel/service_config.cc +20 -22
  38. data/src/core/ext/filters/client_channel/service_config.h +26 -28
  39. data/src/core/ext/filters/client_channel/subchannel.cc +261 -160
  40. data/src/core/ext/filters/client_channel/subchannel.h +97 -23
  41. data/src/core/ext/filters/client_channel/subchannel_interface.h +113 -0
  42. data/src/core/ext/filters/message_size/message_size_filter.cc +12 -12
  43. data/src/core/ext/filters/message_size/message_size_filter.h +2 -2
  44. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +50 -2
  45. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +2 -2
  46. data/src/core/ext/transport/chttp2/transport/frame_data.cc +31 -36
  47. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +3 -2
  48. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +71 -52
  49. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +18 -3
  50. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +5 -12
  51. data/src/core/ext/transport/chttp2/transport/hpack_table.h +10 -1
  52. data/src/core/ext/transport/chttp2/transport/internal.h +3 -3
  53. data/src/core/ext/transport/chttp2/transport/parsing.cc +39 -57
  54. data/src/core/lib/channel/channelz.cc +136 -19
  55. data/src/core/lib/channel/channelz.h +36 -40
  56. data/src/core/lib/channel/channelz_registry.cc +74 -106
  57. data/src/core/lib/channel/channelz_registry.h +10 -28
  58. data/src/core/lib/channel/context.h +1 -1
  59. data/src/core/lib/channel/handshaker.cc +6 -0
  60. data/src/core/lib/compression/compression.cc +13 -8
  61. data/src/core/lib/compression/compression_internal.cc +14 -10
  62. data/src/core/lib/compression/compression_internal.h +1 -1
  63. data/src/core/lib/compression/stream_compression.cc +3 -2
  64. data/src/core/lib/compression/stream_compression.h +2 -2
  65. data/src/core/lib/compression/stream_compression_gzip.cc +9 -9
  66. data/src/core/lib/gpr/env.h +1 -1
  67. data/src/core/lib/gpr/string.cc +8 -1
  68. data/src/core/lib/gpr/string.h +6 -1
  69. data/src/core/lib/gprpp/fork.cc +1 -1
  70. data/src/core/lib/gprpp/fork.h +5 -1
  71. data/src/core/lib/gprpp/global_config.h +9 -0
  72. data/src/core/lib/gprpp/global_config_custom.h +1 -1
  73. data/src/core/lib/gprpp/inlined_vector.h +8 -0
  74. data/src/core/lib/gprpp/map.h +38 -21
  75. data/src/core/lib/gprpp/memory.h +2 -2
  76. data/src/core/lib/gprpp/orphanable.h +1 -1
  77. data/src/core/lib/gprpp/ref_counted.h +9 -4
  78. data/src/core/lib/http/httpcli.cc +3 -3
  79. data/src/core/lib/iomgr/buffer_list.h +1 -1
  80. data/src/core/lib/iomgr/call_combiner.cc +1 -1
  81. data/src/core/lib/iomgr/call_combiner.h +1 -1
  82. data/src/core/lib/iomgr/cfstream_handle.cc +3 -2
  83. data/src/core/lib/iomgr/cfstream_handle.h +4 -0
  84. data/src/core/lib/iomgr/error.cc +3 -3
  85. data/src/core/lib/iomgr/error.h +9 -3
  86. data/src/core/lib/iomgr/error_internal.h +1 -1
  87. data/src/core/lib/iomgr/ev_epoll1_linux.cc +1 -1
  88. data/src/core/lib/iomgr/ev_posix.cc +3 -3
  89. data/src/core/lib/iomgr/ev_posix.h +3 -2
  90. data/src/core/lib/iomgr/ev_windows.cc +2 -2
  91. data/src/core/lib/iomgr/iomgr.cc +4 -4
  92. data/src/core/lib/iomgr/lockfree_event.cc +1 -1
  93. data/src/core/lib/iomgr/port.h +5 -1
  94. data/src/core/lib/iomgr/tcp_posix.cc +1 -3
  95. data/src/core/lib/iomgr/tcp_server.cc +5 -0
  96. data/src/core/lib/iomgr/tcp_server.h +24 -0
  97. data/src/core/lib/iomgr/tcp_server_custom.cc +11 -9
  98. data/src/core/lib/iomgr/tcp_server_posix.cc +72 -11
  99. data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -0
  100. data/src/core/lib/iomgr/tcp_server_windows.cc +11 -9
  101. data/src/core/lib/iomgr/tcp_uv.cc +5 -6
  102. data/src/core/lib/iomgr/timer.h +2 -1
  103. data/src/core/lib/iomgr/udp_server.cc +2 -2
  104. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +1 -1
  105. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +20 -2
  106. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +2 -2
  107. data/src/core/lib/security/security_connector/security_connector.h +1 -1
  108. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +1 -1
  109. data/src/core/lib/security/transport/auth_filters.h +3 -0
  110. data/src/core/lib/security/transport/client_auth_filter.cc +13 -0
  111. data/src/core/lib/security/transport/security_handshaker.cc +7 -7
  112. data/src/core/lib/slice/b64.h +2 -2
  113. data/src/core/lib/slice/slice.cc +82 -10
  114. data/src/core/lib/slice/slice_buffer.cc +49 -21
  115. data/src/core/lib/slice/slice_hash_table.h +2 -2
  116. data/src/core/lib/slice/slice_intern.cc +15 -16
  117. data/src/core/lib/slice/slice_internal.h +52 -0
  118. data/src/core/lib/slice/slice_string_helpers.cc +10 -1
  119. data/src/core/lib/slice/slice_string_helpers.h +3 -1
  120. data/src/core/lib/slice/slice_utils.h +50 -0
  121. data/src/core/lib/slice/slice_weak_hash_table.h +2 -2
  122. data/src/core/lib/surface/call.cc +14 -8
  123. data/src/core/lib/surface/channel.cc +89 -97
  124. data/src/core/lib/surface/channel.h +60 -6
  125. data/src/core/lib/surface/completion_queue.cc +49 -36
  126. data/src/core/lib/surface/completion_queue.h +2 -1
  127. data/src/core/lib/surface/server.cc +8 -8
  128. data/src/core/lib/surface/validate_metadata.cc +14 -8
  129. data/src/core/lib/surface/validate_metadata.h +13 -2
  130. data/src/core/lib/surface/version.cc +1 -1
  131. data/src/core/lib/transport/metadata.cc +56 -26
  132. data/src/core/lib/transport/metadata.h +91 -75
  133. data/src/core/lib/transport/static_metadata.cc +262 -176
  134. data/src/core/lib/transport/static_metadata.h +272 -180
  135. data/src/core/lib/transport/transport.cc +1 -1
  136. data/src/core/lib/transport/transport.h +8 -2
  137. data/src/core/tsi/alts/handshaker/alts_shared_resource.h +1 -1
  138. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  139. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +5 -2
  140. data/src/ruby/lib/grpc/version.rb +1 -1
  141. 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
- channel_node_create_func =
165
- reinterpret_cast<grpc_core::channelz::ChannelNodeCreationFunc>(
166
- args->args[i].value.pointer.p);
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
- grpc_core::channelz::ChannelNode* grpc_channel_get_channelz_node(
218
- grpc_channel* channel) {
219
- return channel->channelz_channel.get();
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
- grpc_channel* channel =
245
- grpc_channel_create_with_builder(builder, channel_stack_type);
246
- return channel;
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->channelz_channel != nullptr) {
442
- channel->channelz_channel->AddTraceEvent(
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->channelz_channel->MarkChannelDestroyed();
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
- grpc_channel_stack* grpc_channel_get_channel_stack(grpc_channel* channel) {
479
- return CHANNEL_STACK_FROM_CHANNEL(channel);
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 grpc_channel_get_reffed_status_elem(grpc_channel* channel,
63
- int status_code);
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, const char* reason);
70
- void grpc_channel_internal_unref(grpc_channel* channel, const char* reason);
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
- void grpc_channel_internal_unref(grpc_channel* channel);
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(grpc_completion_queue* cq, void* tag,
358
- grpc_error* error,
359
- void (*done)(void* done_arg,
360
- grpc_cq_completion* storage),
361
- void* done_arg, grpc_cq_completion* storage);
362
-
363
- static void cq_end_op_for_pluck(grpc_completion_queue* cq, void* tag,
364
- grpc_error* error,
365
- void (*done)(void* done_arg,
366
- grpc_cq_completion* storage),
367
- void* done_arg, grpc_cq_completion* storage);
368
-
369
- static void cq_end_op_for_callback(grpc_completion_queue* cq, void* tag,
370
- grpc_error* error,
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(grpc_completion_queue* cq, void* tag,
678
- grpc_error* error,
679
- void (*done)(void* done_arg,
680
- grpc_cq_completion* storage),
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(grpc_completion_queue* cq, void* tag,
758
- grpc_error* error,
759
- void (*done)(void* done_arg,
760
- grpc_cq_completion* storage),
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
- grpc_core::ApplicationCallbackExecCtx::Enqueue(functor, is_success);
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
- cq->vtable->end_op(cq, tag, error, done, done_arg, storage);
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
- grpc_core::ApplicationCallbackExecCtx::Enqueue(callback, true);
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) {