grpc 1.60.2 → 1.61.0.pre2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +208 -165
  3. data/include/grpc/event_engine/event_engine.h +59 -12
  4. data/include/grpc/event_engine/internal/memory_allocator_impl.h +6 -0
  5. data/include/grpc/event_engine/internal/slice_cast.h +12 -0
  6. data/include/grpc/event_engine/memory_allocator.h +3 -1
  7. data/include/grpc/event_engine/slice.h +5 -0
  8. data/include/grpc/grpc_security.h +22 -1
  9. data/include/grpc/impl/call.h +29 -0
  10. data/include/grpc/impl/channel_arg_names.h +12 -1
  11. data/include/grpc/impl/slice_type.h +1 -1
  12. data/include/grpc/module.modulemap +1 -0
  13. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +54 -7
  14. data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +20 -6
  15. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +10 -13
  16. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +18 -10
  17. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +326 -0
  18. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h +143 -0
  19. data/src/core/ext/filters/client_channel/backend_metric.cc +2 -2
  20. data/src/core/ext/filters/client_channel/client_channel.cc +32 -6
  21. data/src/core/ext/filters/client_channel/client_channel_internal.h +2 -0
  22. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +1 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +54 -21
  24. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +3 -2
  25. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +2 -1
  26. data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.cc +12 -15
  27. data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.h +8 -5
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +139 -92
  29. data/src/core/ext/filters/client_channel/lb_policy/health_check_client.cc +9 -4
  30. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +9 -4
  31. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +10 -11
  32. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +94 -93
  33. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +5 -3
  34. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +12 -15
  35. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +38 -16
  36. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +25 -28
  37. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +10 -10
  38. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +37 -35
  39. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +11 -9
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +504 -461
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +232 -122
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -6
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +642 -251
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.h +2 -6
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +7 -8
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +2 -1
  47. data/src/core/ext/filters/client_channel/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +3 -1
  48. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +2 -2
  49. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +2 -2
  50. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +6 -8
  51. data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.cc +1031 -0
  52. data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.h +277 -0
  53. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +128 -270
  54. data/src/core/ext/filters/client_channel/resolver/xds/{xds_resolver.h → xds_resolver_attributes.h} +5 -4
  55. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.cc +25 -0
  56. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.h +30 -0
  57. data/src/core/ext/filters/client_channel/retry_filter.cc +1 -0
  58. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +35 -17
  59. data/src/core/ext/filters/deadline/deadline_filter.cc +12 -0
  60. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +17 -13
  61. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +13 -4
  62. data/src/core/ext/filters/http/client/http_client_filter.cc +23 -32
  63. data/src/core/ext/filters/http/client/http_client_filter.h +10 -5
  64. data/src/core/ext/filters/http/client_authority_filter.cc +14 -14
  65. data/src/core/ext/filters/http/client_authority_filter.h +12 -4
  66. data/src/core/ext/filters/http/http_filters_plugin.cc +42 -20
  67. data/src/core/ext/filters/http/message_compress/compression_filter.cc +55 -80
  68. data/src/core/ext/filters/http/message_compress/compression_filter.h +54 -12
  69. data/src/core/ext/filters/http/message_compress/legacy_compression_filter.cc +325 -0
  70. data/src/core/ext/filters/http/message_compress/legacy_compression_filter.h +139 -0
  71. data/src/core/ext/filters/http/server/http_server_filter.cc +41 -41
  72. data/src/core/ext/filters/http/server/http_server_filter.h +11 -4
  73. data/src/core/ext/filters/message_size/message_size_filter.cc +56 -76
  74. data/src/core/ext/filters/message_size/message_size_filter.h +35 -23
  75. data/src/core/ext/filters/rbac/rbac_filter.cc +15 -11
  76. data/src/core/ext/filters/rbac/rbac_filter.h +11 -4
  77. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +25 -13
  78. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +47 -50
  79. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +21 -4
  80. data/src/core/ext/transport/chttp2/alpn/alpn.cc +1 -1
  81. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -2
  82. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +11 -2
  83. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +68 -145
  84. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -3
  85. data/src/core/ext/transport/chttp2/transport/flow_control.cc +21 -82
  86. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -8
  87. data/src/core/ext/transport/chttp2/transport/frame.cc +506 -0
  88. data/src/core/ext/transport/chttp2/transport/frame.h +214 -0
  89. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +1 -1
  90. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +33 -79
  91. data/src/core/ext/transport/chttp2/transport/frame_settings.h +4 -7
  92. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +27 -36
  93. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +0 -2
  94. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +122 -32
  95. data/src/core/ext/transport/chttp2/transport/http2_settings.h +142 -37
  96. data/src/core/ext/transport/chttp2/transport/internal.h +1 -22
  97. data/src/core/ext/transport/chttp2/transport/parsing.cc +23 -37
  98. data/src/core/ext/transport/chttp2/transport/writing.cc +26 -58
  99. data/src/core/ext/transport/inproc/inproc_transport.cc +172 -13
  100. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb.h +712 -0
  101. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.c +151 -0
  102. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.h +33 -0
  103. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.c +133 -0
  104. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.h +50 -0
  105. data/src/core/ext/xds/certificate_provider_store.cc +2 -1
  106. data/src/core/ext/xds/certificate_provider_store.h +0 -5
  107. data/src/core/ext/xds/xds_api.cc +31 -18
  108. data/src/core/ext/xds/xds_api.h +2 -2
  109. data/src/core/ext/xds/xds_bootstrap.h +3 -0
  110. data/src/core/ext/xds/xds_certificate_provider.cc +88 -287
  111. data/src/core/ext/xds/xds_certificate_provider.h +44 -111
  112. data/src/core/ext/xds/xds_client.cc +420 -414
  113. data/src/core/ext/xds/xds_client.h +31 -22
  114. data/src/core/ext/xds/xds_client_grpc.cc +3 -1
  115. data/src/core/ext/xds/xds_cluster.cc +104 -11
  116. data/src/core/ext/xds/xds_cluster.h +9 -1
  117. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +9 -5
  118. data/src/core/ext/xds/xds_common_types.cc +14 -10
  119. data/src/core/ext/xds/xds_endpoint.cc +9 -4
  120. data/src/core/ext/xds/xds_endpoint.h +5 -1
  121. data/src/core/ext/xds/xds_health_status.cc +12 -2
  122. data/src/core/ext/xds/xds_health_status.h +4 -2
  123. data/src/core/ext/xds/xds_http_rbac_filter.cc +5 -3
  124. data/src/core/ext/xds/xds_listener.cc +14 -8
  125. data/src/core/ext/xds/xds_resource_type_impl.h +6 -4
  126. data/src/core/ext/xds/xds_route_config.cc +34 -22
  127. data/src/core/ext/xds/xds_route_config.h +1 -0
  128. data/src/core/ext/xds/xds_server_config_fetcher.cc +61 -57
  129. data/src/core/ext/xds/xds_transport.h +3 -0
  130. data/src/core/ext/xds/xds_transport_grpc.cc +47 -50
  131. data/src/core/ext/xds/xds_transport_grpc.h +4 -0
  132. data/src/core/lib/channel/call_tracer.cc +12 -0
  133. data/src/core/lib/channel/call_tracer.h +17 -3
  134. data/src/core/lib/channel/channel_args.cc +24 -14
  135. data/src/core/lib/channel/channel_args.h +74 -13
  136. data/src/core/lib/channel/channel_stack.cc +27 -0
  137. data/src/core/lib/channel/channel_stack.h +10 -10
  138. data/src/core/lib/channel/connected_channel.cc +64 -18
  139. data/src/core/lib/channel/promise_based_filter.h +1041 -1
  140. data/src/core/lib/channel/server_call_tracer_filter.cc +43 -35
  141. data/src/core/lib/compression/compression_internal.cc +0 -3
  142. data/src/core/lib/event_engine/ares_resolver.cc +35 -14
  143. data/src/core/lib/event_engine/ares_resolver.h +9 -10
  144. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +8 -1
  145. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +132 -0
  146. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h +61 -0
  147. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +52 -36
  148. data/src/core/lib/event_engine/posix_engine/posix_engine.h +4 -9
  149. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +11 -3
  150. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +9 -2
  151. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +7 -0
  152. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +17 -27
  153. data/src/core/lib/event_engine/posix_engine/timer_manager.h +0 -3
  154. data/src/core/lib/event_engine/ref_counted_dns_resolver_interface.h +55 -0
  155. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.cc +114 -0
  156. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.h +51 -0
  157. data/src/core/lib/event_engine/windows/windows_engine.cc +7 -7
  158. data/src/core/lib/experiments/config.cc +13 -0
  159. data/src/core/lib/experiments/config.h +3 -0
  160. data/src/core/lib/experiments/experiments.cc +245 -366
  161. data/src/core/lib/experiments/experiments.h +50 -156
  162. data/src/core/lib/gprpp/debug_location.h +13 -0
  163. data/src/core/lib/gprpp/dual_ref_counted.h +36 -7
  164. data/src/core/lib/gprpp/orphanable.h +27 -0
  165. data/src/core/lib/gprpp/ref_counted.h +63 -22
  166. data/src/core/lib/gprpp/ref_counted_ptr.h +70 -27
  167. data/src/core/lib/gprpp/ref_counted_string.h +13 -0
  168. data/src/core/lib/gprpp/status_helper.cc +1 -2
  169. data/src/core/lib/iomgr/combiner.cc +15 -51
  170. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +31 -0
  171. data/src/core/lib/iomgr/event_engine_shims/endpoint.h +16 -0
  172. data/src/core/lib/iomgr/tcp_client_posix.cc +4 -3
  173. data/src/core/lib/load_balancing/lb_policy.h +1 -1
  174. data/src/core/lib/promise/activity.cc +17 -2
  175. data/src/core/lib/promise/activity.h +5 -4
  176. data/src/core/lib/promise/all_ok.h +80 -0
  177. data/src/core/lib/promise/detail/join_state.h +2077 -0
  178. data/src/core/lib/promise/detail/promise_factory.h +1 -0
  179. data/src/core/lib/promise/detail/promise_like.h +8 -1
  180. data/src/core/lib/promise/detail/seq_state.h +3458 -150
  181. data/src/core/lib/promise/detail/status.h +42 -5
  182. data/src/core/lib/promise/for_each.h +13 -1
  183. data/src/core/lib/promise/if.h +4 -0
  184. data/src/core/lib/promise/latch.h +6 -3
  185. data/src/core/lib/promise/party.cc +33 -31
  186. data/src/core/lib/promise/party.h +142 -6
  187. data/src/core/lib/promise/poll.h +39 -13
  188. data/src/core/lib/promise/promise.h +4 -0
  189. data/src/core/lib/promise/seq.h +107 -7
  190. data/src/core/lib/promise/status_flag.h +196 -0
  191. data/src/core/lib/promise/try_join.h +132 -0
  192. data/src/core/lib/promise/try_seq.h +132 -10
  193. data/src/core/lib/resolver/endpoint_addresses.cc +0 -1
  194. data/src/core/lib/resolver/endpoint_addresses.h +48 -0
  195. data/src/core/lib/resource_quota/arena.h +2 -2
  196. data/src/core/lib/resource_quota/memory_quota.cc +57 -8
  197. data/src/core/lib/resource_quota/memory_quota.h +6 -0
  198. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +14 -11
  199. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +14 -5
  200. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +4 -0
  201. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +4 -0
  202. data/src/core/lib/security/credentials/external/external_account_credentials.cc +28 -20
  203. data/src/core/lib/security/credentials/external/external_account_credentials.h +4 -0
  204. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +4 -0
  205. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -0
  206. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +4 -0
  207. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +4 -0
  208. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -1
  209. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +0 -3
  210. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +12 -0
  211. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.cc +22 -5
  212. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.h +1 -5
  213. data/src/core/lib/security/credentials/tls/tls_credentials.cc +16 -0
  214. data/src/core/lib/security/credentials/xds/xds_credentials.cc +21 -28
  215. data/src/core/lib/security/credentials/xds/xds_credentials.h +2 -4
  216. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +4 -3
  217. data/src/core/lib/security/transport/auth_filters.h +71 -4
  218. data/src/core/lib/security/transport/client_auth_filter.cc +2 -4
  219. data/src/core/lib/security/transport/legacy_server_auth_filter.cc +244 -0
  220. data/src/core/lib/security/transport/server_auth_filter.cc +70 -90
  221. data/src/core/lib/slice/slice_buffer.h +3 -0
  222. data/src/core/lib/surface/builtins.cc +1 -1
  223. data/src/core/lib/surface/call.cc +683 -196
  224. data/src/core/lib/surface/call.h +26 -13
  225. data/src/core/lib/surface/call_trace.cc +42 -1
  226. data/src/core/lib/surface/channel.cc +0 -1
  227. data/src/core/lib/surface/channel.h +0 -6
  228. data/src/core/lib/surface/channel_init.h +26 -0
  229. data/src/core/lib/surface/init.cc +14 -8
  230. data/src/core/lib/surface/server.cc +256 -237
  231. data/src/core/lib/surface/server.h +26 -54
  232. data/src/core/lib/surface/version.cc +2 -2
  233. data/src/core/lib/surface/wait_for_cq_end_op.h +94 -0
  234. data/src/core/lib/transport/call_final_info.cc +38 -0
  235. data/src/core/lib/transport/call_final_info.h +54 -0
  236. data/src/core/lib/transport/connectivity_state.cc +3 -2
  237. data/src/core/lib/transport/connectivity_state.h +4 -0
  238. data/src/core/lib/transport/metadata_batch.h +4 -4
  239. data/src/core/lib/transport/transport.cc +70 -19
  240. data/src/core/lib/transport/transport.h +395 -25
  241. data/src/core/plugin_registry/grpc_plugin_registry.cc +3 -0
  242. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +0 -3
  243. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  244. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
  245. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -1
  246. data/src/core/tsi/ssl_transport_security.cc +65 -43
  247. data/src/ruby/ext/grpc/rb_channel_args.c +3 -1
  248. data/src/ruby/ext/grpc/rb_grpc.c +0 -1
  249. data/src/ruby/ext/grpc/rb_grpc.h +0 -2
  250. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  251. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  252. data/src/ruby/lib/grpc/version.rb +1 -1
  253. data/third_party/upb/upb/reflection/def_pool.h +2 -2
  254. data/third_party/zlib/adler32.c +5 -27
  255. data/third_party/zlib/compress.c +5 -16
  256. data/third_party/zlib/crc32.c +86 -162
  257. data/third_party/zlib/deflate.c +233 -336
  258. data/third_party/zlib/deflate.h +8 -8
  259. data/third_party/zlib/gzguts.h +11 -12
  260. data/third_party/zlib/infback.c +7 -23
  261. data/third_party/zlib/inffast.c +1 -4
  262. data/third_party/zlib/inffast.h +1 -1
  263. data/third_party/zlib/inflate.c +30 -99
  264. data/third_party/zlib/inftrees.c +6 -11
  265. data/third_party/zlib/inftrees.h +3 -3
  266. data/third_party/zlib/trees.c +224 -302
  267. data/third_party/zlib/uncompr.c +4 -12
  268. data/third_party/zlib/zconf.h +6 -2
  269. data/third_party/zlib/zlib.h +191 -188
  270. data/third_party/zlib/zutil.c +16 -44
  271. data/third_party/zlib/zutil.h +10 -10
  272. metadata +35 -13
  273. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +0 -1173
  274. data/src/core/lib/event_engine/memory_allocator.cc +0 -74
  275. data/src/core/lib/transport/pid_controller.cc +0 -51
  276. data/src/core/lib/transport/pid_controller.h +0 -116
  277. data/third_party/upb/upb/collections/array.h +0 -17
  278. data/third_party/upb/upb/collections/map.h +0 -17
  279. data/third_party/upb/upb/upb.hpp +0 -18
@@ -42,19 +42,55 @@ namespace grpc_core {
42
42
 
43
43
  namespace {
44
44
 
45
- // TODO(yashykt): This filter is not really needed. We should be able to move
46
- // this to the connected filter.
47
- class ServerCallTracerFilter : public ChannelFilter {
45
+ class ServerCallTracerFilter
46
+ : public ImplementChannelFilter<ServerCallTracerFilter> {
48
47
  public:
49
48
  static const grpc_channel_filter kFilter;
50
49
 
51
50
  static absl::StatusOr<ServerCallTracerFilter> Create(
52
51
  const ChannelArgs& /*args*/, ChannelFilter::Args /*filter_args*/);
53
52
 
54
- ArenaPromise<ServerMetadataHandle> MakeCallPromise(
55
- CallArgs call_args, NextPromiseFactory next_promise_factory) override;
53
+ class Call {
54
+ public:
55
+ void OnClientInitialMetadata(ClientMetadata& client_initial_metadata) {
56
+ auto* call_tracer = CallTracer();
57
+ if (call_tracer == nullptr) return;
58
+ call_tracer->RecordReceivedInitialMetadata(&client_initial_metadata);
59
+ }
60
+
61
+ void OnServerInitialMetadata(ServerMetadata& server_initial_metadata) {
62
+ auto* call_tracer = CallTracer();
63
+ if (call_tracer == nullptr) return;
64
+ call_tracer->RecordSendInitialMetadata(&server_initial_metadata);
65
+ }
66
+
67
+ void OnFinalize(const grpc_call_final_info* final_info) {
68
+ auto* call_tracer = CallTracer();
69
+ if (call_tracer == nullptr) return;
70
+ call_tracer->RecordEnd(final_info);
71
+ }
72
+
73
+ void OnServerTrailingMetadata(ServerMetadata& server_trailing_metadata) {
74
+ auto* call_tracer = CallTracer();
75
+ if (call_tracer == nullptr) return;
76
+ call_tracer->RecordSendTrailingMetadata(&server_trailing_metadata);
77
+ }
78
+
79
+ static const NoInterceptor OnClientToServerMessage;
80
+ static const NoInterceptor OnServerToClientMessage;
81
+
82
+ private:
83
+ static ServerCallTracer* CallTracer() {
84
+ auto* call_context = GetContext<grpc_call_context_element>();
85
+ return static_cast<ServerCallTracer*>(
86
+ call_context[GRPC_CONTEXT_CALL_TRACER].value);
87
+ }
88
+ };
56
89
  };
57
90
 
91
+ const NoInterceptor ServerCallTracerFilter::Call::OnClientToServerMessage;
92
+ const NoInterceptor ServerCallTracerFilter::Call::OnServerToClientMessage;
93
+
58
94
  const grpc_channel_filter ServerCallTracerFilter::kFilter =
59
95
  MakePromiseBasedFilter<ServerCallTracerFilter, FilterEndpoint::kServer,
60
96
  kFilterExaminesServerInitialMetadata>(
@@ -65,39 +101,11 @@ absl::StatusOr<ServerCallTracerFilter> ServerCallTracerFilter::Create(
65
101
  return ServerCallTracerFilter();
66
102
  }
67
103
 
68
- ArenaPromise<ServerMetadataHandle> ServerCallTracerFilter::MakeCallPromise(
69
- CallArgs call_args, NextPromiseFactory next_promise_factory) {
70
- auto* call_context = GetContext<grpc_call_context_element>();
71
- auto* call_tracer = static_cast<ServerCallTracer*>(
72
- call_context[GRPC_CONTEXT_CALL_TRACER].value);
73
- if (call_tracer == nullptr) {
74
- return next_promise_factory(std::move(call_args));
75
- }
76
- call_tracer->RecordReceivedInitialMetadata(
77
- call_args.client_initial_metadata.get());
78
- call_args.server_initial_metadata->InterceptAndMap(
79
- [call_tracer](ServerMetadataHandle metadata) {
80
- call_tracer->RecordSendInitialMetadata(metadata.get());
81
- return metadata;
82
- });
83
- GetContext<CallFinalization>()->Add(
84
- [call_tracer](const grpc_call_final_info* final_info) {
85
- call_tracer->RecordEnd(final_info);
86
- });
87
- return OnCancel(
88
- Map(next_promise_factory(std::move(call_args)),
89
- [call_tracer](ServerMetadataHandle md) {
90
- call_tracer->RecordSendTrailingMetadata(md.get());
91
- return md;
92
- }),
93
- [call_tracer]() { call_tracer->RecordCancel(absl::CancelledError()); });
94
- }
95
-
96
104
  } // namespace
97
105
 
98
106
  void RegisterServerCallTracerFilter(CoreConfiguration::Builder* builder) {
99
- builder->channel_init()->RegisterFilter(GRPC_SERVER_CHANNEL,
100
- &ServerCallTracerFilter::kFilter);
107
+ builder->channel_init()->RegisterFilter<ServerCallTracerFilter>(
108
+ GRPC_SERVER_CHANNEL);
101
109
  }
102
110
 
103
111
  } // namespace grpc_core
@@ -36,7 +36,6 @@
36
36
  #include "src/core/lib/gprpp/crash.h"
37
37
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
38
38
  #include "src/core/lib/gprpp/ref_counted_string.h"
39
- #include "src/core/lib/surface/api_trace.h"
40
39
 
41
40
  namespace grpc_core {
42
41
 
@@ -112,8 +111,6 @@ absl::optional<grpc_compression_algorithm> ParseCompressionAlgorithm(
112
111
  grpc_compression_algorithm
113
112
  CompressionAlgorithmSet::CompressionAlgorithmForLevel(
114
113
  grpc_compression_level level) const {
115
- GRPC_API_TRACE("grpc_message_compression_algorithm_for_level(level=%d)", 1,
116
- ((int)level));
117
114
  if (level > GRPC_COMPRESS_LEVEL_HIGH) {
118
115
  Crash(absl::StrFormat("Unknown message compression level %d.",
119
116
  static_cast<int>(level)));
@@ -193,7 +193,7 @@ AresResolver::CreateAresResolver(
193
193
  AresResolver::AresResolver(
194
194
  std::unique_ptr<GrpcPolledFdFactory> polled_fd_factory,
195
195
  std::shared_ptr<EventEngine> event_engine, ares_channel channel)
196
- : grpc_core::InternallyRefCounted<AresResolver>(
196
+ : RefCountedDNSResolverInterface(
197
197
  GRPC_TRACE_FLAG_ENABLED(grpc_trace_ares_resolver) ? "AresResolver"
198
198
  : nullptr),
199
199
  channel_(channel),
@@ -230,8 +230,8 @@ void AresResolver::Orphan() {
230
230
  }
231
231
 
232
232
  void AresResolver::LookupHostname(
233
- absl::string_view name, absl::string_view default_port,
234
- EventEngine::DNSResolver::LookupHostnameCallback callback) {
233
+ EventEngine::DNSResolver::LookupHostnameCallback callback,
234
+ absl::string_view name, absl::string_view default_port) {
235
235
  absl::string_view host;
236
236
  absl::string_view port_string;
237
237
  if (!grpc_core::SplitHostPort(name, &host, &port_string)) {
@@ -241,7 +241,13 @@ void AresResolver::LookupHostname(
241
241
  "Unparseable name: ", name))]() mutable { callback(status); });
242
242
  return;
243
243
  }
244
- GPR_ASSERT(!host.empty());
244
+ if (host.empty()) {
245
+ event_engine_->Run([callback = std::move(callback),
246
+ status = absl::InvalidArgumentError(absl::StrCat(
247
+ "host must not be empty in name: ",
248
+ name))]() mutable { callback(status); });
249
+ return;
250
+ }
245
251
  if (port_string.empty()) {
246
252
  if (default_port.empty()) {
247
253
  event_engine_->Run([callback = std::move(callback),
@@ -296,8 +302,8 @@ void AresResolver::LookupHostname(
296
302
  }
297
303
 
298
304
  void AresResolver::LookupSRV(
299
- absl::string_view name,
300
- EventEngine::DNSResolver::LookupSRVCallback callback) {
305
+ EventEngine::DNSResolver::LookupSRVCallback callback,
306
+ absl::string_view name) {
301
307
  absl::string_view host;
302
308
  absl::string_view port;
303
309
  if (!grpc_core::SplitHostPort(name, &host, &port)) {
@@ -307,7 +313,13 @@ void AresResolver::LookupSRV(
307
313
  "Unparseable name: ", name))]() mutable { callback(status); });
308
314
  return;
309
315
  }
310
- GPR_ASSERT(!host.empty());
316
+ if (host.empty()) {
317
+ event_engine_->Run([callback = std::move(callback),
318
+ status = absl::InvalidArgumentError(absl::StrCat(
319
+ "host must not be empty in name: ",
320
+ name))]() mutable { callback(status); });
321
+ return;
322
+ }
311
323
  // Don't query for SRV records if the target is "localhost"
312
324
  if (absl::EqualsIgnoreCase(host, "localhost")) {
313
325
  event_engine_->Run([callback = std::move(callback)]() mutable {
@@ -325,8 +337,8 @@ void AresResolver::LookupSRV(
325
337
  }
326
338
 
327
339
  void AresResolver::LookupTXT(
328
- absl::string_view name,
329
- EventEngine::DNSResolver::LookupTXTCallback callback) {
340
+ EventEngine::DNSResolver::LookupTXTCallback callback,
341
+ absl::string_view name) {
330
342
  absl::string_view host;
331
343
  absl::string_view port;
332
344
  if (!grpc_core::SplitHostPort(name, &host, &port)) {
@@ -336,7 +348,13 @@ void AresResolver::LookupTXT(
336
348
  "Unparseable name: ", name))]() mutable { callback(status); });
337
349
  return;
338
350
  }
339
- GPR_ASSERT(!host.empty());
351
+ if (host.empty()) {
352
+ event_engine_->Run([callback = std::move(callback),
353
+ status = absl::InvalidArgumentError(absl::StrCat(
354
+ "host must not be empty in name: ",
355
+ name))]() mutable { callback(status); });
356
+ return;
357
+ }
340
358
  // Don't query for TXT records if the target is "localhost"
341
359
  if (absl::EqualsIgnoreCase(host, "localhost")) {
342
360
  event_engine_->Run([callback = std::move(callback)]() mutable {
@@ -387,7 +405,8 @@ void AresResolver::CheckSocketsLocked() {
387
405
  event_engine_->Run(
388
406
  [self = Ref(DEBUG_LOCATION, "CheckSocketsLocked"),
389
407
  fd_node]() mutable {
390
- self->OnReadable(fd_node, absl::OkStatus());
408
+ static_cast<AresResolver*>(self.get())
409
+ ->OnReadable(fd_node, absl::OkStatus());
391
410
  });
392
411
  } else {
393
412
  // Otherwise register with the poller for readable event.
@@ -396,7 +415,8 @@ void AresResolver::CheckSocketsLocked() {
396
415
  fd_node->polled_fd->RegisterForOnReadableLocked(
397
416
  [self = Ref(DEBUG_LOCATION, "CheckSocketsLocked"),
398
417
  fd_node](absl::Status status) mutable {
399
- self->OnReadable(fd_node, status);
418
+ static_cast<AresResolver*>(self.get())
419
+ ->OnReadable(fd_node, status);
400
420
  });
401
421
  }
402
422
  }
@@ -410,7 +430,8 @@ void AresResolver::CheckSocketsLocked() {
410
430
  fd_node->polled_fd->RegisterForOnWriteableLocked(
411
431
  [self = Ref(DEBUG_LOCATION, "CheckSocketsLocked"),
412
432
  fd_node](absl::Status status) mutable {
413
- self->OnWritable(fd_node, status);
433
+ static_cast<AresResolver*>(self.get())
434
+ ->OnWritable(fd_node, status);
414
435
  });
415
436
  }
416
437
  }
@@ -453,7 +474,7 @@ void AresResolver::MaybeStartTimerLocked() {
453
474
  ares_backup_poll_alarm_handle_ = event_engine_->RunAfter(
454
475
  kAresBackupPollAlarmDuration,
455
476
  [self = Ref(DEBUG_LOCATION, "MaybeStartTimerLocked")]() {
456
- self->OnAresBackupPollAlarm();
477
+ static_cast<AresResolver*>(self.get())->OnAresBackupPollAlarm();
457
478
  });
458
479
  }
459
480
 
@@ -39,6 +39,7 @@
39
39
  #include <grpc/support/log.h>
40
40
 
41
41
  #include "src/core/lib/event_engine/grpc_polled_fd.h"
42
+ #include "src/core/lib/event_engine/ref_counted_dns_resolver_interface.h"
42
43
  #include "src/core/lib/gprpp/orphanable.h"
43
44
  #include "src/core/lib/gprpp/sync.h"
44
45
 
@@ -54,7 +55,7 @@ extern grpc_core::TraceFlag grpc_trace_ares_resolver;
54
55
  } \
55
56
  } while (0)
56
57
 
57
- class AresResolver : public grpc_core::InternallyRefCounted<AresResolver> {
58
+ class AresResolver : public RefCountedDNSResolverInterface {
58
59
  public:
59
60
  static absl::StatusOr<grpc_core::OrphanablePtr<AresResolver>>
60
61
  CreateAresResolver(absl::string_view dns_server,
@@ -67,15 +68,13 @@ class AresResolver : public grpc_core::InternallyRefCounted<AresResolver> {
67
68
  ~AresResolver() override;
68
69
  void Orphan() override ABSL_LOCKS_EXCLUDED(mutex_);
69
70
 
70
- void LookupHostname(absl::string_view name, absl::string_view default_port,
71
- EventEngine::DNSResolver::LookupHostnameCallback callback)
72
- ABSL_LOCKS_EXCLUDED(mutex_);
73
- void LookupSRV(absl::string_view name,
74
- EventEngine::DNSResolver::LookupSRVCallback callback)
75
- ABSL_LOCKS_EXCLUDED(mutex_);
76
- void LookupTXT(absl::string_view name,
77
- EventEngine::DNSResolver::LookupTXTCallback callback)
78
- ABSL_LOCKS_EXCLUDED(mutex_);
71
+ void LookupHostname(EventEngine::DNSResolver::LookupHostnameCallback callback,
72
+ absl::string_view name, absl::string_view default_port)
73
+ ABSL_LOCKS_EXCLUDED(mutex_) override;
74
+ void LookupSRV(EventEngine::DNSResolver::LookupSRVCallback callback,
75
+ absl::string_view name) ABSL_LOCKS_EXCLUDED(mutex_) override;
76
+ void LookupTXT(EventEngine::DNSResolver::LookupTXTCallback callback,
77
+ absl::string_view name) ABSL_LOCKS_EXCLUDED(mutex_) override;
79
78
 
80
79
  private:
81
80
  // A FdNode saves (not owns) a live socket/fd which c-ares creates, and owns a
@@ -50,7 +50,14 @@ void DNSServiceResolverImpl::LookupHostname(
50
50
  });
51
51
  return;
52
52
  }
53
- GPR_ASSERT(!host.empty());
53
+ if (host.empty()) {
54
+ engine_->Run([on_resolve = std::move(on_resolve),
55
+ status = absl::InvalidArgumentError(absl::StrCat(
56
+ "host must not be empty in name: ", name))]() mutable {
57
+ on_resolve(status);
58
+ });
59
+ return;
60
+ }
54
61
  if (port_string.empty()) {
55
62
  if (default_port.empty()) {
56
63
  engine_->Run([on_resolve = std::move(on_resolve),
@@ -0,0 +1,132 @@
1
+ // Copyright 2023 The gRPC Authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #include <grpc/support/port_platform.h>
16
+
17
+ #include "src/core/lib/iomgr/port.h"
18
+
19
+ #ifdef GRPC_POSIX_SOCKET_RESOLVE_ADDRESS
20
+
21
+ #include <netdb.h>
22
+ #include <string.h>
23
+ #include <sys/socket.h>
24
+
25
+ #include <string>
26
+ #include <type_traits>
27
+ #include <utility>
28
+ #include <vector>
29
+
30
+ #include "absl/functional/any_invocable.h"
31
+ #include "absl/status/status.h"
32
+ #include "absl/status/statusor.h"
33
+ #include "absl/strings/str_cat.h"
34
+ #include "absl/strings/str_format.h"
35
+
36
+ #include "src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h"
37
+ #include "src/core/lib/gpr/useful.h"
38
+ #include "src/core/lib/gprpp/host_port.h"
39
+
40
+ namespace grpc_event_engine {
41
+ namespace experimental {
42
+ namespace {
43
+
44
+ absl::StatusOr<std::vector<EventEngine::ResolvedAddress>>
45
+ LookupHostnameBlocking(absl::string_view name, absl::string_view default_port) {
46
+ struct addrinfo hints;
47
+ struct addrinfo *result = nullptr, *resp;
48
+ std::string host;
49
+ std::string port;
50
+ // parse name, splitting it into host and port parts
51
+ grpc_core::SplitHostPort(name, &host, &port);
52
+ if (host.empty()) {
53
+ return absl::InvalidArgumentError(absl::StrCat("Unparseable name: ", name));
54
+ }
55
+ if (port.empty()) {
56
+ if (default_port.empty()) {
57
+ return absl::InvalidArgumentError(
58
+ absl::StrFormat("No port in name %s or default_port argument", name));
59
+ }
60
+ port = std::string(default_port);
61
+ }
62
+ // Call getaddrinfo
63
+ memset(&hints, 0, sizeof(hints));
64
+ hints.ai_family = AF_UNSPEC; // ipv4 or ipv6
65
+ hints.ai_socktype = SOCK_STREAM; // stream socket
66
+ hints.ai_flags = AI_PASSIVE; // for wildcard IP address
67
+ int s = getaddrinfo(host.c_str(), port.c_str(), &hints, &result);
68
+ if (s != 0) {
69
+ // Retry if well-known service name is recognized
70
+ const char* svc[][2] = {{"http", "80"}, {"https", "443"}};
71
+ for (size_t i = 0; i < GPR_ARRAY_SIZE(svc); i++) {
72
+ if (port == svc[i][0]) {
73
+ s = getaddrinfo(host.c_str(), svc[i][1], &hints, &result);
74
+ break;
75
+ }
76
+ }
77
+ }
78
+ if (s != 0) {
79
+ return absl::UnknownError(absl::StrFormat(
80
+ "Address lookup failed for %s os_error: %s syscall: getaddrinfo", name,
81
+ gai_strerror(s)));
82
+ }
83
+ // Success path: fill in addrs
84
+ std::vector<EventEngine::ResolvedAddress> addresses;
85
+ for (resp = result; resp != nullptr; resp = resp->ai_next) {
86
+ addresses.emplace_back(resp->ai_addr, resp->ai_addrlen);
87
+ }
88
+ if (result) {
89
+ freeaddrinfo(result);
90
+ }
91
+ return addresses;
92
+ }
93
+
94
+ } // namespace
95
+
96
+ NativePosixDNSResolver::NativePosixDNSResolver(
97
+ std::shared_ptr<EventEngine> event_engine)
98
+ : event_engine_(std::move(event_engine)) {}
99
+
100
+ void NativePosixDNSResolver::LookupHostname(
101
+ EventEngine::DNSResolver::LookupHostnameCallback on_resolved,
102
+ absl::string_view name, absl::string_view default_port) {
103
+ event_engine_->Run(
104
+ [name, default_port, on_resolved = std::move(on_resolved)]() mutable {
105
+ on_resolved(LookupHostnameBlocking(name, default_port));
106
+ });
107
+ }
108
+
109
+ void NativePosixDNSResolver::LookupSRV(
110
+ EventEngine::DNSResolver::LookupSRVCallback on_resolved,
111
+ absl::string_view /* name */) {
112
+ // Not supported
113
+ event_engine_->Run([on_resolved = std::move(on_resolved)]() mutable {
114
+ on_resolved(absl::UnimplementedError(
115
+ "The Native resolver does not support looking up SRV records"));
116
+ });
117
+ }
118
+
119
+ void NativePosixDNSResolver::LookupTXT(
120
+ EventEngine::DNSResolver::LookupTXTCallback on_resolved,
121
+ absl::string_view /* name */) {
122
+ // Not supported
123
+ event_engine_->Run([on_resolved = std::move(on_resolved)]() mutable {
124
+ on_resolved(absl::UnimplementedError(
125
+ "The Native resolver does not support looking up TXT records"));
126
+ });
127
+ }
128
+
129
+ } // namespace experimental
130
+ } // namespace grpc_event_engine
131
+
132
+ #endif // GRPC_POSIX_SOCKET_RESOLVE_ADDRESS
@@ -0,0 +1,61 @@
1
+ // Copyright 2023 The gRPC Authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #ifndef GRPC_SRC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_NATIVE_POSIX_DNS_RESOLVER_H
16
+ #define GRPC_SRC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_NATIVE_POSIX_DNS_RESOLVER_H
17
+
18
+ #include <grpc/support/port_platform.h>
19
+
20
+ #include <memory>
21
+
22
+ #include "absl/strings/string_view.h"
23
+
24
+ #include "src/core/lib/iomgr/port.h"
25
+
26
+ #ifdef GRPC_POSIX_SOCKET_RESOLVE_ADDRESS
27
+
28
+ #include <grpc/event_engine/event_engine.h>
29
+
30
+ #include "src/core/lib/event_engine/ref_counted_dns_resolver_interface.h"
31
+
32
+ namespace grpc_event_engine {
33
+ namespace experimental {
34
+
35
+ // An asynchronous DNS resolver which uses the native platform's getaddrinfo
36
+ // API. Only supports A/AAAA records.
37
+ class NativePosixDNSResolver : public RefCountedDNSResolverInterface {
38
+ public:
39
+ explicit NativePosixDNSResolver(std::shared_ptr<EventEngine> event_engine);
40
+
41
+ void LookupHostname(
42
+ EventEngine::DNSResolver::LookupHostnameCallback on_resolved,
43
+ absl::string_view name, absl::string_view default_port) override;
44
+
45
+ void LookupSRV(EventEngine::DNSResolver::LookupSRVCallback on_resolved,
46
+ absl::string_view name) override;
47
+
48
+ void LookupTXT(EventEngine::DNSResolver::LookupTXTCallback on_resolved,
49
+ absl::string_view name) override;
50
+
51
+ void Orphan() override { delete this; }
52
+
53
+ private:
54
+ std::shared_ptr<EventEngine> event_engine_;
55
+ };
56
+
57
+ } // namespace experimental
58
+ } // namespace grpc_event_engine
59
+
60
+ #endif // GRPC_POSIX_SOCKET_RESOLVE_ADDRESS
61
+ #endif // GRPC_SRC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_NATIVE_POSIX_DNS_RESOLVER_H
@@ -28,6 +28,7 @@
28
28
  #include "absl/cleanup/cleanup.h"
29
29
  #include "absl/functional/any_invocable.h"
30
30
  #include "absl/status/status.h"
31
+ #include "absl/strings/match.h"
31
32
  #include "absl/strings/str_cat.h"
32
33
 
33
34
  #include <grpc/event_engine/event_engine.h>
@@ -36,12 +37,15 @@
36
37
  #include <grpc/support/cpu.h>
37
38
  #include <grpc/support/log.h>
38
39
 
40
+ #include "src/core/lib/config/config_vars.h"
39
41
  #include "src/core/lib/debug/trace.h"
42
+ #include "src/core/lib/event_engine/ares_resolver.h"
40
43
  #include "src/core/lib/event_engine/forkable.h"
41
44
  #include "src/core/lib/event_engine/grpc_polled_fd.h"
42
45
  #include "src/core/lib/event_engine/poller.h"
43
46
  #include "src/core/lib/event_engine/posix.h"
44
47
  #include "src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h"
48
+ #include "src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h"
45
49
  #include "src/core/lib/event_engine/posix_engine/tcp_socket_utils.h"
46
50
  #include "src/core/lib/event_engine/posix_engine/timer.h"
47
51
  #include "src/core/lib/event_engine/tcp_socket_utils.h"
@@ -90,6 +94,15 @@ class TimerForkCallbackMethods {
90
94
  static void PostforkChild() { g_timer_fork_manager->PostforkChild(); }
91
95
  };
92
96
 
97
+ bool ShouldUseAresDnsResolver() {
98
+ #if GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_ARES_EV_DRIVER)
99
+ auto resolver_env = grpc_core::ConfigVars::Get().DnsResolver();
100
+ return resolver_env.empty() || absl::EqualsIgnoreCase(resolver_env, "ares");
101
+ #else // GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_ARES_EV_DRIVER)
102
+ return false;
103
+ #endif // GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_ARES_EV_DRIVER)
104
+ }
105
+
93
106
  } // namespace
94
107
 
95
108
  #ifdef GRPC_POSIX_SOCKET_TCP
@@ -242,11 +255,11 @@ EventEngine::ConnectionHandle PosixEventEngine::ConnectInternal(
242
255
  MemoryAllocator&& allocator, const PosixTcpOptions& options,
243
256
  Duration timeout) {
244
257
  int err;
245
- int saved_errno;
258
+ int connect_errno;
246
259
  do {
247
260
  err = connect(sock.Fd(), addr.address(), addr.size());
248
261
  } while (err < 0 && errno == EINTR);
249
- saved_errno = errno;
262
+ connect_errno = (err < 0) ? errno : 0;
250
263
 
251
264
  auto addr_uri = ResolvedAddressToURI(addr);
252
265
  if (!addr_uri.ok()) {
@@ -261,13 +274,8 @@ EventEngine::ConnectionHandle PosixEventEngine::ConnectInternal(
261
274
  PosixEventPoller* poller = poller_manager_->Poller();
262
275
  EventHandle* handle =
263
276
  poller->CreateHandle(sock.Fd(), name, poller->CanTrackErrors());
264
- int64_t connection_id = 0;
265
- if (saved_errno == EWOULDBLOCK || saved_errno == EINPROGRESS) {
266
- // Connection is still in progress.
267
- connection_id = last_connection_id_.fetch_add(1, std::memory_order_acq_rel);
268
- }
269
277
 
270
- if (err >= 0) {
278
+ if (connect_errno == 0) {
271
279
  // Connection already succeded. Return 0 to discourage any cancellation
272
280
  // attempts.
273
281
  Run([on_connect = std::move(on_connect),
@@ -277,18 +285,21 @@ EventEngine::ConnectionHandle PosixEventEngine::ConnectInternal(
277
285
  });
278
286
  return EventEngine::ConnectionHandle::kInvalid;
279
287
  }
280
- if (saved_errno != EWOULDBLOCK && saved_errno != EINPROGRESS) {
288
+ if (connect_errno != EWOULDBLOCK && connect_errno != EINPROGRESS) {
281
289
  // Connection already failed. Return 0 to discourage any cancellation
282
290
  // attempts.
283
291
  handle->OrphanHandle(nullptr, nullptr, "tcp_client_connect_error");
284
292
  Run([on_connect = std::move(on_connect),
285
- ep = absl::FailedPreconditionError(
286
- absl::StrCat("connect failed: ", "addr: ", addr_uri.value(),
287
- " error: ", std::strerror(saved_errno)))]() mutable {
293
+ ep = absl::FailedPreconditionError(absl::StrCat(
294
+ "connect failed: ", "addr: ", addr_uri.value(),
295
+ " error: ", std::strerror(connect_errno)))]() mutable {
288
296
  on_connect(std::move(ep));
289
297
  });
290
298
  return EventEngine::ConnectionHandle::kInvalid;
291
299
  }
300
+ // Connection is still in progress.
301
+ int64_t connection_id =
302
+ last_connection_id_.fetch_add(1, std::memory_order_acq_rel);
292
303
  AsyncConnect* ac = new AsyncConnect(
293
304
  std::move(on_connect), shared_from_this(), executor_.get(), handle,
294
305
  std::move(allocator), options, addr_uri.value(), connection_id);
@@ -517,49 +528,54 @@ EventEngine::TaskHandle PosixEventEngine::RunAfterInternal(
517
528
  return handle;
518
529
  }
519
530
 
520
- #if GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_TCP)
521
-
522
531
  PosixEventEngine::PosixDNSResolver::PosixDNSResolver(
523
- grpc_core::OrphanablePtr<AresResolver> ares_resolver)
524
- : ares_resolver_(std::move(ares_resolver)) {}
532
+ grpc_core::OrphanablePtr<RefCountedDNSResolverInterface> dns_resolver)
533
+ : dns_resolver_(std::move(dns_resolver)) {}
525
534
 
526
535
  void PosixEventEngine::PosixDNSResolver::LookupHostname(
527
536
  LookupHostnameCallback on_resolve, absl::string_view name,
528
537
  absl::string_view default_port) {
529
- ares_resolver_->LookupHostname(name, default_port, std::move(on_resolve));
538
+ dns_resolver_->LookupHostname(std::move(on_resolve), name, default_port);
530
539
  }
531
540
 
532
541
  void PosixEventEngine::PosixDNSResolver::LookupSRV(LookupSRVCallback on_resolve,
533
542
  absl::string_view name) {
534
- ares_resolver_->LookupSRV(name, std::move(on_resolve));
543
+ dns_resolver_->LookupSRV(std::move(on_resolve), name);
535
544
  }
536
545
 
537
546
  void PosixEventEngine::PosixDNSResolver::LookupTXT(LookupTXTCallback on_resolve,
538
547
  absl::string_view name) {
539
- ares_resolver_->LookupTXT(name, std::move(on_resolve));
548
+ dns_resolver_->LookupTXT(std::move(on_resolve), name);
540
549
  }
541
550
 
542
- #endif // GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_TCP)
543
-
544
551
  absl::StatusOr<std::unique_ptr<EventEngine::DNSResolver>>
545
552
  PosixEventEngine::GetDNSResolver(
546
- const EventEngine::DNSResolver::ResolverOptions& options) {
547
- #if GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_TCP)
548
- auto ares_resolver = AresResolver::CreateAresResolver(
549
- options.dns_server,
550
- std::make_unique<GrpcPolledFdFactoryPosix>(poller_manager_->Poller()),
551
- shared_from_this());
552
- if (!ares_resolver.ok()) {
553
- return ares_resolver.status();
553
+ GRPC_UNUSED const EventEngine::DNSResolver::ResolverOptions& options) {
554
+ #ifndef GRPC_POSIX_SOCKET_RESOLVE_ADDRESS
555
+ grpc_core::Crash("Unable to get DNS resolver for this platform.");
556
+ #else // GRPC_POSIX_SOCKET_RESOLVE_ADDRESS
557
+ // If c-ares is supported on the platform, build according to user's
558
+ // configuration.
559
+ if (ShouldUseAresDnsResolver()) {
560
+ #if GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_ARES_EV_DRIVER)
561
+ GRPC_EVENT_ENGINE_DNS_TRACE("PosixEventEngine:%p creating AresResolver",
562
+ this);
563
+ auto ares_resolver = AresResolver::CreateAresResolver(
564
+ options.dns_server,
565
+ std::make_unique<GrpcPolledFdFactoryPosix>(poller_manager_->Poller()),
566
+ shared_from_this());
567
+ if (!ares_resolver.ok()) {
568
+ return ares_resolver.status();
569
+ }
570
+ return std::make_unique<PosixEventEngine::PosixDNSResolver>(
571
+ std::move(*ares_resolver));
572
+ #endif // GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_ARES_EV_DRIVER)
554
573
  }
574
+ GRPC_EVENT_ENGINE_DNS_TRACE(
575
+ "PosixEventEngine:%p creating NativePosixDNSResolver", this);
555
576
  return std::make_unique<PosixEventEngine::PosixDNSResolver>(
556
- std::move(*ares_resolver));
557
- #else // GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_TCP)
558
- // TODO(yijiem): Implement a basic A/AAAA-only native resolver in
559
- // PosixEventEngine.
560
- (void)options;
561
- grpc_core::Crash("unimplemented");
562
- #endif // GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_TCP)
577
+ grpc_core::MakeOrphanable<NativePosixDNSResolver>(shared_from_this()));
578
+ #endif // GRPC_POSIX_SOCKET_RESOLVE_ADDRESS
563
579
  }
564
580
 
565
581
  bool PosixEventEngine::IsWorkerThread() { grpc_core::Crash("unimplemented"); }