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
@@ -34,11 +34,11 @@
34
34
  #include <grpc/event_engine/event_engine.h>
35
35
  #include <grpc/event_engine/memory_allocator.h>
36
36
 
37
- #include "src/core/lib/event_engine/ares_resolver.h"
38
37
  #include "src/core/lib/event_engine/handle_containers.h"
39
38
  #include "src/core/lib/event_engine/posix.h"
40
39
  #include "src/core/lib/event_engine/posix_engine/event_poller.h"
41
40
  #include "src/core/lib/event_engine/posix_engine/timer_manager.h"
41
+ #include "src/core/lib/event_engine/ref_counted_dns_resolver_interface.h"
42
42
  #include "src/core/lib/event_engine/thread_pool/thread_pool.h"
43
43
  #include "src/core/lib/gprpp/orphanable.h"
44
44
  #include "src/core/lib/gprpp/sync.h"
@@ -141,11 +141,8 @@ class PosixEventEngine final : public PosixEventEngineWithFdSupport,
141
141
  public:
142
142
  class PosixDNSResolver : public EventEngine::DNSResolver {
143
143
  public:
144
- PosixDNSResolver() = delete;
145
- #if GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_TCP)
146
144
  explicit PosixDNSResolver(
147
- grpc_core::OrphanablePtr<AresResolver> ares_resolver);
148
- #endif // GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_TCP)
145
+ grpc_core::OrphanablePtr<RefCountedDNSResolverInterface> dns_resolver);
149
146
  void LookupHostname(LookupHostnameCallback on_resolve,
150
147
  absl::string_view name,
151
148
  absl::string_view default_port) override;
@@ -154,10 +151,8 @@ class PosixEventEngine final : public PosixEventEngineWithFdSupport,
154
151
  void LookupTXT(LookupTXTCallback on_resolve,
155
152
  absl::string_view name) override;
156
153
 
157
- #if GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_TCP)
158
154
  private:
159
- grpc_core::OrphanablePtr<AresResolver> ares_resolver_;
160
- #endif // GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_TCP)
155
+ grpc_core::OrphanablePtr<RefCountedDNSResolverInterface> dns_resolver_;
161
156
  };
162
157
 
163
158
  #ifdef GRPC_POSIX_SOCKET_TCP
@@ -203,7 +198,7 @@ class PosixEventEngine final : public PosixEventEngineWithFdSupport,
203
198
  bool CancelConnect(ConnectionHandle handle) override;
204
199
  bool IsWorkerThread() override;
205
200
  absl::StatusOr<std::unique_ptr<DNSResolver>> GetDNSResolver(
206
- const DNSResolver::ResolverOptions& options) override;
201
+ GRPC_UNUSED const DNSResolver::ResolverOptions& options) override;
207
202
  void Run(Closure* closure) override;
208
203
  void Run(absl::AnyInvocable<void()> closure) override;
209
204
  // Caution!! The timer implementation cannot create any fds. See #20418.
@@ -25,6 +25,8 @@
25
25
 
26
26
  #include "absl/cleanup/cleanup.h"
27
27
  #include "absl/status/status.h"
28
+ #include "absl/strings/str_cat.h"
29
+ #include "absl/strings/str_replace.h"
28
30
 
29
31
  #include <grpc/event_engine/event_engine.h>
30
32
  #include <grpc/support/log.h>
@@ -44,8 +46,6 @@
44
46
  #include <netinet/in.h> // IWYU pragma: keep
45
47
  #include <sys/socket.h> // IWYU pragma: keep
46
48
  #include <unistd.h> // IWYU pragma: keep
47
-
48
- #include "absl/strings/str_cat.h"
49
49
  #endif
50
50
 
51
51
  namespace grpc_event_engine {
@@ -176,8 +176,16 @@ absl::Status PrepareSocket(const PosixTcpOptions& options,
176
176
  GRPC_FD_SERVER_LISTENER_USAGE, options));
177
177
 
178
178
  if (bind(fd, socket.addr.address(), socket.addr.size()) < 0) {
179
+ auto sockaddr_str = ResolvedAddressToString(socket.addr);
180
+ if (!sockaddr_str.ok()) {
181
+ gpr_log(GPR_ERROR, "Could not convert sockaddr to string: %s",
182
+ sockaddr_str.status().ToString().c_str());
183
+ sockaddr_str = "<unparsable>";
184
+ }
185
+ sockaddr_str = absl::StrReplaceAll(*sockaddr_str, {{"\0", "@"}});
179
186
  return absl::FailedPreconditionError(
180
- absl::StrCat("Error in bind: ", std::strerror(errno)));
187
+ absl::StrCat("Error in bind for address '", *sockaddr_str,
188
+ "': ", std::strerror(errno)));
181
189
  }
182
190
 
183
191
  if (listen(fd, GetMaxAcceptQueueSize()) < 0) {
@@ -25,6 +25,7 @@
25
25
  #include "absl/types/optional.h"
26
26
 
27
27
  #include <grpc/event_engine/event_engine.h>
28
+ #include <grpc/event_engine/memory_allocator.h>
28
29
  #include <grpc/impl/channel_arg_names.h>
29
30
 
30
31
  #include "src/core/lib/gpr/useful.h"
@@ -75,6 +76,7 @@ int AdjustValue(int default_value, int min_value, int max_value,
75
76
  return *actual_value;
76
77
  }
77
78
 
79
+ #ifdef GRPC_POSIX_SOCKET_UTILS_COMMON
78
80
  // The default values for TCP_USER_TIMEOUT are currently configured to be in
79
81
  // line with the default values of KEEPALIVE_TIMEOUT as proposed in
80
82
  // https://github.com/grpc/proposal/blob/master/A18-tcp-user-timeout.md */
@@ -83,8 +85,6 @@ int kDefaultServerUserTimeoutMs = 20000;
83
85
  bool kDefaultClientUserTimeoutEnabled = false;
84
86
  bool kDefaultServerUserTimeoutEnabled = true;
85
87
 
86
- #ifdef GRPC_POSIX_SOCKET_UTILS_COMMON
87
-
88
88
  absl::Status ErrorForFd(
89
89
  int fd, const experimental::EventEngine::ResolvedAddress& addr) {
90
90
  if (fd >= 0) return absl::OkStatus();
@@ -210,6 +210,13 @@ PosixTcpOptions TcpOptionsFromEndpointConfig(const EndpointConfig& config) {
210
210
  options.socket_mutator =
211
211
  grpc_socket_mutator_ref(static_cast<grpc_socket_mutator*>(value));
212
212
  }
213
+ value =
214
+ config.GetVoidPointer(GRPC_ARG_EVENT_ENGINE_USE_MEMORY_ALLOCATOR_FACTORY);
215
+ if (value != nullptr) {
216
+ options.memory_allocator_factory =
217
+ static_cast<grpc_event_engine::experimental::MemoryAllocatorFactory*>(
218
+ value);
219
+ }
213
220
  return options;
214
221
  }
215
222
 
@@ -26,6 +26,7 @@
26
26
 
27
27
  #include <grpc/event_engine/endpoint_config.h>
28
28
  #include <grpc/event_engine/event_engine.h>
29
+ #include <grpc/event_engine/memory_allocator.h>
29
30
  #include <grpc/grpc.h>
30
31
  #include <grpc/support/log.h>
31
32
 
@@ -75,6 +76,8 @@ struct PosixTcpOptions {
75
76
  int dscp = kDscpNotSet;
76
77
  grpc_core::RefCountedPtr<grpc_core::ResourceQuota> resource_quota;
77
78
  struct grpc_socket_mutator* socket_mutator = nullptr;
79
+ grpc_event_engine::experimental::MemoryAllocatorFactory*
80
+ memory_allocator_factory = nullptr;
78
81
  PosixTcpOptions() = default;
79
82
  // Move ctor
80
83
  PosixTcpOptions(PosixTcpOptions&& other) noexcept {
@@ -89,6 +92,8 @@ struct PosixTcpOptions {
89
92
  }
90
93
  socket_mutator = std::exchange(other.socket_mutator, nullptr);
91
94
  resource_quota = std::move(other.resource_quota);
95
+ memory_allocator_factory =
96
+ std::exchange(other.memory_allocator_factory, nullptr);
92
97
  CopyIntegerOptions(other);
93
98
  return *this;
94
99
  }
@@ -98,6 +103,7 @@ struct PosixTcpOptions {
98
103
  socket_mutator = grpc_socket_mutator_ref(other.socket_mutator);
99
104
  }
100
105
  resource_quota = other.resource_quota;
106
+ memory_allocator_factory = other.memory_allocator_factory;
101
107
  CopyIntegerOptions(other);
102
108
  }
103
109
  // Copy assignment
@@ -113,6 +119,7 @@ struct PosixTcpOptions {
113
119
  socket_mutator = grpc_socket_mutator_ref(other.socket_mutator);
114
120
  }
115
121
  resource_quota = other.resource_quota;
122
+ memory_allocator_factory = other.memory_allocator_factory;
116
123
  CopyIntegerOptions(other);
117
124
  return *this;
118
125
  }
@@ -30,7 +30,6 @@
30
30
  #include <grpc/support/time.h>
31
31
 
32
32
  #include "src/core/lib/debug/trace.h"
33
- #include "src/core/lib/gprpp/thd.h"
34
33
 
35
34
  static thread_local bool g_timer_thread;
36
35
 
@@ -67,41 +66,32 @@ bool TimerManager::WaitUntil(grpc_core::Timestamp next) {
67
66
  }
68
67
 
69
68
  void TimerManager::MainLoop() {
70
- for (;;) {
71
- grpc_core::Timestamp next = grpc_core::Timestamp::InfFuture();
72
- absl::optional<std::vector<experimental::EventEngine::Closure*>>
73
- check_result = timer_list_->TimerCheck(&next);
74
- GPR_ASSERT(check_result.has_value() &&
75
- "ERROR: More than one MainLoop is running.");
76
- if (!check_result->empty()) {
77
- RunSomeTimers(std::move(*check_result));
78
- continue;
79
- }
80
- if (!WaitUntil(next)) break;
69
+ grpc_core::Timestamp next = grpc_core::Timestamp::InfFuture();
70
+ absl::optional<std::vector<experimental::EventEngine::Closure*>>
71
+ check_result = timer_list_->TimerCheck(&next);
72
+ GPR_ASSERT(check_result.has_value() &&
73
+ "ERROR: More than one MainLoop is running.");
74
+ bool timers_found = !check_result->empty();
75
+ if (timers_found) {
76
+ RunSomeTimers(std::move(*check_result));
81
77
  }
82
- main_loop_exit_signal_->Notify();
78
+ thread_pool_->Run([this, next, timers_found]() {
79
+ if (!timers_found && !WaitUntil(next)) {
80
+ main_loop_exit_signal_->Notify();
81
+ return;
82
+ }
83
+ MainLoop();
84
+ });
83
85
  }
84
86
 
85
87
  bool TimerManager::IsTimerManagerThread() { return g_timer_thread; }
86
88
 
87
- void TimerManager::StartMainLoopThread() {
88
- main_thread_ = grpc_core::Thread(
89
- "timer_manager",
90
- [](void* arg) {
91
- auto self = static_cast<TimerManager*>(arg);
92
- self->MainLoop();
93
- },
94
- this, nullptr,
95
- grpc_core::Thread::Options().set_tracked(false).set_joinable(false));
96
- main_thread_.Start();
97
- }
98
-
99
89
  TimerManager::TimerManager(
100
90
  std::shared_ptr<grpc_event_engine::experimental::ThreadPool> thread_pool)
101
91
  : host_(this), thread_pool_(std::move(thread_pool)) {
102
92
  timer_list_ = std::make_unique<TimerList>(&host_);
103
93
  main_loop_exit_signal_.emplace();
104
- StartMainLoopThread();
94
+ thread_pool_->Run([this]() { MainLoop(); });
105
95
  }
106
96
 
107
97
  grpc_core::Timestamp TimerManager::Host::Now() {
@@ -162,7 +152,7 @@ void TimerManager::RestartPostFork() {
162
152
  }
163
153
  shutdown_ = false;
164
154
  main_loop_exit_signal_.emplace();
165
- StartMainLoopThread();
155
+ thread_pool_->Run([this]() { MainLoop(); });
166
156
  }
167
157
 
168
158
  void TimerManager::PrepareFork() { Shutdown(); }
@@ -36,7 +36,6 @@
36
36
  #include "src/core/lib/event_engine/thread_pool/thread_pool.h"
37
37
  #include "src/core/lib/gprpp/notification.h"
38
38
  #include "src/core/lib/gprpp/sync.h"
39
- #include "src/core/lib/gprpp/thd.h"
40
39
  #include "src/core/lib/gprpp/time.h"
41
40
 
42
41
  namespace grpc_event_engine {
@@ -80,7 +79,6 @@ class TimerManager final : public grpc_event_engine::experimental::Forkable {
80
79
  TimerManager* const timer_manager_;
81
80
  };
82
81
 
83
- void StartMainLoopThread();
84
82
  void RestartPostFork();
85
83
  void MainLoop();
86
84
  void RunSomeTimers(std::vector<experimental::EventEngine::Closure*> timers);
@@ -103,7 +101,6 @@ class TimerManager final : public grpc_event_engine::experimental::Forkable {
103
101
  uint64_t wakeups_ ABSL_GUARDED_BY(mu_) = false;
104
102
  // actual timer implementation
105
103
  std::unique_ptr<TimerList> timer_list_;
106
- grpc_core::Thread main_thread_;
107
104
  std::shared_ptr<grpc_event_engine::experimental::ThreadPool> thread_pool_;
108
105
  absl::optional<grpc_core::Notification> main_loop_exit_signal_;
109
106
  };
@@ -0,0 +1,55 @@
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_REF_COUNTED_DNS_RESOLVER_INTERFACE_H
16
+ #define GRPC_SRC_CORE_LIB_EVENT_ENGINE_REF_COUNTED_DNS_RESOLVER_INTERFACE_H
17
+
18
+ #include <grpc/support/port_platform.h>
19
+
20
+ #include <stdint.h>
21
+
22
+ #include "absl/strings/string_view.h"
23
+
24
+ #include <grpc/event_engine/event_engine.h>
25
+
26
+ #include "src/core/lib/gprpp/orphanable.h"
27
+
28
+ namespace grpc_event_engine {
29
+ namespace experimental {
30
+
31
+ class RefCountedDNSResolverInterface
32
+ : public grpc_core::InternallyRefCounted<RefCountedDNSResolverInterface> {
33
+ public:
34
+ explicit RefCountedDNSResolverInterface(const char* trace = nullptr,
35
+ intptr_t initial_refcount = 1)
36
+ : grpc_core::InternallyRefCounted<RefCountedDNSResolverInterface>(
37
+ trace, initial_refcount) {}
38
+
39
+ virtual void LookupHostname(
40
+ EventEngine::DNSResolver::LookupHostnameCallback on_resolved,
41
+ absl::string_view name, absl::string_view default_port) = 0;
42
+
43
+ virtual void LookupSRV(
44
+ EventEngine::DNSResolver::LookupSRVCallback on_resolved,
45
+ absl::string_view name) = 0;
46
+
47
+ virtual void LookupTXT(
48
+ EventEngine::DNSResolver::LookupTXTCallback on_resolved,
49
+ absl::string_view name) = 0;
50
+ };
51
+
52
+ } // namespace experimental
53
+ } // namespace grpc_event_engine
54
+
55
+ #endif // GRPC_SRC_CORE_LIB_EVENT_ENGINE_REF_COUNTED_DNS_RESOLVER_INTERFACE_H
@@ -0,0 +1,114 @@
1
+ // Copyright 2024 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
+ #include <grpc/support/port_platform.h>
15
+
16
+ #ifdef GPR_WINDOWS
17
+ #include <inttypes.h>
18
+ #include <string.h>
19
+ #include <sys/types.h>
20
+
21
+ #include <string>
22
+
23
+ #include "absl/strings/str_format.h"
24
+
25
+ #include <grpc/event_engine/event_engine.h>
26
+
27
+ #include "src/core/lib/event_engine/windows/native_windows_dns_resolver.h"
28
+ #include "src/core/lib/gprpp/host_port.h"
29
+ #include "src/core/lib/gprpp/status_helper.h"
30
+ #include "src/core/lib/iomgr/error.h"
31
+
32
+ namespace grpc_event_engine {
33
+ namespace experimental {
34
+
35
+ namespace {
36
+ absl::StatusOr<std::vector<EventEngine::ResolvedAddress>>
37
+ LookupHostnameBlocking(absl::string_view name, absl::string_view default_port) {
38
+ std::vector<EventEngine::ResolvedAddress> addresses;
39
+ // parse name, splitting it into host and port parts
40
+ std::string host;
41
+ std::string port;
42
+ grpc_core::SplitHostPort(name, &host, &port);
43
+ if (host.empty()) {
44
+ return absl::InvalidArgumentError(absl::StrCat("Unparseable name: ", name));
45
+ }
46
+ if (port.empty()) {
47
+ if (default_port.empty()) {
48
+ return absl::InvalidArgumentError(
49
+ absl::StrFormat("No port in name %s or default_port argument", name));
50
+ }
51
+ port = std::string(default_port);
52
+ }
53
+ // Call getaddrinfo
54
+ struct addrinfo hints;
55
+ memset(&hints, 0, sizeof(hints));
56
+ hints.ai_family = AF_UNSPEC; // ipv4 or ipv6
57
+ hints.ai_socktype = SOCK_STREAM; // stream socket
58
+ hints.ai_flags = AI_PASSIVE; // for wildcard IP address
59
+ struct addrinfo* result = nullptr;
60
+ int getaddrinfo_error =
61
+ getaddrinfo(host.c_str(), port.c_str(), &hints, &result);
62
+ if (getaddrinfo_error != 0) {
63
+ return absl::UnknownError(
64
+ absl::StrFormat("Address lookup failed for %s os_error: %s", name,
65
+ grpc_core::StatusToString(
66
+ GRPC_WSA_ERROR(WSAGetLastError(), "getaddrinfo"))
67
+ .c_str()));
68
+ }
69
+ // Success path: collect and return all addresses
70
+ for (auto* resp = result; resp != nullptr; resp = resp->ai_next) {
71
+ addresses.emplace_back(resp->ai_addr, resp->ai_addrlen);
72
+ }
73
+ if (result) freeaddrinfo(result);
74
+ return addresses;
75
+ }
76
+
77
+ } // namespace
78
+ NativeWindowsDNSResolver::NativeWindowsDNSResolver(
79
+ std::shared_ptr<EventEngine> event_engine)
80
+ : event_engine_(std::move(event_engine)) {}
81
+
82
+ void NativeWindowsDNSResolver::LookupHostname(
83
+ EventEngine::DNSResolver::LookupHostnameCallback on_resolved,
84
+ absl::string_view name, absl::string_view default_port) {
85
+ event_engine_->Run(
86
+ [name, default_port, on_resolved = std::move(on_resolved)]() mutable {
87
+ on_resolved(LookupHostnameBlocking(name, default_port));
88
+ });
89
+ }
90
+
91
+ void NativeWindowsDNSResolver::LookupSRV(
92
+ EventEngine::DNSResolver::LookupSRVCallback on_resolved,
93
+ absl::string_view /* name */) {
94
+ // Not supported
95
+ event_engine_->Run([on_resolved = std::move(on_resolved)]() mutable {
96
+ on_resolved(absl::UnimplementedError(
97
+ "The Native resolver does not support looking up SRV records"));
98
+ });
99
+ }
100
+
101
+ void NativeWindowsDNSResolver::LookupTXT(
102
+ EventEngine::DNSResolver::LookupTXTCallback on_resolved,
103
+ absl::string_view /* name */) {
104
+ // Not supported
105
+ event_engine_->Run([on_resolved = std::move(on_resolved)]() mutable {
106
+ on_resolved(absl::UnimplementedError(
107
+ "The Native resolver does not support looking up TXT records"));
108
+ });
109
+ }
110
+
111
+ } // namespace experimental
112
+ } // namespace grpc_event_engine
113
+
114
+ #endif // GPR_WINDOWS
@@ -0,0 +1,51 @@
1
+ // Copyright 2024 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
+ #ifndef GRPC_SRC_CORE_LIB_EVENT_ENGINE_WINDOWS_NATIVE_WINDOWS_DNS_RESOLVER_H
15
+ #define GRPC_SRC_CORE_LIB_EVENT_ENGINE_WINDOWS_NATIVE_WINDOWS_DNS_RESOLVER_H
16
+
17
+ #include <grpc/support/port_platform.h>
18
+
19
+ #ifdef GPR_WINDOWS
20
+
21
+ #include <grpc/event_engine/event_engine.h>
22
+
23
+ namespace grpc_event_engine {
24
+ namespace experimental {
25
+
26
+ // An asynchronous DNS resolver which uses the native platform's getaddrinfo
27
+ // API. Only supports A/AAAA records.
28
+ class NativeWindowsDNSResolver : public EventEngine::DNSResolver {
29
+ public:
30
+ explicit NativeWindowsDNSResolver(std::shared_ptr<EventEngine> event_engine);
31
+
32
+ void LookupHostname(
33
+ EventEngine::DNSResolver::LookupHostnameCallback on_resolved,
34
+ absl::string_view name, absl::string_view default_port) override;
35
+
36
+ void LookupSRV(EventEngine::DNSResolver::LookupSRVCallback on_resolved,
37
+ absl::string_view name) override;
38
+
39
+ void LookupTXT(EventEngine::DNSResolver::LookupTXTCallback on_resolved,
40
+ absl::string_view name) override;
41
+
42
+ private:
43
+ std::shared_ptr<EventEngine> event_engine_;
44
+ };
45
+
46
+ } // namespace experimental
47
+ } // namespace grpc_event_engine
48
+
49
+ #endif
50
+
51
+ #endif // GRPC_SRC_CORE_LIB_EVENT_ENGINE_WINDOWS_NATIVE_WINDOWS_DNS_RESOLVER_H
@@ -37,6 +37,7 @@
37
37
  #include "src/core/lib/event_engine/utils.h"
38
38
  #include "src/core/lib/event_engine/windows/grpc_polled_fd_windows.h"
39
39
  #include "src/core/lib/event_engine/windows/iocp.h"
40
+ #include "src/core/lib/event_engine/windows/native_windows_dns_resolver.h"
40
41
  #include "src/core/lib/event_engine/windows/windows_endpoint.h"
41
42
  #include "src/core/lib/event_engine/windows/windows_engine.h"
42
43
  #include "src/core/lib/event_engine/windows/windows_listener.h"
@@ -204,17 +205,17 @@ WindowsEventEngine::WindowsDNSResolver::WindowsDNSResolver(
204
205
  void WindowsEventEngine::WindowsDNSResolver::LookupHostname(
205
206
  LookupHostnameCallback on_resolve, absl::string_view name,
206
207
  absl::string_view default_port) {
207
- ares_resolver_->LookupHostname(name, default_port, std::move(on_resolve));
208
+ ares_resolver_->LookupHostname(std::move(on_resolve), name, default_port);
208
209
  }
209
210
 
210
211
  void WindowsEventEngine::WindowsDNSResolver::LookupSRV(
211
212
  LookupSRVCallback on_resolve, absl::string_view name) {
212
- ares_resolver_->LookupSRV(name, std::move(on_resolve));
213
+ ares_resolver_->LookupSRV(std::move(on_resolve), name);
213
214
  }
214
215
 
215
216
  void WindowsEventEngine::WindowsDNSResolver::LookupTXT(
216
217
  LookupTXTCallback on_resolve, absl::string_view name) {
217
- ares_resolver_->LookupTXT(name, std::move(on_resolve));
218
+ ares_resolver_->LookupTXT(std::move(on_resolve), name);
218
219
  }
219
220
 
220
221
  #endif // GRPC_ARES == 1 && defined(GRPC_WINDOWS_SOCKET_ARES_EV_DRIVER)
@@ -233,10 +234,9 @@ WindowsEventEngine::GetDNSResolver(
233
234
  return std::make_unique<WindowsEventEngine::WindowsDNSResolver>(
234
235
  std::move(*ares_resolver));
235
236
  #else // GRPC_ARES == 1 && defined(GRPC_WINDOWS_SOCKET_ARES_EV_DRIVER)
236
- // TODO(yijiem): Implement a basic A/AAAA-only native resolver in
237
- // WindowsEventEngine.
238
- (void)options;
239
- grpc_core::Crash("unimplemented");
237
+ GRPC_EVENT_ENGINE_DNS_TRACE(
238
+ "WindowsEventEngine:%p creating NativeWindowsDNSResolver", this);
239
+ return std::make_unique<NativeWindowsDNSResolver>(shared_from_this());
240
240
  #endif // GRPC_ARES == 1 && defined(GRPC_WINDOWS_SOCKET_ARES_EV_DRIVER)
241
241
  }
242
242
 
@@ -135,6 +135,19 @@ GPR_ATTRIBUTE_NOINLINE Experiments LoadExperimentsFromConfigVariable() {
135
135
  std::string(experiment).c_str());
136
136
  }
137
137
  }
138
+ for (size_t i = 0; i < kNumExperiments; i++) {
139
+ // If required experiments are not enabled, disable this one too.
140
+ for (size_t j = 0; j < g_experiment_metadata[i].num_required_experiments;
141
+ j++) {
142
+ // Require that we can check dependent requirements with a linear sweep
143
+ // (implies the experiments generator must DAG sort the experiments)
144
+ GPR_ASSERT(g_experiment_metadata[i].required_experiments[j] < i);
145
+ if (!experiments
146
+ .enabled[g_experiment_metadata[i].required_experiments[j]]) {
147
+ experiments.enabled[i] = false;
148
+ }
149
+ }
150
+ }
138
151
  return experiments;
139
152
  }
140
153
 
@@ -18,6 +18,7 @@
18
18
  #include <grpc/support/port_platform.h>
19
19
 
20
20
  #include <stddef.h>
21
+ #include <stdint.h>
21
22
 
22
23
  #include "absl/functional/any_invocable.h"
23
24
  #include "absl/strings/string_view.h"
@@ -30,6 +31,8 @@ struct ExperimentMetadata {
30
31
  const char* name;
31
32
  const char* description;
32
33
  const char* additional_constaints;
34
+ const uint8_t* required_experiments;
35
+ uint8_t num_required_experiments;
33
36
  bool default_value;
34
37
  bool allow_in_fuzzing_config;
35
38
  };