grpc 1.74.1 → 1.75.0.pre1

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 (368) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +83 -41
  3. data/include/grpc/credentials.h +7 -1
  4. data/src/core/call/client_call.cc +4 -4
  5. data/src/core/call/filter_fusion.h +1230 -0
  6. data/src/core/call/metadata.cc +22 -0
  7. data/src/core/call/metadata.h +24 -2
  8. data/src/core/channelz/channelz.cc +10 -17
  9. data/src/core/channelz/channelz.h +58 -19
  10. data/src/core/channelz/channelz_registry.cc +0 -162
  11. data/src/core/channelz/channelz_registry.h +14 -7
  12. data/src/core/channelz/property_list.cc +19 -23
  13. data/src/core/channelz/property_list.h +3 -1
  14. data/src/core/channelz/v2tov1/convert.cc +683 -0
  15. data/src/core/channelz/v2tov1/convert.h +58 -0
  16. data/src/core/channelz/v2tov1/legacy_api.cc +425 -0
  17. data/src/core/channelz/v2tov1/legacy_api.h +32 -0
  18. data/src/core/channelz/v2tov1/property_list.cc +118 -0
  19. data/src/core/channelz/v2tov1/property_list.h +52 -0
  20. data/src/core/client_channel/client_channel_filter.cc +5 -4
  21. data/src/core/client_channel/client_channel_filter.h +2 -2
  22. data/src/core/client_channel/client_channel_internal.h +2 -1
  23. data/src/core/client_channel/load_balanced_call_destination.cc +6 -5
  24. data/src/core/client_channel/subchannel.cc +14 -6
  25. data/src/core/client_channel/subchannel.h +2 -0
  26. data/src/core/config/core_configuration.cc +3 -1
  27. data/src/core/config/core_configuration.h +12 -0
  28. data/src/core/credentials/transport/alts/alts_credentials.cc +5 -0
  29. data/src/core/credentials/transport/alts/check_gcp_environment_windows.cc +2 -0
  30. data/src/core/credentials/transport/channel_creds_registry_init.cc +3 -1
  31. data/src/core/credentials/transport/ssl/ssl_credentials.cc +1 -1
  32. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +8 -3
  33. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +29 -24
  34. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +19 -8
  35. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +96 -54
  36. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +15 -2
  37. data/src/core/credentials/transport/tls/spiffe_utils.cc +371 -0
  38. data/src/core/credentials/transport/tls/spiffe_utils.h +171 -0
  39. data/src/core/credentials/transport/tls/ssl_utils.cc +11 -10
  40. data/src/core/credentials/transport/tls/ssl_utils.h +4 -2
  41. data/src/core/credentials/transport/tls/tls_credentials.cc +2 -0
  42. data/src/core/credentials/transport/tls/tls_security_connector.cc +11 -26
  43. data/src/core/credentials/transport/tls/tls_security_connector.h +12 -12
  44. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +1 -2
  45. data/src/core/ext/filters/http/client/http_client_filter.cc +3 -6
  46. data/src/core/ext/filters/http/client_authority_filter.cc +1 -2
  47. data/src/core/ext/filters/http/message_compress/compression_filter.cc +8 -8
  48. data/src/core/ext/filters/http/server/http_server_filter.cc +3 -6
  49. data/src/core/ext/filters/message_size/message_size_filter.cc +4 -4
  50. data/src/core/ext/filters/rbac/rbac_filter.cc +1 -1
  51. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +3 -5
  52. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +3 -2
  53. data/src/core/ext/transport/chttp2/transport/flow_control.cc +1 -0
  54. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -0
  55. data/src/core/ext/transport/chttp2/transport/frame.cc +89 -6
  56. data/src/core/ext/transport/chttp2/transport/frame.h +38 -0
  57. data/src/core/ext/transport/chttp2/transport/header_assembler.h +5 -14
  58. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +4 -1
  59. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +294 -78
  60. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +128 -9
  61. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +11 -38
  62. data/src/core/ext/transport/chttp2/transport/http2_settings.h +52 -35
  63. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.cc +61 -0
  64. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.h +142 -0
  65. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +81 -3
  66. data/src/core/ext/transport/chttp2/transport/http2_transport.h +12 -1
  67. data/src/core/ext/transport/chttp2/transport/message_assembler.h +2 -2
  68. data/src/core/ext/transport/chttp2/transport/parsing.cc +2 -1
  69. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +2 -1
  70. data/src/core/ext/transport/chttp2/transport/ping_promise.h +22 -5
  71. data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +607 -0
  72. data/src/core/ext/transport/chttp2/transport/writable_streams.h +254 -0
  73. data/src/core/ext/transport/chttp2/transport/writing.cc +6 -4
  74. data/src/core/ext/upb-gen/src/proto/grpc/channelz/channelz.upb.h +4959 -0
  75. data/src/core/ext/upb-gen/src/proto/grpc/channelz/channelz.upb_minitable.c +1111 -0
  76. data/src/core/ext/upb-gen/src/proto/grpc/channelz/channelz.upb_minitable.h +108 -0
  77. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb.h +142 -54
  78. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.c +18 -14
  79. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.h +2 -2
  80. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/channelz.upbdefs.c +716 -0
  81. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/channelz.upbdefs.h +227 -0
  82. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.c +86 -88
  83. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.h +2 -2
  84. data/src/core/filter/auth/auth_filters.h +2 -2
  85. data/src/core/filter/fused_filters.cc +154 -0
  86. data/src/core/handshaker/security/legacy_secure_endpoint.cc +1 -1
  87. data/src/core/handshaker/security/pipelined_secure_endpoint.cc +965 -0
  88. data/src/core/handshaker/security/secure_endpoint.cc +28 -13
  89. data/src/core/handshaker/security/secure_endpoint.h +8 -0
  90. data/src/core/lib/channel/promise_based_filter.cc +15 -25
  91. data/src/core/lib/channel/promise_based_filter.h +6 -5
  92. data/src/core/lib/event_engine/ares_resolver.h +3 -1
  93. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +9 -5
  94. data/src/core/lib/event_engine/cf_engine/cf_engine.h +2 -1
  95. data/src/core/lib/event_engine/cf_engine/cfsocket_listener.cc +263 -0
  96. data/src/core/lib/event_engine/cf_engine/cfsocket_listener.h +107 -0
  97. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +31 -3
  98. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +12 -0
  99. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +12 -10
  100. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +6 -4
  101. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +15 -14
  102. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +7 -5
  103. data/src/core/lib/event_engine/posix_engine/event_poller.h +0 -8
  104. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +11 -5
  105. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.h +3 -2
  106. data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +1 -0
  107. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +4 -4
  108. data/src/core/lib/event_engine/posix_engine/lockfree_event.h +3 -4
  109. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +2 -2
  110. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +188 -199
  111. data/src/core/lib/event_engine/posix_engine/posix_engine.h +30 -45
  112. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +1 -1
  113. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +1 -1
  114. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +2 -1
  115. data/src/core/lib/experiments/experiments.cc +120 -6
  116. data/src/core/lib/experiments/experiments.h +46 -3
  117. data/src/core/lib/iomgr/combiner.cc +1 -1
  118. data/src/core/lib/iomgr/exec_ctx.h +3 -9
  119. data/src/core/lib/iomgr/socket_mutator.cc +1 -1
  120. data/src/core/lib/iomgr/socket_utils_posix.cc +1 -1
  121. data/src/core/lib/iomgr/socket_utils_posix.h +1 -1
  122. data/src/core/lib/iomgr/tcp_client_posix.cc +1 -1
  123. data/src/core/lib/iomgr/tcp_posix.cc +3 -3
  124. data/src/core/lib/promise/activity.h +2 -2
  125. data/src/core/lib/promise/mpsc.cc +8 -8
  126. data/src/core/lib/promise/party.cc +7 -7
  127. data/src/core/lib/promise/party.h +4 -4
  128. data/src/core/lib/promise/poll.h +10 -0
  129. data/src/core/lib/resource_quota/memory_quota.cc +90 -3
  130. data/src/core/lib/resource_quota/memory_quota.h +20 -9
  131. data/src/core/lib/resource_quota/periodic_update.cc +14 -0
  132. data/src/core/lib/resource_quota/periodic_update.h +8 -0
  133. data/src/core/lib/resource_quota/resource_quota.cc +15 -4
  134. data/src/core/lib/resource_quota/resource_quota.h +3 -0
  135. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +1 -2
  136. data/src/core/lib/surface/call.cc +5 -5
  137. data/src/core/lib/surface/call.h +6 -5
  138. data/src/core/lib/surface/completion_queue.cc +2 -4
  139. data/src/core/lib/surface/filter_stack_call.cc +1 -1
  140. data/src/core/lib/surface/version.cc +2 -2
  141. data/src/core/lib/transport/promise_endpoint.cc +2 -2
  142. data/src/core/lib/transport/promise_endpoint.h +3 -3
  143. data/src/core/load_balancing/endpoint_list.cc +29 -2
  144. data/src/core/load_balancing/grpclb/client_load_reporting_filter.cc +3 -3
  145. data/src/core/load_balancing/grpclb/client_load_reporting_filter.h +1 -1
  146. data/src/core/load_balancing/pick_first/pick_first.cc +12 -5
  147. data/src/core/load_balancing/xds/xds_cluster_impl.cc +5 -3
  148. data/src/core/net/socket_mutator.cc +19 -0
  149. data/src/core/net/socket_mutator.h +25 -0
  150. data/src/core/plugin_registry/grpc_plugin_registry.cc +6 -0
  151. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver.h +6 -1
  152. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +2 -1
  153. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +8 -5
  154. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.h +2 -1
  155. data/src/core/resolver/xds/xds_dependency_manager.cc +1 -1
  156. data/src/core/server/server.cc +1 -1
  157. data/src/core/server/server_call_tracer_filter.cc +0 -66
  158. data/src/core/server/server_call_tracer_filter.h +64 -0
  159. data/src/core/server/server_config_selector_filter.cc +1 -1
  160. data/src/core/service_config/service_config_channel_arg_filter.cc +3 -60
  161. data/src/core/service_config/service_config_channel_arg_filter.h +82 -0
  162. data/src/core/telemetry/call_tracer.cc +20 -14
  163. data/src/core/telemetry/call_tracer.h +22 -17
  164. data/src/core/telemetry/metrics.h +8 -8
  165. data/src/core/telemetry/stats_data.cc +151 -151
  166. data/src/core/telemetry/stats_data.h +87 -87
  167. data/src/core/transport/auth_context.cc +20 -0
  168. data/src/core/transport/auth_context.h +4 -0
  169. data/src/core/transport/auth_context_comparator_registry.h +69 -0
  170. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +2 -3
  171. data/src/core/tsi/ssl_transport_security.cc +202 -32
  172. data/src/core/tsi/ssl_transport_security.h +19 -10
  173. data/src/core/tsi/ssl_transport_security_utils.cc +21 -0
  174. data/src/core/tsi/ssl_transport_security_utils.h +4 -0
  175. data/src/core/util/http_client/httpcli_security_connector.cc +3 -1
  176. data/src/core/util/latent_see.cc +178 -146
  177. data/src/core/util/latent_see.h +245 -188
  178. data/src/core/util/single_set_ptr.h +5 -2
  179. data/src/core/util/useful.h +91 -0
  180. data/src/core/util/windows/directory_reader.cc +1 -0
  181. data/src/core/util/windows/thd.cc +1 -3
  182. data/src/core/util/work_serializer.cc +1 -1
  183. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.cc +32 -5
  184. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.h +5 -0
  185. data/src/core/xds/grpc/xds_certificate_provider.cc +5 -6
  186. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
  187. data/src/ruby/lib/grpc/version.rb +1 -1
  188. data/third_party/cares/cares/include/ares.h +925 -460
  189. data/third_party/cares/cares/include/ares_dns.h +86 -71
  190. data/third_party/cares/cares/include/ares_dns_record.h +1118 -0
  191. data/third_party/cares/cares/include/ares_nameser.h +215 -189
  192. data/third_party/cares/cares/include/ares_version.h +37 -14
  193. data/third_party/cares/cares/src/lib/ares_addrinfo2hostent.c +305 -0
  194. data/third_party/cares/cares/src/lib/ares_addrinfo_localhost.c +245 -0
  195. data/third_party/cares/cares/src/lib/ares_android.c +216 -164
  196. data/third_party/cares/cares/src/lib/ares_android.h +25 -14
  197. data/third_party/cares/cares/src/lib/ares_cancel.c +68 -44
  198. data/third_party/cares/cares/src/lib/ares_close_sockets.c +137 -0
  199. data/third_party/cares/cares/src/lib/ares_conn.c +511 -0
  200. data/third_party/cares/cares/src/lib/ares_conn.h +196 -0
  201. data/third_party/cares/cares/src/lib/ares_cookie.c +461 -0
  202. data/third_party/cares/cares/src/lib/ares_data.c +93 -181
  203. data/third_party/cares/cares/src/lib/ares_data.h +50 -39
  204. data/third_party/cares/cares/src/lib/ares_destroy.c +127 -89
  205. data/third_party/cares/cares/src/lib/ares_free_hostent.c +35 -24
  206. data/third_party/cares/cares/src/lib/ares_free_string.c +24 -16
  207. data/third_party/cares/cares/src/lib/ares_freeaddrinfo.c +45 -38
  208. data/third_party/cares/cares/src/lib/ares_getaddrinfo.c +549 -663
  209. data/third_party/cares/cares/src/lib/ares_getenv.c +25 -15
  210. data/third_party/cares/cares/src/lib/ares_getenv.h +26 -18
  211. data/third_party/cares/cares/src/lib/ares_gethostbyaddr.c +163 -221
  212. data/third_party/cares/cares/src/lib/ares_gethostbyname.c +222 -223
  213. data/third_party/cares/cares/src/lib/ares_getnameinfo.c +328 -338
  214. data/third_party/cares/cares/src/lib/ares_hosts_file.c +952 -0
  215. data/third_party/cares/cares/src/lib/ares_inet_net_pton.h +25 -19
  216. data/third_party/cares/cares/src/lib/ares_init.c +425 -2091
  217. data/third_party/cares/cares/src/lib/ares_ipv6.h +63 -33
  218. data/third_party/cares/cares/src/lib/ares_library_init.c +110 -54
  219. data/third_party/cares/cares/src/lib/ares_metrics.c +261 -0
  220. data/third_party/cares/cares/src/lib/ares_options.c +418 -332
  221. data/third_party/cares/cares/src/lib/ares_parse_into_addrinfo.c +179 -0
  222. data/third_party/cares/cares/src/lib/ares_private.h +558 -356
  223. data/third_party/cares/cares/src/lib/ares_process.c +1224 -1369
  224. data/third_party/cares/cares/src/lib/ares_qcache.c +430 -0
  225. data/third_party/cares/cares/src/lib/ares_query.c +126 -121
  226. data/third_party/cares/cares/src/lib/ares_search.c +564 -262
  227. data/third_party/cares/cares/src/lib/ares_send.c +264 -93
  228. data/third_party/cares/cares/src/lib/ares_set_socket_functions.c +588 -0
  229. data/third_party/cares/cares/src/lib/ares_setup.h +115 -111
  230. data/third_party/cares/cares/src/lib/ares_socket.c +425 -0
  231. data/third_party/cares/cares/src/lib/ares_socket.h +163 -0
  232. data/third_party/cares/cares/src/lib/ares_sortaddrinfo.c +447 -0
  233. data/third_party/cares/cares/src/lib/ares_strerror.c +83 -48
  234. data/third_party/cares/cares/src/lib/ares_sysconfig.c +639 -0
  235. data/third_party/cares/cares/src/lib/ares_sysconfig_files.c +839 -0
  236. data/third_party/cares/cares/src/lib/ares_sysconfig_mac.c +373 -0
  237. data/third_party/cares/cares/src/lib/ares_sysconfig_win.c +621 -0
  238. data/third_party/cares/cares/src/lib/ares_timeout.c +136 -73
  239. data/third_party/cares/cares/src/lib/ares_update_servers.c +1362 -0
  240. data/third_party/cares/cares/src/lib/ares_version.c +29 -4
  241. data/third_party/cares/cares/src/lib/config-dos.h +88 -89
  242. data/third_party/cares/cares/src/lib/config-win32.h +122 -77
  243. data/third_party/cares/cares/src/lib/dsa/ares_array.c +394 -0
  244. data/third_party/cares/cares/src/lib/dsa/ares_htable.c +447 -0
  245. data/third_party/cares/cares/src/lib/dsa/ares_htable.h +174 -0
  246. data/third_party/cares/cares/src/lib/dsa/ares_htable_asvp.c +224 -0
  247. data/third_party/cares/cares/src/lib/dsa/ares_htable_dict.c +228 -0
  248. data/third_party/cares/cares/src/lib/dsa/ares_htable_strvp.c +210 -0
  249. data/third_party/cares/cares/src/lib/dsa/ares_htable_szvp.c +188 -0
  250. data/third_party/cares/cares/src/lib/dsa/ares_htable_vpstr.c +186 -0
  251. data/third_party/cares/cares/src/lib/dsa/ares_htable_vpvp.c +194 -0
  252. data/third_party/cares/cares/src/lib/dsa/ares_llist.c +382 -0
  253. data/third_party/cares/cares/src/lib/dsa/ares_slist.c +479 -0
  254. data/third_party/cares/cares/src/lib/dsa/ares_slist.h +207 -0
  255. data/third_party/cares/cares/src/lib/event/ares_event.h +191 -0
  256. data/third_party/cares/cares/src/lib/event/ares_event_configchg.c +743 -0
  257. data/third_party/cares/cares/src/lib/event/ares_event_epoll.c +192 -0
  258. data/third_party/cares/cares/src/lib/event/ares_event_kqueue.c +248 -0
  259. data/third_party/cares/cares/src/lib/event/ares_event_poll.c +140 -0
  260. data/third_party/cares/cares/src/lib/event/ares_event_select.c +159 -0
  261. data/third_party/cares/cares/src/lib/event/ares_event_thread.c +567 -0
  262. data/third_party/cares/cares/src/lib/event/ares_event_wake_pipe.c +166 -0
  263. data/third_party/cares/cares/src/lib/event/ares_event_win32.c +978 -0
  264. data/third_party/cares/cares/src/lib/event/ares_event_win32.h +161 -0
  265. data/third_party/cares/cares/src/lib/include/ares_array.h +276 -0
  266. data/third_party/cares/cares/src/lib/include/ares_buf.h +732 -0
  267. data/third_party/cares/cares/src/lib/include/ares_htable_asvp.h +130 -0
  268. data/third_party/cares/cares/src/lib/include/ares_htable_dict.h +123 -0
  269. data/third_party/cares/cares/src/lib/include/ares_htable_strvp.h +130 -0
  270. data/third_party/cares/cares/src/lib/include/ares_htable_szvp.h +118 -0
  271. data/third_party/cares/cares/src/lib/include/ares_htable_vpstr.h +111 -0
  272. data/third_party/cares/cares/src/lib/include/ares_htable_vpvp.h +128 -0
  273. data/third_party/cares/cares/src/lib/include/ares_llist.h +239 -0
  274. data/third_party/cares/cares/src/lib/include/ares_mem.h +38 -0
  275. data/third_party/cares/cares/src/lib/include/ares_str.h +244 -0
  276. data/third_party/cares/cares/src/lib/inet_net_pton.c +202 -157
  277. data/third_party/cares/cares/src/lib/inet_ntop.c +87 -69
  278. data/third_party/cares/cares/src/lib/legacy/ares_create_query.c +78 -0
  279. data/third_party/cares/cares/src/lib/legacy/ares_expand_name.c +99 -0
  280. data/third_party/cares/cares/src/lib/legacy/ares_expand_string.c +107 -0
  281. data/third_party/cares/cares/src/lib/legacy/ares_fds.c +80 -0
  282. data/third_party/cares/cares/src/lib/legacy/ares_getsock.c +85 -0
  283. data/third_party/cares/cares/src/lib/legacy/ares_parse_a_reply.c +107 -0
  284. data/third_party/cares/cares/src/lib/legacy/ares_parse_aaaa_reply.c +109 -0
  285. data/third_party/cares/cares/src/lib/legacy/ares_parse_caa_reply.c +137 -0
  286. data/third_party/cares/cares/src/lib/legacy/ares_parse_mx_reply.c +110 -0
  287. data/third_party/cares/cares/src/lib/legacy/ares_parse_naptr_reply.c +132 -0
  288. data/third_party/cares/cares/src/lib/legacy/ares_parse_ns_reply.c +154 -0
  289. data/third_party/cares/cares/src/lib/legacy/ares_parse_ptr_reply.c +213 -0
  290. data/third_party/cares/cares/src/lib/legacy/ares_parse_soa_reply.c +115 -0
  291. data/third_party/cares/cares/src/lib/legacy/ares_parse_srv_reply.c +114 -0
  292. data/third_party/cares/cares/src/lib/legacy/ares_parse_txt_reply.c +144 -0
  293. data/third_party/cares/cares/src/lib/legacy/ares_parse_uri_reply.c +113 -0
  294. data/third_party/cares/cares/src/lib/record/ares_dns_mapping.c +982 -0
  295. data/third_party/cares/cares/src/lib/record/ares_dns_multistring.c +307 -0
  296. data/third_party/cares/cares/src/lib/record/ares_dns_multistring.h +72 -0
  297. data/third_party/cares/cares/src/lib/record/ares_dns_name.c +673 -0
  298. data/third_party/cares/cares/src/lib/record/ares_dns_parse.c +1329 -0
  299. data/third_party/cares/cares/src/lib/record/ares_dns_private.h +273 -0
  300. data/third_party/cares/cares/src/lib/record/ares_dns_record.c +1661 -0
  301. data/third_party/cares/cares/src/lib/record/ares_dns_write.c +1229 -0
  302. data/third_party/cares/cares/src/lib/str/ares_buf.c +1498 -0
  303. data/third_party/cares/cares/src/lib/str/ares_str.c +508 -0
  304. data/third_party/cares/cares/src/lib/str/ares_strsplit.c +90 -0
  305. data/third_party/cares/cares/src/lib/str/ares_strsplit.h +51 -0
  306. data/third_party/cares/cares/src/lib/thirdparty/apple/dnsinfo.h +122 -0
  307. data/third_party/cares/cares/src/lib/util/ares_iface_ips.c +628 -0
  308. data/third_party/cares/cares/src/lib/util/ares_iface_ips.h +139 -0
  309. data/third_party/cares/cares/src/lib/util/ares_math.c +158 -0
  310. data/third_party/cares/cares/src/lib/util/ares_math.h +45 -0
  311. data/third_party/cares/cares/src/lib/util/ares_rand.c +389 -0
  312. data/third_party/cares/cares/src/lib/util/ares_rand.h +36 -0
  313. data/third_party/cares/cares/src/lib/util/ares_threads.c +614 -0
  314. data/third_party/cares/cares/src/lib/util/ares_threads.h +60 -0
  315. data/third_party/cares/cares/src/lib/util/ares_time.h +48 -0
  316. data/third_party/cares/cares/src/lib/util/ares_timeval.c +95 -0
  317. data/third_party/cares/cares/src/lib/util/ares_uri.c +1626 -0
  318. data/third_party/cares/cares/src/lib/util/ares_uri.h +252 -0
  319. data/third_party/cares/cares/src/lib/windows_port.c +16 -9
  320. metadata +121 -49
  321. data/src/core/util/ring_buffer.h +0 -122
  322. data/third_party/cares/cares/include/ares_rules.h +0 -125
  323. data/third_party/cares/cares/src/lib/ares__addrinfo2hostent.c +0 -266
  324. data/third_party/cares/cares/src/lib/ares__addrinfo_localhost.c +0 -240
  325. data/third_party/cares/cares/src/lib/ares__close_sockets.c +0 -61
  326. data/third_party/cares/cares/src/lib/ares__get_hostent.c +0 -260
  327. data/third_party/cares/cares/src/lib/ares__parse_into_addrinfo.c +0 -229
  328. data/third_party/cares/cares/src/lib/ares__read_line.c +0 -73
  329. data/third_party/cares/cares/src/lib/ares__readaddrinfo.c +0 -258
  330. data/third_party/cares/cares/src/lib/ares__sortaddrinfo.c +0 -507
  331. data/third_party/cares/cares/src/lib/ares__timeval.c +0 -111
  332. data/third_party/cares/cares/src/lib/ares_create_query.c +0 -197
  333. data/third_party/cares/cares/src/lib/ares_expand_name.c +0 -311
  334. data/third_party/cares/cares/src/lib/ares_expand_string.c +0 -67
  335. data/third_party/cares/cares/src/lib/ares_fds.c +0 -59
  336. data/third_party/cares/cares/src/lib/ares_getsock.c +0 -66
  337. data/third_party/cares/cares/src/lib/ares_iphlpapi.h +0 -221
  338. data/third_party/cares/cares/src/lib/ares_llist.c +0 -63
  339. data/third_party/cares/cares/src/lib/ares_llist.h +0 -39
  340. data/third_party/cares/cares/src/lib/ares_mkquery.c +0 -24
  341. data/third_party/cares/cares/src/lib/ares_nowarn.c +0 -260
  342. data/third_party/cares/cares/src/lib/ares_nowarn.h +0 -61
  343. data/third_party/cares/cares/src/lib/ares_parse_a_reply.c +0 -90
  344. data/third_party/cares/cares/src/lib/ares_parse_aaaa_reply.c +0 -92
  345. data/third_party/cares/cares/src/lib/ares_parse_caa_reply.c +0 -199
  346. data/third_party/cares/cares/src/lib/ares_parse_mx_reply.c +0 -164
  347. data/third_party/cares/cares/src/lib/ares_parse_naptr_reply.c +0 -183
  348. data/third_party/cares/cares/src/lib/ares_parse_ns_reply.c +0 -177
  349. data/third_party/cares/cares/src/lib/ares_parse_ptr_reply.c +0 -228
  350. data/third_party/cares/cares/src/lib/ares_parse_soa_reply.c +0 -179
  351. data/third_party/cares/cares/src/lib/ares_parse_srv_reply.c +0 -168
  352. data/third_party/cares/cares/src/lib/ares_parse_txt_reply.c +0 -214
  353. data/third_party/cares/cares/src/lib/ares_parse_uri_reply.c +0 -184
  354. data/third_party/cares/cares/src/lib/ares_platform.c +0 -11042
  355. data/third_party/cares/cares/src/lib/ares_platform.h +0 -43
  356. data/third_party/cares/cares/src/lib/ares_rand.c +0 -279
  357. data/third_party/cares/cares/src/lib/ares_strcasecmp.c +0 -66
  358. data/third_party/cares/cares/src/lib/ares_strcasecmp.h +0 -30
  359. data/third_party/cares/cares/src/lib/ares_strdup.c +0 -42
  360. data/third_party/cares/cares/src/lib/ares_strdup.h +0 -24
  361. data/third_party/cares/cares/src/lib/ares_strsplit.c +0 -94
  362. data/third_party/cares/cares/src/lib/ares_strsplit.h +0 -42
  363. data/third_party/cares/cares/src/lib/ares_writev.c +0 -79
  364. data/third_party/cares/cares/src/lib/ares_writev.h +0 -36
  365. data/third_party/cares/cares/src/lib/bitncmp.c +0 -59
  366. data/third_party/cares/cares/src/lib/bitncmp.h +0 -26
  367. data/third_party/cares/cares/src/lib/setup_once.h +0 -554
  368. data/third_party/cares/cares/src/tools/ares_getopt.h +0 -53
@@ -186,11 +186,13 @@ class FrameProtector : public RefCounted<FrameProtector> {
186
186
 
187
187
  absl::Status Unprotect(absl::Status read_status)
188
188
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(read_mu_) {
189
+ GRPC_LATENT_SEE_ALWAYS_ON_SCOPE("unprotect");
190
+
189
191
  if (shutdown_) {
190
192
  return absl::CancelledError("secure endpoint shutdown");
191
193
  }
192
194
 
193
- GRPC_LATENT_SEE_INNER_SCOPE("unprotect");
195
+ GRPC_TRACE_LOG(secure_endpoint, INFO) << "Starting unprotect for " << this;
194
196
  bool keep_looping = false;
195
197
  tsi_result result = TSI_OK;
196
198
 
@@ -321,7 +323,8 @@ class FrameProtector : public RefCounted<FrameProtector> {
321
323
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(write_mu_) {
322
324
  if (shutdown_) return TSI_FAILED_PRECONDITION;
323
325
 
324
- GRPC_LATENT_SEE_INNER_SCOPE("protect");
326
+ GRPC_LATENT_SEE_ALWAYS_ON_SCOPE("protect");
327
+ GRPC_TRACE_LOG(secure_endpoint, INFO) << "Starting protect for " << this;
325
328
  uint8_t* cur = GRPC_SLICE_START_PTR(write_staging_buffer_);
326
329
  uint8_t* end = GRPC_SLICE_END_PTR(write_staging_buffer_);
327
330
 
@@ -416,6 +419,10 @@ class FrameProtector : public RefCounted<FrameProtector> {
416
419
  }
417
420
  // TODO(yangg) do different things according to the error type?
418
421
  if (result != TSI_OK) output_buffer_.Clear();
422
+
423
+ GRPC_TRACE_LOG(secure_endpoint, INFO)
424
+ << "Protect: " << this << " result: " << result;
425
+
419
426
  return result;
420
427
  }
421
428
 
@@ -583,7 +590,7 @@ static void on_write(void* user_data, grpc_error_handle error) {
583
590
  static void endpoint_write(
584
591
  grpc_endpoint* secure_ep, grpc_slice_buffer* slices, grpc_closure* cb,
585
592
  grpc_event_engine::experimental::EventEngine::Endpoint::WriteArgs args) {
586
- GRPC_LATENT_SEE_INNER_SCOPE("secure_endpoint write");
593
+ GRPC_LATENT_SEE_ALWAYS_ON_SCOPE("secure_endpoint write");
587
594
  secure_endpoint* ep = reinterpret_cast<secure_endpoint*>(secure_ep);
588
595
  tsi_result result;
589
596
  {
@@ -800,7 +807,7 @@ class SecureEndpoint final : public EventEngine::Endpoint {
800
807
 
801
808
  bool Write(absl::AnyInvocable<void(absl::Status)> on_writable,
802
809
  SliceBuffer* data, WriteArgs args) {
803
- GRPC_LATENT_SEE_INNER_SCOPE("secure_endpoint write");
810
+ GRPC_LATENT_SEE_ALWAYS_ON_SCOPE("secure_endpoint write");
804
811
  tsi_result result;
805
812
  frame_protector_.TraceOp("Write", data->c_slice_buffer());
806
813
  if (grpc_core::IsSecureEndpointOffloadLargeWritesEnabled()) {
@@ -887,6 +894,8 @@ class SecureEndpoint final : public EventEngine::Endpoint {
887
894
  grpc_core::MutexLock read_lock(frame_protector_.read_mu());
888
895
  wrapped_ep = std::move(wrapped_ep_);
889
896
  frame_protector_.Shutdown();
897
+ GRPC_TRACE_LOG(secure_endpoint, INFO)
898
+ << "Shutdown for secure endpoint: " << this;
890
899
  }
891
900
 
892
901
  std::shared_ptr<TelemetryInfo> GetTelemetryInfo() const {
@@ -896,7 +905,7 @@ class SecureEndpoint final : public EventEngine::Endpoint {
896
905
 
897
906
  private:
898
907
  bool MaybeFinishReadImmediately() {
899
- GRPC_LATENT_SEE_INNER_SCOPE("secure_endpoint maybe finish read");
908
+ GRPC_LATENT_SEE_ALWAYS_ON_SCOPE("secure_endpoint maybe finish read");
900
909
  grpc_core::MutexLock lock(frame_protector_.read_mu());
901
910
  // If the read is large, since we got the bytes whilst still calling read,
902
911
  // offload the decryption to event engine.
@@ -927,7 +936,7 @@ class SecureEndpoint final : public EventEngine::Endpoint {
927
936
 
928
937
  static void FinishAsyncRead(grpc_core::RefCountedPtr<Impl> impl,
929
938
  absl::Status status) {
930
- GRPC_LATENT_SEE_PARENT_SCOPE("secure endpoint finish async read");
939
+ GRPC_LATENT_SEE_ALWAYS_ON_SCOPE("secure endpoint finish async read");
931
940
  {
932
941
  grpc_core::MutexLock lock(impl->frame_protector_.read_mu());
933
942
  if (status.ok() && impl->wrapped_ep_ == nullptr) {
@@ -962,7 +971,7 @@ class SecureEndpoint final : public EventEngine::Endpoint {
962
971
  };
963
972
 
964
973
  static void FinishAsyncWrite(grpc_core::RefCountedPtr<Impl> impl) {
965
- GRPC_LATENT_SEE_PARENT_SCOPE("secure endpoint finish async write");
974
+ GRPC_LATENT_SEE_ALWAYS_ON_SCOPE("secure endpoint finish async write");
966
975
  tsi_result result;
967
976
  std::unique_ptr<SliceBuffer> data;
968
977
  WriteArgs args;
@@ -1067,12 +1076,18 @@ grpc_core::OrphanablePtr<grpc_endpoint> grpc_secure_endpoint_create(
1067
1076
  event_engine_endpoint = grpc_event_engine::experimental::
1068
1077
  grpc_take_wrapped_event_engine_endpoint(to_wrap.release());
1069
1078
  CHECK(event_engine_endpoint != nullptr);
1070
- return grpc_core::OrphanablePtr<grpc_endpoint>(
1071
- grpc_event_engine::experimental::grpc_event_engine_endpoint_create(
1072
- std::make_unique<grpc_event_engine::experimental::SecureEndpoint>(
1073
- std::move(event_engine_endpoint), protector,
1074
- zero_copy_protector, leftover_slices, leftover_nslices,
1075
- channel_args)));
1079
+ if (grpc_core::IsPipelinedReadSecureEndpointEnabled()) {
1080
+ return grpc_pipelined_secure_endpoint_create(
1081
+ protector, zero_copy_protector, std::move(event_engine_endpoint),
1082
+ leftover_slices, channel_args, leftover_nslices);
1083
+ } else {
1084
+ return grpc_core::OrphanablePtr<grpc_endpoint>(
1085
+ grpc_event_engine::experimental::grpc_event_engine_endpoint_create(
1086
+ std::make_unique<grpc_event_engine::experimental::SecureEndpoint>(
1087
+ std::move(event_engine_endpoint), protector,
1088
+ zero_copy_protector, leftover_slices, leftover_nslices,
1089
+ channel_args)));
1090
+ }
1076
1091
  }
1077
1092
  return grpc_core::MakeOrphanable<secure_endpoint>(
1078
1093
  &vtable, protector, zero_copy_protector, std::move(to_wrap),
@@ -55,4 +55,12 @@ grpc_core::OrphanablePtr<grpc_endpoint> grpc_legacy_secure_endpoint_create(
55
55
  grpc_slice* leftover_slices, const grpc_channel_args* channel_args,
56
56
  size_t leftover_nslices);
57
57
 
58
+ grpc_core::OrphanablePtr<grpc_endpoint> grpc_pipelined_secure_endpoint_create(
59
+ struct tsi_frame_protector* protector,
60
+ struct tsi_zero_copy_grpc_protector* zero_copy_protector,
61
+ std::unique_ptr<grpc_event_engine::experimental::EventEngine::Endpoint>
62
+ to_wrap,
63
+ grpc_slice* leftover_slices, const grpc_core::ChannelArgs& channel_args,
64
+ size_t leftover_nslices);
65
+
58
66
  #endif // GRPC_SRC_CORE_HANDSHAKER_SECURITY_SECURE_ENDPOINT_H
@@ -242,8 +242,7 @@ void BaseCallData::CapturedBatch::CancelWith(grpc_error_handle error,
242
242
  ///////////////////////////////////////////////////////////////////////////////
243
243
  // BaseCallData::Flusher
244
244
 
245
- BaseCallData::Flusher::Flusher(BaseCallData* call, latent_see::Metadata* desc)
246
- : latent_see::InnerScope(desc), call_(call) {
245
+ BaseCallData::Flusher::Flusher(BaseCallData* call) : call_(call) {
247
246
  GRPC_CALL_STACK_REF(call_->call_stack(), "flusher");
248
247
  }
249
248
 
@@ -395,7 +394,7 @@ bool BaseCallData::SendMessage::IsIdle() const {
395
394
  }
396
395
 
397
396
  void BaseCallData::SendMessage::OnComplete(absl::Status status) {
398
- Flusher flusher(base_, GRPC_LATENT_SEE_METADATA("SendMessage::OnComplete"));
397
+ Flusher flusher(base_);
399
398
  GRPC_TRACE_LOG(channel, INFO)
400
399
  << base_->LogTag() << " SendMessage.OnComplete st=" << StateString(state_)
401
400
  << " status=" << status;
@@ -705,8 +704,7 @@ void BaseCallData::ReceiveMessage::OnComplete(absl::Status status) {
705
704
  break;
706
705
  }
707
706
  completed_status_ = status;
708
- Flusher flusher(base_,
709
- GRPC_LATENT_SEE_METADATA("ReceiveMessage::OnComplete"));
707
+ Flusher flusher(base_);
710
708
  ScopedContext ctx(base_);
711
709
  base_->WakeInsideCombiner(&flusher);
712
710
  }
@@ -1220,9 +1218,7 @@ class ClientCallData::PollContext {
1220
1218
  auto* next_poll = static_cast<NextPoll*>(p);
1221
1219
  {
1222
1220
  ScopedContext ctx(next_poll->call_data);
1223
- Flusher flusher(next_poll->call_data,
1224
- GRPC_LATENT_SEE_METADATA(
1225
- "ClientCallData::PollContext::~PollContext"));
1221
+ Flusher flusher(next_poll->call_data);
1226
1222
  next_poll->call_data->WakeInsideCombiner(&flusher);
1227
1223
  }
1228
1224
  GRPC_CALL_STACK_UNREF(next_poll->call_stack, "re-poll");
@@ -1351,7 +1347,7 @@ void ClientCallData::StartBatch(grpc_transport_stream_op_batch* b) {
1351
1347
  // Fake out the activity based context.
1352
1348
  ScopedContext context(this);
1353
1349
  CapturedBatch batch(b);
1354
- Flusher flusher(this, GRPC_LATENT_SEE_METADATA("ClientCallData::StartBatch"));
1350
+ Flusher flusher(this);
1355
1351
 
1356
1352
  GRPC_TRACE_LOG(channel, INFO) << LogTag() << " StartBatch " << DebugString();
1357
1353
 
@@ -1557,8 +1553,7 @@ void ClientCallData::RecvInitialMetadataReady(grpc_error_handle error) {
1557
1553
  << DebugString() << " error:" << error.ToString()
1558
1554
  << " md:" << recv_initial_metadata_->metadata->DebugString();
1559
1555
  ScopedContext context(this);
1560
- Flusher flusher(this, GRPC_LATENT_SEE_METADATA(
1561
- "ClientCallData::RecvInitialMetadataReady"));
1556
+ Flusher flusher(this);
1562
1557
  if (!error.ok()) {
1563
1558
  switch (recv_initial_metadata_->state) {
1564
1559
  case RecvInitialMetadata::kHookedWaitingForPipe:
@@ -1744,8 +1739,7 @@ void ClientCallData::RecvTrailingMetadataReadyCallback(
1744
1739
  }
1745
1740
 
1746
1741
  void ClientCallData::RecvTrailingMetadataReady(grpc_error_handle error) {
1747
- Flusher flusher(this, GRPC_LATENT_SEE_METADATA(
1748
- "ClientCallData::RecvTrailingMetadataReady"));
1742
+ Flusher flusher(this);
1749
1743
  GRPC_TRACE_LOG(channel, INFO)
1750
1744
  << LogTag() << " ClientCallData.RecvTrailingMetadataReady "
1751
1745
  << "recv_trailing_state=" << StateString(recv_trailing_state_)
@@ -1796,12 +1790,12 @@ void ClientCallData::SetStatusFromError(grpc_metadata_batch* metadata,
1796
1790
 
1797
1791
  // Wakeup and poll the promise if appropriate.
1798
1792
  void ClientCallData::WakeInsideCombiner(Flusher* flusher) {
1799
- GRPC_LATENT_SEE_INNER_SCOPE("ClientCallData::WakeInsideCombiner");
1793
+ GRPC_LATENT_SEE_SCOPE("ClientCallData::WakeInsideCombiner");
1800
1794
  PollContext(this, flusher).Run();
1801
1795
  }
1802
1796
 
1803
1797
  void ClientCallData::OnWakeup() {
1804
- Flusher flusher(this, GRPC_LATENT_SEE_METADATA("ClientCallData::OnWakeup"));
1798
+ Flusher flusher(this);
1805
1799
  ScopedContext context(this);
1806
1800
  WakeInsideCombiner(&flusher);
1807
1801
  }
@@ -1877,9 +1871,7 @@ class ServerCallData::PollContext {
1877
1871
  auto run = [](void* p, grpc_error_handle) {
1878
1872
  auto* next_poll = static_cast<NextPoll*>(p);
1879
1873
  {
1880
- Flusher flusher(next_poll->call_data,
1881
- GRPC_LATENT_SEE_METADATA(
1882
- "ServerCallData::PollContext::~PollContext"));
1874
+ Flusher flusher(next_poll->call_data);
1883
1875
  ScopedContext context(next_poll->call_data);
1884
1876
  next_poll->call_data->WakeInsideCombiner(&flusher);
1885
1877
  }
@@ -1983,7 +1975,7 @@ void ServerCallData::StartBatch(grpc_transport_stream_op_batch* b) {
1983
1975
  // Fake out the activity based context.
1984
1976
  ScopedContext context(this);
1985
1977
  CapturedBatch batch(b);
1986
- Flusher flusher(this, GRPC_LATENT_SEE_METADATA("ServerCallData::StartBatch"));
1978
+ Flusher flusher(this);
1987
1979
  bool wake = false;
1988
1980
 
1989
1981
  GRPC_TRACE_LOG(channel, INFO) << LogTag() << " StartBatch: " << DebugString();
@@ -2272,8 +2264,7 @@ void ServerCallData::RecvTrailingMetadataReady(grpc_error_handle error) {
2272
2264
  GRPC_TRACE_LOG(channel, INFO)
2273
2265
  << LogTag() << ": RecvTrailingMetadataReady error=" << error
2274
2266
  << " md=" << recv_trailing_metadata_->DebugString();
2275
- Flusher flusher(this, GRPC_LATENT_SEE_METADATA(
2276
- "ServerCallData::RecvTrailingMetadataReady"));
2267
+ Flusher flusher(this);
2277
2268
  PollContext poll_ctx(this, &flusher);
2278
2269
  Completed(error, recv_trailing_metadata_->get(GrpcTarPit()).has_value(),
2279
2270
  &flusher);
@@ -2287,8 +2278,7 @@ void ServerCallData::RecvInitialMetadataReadyCallback(void* arg,
2287
2278
  }
2288
2279
 
2289
2280
  void ServerCallData::RecvInitialMetadataReady(grpc_error_handle error) {
2290
- Flusher flusher(this, GRPC_LATENT_SEE_METADATA(
2291
- "ServerCallData::RecvInitialMetadataReady"));
2281
+ Flusher flusher(this);
2292
2282
  GRPC_TRACE_LOG(channel, INFO)
2293
2283
  << LogTag() << ": RecvInitialMetadataReady " << error;
2294
2284
  CHECK(recv_initial_state_ == RecvInitialState::kForwarded);
@@ -2351,7 +2341,7 @@ std::string ServerCallData::DebugString() const {
2351
2341
 
2352
2342
  // Wakeup and poll the promise if appropriate.
2353
2343
  void ServerCallData::WakeInsideCombiner(Flusher* flusher) {
2354
- GRPC_LATENT_SEE_INNER_SCOPE("ServerCallData::WakeInsideCombiner");
2344
+ GRPC_LATENT_SEE_SCOPE("ServerCallData::WakeInsideCombiner");
2355
2345
  PollContext poll_ctx(this, flusher);
2356
2346
  GRPC_TRACE_LOG(channel, INFO)
2357
2347
  << LogTag() << ": WakeInsideCombiner " << DebugString();
@@ -2503,7 +2493,7 @@ void ServerCallData::WakeInsideCombiner(Flusher* flusher) {
2503
2493
  }
2504
2494
 
2505
2495
  void ServerCallData::OnWakeup() {
2506
- Flusher flusher(this, GRPC_LATENT_SEE_METADATA("ServerCallData::OnWakeup"));
2496
+ Flusher flusher(this);
2507
2497
  ScopedContext context(this);
2508
2498
  WakeInsideCombiner(&flusher);
2509
2499
  }
@@ -196,7 +196,10 @@ struct CallHasAsyncErrorInterceptor<
196
196
  template <typename Derived>
197
197
  struct CallHasAsyncErrorInterceptor<
198
198
  Derived, std::enable_if_t<IsFusedFilter<Derived>::value>> {
199
- static constexpr bool value = Derived::FusedFilterHasAsyncErrorInterceptor();
199
+ // Fused filter types return a promise, which resolves to a
200
+ // ServerMetadataHandle type. So we assume that an async error interceptor is
201
+ // always needed.
202
+ static constexpr bool value = true;
200
203
  };
201
204
 
202
205
  // Given a boolean X export a type:
@@ -1304,11 +1307,9 @@ class BaseCallData : public Activity, private Wakeable {
1304
1307
  }
1305
1308
  };
1306
1309
 
1307
- class Flusher : public latent_see::InnerScope {
1310
+ class Flusher {
1308
1311
  public:
1309
- explicit Flusher(BaseCallData* call,
1310
- latent_see::Metadata* desc = GRPC_LATENT_SEE_METADATA(
1311
- "PromiseBasedFilter::Flusher"));
1312
+ explicit Flusher(BaseCallData* call);
1312
1313
  // Calls closures, schedules batches, relinquishes call combiner.
1313
1314
  ~Flusher();
1314
1315
 
@@ -22,8 +22,10 @@
22
22
 
23
23
  #if GRPC_ARES == 1
24
24
 
25
- #include <ares.h>
26
25
  #include <grpc/event_engine/event_engine.h>
26
+ // ares.h is not self-contained w.r.t. windows headers so pull in
27
+ // event_engine.h first
28
+ #include <ares.h>
27
29
 
28
30
  #include <list>
29
31
  #include <memory>
@@ -24,6 +24,7 @@
24
24
  #include "absl/log/check.h"
25
25
  #include "absl/log/log.h"
26
26
  #include "src/core/lib/event_engine/cf_engine/cf_engine.h"
27
+ #include "src/core/lib/event_engine/cf_engine/cfsocket_listener.h"
27
28
  #include "src/core/lib/event_engine/cf_engine/cfstream_endpoint.h"
28
29
  #include "src/core/lib/event_engine/cf_engine/dns_service_resolver.h"
29
30
  #include "src/core/lib/event_engine/posix_engine/timer_manager.h"
@@ -81,11 +82,14 @@ CFEventEngine::~CFEventEngine() {
81
82
 
82
83
  absl::StatusOr<std::unique_ptr<EventEngine::Listener>>
83
84
  CFEventEngine::CreateListener(
84
- Listener::AcceptCallback /* on_accept */,
85
- absl::AnyInvocable<void(absl::Status)> /* on_shutdown */,
86
- const EndpointConfig& /* config */,
87
- std::unique_ptr<MemoryAllocatorFactory> /* memory_allocator_factory */) {
88
- grpc_core::Crash("unimplemented");
85
+ Listener::AcceptCallback on_accept,
86
+ absl::AnyInvocable<void(absl::Status)> on_shutdown,
87
+ const EndpointConfig& config,
88
+ std::unique_ptr<MemoryAllocatorFactory> memory_allocator_factory) {
89
+ return std::make_unique<CFSocketListener>(
90
+ std::static_pointer_cast<CFEventEngine>(shared_from_this()),
91
+ std::move(on_accept), std::move(on_shutdown), config,
92
+ std::move(memory_allocator_factory));
89
93
  }
90
94
 
91
95
  CFEventEngine::ConnectionHandle CFEventEngine::Connect(
@@ -30,7 +30,7 @@
30
30
 
31
31
  namespace grpc_event_engine::experimental {
32
32
 
33
- class CFEventEngine : public EventEngine, public Scheduler {
33
+ class CFEventEngine : public EventEngine {
34
34
  public:
35
35
  CFEventEngine();
36
36
  ~CFEventEngine() override;
@@ -57,6 +57,7 @@ class CFEventEngine : public EventEngine, public Scheduler {
57
57
  TaskHandle RunAfter(Duration when,
58
58
  absl::AnyInvocable<void()> closure) override;
59
59
  bool Cancel(TaskHandle handle) override;
60
+ ThreadPool* thread_pool() const { return thread_pool_.get(); }
60
61
 
61
62
  private:
62
63
  struct Closure;
@@ -0,0 +1,263 @@
1
+ // Copyright 2025 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
+ #ifdef GPR_APPLE
18
+ #include <AvailabilityMacros.h>
19
+ #ifdef AVAILABLE_MAC_OS_X_VERSION_10_12_AND_LATER
20
+
21
+ #include <netinet/in.h>
22
+ #include <sys/socket.h>
23
+
24
+ #include "src/core/lib/debug/trace_flags.h"
25
+ #include "src/core/lib/debug/trace_impl.h"
26
+ #include "src/core/lib/event_engine/cf_engine/cfsocket_listener.h"
27
+ #include "src/core/lib/event_engine/cf_engine/cfstream_endpoint.h"
28
+ #include "src/core/lib/event_engine/tcp_socket_utils.h"
29
+ #include "src/core/util/strerror.h"
30
+
31
+ namespace grpc_event_engine::experimental {
32
+
33
+ namespace {
34
+
35
+ auto GetCfSocketResolvedAddress6(CFSocketRef ipv6cfsock) {
36
+ CFTypeUniqueRef<CFDataRef> sin6cfd = CFSocketCopyAddress(ipv6cfsock);
37
+ auto sin6 = reinterpret_cast<const sockaddr*>(CFDataGetBytePtr(sin6cfd));
38
+ return EventEngine::ResolvedAddress{sin6, sin6->sa_len};
39
+ }
40
+
41
+ } // namespace
42
+
43
+ CFSocketListenerImpl::CFSocketListenerImpl(
44
+ std::shared_ptr<CFEventEngine> engine,
45
+ EventEngine::Listener::AcceptCallback on_accept,
46
+ absl::AnyInvocable<void(absl::Status)> on_shutdown,
47
+ const EndpointConfig& config,
48
+ std::unique_ptr<MemoryAllocatorFactory> memory_allocator_factory)
49
+ : engine_(std::move(engine)),
50
+ on_accept_(std::move(on_accept)),
51
+ on_shutdown_(std::move(on_shutdown)),
52
+ memory_allocator_factory_(std::move(memory_allocator_factory)) {}
53
+
54
+ CFSocketListenerImpl::~CFSocketListenerImpl() {
55
+ on_shutdown_(absl::OkStatus());
56
+ dispatch_release(queue_);
57
+
58
+ GRPC_TRACE_LOG(event_engine, INFO)
59
+ << "CFSocketListenerImpl::~CFSocketListenerImpl, this: " << this;
60
+ }
61
+
62
+ void CFSocketListenerImpl::Shutdown() {
63
+ GRPC_TRACE_LOG(event_engine, INFO)
64
+ << "CFSocketListenerImpl::Shutdown: this: " << this;
65
+
66
+ grpc_core::MutexLock lock(&mu_);
67
+
68
+ shutdown_ = true;
69
+ for (auto& [ipv6cfsock] : ipv6cfsocks_) {
70
+ CFSocketInvalidate(ipv6cfsock);
71
+ }
72
+ if (runloop_) {
73
+ CFRunLoopWakeUp(runloop_);
74
+ CFRunLoopStop(runloop_);
75
+ }
76
+ }
77
+
78
+ absl::StatusOr<int> CFSocketListenerImpl::Bind(
79
+ const EventEngine::ResolvedAddress& addr) {
80
+ grpc_core::MutexLock lock(&mu_);
81
+
82
+ if (started_) {
83
+ return absl::FailedPreconditionError(
84
+ "Listener is already started, ports can no longer be bound");
85
+ }
86
+ CHECK(addr.size() <= EventEngine::ResolvedAddress::MAX_SIZE_BYTES);
87
+
88
+ int port = ResolvedAddressGetPort(addr);
89
+ // if port is not specified, reuse any listening port
90
+ if (port == 0) {
91
+ for (auto& [ipv6cfsock] : ipv6cfsocks_) {
92
+ auto bind_addr = GetCfSocketResolvedAddress6(ipv6cfsock);
93
+ int bind_port = ResolvedAddressGetPort(bind_addr);
94
+ if (bind_port > 0) {
95
+ port = bind_port;
96
+ break;
97
+ }
98
+ }
99
+ }
100
+
101
+ EventEngine::ResolvedAddress addr6;
102
+ // treat :: or 0.0.0.0 as a family-agnostic wildcard.
103
+ if (MaybeGetWildcardPortFromAddress(addr).has_value()) {
104
+ addr6 = ResolvedAddressMakeWild6(port);
105
+ }
106
+ // convert to ipv6 if needed
107
+ if (!ResolvedAddressToV4Mapped(addr, &addr6)) {
108
+ addr6 = addr;
109
+ }
110
+ // update port
111
+ ResolvedAddressSetPort(addr6, port);
112
+
113
+ // open socket
114
+ CFSocketContext ipv6cfsock_context = {0, this, Retain, Release, nullptr};
115
+ auto ipv6cfsock = CFSocketCreate(kCFAllocatorDefault, PF_INET6, SOCK_STREAM,
116
+ IPPROTO_TCP, kCFSocketAcceptCallBack,
117
+ handleConnect, &ipv6cfsock_context);
118
+
119
+ // allow reuse of the address and port
120
+ auto sin6_fd = CFSocketGetNative(ipv6cfsock);
121
+ int sock_flag = 1;
122
+ int err = setsockopt(sin6_fd, SOL_SOCKET, SO_REUSEADDR, &sock_flag,
123
+ sizeof(sock_flag));
124
+ if (err != 0) {
125
+ return absl::InternalError(absl::StrCat(
126
+ "CFSocketListenerImpl::Bind, setsockopt(SO_REUSEADDR) errors: ",
127
+ grpc_core::StrError(errno)));
128
+ }
129
+ err = setsockopt(sin6_fd, SOL_SOCKET, SO_REUSEPORT, &sock_flag,
130
+ sizeof(sock_flag));
131
+ if (err != 0) {
132
+ return absl::InternalError(absl::StrCat(
133
+ "CFSocketListenerImpl::Bind, setsockopt(SO_REUSEPORT) errors: ",
134
+ grpc_core::StrError(errno)));
135
+ }
136
+
137
+ // bind socket to address
138
+ CFTypeUniqueRef<CFDataRef> sin6cfd =
139
+ CFDataCreate(kCFAllocatorDefault, (UInt8*)addr6.address(), addr6.size());
140
+ CFSocketError cf_error = CFSocketSetAddress(ipv6cfsock, sin6cfd);
141
+ if (cf_error != kCFSocketSuccess) {
142
+ return absl::InternalError(absl::StrCat(
143
+ "CFSocketListenerImpl::Bind, CFSocketSetAddress error: ", cf_error));
144
+ }
145
+
146
+ // find actual bind address and port
147
+ auto bind_addr = GetCfSocketResolvedAddress6(ipv6cfsock);
148
+ int bind_port = ResolvedAddressGetPort(bind_addr);
149
+
150
+ ipv6cfsocks_.emplace_back(ipv6cfsock);
151
+
152
+ GRPC_TRACE_LOG(event_engine, INFO)
153
+ << "CFSocketListenerImpl::Bind, addr: "
154
+ << ResolvedAddressToString(addr).value_or("")
155
+ << ", bind_addr: " << ResolvedAddressToString(bind_addr).value_or("")
156
+ << ", this: " << this;
157
+
158
+ return bind_port;
159
+ }
160
+
161
+ absl::Status CFSocketListenerImpl::Start() {
162
+ grpc_core::MutexLock lock(&mu_);
163
+
164
+ CHECK(!started_);
165
+ started_ = true;
166
+
167
+ dispatch_async_f(queue_, Ref().release(), [](void* thatPtr) {
168
+ grpc_core::RefCountedPtr<CFSocketListenerImpl> that{
169
+ static_cast<CFSocketListenerImpl*>(thatPtr)};
170
+
171
+ GRPC_TRACE_LOG(event_engine, INFO)
172
+ << "CFSocketListenerImpl::Start, running CFRunLoop"
173
+ << ", this: " << thatPtr;
174
+
175
+ {
176
+ grpc_core::MutexLock lock(&that->mu_);
177
+ if (that->shutdown_) {
178
+ return;
179
+ }
180
+
181
+ that->runloop_ = CFRunLoopGetCurrent();
182
+ for (auto& [ipv6cfsock] : that->ipv6cfsocks_) {
183
+ CFTypeUniqueRef<CFRunLoopSourceRef> ipv6cfsock_source =
184
+ CFSocketCreateRunLoopSource(kCFAllocatorDefault, ipv6cfsock, 0);
185
+ CFRunLoopAddSource(CFRunLoopGetCurrent(), ipv6cfsock_source,
186
+ kCFRunLoopDefaultMode);
187
+ }
188
+ }
189
+
190
+ CFRunLoopRun();
191
+
192
+ GRPC_TRACE_LOG(event_engine, INFO)
193
+ << "CFSocketListenerImpl::Start, CFRunLoop stopped"
194
+ << ", this: " << thatPtr;
195
+ });
196
+
197
+ return absl::OkStatus();
198
+ }
199
+
200
+ /* static */
201
+ void CFSocketListenerImpl::handleConnect(CFSocketRef s,
202
+ CFSocketCallBackType type,
203
+ CFDataRef address, const void* data,
204
+ void* info) {
205
+ CFSocketListenerImpl* self = static_cast<CFSocketListenerImpl*>(info);
206
+
207
+ switch (type) {
208
+ case kCFSocketAcceptCallBack: {
209
+ std::string peer_name = "unknown";
210
+ auto peer_sin6 =
211
+ reinterpret_cast<const sockaddr*>(CFDataGetBytePtr(address));
212
+ auto peer_addr =
213
+ EventEngine::ResolvedAddress(peer_sin6, peer_sin6->sa_len);
214
+ auto addr_uri = ResolvedAddressToURI(peer_addr);
215
+ if (!addr_uri.ok()) {
216
+ GRPC_TRACE_LOG(event_engine, ERROR)
217
+ << "invalid peer name: " << addr_uri.status() << ", this: " << self;
218
+ } else {
219
+ peer_name = *addr_uri;
220
+ }
221
+
222
+ auto socketHandle = *static_cast<const CFSocketNativeHandle*>(data);
223
+ auto endpoint = std::make_unique<CFStreamEndpoint>(
224
+ self->engine_,
225
+ self->memory_allocator_factory_->CreateMemoryAllocator(
226
+ absl::StrCat("endpoint-tcp-server-connection: ", peer_name)));
227
+
228
+ endpoint->AcceptSocket(
229
+ [that = self->Ref(), socketHandle, peer_name = std::move(peer_name),
230
+ endpoint = std::move(endpoint)](absl::Status status) mutable {
231
+ if (!status.ok()) {
232
+ GRPC_TRACE_LOG(event_engine, ERROR)
233
+ << "CFSocketListenerImpl::handleConnect, accept failed: "
234
+ << status << ", this: " << that.get();
235
+ return;
236
+ }
237
+
238
+ that->on_accept_(
239
+ std::move(endpoint),
240
+ that->memory_allocator_factory_->CreateMemoryAllocator(
241
+ absl::StrCat("on-accept-tcp-server-connection: ",
242
+ peer_name)));
243
+ GRPC_TRACE_LOG(event_engine, INFO)
244
+ << "CFSocketListenerImpl::handleConnect, accepted socket: "
245
+ << socketHandle << ", peer_name: " << peer_name
246
+ << ", this: " << that.get();
247
+ },
248
+ socketHandle, peer_addr);
249
+
250
+ break;
251
+ }
252
+ default:
253
+ GRPC_TRACE_LOG(event_engine, ERROR)
254
+ << "CFSocketListenerImpl::handleConnect, unexpected type: " << type
255
+ << ", this: " << self;
256
+ break;
257
+ }
258
+ }
259
+
260
+ } // namespace grpc_event_engine::experimental
261
+
262
+ #endif // AVAILABLE_MAC_OS_X_VERSION_10_12_AND_LATER
263
+ #endif // GPR_APPLE