grpc 1.28.0 → 1.30.0

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 (497) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +7694 -11190
  3. data/include/grpc/grpc.h +2 -2
  4. data/include/grpc/grpc_security.h +22 -9
  5. data/include/grpc/grpc_security_constants.h +1 -0
  6. data/include/grpc/impl/codegen/grpc_types.h +19 -21
  7. data/include/grpc/impl/codegen/port_platform.h +6 -2
  8. data/include/grpc/module.modulemap +24 -39
  9. data/src/core/ext/filters/client_channel/backend_metric.cc +7 -4
  10. data/src/core/ext/filters/client_channel/client_channel.cc +203 -236
  11. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +3 -2
  12. data/src/core/ext/filters/client_channel/health/health_check_client.cc +7 -22
  13. data/src/core/ext/filters/client_channel/health/health_check_client.h +3 -3
  14. data/src/core/ext/filters/client_channel/http_proxy.cc +17 -10
  15. data/src/core/ext/filters/client_channel/lb_policy.cc +19 -18
  16. data/src/core/ext/filters/client_channel/lb_policy.h +42 -33
  17. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +83 -0
  18. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +99 -0
  19. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +10 -4
  20. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +240 -301
  21. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +89 -0
  22. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +40 -0
  23. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +11 -9
  24. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +3 -2
  25. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +871 -0
  26. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +1 -1
  27. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +5 -11
  28. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +734 -0
  29. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +84 -37
  30. data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +938 -0
  31. data/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc +528 -0
  32. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +1 -2
  33. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +834 -0
  34. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +6 -2
  35. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +2 -1
  36. data/src/core/ext/filters/client_channel/parse_address.cc +22 -21
  37. data/src/core/ext/filters/client_channel/resolver.cc +5 -8
  38. data/src/core/ext/filters/client_channel/resolver.h +12 -14
  39. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +73 -59
  40. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +35 -35
  41. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +8 -7
  42. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +16 -20
  43. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +4 -4
  44. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +72 -117
  45. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +184 -133
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +5 -3
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +7 -4
  48. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +40 -43
  49. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +93 -102
  50. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +0 -4
  51. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +2 -2
  52. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +32 -5
  53. data/src/core/ext/filters/client_channel/resolver_factory.h +2 -2
  54. data/src/core/ext/filters/client_channel/resolver_registry.cc +6 -3
  55. data/src/core/ext/filters/client_channel/resolver_registry.h +8 -8
  56. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +16 -16
  57. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +19 -16
  58. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +20 -31
  59. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +4 -3
  60. data/src/core/ext/filters/client_channel/server_address.cc +6 -9
  61. data/src/core/ext/filters/client_channel/server_address.h +6 -12
  62. data/src/core/ext/filters/client_channel/service_config.cc +104 -144
  63. data/src/core/ext/filters/client_channel/service_config.h +28 -98
  64. data/src/core/ext/filters/client_channel/service_config_call_data.h +68 -0
  65. data/src/core/ext/filters/client_channel/service_config_parser.cc +87 -0
  66. data/src/core/ext/filters/client_channel/service_config_parser.h +89 -0
  67. data/src/core/ext/filters/client_channel/subchannel.cc +54 -24
  68. data/src/core/ext/filters/client_channel/subchannel.h +35 -11
  69. data/src/core/ext/filters/client_channel/xds/xds_api.cc +348 -221
  70. data/src/core/ext/filters/client_channel/xds/xds_api.h +37 -37
  71. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc +44 -49
  72. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.h +4 -3
  73. data/src/core/ext/filters/client_channel/xds/xds_channel_secure.cc +4 -2
  74. data/src/core/ext/filters/client_channel/xds/xds_client.cc +532 -339
  75. data/src/core/ext/filters/client_channel/xds/xds_client.h +57 -22
  76. data/src/core/ext/filters/client_channel/xds/xds_client_stats.cc +11 -12
  77. data/src/core/ext/filters/client_channel/xds/xds_client_stats.h +31 -19
  78. data/src/core/ext/filters/http/client/http_client_filter.cc +23 -28
  79. data/src/core/ext/filters/http/client_authority_filter.cc +4 -4
  80. data/src/core/ext/filters/http/http_filters_plugin.cc +27 -12
  81. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +258 -221
  82. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +358 -0
  83. data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +29 -0
  84. data/src/core/ext/filters/message_size/message_size_filter.cc +7 -10
  85. data/src/core/ext/filters/message_size/message_size_filter.h +4 -4
  86. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +4 -4
  87. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +4 -6
  88. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +23 -22
  89. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -0
  90. data/src/core/ext/transport/chttp2/transport/flow_control.cc +3 -3
  91. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +2 -3
  92. data/src/core/ext/transport/chttp2/transport/frame_ping.h +2 -3
  93. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +2 -3
  94. data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -3
  95. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +2 -3
  96. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +29 -16
  97. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +2 -3
  98. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +2 -3
  99. data/src/core/ext/transport/chttp2/transport/hpack_table.h +2 -2
  100. data/src/core/ext/transport/chttp2/transport/http2_settings.h +4 -5
  101. data/src/core/ext/transport/chttp2/transport/huffsyms.h +2 -3
  102. data/src/core/ext/transport/chttp2/transport/internal.h +14 -21
  103. data/src/core/ext/transport/chttp2/transport/stream_map.h +2 -3
  104. data/src/core/ext/transport/chttp2/transport/writing.cc +15 -8
  105. data/src/core/ext/transport/inproc/inproc_transport.cc +19 -0
  106. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c +4 -229
  107. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +5 -875
  108. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c +114 -0
  109. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h +418 -0
  110. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c +72 -0
  111. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h +197 -0
  112. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c +105 -0
  113. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h +378 -0
  114. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.c +1 -0
  115. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c +21 -8
  116. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h +43 -7
  117. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c +1 -0
  118. data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c +1 -0
  119. data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c +1 -0
  120. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c +2 -1
  121. data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c +35 -0
  122. data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h +78 -0
  123. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +47 -26
  124. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +115 -65
  125. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c +1 -0
  126. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c +34 -0
  127. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h +72 -0
  128. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c +2 -1
  129. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c +24 -20
  130. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +28 -13
  131. data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c +1 -0
  132. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c +38 -18
  133. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +88 -6
  134. data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c +34 -0
  135. data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h +89 -0
  136. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +1 -0
  137. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.c +1 -0
  138. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c +1 -0
  139. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c +1 -0
  140. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c +9 -6
  141. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h +12 -4
  142. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c +1 -0
  143. data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.c +1 -0
  144. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.c +15 -10
  145. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.h +16 -0
  146. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c +1 -0
  147. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c +2 -1
  148. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c +1 -0
  149. data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.c +1 -0
  150. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.c +1 -0
  151. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c +1 -0
  152. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c +63 -41
  153. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h +173 -77
  154. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c +1 -0
  155. data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.c +1 -0
  156. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c +1 -0
  157. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c +48 -28
  158. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h +90 -30
  159. data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c +1 -0
  160. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c +51 -0
  161. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h +125 -0
  162. data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c +1 -0
  163. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c +4 -2
  164. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h +4 -0
  165. data/src/core/ext/upb-generated/envoy/type/http.upb.c +1 -0
  166. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c +16 -0
  167. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h +36 -0
  168. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.c +1 -0
  169. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c +1 -0
  170. data/src/core/ext/upb-generated/envoy/type/percent.upb.c +1 -0
  171. data/src/core/ext/upb-generated/envoy/type/range.upb.c +1 -0
  172. data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.c +1 -0
  173. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c +1 -0
  174. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +9 -8
  175. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +30 -24
  176. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +28 -0
  177. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +65 -0
  178. data/src/core/ext/upb-generated/validate/validate.upb.c +21 -20
  179. data/src/core/ext/upb-generated/validate/validate.upb.h +69 -63
  180. data/src/core/lib/channel/channel_args.cc +15 -14
  181. data/src/core/lib/channel/channel_args.h +3 -1
  182. data/src/core/lib/channel/channel_stack.h +20 -13
  183. data/src/core/lib/channel/channelz.cc +5 -6
  184. data/src/core/lib/channel/channelz.h +3 -2
  185. data/src/core/lib/channel/channelz_registry.cc +5 -3
  186. data/src/core/lib/channel/connected_channel.cc +7 -5
  187. data/src/core/lib/channel/context.h +1 -1
  188. data/src/core/lib/channel/handshaker.cc +11 -13
  189. data/src/core/lib/channel/handshaker.h +4 -2
  190. data/src/core/lib/channel/handshaker_registry.cc +5 -17
  191. data/src/core/lib/channel/status_util.cc +2 -3
  192. data/src/core/lib/compression/message_compress.cc +5 -1
  193. data/src/core/lib/debug/stats.cc +21 -27
  194. data/src/core/lib/debug/stats.h +3 -1
  195. data/src/core/lib/gpr/spinlock.h +2 -3
  196. data/src/core/lib/gpr/string.cc +2 -26
  197. data/src/core/lib/gpr/string.h +0 -16
  198. data/src/core/lib/gpr/sync_abseil.cc +2 -0
  199. data/src/core/lib/gpr/time.cc +4 -0
  200. data/src/core/lib/gpr/time_posix.cc +1 -1
  201. data/src/core/lib/gprpp/atomic.h +6 -6
  202. data/src/core/lib/gprpp/fork.cc +1 -1
  203. data/src/core/lib/gprpp/host_port.cc +29 -35
  204. data/src/core/lib/gprpp/host_port.h +14 -17
  205. data/src/core/lib/gprpp/map.h +5 -11
  206. data/src/core/lib/gprpp/ref_counted_ptr.h +5 -0
  207. data/src/core/lib/http/format_request.cc +46 -65
  208. data/src/core/lib/http/httpcli.cc +2 -3
  209. data/src/core/lib/http/httpcli.h +2 -3
  210. data/src/core/lib/http/httpcli_security_connector.cc +5 -5
  211. data/src/core/lib/http/parser.h +2 -3
  212. data/src/core/lib/iomgr/buffer_list.h +22 -21
  213. data/src/core/lib/iomgr/call_combiner.h +3 -2
  214. data/src/core/lib/iomgr/cfstream_handle.cc +3 -2
  215. data/src/core/lib/iomgr/closure.h +2 -3
  216. data/src/core/lib/iomgr/dualstack_socket_posix.cc +47 -0
  217. data/src/core/lib/iomgr/endpoint_cfstream.cc +2 -3
  218. data/src/core/lib/iomgr/endpoint_pair.h +2 -3
  219. data/src/core/lib/iomgr/error.cc +6 -9
  220. data/src/core/lib/iomgr/error.h +0 -1
  221. data/src/core/lib/iomgr/ev_apple.cc +356 -0
  222. data/src/core/lib/iomgr/ev_apple.h +43 -0
  223. data/src/core/lib/iomgr/ev_epoll1_linux.cc +20 -23
  224. data/src/core/lib/iomgr/ev_epollex_linux.cc +2 -3
  225. data/src/core/lib/iomgr/ev_poll_posix.cc +3 -3
  226. data/src/core/lib/iomgr/ev_posix.cc +2 -3
  227. data/src/core/lib/iomgr/exec_ctx.h +14 -2
  228. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +84 -20
  229. data/src/core/lib/iomgr/pollset_set_custom.cc +10 -10
  230. data/src/core/lib/{gprpp/optional.h → iomgr/pollset_uv.h} +11 -12
  231. data/src/core/lib/iomgr/port.h +1 -0
  232. data/src/core/lib/iomgr/python_util.h +46 -0
  233. data/src/core/lib/iomgr/resolve_address.h +4 -6
  234. data/src/core/lib/iomgr/resolve_address_custom.cc +29 -39
  235. data/src/core/lib/iomgr/resolve_address_custom.h +4 -2
  236. data/src/core/lib/iomgr/resolve_address_posix.cc +10 -11
  237. data/src/core/lib/iomgr/resolve_address_windows.cc +8 -17
  238. data/src/core/lib/iomgr/resource_quota.cc +4 -6
  239. data/src/core/lib/iomgr/sockaddr_utils.cc +23 -29
  240. data/src/core/lib/iomgr/sockaddr_utils.h +9 -14
  241. data/src/core/lib/iomgr/socket_factory_posix.h +2 -3
  242. data/src/core/lib/iomgr/socket_mutator.h +2 -3
  243. data/src/core/lib/iomgr/socket_utils_common_posix.cc +7 -26
  244. data/src/core/lib/iomgr/socket_utils_posix.h +3 -0
  245. data/src/core/lib/iomgr/tcp_client_cfstream.cc +5 -7
  246. data/src/core/lib/iomgr/tcp_client_posix.cc +8 -5
  247. data/src/core/lib/iomgr/tcp_client_windows.cc +2 -3
  248. data/src/core/lib/iomgr/tcp_custom.cc +2 -3
  249. data/src/core/lib/iomgr/tcp_server_custom.cc +5 -9
  250. data/src/core/lib/iomgr/tcp_server_posix.cc +5 -4
  251. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +5 -4
  252. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +8 -11
  253. data/src/core/lib/iomgr/tcp_uv.cc +3 -2
  254. data/src/core/lib/iomgr/time_averaged_stats.h +2 -3
  255. data/src/core/lib/iomgr/timer_generic.cc +2 -3
  256. data/src/core/lib/{gprpp/inlined_vector.h → iomgr/timer_generic.h} +19 -17
  257. data/src/core/lib/iomgr/timer_heap.h +2 -3
  258. data/src/core/lib/iomgr/udp_server.cc +9 -14
  259. data/src/core/lib/json/json.h +3 -2
  260. data/src/core/lib/json/json_reader.cc +5 -5
  261. data/src/core/lib/json/json_writer.cc +13 -12
  262. data/src/core/lib/security/credentials/composite/composite_credentials.cc +12 -0
  263. data/src/core/lib/security/credentials/composite/composite_credentials.h +6 -3
  264. data/src/core/lib/security/credentials/credentials.cc +0 -84
  265. data/src/core/lib/security/credentials/credentials.h +8 -59
  266. data/src/core/lib/security/credentials/fake/fake_credentials.h +4 -0
  267. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +3 -8
  268. data/src/core/lib/security/credentials/iam/iam_credentials.cc +8 -6
  269. data/src/core/lib/security/credentials/iam/iam_credentials.h +4 -0
  270. data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
  271. data/src/core/lib/security/credentials/jwt/json_token.h +2 -5
  272. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +12 -0
  273. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +8 -15
  274. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +2 -3
  275. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +55 -27
  276. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +9 -3
  277. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +13 -0
  278. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +2 -0
  279. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +23 -13
  280. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +38 -11
  281. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +21 -6
  282. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +7 -7
  283. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +3 -2
  284. data/src/core/lib/security/security_connector/local/local_security_connector.cc +1 -1
  285. data/src/core/lib/security/security_connector/security_connector.h +1 -1
  286. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +20 -25
  287. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +4 -6
  288. data/src/core/lib/security/security_connector/ssl_utils.cc +59 -12
  289. data/src/core/lib/security/security_connector/ssl_utils.h +12 -10
  290. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +77 -51
  291. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +27 -5
  292. data/src/core/lib/security/transport/client_auth_filter.cc +1 -2
  293. data/src/core/lib/slice/slice_intern.cc +2 -3
  294. data/src/core/lib/slice/slice_internal.h +14 -0
  295. data/src/core/lib/slice/slice_utils.h +9 -0
  296. data/src/core/lib/surface/byte_buffer_reader.cc +2 -47
  297. data/src/core/lib/surface/call.cc +2 -3
  298. data/src/core/lib/surface/call_log_batch.cc +50 -58
  299. data/src/core/lib/surface/channel.cc +53 -31
  300. data/src/core/lib/surface/channel.h +35 -4
  301. data/src/core/lib/surface/channel_ping.cc +2 -3
  302. data/src/core/lib/surface/completion_queue.cc +33 -33
  303. data/src/core/lib/surface/event_string.cc +18 -25
  304. data/src/core/lib/surface/event_string.h +3 -1
  305. data/src/core/lib/surface/init_secure.cc +1 -4
  306. data/src/core/lib/surface/server.cc +570 -369
  307. data/src/core/lib/surface/server.h +32 -0
  308. data/src/core/lib/surface/version.cc +2 -2
  309. data/src/core/lib/transport/byte_stream.h +7 -2
  310. data/src/core/lib/transport/connectivity_state.cc +7 -6
  311. data/src/core/lib/transport/connectivity_state.h +5 -3
  312. data/src/core/lib/transport/metadata.cc +3 -3
  313. data/src/core/lib/transport/metadata_batch.h +2 -3
  314. data/src/core/lib/transport/static_metadata.h +1 -1
  315. data/src/core/lib/transport/status_conversion.cc +6 -14
  316. data/src/core/lib/transport/transport.cc +2 -3
  317. data/src/core/lib/transport/transport.h +3 -2
  318. data/src/core/lib/transport/transport_op_string.cc +61 -102
  319. data/src/core/lib/uri/uri_parser.h +2 -3
  320. data/src/core/plugin_registry/grpc_plugin_registry.cc +20 -4
  321. data/src/core/tsi/alts/crypt/aes_gcm.cc +0 -2
  322. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +8 -1
  323. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +8 -4
  324. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +32 -2
  325. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +9 -1
  326. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +2 -3
  327. data/src/core/tsi/fake_transport_security.cc +10 -15
  328. data/src/core/tsi/ssl/session_cache/ssl_session.h +0 -2
  329. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +0 -2
  330. data/src/core/tsi/ssl_transport_security.cc +52 -39
  331. data/src/core/tsi/ssl_transport_security.h +8 -8
  332. data/src/core/tsi/ssl_types.h +0 -2
  333. data/src/core/tsi/transport_security.h +6 -9
  334. data/src/core/tsi/transport_security_grpc.h +2 -3
  335. data/src/core/tsi/transport_security_interface.h +3 -3
  336. data/src/ruby/ext/grpc/rb_call.c +9 -1
  337. data/src/ruby/lib/grpc/errors.rb +103 -42
  338. data/src/ruby/lib/grpc/generic/active_call.rb +2 -3
  339. data/src/ruby/lib/grpc/generic/interceptors.rb +4 -4
  340. data/src/ruby/lib/grpc/generic/rpc_server.rb +9 -10
  341. data/src/ruby/lib/grpc/generic/service.rb +5 -4
  342. data/src/ruby/lib/grpc/structs.rb +1 -1
  343. data/src/ruby/lib/grpc/version.rb +1 -1
  344. data/src/ruby/pb/generate_proto_ruby.sh +5 -3
  345. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +11 -0
  346. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +16 -0
  347. data/src/ruby/spec/debug_message_spec.rb +134 -0
  348. data/src/ruby/spec/generic/service_spec.rb +2 -0
  349. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto +5 -0
  350. data/src/ruby/spec/pb/codegen/package_option_spec.rb +2 -0
  351. data/src/ruby/spec/testdata/ca.pem +18 -13
  352. data/src/ruby/spec/testdata/client.key +26 -14
  353. data/src/ruby/spec/testdata/client.pem +18 -12
  354. data/src/ruby/spec/testdata/server1.key +26 -14
  355. data/src/ruby/spec/testdata/server1.pem +20 -14
  356. data/third_party/abseil-cpp/absl/time/civil_time.cc +175 -0
  357. data/third_party/abseil-cpp/absl/time/civil_time.h +538 -0
  358. data/third_party/abseil-cpp/absl/time/clock.cc +569 -0
  359. data/third_party/abseil-cpp/absl/time/clock.h +74 -0
  360. data/third_party/abseil-cpp/absl/time/duration.cc +922 -0
  361. data/third_party/abseil-cpp/absl/time/format.cc +153 -0
  362. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time.h +332 -0
  363. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +622 -0
  364. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +384 -0
  365. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/zone_info_source.h +102 -0
  366. data/third_party/abseil-cpp/absl/time/internal/cctz/src/civil_time_detail.cc +94 -0
  367. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +140 -0
  368. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.h +52 -0
  369. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +922 -0
  370. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.cc +45 -0
  371. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +76 -0
  372. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc +121 -0
  373. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h +93 -0
  374. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +958 -0
  375. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h +138 -0
  376. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +308 -0
  377. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.h +55 -0
  378. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +187 -0
  379. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.cc +159 -0
  380. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.h +132 -0
  381. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +122 -0
  382. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +115 -0
  383. data/third_party/abseil-cpp/absl/time/internal/get_current_time_chrono.inc +31 -0
  384. data/third_party/abseil-cpp/absl/time/internal/get_current_time_posix.inc +24 -0
  385. data/third_party/abseil-cpp/absl/time/time.cc +499 -0
  386. data/third_party/abseil-cpp/absl/time/time.h +1584 -0
  387. data/third_party/boringssl-with-bazel/err_data.c +329 -297
  388. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.c +1 -1
  389. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c +7 -5
  390. data/third_party/boringssl-with-bazel/src/crypto/cpu-intel.c +13 -4
  391. data/third_party/boringssl-with-bazel/src/crypto/crypto.c +11 -0
  392. data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/curve25519.c +18 -26
  393. data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/curve25519_tables.h +13 -21
  394. data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/internal.h +14 -22
  395. data/third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c +1 -1
  396. data/third_party/boringssl-with-bazel/src/crypto/dh/dh.c +15 -0
  397. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +10 -0
  398. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +425 -0
  399. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +78 -0
  400. data/third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.c +2 -2
  401. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +33 -32
  402. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes_nohw.c +1 -1
  403. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +2 -1
  404. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/exponentiation.c +3 -3
  405. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +14 -11
  406. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery.c +8 -8
  407. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/mul.c +30 -154
  408. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c +16 -0
  409. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +289 -117
  410. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +13 -27
  411. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_montgomery.c +96 -55
  412. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/felem.c +25 -7
  413. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +432 -160
  414. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/oct.c +63 -71
  415. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +5 -14
  416. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64-table.h +9481 -9485
  417. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64.c +80 -99
  418. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +736 -0
  419. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256_table.h +297 -0
  420. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/scalar.c +90 -11
  421. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.c +125 -148
  422. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +189 -3
  423. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.c +61 -18
  424. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdh/ecdh.c +2 -2
  425. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +20 -5
  426. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.c +137 -0
  427. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.h +49 -0
  428. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/getrandom_fillin.h +64 -0
  429. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +41 -5
  430. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +32 -17
  431. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +24 -114
  432. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/blinding.c +4 -0
  433. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +1 -0
  434. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +51 -38
  435. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +15 -1
  436. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +44 -35
  437. data/third_party/boringssl-with-bazel/src/crypto/mem.c +29 -12
  438. data/third_party/boringssl-with-bazel/src/crypto/obj/obj_dat.h +15 -1
  439. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c +6 -10
  440. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c +16 -0
  441. data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +4 -0
  442. data/third_party/boringssl-with-bazel/src/crypto/thread_win.c +4 -0
  443. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +278 -0
  444. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +1474 -0
  445. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +720 -0
  446. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +16 -0
  447. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +5 -0
  448. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +4 -3
  449. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +5 -1
  450. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +9 -4
  451. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +20 -0
  452. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +1 -0
  453. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +16 -0
  454. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +6 -0
  455. data/third_party/boringssl-with-bazel/src/include/openssl/err.h +2 -0
  456. data/third_party/boringssl-with-bazel/src/include/openssl/nid.h +5 -0
  457. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +3 -17
  458. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +31 -0
  459. data/third_party/boringssl-with-bazel/src/include/openssl/sha.h +26 -0
  460. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +172 -77
  461. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +1 -0
  462. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +291 -0
  463. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +5 -3
  464. data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +1 -0
  465. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +0 -4
  466. data/third_party/boringssl-with-bazel/src/ssl/d1_lib.cc +3 -3
  467. data/third_party/boringssl-with-bazel/src/ssl/dtls_method.cc +13 -4
  468. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +146 -57
  469. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +14 -3
  470. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +28 -20
  471. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +12 -4
  472. data/third_party/boringssl-with-bazel/src/ssl/internal.h +64 -47
  473. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +10 -10
  474. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +2 -2
  475. data/third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc +21 -21
  476. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +29 -0
  477. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +4 -0
  478. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +6 -1
  479. data/third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc +13 -2
  480. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +64 -5
  481. data/third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc +6 -0
  482. data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +6 -2
  483. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +47 -53
  484. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +1 -1
  485. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +98 -27
  486. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +23 -75
  487. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +50 -20
  488. data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +63 -25
  489. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_32.h +245 -175
  490. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64.h +135 -75
  491. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_32.h +1593 -1672
  492. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_64.h +512 -503
  493. metadata +111 -37
  494. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +0 -1754
  495. data/src/core/lib/gprpp/string_view.h +0 -60
  496. data/src/core/tsi/grpc_shadow_boringssl.h +0 -3311
  497. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256.c +0 -1063
@@ -26,6 +26,8 @@
26
26
  #include <string.h>
27
27
  #include <sys/types.h>
28
28
 
29
+ #include "absl/container/inlined_vector.h"
30
+
29
31
  #include <ares.h>
30
32
  #include <grpc/support/alloc.h>
31
33
  #include <grpc/support/log.h>
@@ -33,11 +35,11 @@
33
35
  #include <grpc/support/time.h>
34
36
 
35
37
  #include <address_sorting/address_sorting.h>
38
+ #include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h"
36
39
  #include "src/core/ext/filters/client_channel/parse_address.h"
37
40
  #include "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h"
38
41
  #include "src/core/lib/gpr/string.h"
39
42
  #include "src/core/lib/gprpp/host_port.h"
40
- #include "src/core/lib/iomgr/combiner.h"
41
43
  #include "src/core/lib/iomgr/error.h"
42
44
  #include "src/core/lib/iomgr/executor.h"
43
45
  #include "src/core/lib/iomgr/iomgr_internal.h"
@@ -60,6 +62,8 @@ struct grpc_ares_request {
60
62
  grpc_closure* on_done;
61
63
  /** the pointer to receive the resolved addresses */
62
64
  std::unique_ptr<grpc_core::ServerAddressList>* addresses_out;
65
+ /** the pointer to receive the resolved balancer addresses */
66
+ std::unique_ptr<grpc_core::ServerAddressList>* balancer_addresses_out;
63
67
  /** the pointer to receive the service config in JSON */
64
68
  char** service_config_json_out;
65
69
  /** the evernt driver used by this request */
@@ -71,6 +75,8 @@ struct grpc_ares_request {
71
75
  grpc_error* error;
72
76
  };
73
77
 
78
+ // TODO(apolcyn): make grpc_ares_hostbyname_request a sub-class
79
+ // of GrpcAresQuery.
74
80
  typedef struct grpc_ares_hostbyname_request {
75
81
  /** following members are set in create_hostbyname_request_locked
76
82
  */
@@ -82,27 +88,54 @@ typedef struct grpc_ares_hostbyname_request {
82
88
  uint16_t port;
83
89
  /** is it a grpclb address */
84
90
  bool is_balancer;
91
+ /** for logging and errors: the query type ("A" or "AAAA") */
92
+ const char* qtype;
85
93
  } grpc_ares_hostbyname_request;
86
94
 
87
- static void log_address_sorting_list(const ServerAddressList& addresses,
95
+ static void grpc_ares_request_ref_locked(grpc_ares_request* r);
96
+ static void grpc_ares_request_unref_locked(grpc_ares_request* r);
97
+
98
+ // TODO(apolcyn): as a part of C++-ification, find a way to
99
+ // organize per-query and per-resolution information in such a way
100
+ // that doesn't involve allocating a number of different data
101
+ // structures.
102
+ class GrpcAresQuery {
103
+ public:
104
+ explicit GrpcAresQuery(grpc_ares_request* r, const std::string& name)
105
+ : r_(r), name_(name) {
106
+ grpc_ares_request_ref_locked(r_);
107
+ }
108
+
109
+ ~GrpcAresQuery() { grpc_ares_request_unref_locked(r_); }
110
+
111
+ grpc_ares_request* parent_request() { return r_; }
112
+
113
+ const std::string& name() { return name_; }
114
+
115
+ private:
116
+ /* the top level request instance */
117
+ grpc_ares_request* r_;
118
+ /** for logging and errors */
119
+ const std::string name_;
120
+ };
121
+
122
+ static void log_address_sorting_list(const grpc_ares_request* r,
123
+ const ServerAddressList& addresses,
88
124
  const char* input_output_str) {
89
125
  for (size_t i = 0; i < addresses.size(); i++) {
90
- char* addr_str;
91
- if (grpc_sockaddr_to_string(&addr_str, &addresses[i].address(), true)) {
92
- gpr_log(GPR_INFO, "c-ares address sorting: %s[%" PRIuPTR "]=%s",
93
- input_output_str, i, addr_str);
94
- gpr_free(addr_str);
95
- } else {
96
- gpr_log(GPR_INFO,
97
- "c-ares address sorting: %s[%" PRIuPTR "]=<unprintable>",
98
- input_output_str, i);
99
- }
126
+ std::string addr_str =
127
+ grpc_sockaddr_to_string(&addresses[i].address(), true);
128
+ gpr_log(GPR_INFO,
129
+ "(c-ares resolver) request:%p c-ares address sorting: %s[%" PRIuPTR
130
+ "]=%s",
131
+ r, input_output_str, i, addr_str.c_str());
100
132
  }
101
133
  }
102
134
 
103
- void grpc_cares_wrapper_address_sorting_sort(ServerAddressList* addresses) {
135
+ void grpc_cares_wrapper_address_sorting_sort(const grpc_ares_request* r,
136
+ ServerAddressList* addresses) {
104
137
  if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_cares_address_sorting)) {
105
- log_address_sorting_list(*addresses, "input");
138
+ log_address_sorting_list(r, *addresses, "input");
106
139
  }
107
140
  address_sorting_sortable* sortables = (address_sorting_sortable*)gpr_zalloc(
108
141
  sizeof(address_sorting_sortable) * addresses->size());
@@ -121,7 +154,7 @@ void grpc_cares_wrapper_address_sorting_sort(ServerAddressList* addresses) {
121
154
  gpr_free(sortables);
122
155
  *addresses = std::move(sorted);
123
156
  if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_cares_address_sorting)) {
124
- log_address_sorting_list(*addresses, "output");
157
+ log_address_sorting_list(r, *addresses, "output");
125
158
  }
126
159
  }
127
160
 
@@ -142,28 +175,36 @@ void grpc_ares_complete_request_locked(grpc_ares_request* r) {
142
175
  r->ev_driver = nullptr;
143
176
  ServerAddressList* addresses = r->addresses_out->get();
144
177
  if (addresses != nullptr) {
145
- grpc_cares_wrapper_address_sorting_sort(addresses);
178
+ grpc_cares_wrapper_address_sorting_sort(r, addresses);
146
179
  GRPC_ERROR_UNREF(r->error);
147
180
  r->error = GRPC_ERROR_NONE;
148
181
  // TODO(apolcyn): allow c-ares to return a service config
149
182
  // with no addresses along side it
150
183
  }
184
+ if (r->balancer_addresses_out != nullptr) {
185
+ ServerAddressList* balancer_addresses = r->balancer_addresses_out->get();
186
+ if (balancer_addresses != nullptr) {
187
+ grpc_cares_wrapper_address_sorting_sort(r, balancer_addresses);
188
+ }
189
+ }
151
190
  grpc_core::ExecCtx::Run(DEBUG_LOCATION, r->on_done, r->error);
152
191
  }
153
192
 
193
+ /* Note that the returned object takes a reference to qtype, so
194
+ * qtype must outlive it. */
154
195
  static grpc_ares_hostbyname_request* create_hostbyname_request_locked(
155
- grpc_ares_request* parent_request, char* host, uint16_t port,
156
- bool is_balancer) {
196
+ grpc_ares_request* parent_request, const char* host, uint16_t port,
197
+ bool is_balancer, const char* qtype) {
157
198
  GRPC_CARES_TRACE_LOG(
158
199
  "request:%p create_hostbyname_request_locked host:%s port:%d "
159
- "is_balancer:%d",
160
- parent_request, host, port, is_balancer);
161
- grpc_ares_hostbyname_request* hr = static_cast<grpc_ares_hostbyname_request*>(
162
- gpr_zalloc(sizeof(grpc_ares_hostbyname_request)));
200
+ "is_balancer:%d qtype:%s",
201
+ parent_request, host, port, is_balancer, qtype);
202
+ grpc_ares_hostbyname_request* hr = new grpc_ares_hostbyname_request();
163
203
  hr->parent_request = parent_request;
164
204
  hr->host = gpr_strdup(host);
165
205
  hr->port = port;
166
206
  hr->is_balancer = is_balancer;
207
+ hr->qtype = qtype;
167
208
  grpc_ares_request_ref_locked(parent_request);
168
209
  return hr;
169
210
  }
@@ -172,7 +213,7 @@ static void destroy_hostbyname_request_locked(
172
213
  grpc_ares_hostbyname_request* hr) {
173
214
  grpc_ares_request_unref_locked(hr->parent_request);
174
215
  gpr_free(hr->host);
175
- gpr_free(hr);
216
+ delete hr;
176
217
  }
177
218
 
178
219
  static void on_hostbyname_done_locked(void* arg, int status, int /*timeouts*/,
@@ -182,19 +223,19 @@ static void on_hostbyname_done_locked(void* arg, int status, int /*timeouts*/,
182
223
  grpc_ares_request* r = hr->parent_request;
183
224
  if (status == ARES_SUCCESS) {
184
225
  GRPC_CARES_TRACE_LOG(
185
- "request:%p on_hostbyname_done_locked host=%s ARES_SUCCESS", r,
186
- hr->host);
187
- if (*r->addresses_out == nullptr) {
188
- *r->addresses_out = absl::make_unique<ServerAddressList>();
226
+ "request:%p on_hostbyname_done_locked qtype=%s host=%s ARES_SUCCESS", r,
227
+ hr->qtype, hr->host);
228
+ std::unique_ptr<ServerAddressList>* address_list_ptr =
229
+ hr->is_balancer ? r->balancer_addresses_out : r->addresses_out;
230
+ if (*address_list_ptr == nullptr) {
231
+ *address_list_ptr = absl::make_unique<ServerAddressList>();
189
232
  }
190
- ServerAddressList& addresses = **r->addresses_out;
233
+ ServerAddressList& addresses = **address_list_ptr;
191
234
  for (size_t i = 0; hostent->h_addr_list[i] != nullptr; ++i) {
192
- grpc_core::InlinedVector<grpc_arg, 2> args_to_add;
235
+ absl::InlinedVector<grpc_arg, 1> args_to_add;
193
236
  if (hr->is_balancer) {
194
- args_to_add.emplace_back(grpc_channel_arg_integer_create(
195
- const_cast<char*>(GRPC_ARG_ADDRESS_IS_BALANCER), 1));
196
- args_to_add.emplace_back(grpc_channel_arg_string_create(
197
- const_cast<char*>(GRPC_ARG_ADDRESS_BALANCER_NAME), hr->host));
237
+ args_to_add.emplace_back(
238
+ grpc_core::CreateGrpclbBalancerNameArg(hr->host));
198
239
  }
199
240
  grpc_channel_args* args = grpc_channel_args_copy_and_add(
200
241
  nullptr, args_to_add.data(), args_to_add.size());
@@ -237,10 +278,12 @@ static void on_hostbyname_done_locked(void* arg, int status, int /*timeouts*/,
237
278
  }
238
279
  } else {
239
280
  char* error_msg;
240
- gpr_asprintf(&error_msg, "C-ares status is not ARES_SUCCESS: %s",
241
- ares_strerror(status));
242
- GRPC_CARES_TRACE_LOG("request:%p on_hostbyname_done_locked host=%s %s", r,
243
- hr->host, error_msg);
281
+ gpr_asprintf(&error_msg,
282
+ "C-ares status is not ARES_SUCCESS "
283
+ "qtype=%s name=%s is_balancer=%d: %s",
284
+ hr->qtype, hr->host, hr->is_balancer, ares_strerror(status));
285
+ GRPC_CARES_TRACE_LOG("request:%p on_hostbyname_done_locked: %s", r,
286
+ error_msg);
244
287
  grpc_error* error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(error_msg);
245
288
  gpr_free(error_msg);
246
289
  r->error = grpc_error_add_child(error, r->error);
@@ -250,9 +293,12 @@ static void on_hostbyname_done_locked(void* arg, int status, int /*timeouts*/,
250
293
 
251
294
  static void on_srv_query_done_locked(void* arg, int status, int /*timeouts*/,
252
295
  unsigned char* abuf, int alen) {
253
- grpc_ares_request* r = static_cast<grpc_ares_request*>(arg);
296
+ GrpcAresQuery* q = static_cast<GrpcAresQuery*>(arg);
297
+ grpc_ares_request* r = q->parent_request();
254
298
  if (status == ARES_SUCCESS) {
255
- GRPC_CARES_TRACE_LOG("request:%p on_srv_query_done_locked ARES_SUCCESS", r);
299
+ GRPC_CARES_TRACE_LOG(
300
+ "request:%p on_srv_query_done_locked name=%s ARES_SUCCESS", r,
301
+ q->name().c_str());
256
302
  struct ares_srv_reply* reply;
257
303
  const int parse_status = ares_parse_srv_reply(abuf, alen, &reply);
258
304
  GRPC_CARES_TRACE_LOG("request:%p ares_parse_srv_reply: %d", r,
@@ -264,12 +310,13 @@ static void on_srv_query_done_locked(void* arg, int status, int /*timeouts*/,
264
310
  srv_it = srv_it->next) {
265
311
  if (grpc_ares_query_ipv6()) {
266
312
  grpc_ares_hostbyname_request* hr = create_hostbyname_request_locked(
267
- r, srv_it->host, htons(srv_it->port), true /* is_balancer */);
313
+ r, srv_it->host, htons(srv_it->port), true /* is_balancer */,
314
+ "AAAA");
268
315
  ares_gethostbyname(*channel, hr->host, AF_INET6,
269
316
  on_hostbyname_done_locked, hr);
270
317
  }
271
318
  grpc_ares_hostbyname_request* hr = create_hostbyname_request_locked(
272
- r, srv_it->host, htons(srv_it->port), true /* is_balancer */);
319
+ r, srv_it->host, htons(srv_it->port), true /* is_balancer */, "A");
273
320
  ares_gethostbyname(*channel, hr->host, AF_INET,
274
321
  on_hostbyname_done_locked, hr);
275
322
  grpc_ares_ev_driver_start_locked(r->ev_driver);
@@ -280,15 +327,17 @@ static void on_srv_query_done_locked(void* arg, int status, int /*timeouts*/,
280
327
  }
281
328
  } else {
282
329
  char* error_msg;
283
- gpr_asprintf(&error_msg, "C-ares status is not ARES_SUCCESS: %s",
284
- ares_strerror(status));
285
- GRPC_CARES_TRACE_LOG("request:%p on_srv_query_done_locked %s", r,
330
+ gpr_asprintf(&error_msg,
331
+ "C-ares status is not ARES_SUCCESS "
332
+ "qtype=SRV name=%s: %s",
333
+ q->name().c_str(), ares_strerror(status));
334
+ GRPC_CARES_TRACE_LOG("request:%p on_srv_query_done_locked: %s", r,
286
335
  error_msg);
287
336
  grpc_error* error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(error_msg);
288
337
  gpr_free(error_msg);
289
338
  r->error = grpc_error_add_child(error, r->error);
290
339
  }
291
- grpc_ares_request_unref_locked(r);
340
+ delete q;
292
341
  }
293
342
 
294
343
  static const char g_service_config_attribute_prefix[] = "grpc_config=";
@@ -296,13 +345,15 @@ static const char g_service_config_attribute_prefix[] = "grpc_config=";
296
345
  static void on_txt_done_locked(void* arg, int status, int /*timeouts*/,
297
346
  unsigned char* buf, int len) {
298
347
  char* error_msg;
299
- grpc_ares_request* r = static_cast<grpc_ares_request*>(arg);
348
+ GrpcAresQuery* q = static_cast<GrpcAresQuery*>(arg);
349
+ grpc_ares_request* r = q->parent_request();
300
350
  const size_t prefix_len = sizeof(g_service_config_attribute_prefix) - 1;
301
351
  struct ares_txt_ext* result = nullptr;
302
352
  struct ares_txt_ext* reply = nullptr;
303
353
  grpc_error* error = GRPC_ERROR_NONE;
304
354
  if (status != ARES_SUCCESS) goto fail;
305
- GRPC_CARES_TRACE_LOG("request:%p on_txt_done_locked ARES_SUCCESS", r);
355
+ GRPC_CARES_TRACE_LOG("request:%p on_txt_done_locked name=%s ARES_SUCCESS", r,
356
+ q->name().c_str());
306
357
  status = ares_parse_txt_reply_ext(buf, len, &reply);
307
358
  if (status != ARES_SUCCESS) goto fail;
308
359
  // Find service config in TXT record.
@@ -337,43 +388,47 @@ static void on_txt_done_locked(void* arg, int status, int /*timeouts*/,
337
388
  ares_free_data(reply);
338
389
  goto done;
339
390
  fail:
340
- gpr_asprintf(&error_msg, "C-ares TXT lookup status is not ARES_SUCCESS: %s",
341
- ares_strerror(status));
391
+ gpr_asprintf(&error_msg,
392
+ "C-ares status is not ARES_SUCCESS "
393
+ "qtype=TXT name=%s: %s",
394
+ q->name().c_str(), ares_strerror(status));
342
395
  error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(error_msg);
343
396
  GRPC_CARES_TRACE_LOG("request:%p on_txt_done_locked %s", r, error_msg);
344
397
  gpr_free(error_msg);
345
398
  r->error = grpc_error_add_child(error, r->error);
346
399
  done:
347
- grpc_ares_request_unref_locked(r);
400
+ delete q;
348
401
  }
349
402
 
350
403
  void grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked(
351
404
  grpc_ares_request* r, const char* dns_server, const char* name,
352
405
  const char* default_port, grpc_pollset_set* interested_parties,
353
- bool check_grpclb, int query_timeout_ms, grpc_core::Combiner* combiner) {
406
+ int query_timeout_ms,
407
+ std::shared_ptr<grpc_core::WorkSerializer> work_serializer) {
354
408
  grpc_error* error = GRPC_ERROR_NONE;
355
409
  grpc_ares_hostbyname_request* hr = nullptr;
356
410
  ares_channel* channel = nullptr;
357
411
  /* parse name, splitting it into host and port parts */
358
- grpc_core::UniquePtr<char> host;
359
- grpc_core::UniquePtr<char> port;
412
+ std::string host;
413
+ std::string port;
360
414
  grpc_core::SplitHostPort(name, &host, &port);
361
- if (host == nullptr) {
415
+ if (host.empty()) {
362
416
  error = grpc_error_set_str(
363
417
  GRPC_ERROR_CREATE_FROM_STATIC_STRING("unparseable host:port"),
364
418
  GRPC_ERROR_STR_TARGET_ADDRESS, grpc_slice_from_copied_string(name));
365
419
  goto error_cleanup;
366
- } else if (port == nullptr) {
420
+ } else if (port.empty()) {
367
421
  if (default_port == nullptr) {
368
422
  error = grpc_error_set_str(
369
423
  GRPC_ERROR_CREATE_FROM_STATIC_STRING("no port in name"),
370
424
  GRPC_ERROR_STR_TARGET_ADDRESS, grpc_slice_from_copied_string(name));
371
425
  goto error_cleanup;
372
426
  }
373
- port.reset(gpr_strdup(default_port));
427
+ port = default_port;
374
428
  }
375
429
  error = grpc_ares_ev_driver_create_locked(&r->ev_driver, interested_parties,
376
- query_timeout_ms, combiner, r);
430
+ query_timeout_ms,
431
+ std::move(work_serializer), r);
377
432
  if (error != GRPC_ERROR_NONE) goto error_cleanup;
378
433
  channel = grpc_ares_ev_driver_get_channel_locked(r->ev_driver);
379
434
  // If dns_server is specified, use it.
@@ -414,32 +469,32 @@ void grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked(
414
469
  }
415
470
  r->pending_queries = 1;
416
471
  if (grpc_ares_query_ipv6()) {
417
- hr = create_hostbyname_request_locked(r, host.get(),
418
- grpc_strhtons(port.get()),
419
- /*is_balancer=*/false);
472
+ hr = create_hostbyname_request_locked(r, host.c_str(),
473
+ grpc_strhtons(port.c_str()),
474
+ /*is_balancer=*/false, "AAAA");
420
475
  ares_gethostbyname(*channel, hr->host, AF_INET6, on_hostbyname_done_locked,
421
476
  hr);
422
477
  }
423
- hr =
424
- create_hostbyname_request_locked(r, host.get(), grpc_strhtons(port.get()),
425
- /*is_balancer=*/false);
478
+ hr = create_hostbyname_request_locked(r, host.c_str(),
479
+ grpc_strhtons(port.c_str()),
480
+ /*is_balancer=*/false, "A");
426
481
  ares_gethostbyname(*channel, hr->host, AF_INET, on_hostbyname_done_locked,
427
482
  hr);
428
- if (check_grpclb) {
483
+ if (r->balancer_addresses_out != nullptr) {
429
484
  /* Query the SRV record */
430
- grpc_ares_request_ref_locked(r);
431
485
  char* service_name;
432
- gpr_asprintf(&service_name, "_grpclb._tcp.%s", host.get());
486
+ gpr_asprintf(&service_name, "_grpclb._tcp.%s", host.c_str());
487
+ GrpcAresQuery* srv_query = new GrpcAresQuery(r, service_name);
433
488
  ares_query(*channel, service_name, ns_c_in, ns_t_srv,
434
- on_srv_query_done_locked, r);
489
+ on_srv_query_done_locked, srv_query);
435
490
  gpr_free(service_name);
436
491
  }
437
492
  if (r->service_config_json_out != nullptr) {
438
- grpc_ares_request_ref_locked(r);
439
493
  char* config_name;
440
- gpr_asprintf(&config_name, "_grpc_config.%s", host.get());
494
+ gpr_asprintf(&config_name, "_grpc_config.%s", host.c_str());
495
+ GrpcAresQuery* txt_query = new GrpcAresQuery(r, config_name);
441
496
  ares_search(*channel, config_name, ns_c_in, ns_t_txt, on_txt_done_locked,
442
- r);
497
+ txt_query);
443
498
  gpr_free(config_name);
444
499
  }
445
500
  grpc_ares_ev_driver_start_locked(r->ev_driver);
@@ -452,18 +507,16 @@ error_cleanup:
452
507
 
453
508
  static bool inner_resolve_as_ip_literal_locked(
454
509
  const char* name, const char* default_port,
455
- std::unique_ptr<grpc_core::ServerAddressList>* addrs,
456
- grpc_core::UniquePtr<char>* host, grpc_core::UniquePtr<char>* port,
457
- grpc_core::UniquePtr<char>* hostport) {
458
- grpc_core::SplitHostPort(name, host, port);
459
- if (*host == nullptr) {
510
+ std::unique_ptr<grpc_core::ServerAddressList>* addrs, std::string* host,
511
+ std::string* port, std::string* hostport) {
512
+ if (!grpc_core::SplitHostPort(name, host, port)) {
460
513
  gpr_log(GPR_ERROR,
461
514
  "Failed to parse %s to host:port while attempting to resolve as ip "
462
515
  "literal.",
463
516
  name);
464
517
  return false;
465
518
  }
466
- if (*port == nullptr) {
519
+ if (port->empty()) {
467
520
  if (default_port == nullptr) {
468
521
  gpr_log(GPR_ERROR,
469
522
  "No port or default port for %s while attempting to resolve as "
@@ -471,13 +524,13 @@ static bool inner_resolve_as_ip_literal_locked(
471
524
  name);
472
525
  return false;
473
526
  }
474
- port->reset(gpr_strdup(default_port));
527
+ *port = default_port;
475
528
  }
476
529
  grpc_resolved_address addr;
477
- GPR_ASSERT(grpc_core::JoinHostPort(hostport, host->get(), atoi(port->get())));
478
- if (grpc_parse_ipv4_hostport(hostport->get(), &addr,
530
+ *hostport = grpc_core::JoinHostPort(*host, atoi(port->c_str()));
531
+ if (grpc_parse_ipv4_hostport(hostport->c_str(), &addr,
479
532
  false /* log errors */) ||
480
- grpc_parse_ipv6_hostport(hostport->get(), &addr,
533
+ grpc_parse_ipv6_hostport(hostport->c_str(), &addr,
481
534
  false /* log errors */)) {
482
535
  GPR_ASSERT(*addrs == nullptr);
483
536
  *addrs = absl::make_unique<ServerAddressList>();
@@ -490,22 +543,21 @@ static bool inner_resolve_as_ip_literal_locked(
490
543
  static bool resolve_as_ip_literal_locked(
491
544
  const char* name, const char* default_port,
492
545
  std::unique_ptr<grpc_core::ServerAddressList>* addrs) {
493
- grpc_core::UniquePtr<char> host;
494
- grpc_core::UniquePtr<char> port;
495
- grpc_core::UniquePtr<char> hostport;
546
+ std::string host;
547
+ std::string port;
548
+ std::string hostport;
496
549
  bool out = inner_resolve_as_ip_literal_locked(name, default_port, addrs,
497
550
  &host, &port, &hostport);
498
551
  return out;
499
552
  }
500
553
 
501
- static bool target_matches_localhost_inner(const char* name,
502
- grpc_core::UniquePtr<char>* host,
503
- grpc_core::UniquePtr<char>* port) {
554
+ static bool target_matches_localhost_inner(const char* name, std::string* host,
555
+ std::string* port) {
504
556
  if (!grpc_core::SplitHostPort(name, host, port)) {
505
557
  gpr_log(GPR_ERROR, "Unable to split host and port for name: %s", name);
506
558
  return false;
507
559
  }
508
- if (gpr_stricmp(host->get(), "localhost") == 0) {
560
+ if (gpr_stricmp(host->c_str(), "localhost") == 0) {
509
561
  return true;
510
562
  } else {
511
563
  return false;
@@ -513,25 +565,25 @@ static bool target_matches_localhost_inner(const char* name,
513
565
  }
514
566
 
515
567
  static bool target_matches_localhost(const char* name) {
516
- grpc_core::UniquePtr<char> host;
517
- grpc_core::UniquePtr<char> port;
568
+ std::string host;
569
+ std::string port;
518
570
  return target_matches_localhost_inner(name, &host, &port);
519
571
  }
520
572
 
521
573
  #ifdef GRPC_ARES_RESOLVE_LOCALHOST_MANUALLY
522
574
  static bool inner_maybe_resolve_localhost_manually_locked(
523
- const char* name, const char* default_port,
524
- std::unique_ptr<grpc_core::ServerAddressList>* addrs,
525
- grpc_core::UniquePtr<char>* host, grpc_core::UniquePtr<char>* port) {
575
+ const grpc_ares_request* r, const char* name, const char* default_port,
576
+ std::unique_ptr<grpc_core::ServerAddressList>* addrs, std::string* host,
577
+ std::string* port) {
526
578
  grpc_core::SplitHostPort(name, host, port);
527
- if (*host == nullptr) {
579
+ if (host->empty()) {
528
580
  gpr_log(GPR_ERROR,
529
581
  "Failed to parse %s into host:port during manual localhost "
530
582
  "resolution check.",
531
583
  name);
532
584
  return false;
533
585
  }
534
- if (*port == nullptr) {
586
+ if (port->empty()) {
535
587
  if (default_port == nullptr) {
536
588
  gpr_log(GPR_ERROR,
537
589
  "No port or default port for %s during manual localhost "
@@ -539,12 +591,12 @@ static bool inner_maybe_resolve_localhost_manually_locked(
539
591
  name);
540
592
  return false;
541
593
  }
542
- port->reset(gpr_strdup(default_port));
594
+ *port = default_port;
543
595
  }
544
- if (gpr_stricmp(host->get(), "localhost") == 0) {
596
+ if (gpr_stricmp(host->c_str(), "localhost") == 0) {
545
597
  GPR_ASSERT(*addrs == nullptr);
546
598
  *addrs = absl::make_unique<grpc_core::ServerAddressList>();
547
- uint16_t numeric_port = grpc_strhtons(port->get());
599
+ uint16_t numeric_port = grpc_strhtons(port->c_str());
548
600
  // Append the ipv6 loopback address.
549
601
  struct sockaddr_in6 ipv6_loopback_addr;
550
602
  memset(&ipv6_loopback_addr, 0, sizeof(ipv6_loopback_addr));
@@ -563,23 +615,24 @@ static bool inner_maybe_resolve_localhost_manually_locked(
563
615
  (*addrs)->emplace_back(&ipv4_loopback_addr, sizeof(ipv4_loopback_addr),
564
616
  nullptr /* args */);
565
617
  // Let the address sorter figure out which one should be tried first.
566
- grpc_cares_wrapper_address_sorting_sort(addrs->get());
618
+ grpc_cares_wrapper_address_sorting_sort(r, addrs->get());
567
619
  return true;
568
620
  }
569
621
  return false;
570
622
  }
571
623
 
572
624
  static bool grpc_ares_maybe_resolve_localhost_manually_locked(
573
- const char* name, const char* default_port,
625
+ const grpc_ares_request* r, const char* name, const char* default_port,
574
626
  std::unique_ptr<grpc_core::ServerAddressList>* addrs) {
575
- grpc_core::UniquePtr<char> host;
576
- grpc_core::UniquePtr<char> port;
577
- return inner_maybe_resolve_localhost_manually_locked(name, default_port,
627
+ std::string host;
628
+ std::string port;
629
+ return inner_maybe_resolve_localhost_manually_locked(r, name, default_port,
578
630
  addrs, &host, &port);
579
631
  }
580
632
  #else /* GRPC_ARES_RESOLVE_LOCALHOST_MANUALLY */
581
633
  static bool grpc_ares_maybe_resolve_localhost_manually_locked(
582
- const char* /*name*/, const char* /*default_port*/,
634
+ const grpc_ares_request* r, const char* /*name*/,
635
+ const char* /*default_port*/,
583
636
  std::unique_ptr<grpc_core::ServerAddressList>* /*addrs*/) {
584
637
  return false;
585
638
  }
@@ -588,14 +641,16 @@ static bool grpc_ares_maybe_resolve_localhost_manually_locked(
588
641
  static grpc_ares_request* grpc_dns_lookup_ares_locked_impl(
589
642
  const char* dns_server, const char* name, const char* default_port,
590
643
  grpc_pollset_set* interested_parties, grpc_closure* on_done,
591
- std::unique_ptr<grpc_core::ServerAddressList>* addrs, bool check_grpclb,
644
+ std::unique_ptr<grpc_core::ServerAddressList>* addrs,
645
+ std::unique_ptr<grpc_core::ServerAddressList>* balancer_addrs,
592
646
  char** service_config_json, int query_timeout_ms,
593
- grpc_core::Combiner* combiner) {
647
+ std::shared_ptr<grpc_core::WorkSerializer> work_serializer) {
594
648
  grpc_ares_request* r =
595
649
  static_cast<grpc_ares_request*>(gpr_zalloc(sizeof(grpc_ares_request)));
596
650
  r->ev_driver = nullptr;
597
651
  r->on_done = on_done;
598
652
  r->addresses_out = addrs;
653
+ r->balancer_addresses_out = balancer_addrs;
599
654
  r->service_config_json_out = service_config_json;
600
655
  r->error = GRPC_ERROR_NONE;
601
656
  r->pending_queries = 0;
@@ -609,7 +664,7 @@ static grpc_ares_request* grpc_dns_lookup_ares_locked_impl(
609
664
  return r;
610
665
  }
611
666
  // Early out if the target is localhost and we're on Windows.
612
- if (grpc_ares_maybe_resolve_localhost_manually_locked(name, default_port,
667
+ if (grpc_ares_maybe_resolve_localhost_manually_locked(r, name, default_port,
613
668
  addrs)) {
614
669
  grpc_ares_complete_request_locked(r);
615
670
  return r;
@@ -618,22 +673,24 @@ static grpc_ares_request* grpc_dns_lookup_ares_locked_impl(
618
673
  // as to cut down on lookups over the network, especially in tests:
619
674
  // https://github.com/grpc/proposal/pull/79
620
675
  if (target_matches_localhost(name)) {
621
- check_grpclb = false;
676
+ r->balancer_addresses_out = nullptr;
622
677
  r->service_config_json_out = nullptr;
623
678
  }
624
679
  // Look up name using c-ares lib.
625
680
  grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked(
626
- r, dns_server, name, default_port, interested_parties, check_grpclb,
627
- query_timeout_ms, combiner);
681
+ r, dns_server, name, default_port, interested_parties, query_timeout_ms,
682
+ std::move(work_serializer));
628
683
  return r;
629
684
  }
630
685
 
631
686
  grpc_ares_request* (*grpc_dns_lookup_ares_locked)(
632
687
  const char* dns_server, const char* name, const char* default_port,
633
688
  grpc_pollset_set* interested_parties, grpc_closure* on_done,
634
- std::unique_ptr<grpc_core::ServerAddressList>* addrs, bool check_grpclb,
689
+ std::unique_ptr<grpc_core::ServerAddressList>* addrs,
690
+ std::unique_ptr<grpc_core::ServerAddressList>* balancer_addrs,
635
691
  char** service_config_json, int query_timeout_ms,
636
- grpc_core::Combiner* combiner) = grpc_dns_lookup_ares_locked_impl;
692
+ std::shared_ptr<grpc_core::WorkSerializer> work_serializer) =
693
+ grpc_dns_lookup_ares_locked_impl;
637
694
 
638
695
  static void grpc_cancel_ares_request_locked_impl(grpc_ares_request* r) {
639
696
  GPR_ASSERT(r != nullptr);
@@ -673,8 +730,8 @@ void grpc_ares_cleanup(void) {}
673
730
  */
674
731
 
675
732
  typedef struct grpc_resolve_address_ares_request {
676
- /* combiner that queries and related callbacks run under */
677
- grpc_core::Combiner* combiner;
733
+ /* work_serializer that queries and related callbacks run under */
734
+ std::shared_ptr<grpc_core::WorkSerializer> work_serializer;
678
735
  /** the pointer to receive the resolved addresses */
679
736
  grpc_resolved_addresses** addrs_out;
680
737
  /** currently resolving addresses */
@@ -694,9 +751,8 @@ typedef struct grpc_resolve_address_ares_request {
694
751
  grpc_ares_request* ares_request = nullptr;
695
752
  } grpc_resolve_address_ares_request;
696
753
 
697
- static void on_dns_lookup_done_locked(void* arg, grpc_error* error) {
698
- grpc_resolve_address_ares_request* r =
699
- static_cast<grpc_resolve_address_ares_request*>(arg);
754
+ static void on_dns_lookup_done_locked(grpc_resolve_address_ares_request* r,
755
+ grpc_error* error) {
700
756
  gpr_free(r->ares_request);
701
757
  grpc_resolved_addresses** resolved_addresses = r->addrs_out;
702
758
  if (r->addresses == nullptr || r->addresses->empty()) {
@@ -709,36 +765,32 @@ static void on_dns_lookup_done_locked(void* arg, grpc_error* error) {
709
765
  static_cast<grpc_resolved_address*>(gpr_zalloc(
710
766
  sizeof(grpc_resolved_address) * (*resolved_addresses)->naddrs));
711
767
  for (size_t i = 0; i < (*resolved_addresses)->naddrs; ++i) {
712
- GPR_ASSERT(!(*r->addresses)[i].IsBalancer());
713
768
  memcpy(&(*resolved_addresses)->addrs[i], &(*r->addresses)[i].address(),
714
769
  sizeof(grpc_resolved_address));
715
770
  }
716
771
  }
717
- grpc_core::ExecCtx::Run(DEBUG_LOCATION, r->on_resolve_address_done,
718
- GRPC_ERROR_REF(error));
719
- GRPC_COMBINER_UNREF(r->combiner, "on_dns_lookup_done_cb");
772
+ grpc_core::ExecCtx::Run(DEBUG_LOCATION, r->on_resolve_address_done, error);
720
773
  delete r;
721
774
  }
722
775
 
723
776
  static void on_dns_lookup_done(void* arg, grpc_error* error) {
724
777
  grpc_resolve_address_ares_request* r =
725
778
  static_cast<grpc_resolve_address_ares_request*>(arg);
726
- r->combiner->Run(GRPC_CLOSURE_INIT(&r->on_dns_lookup_done_locked,
727
- on_dns_lookup_done_locked, r, nullptr),
728
- GRPC_ERROR_REF(error));
779
+ GRPC_ERROR_REF(error); // ref owned by lambda
780
+ r->work_serializer->Run([r, error]() { on_dns_lookup_done_locked(r, error); },
781
+ DEBUG_LOCATION);
729
782
  }
730
783
 
731
- static void grpc_resolve_address_invoke_dns_lookup_ares_locked(
732
- void* arg, grpc_error* /*unused_error*/) {
784
+ static void grpc_resolve_address_invoke_dns_lookup_ares_locked(void* arg) {
733
785
  grpc_resolve_address_ares_request* r =
734
786
  static_cast<grpc_resolve_address_ares_request*>(arg);
735
787
  GRPC_CLOSURE_INIT(&r->on_dns_lookup_done_locked, on_dns_lookup_done, r,
736
788
  grpc_schedule_on_exec_ctx);
737
789
  r->ares_request = grpc_dns_lookup_ares_locked(
738
790
  nullptr /* dns_server */, r->name, r->default_port, r->interested_parties,
739
- &r->on_dns_lookup_done_locked, &r->addresses, false /* check_grpclb */,
740
- nullptr /* service_config_json */, GRPC_DNS_ARES_DEFAULT_QUERY_TIMEOUT_MS,
741
- r->combiner);
791
+ &r->on_dns_lookup_done_locked, &r->addresses,
792
+ nullptr /* balancer_addresses */, nullptr /* service_config_json */,
793
+ GRPC_DNS_ARES_DEFAULT_QUERY_TIMEOUT_MS, r->work_serializer);
742
794
  }
743
795
 
744
796
  static void grpc_resolve_address_ares_impl(const char* name,
@@ -748,16 +800,15 @@ static void grpc_resolve_address_ares_impl(const char* name,
748
800
  grpc_resolved_addresses** addrs) {
749
801
  grpc_resolve_address_ares_request* r =
750
802
  new grpc_resolve_address_ares_request();
751
- r->combiner = grpc_combiner_create();
803
+ r->work_serializer = std::make_shared<grpc_core::WorkSerializer>();
752
804
  r->addrs_out = addrs;
753
805
  r->on_resolve_address_done = on_done;
754
806
  r->name = name;
755
807
  r->default_port = default_port;
756
808
  r->interested_parties = interested_parties;
757
- r->combiner->Run(
758
- GRPC_CLOSURE_CREATE(grpc_resolve_address_invoke_dns_lookup_ares_locked, r,
759
- nullptr),
760
- GRPC_ERROR_NONE);
809
+ r->work_serializer->Run(
810
+ [r]() { grpc_resolve_address_invoke_dns_lookup_ares_locked(r); },
811
+ DEBUG_LOCATION);
761
812
  }
762
813
 
763
814
  void (*grpc_resolve_address_ares)(