grpc 1.74.0 → 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 (369) 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_channel.c +15 -6
  187. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
  188. data/src/ruby/lib/grpc/version.rb +1 -1
  189. data/third_party/cares/cares/include/ares.h +925 -460
  190. data/third_party/cares/cares/include/ares_dns.h +86 -71
  191. data/third_party/cares/cares/include/ares_dns_record.h +1118 -0
  192. data/third_party/cares/cares/include/ares_nameser.h +215 -189
  193. data/third_party/cares/cares/include/ares_version.h +37 -14
  194. data/third_party/cares/cares/src/lib/ares_addrinfo2hostent.c +305 -0
  195. data/third_party/cares/cares/src/lib/ares_addrinfo_localhost.c +245 -0
  196. data/third_party/cares/cares/src/lib/ares_android.c +216 -164
  197. data/third_party/cares/cares/src/lib/ares_android.h +25 -14
  198. data/third_party/cares/cares/src/lib/ares_cancel.c +68 -44
  199. data/third_party/cares/cares/src/lib/ares_close_sockets.c +137 -0
  200. data/third_party/cares/cares/src/lib/ares_conn.c +511 -0
  201. data/third_party/cares/cares/src/lib/ares_conn.h +196 -0
  202. data/third_party/cares/cares/src/lib/ares_cookie.c +461 -0
  203. data/third_party/cares/cares/src/lib/ares_data.c +93 -181
  204. data/third_party/cares/cares/src/lib/ares_data.h +50 -39
  205. data/third_party/cares/cares/src/lib/ares_destroy.c +127 -89
  206. data/third_party/cares/cares/src/lib/ares_free_hostent.c +35 -24
  207. data/third_party/cares/cares/src/lib/ares_free_string.c +24 -16
  208. data/third_party/cares/cares/src/lib/ares_freeaddrinfo.c +45 -38
  209. data/third_party/cares/cares/src/lib/ares_getaddrinfo.c +549 -663
  210. data/third_party/cares/cares/src/lib/ares_getenv.c +25 -15
  211. data/third_party/cares/cares/src/lib/ares_getenv.h +26 -18
  212. data/third_party/cares/cares/src/lib/ares_gethostbyaddr.c +163 -221
  213. data/third_party/cares/cares/src/lib/ares_gethostbyname.c +222 -223
  214. data/third_party/cares/cares/src/lib/ares_getnameinfo.c +328 -338
  215. data/third_party/cares/cares/src/lib/ares_hosts_file.c +952 -0
  216. data/third_party/cares/cares/src/lib/ares_inet_net_pton.h +25 -19
  217. data/third_party/cares/cares/src/lib/ares_init.c +425 -2091
  218. data/third_party/cares/cares/src/lib/ares_ipv6.h +63 -33
  219. data/third_party/cares/cares/src/lib/ares_library_init.c +110 -54
  220. data/third_party/cares/cares/src/lib/ares_metrics.c +261 -0
  221. data/third_party/cares/cares/src/lib/ares_options.c +418 -332
  222. data/third_party/cares/cares/src/lib/ares_parse_into_addrinfo.c +179 -0
  223. data/third_party/cares/cares/src/lib/ares_private.h +558 -356
  224. data/third_party/cares/cares/src/lib/ares_process.c +1224 -1369
  225. data/third_party/cares/cares/src/lib/ares_qcache.c +430 -0
  226. data/third_party/cares/cares/src/lib/ares_query.c +126 -121
  227. data/third_party/cares/cares/src/lib/ares_search.c +564 -262
  228. data/third_party/cares/cares/src/lib/ares_send.c +264 -93
  229. data/third_party/cares/cares/src/lib/ares_set_socket_functions.c +588 -0
  230. data/third_party/cares/cares/src/lib/ares_setup.h +115 -111
  231. data/third_party/cares/cares/src/lib/ares_socket.c +425 -0
  232. data/third_party/cares/cares/src/lib/ares_socket.h +163 -0
  233. data/third_party/cares/cares/src/lib/ares_sortaddrinfo.c +447 -0
  234. data/third_party/cares/cares/src/lib/ares_strerror.c +83 -48
  235. data/third_party/cares/cares/src/lib/ares_sysconfig.c +639 -0
  236. data/third_party/cares/cares/src/lib/ares_sysconfig_files.c +839 -0
  237. data/third_party/cares/cares/src/lib/ares_sysconfig_mac.c +373 -0
  238. data/third_party/cares/cares/src/lib/ares_sysconfig_win.c +621 -0
  239. data/third_party/cares/cares/src/lib/ares_timeout.c +136 -73
  240. data/third_party/cares/cares/src/lib/ares_update_servers.c +1362 -0
  241. data/third_party/cares/cares/src/lib/ares_version.c +29 -4
  242. data/third_party/cares/cares/src/lib/config-dos.h +88 -89
  243. data/third_party/cares/cares/src/lib/config-win32.h +122 -77
  244. data/third_party/cares/cares/src/lib/dsa/ares_array.c +394 -0
  245. data/third_party/cares/cares/src/lib/dsa/ares_htable.c +447 -0
  246. data/third_party/cares/cares/src/lib/dsa/ares_htable.h +174 -0
  247. data/third_party/cares/cares/src/lib/dsa/ares_htable_asvp.c +224 -0
  248. data/third_party/cares/cares/src/lib/dsa/ares_htable_dict.c +228 -0
  249. data/third_party/cares/cares/src/lib/dsa/ares_htable_strvp.c +210 -0
  250. data/third_party/cares/cares/src/lib/dsa/ares_htable_szvp.c +188 -0
  251. data/third_party/cares/cares/src/lib/dsa/ares_htable_vpstr.c +186 -0
  252. data/third_party/cares/cares/src/lib/dsa/ares_htable_vpvp.c +194 -0
  253. data/third_party/cares/cares/src/lib/dsa/ares_llist.c +382 -0
  254. data/third_party/cares/cares/src/lib/dsa/ares_slist.c +479 -0
  255. data/third_party/cares/cares/src/lib/dsa/ares_slist.h +207 -0
  256. data/third_party/cares/cares/src/lib/event/ares_event.h +191 -0
  257. data/third_party/cares/cares/src/lib/event/ares_event_configchg.c +743 -0
  258. data/third_party/cares/cares/src/lib/event/ares_event_epoll.c +192 -0
  259. data/third_party/cares/cares/src/lib/event/ares_event_kqueue.c +248 -0
  260. data/third_party/cares/cares/src/lib/event/ares_event_poll.c +140 -0
  261. data/third_party/cares/cares/src/lib/event/ares_event_select.c +159 -0
  262. data/third_party/cares/cares/src/lib/event/ares_event_thread.c +567 -0
  263. data/third_party/cares/cares/src/lib/event/ares_event_wake_pipe.c +166 -0
  264. data/third_party/cares/cares/src/lib/event/ares_event_win32.c +978 -0
  265. data/third_party/cares/cares/src/lib/event/ares_event_win32.h +161 -0
  266. data/third_party/cares/cares/src/lib/include/ares_array.h +276 -0
  267. data/third_party/cares/cares/src/lib/include/ares_buf.h +732 -0
  268. data/third_party/cares/cares/src/lib/include/ares_htable_asvp.h +130 -0
  269. data/third_party/cares/cares/src/lib/include/ares_htable_dict.h +123 -0
  270. data/third_party/cares/cares/src/lib/include/ares_htable_strvp.h +130 -0
  271. data/third_party/cares/cares/src/lib/include/ares_htable_szvp.h +118 -0
  272. data/third_party/cares/cares/src/lib/include/ares_htable_vpstr.h +111 -0
  273. data/third_party/cares/cares/src/lib/include/ares_htable_vpvp.h +128 -0
  274. data/third_party/cares/cares/src/lib/include/ares_llist.h +239 -0
  275. data/third_party/cares/cares/src/lib/include/ares_mem.h +38 -0
  276. data/third_party/cares/cares/src/lib/include/ares_str.h +244 -0
  277. data/third_party/cares/cares/src/lib/inet_net_pton.c +202 -157
  278. data/third_party/cares/cares/src/lib/inet_ntop.c +87 -69
  279. data/third_party/cares/cares/src/lib/legacy/ares_create_query.c +78 -0
  280. data/third_party/cares/cares/src/lib/legacy/ares_expand_name.c +99 -0
  281. data/third_party/cares/cares/src/lib/legacy/ares_expand_string.c +107 -0
  282. data/third_party/cares/cares/src/lib/legacy/ares_fds.c +80 -0
  283. data/third_party/cares/cares/src/lib/legacy/ares_getsock.c +85 -0
  284. data/third_party/cares/cares/src/lib/legacy/ares_parse_a_reply.c +107 -0
  285. data/third_party/cares/cares/src/lib/legacy/ares_parse_aaaa_reply.c +109 -0
  286. data/third_party/cares/cares/src/lib/legacy/ares_parse_caa_reply.c +137 -0
  287. data/third_party/cares/cares/src/lib/legacy/ares_parse_mx_reply.c +110 -0
  288. data/third_party/cares/cares/src/lib/legacy/ares_parse_naptr_reply.c +132 -0
  289. data/third_party/cares/cares/src/lib/legacy/ares_parse_ns_reply.c +154 -0
  290. data/third_party/cares/cares/src/lib/legacy/ares_parse_ptr_reply.c +213 -0
  291. data/third_party/cares/cares/src/lib/legacy/ares_parse_soa_reply.c +115 -0
  292. data/third_party/cares/cares/src/lib/legacy/ares_parse_srv_reply.c +114 -0
  293. data/third_party/cares/cares/src/lib/legacy/ares_parse_txt_reply.c +144 -0
  294. data/third_party/cares/cares/src/lib/legacy/ares_parse_uri_reply.c +113 -0
  295. data/third_party/cares/cares/src/lib/record/ares_dns_mapping.c +982 -0
  296. data/third_party/cares/cares/src/lib/record/ares_dns_multistring.c +307 -0
  297. data/third_party/cares/cares/src/lib/record/ares_dns_multistring.h +72 -0
  298. data/third_party/cares/cares/src/lib/record/ares_dns_name.c +673 -0
  299. data/third_party/cares/cares/src/lib/record/ares_dns_parse.c +1329 -0
  300. data/third_party/cares/cares/src/lib/record/ares_dns_private.h +273 -0
  301. data/third_party/cares/cares/src/lib/record/ares_dns_record.c +1661 -0
  302. data/third_party/cares/cares/src/lib/record/ares_dns_write.c +1229 -0
  303. data/third_party/cares/cares/src/lib/str/ares_buf.c +1498 -0
  304. data/third_party/cares/cares/src/lib/str/ares_str.c +508 -0
  305. data/third_party/cares/cares/src/lib/str/ares_strsplit.c +90 -0
  306. data/third_party/cares/cares/src/lib/str/ares_strsplit.h +51 -0
  307. data/third_party/cares/cares/src/lib/thirdparty/apple/dnsinfo.h +122 -0
  308. data/third_party/cares/cares/src/lib/util/ares_iface_ips.c +628 -0
  309. data/third_party/cares/cares/src/lib/util/ares_iface_ips.h +139 -0
  310. data/third_party/cares/cares/src/lib/util/ares_math.c +158 -0
  311. data/third_party/cares/cares/src/lib/util/ares_math.h +45 -0
  312. data/third_party/cares/cares/src/lib/util/ares_rand.c +389 -0
  313. data/third_party/cares/cares/src/lib/util/ares_rand.h +36 -0
  314. data/third_party/cares/cares/src/lib/util/ares_threads.c +614 -0
  315. data/third_party/cares/cares/src/lib/util/ares_threads.h +60 -0
  316. data/third_party/cares/cares/src/lib/util/ares_time.h +48 -0
  317. data/third_party/cares/cares/src/lib/util/ares_timeval.c +95 -0
  318. data/third_party/cares/cares/src/lib/util/ares_uri.c +1626 -0
  319. data/third_party/cares/cares/src/lib/util/ares_uri.h +252 -0
  320. data/third_party/cares/cares/src/lib/windows_port.c +16 -9
  321. metadata +121 -49
  322. data/src/core/util/ring_buffer.h +0 -122
  323. data/third_party/cares/cares/include/ares_rules.h +0 -125
  324. data/third_party/cares/cares/src/lib/ares__addrinfo2hostent.c +0 -266
  325. data/third_party/cares/cares/src/lib/ares__addrinfo_localhost.c +0 -240
  326. data/third_party/cares/cares/src/lib/ares__close_sockets.c +0 -61
  327. data/third_party/cares/cares/src/lib/ares__get_hostent.c +0 -260
  328. data/third_party/cares/cares/src/lib/ares__parse_into_addrinfo.c +0 -229
  329. data/third_party/cares/cares/src/lib/ares__read_line.c +0 -73
  330. data/third_party/cares/cares/src/lib/ares__readaddrinfo.c +0 -258
  331. data/third_party/cares/cares/src/lib/ares__sortaddrinfo.c +0 -507
  332. data/third_party/cares/cares/src/lib/ares__timeval.c +0 -111
  333. data/third_party/cares/cares/src/lib/ares_create_query.c +0 -197
  334. data/third_party/cares/cares/src/lib/ares_expand_name.c +0 -311
  335. data/third_party/cares/cares/src/lib/ares_expand_string.c +0 -67
  336. data/third_party/cares/cares/src/lib/ares_fds.c +0 -59
  337. data/third_party/cares/cares/src/lib/ares_getsock.c +0 -66
  338. data/third_party/cares/cares/src/lib/ares_iphlpapi.h +0 -221
  339. data/third_party/cares/cares/src/lib/ares_llist.c +0 -63
  340. data/third_party/cares/cares/src/lib/ares_llist.h +0 -39
  341. data/third_party/cares/cares/src/lib/ares_mkquery.c +0 -24
  342. data/third_party/cares/cares/src/lib/ares_nowarn.c +0 -260
  343. data/third_party/cares/cares/src/lib/ares_nowarn.h +0 -61
  344. data/third_party/cares/cares/src/lib/ares_parse_a_reply.c +0 -90
  345. data/third_party/cares/cares/src/lib/ares_parse_aaaa_reply.c +0 -92
  346. data/third_party/cares/cares/src/lib/ares_parse_caa_reply.c +0 -199
  347. data/third_party/cares/cares/src/lib/ares_parse_mx_reply.c +0 -164
  348. data/third_party/cares/cares/src/lib/ares_parse_naptr_reply.c +0 -183
  349. data/third_party/cares/cares/src/lib/ares_parse_ns_reply.c +0 -177
  350. data/third_party/cares/cares/src/lib/ares_parse_ptr_reply.c +0 -228
  351. data/third_party/cares/cares/src/lib/ares_parse_soa_reply.c +0 -179
  352. data/third_party/cares/cares/src/lib/ares_parse_srv_reply.c +0 -168
  353. data/third_party/cares/cares/src/lib/ares_parse_txt_reply.c +0 -214
  354. data/third_party/cares/cares/src/lib/ares_parse_uri_reply.c +0 -184
  355. data/third_party/cares/cares/src/lib/ares_platform.c +0 -11042
  356. data/third_party/cares/cares/src/lib/ares_platform.h +0 -43
  357. data/third_party/cares/cares/src/lib/ares_rand.c +0 -279
  358. data/third_party/cares/cares/src/lib/ares_strcasecmp.c +0 -66
  359. data/third_party/cares/cares/src/lib/ares_strcasecmp.h +0 -30
  360. data/third_party/cares/cares/src/lib/ares_strdup.c +0 -42
  361. data/third_party/cares/cares/src/lib/ares_strdup.h +0 -24
  362. data/third_party/cares/cares/src/lib/ares_strsplit.c +0 -94
  363. data/third_party/cares/cares/src/lib/ares_strsplit.h +0 -42
  364. data/third_party/cares/cares/src/lib/ares_writev.c +0 -79
  365. data/third_party/cares/cares/src/lib/ares_writev.h +0 -36
  366. data/third_party/cares/cares/src/lib/bitncmp.c +0 -59
  367. data/third_party/cares/cares/src/lib/bitncmp.h +0 -26
  368. data/third_party/cares/cares/src/lib/setup_once.h +0 -554
  369. 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