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
@@ -85,9 +85,11 @@ class ConnectedSubchannel : public RefCountedWithTracing<ConnectedSubchannel> {
85
85
  size_t parent_data_size;
86
86
  };
87
87
 
88
- explicit ConnectedSubchannel(grpc_channel_stack* channel_stack,
89
- channelz::SubchannelNode* channelz_subchannel,
90
- intptr_t socket_uuid);
88
+ explicit ConnectedSubchannel(
89
+ grpc_channel_stack* channel_stack,
90
+ grpc_core::RefCountedPtr<grpc_core::channelz::SubchannelNode>
91
+ channelz_subchannel,
92
+ intptr_t socket_uuid);
91
93
  ~ConnectedSubchannel();
92
94
 
93
95
  grpc_channel_stack* channel_stack() { return channel_stack_; }
@@ -97,15 +99,18 @@ class ConnectedSubchannel : public RefCountedWithTracing<ConnectedSubchannel> {
97
99
  void Ping(grpc_closure* on_initiate, grpc_closure* on_ack);
98
100
  grpc_error* CreateCall(const CallArgs& args, grpc_subchannel_call** call);
99
101
  channelz::SubchannelNode* channelz_subchannel() {
100
- return channelz_subchannel_;
102
+ return channelz_subchannel_.get();
101
103
  }
102
104
  intptr_t socket_uuid() { return socket_uuid_; }
103
105
 
106
+ size_t GetInitialCallSizeEstimate(size_t parent_data_size) const;
107
+
104
108
  private:
105
109
  grpc_channel_stack* channel_stack_;
106
- // backpointer to the channelz node in this connected subchannel's
110
+ // ref counted pointer to the channelz node in this connected subchannel's
107
111
  // owning subchannel.
108
- channelz::SubchannelNode* channelz_subchannel_;
112
+ grpc_core::RefCountedPtr<grpc_core::channelz::SubchannelNode>
113
+ channelz_subchannel_;
109
114
  // uuid of this subchannel's socket. 0 if this subchannel is not connected.
110
115
  const intptr_t socket_uuid_;
111
116
  };
@@ -140,13 +145,14 @@ void* grpc_connected_subchannel_call_get_parent_data(
140
145
 
141
146
  /** poll the current connectivity state of a channel */
142
147
  grpc_connectivity_state grpc_subchannel_check_connectivity(
143
- grpc_subchannel* channel, grpc_error** error);
148
+ grpc_subchannel* channel, grpc_error** error, bool inhibit_health_checking);
144
149
 
145
150
  /** Calls notify when the connectivity state of a channel becomes different
146
151
  from *state. Updates *state with the new state of the channel. */
147
152
  void grpc_subchannel_notify_on_state_change(
148
153
  grpc_subchannel* channel, grpc_pollset_set* interested_parties,
149
- grpc_connectivity_state* state, grpc_closure* notify);
154
+ grpc_connectivity_state* state, grpc_closure* notify,
155
+ bool inhibit_health_checks);
150
156
 
151
157
  /** retrieve the grpc_core::ConnectedSubchannel - or nullptr if not connected
152
158
  * (which may happen before it initially connects or during transient failures)
@@ -27,6 +27,7 @@
27
27
  #include <grpc/support/time.h>
28
28
 
29
29
  #include "src/core/lib/channel/channel_stack_builder.h"
30
+ #include "src/core/lib/gprpp/memory.h"
30
31
  #include "src/core/lib/iomgr/timer.h"
31
32
  #include "src/core/lib/slice/slice_internal.h"
32
33
  #include "src/core/lib/surface/channel_init.h"
@@ -152,7 +153,11 @@ static void inject_recv_trailing_metadata_ready(
152
153
  // Callback and associated state for starting the timer after call stack
153
154
  // initialization has been completed.
154
155
  struct start_timer_after_init_state {
155
- bool in_call_combiner;
156
+ start_timer_after_init_state(grpc_call_element* elem, grpc_millis deadline)
157
+ : elem(elem), deadline(deadline) {}
158
+ ~start_timer_after_init_state() { start_timer_if_needed(elem, deadline); }
159
+
160
+ bool in_call_combiner = false;
156
161
  grpc_call_element* elem;
157
162
  grpc_millis deadline;
158
163
  grpc_closure closure;
@@ -171,20 +176,16 @@ static void start_timer_after_init(void* arg, grpc_error* error) {
171
176
  "scheduling deadline timer");
172
177
  return;
173
178
  }
174
- start_timer_if_needed(state->elem, state->deadline);
175
- gpr_free(state);
179
+ grpc_core::Delete(state);
176
180
  GRPC_CALL_COMBINER_STOP(deadline_state->call_combiner,
177
181
  "done scheduling deadline timer");
178
182
  }
179
183
 
180
- void grpc_deadline_state_init(grpc_call_element* elem,
181
- grpc_call_stack* call_stack,
182
- grpc_call_combiner* call_combiner,
183
- grpc_millis deadline) {
184
- grpc_deadline_state* deadline_state =
185
- static_cast<grpc_deadline_state*>(elem->call_data);
186
- deadline_state->call_stack = call_stack;
187
- deadline_state->call_combiner = call_combiner;
184
+ grpc_deadline_state::grpc_deadline_state(grpc_call_element* elem,
185
+ grpc_call_stack* call_stack,
186
+ grpc_call_combiner* call_combiner,
187
+ grpc_millis deadline)
188
+ : call_stack(call_stack), call_combiner(call_combiner) {
188
189
  // Deadline will always be infinite on servers, so the timer will only be
189
190
  // set on clients with a finite deadline.
190
191
  if (deadline != GRPC_MILLIS_INF_FUTURE) {
@@ -196,21 +197,14 @@ void grpc_deadline_state_init(grpc_call_element* elem,
196
197
  // create a closure to start the timer, and we schedule that closure
197
198
  // to be run after call stack initialization is done.
198
199
  struct start_timer_after_init_state* state =
199
- static_cast<struct start_timer_after_init_state*>(
200
- gpr_zalloc(sizeof(*state)));
201
- state->elem = elem;
202
- state->deadline = deadline;
200
+ grpc_core::New<start_timer_after_init_state>(elem, deadline);
203
201
  GRPC_CLOSURE_INIT(&state->closure, start_timer_after_init, state,
204
202
  grpc_schedule_on_exec_ctx);
205
203
  GRPC_CLOSURE_SCHED(&state->closure, GRPC_ERROR_NONE);
206
204
  }
207
205
  }
208
206
 
209
- void grpc_deadline_state_destroy(grpc_call_element* elem) {
210
- grpc_deadline_state* deadline_state =
211
- static_cast<grpc_deadline_state*>(elem->call_data);
212
- cancel_timer_if_needed(deadline_state);
213
- }
207
+ grpc_deadline_state::~grpc_deadline_state() { cancel_timer_if_needed(this); }
214
208
 
215
209
  void grpc_deadline_state_reset(grpc_call_element* elem,
216
210
  grpc_millis new_deadline) {
@@ -269,8 +263,8 @@ typedef struct server_call_data {
269
263
  // Constructor for call_data. Used for both client and server filters.
270
264
  static grpc_error* init_call_elem(grpc_call_element* elem,
271
265
  const grpc_call_element_args* args) {
272
- grpc_deadline_state_init(elem, args->call_stack, args->call_combiner,
273
- args->deadline);
266
+ new (elem->call_data) grpc_deadline_state(
267
+ elem, args->call_stack, args->call_combiner, args->deadline);
274
268
  return GRPC_ERROR_NONE;
275
269
  }
276
270
 
@@ -278,7 +272,9 @@ static grpc_error* init_call_elem(grpc_call_element* elem,
278
272
  static void destroy_call_elem(grpc_call_element* elem,
279
273
  const grpc_call_final_info* final_info,
280
274
  grpc_closure* ignored) {
281
- grpc_deadline_state_destroy(elem);
275
+ grpc_deadline_state* deadline_state =
276
+ static_cast<grpc_deadline_state*>(elem->call_data);
277
+ deadline_state->~grpc_deadline_state();
282
278
  }
283
279
 
284
280
  // Method for starting a call op for client filter.
@@ -22,19 +22,23 @@
22
22
  #include "src/core/lib/channel/channel_stack.h"
23
23
  #include "src/core/lib/iomgr/timer.h"
24
24
 
25
- typedef enum grpc_deadline_timer_state {
25
+ enum grpc_deadline_timer_state {
26
26
  GRPC_DEADLINE_STATE_INITIAL,
27
27
  GRPC_DEADLINE_STATE_PENDING,
28
28
  GRPC_DEADLINE_STATE_FINISHED
29
- } grpc_deadline_timer_state;
29
+ };
30
30
 
31
31
  // State used for filters that enforce call deadlines.
32
32
  // Must be the first field in the filter's call_data.
33
- typedef struct grpc_deadline_state {
33
+ struct grpc_deadline_state {
34
+ grpc_deadline_state(grpc_call_element* elem, grpc_call_stack* call_stack,
35
+ grpc_call_combiner* call_combiner, grpc_millis deadline);
36
+ ~grpc_deadline_state();
37
+
34
38
  // We take a reference to the call stack for the timer callback.
35
39
  grpc_call_stack* call_stack;
36
40
  grpc_call_combiner* call_combiner;
37
- grpc_deadline_timer_state timer_state;
41
+ grpc_deadline_timer_state timer_state = GRPC_DEADLINE_STATE_INITIAL;
38
42
  grpc_timer timer;
39
43
  grpc_closure timer_callback;
40
44
  // Closure to invoke when we receive trailing metadata.
@@ -43,21 +47,13 @@ typedef struct grpc_deadline_state {
43
47
  // The original recv_trailing_metadata_ready closure, which we chain to
44
48
  // after our own closure is invoked.
45
49
  grpc_closure* original_recv_trailing_metadata_ready;
46
- } grpc_deadline_state;
50
+ };
47
51
 
48
52
  //
49
53
  // NOTE: All of these functions require that the first field in
50
54
  // elem->call_data is a grpc_deadline_state.
51
55
  //
52
56
 
53
- // assumes elem->call_data is zero'd
54
- void grpc_deadline_state_init(grpc_call_element* elem,
55
- grpc_call_stack* call_stack,
56
- grpc_call_combiner* call_combiner,
57
- grpc_millis deadline);
58
-
59
- void grpc_deadline_state_destroy(grpc_call_element* elem);
60
-
61
57
  // Cancels the existing timer and starts a new one with new_deadline.
62
58
  //
63
59
  // Note: It is generally safe to call this with an earlier deadline
@@ -37,10 +37,31 @@
37
37
  #define EXPECTED_CONTENT_TYPE_LENGTH sizeof(EXPECTED_CONTENT_TYPE) - 1
38
38
 
39
39
  /* default maximum size of payload eligable for GET request */
40
- static const size_t kMaxPayloadSizeForGet = 2048;
40
+ static constexpr size_t kMaxPayloadSizeForGet = 2048;
41
+
42
+ static void recv_initial_metadata_ready(void* user_data, grpc_error* error);
43
+ static void recv_trailing_metadata_ready(void* user_data, grpc_error* error);
44
+ static void on_send_message_next_done(void* arg, grpc_error* error);
45
+ static void send_message_on_complete(void* arg, grpc_error* error);
41
46
 
42
47
  namespace {
43
48
  struct call_data {
49
+ call_data(grpc_call_element* elem, const grpc_call_element_args& args)
50
+ : call_combiner(args.call_combiner) {
51
+ GRPC_CLOSURE_INIT(&recv_initial_metadata_ready,
52
+ ::recv_initial_metadata_ready, elem,
53
+ grpc_schedule_on_exec_ctx);
54
+ GRPC_CLOSURE_INIT(&recv_trailing_metadata_ready,
55
+ ::recv_trailing_metadata_ready, elem,
56
+ grpc_schedule_on_exec_ctx);
57
+ GRPC_CLOSURE_INIT(&on_send_message_next_done, ::on_send_message_next_done,
58
+ elem, grpc_schedule_on_exec_ctx);
59
+ GRPC_CLOSURE_INIT(&send_message_on_complete, ::send_message_on_complete,
60
+ elem, grpc_schedule_on_exec_ctx);
61
+ }
62
+
63
+ ~call_data() { GRPC_ERROR_UNREF(recv_initial_metadata_error); }
64
+
44
65
  grpc_call_combiner* call_combiner;
45
66
  // State for handling send_initial_metadata ops.
46
67
  grpc_linked_mdelem method;
@@ -51,18 +72,18 @@ struct call_data {
51
72
  grpc_linked_mdelem user_agent;
52
73
  // State for handling recv_initial_metadata ops.
53
74
  grpc_metadata_batch* recv_initial_metadata;
54
- grpc_error* recv_initial_metadata_error;
55
- grpc_closure* original_recv_initial_metadata_ready;
75
+ grpc_error* recv_initial_metadata_error = GRPC_ERROR_NONE;
76
+ grpc_closure* original_recv_initial_metadata_ready = nullptr;
56
77
  grpc_closure recv_initial_metadata_ready;
57
78
  // State for handling recv_trailing_metadata ops.
58
79
  grpc_metadata_batch* recv_trailing_metadata;
59
80
  grpc_closure* original_recv_trailing_metadata_ready;
60
81
  grpc_closure recv_trailing_metadata_ready;
61
- grpc_error* recv_trailing_metadata_error;
62
- bool seen_recv_trailing_metadata_ready;
82
+ grpc_error* recv_trailing_metadata_error = GRPC_ERROR_NONE;
83
+ bool seen_recv_trailing_metadata_ready = false;
63
84
  // State for handling send_message ops.
64
85
  grpc_transport_stream_op_batch* send_message_batch;
65
- size_t send_message_bytes_read;
86
+ size_t send_message_bytes_read = 0;
66
87
  grpc_core::ManualConstructor<grpc_core::ByteStreamCache> send_message_cache;
67
88
  grpc_core::ManualConstructor<grpc_core::ByteStreamCache::CachingByteStream>
68
89
  send_message_caching_stream;
@@ -442,18 +463,7 @@ done:
442
463
  /* Constructor for call_data */
443
464
  static grpc_error* init_call_elem(grpc_call_element* elem,
444
465
  const grpc_call_element_args* args) {
445
- call_data* calld = static_cast<call_data*>(elem->call_data);
446
- calld->call_combiner = args->call_combiner;
447
- GRPC_CLOSURE_INIT(&calld->recv_initial_metadata_ready,
448
- recv_initial_metadata_ready, elem,
449
- grpc_schedule_on_exec_ctx);
450
- GRPC_CLOSURE_INIT(&calld->recv_trailing_metadata_ready,
451
- recv_trailing_metadata_ready, elem,
452
- grpc_schedule_on_exec_ctx);
453
- GRPC_CLOSURE_INIT(&calld->send_message_on_complete, send_message_on_complete,
454
- elem, grpc_schedule_on_exec_ctx);
455
- GRPC_CLOSURE_INIT(&calld->on_send_message_next_done,
456
- on_send_message_next_done, elem, grpc_schedule_on_exec_ctx);
466
+ new (elem->call_data) call_data(elem, *args);
457
467
  return GRPC_ERROR_NONE;
458
468
  }
459
469
 
@@ -462,7 +472,7 @@ static void destroy_call_elem(grpc_call_element* elem,
462
472
  const grpc_call_final_info* final_info,
463
473
  grpc_closure* ignored) {
464
474
  call_data* calld = static_cast<call_data*>(elem->call_data);
465
- GRPC_ERROR_UNREF(calld->recv_initial_metadata_error);
475
+ calld->~call_data();
466
476
  }
467
477
 
468
478
  static grpc_mdelem scheme_from_args(const grpc_channel_args* args) {
@@ -59,9 +59,8 @@ void authority_start_transport_stream_op_batch(
59
59
  initial_metadata->idx.named.authority == nullptr) {
60
60
  grpc_error* error = grpc_metadata_batch_add_head(
61
61
  initial_metadata, &calld->authority_storage,
62
- grpc_mdelem_from_slices(
63
- GRPC_MDSTR_AUTHORITY,
64
- grpc_slice_ref_internal(chand->default_authority)));
62
+ grpc_mdelem_create(GRPC_MDSTR_AUTHORITY, chand->default_authority,
63
+ nullptr));
65
64
  if (error != GRPC_ERROR_NONE) {
66
65
  grpc_transport_stream_op_batch_finish_with_failure(batch, error,
67
66
  calld->call_combiner);
@@ -39,6 +39,10 @@
39
39
  #include "src/core/lib/surface/call.h"
40
40
  #include "src/core/lib/transport/static_metadata.h"
41
41
 
42
+ static void start_send_message_batch(void* arg, grpc_error* unused);
43
+ static void send_message_on_complete(void* arg, grpc_error* error);
44
+ static void on_send_message_next_done(void* arg, grpc_error* error);
45
+
42
46
  namespace {
43
47
  enum initial_metadata_state {
44
48
  // Initial metadata not yet seen.
@@ -50,6 +54,23 @@ enum initial_metadata_state {
50
54
  };
51
55
 
52
56
  struct call_data {
57
+ call_data(grpc_call_element* elem, const grpc_call_element_args& args)
58
+ : call_combiner(args.call_combiner) {
59
+ GRPC_CLOSURE_INIT(&start_send_message_batch_in_call_combiner,
60
+ start_send_message_batch, elem,
61
+ grpc_schedule_on_exec_ctx);
62
+ grpc_slice_buffer_init(&slices);
63
+ GRPC_CLOSURE_INIT(&send_message_on_complete, ::send_message_on_complete,
64
+ elem, grpc_schedule_on_exec_ctx);
65
+ GRPC_CLOSURE_INIT(&on_send_message_next_done, ::on_send_message_next_done,
66
+ elem, grpc_schedule_on_exec_ctx);
67
+ }
68
+
69
+ ~call_data() {
70
+ grpc_slice_buffer_destroy_internal(&slices);
71
+ GRPC_ERROR_UNREF(cancel_error);
72
+ }
73
+
53
74
  grpc_call_combiner* call_combiner;
54
75
  grpc_linked_mdelem compression_algorithm_storage;
55
76
  grpc_linked_mdelem stream_compression_algorithm_storage;
@@ -57,11 +78,12 @@ struct call_data {
57
78
  grpc_linked_mdelem accept_stream_encoding_storage;
58
79
  /** Compression algorithm we'll try to use. It may be given by incoming
59
80
  * metadata, or by the channel's default compression settings. */
60
- grpc_message_compression_algorithm message_compression_algorithm;
61
- initial_metadata_state send_initial_metadata_state;
62
- grpc_error* cancel_error;
81
+ grpc_message_compression_algorithm message_compression_algorithm =
82
+ GRPC_MESSAGE_COMPRESS_NONE;
83
+ initial_metadata_state send_initial_metadata_state = INITIAL_METADATA_UNSEEN;
84
+ grpc_error* cancel_error = GRPC_ERROR_NONE;
63
85
  grpc_closure start_send_message_batch_in_call_combiner;
64
- grpc_transport_stream_op_batch* send_message_batch;
86
+ grpc_transport_stream_op_batch* send_message_batch = nullptr;
65
87
  grpc_slice_buffer slices; /**< Buffers up input slices to be compressed */
66
88
  grpc_core::ManualConstructor<grpc_core::SliceBufferByteStream>
67
89
  replacement_stream;
@@ -424,16 +446,7 @@ static void compress_start_transport_stream_op_batch(
424
446
  /* Constructor for call_data */
425
447
  static grpc_error* init_call_elem(grpc_call_element* elem,
426
448
  const grpc_call_element_args* args) {
427
- call_data* calld = static_cast<call_data*>(elem->call_data);
428
- calld->call_combiner = args->call_combiner;
429
- calld->cancel_error = GRPC_ERROR_NONE;
430
- grpc_slice_buffer_init(&calld->slices);
431
- GRPC_CLOSURE_INIT(&calld->start_send_message_batch_in_call_combiner,
432
- start_send_message_batch, elem, grpc_schedule_on_exec_ctx);
433
- GRPC_CLOSURE_INIT(&calld->on_send_message_next_done,
434
- on_send_message_next_done, elem, grpc_schedule_on_exec_ctx);
435
- GRPC_CLOSURE_INIT(&calld->send_message_on_complete, send_message_on_complete,
436
- elem, grpc_schedule_on_exec_ctx);
449
+ new (elem->call_data) call_data(elem, *args);
437
450
  return GRPC_ERROR_NONE;
438
451
  }
439
452
 
@@ -442,8 +455,7 @@ static void destroy_call_elem(grpc_call_element* elem,
442
455
  const grpc_call_final_info* final_info,
443
456
  grpc_closure* ignored) {
444
457
  call_data* calld = static_cast<call_data*>(elem->call_data);
445
- grpc_slice_buffer_destroy_internal(&calld->slices);
446
- GRPC_ERROR_UNREF(calld->cancel_error);
458
+ calld->~call_data();
447
459
  }
448
460
 
449
461
  /* Constructor for channel_data */
@@ -35,9 +35,32 @@
35
35
  #define EXPECTED_CONTENT_TYPE "application/grpc"
36
36
  #define EXPECTED_CONTENT_TYPE_LENGTH sizeof(EXPECTED_CONTENT_TYPE) - 1
37
37
 
38
+ static void hs_recv_initial_metadata_ready(void* user_data, grpc_error* err);
39
+ static void hs_recv_trailing_metadata_ready(void* user_data, grpc_error* err);
40
+ static void hs_recv_message_ready(void* user_data, grpc_error* err);
41
+
38
42
  namespace {
39
43
 
40
44
  struct call_data {
45
+ call_data(grpc_call_element* elem, const grpc_call_element_args& args)
46
+ : call_combiner(args.call_combiner) {
47
+ GRPC_CLOSURE_INIT(&recv_initial_metadata_ready,
48
+ hs_recv_initial_metadata_ready, elem,
49
+ grpc_schedule_on_exec_ctx);
50
+ GRPC_CLOSURE_INIT(&recv_message_ready, hs_recv_message_ready, elem,
51
+ grpc_schedule_on_exec_ctx);
52
+ GRPC_CLOSURE_INIT(&recv_trailing_metadata_ready,
53
+ hs_recv_trailing_metadata_ready, elem,
54
+ grpc_schedule_on_exec_ctx);
55
+ }
56
+
57
+ ~call_data() {
58
+ GRPC_ERROR_UNREF(recv_initial_metadata_ready_error);
59
+ if (have_read_stream) {
60
+ read_stream->Orphan();
61
+ }
62
+ }
63
+
41
64
  grpc_call_combiner* call_combiner;
42
65
 
43
66
  // Outgoing headers to add to send_initial_metadata.
@@ -47,27 +70,27 @@ struct call_data {
47
70
  // If we see the recv_message contents in the GET query string, we
48
71
  // store it here.
49
72
  grpc_core::ManualConstructor<grpc_core::SliceBufferByteStream> read_stream;
50
- bool have_read_stream;
73
+ bool have_read_stream = false;
51
74
 
52
75
  // State for intercepting recv_initial_metadata.
53
76
  grpc_closure recv_initial_metadata_ready;
54
- grpc_error* recv_initial_metadata_ready_error;
77
+ grpc_error* recv_initial_metadata_ready_error = GRPC_ERROR_NONE;
55
78
  grpc_closure* original_recv_initial_metadata_ready;
56
- grpc_metadata_batch* recv_initial_metadata;
79
+ grpc_metadata_batch* recv_initial_metadata = nullptr;
57
80
  uint32_t* recv_initial_metadata_flags;
58
- bool seen_recv_initial_metadata_ready;
81
+ bool seen_recv_initial_metadata_ready = false;
59
82
 
60
83
  // State for intercepting recv_message.
61
84
  grpc_closure* original_recv_message_ready;
62
85
  grpc_closure recv_message_ready;
63
86
  grpc_core::OrphanablePtr<grpc_core::ByteStream>* recv_message;
64
- bool seen_recv_message_ready;
87
+ bool seen_recv_message_ready = false;
65
88
 
66
89
  // State for intercepting recv_trailing_metadata
67
90
  grpc_closure recv_trailing_metadata_ready;
68
91
  grpc_closure* original_recv_trailing_metadata_ready;
69
92
  grpc_error* recv_trailing_metadata_ready_error;
70
- bool seen_recv_trailing_metadata_ready;
93
+ bool seen_recv_trailing_metadata_ready = false;
71
94
  };
72
95
 
73
96
  struct channel_data {
@@ -431,16 +454,7 @@ static void hs_start_transport_stream_op_batch(
431
454
  /* Constructor for call_data */
432
455
  static grpc_error* hs_init_call_elem(grpc_call_element* elem,
433
456
  const grpc_call_element_args* args) {
434
- call_data* calld = static_cast<call_data*>(elem->call_data);
435
- calld->call_combiner = args->call_combiner;
436
- GRPC_CLOSURE_INIT(&calld->recv_initial_metadata_ready,
437
- hs_recv_initial_metadata_ready, elem,
438
- grpc_schedule_on_exec_ctx);
439
- GRPC_CLOSURE_INIT(&calld->recv_message_ready, hs_recv_message_ready, elem,
440
- grpc_schedule_on_exec_ctx);
441
- GRPC_CLOSURE_INIT(&calld->recv_trailing_metadata_ready,
442
- hs_recv_trailing_metadata_ready, elem,
443
- grpc_schedule_on_exec_ctx);
457
+ new (elem->call_data) call_data(elem, *args);
444
458
  return GRPC_ERROR_NONE;
445
459
  }
446
460
 
@@ -449,10 +463,7 @@ static void hs_destroy_call_elem(grpc_call_element* elem,
449
463
  const grpc_call_final_info* final_info,
450
464
  grpc_closure* ignored) {
451
465
  call_data* calld = static_cast<call_data*>(elem->call_data);
452
- GRPC_ERROR_UNREF(calld->recv_initial_metadata_ready_error);
453
- if (calld->have_read_stream) {
454
- calld->read_stream->Orphan();
455
- }
466
+ calld->~call_data();
456
467
  }
457
468
 
458
469
  /* Constructor for channel_data */