grpc 1.19.0 → 1.20.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 (224) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +4131 -7903
  3. data/include/grpc/grpc.h +11 -6
  4. data/include/grpc/grpc_security.h +51 -9
  5. data/include/grpc/impl/codegen/byte_buffer.h +13 -0
  6. data/include/grpc/impl/codegen/grpc_types.h +4 -0
  7. data/include/grpc/impl/codegen/port_platform.h +37 -6
  8. data/include/grpc/impl/codegen/sync_posix.h +18 -0
  9. data/src/core/ext/filters/client_channel/client_channel.cc +560 -236
  10. data/src/core/ext/filters/client_channel/client_channel_channelz.h +2 -2
  11. data/src/core/ext/filters/client_channel/client_channel_factory.cc +22 -34
  12. data/src/core/ext/filters/client_channel/client_channel_factory.h +19 -38
  13. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +7 -4
  14. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +2 -2
  15. data/src/core/ext/filters/client_channel/lb_policy.cc +105 -28
  16. data/src/core/ext/filters/client_channel/lb_policy.h +259 -141
  17. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +29 -32
  18. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +789 -803
  19. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +3 -1
  20. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +2 -6
  21. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +1 -1
  22. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +7 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +8 -8
  24. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +2 -2
  25. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +127 -219
  26. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +103 -282
  27. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +4 -10
  28. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +709 -906
  29. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_secure.cc +0 -43
  30. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.cc +8 -8
  31. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.h +2 -2
  32. data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -6
  33. data/src/core/ext/filters/client_channel/resolver.cc +54 -1
  34. data/src/core/ext/filters/client_channel/resolver.h +51 -22
  35. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +34 -86
  36. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +29 -41
  37. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +32 -78
  38. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +109 -72
  39. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +13 -8
  40. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +28 -63
  41. data/src/core/ext/filters/client_channel/resolver_factory.h +3 -1
  42. data/src/core/ext/filters/client_channel/resolver_registry.cc +5 -2
  43. data/src/core/ext/filters/client_channel/resolver_registry.h +5 -4
  44. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +69 -49
  45. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +11 -8
  46. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +568 -0
  47. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +141 -0
  48. data/src/core/ext/filters/client_channel/server_address.cc +0 -48
  49. data/src/core/ext/filters/client_channel/server_address.h +0 -10
  50. data/src/core/{lib/transport → ext/filters/client_channel}/service_config.cc +10 -5
  51. data/src/core/{lib/transport → ext/filters/client_channel}/service_config.h +16 -12
  52. data/src/core/ext/filters/client_channel/subchannel.cc +11 -16
  53. data/src/core/ext/filters/client_channel/subchannel.h +3 -0
  54. data/src/core/ext/filters/max_age/max_age_filter.cc +4 -1
  55. data/src/core/ext/filters/message_size/message_size_filter.cc +2 -2
  56. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +45 -45
  57. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +133 -134
  58. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +4 -4
  59. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +4 -4
  60. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +7 -6
  61. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +4 -3
  62. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +37 -29
  63. data/src/core/ext/transport/chttp2/transport/flow_control.cc +1 -1
  64. data/src/core/ext/transport/chttp2/transport/frame_data.cc +2 -1
  65. data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -1
  66. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +6 -5
  67. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +3 -2
  68. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -4
  69. data/src/core/ext/transport/chttp2/transport/frame_ping.h +1 -1
  70. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +5 -4
  71. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +2 -1
  72. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +2 -1
  73. data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -1
  74. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -4
  75. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +1 -1
  76. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +7 -6
  77. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +3 -2
  78. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +9 -5
  79. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +6 -1
  80. data/src/core/ext/transport/chttp2/transport/internal.h +5 -4
  81. data/src/core/ext/transport/chttp2/transport/parsing.cc +9 -9
  82. data/src/core/ext/transport/chttp2/transport/writing.cc +1 -1
  83. data/src/core/ext/transport/inproc/inproc_transport.cc +8 -0
  84. data/src/core/lib/channel/channel_args.cc +2 -0
  85. data/src/core/lib/channel/channel_args.h +3 -0
  86. data/src/core/lib/channel/channel_stack.h +1 -1
  87. data/src/core/lib/channel/channel_trace.cc +4 -4
  88. data/src/core/lib/channel/channel_trace.h +4 -4
  89. data/src/core/lib/channel/channelz.cc +32 -19
  90. data/src/core/lib/channel/channelz.h +4 -4
  91. data/src/core/lib/channel/channelz_registry.cc +1 -1
  92. data/src/core/lib/channel/context.h +0 -3
  93. data/src/core/lib/channel/handshaker_registry.cc +7 -3
  94. data/src/core/lib/compression/algorithm_metadata.h +3 -3
  95. data/src/core/lib/compression/compression.cc +1 -1
  96. data/src/core/lib/compression/compression_internal.cc +2 -2
  97. data/src/core/lib/compression/stream_compression_gzip.cc +1 -1
  98. data/src/core/lib/debug/trace.h +2 -1
  99. data/src/core/lib/gpr/cpu_posix.cc +5 -3
  100. data/src/core/lib/gpr/sync_posix.cc +65 -4
  101. data/src/core/lib/gprpp/atomic.h +75 -5
  102. data/src/core/lib/gprpp/fork.cc +0 -2
  103. data/src/core/lib/gprpp/orphanable.h +3 -2
  104. data/src/core/lib/gprpp/ref_counted.h +9 -11
  105. data/src/core/lib/gprpp/thd.h +42 -7
  106. data/src/core/lib/gprpp/thd_posix.cc +31 -13
  107. data/src/core/lib/gprpp/thd_windows.cc +47 -34
  108. data/src/core/lib/http/httpcli.cc +3 -2
  109. data/src/core/lib/http/httpcli_security_connector.cc +0 -1
  110. data/src/core/lib/http/parser.cc +2 -1
  111. data/src/core/lib/http/parser.h +2 -1
  112. data/src/core/lib/iomgr/buffer_list.h +1 -1
  113. data/src/core/lib/iomgr/endpoint.cc +2 -2
  114. data/src/core/lib/iomgr/endpoint.h +3 -2
  115. data/src/core/lib/iomgr/error.cc +9 -9
  116. data/src/core/lib/iomgr/error.h +4 -3
  117. data/src/core/lib/iomgr/ev_epoll1_linux.cc +6 -0
  118. data/src/core/lib/iomgr/ev_epollex_linux.cc +14 -9
  119. data/src/core/lib/iomgr/ev_poll_posix.cc +7 -481
  120. data/src/core/lib/iomgr/ev_posix.cc +7 -3
  121. data/src/core/lib/iomgr/ev_posix.h +8 -0
  122. data/src/core/lib/iomgr/executor.cc +13 -0
  123. data/src/core/lib/iomgr/executor.h +2 -1
  124. data/src/core/lib/iomgr/internal_errqueue.cc +2 -4
  125. data/src/core/lib/iomgr/iomgr.cc +5 -0
  126. data/src/core/lib/iomgr/iomgr.h +7 -0
  127. data/src/core/lib/iomgr/iomgr_custom.cc +9 -2
  128. data/src/core/lib/iomgr/iomgr_internal.cc +6 -0
  129. data/src/core/lib/iomgr/iomgr_internal.h +9 -1
  130. data/src/core/lib/iomgr/iomgr_posix.cc +10 -2
  131. data/src/core/lib/iomgr/iomgr_windows.cc +10 -2
  132. data/src/core/lib/iomgr/port.h +19 -0
  133. data/src/core/lib/iomgr/tcp_client_windows.cc +6 -4
  134. data/src/core/lib/iomgr/tcp_custom.cc +1 -1
  135. data/src/core/lib/iomgr/tcp_posix.cc +158 -54
  136. data/src/core/lib/iomgr/tcp_windows.cc +1 -1
  137. data/src/core/lib/iomgr/wakeup_fd_posix.cc +1 -19
  138. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +10 -6
  139. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +2 -1
  140. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +3 -6
  141. data/src/core/lib/security/credentials/tls/spiffe_credentials.cc +129 -0
  142. data/src/core/lib/security/credentials/tls/spiffe_credentials.h +62 -0
  143. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +7 -2
  144. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +28 -17
  145. data/src/core/lib/security/security_connector/ssl_utils.cc +134 -0
  146. data/src/core/lib/security/security_connector/ssl_utils.h +32 -0
  147. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.cc +426 -0
  148. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.h +122 -0
  149. data/src/core/lib/security/transport/auth_filters.h +2 -2
  150. data/src/core/lib/security/transport/client_auth_filter.cc +35 -39
  151. data/src/core/lib/security/transport/secure_endpoint.cc +2 -2
  152. data/src/core/lib/security/transport/security_handshaker.cc +4 -3
  153. data/src/core/lib/slice/percent_encoding.cc +3 -3
  154. data/src/core/lib/slice/percent_encoding.h +3 -3
  155. data/src/core/lib/slice/slice.cc +27 -30
  156. data/src/core/lib/slice/slice_hash_table.h +2 -2
  157. data/src/core/lib/slice/slice_intern.cc +1 -1
  158. data/src/core/lib/slice/slice_internal.h +14 -3
  159. data/src/core/lib/slice/slice_weak_hash_table.h +4 -4
  160. data/src/core/lib/surface/byte_buffer_reader.cc +17 -0
  161. data/src/core/lib/surface/call.cc +8 -3
  162. data/src/core/lib/surface/completion_queue.cc +134 -148
  163. data/src/core/lib/surface/init.cc +78 -30
  164. data/src/core/lib/surface/init.h +1 -0
  165. data/src/core/lib/surface/lame_client.cc +4 -6
  166. data/src/core/lib/surface/version.cc +1 -1
  167. data/src/core/lib/transport/metadata.cc +66 -33
  168. data/src/core/lib/transport/metadata_batch.cc +1 -1
  169. data/src/core/lib/transport/metadata_batch.h +1 -1
  170. data/src/core/lib/transport/timeout_encoding.cc +1 -1
  171. data/src/core/lib/transport/timeout_encoding.h +1 -1
  172. data/src/core/lib/transport/transport.h +4 -3
  173. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +3 -3
  174. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -1
  175. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +4 -3
  176. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +1 -1
  177. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +1 -1
  178. data/src/core/tsi/ssl_transport_security.cc +1 -5
  179. data/src/core/tsi/ssl_transport_security.h +24 -4
  180. data/src/ruby/bin/math_pb.rb +18 -16
  181. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  182. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  183. data/src/ruby/lib/grpc/generic/rpc_server.rb +1 -1
  184. data/src/ruby/lib/grpc/version.rb +1 -1
  185. data/src/ruby/pb/README.md +1 -1
  186. data/src/ruby/pb/grpc/health/v1/health_pb.rb +13 -10
  187. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +18 -0
  188. data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +3 -1
  189. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +58 -56
  190. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -0
  191. data/third_party/cares/cares/ares.h +12 -0
  192. data/third_party/cares/cares/ares_create_query.c +5 -1
  193. data/third_party/cares/cares/ares_data.c +74 -73
  194. data/third_party/cares/cares/ares_destroy.c +6 -1
  195. data/third_party/cares/cares/ares_gethostbyaddr.c +5 -5
  196. data/third_party/cares/cares/ares_gethostbyname.c +15 -4
  197. data/third_party/cares/cares/ares_getnameinfo.c +11 -0
  198. data/third_party/cares/cares/ares_init.c +274 -173
  199. data/third_party/cares/cares/ares_library_init.c +21 -3
  200. data/third_party/cares/cares/ares_options.c +6 -2
  201. data/third_party/cares/cares/ares_parse_naptr_reply.c +7 -6
  202. data/third_party/cares/cares/ares_parse_ptr_reply.c +4 -2
  203. data/third_party/cares/cares/ares_platform.c +7 -0
  204. data/third_party/cares/cares/ares_private.h +19 -11
  205. data/third_party/cares/cares/ares_process.c +27 -2
  206. data/third_party/cares/cares/ares_rules.h +1 -1
  207. data/third_party/cares/cares/ares_search.c +7 -0
  208. data/third_party/cares/cares/ares_send.c +6 -0
  209. data/third_party/cares/cares/ares_strsplit.c +174 -0
  210. data/third_party/cares/cares/ares_strsplit.h +43 -0
  211. data/third_party/cares/cares/ares_version.h +4 -4
  212. data/third_party/cares/cares/config-win32.h +1 -1
  213. data/third_party/cares/cares/inet_ntop.c +2 -3
  214. data/third_party/cares/config_darwin/ares_config.h +3 -0
  215. data/third_party/cares/config_freebsd/ares_config.h +3 -0
  216. data/third_party/cares/config_linux/ares_config.h +3 -0
  217. data/third_party/cares/config_openbsd/ares_config.h +3 -0
  218. metadata +39 -37
  219. data/src/core/ext/filters/client_channel/request_routing.cc +0 -946
  220. data/src/core/ext/filters/client_channel/request_routing.h +0 -181
  221. data/src/core/lib/gprpp/atomic_with_atm.h +0 -57
  222. data/src/core/lib/gprpp/atomic_with_std.h +0 -35
  223. data/src/core/lib/iomgr/wakeup_fd_cv.cc +0 -107
  224. data/src/core/lib/iomgr/wakeup_fd_cv.h +0 -69
@@ -33,55 +33,12 @@
33
33
  #include "src/core/lib/security/transport/target_authority_table.h"
34
34
  #include "src/core/lib/slice/slice_internal.h"
35
35
 
36
- namespace grpc_core {
37
- namespace {
38
-
39
- int BalancerNameCmp(const grpc_core::UniquePtr<char>& a,
40
- const grpc_core::UniquePtr<char>& b) {
41
- return strcmp(a.get(), b.get());
42
- }
43
-
44
- RefCountedPtr<TargetAuthorityTable> CreateTargetAuthorityTable(
45
- const ServerAddressList& addresses) {
46
- TargetAuthorityTable::Entry* target_authority_entries =
47
- static_cast<TargetAuthorityTable::Entry*>(
48
- gpr_zalloc(sizeof(*target_authority_entries) * addresses.size()));
49
- for (size_t i = 0; i < addresses.size(); ++i) {
50
- char* addr_str;
51
- GPR_ASSERT(
52
- grpc_sockaddr_to_string(&addr_str, &addresses[i].address(), true) > 0);
53
- target_authority_entries[i].key = grpc_slice_from_copied_string(addr_str);
54
- gpr_free(addr_str);
55
- char* balancer_name = grpc_channel_arg_get_string(grpc_channel_args_find(
56
- addresses[i].args(), GRPC_ARG_ADDRESS_BALANCER_NAME));
57
- target_authority_entries[i].value.reset(gpr_strdup(balancer_name));
58
- }
59
- RefCountedPtr<TargetAuthorityTable> target_authority_table =
60
- TargetAuthorityTable::Create(addresses.size(), target_authority_entries,
61
- BalancerNameCmp);
62
- gpr_free(target_authority_entries);
63
- return target_authority_table;
64
- }
65
-
66
- } // namespace
67
- } // namespace grpc_core
68
-
69
36
  grpc_channel_args* grpc_lb_policy_xds_modify_lb_channel_args(
70
37
  grpc_channel_args* args) {
71
38
  const char* args_to_remove[1];
72
39
  size_t num_args_to_remove = 0;
73
40
  grpc_arg args_to_add[2];
74
41
  size_t num_args_to_add = 0;
75
- // Add arg for targets info table.
76
- grpc_core::ServerAddressList* addresses =
77
- grpc_core::FindServerAddressListChannelArg(args);
78
- GPR_ASSERT(addresses != nullptr);
79
- grpc_core::RefCountedPtr<grpc_core::TargetAuthorityTable>
80
- target_authority_table =
81
- grpc_core::CreateTargetAuthorityTable(*addresses);
82
- args_to_add[num_args_to_add++] =
83
- grpc_core::CreateTargetAuthorityTableChannelArg(
84
- target_authority_table.get());
85
42
  // Substitute the channel credentials with a version without call
86
43
  // credentials: the load balancer is not necessarily trusted to handle
87
44
  // bearer token credentials.
@@ -161,10 +161,10 @@ void xds_grpclb_request_destroy(xds_grpclb_request* request) {
161
161
 
162
162
  typedef grpc_lb_v1_LoadBalanceResponse xds_grpclb_response;
163
163
  xds_grpclb_initial_response* xds_grpclb_initial_response_parse(
164
- grpc_slice encoded_xds_grpclb_response) {
165
- pb_istream_t stream =
166
- pb_istream_from_buffer(GRPC_SLICE_START_PTR(encoded_xds_grpclb_response),
167
- GRPC_SLICE_LENGTH(encoded_xds_grpclb_response));
164
+ const grpc_slice& encoded_xds_grpclb_response) {
165
+ pb_istream_t stream = pb_istream_from_buffer(
166
+ const_cast<uint8_t*>(GRPC_SLICE_START_PTR(encoded_xds_grpclb_response)),
167
+ GRPC_SLICE_LENGTH(encoded_xds_grpclb_response));
168
168
  xds_grpclb_response res;
169
169
  memset(&res, 0, sizeof(xds_grpclb_response));
170
170
  if (GPR_UNLIKELY(
@@ -185,10 +185,10 @@ xds_grpclb_initial_response* xds_grpclb_initial_response_parse(
185
185
  }
186
186
 
187
187
  xds_grpclb_serverlist* xds_grpclb_response_parse_serverlist(
188
- grpc_slice encoded_xds_grpclb_response) {
189
- pb_istream_t stream =
190
- pb_istream_from_buffer(GRPC_SLICE_START_PTR(encoded_xds_grpclb_response),
191
- GRPC_SLICE_LENGTH(encoded_xds_grpclb_response));
188
+ const grpc_slice& encoded_xds_grpclb_response) {
189
+ pb_istream_t stream = pb_istream_from_buffer(
190
+ const_cast<uint8_t*>(GRPC_SLICE_START_PTR(encoded_xds_grpclb_response)),
191
+ GRPC_SLICE_LENGTH(encoded_xds_grpclb_response));
192
192
  pb_istream_t stream_at_start = stream;
193
193
  xds_grpclb_serverlist* sl = static_cast<xds_grpclb_serverlist*>(
194
194
  gpr_zalloc(sizeof(xds_grpclb_serverlist)));
@@ -55,11 +55,11 @@ void xds_grpclb_request_destroy(xds_grpclb_request* request);
55
55
  /** Parse (ie, decode) the bytes in \a encoded_xds_grpclb_response as a \a
56
56
  * xds_grpclb_initial_response */
57
57
  xds_grpclb_initial_response* xds_grpclb_initial_response_parse(
58
- grpc_slice encoded_xds_grpclb_response);
58
+ const grpc_slice& encoded_xds_grpclb_response);
59
59
 
60
60
  /** Parse the list of servers from an encoded \a xds_grpclb_response */
61
61
  xds_grpclb_serverlist* xds_grpclb_response_parse_serverlist(
62
- grpc_slice encoded_xds_grpclb_response);
62
+ const grpc_slice& encoded_xds_grpclb_response);
63
63
 
64
64
  /** Return a copy of \a sl. The caller is responsible for calling \a
65
65
  * xds_grpclb_destroy_serverlist on the returned copy. */
@@ -31,12 +31,7 @@ class LoadBalancingPolicyFactory {
31
31
  public:
32
32
  /// Returns a new LB policy instance.
33
33
  virtual OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(
34
- LoadBalancingPolicy::Args args) const {
35
- std::move(args); // Suppress clang-tidy complaint.
36
- // The rest of this is copied from the GRPC_ABSTRACT macro.
37
- gpr_log(GPR_ERROR, "Function marked GRPC_ABSTRACT was not implemented");
38
- GPR_ASSERT(false);
39
- }
34
+ LoadBalancingPolicy::Args) const GRPC_ABSTRACT;
40
35
 
41
36
  /// Returns the LB policy name that this factory provides.
42
37
  /// Caller does NOT take ownership of result.
@@ -26,10 +26,63 @@ grpc_core::DebugOnlyTraceFlag grpc_trace_resolver_refcount(false,
26
26
 
27
27
  namespace grpc_core {
28
28
 
29
- Resolver::Resolver(grpc_combiner* combiner)
29
+ //
30
+ // Resolver
31
+ //
32
+
33
+ Resolver::Resolver(grpc_combiner* combiner,
34
+ UniquePtr<ResultHandler> result_handler)
30
35
  : InternallyRefCounted(&grpc_trace_resolver_refcount),
36
+ result_handler_(std::move(result_handler)),
31
37
  combiner_(GRPC_COMBINER_REF(combiner, "resolver")) {}
32
38
 
33
39
  Resolver::~Resolver() { GRPC_COMBINER_UNREF(combiner_, "resolver"); }
34
40
 
41
+ //
42
+ // Resolver::Result
43
+ //
44
+
45
+ Resolver::Result::~Result() {
46
+ GRPC_ERROR_UNREF(service_config_error);
47
+ grpc_channel_args_destroy(args);
48
+ }
49
+
50
+ Resolver::Result::Result(const Result& other) {
51
+ addresses = other.addresses;
52
+ service_config = other.service_config;
53
+ service_config_error = GRPC_ERROR_REF(other.service_config_error);
54
+ args = grpc_channel_args_copy(other.args);
55
+ }
56
+
57
+ Resolver::Result::Result(Result&& other) {
58
+ addresses = std::move(other.addresses);
59
+ service_config = std::move(other.service_config);
60
+ service_config_error = other.service_config_error;
61
+ other.service_config_error = GRPC_ERROR_NONE;
62
+ args = other.args;
63
+ other.args = nullptr;
64
+ }
65
+
66
+ Resolver::Result& Resolver::Result::operator=(const Result& other) {
67
+ addresses = other.addresses;
68
+ service_config = other.service_config;
69
+ GRPC_ERROR_UNREF(service_config_error);
70
+ service_config_error = GRPC_ERROR_REF(other.service_config_error);
71
+ grpc_channel_args_destroy(args);
72
+ args = grpc_channel_args_copy(other.args);
73
+ return *this;
74
+ }
75
+
76
+ Resolver::Result& Resolver::Result::operator=(Result&& other) {
77
+ addresses = std::move(other.addresses);
78
+ service_config = std::move(other.service_config);
79
+ GRPC_ERROR_UNREF(service_config_error);
80
+ service_config_error = other.service_config_error;
81
+ other.service_config_error = GRPC_ERROR_NONE;
82
+ grpc_channel_args_destroy(args);
83
+ args = other.args;
84
+ other.args = nullptr;
85
+ return *this;
86
+ }
87
+
35
88
  } // namespace grpc_core
@@ -23,8 +23,11 @@
23
23
 
24
24
  #include <grpc/impl/codegen/grpc_types.h>
25
25
 
26
+ #include "src/core/ext/filters/client_channel/server_address.h"
27
+ #include "src/core/ext/filters/client_channel/service_config.h"
26
28
  #include "src/core/lib/gprpp/abstract.h"
27
29
  #include "src/core/lib/gprpp/orphanable.h"
30
+ #include "src/core/lib/gprpp/ref_counted_ptr.h"
28
31
  #include "src/core/lib/iomgr/combiner.h"
29
32
  #include "src/core/lib/iomgr/iomgr.h"
30
33
 
@@ -46,27 +49,50 @@ namespace grpc_core {
46
49
  /// combiner passed to the constructor.
47
50
  class Resolver : public InternallyRefCounted<Resolver> {
48
51
  public:
52
+ /// Results returned by the resolver.
53
+ struct Result {
54
+ ServerAddressList addresses;
55
+ RefCountedPtr<ServiceConfig> service_config;
56
+ grpc_error* service_config_error = GRPC_ERROR_NONE;
57
+ const grpc_channel_args* args = nullptr;
58
+
59
+ // TODO(roth): Remove everything below once grpc_error and
60
+ // grpc_channel_args are convert to copyable and movable C++ objects.
61
+ Result() = default;
62
+ ~Result();
63
+ Result(const Result& other);
64
+ Result(Result&& other);
65
+ Result& operator=(const Result& other);
66
+ Result& operator=(Result&& other);
67
+ };
68
+
69
+ /// A proxy object used by the resolver to return results to the
70
+ /// client channel.
71
+ class ResultHandler {
72
+ public:
73
+ virtual ~ResultHandler() {}
74
+
75
+ /// Returns a result to the channel.
76
+ /// Takes ownership of \a result.args.
77
+ virtual void ReturnResult(Result result) GRPC_ABSTRACT; // NOLINT
78
+
79
+ /// Returns a transient error to the channel.
80
+ /// If the resolver does not set the GRPC_ERROR_INT_GRPC_STATUS
81
+ /// attribute on the error, calls will be failed with status UNKNOWN.
82
+ virtual void ReturnError(grpc_error* error) GRPC_ABSTRACT;
83
+
84
+ // TODO(yashkt): As part of the service config error handling
85
+ // changes, add a method to parse the service config JSON string.
86
+
87
+ GRPC_ABSTRACT_BASE_CLASS
88
+ };
89
+
49
90
  // Not copyable nor movable.
50
91
  Resolver(const Resolver&) = delete;
51
92
  Resolver& operator=(const Resolver&) = delete;
52
93
 
53
- /// Requests a callback when a new result becomes available.
54
- /// When the new result is available, sets \a *result to the new result
55
- /// and schedules \a on_complete for execution.
56
- /// Upon transient failure, sets \a *result to nullptr and schedules
57
- /// \a on_complete with no error.
58
- /// If resolution is fatally broken, sets \a *result to nullptr and
59
- /// schedules \a on_complete with an error.
60
- /// TODO(roth): When we have time, improve the way this API represents
61
- /// transient failure vs. shutdown.
62
- ///
63
- /// Note that the client channel will almost always have a request
64
- /// to \a NextLocked() pending. When it gets the callback, it will
65
- /// process the new result and then immediately make another call to
66
- /// \a NextLocked(). This allows push-based resolvers to provide new
67
- /// data as soon as it becomes available.
68
- virtual void NextLocked(grpc_channel_args** result,
69
- grpc_closure* on_complete) GRPC_ABSTRACT;
94
+ /// Starts resolving.
95
+ virtual void StartLocked() GRPC_ABSTRACT;
70
96
 
71
97
  /// Asks the resolver to obtain an updated resolver result, if
72
98
  /// applicable.
@@ -79,8 +105,8 @@ class Resolver : public InternallyRefCounted<Resolver> {
79
105
  ///
80
106
  /// For push-based implementations, this may be a no-op.
81
107
  ///
82
- /// If this causes new data to become available, then the currently
83
- /// pending call to \a NextLocked() will return the new result.
108
+ /// Note: Implementations must not invoke any method on the
109
+ /// ResultHandler from within this call.
84
110
  virtual void RequestReresolutionLocked() {}
85
111
 
86
112
  /// Resets the re-resolution backoff, if any.
@@ -108,16 +134,18 @@ class Resolver : public InternallyRefCounted<Resolver> {
108
134
  // TODO(roth): Once we have a C++-like interface for combiners, this
109
135
  // API should change to take a RefCountedPtr<>, so that we always take
110
136
  // ownership of a new ref.
111
- explicit Resolver(grpc_combiner* combiner);
137
+ explicit Resolver(grpc_combiner* combiner,
138
+ UniquePtr<ResultHandler> result_handler);
112
139
 
113
140
  virtual ~Resolver();
114
141
 
115
- /// Shuts down the resolver. If there is a pending call to
116
- /// NextLocked(), the callback will be scheduled with an error.
142
+ /// Shuts down the resolver.
117
143
  virtual void ShutdownLocked() GRPC_ABSTRACT;
118
144
 
119
145
  grpc_combiner* combiner() const { return combiner_; }
120
146
 
147
+ ResultHandler* result_handler() const { return result_handler_.get(); }
148
+
121
149
  private:
122
150
  static void ShutdownAndUnrefLocked(void* arg, grpc_error* ignored) {
123
151
  Resolver* resolver = static_cast<Resolver*>(arg);
@@ -125,6 +153,7 @@ class Resolver : public InternallyRefCounted<Resolver> {
125
153
  resolver->Unref();
126
154
  }
127
155
 
156
+ UniquePtr<ResultHandler> result_handler_;
128
157
  grpc_combiner* combiner_;
129
158
  };
130
159
 
@@ -34,6 +34,7 @@
34
34
  #include "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h"
35
35
  #include "src/core/ext/filters/client_channel/resolver_registry.h"
36
36
  #include "src/core/ext/filters/client_channel/server_address.h"
37
+ #include "src/core/ext/filters/client_channel/service_config.h"
37
38
  #include "src/core/lib/backoff/backoff.h"
38
39
  #include "src/core/lib/channel/channel_args.h"
39
40
  #include "src/core/lib/gpr/env.h"
@@ -45,7 +46,6 @@
45
46
  #include "src/core/lib/iomgr/resolve_address.h"
46
47
  #include "src/core/lib/iomgr/timer.h"
47
48
  #include "src/core/lib/json/json.h"
48
- #include "src/core/lib/transport/service_config.h"
49
49
 
50
50
  #define GRPC_DNS_INITIAL_CONNECT_BACKOFF_SECONDS 1
51
51
  #define GRPC_DNS_RECONNECT_BACKOFF_MULTIPLIER 1.6
@@ -60,10 +60,9 @@ const char kDefaultPort[] = "https";
60
60
 
61
61
  class AresDnsResolver : public Resolver {
62
62
  public:
63
- explicit AresDnsResolver(const ResolverArgs& args);
63
+ explicit AresDnsResolver(ResolverArgs args);
64
64
 
65
- void NextLocked(grpc_channel_args** result,
66
- grpc_closure* on_complete) override;
65
+ void StartLocked() override;
67
66
 
68
67
  void RequestReresolutionLocked() override;
69
68
 
@@ -76,7 +75,6 @@ class AresDnsResolver : public Resolver {
76
75
 
77
76
  void MaybeStartResolvingLocked();
78
77
  void StartResolvingLocked();
79
- void MaybeFinishNextLocked();
80
78
 
81
79
  static void OnNextResolutionLocked(void* arg, grpc_error* error);
82
80
  static void OnResolvedLocked(void* arg, grpc_error* error);
@@ -98,16 +96,6 @@ class AresDnsResolver : public Resolver {
98
96
  bool resolving_ = false;
99
97
  /// the pending resolving request
100
98
  grpc_ares_request* pending_request_ = nullptr;
101
- /// which version of the result have we published?
102
- int published_version_ = 0;
103
- /// which version of the result is current?
104
- int resolved_version_ = 0;
105
- /// pending next completion, or NULL
106
- grpc_closure* next_completion_ = nullptr;
107
- /// target result address for next completion
108
- grpc_channel_args** target_result_ = nullptr;
109
- /// current (fully resolved) result
110
- grpc_channel_args* resolved_result_ = nullptr;
111
99
  /// next resolution timer
112
100
  bool have_next_resolution_timer_ = false;
113
101
  grpc_timer next_resolution_timer_;
@@ -129,8 +117,8 @@ class AresDnsResolver : public Resolver {
129
117
  bool enable_srv_queries_;
130
118
  };
131
119
 
132
- AresDnsResolver::AresDnsResolver(const ResolverArgs& args)
133
- : Resolver(args.combiner),
120
+ AresDnsResolver::AresDnsResolver(ResolverArgs args)
121
+ : Resolver(args.combiner, std::move(args.result_handler)),
134
122
  backoff_(
135
123
  BackOff::Options()
136
124
  .set_initial_backoff(GRPC_DNS_INITIAL_CONNECT_BACKOFF_SECONDS *
@@ -177,27 +165,16 @@ AresDnsResolver::AresDnsResolver(const ResolverArgs& args)
177
165
 
178
166
  AresDnsResolver::~AresDnsResolver() {
179
167
  GRPC_CARES_TRACE_LOG("resolver:%p destroying AresDnsResolver", this);
180
- if (resolved_result_ != nullptr) {
181
- grpc_channel_args_destroy(resolved_result_);
182
- }
183
168
  grpc_pollset_set_destroy(interested_parties_);
184
169
  gpr_free(dns_server_);
185
170
  gpr_free(name_to_resolve_);
186
171
  grpc_channel_args_destroy(channel_args_);
187
172
  }
188
173
 
189
- void AresDnsResolver::NextLocked(grpc_channel_args** target_result,
190
- grpc_closure* on_complete) {
191
- GRPC_CARES_TRACE_LOG("resolver:%p AresDnsResolver::NextLocked() is called.",
174
+ void AresDnsResolver::StartLocked() {
175
+ GRPC_CARES_TRACE_LOG("resolver:%p AresDnsResolver::StartLocked() is called.",
192
176
  this);
193
- GPR_ASSERT(next_completion_ == nullptr);
194
- next_completion_ = on_complete;
195
- target_result_ = target_result;
196
- if (resolved_version_ == 0 && !resolving_) {
197
- MaybeStartResolvingLocked();
198
- } else {
199
- MaybeFinishNextLocked();
200
- }
177
+ MaybeStartResolvingLocked();
201
178
  }
202
179
 
203
180
  void AresDnsResolver::RequestReresolutionLocked() {
@@ -221,12 +198,6 @@ void AresDnsResolver::ShutdownLocked() {
221
198
  if (pending_request_ != nullptr) {
222
199
  grpc_cancel_ares_request_locked(pending_request_);
223
200
  }
224
- if (next_completion_ != nullptr) {
225
- *target_result_ = nullptr;
226
- GRPC_CLOSURE_SCHED(next_completion_, GRPC_ERROR_CREATE_FROM_STATIC_STRING(
227
- "Resolver Shutdown"));
228
- next_completion_ = nullptr;
229
- }
230
201
  }
231
202
 
232
203
  void AresDnsResolver::OnNextResolutionLocked(void* arg, grpc_error* error) {
@@ -319,41 +290,42 @@ char* ChooseServiceConfig(char* service_config_choice_json) {
319
290
 
320
291
  void AresDnsResolver::OnResolvedLocked(void* arg, grpc_error* error) {
321
292
  AresDnsResolver* r = static_cast<AresDnsResolver*>(arg);
322
- grpc_channel_args* result = nullptr;
323
293
  GPR_ASSERT(r->resolving_);
324
294
  r->resolving_ = false;
325
295
  gpr_free(r->pending_request_);
326
296
  r->pending_request_ = nullptr;
297
+ if (r->shutdown_initiated_) {
298
+ r->Unref(DEBUG_LOCATION, "OnResolvedLocked() shutdown");
299
+ return;
300
+ }
327
301
  if (r->addresses_ != nullptr) {
328
- static const char* args_to_remove[1];
329
- size_t num_args_to_remove = 0;
330
- grpc_arg args_to_add[2];
331
- size_t num_args_to_add = 0;
332
- args_to_add[num_args_to_add++] =
333
- CreateServerAddressListChannelArg(r->addresses_.get());
334
- char* service_config_string = nullptr;
302
+ Result result;
303
+ result.addresses = std::move(*r->addresses_);
335
304
  if (r->service_config_json_ != nullptr) {
336
- service_config_string = ChooseServiceConfig(r->service_config_json_);
305
+ char* service_config_string =
306
+ ChooseServiceConfig(r->service_config_json_);
337
307
  gpr_free(r->service_config_json_);
338
308
  if (service_config_string != nullptr) {
339
309
  GRPC_CARES_TRACE_LOG("resolver:%p selected service config choice: %s",
340
310
  r, service_config_string);
341
- args_to_remove[num_args_to_remove++] = GRPC_ARG_SERVICE_CONFIG;
342
- args_to_add[num_args_to_add++] = grpc_channel_arg_string_create(
343
- (char*)GRPC_ARG_SERVICE_CONFIG, service_config_string);
311
+ result.service_config = ServiceConfig::Create(service_config_string);
344
312
  }
313
+ gpr_free(service_config_string);
345
314
  }
346
- result = grpc_channel_args_copy_and_add_and_remove(
347
- r->channel_args_, args_to_remove, num_args_to_remove, args_to_add,
348
- num_args_to_add);
349
- gpr_free(service_config_string);
315
+ result.args = grpc_channel_args_copy(r->channel_args_);
316
+ r->result_handler()->ReturnResult(std::move(result));
350
317
  r->addresses_.reset();
351
318
  // Reset backoff state so that we start from the beginning when the
352
319
  // next request gets triggered.
353
320
  r->backoff_.Reset();
354
- } else if (!r->shutdown_initiated_) {
355
- const char* msg = grpc_error_string(error);
356
- GRPC_CARES_TRACE_LOG("resolver:%p dns resolution failed: %s", r, msg);
321
+ } else {
322
+ GRPC_CARES_TRACE_LOG("resolver:%p dns resolution failed: %s", r,
323
+ grpc_error_string(error));
324
+ r->result_handler()->ReturnError(grpc_error_set_int(
325
+ GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
326
+ "DNS resolution failed", &error, 1),
327
+ GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE));
328
+ // Set retry timer.
357
329
  grpc_millis next_try = r->backoff_.NextAttemptTime();
358
330
  grpc_millis timeout = next_try - ExecCtx::Get()->Now();
359
331
  GRPC_CARES_TRACE_LOG("resolver:%p dns resolution failed (will retry): %s",
@@ -363,8 +335,7 @@ void AresDnsResolver::OnResolvedLocked(void* arg, grpc_error* error) {
363
335
  // TODO(roth): We currently deal with this ref manually. Once the
364
336
  // new closure API is done, find a way to track this ref with the timer
365
337
  // callback as part of the type system.
366
- RefCountedPtr<Resolver> self = r->Ref(DEBUG_LOCATION, "retry-timer");
367
- self.release();
338
+ r->Ref(DEBUG_LOCATION, "retry-timer").release();
368
339
  if (timeout > 0) {
369
340
  GRPC_CARES_TRACE_LOG("resolver:%p retrying in %" PRId64 " milliseconds",
370
341
  r, timeout);
@@ -374,12 +345,6 @@ void AresDnsResolver::OnResolvedLocked(void* arg, grpc_error* error) {
374
345
  grpc_timer_init(&r->next_resolution_timer_, next_try,
375
346
  &r->on_next_resolution_);
376
347
  }
377
- if (r->resolved_result_ != nullptr) {
378
- grpc_channel_args_destroy(r->resolved_result_);
379
- }
380
- r->resolved_result_ = result;
381
- ++r->resolved_version_;
382
- r->MaybeFinishNextLocked();
383
348
  r->Unref(DEBUG_LOCATION, "dns-resolving");
384
349
  }
385
350
 
@@ -403,9 +368,7 @@ void AresDnsResolver::MaybeStartResolvingLocked() {
403
368
  // TODO(roth): We currently deal with this ref manually. Once the
404
369
  // new closure API is done, find a way to track this ref with the timer
405
370
  // callback as part of the type system.
406
- RefCountedPtr<Resolver> self =
407
- Ref(DEBUG_LOCATION, "next_resolution_timer_cooldown");
408
- self.release();
371
+ Ref(DEBUG_LOCATION, "next_resolution_timer_cooldown").release();
409
372
  grpc_timer_init(&next_resolution_timer_, ms_until_next_resolution,
410
373
  &on_next_resolution_);
411
374
  return;
@@ -418,8 +381,7 @@ void AresDnsResolver::StartResolvingLocked() {
418
381
  // TODO(roth): We currently deal with this ref manually. Once the
419
382
  // new closure API is done, find a way to track this ref with the timer
420
383
  // callback as part of the type system.
421
- RefCountedPtr<Resolver> self = Ref(DEBUG_LOCATION, "dns-resolving");
422
- self.release();
384
+ Ref(DEBUG_LOCATION, "dns-resolving").release();
423
385
  GPR_ASSERT(!resolving_);
424
386
  resolving_ = true;
425
387
  service_config_json_ = nullptr;
@@ -433,28 +395,14 @@ void AresDnsResolver::StartResolvingLocked() {
433
395
  this, pending_request_);
434
396
  }
435
397
 
436
- void AresDnsResolver::MaybeFinishNextLocked() {
437
- if (next_completion_ != nullptr && resolved_version_ != published_version_) {
438
- *target_result_ = resolved_result_ == nullptr
439
- ? nullptr
440
- : grpc_channel_args_copy(resolved_result_);
441
- GRPC_CARES_TRACE_LOG("resolver:%p AresDnsResolver::MaybeFinishNextLocked()",
442
- this);
443
- GRPC_CLOSURE_SCHED(next_completion_, GRPC_ERROR_NONE);
444
- next_completion_ = nullptr;
445
- published_version_ = resolved_version_;
446
- }
447
- }
448
-
449
398
  //
450
399
  // Factory
451
400
  //
452
401
 
453
402
  class AresDnsResolverFactory : public ResolverFactory {
454
403
  public:
455
- OrphanablePtr<Resolver> CreateResolver(
456
- const ResolverArgs& args) const override {
457
- return OrphanablePtr<Resolver>(New<AresDnsResolver>(args));
404
+ OrphanablePtr<Resolver> CreateResolver(ResolverArgs args) const override {
405
+ return OrphanablePtr<Resolver>(New<AresDnsResolver>(std::move(args)));
458
406
  }
459
407
 
460
408
  const char* scheme() const override { return "dns"; }
@@ -489,7 +437,7 @@ void grpc_resolver_dns_ares_init() {
489
437
  address_sorting_init();
490
438
  grpc_error* error = grpc_ares_init();
491
439
  if (error != GRPC_ERROR_NONE) {
492
- GRPC_LOG_IF_ERROR("ares_library_init() failed", error);
440
+ GRPC_LOG_IF_ERROR("grpc_ares_init() failed", error);
493
441
  return;
494
442
  }
495
443
  if (default_resolver == nullptr) {