grpc 1.16.0 → 1.17.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 (173) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +299 -133
  3. data/include/grpc/grpc.h +11 -1
  4. data/include/grpc/grpc_posix.h +0 -8
  5. data/include/grpc/impl/codegen/grpc_types.h +3 -0
  6. data/src/core/ext/filters/client_channel/client_channel.cc +336 -345
  7. data/src/core/ext/filters/client_channel/client_channel.h +6 -2
  8. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +3 -1
  9. data/src/core/ext/filters/client_channel/client_channel_channelz.h +0 -7
  10. data/src/core/ext/filters/client_channel/health/health.pb.c +23 -0
  11. data/src/core/ext/filters/client_channel/health/health.pb.h +73 -0
  12. data/src/core/ext/filters/client_channel/health/health_check_client.cc +652 -0
  13. data/src/core/ext/filters/client_channel/health/health_check_client.h +173 -0
  14. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +2 -1
  15. data/src/core/ext/filters/client_channel/http_proxy.cc +1 -1
  16. data/src/core/ext/filters/client_channel/lb_policy.h +17 -14
  17. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +15 -11
  18. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +21 -15
  19. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +18 -10
  20. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +12 -9
  21. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +19 -8
  22. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +1832 -0
  23. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +36 -0
  24. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel.h +36 -0
  25. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_secure.cc +107 -0
  26. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_client_stats.cc +85 -0
  27. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_client_stats.h +72 -0
  28. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.cc +307 -0
  29. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.h +89 -0
  30. data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +5 -0
  32. data/src/core/ext/filters/client_channel/lb_policy_registry.h +4 -0
  33. data/src/core/ext/filters/client_channel/parse_address.h +1 -1
  34. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +19 -22
  35. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +41 -39
  36. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +3 -2
  37. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +4 -1
  38. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +15 -2
  39. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +5 -1
  40. data/src/core/ext/filters/client_channel/resolver_factory.h +1 -1
  41. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +384 -0
  42. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +146 -0
  43. data/src/core/ext/filters/client_channel/subchannel.cc +361 -103
  44. data/src/core/ext/filters/client_channel/subchannel.h +14 -8
  45. data/src/core/ext/filters/deadline/deadline_filter.cc +19 -23
  46. data/src/core/ext/filters/deadline/deadline_filter.h +9 -13
  47. data/src/core/ext/filters/http/client/http_client_filter.cc +29 -19
  48. data/src/core/ext/filters/http/client_authority_filter.cc +2 -3
  49. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +28 -16
  50. data/src/core/ext/filters/http/server/http_server_filter.cc +31 -20
  51. data/src/core/ext/filters/message_size/message_size_filter.cc +50 -45
  52. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +13 -6
  53. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +1 -1
  54. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +58 -8
  55. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +1 -1
  56. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +175 -173
  57. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +2 -1
  58. data/src/core/ext/transport/chttp2/transport/frame_data.cc +4 -10
  59. data/src/core/ext/transport/chttp2/transport/frame_data.h +10 -12
  60. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +1 -1
  61. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +28 -25
  62. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +0 -12
  63. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +12 -9
  64. data/src/core/ext/transport/chttp2/transport/internal.h +109 -94
  65. data/src/core/ext/transport/chttp2/transport/parsing.cc +4 -2
  66. data/src/core/ext/transport/inproc/inproc_transport.cc +280 -300
  67. data/src/core/lib/channel/channel_stack.cc +5 -4
  68. data/src/core/lib/channel/channel_stack.h +4 -4
  69. data/src/core/lib/channel/channel_stack_builder.cc +14 -2
  70. data/src/core/lib/channel/channel_stack_builder.h +8 -0
  71. data/src/core/lib/channel/channel_trace.cc +6 -2
  72. data/src/core/lib/channel/channelz.cc +137 -5
  73. data/src/core/lib/channel/channelz.h +32 -6
  74. data/src/core/lib/channel/channelz_registry.cc +134 -28
  75. data/src/core/lib/channel/channelz_registry.h +25 -3
  76. data/src/core/lib/channel/context.h +4 -4
  77. data/src/core/lib/channel/handshaker.cc +7 -6
  78. data/src/core/lib/channel/handshaker.h +7 -8
  79. data/src/core/lib/channel/handshaker_factory.cc +3 -2
  80. data/src/core/lib/channel/handshaker_factory.h +2 -0
  81. data/src/core/lib/channel/handshaker_registry.cc +6 -2
  82. data/src/core/lib/channel/handshaker_registry.h +1 -0
  83. data/src/core/lib/gpr/arena.cc +84 -37
  84. data/src/core/lib/gpr/arena.h +2 -0
  85. data/src/core/lib/gpr/mpscq.h +4 -2
  86. data/src/core/lib/gprpp/inlined_vector.h +8 -0
  87. data/src/core/lib/gprpp/ref_counted.h +105 -18
  88. data/src/core/lib/gprpp/ref_counted_ptr.h +11 -0
  89. data/src/core/lib/http/httpcli_security_connector.cc +7 -4
  90. data/src/core/lib/iomgr/call_combiner.cc +2 -0
  91. data/src/core/lib/iomgr/call_combiner.h +2 -2
  92. data/src/core/lib/iomgr/closure.h +1 -0
  93. data/src/core/lib/iomgr/error.cc +16 -31
  94. data/src/core/lib/iomgr/error.h +29 -4
  95. data/src/core/lib/iomgr/error_internal.h +0 -2
  96. data/src/core/lib/iomgr/ev_epoll1_linux.cc +7 -3
  97. data/src/core/lib/iomgr/ev_posix.cc +0 -2
  98. data/src/core/lib/iomgr/polling_entity.h +4 -4
  99. data/src/core/lib/iomgr/resource_quota.cc +64 -10
  100. data/src/core/lib/iomgr/resource_quota.h +21 -6
  101. data/src/core/lib/iomgr/socket_utils_common_posix.cc +11 -5
  102. data/src/core/lib/iomgr/tcp_client_custom.cc +14 -3
  103. data/src/core/lib/iomgr/tcp_client_posix.cc +2 -0
  104. data/src/core/lib/iomgr/tcp_posix.cc +4 -2
  105. data/src/core/lib/iomgr/timer_manager.cc +1 -1
  106. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +3 -4
  107. data/src/core/lib/security/context/security_context.cc +20 -13
  108. data/src/core/lib/security/context/security_context.h +27 -19
  109. data/src/core/lib/security/credentials/alts/alts_credentials.cc +1 -1
  110. data/src/core/lib/security/credentials/credentials.h +2 -2
  111. data/src/core/lib/security/credentials/fake/fake_credentials.cc +1 -0
  112. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +39 -54
  113. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +3 -2
  114. data/src/core/lib/security/credentials/local/local_credentials.cc +1 -1
  115. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +1 -2
  116. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +2 -0
  117. data/src/core/lib/security/security_connector/{alts_security_connector.cc → alts/alts_security_connector.cc} +10 -9
  118. data/src/core/lib/security/security_connector/{alts_security_connector.h → alts/alts_security_connector.h} +3 -3
  119. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +310 -0
  120. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +42 -0
  121. data/src/core/lib/security/security_connector/{local_security_connector.cc → local/local_security_connector.cc} +4 -3
  122. data/src/core/lib/security/security_connector/{local_security_connector.h → local/local_security_connector.h} +3 -3
  123. data/src/core/lib/security/security_connector/security_connector.cc +4 -1039
  124. data/src/core/lib/security/security_connector/security_connector.h +6 -114
  125. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +474 -0
  126. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +77 -0
  127. data/src/core/lib/security/security_connector/ssl_utils.cc +345 -0
  128. data/src/core/lib/security/security_connector/ssl_utils.h +93 -0
  129. data/src/core/lib/security/transport/client_auth_filter.cc +28 -17
  130. data/src/core/lib/security/transport/secure_endpoint.cc +51 -41
  131. data/src/core/lib/security/transport/security_handshaker.cc +6 -7
  132. data/src/core/lib/security/transport/server_auth_filter.cc +39 -31
  133. data/src/core/lib/surface/call.cc +100 -80
  134. data/src/core/lib/surface/call.h +4 -0
  135. data/src/core/lib/surface/channel.cc +27 -13
  136. data/src/core/lib/surface/channel.h +4 -3
  137. data/src/core/lib/surface/completion_queue.cc +8 -1
  138. data/src/core/lib/surface/init.cc +1 -0
  139. data/src/core/lib/surface/server.cc +111 -46
  140. data/src/core/lib/surface/server.h +16 -2
  141. data/src/core/lib/surface/version.cc +2 -2
  142. data/src/core/lib/transport/error_utils.cc +4 -2
  143. data/src/core/lib/transport/metadata.cc +3 -2
  144. data/src/core/lib/transport/metadata.h +3 -2
  145. data/src/core/lib/transport/metadata_batch.cc +1 -0
  146. data/src/core/lib/transport/metadata_batch.h +4 -2
  147. data/src/core/lib/transport/static_metadata.cc +225 -221
  148. data/src/core/lib/transport/static_metadata.h +74 -71
  149. data/src/core/lib/transport/transport.h +44 -26
  150. data/src/core/{ext/filters/client_channel → lib/uri}/uri_parser.cc +1 -1
  151. data/src/core/{ext/filters/client_channel → lib/uri}/uri_parser.h +3 -3
  152. data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -4
  153. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +356 -77
  154. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +46 -36
  155. data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +83 -0
  156. data/src/core/tsi/alts/handshaker/alts_shared_resource.h +73 -0
  157. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +122 -175
  158. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +33 -22
  159. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +38 -10
  160. data/src/core/tsi/transport_security.cc +18 -1
  161. data/src/core/tsi/transport_security.h +2 -1
  162. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -2
  163. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -3
  164. data/src/ruby/lib/grpc/version.rb +1 -1
  165. data/src/ruby/spec/pb/codegen/grpc/testing/package_options.proto +28 -0
  166. data/src/ruby/spec/pb/codegen/package_option_spec.rb +2 -3
  167. metadata +58 -40
  168. data/src/core/ext/filters/client_channel/method_params.cc +0 -178
  169. data/src/core/ext/filters/client_channel/method_params.h +0 -78
  170. data/src/core/tsi/alts/handshaker/alts_tsi_event.cc +0 -75
  171. data/src/core/tsi/alts/handshaker/alts_tsi_event.h +0 -93
  172. data/src/core/tsi/alts_transport_security.cc +0 -65
  173. data/src/core/tsi/alts_transport_security.h +0 -47
@@ -81,6 +81,10 @@ grpc_call_error grpc_call_start_batch_and_execute(grpc_call* call,
81
81
  size_t nops,
82
82
  grpc_closure* closure);
83
83
 
84
+ /* gRPC core internal version of grpc_call_cancel that does not create
85
+ * exec_ctx. */
86
+ void grpc_call_cancel_internal(grpc_call* call);
87
+
84
88
  /* Given the top call_element, get the call object. */
85
89
  grpc_call* grpc_call_from_top_element(grpc_call_element* surface_element);
86
90
 
@@ -39,6 +39,7 @@
39
39
  #include "src/core/lib/gprpp/memory.h"
40
40
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
41
41
  #include "src/core/lib/iomgr/iomgr.h"
42
+ #include "src/core/lib/iomgr/resource_quota.h"
42
43
  #include "src/core/lib/slice/slice_internal.h"
43
44
  #include "src/core/lib/surface/api_trace.h"
44
45
  #include "src/core/lib/surface/call.h"
@@ -63,6 +64,7 @@ struct grpc_channel {
63
64
  grpc_compression_options compression_options;
64
65
 
65
66
  gpr_atm call_size_estimate;
67
+ grpc_resource_user* resource_user;
66
68
 
67
69
  gpr_mu registered_call_mu;
68
70
  registered_call* registered_calls;
@@ -82,6 +84,8 @@ grpc_channel* grpc_channel_create_with_builder(
82
84
  char* target = gpr_strdup(grpc_channel_stack_builder_get_target(builder));
83
85
  grpc_channel_args* args = grpc_channel_args_copy(
84
86
  grpc_channel_stack_builder_get_channel_arguments(builder));
87
+ grpc_resource_user* resource_user =
88
+ grpc_channel_stack_builder_get_resource_user(builder);
85
89
  grpc_channel* channel;
86
90
  if (channel_stack_type == GRPC_SERVER_CHANNEL) {
87
91
  GRPC_STATS_INC_SERVER_CHANNELS_CREATED();
@@ -101,9 +105,11 @@ grpc_channel* grpc_channel_create_with_builder(
101
105
  }
102
106
 
103
107
  channel->target = target;
108
+ channel->resource_user = resource_user;
104
109
  channel->is_client = grpc_channel_stack_type_is_client(channel_stack_type);
105
110
  bool channelz_enabled = GRPC_ENABLE_CHANNELZ_DEFAULT;
106
- size_t channel_tracer_max_memory = 0; // default to off
111
+ size_t channel_tracer_max_memory =
112
+ GRPC_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE_DEFAULT;
107
113
  bool internal_channel = false;
108
114
  // this creates the default ChannelNode. Different types of channels may
109
115
  // override this to ensure a correct ChannelNode is created.
@@ -142,7 +148,6 @@ grpc_channel* grpc_channel_create_with_builder(
142
148
  0x1; /* always support no compression */
143
149
  } else if (0 == strcmp(args->args[i].key,
144
150
  GRPC_ARG_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE)) {
145
- GPR_ASSERT(channel_tracer_max_memory == 0);
146
151
  const grpc_integer_options options = {
147
152
  GRPC_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE_DEFAULT, 0, INT_MAX};
148
153
  channel_tracer_max_memory =
@@ -217,7 +222,8 @@ grpc_core::channelz::ChannelNode* grpc_channel_get_channelz_node(
217
222
  grpc_channel* grpc_channel_create(const char* target,
218
223
  const grpc_channel_args* input_args,
219
224
  grpc_channel_stack_type channel_stack_type,
220
- grpc_transport* optional_transport) {
225
+ grpc_transport* optional_transport,
226
+ grpc_resource_user* resource_user) {
221
227
  grpc_channel_stack_builder* builder = grpc_channel_stack_builder_create();
222
228
  const grpc_core::UniquePtr<char> default_authority =
223
229
  get_default_authority(input_args);
@@ -227,11 +233,17 @@ grpc_channel* grpc_channel_create(const char* target,
227
233
  grpc_channel_args_destroy(args);
228
234
  grpc_channel_stack_builder_set_target(builder, target);
229
235
  grpc_channel_stack_builder_set_transport(builder, optional_transport);
236
+ grpc_channel_stack_builder_set_resource_user(builder, resource_user);
230
237
  if (!grpc_channel_init_create_stack(builder, channel_stack_type)) {
231
238
  grpc_channel_stack_builder_destroy(builder);
239
+ if (resource_user != nullptr) {
240
+ grpc_resource_user_free(resource_user, GRPC_RESOURCE_QUOTA_CHANNEL_SIZE);
241
+ }
232
242
  return nullptr;
233
243
  }
234
- return grpc_channel_create_with_builder(builder, channel_stack_type);
244
+ grpc_channel* channel =
245
+ grpc_channel_create_with_builder(builder, channel_stack_type);
246
+ return channel;
235
247
  }
236
248
 
237
249
  size_t grpc_channel_get_call_size_estimate(grpc_channel* channel) {
@@ -310,8 +322,8 @@ static grpc_call* grpc_channel_create_call_internal(
310
322
  }
311
323
 
312
324
  grpc_call_create_args args;
313
- memset(&args, 0, sizeof(args));
314
325
  args.channel = channel;
326
+ args.server = nullptr;
315
327
  args.parent = parent_call;
316
328
  args.propagation_mask = propagation_mask;
317
329
  args.cq = cq;
@@ -336,9 +348,8 @@ grpc_call* grpc_channel_create_call(grpc_channel* channel,
336
348
  grpc_core::ExecCtx exec_ctx;
337
349
  grpc_call* call = grpc_channel_create_call_internal(
338
350
  channel, parent_call, propagation_mask, cq, nullptr,
339
- grpc_mdelem_from_slices(GRPC_MDSTR_PATH, grpc_slice_ref_internal(method)),
340
- host != nullptr ? grpc_mdelem_from_slices(GRPC_MDSTR_AUTHORITY,
341
- grpc_slice_ref_internal(*host))
351
+ grpc_mdelem_create(GRPC_MDSTR_PATH, method, nullptr),
352
+ host != nullptr ? grpc_mdelem_create(GRPC_MDSTR_AUTHORITY, *host, nullptr)
342
353
  : GRPC_MDNULL,
343
354
  grpc_timespec_to_millis_round_up(deadline));
344
355
 
@@ -347,14 +358,13 @@ grpc_call* grpc_channel_create_call(grpc_channel* channel,
347
358
 
348
359
  grpc_call* grpc_channel_create_pollset_set_call(
349
360
  grpc_channel* channel, grpc_call* parent_call, uint32_t propagation_mask,
350
- grpc_pollset_set* pollset_set, grpc_slice method, const grpc_slice* host,
351
- grpc_millis deadline, void* reserved) {
361
+ grpc_pollset_set* pollset_set, const grpc_slice& method,
362
+ const grpc_slice* host, grpc_millis deadline, void* reserved) {
352
363
  GPR_ASSERT(!reserved);
353
364
  return grpc_channel_create_call_internal(
354
365
  channel, parent_call, propagation_mask, nullptr, pollset_set,
355
- grpc_mdelem_from_slices(GRPC_MDSTR_PATH, grpc_slice_ref_internal(method)),
356
- host != nullptr ? grpc_mdelem_from_slices(GRPC_MDSTR_AUTHORITY,
357
- grpc_slice_ref_internal(*host))
366
+ grpc_mdelem_create(GRPC_MDSTR_PATH, method, nullptr),
367
+ host != nullptr ? grpc_mdelem_create(GRPC_MDSTR_AUTHORITY, *host, nullptr)
358
368
  : GRPC_MDNULL,
359
369
  deadline);
360
370
  }
@@ -443,6 +453,10 @@ static void destroy_channel(void* arg, grpc_error* error) {
443
453
  GRPC_MDELEM_UNREF(rc->authority);
444
454
  gpr_free(rc);
445
455
  }
456
+ if (channel->resource_user != nullptr) {
457
+ grpc_resource_user_free(channel->resource_user,
458
+ GRPC_RESOURCE_QUOTA_CHANNEL_SIZE);
459
+ }
446
460
  gpr_mu_destroy(&channel->registered_call_mu);
447
461
  gpr_free(channel->target);
448
462
  gpr_free(channel);
@@ -29,7 +29,8 @@
29
29
  grpc_channel* grpc_channel_create(const char* target,
30
30
  const grpc_channel_args* args,
31
31
  grpc_channel_stack_type channel_stack_type,
32
- grpc_transport* optional_transport);
32
+ grpc_transport* optional_transport,
33
+ grpc_resource_user* resource_user = nullptr);
33
34
 
34
35
  grpc_channel* grpc_channel_create_with_builder(
35
36
  grpc_channel_stack_builder* builder,
@@ -45,8 +46,8 @@ grpc_channel* grpc_channel_create_with_builder(
45
46
  value of \a propagation_mask (see propagation_bits.h for possible values) */
46
47
  grpc_call* grpc_channel_create_pollset_set_call(
47
48
  grpc_channel* channel, grpc_call* parent_call, uint32_t propagation_mask,
48
- grpc_pollset_set* pollset_set, grpc_slice method, const grpc_slice* host,
49
- grpc_millis deadline, void* reserved);
49
+ grpc_pollset_set* pollset_set, const grpc_slice& method,
50
+ const grpc_slice* host, grpc_millis deadline, void* reserved);
50
51
 
51
52
  /** Get a (borrowed) pointer to this channels underlying channel stack */
52
53
  grpc_channel_stack* grpc_channel_get_channel_stack(grpc_channel* channel);
@@ -79,6 +79,7 @@ typedef struct non_polling_worker {
79
79
 
80
80
  typedef struct {
81
81
  gpr_mu mu;
82
+ bool kicked_without_poller;
82
83
  non_polling_worker* root;
83
84
  grpc_closure* shutdown;
84
85
  } non_polling_poller;
@@ -103,6 +104,10 @@ static grpc_error* non_polling_poller_work(grpc_pollset* pollset,
103
104
  grpc_millis deadline) {
104
105
  non_polling_poller* npp = reinterpret_cast<non_polling_poller*>(pollset);
105
106
  if (npp->shutdown) return GRPC_ERROR_NONE;
107
+ if (npp->kicked_without_poller) {
108
+ npp->kicked_without_poller = false;
109
+ return GRPC_ERROR_NONE;
110
+ }
106
111
  non_polling_worker w;
107
112
  gpr_cv_init(&w.cv);
108
113
  if (worker != nullptr) *worker = reinterpret_cast<grpc_pollset_worker*>(&w);
@@ -148,6 +153,8 @@ static grpc_error* non_polling_poller_kick(
148
153
  w->kicked = true;
149
154
  gpr_cv_signal(&w->cv);
150
155
  }
156
+ } else {
157
+ p->kicked_without_poller = true;
151
158
  }
152
159
  return GRPC_ERROR_NONE;
153
160
  }
@@ -852,8 +859,8 @@ static void cq_end_op_for_callback(
852
859
 
853
860
  gpr_atm_no_barrier_fetch_add(&cqd->things_queued_ever, 1);
854
861
  if (gpr_atm_full_fetch_add(&cqd->pending_events, -1) == 1) {
855
- cq_finish_shutdown_callback(cq);
856
862
  gpr_mu_unlock(cq->mu);
863
+ cq_finish_shutdown_callback(cq);
857
864
  } else {
858
865
  gpr_mu_unlock(cq->mu);
859
866
  }
@@ -123,6 +123,7 @@ void grpc_init(void) {
123
123
  grpc_core::Fork::GlobalInit();
124
124
  grpc_fork_handlers_auto_register();
125
125
  gpr_time_init();
126
+ gpr_arena_init();
126
127
  grpc_stats_init();
127
128
  grpc_slice_intern_init();
128
129
  grpc_mdctx_global_init();
@@ -47,6 +47,10 @@
47
47
 
48
48
  grpc_core::TraceFlag grpc_server_channel_trace(false, "server_channel");
49
49
 
50
+ static void server_on_recv_initial_metadata(void* ptr, grpc_error* error);
51
+ static void server_recv_trailing_metadata_ready(void* user_data,
52
+ grpc_error* error);
53
+
50
54
  namespace {
51
55
  struct listener {
52
56
  void* arg;
@@ -54,6 +58,7 @@ struct listener {
54
58
  size_t pollset_count);
55
59
  void (*destroy)(grpc_server* server, void* arg, grpc_closure* closure);
56
60
  struct listener* next;
61
+ intptr_t socket_uuid;
57
62
  grpc_closure destroy_done;
58
63
  };
59
64
 
@@ -104,6 +109,7 @@ struct channel_data {
104
109
  uint32_t registered_method_max_probes;
105
110
  grpc_closure finish_destroy_channel_closure;
106
111
  grpc_closure channel_connectivity_changed;
112
+ intptr_t socket_uuid;
107
113
  };
108
114
 
109
115
  typedef struct shutdown_tag {
@@ -126,38 +132,62 @@ typedef enum {
126
132
  typedef struct request_matcher request_matcher;
127
133
 
128
134
  struct call_data {
135
+ call_data(grpc_call_element* elem, const grpc_call_element_args& args)
136
+ : call(grpc_call_from_top_element(elem)),
137
+ call_combiner(args.call_combiner) {
138
+ GRPC_CLOSURE_INIT(&server_on_recv_initial_metadata,
139
+ ::server_on_recv_initial_metadata, elem,
140
+ grpc_schedule_on_exec_ctx);
141
+ GRPC_CLOSURE_INIT(&recv_trailing_metadata_ready,
142
+ server_recv_trailing_metadata_ready, elem,
143
+ grpc_schedule_on_exec_ctx);
144
+ }
145
+ ~call_data() {
146
+ GPR_ASSERT(state != PENDING);
147
+ GRPC_ERROR_UNREF(recv_initial_metadata_error);
148
+ if (host_set) {
149
+ grpc_slice_unref_internal(host);
150
+ }
151
+ if (path_set) {
152
+ grpc_slice_unref_internal(path);
153
+ }
154
+ grpc_metadata_array_destroy(&initial_metadata);
155
+ grpc_byte_buffer_destroy(payload);
156
+ }
157
+
129
158
  grpc_call* call;
130
159
 
131
- gpr_atm state;
160
+ gpr_atm state = NOT_STARTED;
132
161
 
133
- bool path_set;
134
- bool host_set;
162
+ bool path_set = false;
163
+ bool host_set = false;
135
164
  grpc_slice path;
136
165
  grpc_slice host;
137
- grpc_millis deadline;
166
+ grpc_millis deadline = GRPC_MILLIS_INF_FUTURE;
138
167
 
139
- grpc_completion_queue* cq_new;
168
+ grpc_completion_queue* cq_new = nullptr;
140
169
 
141
- grpc_metadata_batch* recv_initial_metadata;
142
- uint32_t recv_initial_metadata_flags;
143
- grpc_metadata_array initial_metadata;
170
+ grpc_metadata_batch* recv_initial_metadata = nullptr;
171
+ uint32_t recv_initial_metadata_flags = 0;
172
+ grpc_metadata_array initial_metadata =
173
+ grpc_metadata_array(); // Zero-initialize the C struct.
144
174
 
145
- request_matcher* matcher;
146
- grpc_byte_buffer* payload;
175
+ request_matcher* matcher = nullptr;
176
+ grpc_byte_buffer* payload = nullptr;
147
177
 
148
178
  grpc_closure got_initial_metadata;
149
179
  grpc_closure server_on_recv_initial_metadata;
150
180
  grpc_closure kill_zombie_closure;
151
181
  grpc_closure* on_done_recv_initial_metadata;
152
182
  grpc_closure recv_trailing_metadata_ready;
153
- grpc_error* recv_initial_metadata_error;
183
+ grpc_error* recv_initial_metadata_error = GRPC_ERROR_NONE;
154
184
  grpc_closure* original_recv_trailing_metadata_ready;
155
- grpc_error* recv_trailing_metadata_error;
156
- bool seen_recv_trailing_metadata_ready;
185
+ grpc_error* recv_trailing_metadata_error = GRPC_ERROR_NONE;
186
+ bool seen_recv_trailing_metadata_ready = false;
157
187
 
158
188
  grpc_closure publish;
159
189
 
160
- call_data* pending_next;
190
+ call_data* pending_next = nullptr;
161
191
  grpc_call_combiner* call_combiner;
162
192
  };
163
193
 
@@ -187,6 +217,8 @@ typedef struct {
187
217
  struct grpc_server {
188
218
  grpc_channel_args* channel_args;
189
219
 
220
+ grpc_resource_user* default_resource_user;
221
+
190
222
  grpc_completion_queue** cqs;
191
223
  grpc_pollset** pollsets;
192
224
  size_t cq_count;
@@ -820,11 +852,16 @@ static void accept_stream(void* cd, grpc_transport* transport,
820
852
  channel_data* chand = static_cast<channel_data*>(cd);
821
853
  /* create a call */
822
854
  grpc_call_create_args args;
823
- memset(&args, 0, sizeof(args));
824
855
  args.channel = chand->channel;
856
+ args.server = chand->server;
857
+ args.parent = nullptr;
858
+ args.propagation_mask = 0;
859
+ args.cq = nullptr;
860
+ args.pollset_set_alternative = nullptr;
825
861
  args.server_transport_data = transport_server_data;
862
+ args.add_initial_metadata = nullptr;
863
+ args.add_initial_metadata_count = 0;
826
864
  args.send_deadline = GRPC_MILLIS_INF_FUTURE;
827
- args.server = chand->server;
828
865
  grpc_call* call;
829
866
  grpc_error* error = grpc_call_create(&args, &call);
830
867
  grpc_call_element* elem =
@@ -836,8 +873,9 @@ static void accept_stream(void* cd, grpc_transport* transport,
836
873
  }
837
874
  call_data* calld = static_cast<call_data*>(elem->call_data);
838
875
  grpc_op op;
839
- memset(&op, 0, sizeof(op));
840
876
  op.op = GRPC_OP_RECV_INITIAL_METADATA;
877
+ op.flags = 0;
878
+ op.reserved = nullptr;
841
879
  op.data.recv_initial_metadata.recv_initial_metadata =
842
880
  &calld->initial_metadata;
843
881
  GRPC_CLOSURE_INIT(&calld->got_initial_metadata, got_initial_metadata, elem,
@@ -865,40 +903,18 @@ static void channel_connectivity_changed(void* cd, grpc_error* error) {
865
903
 
866
904
  static grpc_error* init_call_elem(grpc_call_element* elem,
867
905
  const grpc_call_element_args* args) {
868
- call_data* calld = static_cast<call_data*>(elem->call_data);
869
906
  channel_data* chand = static_cast<channel_data*>(elem->channel_data);
870
- memset(calld, 0, sizeof(call_data));
871
- calld->deadline = GRPC_MILLIS_INF_FUTURE;
872
- calld->call = grpc_call_from_top_element(elem);
873
- calld->call_combiner = args->call_combiner;
874
-
875
- GRPC_CLOSURE_INIT(&calld->server_on_recv_initial_metadata,
876
- server_on_recv_initial_metadata, elem,
877
- grpc_schedule_on_exec_ctx);
878
- GRPC_CLOSURE_INIT(&calld->recv_trailing_metadata_ready,
879
- server_recv_trailing_metadata_ready, elem,
880
- grpc_schedule_on_exec_ctx);
881
907
  server_ref(chand->server);
908
+ new (elem->call_data) call_data(elem, *args);
882
909
  return GRPC_ERROR_NONE;
883
910
  }
884
911
 
885
912
  static void destroy_call_elem(grpc_call_element* elem,
886
913
  const grpc_call_final_info* final_info,
887
914
  grpc_closure* ignored) {
888
- channel_data* chand = static_cast<channel_data*>(elem->channel_data);
889
915
  call_data* calld = static_cast<call_data*>(elem->call_data);
890
-
891
- GPR_ASSERT(calld->state != PENDING);
892
- GRPC_ERROR_UNREF(calld->recv_initial_metadata_error);
893
- if (calld->host_set) {
894
- grpc_slice_unref_internal(calld->host);
895
- }
896
- if (calld->path_set) {
897
- grpc_slice_unref_internal(calld->path);
898
- }
899
- grpc_metadata_array_destroy(&calld->initial_metadata);
900
- grpc_byte_buffer_destroy(calld->payload);
901
-
916
+ calld->~call_data();
917
+ channel_data* chand = static_cast<channel_data*>(elem->channel_data);
902
918
  server_unref(chand->server);
903
919
  }
904
920
 
@@ -1016,12 +1032,21 @@ grpc_server* grpc_server_create(const grpc_channel_args* args, void* reserved) {
1016
1032
  {GRPC_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE_DEFAULT, 0, INT_MAX});
1017
1033
  server->channelz_server =
1018
1034
  grpc_core::MakeRefCounted<grpc_core::channelz::ServerNode>(
1019
- channel_tracer_max_memory);
1035
+ server, channel_tracer_max_memory);
1020
1036
  server->channelz_server->AddTraceEvent(
1021
1037
  grpc_core::channelz::ChannelTrace::Severity::Info,
1022
1038
  grpc_slice_from_static_string("Server created"));
1023
1039
  }
1024
1040
 
1041
+ if (args != nullptr) {
1042
+ grpc_resource_quota* resource_quota =
1043
+ grpc_resource_quota_from_channel_args(args, false /* create */);
1044
+ if (resource_quota != nullptr) {
1045
+ server->default_resource_user =
1046
+ grpc_resource_user_create(resource_quota, "default");
1047
+ }
1048
+ }
1049
+
1025
1050
  return server;
1026
1051
  }
1027
1052
 
@@ -1119,7 +1144,9 @@ void grpc_server_get_pollsets(grpc_server* server, grpc_pollset*** pollsets,
1119
1144
 
1120
1145
  void grpc_server_setup_transport(grpc_server* s, grpc_transport* transport,
1121
1146
  grpc_pollset* accepting_pollset,
1122
- const grpc_channel_args* args) {
1147
+ const grpc_channel_args* args,
1148
+ intptr_t socket_uuid,
1149
+ grpc_resource_user* resource_user) {
1123
1150
  size_t num_registered_methods;
1124
1151
  size_t alloc;
1125
1152
  registered_method* rm;
@@ -1132,13 +1159,15 @@ void grpc_server_setup_transport(grpc_server* s, grpc_transport* transport,
1132
1159
  uint32_t max_probes = 0;
1133
1160
  grpc_transport_op* op = nullptr;
1134
1161
 
1135
- channel = grpc_channel_create(nullptr, args, GRPC_SERVER_CHANNEL, transport);
1162
+ channel = grpc_channel_create(nullptr, args, GRPC_SERVER_CHANNEL, transport,
1163
+ resource_user);
1136
1164
  chand = static_cast<channel_data*>(
1137
1165
  grpc_channel_stack_element(grpc_channel_get_channel_stack(channel), 0)
1138
1166
  ->channel_data);
1139
1167
  chand->server = s;
1140
1168
  server_ref(s);
1141
1169
  chand->channel = channel;
1170
+ chand->socket_uuid = socket_uuid;
1142
1171
 
1143
1172
  size_t cq_idx;
1144
1173
  for (cq_idx = 0; cq_idx < s->cq_count; cq_idx++) {
@@ -1213,6 +1242,29 @@ void grpc_server_setup_transport(grpc_server* s, grpc_transport* transport,
1213
1242
  grpc_transport_perform_op(transport, op);
1214
1243
  }
1215
1244
 
1245
+ void grpc_server_populate_server_sockets(
1246
+ grpc_server* s, grpc_core::channelz::ChildRefsList* server_sockets,
1247
+ intptr_t start_idx) {
1248
+ gpr_mu_lock(&s->mu_global);
1249
+ channel_data* c = nullptr;
1250
+ for (c = s->root_channel_data.next; c != &s->root_channel_data; c = c->next) {
1251
+ intptr_t socket_uuid = c->socket_uuid;
1252
+ if (socket_uuid >= start_idx) {
1253
+ server_sockets->push_back(socket_uuid);
1254
+ }
1255
+ }
1256
+ gpr_mu_unlock(&s->mu_global);
1257
+ }
1258
+
1259
+ void grpc_server_populate_listen_sockets(
1260
+ grpc_server* server, grpc_core::channelz::ChildRefsList* listen_sockets) {
1261
+ gpr_mu_lock(&server->mu_global);
1262
+ for (listener* l = server->listeners; l != nullptr; l = l->next) {
1263
+ listen_sockets->push_back(l->socket_uuid);
1264
+ }
1265
+ gpr_mu_unlock(&server->mu_global);
1266
+ }
1267
+
1216
1268
  void done_published_shutdown(void* done_arg, grpc_cq_completion* storage) {
1217
1269
  (void)done_arg;
1218
1270
  gpr_free(storage);
@@ -1303,6 +1355,13 @@ void grpc_server_shutdown_and_notify(grpc_server* server,
1303
1355
 
1304
1356
  channel_broadcaster_shutdown(&broadcaster, true /* send_goaway */,
1305
1357
  GRPC_ERROR_NONE);
1358
+
1359
+ if (server->default_resource_user != nullptr) {
1360
+ grpc_resource_quota_unref(
1361
+ grpc_resource_user_quota(server->default_resource_user));
1362
+ grpc_resource_user_shutdown(server->default_resource_user);
1363
+ grpc_resource_user_unref(server->default_resource_user);
1364
+ }
1306
1365
  }
1307
1366
 
1308
1367
  void grpc_server_cancel_all_calls(grpc_server* server) {
@@ -1346,11 +1405,13 @@ void grpc_server_add_listener(grpc_server* server, void* arg,
1346
1405
  grpc_pollset** pollsets,
1347
1406
  size_t pollset_count),
1348
1407
  void (*destroy)(grpc_server* server, void* arg,
1349
- grpc_closure* on_done)) {
1408
+ grpc_closure* on_done),
1409
+ intptr_t socket_uuid) {
1350
1410
  listener* l = static_cast<listener*>(gpr_malloc(sizeof(listener)));
1351
1411
  l->arg = arg;
1352
1412
  l->start = start;
1353
1413
  l->destroy = destroy;
1414
+ l->socket_uuid = socket_uuid;
1354
1415
  l->next = server->listeners;
1355
1416
  server->listeners = l;
1356
1417
  }
@@ -1517,6 +1578,10 @@ const grpc_channel_args* grpc_server_get_channel_args(grpc_server* server) {
1517
1578
  return server->channel_args;
1518
1579
  }
1519
1580
 
1581
+ grpc_resource_user* grpc_server_get_default_resource_user(grpc_server* server) {
1582
+ return server->default_resource_user;
1583
+ }
1584
+
1520
1585
  int grpc_server_has_open_connections(grpc_server* server) {
1521
1586
  int r;
1522
1587
  gpr_mu_lock(&server->mu_global);