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
@@ -0,0 +1,89 @@
1
+ /*
2
+ *
3
+ * Copyright 2018 gRPC authors.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ *
17
+ */
18
+
19
+ #ifndef GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_XDS_XDS_LOAD_BALANCER_API_H
20
+ #define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_XDS_XDS_LOAD_BALANCER_API_H
21
+
22
+ #include <grpc/support/port_platform.h>
23
+
24
+ #include <grpc/slice_buffer.h>
25
+
26
+ #include "src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h"
27
+ #include "src/core/ext/filters/client_channel/lb_policy/xds/xds_client_stats.h"
28
+ #include "src/core/ext/filters/client_channel/lb_policy_factory.h"
29
+
30
+ #define XDS_SERVICE_NAME_MAX_LENGTH 128
31
+
32
+ typedef grpc_lb_v1_Server_ip_address_t xds_grpclb_ip_address;
33
+ typedef grpc_lb_v1_LoadBalanceRequest xds_grpclb_request;
34
+ typedef grpc_lb_v1_InitialLoadBalanceResponse xds_grpclb_initial_response;
35
+ typedef grpc_lb_v1_Server xds_grpclb_server;
36
+ typedef google_protobuf_Duration xds_grpclb_duration;
37
+ typedef google_protobuf_Timestamp xds_grpclb_timestamp;
38
+
39
+ typedef struct {
40
+ xds_grpclb_server** servers;
41
+ size_t num_servers;
42
+ } xds_grpclb_serverlist;
43
+
44
+ /** Create a request for a gRPC LB service under \a lb_service_name */
45
+ xds_grpclb_request* xds_grpclb_request_create(const char* lb_service_name);
46
+ xds_grpclb_request* xds_grpclb_load_report_request_create_locked(
47
+ grpc_core::XdsLbClientStats* client_stats);
48
+
49
+ /** Protocol Buffers v3-encode \a request */
50
+ grpc_slice xds_grpclb_request_encode(const xds_grpclb_request* request);
51
+
52
+ /** Destroy \a request */
53
+ void xds_grpclb_request_destroy(xds_grpclb_request* request);
54
+
55
+ /** Parse (ie, decode) the bytes in \a encoded_xds_grpclb_response as a \a
56
+ * xds_grpclb_initial_response */
57
+ xds_grpclb_initial_response* xds_grpclb_initial_response_parse(
58
+ grpc_slice encoded_xds_grpclb_response);
59
+
60
+ /** Parse the list of servers from an encoded \a xds_grpclb_response */
61
+ xds_grpclb_serverlist* xds_grpclb_response_parse_serverlist(
62
+ grpc_slice encoded_xds_grpclb_response);
63
+
64
+ /** Return a copy of \a sl. The caller is responsible for calling \a
65
+ * xds_grpclb_destroy_serverlist on the returned copy. */
66
+ xds_grpclb_serverlist* xds_grpclb_serverlist_copy(
67
+ const xds_grpclb_serverlist* sl);
68
+
69
+ bool xds_grpclb_serverlist_equals(const xds_grpclb_serverlist* lhs,
70
+ const xds_grpclb_serverlist* rhs);
71
+
72
+ bool xds_grpclb_server_equals(const xds_grpclb_server* lhs,
73
+ const xds_grpclb_server* rhs);
74
+
75
+ /** Destroy \a serverlist */
76
+ void xds_grpclb_destroy_serverlist(xds_grpclb_serverlist* serverlist);
77
+
78
+ /** Compare \a lhs against \a rhs and return 0 if \a lhs and \a rhs are equal,
79
+ * < 0 if \a lhs represents a duration shorter than \a rhs and > 0 otherwise */
80
+ int xds_grpclb_duration_compare(const xds_grpclb_duration* lhs,
81
+ const xds_grpclb_duration* rhs);
82
+
83
+ grpc_millis xds_grpclb_duration_to_millis(xds_grpclb_duration* duration_pb);
84
+
85
+ /** Destroy \a initial_response */
86
+ void xds_grpclb_initial_response_destroy(xds_grpclb_initial_response* response);
87
+
88
+ #endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_XDS_XDS_LOAD_BALANCER_API_H \
89
+ */
@@ -25,7 +25,7 @@
25
25
 
26
26
  #include "src/core/ext/filters/client_channel/client_channel_factory.h"
27
27
  #include "src/core/ext/filters/client_channel/lb_policy.h"
28
- #include "src/core/ext/filters/client_channel/uri_parser.h"
28
+ #include "src/core/lib/uri/uri_parser.h"
29
29
 
30
30
  //
31
31
  // representation of an LB address
@@ -94,4 +94,9 @@ LoadBalancingPolicyRegistry::CreateLoadBalancingPolicy(
94
94
  return factory->CreateLoadBalancingPolicy(args);
95
95
  }
96
96
 
97
+ bool LoadBalancingPolicyRegistry::LoadBalancingPolicyExists(const char* name) {
98
+ GPR_ASSERT(g_state != nullptr);
99
+ return g_state->GetLoadBalancingPolicyFactory(name) != nullptr;
100
+ }
101
+
97
102
  } // namespace grpc_core
@@ -47,6 +47,10 @@ class LoadBalancingPolicyRegistry {
47
47
  /// Creates an LB policy of the type specified by \a name.
48
48
  static OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(
49
49
  const char* name, const LoadBalancingPolicy::Args& args);
50
+
51
+ /// Returns true if the LB policy factory specified by \a name exists in this
52
+ /// registry.
53
+ static bool LoadBalancingPolicyExists(const char* name);
50
54
  };
51
55
 
52
56
  } // namespace grpc_core
@@ -23,8 +23,8 @@
23
23
 
24
24
  #include <stddef.h>
25
25
 
26
- #include "src/core/ext/filters/client_channel/uri_parser.h"
27
26
  #include "src/core/lib/iomgr/resolve_address.h"
27
+ #include "src/core/lib/uri/uri_parser.h"
28
28
 
29
29
  /** Populate \a resolved_addr from \a uri, whose path is expected to contain a
30
30
  * unix socket path. Returns true upon success. */
@@ -120,6 +120,8 @@ class AresDnsResolver : public Resolver {
120
120
  grpc_lb_addresses* lb_addresses_ = nullptr;
121
121
  /// currently resolving service config
122
122
  char* service_config_json_ = nullptr;
123
+ // has shutdown been initiated
124
+ bool shutdown_initiated_ = false;
123
125
  };
124
126
 
125
127
  AresDnsResolver::AresDnsResolver(const ResolverArgs& args)
@@ -197,11 +199,12 @@ void AresDnsResolver::ResetBackoffLocked() {
197
199
  }
198
200
 
199
201
  void AresDnsResolver::ShutdownLocked() {
202
+ shutdown_initiated_ = true;
200
203
  if (have_next_resolution_timer_) {
201
204
  grpc_timer_cancel(&next_resolution_timer_);
202
205
  }
203
206
  if (pending_request_ != nullptr) {
204
- grpc_cancel_ares_request(pending_request_);
207
+ grpc_cancel_ares_request_locked(pending_request_);
205
208
  }
206
209
  if (next_completion_ != nullptr) {
207
210
  *target_result_ = nullptr;
@@ -213,9 +216,13 @@ void AresDnsResolver::ShutdownLocked() {
213
216
 
214
217
  void AresDnsResolver::OnNextResolutionLocked(void* arg, grpc_error* error) {
215
218
  AresDnsResolver* r = static_cast<AresDnsResolver*>(arg);
219
+ GRPC_CARES_TRACE_LOG(
220
+ "%p re-resolution timer fired. error: %s. shutdown_initiated_: %d", r,
221
+ grpc_error_string(error), r->shutdown_initiated_);
216
222
  r->have_next_resolution_timer_ = false;
217
- if (error == GRPC_ERROR_NONE) {
223
+ if (error == GRPC_ERROR_NONE && !r->shutdown_initiated_) {
218
224
  if (!r->resolving_) {
225
+ GRPC_CARES_TRACE_LOG("%p start resolving due to re-resolution timer", r);
219
226
  r->StartResolvingLocked();
220
227
  }
221
228
  }
@@ -298,15 +305,15 @@ void AresDnsResolver::OnResolvedLocked(void* arg, grpc_error* error) {
298
305
  grpc_channel_args* result = nullptr;
299
306
  GPR_ASSERT(r->resolving_);
300
307
  r->resolving_ = false;
308
+ gpr_free(r->pending_request_);
301
309
  r->pending_request_ = nullptr;
302
310
  if (r->lb_addresses_ != nullptr) {
303
- static const char* args_to_remove[2];
311
+ static const char* args_to_remove[1];
304
312
  size_t num_args_to_remove = 0;
305
- grpc_arg new_args[3];
313
+ grpc_arg args_to_add[2];
306
314
  size_t num_args_to_add = 0;
307
- new_args[num_args_to_add++] =
315
+ args_to_add[num_args_to_add++] =
308
316
  grpc_lb_addresses_create_channel_arg(r->lb_addresses_);
309
- grpc_core::UniquePtr<grpc_core::ServiceConfig> service_config;
310
317
  char* service_config_string = nullptr;
311
318
  if (r->service_config_json_ != nullptr) {
312
319
  service_config_string = ChooseServiceConfig(r->service_config_json_);
@@ -315,31 +322,19 @@ void AresDnsResolver::OnResolvedLocked(void* arg, grpc_error* error) {
315
322
  gpr_log(GPR_INFO, "selected service config choice: %s",
316
323
  service_config_string);
317
324
  args_to_remove[num_args_to_remove++] = GRPC_ARG_SERVICE_CONFIG;
318
- new_args[num_args_to_add++] = grpc_channel_arg_string_create(
325
+ args_to_add[num_args_to_add++] = grpc_channel_arg_string_create(
319
326
  (char*)GRPC_ARG_SERVICE_CONFIG, service_config_string);
320
- service_config =
321
- grpc_core::ServiceConfig::Create(service_config_string);
322
- if (service_config != nullptr) {
323
- const char* lb_policy_name =
324
- service_config->GetLoadBalancingPolicyName();
325
- if (lb_policy_name != nullptr) {
326
- args_to_remove[num_args_to_remove++] = GRPC_ARG_LB_POLICY_NAME;
327
- new_args[num_args_to_add++] = grpc_channel_arg_string_create(
328
- (char*)GRPC_ARG_LB_POLICY_NAME,
329
- const_cast<char*>(lb_policy_name));
330
- }
331
- }
332
327
  }
333
328
  }
334
329
  result = grpc_channel_args_copy_and_add_and_remove(
335
- r->channel_args_, args_to_remove, num_args_to_remove, new_args,
330
+ r->channel_args_, args_to_remove, num_args_to_remove, args_to_add,
336
331
  num_args_to_add);
337
332
  gpr_free(service_config_string);
338
333
  grpc_lb_addresses_destroy(r->lb_addresses_);
339
334
  // Reset backoff state so that we start from the beginning when the
340
335
  // next request gets triggered.
341
336
  r->backoff_.Reset();
342
- } else {
337
+ } else if (!r->shutdown_initiated_) {
343
338
  const char* msg = grpc_error_string(error);
344
339
  gpr_log(GPR_DEBUG, "dns resolution failed: %s", msg);
345
340
  grpc_millis next_try = r->backoff_.NextAttemptTime();
@@ -473,7 +468,9 @@ void grpc_resolver_dns_ares_init() {
473
468
  GRPC_LOG_IF_ERROR("ares_library_init() failed", error);
474
469
  return;
475
470
  }
476
- default_resolver = grpc_resolve_address_impl;
471
+ if (default_resolver == nullptr) {
472
+ default_resolver = grpc_resolve_address_impl;
473
+ }
477
474
  grpc_set_resolver_impl(&ares_resolver);
478
475
  grpc_core::ResolverRegistry::Builder::RegisterResolverFactory(
479
476
  grpc_core::UniquePtr<grpc_core::ResolverFactory>(
@@ -144,12 +144,12 @@ static void grpc_ares_request_unref_locked(grpc_ares_request* r) {
144
144
  void grpc_ares_complete_request_locked(grpc_ares_request* r) {
145
145
  /* Invoke on_done callback and destroy the
146
146
  request */
147
+ r->ev_driver = nullptr;
147
148
  grpc_lb_addresses* lb_addrs = *(r->lb_addrs_out);
148
149
  if (lb_addrs != nullptr) {
149
150
  grpc_cares_wrapper_address_sorting_sort(lb_addrs);
150
151
  }
151
152
  GRPC_CLOSURE_SCHED(r->on_done, r->error);
152
- gpr_free(r);
153
153
  }
154
154
 
155
155
  static grpc_ares_hostbyname_request* create_hostbyname_request_locked(
@@ -356,15 +356,12 @@ done:
356
356
  grpc_ares_request_unref_locked(r);
357
357
  }
358
358
 
359
- static grpc_ares_request*
360
- grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked(
361
- const char* dns_server, const char* name, const char* default_port,
362
- grpc_pollset_set* interested_parties, grpc_closure* on_done,
363
- grpc_lb_addresses** addrs, bool check_grpclb, char** service_config_json,
364
- grpc_combiner* combiner) {
359
+ void grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked(
360
+ grpc_ares_request* r, const char* dns_server, const char* name,
361
+ const char* default_port, grpc_pollset_set* interested_parties,
362
+ bool check_grpclb, grpc_combiner* combiner) {
365
363
  grpc_error* error = GRPC_ERROR_NONE;
366
364
  grpc_ares_hostbyname_request* hr = nullptr;
367
- grpc_ares_request* r = nullptr;
368
365
  ares_channel* channel = nullptr;
369
366
  /* TODO(zyc): Enable tracing after #9603 is checked in */
370
367
  /* if (grpc_dns_trace) {
@@ -390,14 +387,6 @@ grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked(
390
387
  }
391
388
  port = gpr_strdup(default_port);
392
389
  }
393
- r = static_cast<grpc_ares_request*>(gpr_zalloc(sizeof(grpc_ares_request)));
394
- r->ev_driver = nullptr;
395
- r->on_done = on_done;
396
- r->lb_addrs_out = addrs;
397
- r->service_config_json_out = service_config_json;
398
- r->success = false;
399
- r->error = GRPC_ERROR_NONE;
400
- r->pending_queries = 0;
401
390
  error = grpc_ares_ev_driver_create_locked(&r->ev_driver, interested_parties,
402
391
  combiner, r);
403
392
  if (error != GRPC_ERROR_NONE) goto error_cleanup;
@@ -458,7 +447,7 @@ grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked(
458
447
  on_srv_query_done_locked, r);
459
448
  gpr_free(service_name);
460
449
  }
461
- if (service_config_json != nullptr) {
450
+ if (r->service_config_json_out != nullptr) {
462
451
  grpc_ares_request_ref_locked(r);
463
452
  char* config_name;
464
453
  gpr_asprintf(&config_name, "_grpc_config.%s", host);
@@ -470,14 +459,12 @@ grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked(
470
459
  grpc_ares_request_unref_locked(r);
471
460
  gpr_free(host);
472
461
  gpr_free(port);
473
- return r;
462
+ return;
474
463
 
475
464
  error_cleanup:
476
- GRPC_CLOSURE_SCHED(on_done, error);
477
- gpr_free(r);
465
+ GRPC_CLOSURE_SCHED(r->on_done, error);
478
466
  gpr_free(host);
479
467
  gpr_free(port);
480
- return nullptr;
481
468
  }
482
469
 
483
470
  static bool inner_resolve_as_ip_literal_locked(const char* name,
@@ -536,21 +523,31 @@ static grpc_ares_request* grpc_dns_lookup_ares_locked_impl(
536
523
  grpc_pollset_set* interested_parties, grpc_closure* on_done,
537
524
  grpc_lb_addresses** addrs, bool check_grpclb, char** service_config_json,
538
525
  grpc_combiner* combiner) {
526
+ grpc_ares_request* r =
527
+ static_cast<grpc_ares_request*>(gpr_zalloc(sizeof(grpc_ares_request)));
528
+ r->ev_driver = nullptr;
529
+ r->on_done = on_done;
530
+ r->lb_addrs_out = addrs;
531
+ r->service_config_json_out = service_config_json;
532
+ r->success = false;
533
+ r->error = GRPC_ERROR_NONE;
534
+ r->pending_queries = 0;
539
535
  // Early out if the target is an ipv4 or ipv6 literal.
540
536
  if (resolve_as_ip_literal_locked(name, default_port, addrs)) {
541
537
  GRPC_CLOSURE_SCHED(on_done, GRPC_ERROR_NONE);
542
- return nullptr;
538
+ return r;
543
539
  }
544
540
  // Early out if the target is localhost and we're on Windows.
545
541
  if (grpc_ares_maybe_resolve_localhost_manually_locked(name, default_port,
546
542
  addrs)) {
547
543
  GRPC_CLOSURE_SCHED(on_done, GRPC_ERROR_NONE);
548
- return nullptr;
544
+ return r;
549
545
  }
550
546
  // Look up name using c-ares lib.
551
- return grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked(
552
- dns_server, name, default_port, interested_parties, on_done, addrs,
553
- check_grpclb, service_config_json, combiner);
547
+ grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked(
548
+ r, dns_server, name, default_port, interested_parties, check_grpclb,
549
+ combiner);
550
+ return r;
554
551
  }
555
552
 
556
553
  grpc_ares_request* (*grpc_dns_lookup_ares_locked)(
@@ -559,14 +556,16 @@ grpc_ares_request* (*grpc_dns_lookup_ares_locked)(
559
556
  grpc_lb_addresses** addrs, bool check_grpclb, char** service_config_json,
560
557
  grpc_combiner* combiner) = grpc_dns_lookup_ares_locked_impl;
561
558
 
562
- void grpc_cancel_ares_request(grpc_ares_request* r) {
563
- if (grpc_dns_lookup_ares_locked == grpc_dns_lookup_ares_locked_impl) {
564
- if (r != nullptr) {
565
- grpc_ares_ev_driver_shutdown_locked(r->ev_driver);
566
- }
559
+ static void grpc_cancel_ares_request_locked_impl(grpc_ares_request* r) {
560
+ GPR_ASSERT(r != nullptr);
561
+ if (r->ev_driver != nullptr) {
562
+ grpc_ares_ev_driver_shutdown_locked(r->ev_driver);
567
563
  }
568
564
  }
569
565
 
566
+ void (*grpc_cancel_ares_request_locked)(grpc_ares_request* r) =
567
+ grpc_cancel_ares_request_locked_impl;
568
+
570
569
  grpc_error* grpc_ares_init(void) {
571
570
  gpr_once_init(&g_basic_init, do_basic_init);
572
571
  gpr_mu_lock(&g_init_mu);
@@ -603,20 +602,23 @@ typedef struct grpc_resolve_address_ares_request {
603
602
  grpc_lb_addresses* lb_addrs;
604
603
  /** closure to call when the resolve_address_ares request completes */
605
604
  grpc_closure* on_resolve_address_done;
606
- /** a closure wrapping on_dns_lookup_done_cb, which should be invoked when the
607
- grpc_dns_lookup_ares_locked operation is done. */
608
- grpc_closure on_dns_lookup_done;
605
+ /** a closure wrapping on_resolve_address_done, which should be invoked when
606
+ the grpc_dns_lookup_ares_locked operation is done. */
607
+ grpc_closure on_dns_lookup_done_locked;
609
608
  /* target name */
610
609
  const char* name;
611
610
  /* default port to use if none is specified */
612
611
  const char* default_port;
613
612
  /* pollset_set to be driven by */
614
613
  grpc_pollset_set* interested_parties;
614
+ /* underlying ares_request that the query is performed on */
615
+ grpc_ares_request* ares_request;
615
616
  } grpc_resolve_address_ares_request;
616
617
 
617
- static void on_dns_lookup_done_cb(void* arg, grpc_error* error) {
618
+ static void on_dns_lookup_done_locked(void* arg, grpc_error* error) {
618
619
  grpc_resolve_address_ares_request* r =
619
620
  static_cast<grpc_resolve_address_ares_request*>(arg);
621
+ gpr_free(r->ares_request);
620
622
  grpc_resolved_addresses** resolved_addresses = r->addrs_out;
621
623
  if (r->lb_addrs == nullptr || r->lb_addrs->num_addresses == 0) {
622
624
  *resolved_addresses = nullptr;
@@ -643,9 +645,9 @@ static void grpc_resolve_address_invoke_dns_lookup_ares_locked(
643
645
  void* arg, grpc_error* unused_error) {
644
646
  grpc_resolve_address_ares_request* r =
645
647
  static_cast<grpc_resolve_address_ares_request*>(arg);
646
- grpc_dns_lookup_ares_locked(
648
+ r->ares_request = grpc_dns_lookup_ares_locked(
647
649
  nullptr /* dns_server */, r->name, r->default_port, r->interested_parties,
648
- &r->on_dns_lookup_done, &r->lb_addrs, false /* check_grpclb */,
650
+ &r->on_dns_lookup_done_locked, &r->lb_addrs, false /* check_grpclb */,
649
651
  nullptr /* service_config_json */, r->combiner);
650
652
  }
651
653
 
@@ -660,8 +662,8 @@ static void grpc_resolve_address_ares_impl(const char* name,
660
662
  r->combiner = grpc_combiner_create();
661
663
  r->addrs_out = addrs;
662
664
  r->on_resolve_address_done = on_done;
663
- GRPC_CLOSURE_INIT(&r->on_dns_lookup_done, on_dns_lookup_done_cb, r,
664
- grpc_schedule_on_exec_ctx);
665
+ GRPC_CLOSURE_INIT(&r->on_dns_lookup_done_locked, on_dns_lookup_done_locked, r,
666
+ grpc_combiner_scheduler(r->combiner));
665
667
  r->name = name;
666
668
  r->default_port = default_port;
667
669
  r->interested_parties = interested_parties;
@@ -54,7 +54,8 @@ extern void (*grpc_resolve_address_ares)(const char* name,
54
54
  port in \a name. grpc_ares_init() must be called at least once before this
55
55
  function. \a on_done may be called directly in this function without being
56
56
  scheduled with \a exec_ctx, so it must not try to acquire locks that are
57
- being held by the caller. */
57
+ being held by the caller. The returned grpc_ares_request object is owned
58
+ by the caller and it is safe to free after on_done is called back. */
58
59
  extern grpc_ares_request* (*grpc_dns_lookup_ares_locked)(
59
60
  const char* dns_server, const char* name, const char* default_port,
60
61
  grpc_pollset_set* interested_parties, grpc_closure* on_done,
@@ -62,7 +63,7 @@ extern grpc_ares_request* (*grpc_dns_lookup_ares_locked)(
62
63
  char** service_config_json, grpc_combiner* combiner);
63
64
 
64
65
  /* Cancel the pending grpc_ares_request \a request */
65
- void grpc_cancel_ares_request(grpc_ares_request* request);
66
+ extern void (*grpc_cancel_ares_request_locked)(grpc_ares_request* request);
66
67
 
67
68
  /* Initialize gRPC ares wrapper. Must be called at least once before
68
69
  grpc_resolve_address_ares(). */
@@ -40,7 +40,10 @@ grpc_ares_request* (*grpc_dns_lookup_ares_locked)(
40
40
  grpc_lb_addresses** addrs, bool check_grpclb, char** service_config_json,
41
41
  grpc_combiner* combiner) = grpc_dns_lookup_ares_locked_impl;
42
42
 
43
- void grpc_cancel_ares_request(grpc_ares_request* r) {}
43
+ static void grpc_cancel_ares_request_locked_impl(grpc_ares_request* r) {}
44
+
45
+ void (*grpc_cancel_ares_request_locked)(grpc_ares_request* r) =
46
+ grpc_cancel_ares_request_locked_impl;
44
47
 
45
48
  grpc_error* grpc_ares_init(void) { return GRPC_ERROR_NONE; }
46
49
 
@@ -103,7 +103,7 @@ void FakeResolver::NextLocked(grpc_channel_args** target_result,
103
103
  }
104
104
 
105
105
  void FakeResolver::RequestReresolutionLocked() {
106
- if (reresolution_results_ != nullptr) {
106
+ if (reresolution_results_ != nullptr || return_failure_) {
107
107
  grpc_channel_args_destroy(next_results_);
108
108
  next_results_ = grpc_channel_args_copy(reresolution_results_);
109
109
  MaybeFinishNextLocked();
@@ -141,6 +141,7 @@ struct SetResponseClosureArg {
141
141
  grpc_closure set_response_closure;
142
142
  FakeResolverResponseGenerator* generator;
143
143
  grpc_channel_args* response;
144
+ bool immediate = true;
144
145
  };
145
146
 
146
147
  void FakeResolverResponseGenerator::SetResponseLocked(void* arg,
@@ -194,7 +195,7 @@ void FakeResolverResponseGenerator::SetFailureLocked(void* arg,
194
195
  SetResponseClosureArg* closure_arg = static_cast<SetResponseClosureArg*>(arg);
195
196
  FakeResolver* resolver = closure_arg->generator->resolver_;
196
197
  resolver->return_failure_ = true;
197
- resolver->MaybeFinishNextLocked();
198
+ if (closure_arg->immediate) resolver->MaybeFinishNextLocked();
198
199
  Delete(closure_arg);
199
200
  }
200
201
 
@@ -209,6 +210,18 @@ void FakeResolverResponseGenerator::SetFailure() {
209
210
  GRPC_ERROR_NONE);
210
211
  }
211
212
 
213
+ void FakeResolverResponseGenerator::SetFailureOnReresolution() {
214
+ GPR_ASSERT(resolver_ != nullptr);
215
+ SetResponseClosureArg* closure_arg = New<SetResponseClosureArg>();
216
+ closure_arg->generator = this;
217
+ closure_arg->immediate = false;
218
+ GRPC_CLOSURE_SCHED(
219
+ GRPC_CLOSURE_INIT(&closure_arg->set_response_closure, SetFailureLocked,
220
+ closure_arg,
221
+ grpc_combiner_scheduler(resolver_->combiner())),
222
+ GRPC_ERROR_NONE);
223
+ }
224
+
212
225
  namespace {
213
226
 
214
227
  static void* response_generator_arg_copy(void* p) {