grpc 1.83.1 → 1.84.0

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 (322) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +21 -17
  3. data/include/grpc/credentials.h +10 -0
  4. data/include/grpc/grpc_security_constants.h +2 -0
  5. data/include/grpc/impl/channel_arg_names.h +9 -0
  6. data/src/core/call/call_filters.h +4 -2
  7. data/src/core/call/client_call.cc +20 -8
  8. data/src/core/call/client_call.h +4 -0
  9. data/src/core/call/interception_chain.cc +2 -0
  10. data/src/core/call/interception_chain.h +14 -1
  11. data/src/core/call/metadata.cc +1 -3
  12. data/src/core/call/metadata_batch.h +13 -5
  13. data/src/core/call/server_call.cc +31 -14
  14. data/src/core/call/server_call.h +4 -0
  15. data/src/core/channelz/text_encode.cc +9 -4
  16. data/src/core/channelz/v2tov1/convert.cc +2 -2
  17. data/src/core/client_channel/backup_poller.cc +1 -2
  18. data/src/core/client_channel/client_channel.cc +6 -33
  19. data/src/core/client_channel/client_channel_filter.cc +22 -55
  20. data/src/core/client_channel/client_channel_filter.h +2 -2
  21. data/src/core/client_channel/client_channel_service_config.cc +3 -19
  22. data/src/core/client_channel/direct_channel.cc +7 -1
  23. data/src/core/client_channel/direct_channel.h +2 -2
  24. data/src/core/client_channel/load_balanced_call_destination.cc +5 -3
  25. data/src/core/client_channel/retry_filter_legacy_call_data.cc +5 -12
  26. data/src/core/client_channel/subchannel.cc +310 -1058
  27. data/src/core/client_channel/subchannel.h +44 -329
  28. data/src/core/client_channel/subchannel_metrics.cc +48 -0
  29. data/src/core/client_channel/subchannel_metrics.h +60 -0
  30. data/src/core/credentials/call/external/file_external_account_credentials.cc +1 -1
  31. data/src/core/credentials/call/external/url_external_account_credentials.cc +2 -3
  32. data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.cc +8 -24
  33. data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.h +3 -6
  34. data/src/core/credentials/call/gdch_service_account/gdch_service_account_credentials.cc +525 -0
  35. data/src/core/credentials/call/gdch_service_account/gdch_service_account_credentials.h +138 -0
  36. data/src/core/credentials/call/json_util.h +1 -0
  37. data/src/core/credentials/call/jwt/json_token.cc +10 -2
  38. data/src/core/credentials/call/jwt/jwt_verifier.cc +15 -1
  39. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.cc +1 -1
  40. data/src/core/credentials/call/oauth2/oauth2_credentials.cc +42 -79
  41. data/src/core/credentials/call/oauth2/oauth2_credentials.h +2 -5
  42. data/src/core/credentials/call/token_fetcher/token_fetcher_credentials.cc +52 -31
  43. data/src/core/credentials/call/token_fetcher/token_fetcher_credentials.h +21 -8
  44. data/src/core/credentials/transport/google_default/google_default_credentials.cc +3 -4
  45. data/src/core/credentials/transport/ssl/ssl_credentials.cc +59 -72
  46. data/src/core/credentials/transport/ssl/ssl_credentials.h +9 -8
  47. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +12 -6
  48. data/src/core/credentials/transport/ssl/ssl_security_connector.h +4 -4
  49. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +29 -18
  50. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +9 -6
  51. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +45 -56
  52. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +5 -4
  53. data/src/core/credentials/transport/tls/grpc_tls_certificate_selector.h +26 -0
  54. data/src/core/credentials/transport/tls/grpc_tls_crl_provider.cc +1 -1
  55. data/src/core/credentials/transport/tls/load_system_roots.h +2 -6
  56. data/src/core/credentials/transport/tls/load_system_roots_fallback.cc +2 -4
  57. data/src/core/credentials/transport/tls/load_system_roots_supported.cc +13 -15
  58. data/src/core/credentials/transport/tls/load_system_roots_supported.h +3 -2
  59. data/src/core/credentials/transport/tls/load_system_roots_windows.cc +5 -8
  60. data/src/core/credentials/transport/tls/spiffe_utils.cc +1 -1
  61. data/src/core/credentials/transport/tls/ssl_utils.cc +39 -28
  62. data/src/core/credentials/transport/tls/ssl_utils.h +12 -49
  63. data/src/core/credentials/transport/tls/tls_security_connector.cc +48 -33
  64. data/src/core/credentials/transport/tls/tls_security_connector.h +31 -10
  65. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +15 -11
  66. data/src/core/ext/filters/http/http_filters_plugin.cc +20 -9
  67. data/src/core/ext/filters/rbac/rbac_filter.cc +43 -21
  68. data/src/core/ext/filters/rbac/rbac_filter.h +21 -3
  69. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +2 -2
  70. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +1 -1
  71. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +6 -20
  72. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +32 -67
  73. data/src/core/ext/transport/chttp2/transport/flow_control.cc +2 -0
  74. data/src/core/ext/transport/chttp2/transport/flow_control.h +78 -4
  75. data/src/core/ext/transport/chttp2/transport/frame.h +2 -0
  76. data/src/core/ext/transport/chttp2/transport/frame_data.cc +3 -4
  77. data/src/core/ext/transport/chttp2/transport/goaway.h +7 -0
  78. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +5 -3
  79. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +3 -1
  80. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +141 -130
  81. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +22 -22
  82. data/src/core/ext/transport/chttp2/transport/http2_server_transport.cc +402 -269
  83. data/src/core/ext/transport/chttp2/transport/http2_server_transport.h +80 -49
  84. data/src/core/ext/transport/chttp2/transport/http2_settings_promises.h +1 -2
  85. data/src/core/ext/transport/chttp2/transport/http2_status.h +38 -37
  86. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +178 -5
  87. data/src/core/ext/transport/chttp2/transport/http2_transport.h +345 -5
  88. data/src/core/ext/transport/chttp2/transport/parsing.cc +5 -5
  89. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +3 -2
  90. data/src/core/ext/transport/chttp2/transport/ping_promise.h +25 -5
  91. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +3 -4
  92. data/src/core/ext/transport/chttp2/transport/read_context.h +30 -3
  93. data/src/core/ext/transport/chttp2/transport/stream.h +65 -23
  94. data/src/core/ext/transport/chttp2/transport/writing.cc +0 -3
  95. data/src/core/ext/transport/inproc/inproc_transport.cc +1 -5
  96. data/src/core/ext/transport/inproc/legacy_inproc_transport.cc +4 -17
  97. data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/ext_proc.upb.h +1912 -0
  98. data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/ext_proc.upb_minitable.c +300 -0
  99. data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/ext_proc.upb_minitable.h +37 -0
  100. data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/processing_mode.upb.h +187 -0
  101. data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/processing_mode.upb_minitable.c +64 -0
  102. data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/processing_mode.upb_minitable.h +31 -0
  103. data/src/core/ext/upb-gen/envoy/service/ext_proc/v3/external_processor.upb.h +2362 -0
  104. data/src/core/ext/upb-gen/envoy/service/ext_proc/v3/external_processor.upb_minitable.c +556 -0
  105. data/src/core/ext/upb-gen/envoy/service/ext_proc/v3/external_processor.upb_minitable.h +47 -0
  106. data/src/core/ext/upb-gen/{src/proto/grpc/channelz → grpc/channelz/v1}/channelz.upb.h +5 -5
  107. data/src/core/ext/upb-gen/{src/proto/grpc/channelz → grpc/channelz/v1}/channelz.upb_minitable.c +3 -3
  108. data/src/core/ext/upb-gen/{src/proto/grpc/channelz → grpc/channelz/v1}/channelz.upb_minitable.h +5 -5
  109. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/ext_proc/v3/ext_proc.upbdefs.c +453 -0
  110. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/ext_proc/v3/ext_proc.upbdefs.h +67 -0
  111. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/ext_proc/v3/processing_mode.upbdefs.c +142 -0
  112. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/ext_proc/v3/processing_mode.upbdefs.h +37 -0
  113. data/src/core/ext/upbdefs-gen/grpc/channelz/v1/channelz.upbdefs.c +715 -0
  114. data/src/core/ext/upbdefs-gen/{src/proto/grpc/channelz → grpc/channelz/v1}/channelz.upbdefs.h +44 -44
  115. data/src/core/filter/auth/server_auth_filter.cc +2 -3
  116. data/src/core/filter/composite/composite_filter.cc +45 -33
  117. data/src/core/filter/composite/composite_filter.h +5 -4
  118. data/src/core/filter/ext_proc/ext_proc_filter.cc +224 -0
  119. data/src/core/filter/ext_proc/ext_proc_filter.h +155 -0
  120. data/src/core/filter/ext_proc/ext_proc_messages.cc +701 -0
  121. data/src/core/filter/ext_proc/ext_proc_messages.h +297 -0
  122. data/src/core/filter/filter_args.h +13 -2
  123. data/src/core/handshaker/http_connect/http_proxy_mapper.cc +30 -3
  124. data/src/core/handshaker/security/security_handshaker.cc +9 -6
  125. data/src/core/lib/channel/channel_stack.cc +3 -0
  126. data/src/core/lib/channel/channel_stack.h +2 -0
  127. data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -2
  128. data/src/core/lib/channel/promise_based_filter.cc +132 -20
  129. data/src/core/lib/channel/promise_based_filter.h +42 -12
  130. data/src/core/lib/compression/compression_internal.cc +4 -5
  131. data/src/core/lib/debug/trace_flags.cc +8 -0
  132. data/src/core/lib/debug/trace_flags.h +3 -0
  133. data/src/core/lib/event_engine/ares_resolver.cc +54 -50
  134. data/src/core/lib/event_engine/ares_resolver.h +3 -2
  135. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +3 -3
  136. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +4 -10
  137. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +74 -33
  138. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +4 -4
  139. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +6 -2
  140. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +3 -0
  141. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +3 -0
  142. data/src/core/lib/event_engine/windows/windows_endpoint.cc +1 -3
  143. data/src/core/lib/experiments/experiments.cc +60 -96
  144. data/src/core/lib/experiments/experiments.h +34 -50
  145. data/src/core/lib/iomgr/cfstream_handle.cc +2 -6
  146. data/src/core/lib/iomgr/endpoint_cfstream.cc +3 -10
  147. data/src/core/lib/iomgr/error.cc +2 -6
  148. data/src/core/lib/iomgr/error_cfstream.cc +1 -1
  149. data/src/core/lib/iomgr/ev_poll_posix.cc +5 -9
  150. data/src/core/lib/iomgr/event_engine_shims/closure.cc +1 -1
  151. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +1 -2
  152. data/src/core/lib/iomgr/event_engine_shims/tcp_client.cc +1 -2
  153. data/src/core/lib/iomgr/iomgr_posix.cc +0 -4
  154. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +0 -4
  155. data/src/core/lib/iomgr/iomgr_windows.cc +0 -4
  156. data/src/core/lib/iomgr/socket_factory_posix.h +1 -1
  157. data/src/core/lib/iomgr/socket_utils_posix.cc +3 -0
  158. data/src/core/lib/iomgr/socket_utils_posix.h +3 -0
  159. data/src/core/lib/iomgr/systemd_utils.cc +0 -1
  160. data/src/core/lib/iomgr/tcp_client.h +1 -1
  161. data/src/core/lib/iomgr/tcp_posix.cc +23 -15
  162. data/src/core/lib/iomgr/tcp_server.h +1 -1
  163. data/src/core/lib/iomgr/tcp_server_posix.cc +2 -3
  164. data/src/core/lib/iomgr/tcp_server_utils_posix.h +0 -1
  165. data/src/core/lib/iomgr/tcp_server_windows.cc +0 -1
  166. data/src/core/lib/iomgr/tcp_windows.cc +5 -10
  167. data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -4
  168. data/src/core/lib/iomgr/unix_sockets_posix.h +3 -1
  169. data/src/core/lib/iomgr/vsock.h +3 -1
  170. data/src/core/lib/resource_quota/memory_quota.cc +1 -1
  171. data/src/core/lib/security/authorization/rbac_policy.cc +139 -56
  172. data/src/core/lib/security/authorization/rbac_policy.h +21 -3
  173. data/src/core/lib/surface/call.cc +3 -9
  174. data/src/core/lib/surface/call_utils.h +113 -0
  175. data/src/core/lib/surface/channel_create.cc +1 -1
  176. data/src/core/lib/surface/channel_create.h +0 -2
  177. data/src/core/lib/surface/channel_init.cc +77 -38
  178. data/src/core/lib/surface/channel_init.h +30 -16
  179. data/src/core/lib/surface/filter_stack_call.cc +5 -10
  180. data/src/core/lib/surface/init.cc +13 -27
  181. data/src/core/lib/surface/version.cc +1 -1
  182. data/src/core/lib/transport/error_utils.cc +0 -27
  183. data/src/core/lib/transport/error_utils.h +0 -16
  184. data/src/core/lib/transport/transport.h +7 -5
  185. data/src/core/load_balancing/pick_first/pick_first.cc +2 -0
  186. data/src/core/load_balancing/rls/rls.cc +28 -11
  187. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +33 -42
  188. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.h +0 -2
  189. data/src/core/load_balancing/xds/cds.cc +3 -1
  190. data/src/core/load_balancing/xds/xds_cluster_impl.cc +0 -1
  191. data/src/core/mitigation_engine/mitigation.h +14 -5
  192. data/src/core/mitigation_engine/mitigation_engine.h +7 -3
  193. data/src/core/mitigation_engine/mitigation_provider.h +2 -1
  194. data/src/core/plugin_registry/grpc_plugin_registry.cc +39 -8
  195. data/src/core/resolver/dns/{event_engine/event_engine_client_channel_resolver.cc → dns_resolver.cc} +42 -41
  196. data/src/core/resolver/dns/{event_engine/event_engine_client_channel_resolver.h → dns_resolver.h} +8 -5
  197. data/src/core/resolver/dns/{event_engine/service_config_helper.cc → service_config_helper.cc} +1 -1
  198. data/src/core/resolver/dns/{event_engine/service_config_helper.h → service_config_helper.h} +3 -3
  199. data/src/core/resolver/endpoint_addresses.h +3 -0
  200. data/src/core/resolver/google_c2p/google_c2p_resolver.cc +2 -1
  201. data/src/core/resolver/xds/xds_resolver.cc +35 -9
  202. data/src/core/server/server.cc +2 -6
  203. data/src/core/server/server_config_selector.h +18 -3
  204. data/src/core/server/server_config_selector_filter.cc +178 -91
  205. data/src/core/server/server_config_selector_filter.h +58 -3
  206. data/src/core/server/xds_server_config_fetcher.cc +196 -129
  207. data/src/core/server/xds_server_config_fetcher.h +49 -0
  208. data/src/core/server/xds_server_config_fetcher_legacy.cc +41 -37
  209. data/src/core/telemetry/histogram.h +94 -14
  210. data/src/core/telemetry/instrument.cc +179 -74
  211. data/src/core/telemetry/instrument.h +78 -30
  212. data/src/core/telemetry/metrics.h +5 -0
  213. data/src/core/{resolver/dns/dns_resolver_plugin.h → telemetry/telemetry_label.h} +12 -8
  214. data/src/core/tsi/alts/crypt/aes_gcm.cc +10 -13
  215. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +2 -2
  216. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +3 -1
  217. data/src/core/tsi/ssl_telemetry_utils.cc +216 -259
  218. data/src/core/tsi/ssl_telemetry_utils.h +12 -2
  219. data/src/core/tsi/ssl_transport_security.cc +238 -80
  220. data/src/core/tsi/ssl_transport_security.h +63 -33
  221. data/src/core/tsi/tls_telemetry.cc +31 -0
  222. data/src/core/tsi/tls_telemetry.h +47 -0
  223. data/src/core/tsi/transport_security.cc +2 -2
  224. data/src/core/tsi/transport_security.h +1 -1
  225. data/src/core/tsi/transport_security_interface.h +1 -1
  226. data/src/core/{resolver/dns/native/dns_resolver.h → util/address_sorting_init.cc} +21 -8
  227. data/src/core/{resolver/dns/c_ares/grpc_ares_wrapper_posix.cc → util/address_sorting_init.h} +7 -8
  228. data/src/core/util/http_client/httpcli.cc +16 -53
  229. data/src/core/util/http_client/httpcli.h +0 -7
  230. data/src/core/util/http_client/httpcli_security_connector.cc +13 -8
  231. data/src/core/util/linux/cpu.cc +1 -1
  232. data/src/core/util/load_file.cc +3 -9
  233. data/src/core/util/load_file.h +3 -4
  234. data/src/core/util/matchers.h +8 -0
  235. data/src/core/util/posix/cpu.cc +1 -1
  236. data/src/core/util/status_helper.cc +0 -20
  237. data/src/core/util/status_helper.h +3 -14
  238. data/src/core/xds/grpc/xds_audit_logger_registry.cc +51 -31
  239. data/src/core/xds/grpc/xds_audit_logger_registry.h +17 -3
  240. data/src/core/xds/grpc/xds_bootstrap_grpc.cc +2 -10
  241. data/src/core/xds/grpc/xds_bootstrap_grpc.h +8 -6
  242. data/src/core/xds/grpc/xds_bootstrap_grpc_builder.cc +488 -0
  243. data/src/core/xds/grpc/xds_bootstrap_grpc_builder.h +97 -0
  244. data/src/core/xds/grpc/xds_certificate_provider.cc +7 -7
  245. data/src/core/xds/grpc/xds_client_grpc.cc +4 -8
  246. data/src/core/xds/grpc/xds_client_grpc.h +0 -4
  247. data/src/core/xds/grpc/xds_cluster.h +1 -0
  248. data/src/core/xds/grpc/xds_cluster_parser.cc +1 -5
  249. data/src/core/xds/grpc/xds_cluster_parser.h +0 -2
  250. data/src/core/xds/grpc/xds_cluster_specifier_plugin.cc +0 -2
  251. data/src/core/xds/grpc/xds_cluster_specifier_plugin.h +0 -2
  252. data/src/core/xds/grpc/xds_common_types.cc +0 -91
  253. data/src/core/xds/grpc/xds_common_types.h +1 -47
  254. data/src/core/xds/grpc/xds_common_types_parser.cc +84 -378
  255. data/src/core/xds/grpc/xds_common_types_parser.h +9 -11
  256. data/src/core/xds/grpc/xds_endpoint_parser.cc +0 -2
  257. data/src/core/xds/grpc/xds_grpc_service_parser.cc +177 -0
  258. data/src/core/{resolver/dns/c_ares/dns_resolver_ares.h → xds/grpc/xds_grpc_service_parser.h} +14 -9
  259. data/src/core/xds/grpc/xds_http_composite_filter.cc +26 -21
  260. data/src/core/xds/grpc/xds_http_composite_filter.h +4 -3
  261. data/src/core/xds/grpc/xds_http_ext_proc_filter.cc +418 -0
  262. data/src/core/xds/grpc/xds_http_ext_proc_filter.h +89 -0
  263. data/src/core/xds/grpc/xds_http_fault_filter.cc +9 -12
  264. data/src/core/xds/grpc/xds_http_fault_filter.h +1 -4
  265. data/src/core/xds/grpc/xds_http_filter.cc +2 -1
  266. data/src/core/xds/grpc/xds_http_filter.h +6 -5
  267. data/src/core/xds/grpc/xds_http_filter_registry.cc +10 -127
  268. data/src/core/xds/grpc/xds_http_filter_registry.h +7 -59
  269. data/src/core/xds/grpc/xds_http_gcp_authn_filter.cc +13 -14
  270. data/src/core/xds/grpc/xds_http_gcp_authn_filter.h +3 -2
  271. data/src/core/xds/grpc/xds_http_rbac_filter.cc +403 -25
  272. data/src/core/xds/grpc/xds_http_rbac_filter.h +1 -3
  273. data/src/core/xds/grpc/xds_http_stateful_session_filter.cc +8 -13
  274. data/src/core/xds/grpc/xds_http_stateful_session_filter.h +1 -4
  275. data/src/core/xds/grpc/xds_lb_policy_registry.cc +0 -292
  276. data/src/core/xds/grpc/xds_lb_policy_registry.h +7 -3
  277. data/src/core/xds/grpc/xds_listener.cc +2 -0
  278. data/src/core/xds/grpc/xds_listener.h +5 -0
  279. data/src/core/xds/grpc/xds_listener_parser.cc +16 -11
  280. data/src/core/xds/grpc/xds_matcher_parse.h +3 -1
  281. data/src/core/xds/grpc/xds_metadata_parser.cc +6 -1
  282. data/src/core/xds/grpc/xds_metadata_parser.h +2 -0
  283. data/src/core/xds/grpc/xds_route_config.cc +2 -0
  284. data/src/core/xds/grpc/xds_route_config.h +3 -1
  285. data/src/core/xds/grpc/xds_route_config_parser.cc +13 -79
  286. data/src/core/xds/grpc/xds_route_config_parser.h +0 -3
  287. data/src/core/xds/grpc/xds_routing.cc +116 -69
  288. data/src/core/xds/grpc/xds_routing.h +19 -8
  289. data/src/core/xds/grpc/xds_tls_context.cc +117 -0
  290. data/src/core/xds/grpc/xds_tls_context.h +76 -0
  291. data/src/core/xds/grpc/xds_tls_context_parser.cc +275 -0
  292. data/src/core/xds/grpc/xds_tls_context_parser.h +35 -0
  293. data/src/core/xds/grpc/xds_transport_grpc.cc +41 -38
  294. data/src/core/xds/grpc/xds_transport_grpc.h +4 -2
  295. data/src/ruby/ext/grpc/rb_call.c +26 -15
  296. data/src/ruby/ext/grpc/rb_completion_queue.c +6 -5
  297. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  298. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +3 -0
  299. data/src/ruby/lib/grpc/version.rb +1 -1
  300. data/src/ruby/pb/test/client.rb +5 -4
  301. data/src/ruby/spec/call_spec.rb +14 -0
  302. data/src/ruby/spec/generic/server_interceptors_spec.rb +3 -6
  303. metadata +50 -35
  304. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/channelz.upbdefs.c +0 -716
  305. data/src/core/lib/iomgr/resolve_address.cc +0 -59
  306. data/src/core/lib/iomgr/resolve_address.h +0 -125
  307. data/src/core/lib/iomgr/resolve_address_impl.h +0 -58
  308. data/src/core/lib/iomgr/resolve_address_posix.cc +0 -184
  309. data/src/core/lib/iomgr/resolve_address_posix.h +0 -78
  310. data/src/core/lib/iomgr/resolve_address_windows.cc +0 -169
  311. data/src/core/lib/iomgr/resolve_address_windows.h +0 -76
  312. data/src/core/resolver/dns/c_ares/dns_resolver_ares.cc +0 -781
  313. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver.h +0 -93
  314. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +0 -203
  315. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +0 -838
  316. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +0 -1237
  317. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.h +0 -130
  318. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +0 -35
  319. data/src/core/resolver/dns/dns_resolver_plugin.cc +0 -64
  320. data/src/core/resolver/dns/native/dns_resolver.cc +0 -173
  321. data/src/core/util/json/json_util.cc +0 -101
  322. data/src/core/util/json/json_util.h +0 -163
@@ -19,6 +19,7 @@
19
19
 
20
20
  #include <algorithm>
21
21
  #include <memory>
22
+ #include <optional>
22
23
  #include <string>
23
24
  #include <utility>
24
25
  #include <vector>
@@ -74,10 +75,8 @@ absl::Status StatusFromMetadata(const ServerMetadata& md) {
74
75
  return absl::OkStatus();
75
76
  }
76
77
  const auto* message = md.get_pointer(GrpcMessageMetadata());
77
- return grpc_error_set_int(
78
- absl::Status(static_cast<absl::StatusCode>(status_code),
79
- message == nullptr ? "" : message->as_string_view()),
80
- StatusIntProperty::kRpcStatus, status_code);
78
+ return absl::Status(static_cast<absl::StatusCode>(status_code),
79
+ message == nullptr ? "" : message->as_string_view());
81
80
  }
82
81
  } // namespace
83
82
 
@@ -831,7 +830,8 @@ void BaseCallData::ReceiveMessage::OnComplete(absl::Status status) {
831
830
  }
832
831
 
833
832
  void BaseCallData::ReceiveMessage::Done(const ServerMetadata& metadata,
834
- Flusher* flusher) {
833
+ Flusher* flusher,
834
+ bool discard_buffered_message) {
835
835
  GRPC_TRACE_LOG(channel, INFO)
836
836
  << base_->LogTag() << " ReceiveMessage.Done st=" << StateString(state_)
837
837
  << " md=" << metadata.DebugString();
@@ -849,16 +849,36 @@ void BaseCallData::ReceiveMessage::Done(const ServerMetadata& metadata,
849
849
  state_ = State::kCancelledWhilstForwardingNoPipe;
850
850
  break;
851
851
  case State::kCompletedWhileBatchCompleted:
852
- case State::kBatchCompleted:
853
- state_ = State::kCompletedWhileBatchCompleted;
854
- break;
852
+ case State::kBatchCompleted: {
853
+ if (IsRecvMessageFilterBypassFixEnabled() && discard_buffered_message) {
854
+ state_ = State::kBatchCompletedButCancelled;
855
+ // Store the cancellation status so that WakeInsideCombiner() can
856
+ // propagate it to the application's message ready callback instead of
857
+ // defaulting to OK.
858
+ completed_status_ = StatusFromMetadata(metadata);
859
+ // Drop the buffered message here so it cannot bypass the trailing
860
+ // metadata; WakeInsideCombiner() just fires the completion.
861
+ if (intercepted_slice_buffer_ != nullptr) {
862
+ *intercepted_slice_buffer_ = std::nullopt;
863
+ }
864
+ } else {
865
+ state_ = State::kCompletedWhileBatchCompleted;
866
+ }
867
+ } break;
855
868
  case State::kCompletedWhilePulledFromPipe:
856
869
  case State::kCompletedWhilePushedToPipe:
857
870
  case State::kPulledFromPipe:
858
871
  case State::kPushedToPipe: {
859
- auto status_code =
860
- metadata.get(GrpcStatusMetadata()).value_or(GRPC_STATUS_UNKNOWN);
861
- if (status_code == GRPC_STATUS_OK) {
872
+ // Discard the buffered message only when the call is being torn down
873
+ // (short-circuit / cancellation / server-initiated non-OK);
874
+ // With the feature disabled, fall back to keying the discard off a
875
+ // non-OK trailing status.
876
+ bool discard =
877
+ IsRecvMessageFilterBypassFixEnabled()
878
+ ? discard_buffered_message
879
+ : metadata.get(GrpcStatusMetadata())
880
+ .value_or(GRPC_STATUS_UNKNOWN) != GRPC_STATUS_OK;
881
+ if (!discard) {
862
882
  if (state_ == State::kCompletedWhilePulledFromPipe ||
863
883
  state_ == State::kPulledFromPipe) {
864
884
  state_ = State::kCompletedWhilePulledFromPipe;
@@ -868,12 +888,31 @@ void BaseCallData::ReceiveMessage::Done(const ServerMetadata& metadata,
868
888
  } else {
869
889
  push_.reset();
870
890
  next_.reset();
871
- flusher->AddClosure(intercepted_on_complete_,
872
- StatusFromMetadata(metadata), "recv_message_done");
891
+ if (IsRecvMessageFilterBypassFixEnabled()) {
892
+ completed_status_ = StatusFromMetadata(metadata);
893
+ if (intercepted_slice_buffer_ != nullptr) {
894
+ *intercepted_slice_buffer_ = std::nullopt;
895
+ }
896
+ } else {
897
+ completed_status_ = StatusFromMetadata(metadata);
898
+ }
899
+ flusher->AddClosure(intercepted_on_complete_, completed_status_,
900
+ "recv_message_done");
873
901
  state_ = State::kCancelled;
874
902
  }
875
903
  } break;
876
904
  case State::kBatchCompletedNoPipe:
905
+ if (IsRecvMessageFilterBypassFixEnabled() && discard_buffered_message) {
906
+ // Store the cancellation status so that WakeInsideCombiner() can
907
+ // propagate it to the application's message ready callback instead of
908
+ // defaulting to OK.
909
+ completed_status_ = StatusFromMetadata(metadata);
910
+ // Drop the buffered message here so it cannot bypass the trailing
911
+ // metadata; WakeInsideCombiner() just fires the completion.
912
+ if (intercepted_slice_buffer_ != nullptr) {
913
+ *intercepted_slice_buffer_ = std::nullopt;
914
+ }
915
+ }
877
916
  state_ = State::kBatchCompletedButCancelledNoPipe;
878
917
  break;
879
918
  case State::kBatchCompletedButCancelled:
@@ -887,6 +926,18 @@ void BaseCallData::ReceiveMessage::Done(const ServerMetadata& metadata,
887
926
  }
888
927
  }
889
928
 
929
+ bool BaseCallData::ReceiveMessage::IsIdle() const {
930
+ switch (state_) {
931
+ case State::kInitial:
932
+ case State::kIdle:
933
+ case State::kCancelled:
934
+ case State::kCancelledWhilstIdle:
935
+ return true;
936
+ default:
937
+ return false;
938
+ }
939
+ }
940
+
890
941
  void BaseCallData::ReceiveMessage::WakeInsideCombiner(Flusher* flusher,
891
942
  bool allow_push_to_pipe) {
892
943
  GRPC_TRACE_LOG(channel, INFO)
@@ -910,7 +961,6 @@ void BaseCallData::ReceiveMessage::WakeInsideCombiner(Flusher* flusher,
910
961
  state_ = State::kCancelled;
911
962
  break;
912
963
  case State::kBatchCompletedButCancelled:
913
- case State::kCompletedWhileBatchCompleted:
914
964
  interceptor()->Push()->Close();
915
965
  state_ = State::kCancelled;
916
966
  flusher->AddClosure(std::exchange(intercepted_on_complete_, nullptr),
@@ -921,6 +971,16 @@ void BaseCallData::ReceiveMessage::WakeInsideCombiner(Flusher* flusher,
921
971
  flusher->AddClosure(std::exchange(intercepted_on_complete_, nullptr),
922
972
  completed_status_, "recv_message");
923
973
  break;
974
+ case State::kCompletedWhileBatchCompleted:
975
+ if (!IsRecvMessageFilterBypassFixEnabled()) {
976
+ // existing behavior
977
+ interceptor()->Push()->Close();
978
+ state_ = State::kCancelled;
979
+ flusher->AddClosure(std::exchange(intercepted_on_complete_, nullptr),
980
+ completed_status_, "recv_message");
981
+ break;
982
+ }
983
+ [[fallthrough]];
924
984
  case State::kBatchCompleted:
925
985
  if (completed_status_.ok() && intercepted_slice_buffer_->has_value()) {
926
986
  if (!allow_push_to_pipe) break;
@@ -1122,6 +1182,14 @@ class ClientCallData::PollContext {
1122
1182
  flusher_, self_->recv_initial_metadata_ == nullptr
1123
1183
  ? true
1124
1184
  : self_->recv_initial_metadata_->AllowRecvMessage());
1185
+ if (self_->recv_trailing_state_ ==
1186
+ RecvTrailingState::kCompletedQueuedBehindReceiveMessage &&
1187
+ self_->receive_message()->IsIdle()) {
1188
+ // Now that the receive message pump is idle (finished processing all
1189
+ // in-flight messages), we can finally release the trailing metadata.
1190
+ self_->recv_trailing_state_ = RecvTrailingState::kComplete;
1191
+ repoll_ = true;
1192
+ }
1125
1193
  }
1126
1194
  if (self_->server_initial_metadata_pipe() != nullptr) {
1127
1195
  if (self_->recv_initial_metadata_->metadata_push_.has_value()) {
@@ -1208,7 +1276,34 @@ class ClientCallData::PollContext {
1208
1276
  self_->send_message()->Done(*md, flusher_);
1209
1277
  }
1210
1278
  if (self_->receive_message() != nullptr) {
1211
- self_->receive_message()->Done(*md, flusher_);
1279
+ if (IsRecvMessageFilterBypassFixEnabled()) {
1280
+ // The promise produced its own terminal metadata while a
1281
+ // message was still in flight: the call is being
1282
+ // short-circuited, so that message is discarded rather than
1283
+ // delivered.
1284
+ self_->receive_message()->Done(*md, flusher_,
1285
+ /*discard_buffered_message=*/true);
1286
+ // Done() defers the completion closure to WakeInsideCombiner,
1287
+ // which already ran this poll. If the pump isn't idle, repoll to
1288
+ // drain it, else the call stalls.
1289
+ if (!self_->receive_message()->IsIdle()) {
1290
+ repoll_ = true;
1291
+ }
1292
+ // The promise terminated with its own (error) metadata while the
1293
+ // transport's trailing metadata was queued behind the receive
1294
+ // message pump. The buffered message was discarded above; since
1295
+ // receive_message()->IsIdle() will not become true until the
1296
+ // pending message completion callbacks execute, immediately
1297
+ // promote the queued trailing metadata to kComplete so the
1298
+ // synchronous handling below picks it up within this polling
1299
+ // pass.
1300
+ if (self_->recv_trailing_state_ ==
1301
+ RecvTrailingState::kCompletedQueuedBehindReceiveMessage) {
1302
+ self_->recv_trailing_state_ = RecvTrailingState::kComplete;
1303
+ }
1304
+ } else {
1305
+ self_->receive_message()->Done(*md, flusher_);
1306
+ }
1212
1307
  }
1213
1308
  if (self_->recv_trailing_state_ == RecvTrailingState::kComplete) {
1214
1309
  if (self_->recv_trailing_metadata_ != md.get()) {
@@ -1438,6 +1533,8 @@ const char* ClientCallData::StateString(RecvTrailingState state) {
1438
1533
  return "INITIAL";
1439
1534
  case RecvTrailingState::kQueued:
1440
1535
  return "QUEUED";
1536
+ case RecvTrailingState::kCompletedQueuedBehindReceiveMessage:
1537
+ return "QUEUED_BEHIND_RECEIVE_MESSAGE";
1441
1538
  case RecvTrailingState::kComplete:
1442
1539
  return "COMPLETE";
1443
1540
  case RecvTrailingState::kForwarded:
@@ -1645,7 +1742,8 @@ void ClientCallData::Cancel(grpc_error_handle error, Flusher* flusher) {
1645
1742
  send_message()->Done(*ServerMetadataFromStatus(error), flusher);
1646
1743
  }
1647
1744
  if (receive_message() != nullptr) {
1648
- receive_message()->Done(*ServerMetadataFromStatus(error), flusher);
1745
+ receive_message()->Done(*ServerMetadataFromStatus(error), flusher,
1746
+ /*discard_buffered_message=*/true);
1649
1747
  }
1650
1748
  }
1651
1749
 
@@ -1838,6 +1936,7 @@ Poll<ServerMetadataHandle> ClientCallData::PollTrailingMetadata() {
1838
1936
  case RecvTrailingState::kInitial:
1839
1937
  case RecvTrailingState::kQueued:
1840
1938
  case RecvTrailingState::kForwarded:
1939
+ case RecvTrailingState::kCompletedQueuedBehindReceiveMessage:
1841
1940
  // No trailing metadata yet: we are pending.
1842
1941
  // We return that and expect the promise to be repolled later (if it's
1843
1942
  // not cancelled).
@@ -1892,9 +1991,19 @@ void ClientCallData::RecvTrailingMetadataReady(grpc_error_handle error) {
1892
1991
  }
1893
1992
  // Record that we've got the callback.
1894
1993
  GRPC_CHECK(recv_trailing_state_ == RecvTrailingState::kForwarded);
1895
- recv_trailing_state_ = RecvTrailingState::kComplete;
1994
+ if (IsRecvMessageFilterBypassFixEnabled() && receive_message() != nullptr &&
1995
+ !receive_message()->IsIdle()) {
1996
+ // If the receive message pump is still active processing a message,
1997
+ // queue the trailing metadata until the pump goes idle to avoid bypassing
1998
+ // the message interceptors of filters higher in the stack.
1999
+ recv_trailing_state_ =
2000
+ RecvTrailingState::kCompletedQueuedBehindReceiveMessage;
2001
+ } else {
2002
+ recv_trailing_state_ = RecvTrailingState::kComplete;
2003
+ }
1896
2004
  if (receive_message() != nullptr) {
1897
- receive_message()->Done(*recv_trailing_metadata_, &flusher);
2005
+ receive_message()->Done(*recv_trailing_metadata_, &flusher,
2006
+ /*discard_buffered_message=*/!error.ok());
1898
2007
  }
1899
2008
  if (send_message() != nullptr) {
1900
2009
  send_message()->Done(*recv_trailing_metadata_, &flusher);
@@ -2208,13 +2317,15 @@ void ServerCallData::StartBatch(grpc_transport_stream_op_batch* b) {
2208
2317
  switch (send_trailing_state_) {
2209
2318
  case SendTrailingState::kInitial:
2210
2319
  send_trailing_metadata_batch_ = batch;
2320
+ // Server ends the RPC non-OK, so the app is done reading: any buffered
2321
+ // inbound (client->server) message has no consumer. Drop it.
2211
2322
  if (receive_message() != nullptr &&
2212
2323
  batch->payload->send_trailing_metadata.send_trailing_metadata
2213
2324
  ->get(GrpcStatusMetadata())
2214
2325
  .value_or(GRPC_STATUS_UNKNOWN) != GRPC_STATUS_OK) {
2215
2326
  receive_message()->Done(
2216
2327
  *batch->payload->send_trailing_metadata.send_trailing_metadata,
2217
- &flusher);
2328
+ &flusher, /* discard_buffered_message */ true);
2218
2329
  }
2219
2330
  if (send_message() != nullptr && !send_message()->IsIdle()) {
2220
2331
  send_trailing_state_ = SendTrailingState::kQueuedBehindSendMessage;
@@ -2317,7 +2428,8 @@ void ServerCallData::Completed(grpc_error_handle error,
2317
2428
  send_message()->Done(*ServerMetadataFromStatus(error), flusher);
2318
2429
  }
2319
2430
  if (receive_message() != nullptr) {
2320
- receive_message()->Done(*ServerMetadataFromStatus(error), flusher);
2431
+ receive_message()->Done(*ServerMetadataFromStatus(error), flusher,
2432
+ /* discard_buffered_message */ true);
2321
2433
  }
2322
2434
  }
2323
2435
 
@@ -1175,7 +1175,8 @@ MakeFilterCall(Derived* derived) {
1175
1175
  // failure (in which case the call will be aborted).
1176
1176
  // useful for cases where the exact metadata returned needs to be customized.
1177
1177
  // It's also acceptable to return a promise that resolves to the
1178
- // relevant return type listed above.
1178
+ // relevant return type listed above (except for OnClientToServerHalfClose
1179
+ // and OnServerTrailingMetadata, which must be synchronous).
1179
1180
  // Finally, OnFinalize can be added to intercept call finalization.
1180
1181
  // It must have one of the signatures:
1181
1182
  // - static inline const NoInterceptor OnFinalize:
@@ -1239,10 +1240,18 @@ struct ArenaContextType<V3InterceptorToV2State> {
1239
1240
  // Note that this bridge does not support the full functionality of the
1240
1241
  // v3 interceptor API. In particular, it assumes that the interceptor
1241
1242
  // will create exactly one child call.
1243
+ //
1244
+ // When not running in a v3 stack, the interceptor's Init() method will
1245
+ // not be called, but the wrapped destination will be set before the
1246
+ // ctor runs, so implementations must perform any necessary initialization
1247
+ // in their ctor instead.
1242
1248
  template <typename Derived>
1243
1249
  class V3InterceptorToV2Bridge : public ChannelFilter, public Interceptor {
1244
1250
  public:
1245
- V3InterceptorToV2Bridge() {
1251
+ explicit V3InterceptorToV2Bridge(ChannelArgs args) {
1252
+ // If running in a v3 stack, disable the bridge. The interceptor
1253
+ // will be used normally.
1254
+ if (args.GetBool(GRPC_ARG_USE_V3_STACK).value_or(false)) return;
1246
1255
  // Insert CallDestinationToNextV2Filter as the wrapped destination in
1247
1256
  // Interceptor, so that we can route the server side of the
1248
1257
  // interceptor back into the v2 filter chain.
@@ -1486,12 +1495,28 @@ class V3InterceptorToV2Bridge : public ChannelFilter, public Interceptor {
1486
1495
  call_args.client_initial_metadata = std::move(metadata);
1487
1496
  return Seq(
1488
1497
  next_promise_factory(std::move(call_args)),
1489
- [handler](ServerMetadataHandle metadata) mutable
1490
- -> Poll<ServerMetadataHandle> {
1498
+ [handler](ServerMetadataHandle metadata) mutable {
1491
1499
  handler.SpawnPushServerTrailingMetadata(
1492
1500
  std::move(metadata));
1501
+ // We return a lambda (promise) here instead of
1502
+ // returning `Pending{}` directly to make this
1503
+ // step safe for subsequent polls. During V2 call
1504
+ // teardown, cancellation of active streams
1505
+ // propagates through the V2 filter stack, which
1506
+ // wakes up this activity and triggers re-polls of
1507
+ // the bridge promise. If we returned `Pending{}`
1508
+ // directly, this factory lambda would be
1509
+ // re-evaluated on every poll, causing duplicate
1510
+ // calls to `SpawnPushServerTrailingMetadata` and
1511
+ // attempting to move from the already-moved
1512
+ // `metadata` parameter (leading to
1513
+ // crashes/undefined behavior). Returning the
1514
+ // inner lambda ensures that the side-effects in
1515
+ // this factory run exactly once, and subsequent
1516
+ // polls only execute the trivial,
1517
+ // side-effect-free inner lambda.
1493
1518
  // We always lose the race.
1494
- return Pending{};
1519
+ return Never<ServerMetadataHandle>();
1495
1520
  });
1496
1521
  });
1497
1522
  })),
@@ -1512,11 +1537,6 @@ class V3InterceptorToV2Bridge : public ChannelFilter, public Interceptor {
1512
1537
  });
1513
1538
  }
1514
1539
 
1515
- protected:
1516
- RefCountedPtr<UnstartedCallDestination> wrapped_destination() const {
1517
- return wrapped_destination_; // From Interceptor class.
1518
- }
1519
-
1520
1540
  private:
1521
1541
  // A custom UnstartedCallDestination that starts the call and returns
1522
1542
  // the resulting handler via a latch obtained from call context.
@@ -1867,7 +1887,14 @@ class BaseCallData : public Activity,
1867
1887
  // work.
1868
1888
  void WakeInsideCombiner(Flusher* flusher, bool allow_push_to_pipe);
1869
1889
  // Call is completed, we have trailing metadata. Close things out.
1870
- void Done(const ServerMetadata& metadata, Flusher* flusher);
1890
+ // discard_buffered_message: the call is being torn down (the promise
1891
+ // produced its own terminal metadata, an out-of-band cancellation, or a
1892
+ // server-initiated non-OK termination) and the receiver has stopped
1893
+ // reading, so drop any message buffered here instead of delivering it up
1894
+ // the stack.
1895
+ void Done(const ServerMetadata& metadata, Flusher* flusher,
1896
+ bool discard_buffered_message = false);
1897
+ bool IsIdle() const;
1871
1898
 
1872
1899
  channelz::PropertyList ChannelzProperties() {
1873
1900
  return channelz::PropertyList().Set("state", StateString(state_));
@@ -2026,6 +2053,9 @@ class ClientCallData : public BaseCallData {
2026
2053
  kQueued,
2027
2054
  // We've forwarded the op to the next filter.
2028
2055
  kForwarded,
2056
+ // Trailing metadata is received, but we queue it until the in-progress
2057
+ // receive message operation finishes.
2058
+ kCompletedQueuedBehindReceiveMessage,
2029
2059
  // The op has completed from below, but we haven't yet forwarded it up
2030
2060
  // (the promise gets to interject and mutate it).
2031
2061
  kComplete,
@@ -2324,7 +2354,7 @@ struct ChannelFilterWithFlagsMethods {
2324
2354
  args->config));
2325
2355
  if (!status.ok()) {
2326
2356
  new (elem->channel_data) F*(nullptr);
2327
- return absl_status_to_grpc_error(status.status());
2357
+ return status.status();
2328
2358
  }
2329
2359
  new (elem->channel_data) F*(status->release());
2330
2360
  return absl::OkStatus();
@@ -250,15 +250,14 @@ grpc_compression_options CompressionOptionsFromChannelArgs(
250
250
  Clamp(*default_level, static_cast<int>(GRPC_COMPRESS_LEVEL_NONE),
251
251
  static_cast<int>(GRPC_COMPRESS_LEVEL_COUNT - 1)));
252
252
  }
253
- auto default_algorithm =
253
+ std::optional<int> default_algorithm =
254
254
  args.GetInt(GRPC_COMPRESSION_CHANNEL_DEFAULT_ALGORITHM);
255
255
  if (default_algorithm.has_value()) {
256
256
  compression_options.default_algorithm.is_set = true;
257
257
  compression_options.default_algorithm.algorithm =
258
- Clamp(static_cast<grpc_compression_algorithm>(*default_algorithm),
259
- GRPC_COMPRESS_NONE,
260
- static_cast<grpc_compression_algorithm>(
261
- GRPC_COMPRESS_ALGORITHMS_COUNT - 1));
258
+ static_cast<grpc_compression_algorithm>(
259
+ Clamp(*default_algorithm, static_cast<int>(GRPC_COMPRESS_NONE),
260
+ static_cast<int>(GRPC_COMPRESS_ALGORITHMS_COUNT - 1)));
262
261
  }
263
262
  auto enabled_algorithms_bitset =
264
263
  args.GetInt(GRPC_COMPRESSION_CHANNEL_ENABLED_ALGORITHMS_BITSET);
@@ -68,6 +68,7 @@ TraceFlag client_channel_trace(false, "client_channel");
68
68
  TraceFlag client_channel_call_trace(false, "client_channel_call");
69
69
  TraceFlag client_channel_lb_call_trace(false, "client_channel_lb_call");
70
70
  TraceFlag client_idle_filter_trace(false, "client_idle_filter");
71
+ TraceFlag composite_filter_trace(false, "composite_filter");
71
72
  TraceFlag compression_trace(false, "compression");
72
73
  TraceFlag connectivity_state_trace(false, "connectivity_state");
73
74
  TraceFlag dns_resolver_trace(false, "dns_resolver");
@@ -79,6 +80,7 @@ TraceFlag event_engine_dns_trace(false, "event_engine_dns");
79
80
  TraceFlag event_engine_endpoint_trace(false, "event_engine_endpoint");
80
81
  TraceFlag event_engine_endpoint_data_trace(false, "event_engine_endpoint_data");
81
82
  TraceFlag event_engine_poller_trace(false, "event_engine_poller");
83
+ TraceFlag ext_proc_filter_trace(false, "ext_proc_filter");
82
84
  TraceFlag fault_injection_filter_trace(false, "fault_injection_filter");
83
85
  TraceFlag flowctl_trace(false, "flowctl");
84
86
  TraceFlag fork_trace(false, "fork");
@@ -109,6 +111,8 @@ TraceFlag rls_lb_trace(false, "rls_lb");
109
111
  TraceFlag round_robin_trace(false, "round_robin");
110
112
  TraceFlag secure_endpoint_trace(false, "secure_endpoint");
111
113
  TraceFlag server_channel_trace(false, "server_channel");
114
+ TraceFlag server_config_selector_interceptor_trace(
115
+ false, "server_config_selector_interceptor");
112
116
  TraceFlag stateful_session_filter_trace(false, "stateful_session_filter");
113
117
  TraceFlag subchannel_trace(false, "subchannel");
114
118
  TraceFlag subchannel_call_trace(false, "subchannel_call");
@@ -151,6 +155,7 @@ const absl::flat_hash_map<std::string, TraceFlag*>& GetAllTraceFlags() {
151
155
  {"client_channel_call", &client_channel_call_trace},
152
156
  {"client_channel_lb_call", &client_channel_lb_call_trace},
153
157
  {"client_idle_filter", &client_idle_filter_trace},
158
+ {"composite_filter", &composite_filter_trace},
154
159
  {"compression", &compression_trace},
155
160
  {"connectivity_state", &connectivity_state_trace},
156
161
  {"dns_resolver", &dns_resolver_trace},
@@ -162,6 +167,7 @@ const absl::flat_hash_map<std::string, TraceFlag*>& GetAllTraceFlags() {
162
167
  {"event_engine_endpoint", &event_engine_endpoint_trace},
163
168
  {"event_engine_endpoint_data", &event_engine_endpoint_data_trace},
164
169
  {"event_engine_poller", &event_engine_poller_trace},
170
+ {"ext_proc_filter", &ext_proc_filter_trace},
165
171
  {"fault_injection_filter", &fault_injection_filter_trace},
166
172
  {"flowctl", &flowctl_trace},
167
173
  {"fork", &fork_trace},
@@ -192,6 +198,8 @@ const absl::flat_hash_map<std::string, TraceFlag*>& GetAllTraceFlags() {
192
198
  {"round_robin", &round_robin_trace},
193
199
  {"secure_endpoint", &secure_endpoint_trace},
194
200
  {"server_channel", &server_channel_trace},
201
+ {"server_config_selector_interceptor",
202
+ &server_config_selector_interceptor_trace},
195
203
  {"stateful_session_filter", &stateful_session_filter_trace},
196
204
  {"subchannel", &subchannel_trace},
197
205
  {"subchannel_call", &subchannel_call_trace},
@@ -67,6 +67,7 @@ extern TraceFlag client_channel_trace;
67
67
  extern TraceFlag client_channel_call_trace;
68
68
  extern TraceFlag client_channel_lb_call_trace;
69
69
  extern TraceFlag client_idle_filter_trace;
70
+ extern TraceFlag composite_filter_trace;
70
71
  extern TraceFlag compression_trace;
71
72
  extern TraceFlag connectivity_state_trace;
72
73
  extern TraceFlag dns_resolver_trace;
@@ -77,6 +78,7 @@ extern TraceFlag event_engine_dns_trace;
77
78
  extern TraceFlag event_engine_endpoint_trace;
78
79
  extern TraceFlag event_engine_endpoint_data_trace;
79
80
  extern TraceFlag event_engine_poller_trace;
81
+ extern TraceFlag ext_proc_filter_trace;
80
82
  extern TraceFlag fault_injection_filter_trace;
81
83
  extern TraceFlag flowctl_trace;
82
84
  extern TraceFlag fork_trace;
@@ -107,6 +109,7 @@ extern TraceFlag rls_lb_trace;
107
109
  extern TraceFlag round_robin_trace;
108
110
  extern TraceFlag secure_endpoint_trace;
109
111
  extern TraceFlag server_channel_trace;
112
+ extern TraceFlag server_config_selector_interceptor_trace;
110
113
  extern TraceFlag stateful_session_filter_trace;
111
114
  extern TraceFlag subchannel_trace;
112
115
  extern TraceFlag subchannel_call_trace;
@@ -60,11 +60,13 @@
60
60
  #include "src/core/lib/event_engine/grpc_polled_fd.h"
61
61
  #include "src/core/lib/event_engine/time_util.h"
62
62
  #include "src/core/lib/iomgr/resolved_address.h"
63
+ #include "src/core/util/address_sorting_init.h"
63
64
  #include "src/core/util/debug_location.h"
64
65
  #include "src/core/util/grpc_check.h"
65
66
  #include "src/core/util/host_port.h"
66
67
  #include "src/core/util/orphanable.h"
67
68
  #include "src/core/util/ref_counted_ptr.h"
69
+ #include "absl/base/call_once.h"
68
70
  #include "absl/functional/any_invocable.h"
69
71
  #include "absl/log/log.h"
70
72
  #include "absl/strings/match.h"
@@ -79,8 +81,58 @@
79
81
 
80
82
  namespace grpc_event_engine::experimental {
81
83
 
84
+ std::vector<EventEngine::ResolvedAddress> SortAddresses(
85
+ const std::vector<EventEngine::ResolvedAddress>& addresses) {
86
+ address_sorting_sortable* sortables = static_cast<address_sorting_sortable*>(
87
+ gpr_zalloc(sizeof(address_sorting_sortable) * addresses.size()));
88
+ for (size_t i = 0; i < addresses.size(); i++) {
89
+ sortables[i].user_data =
90
+ const_cast<EventEngine::ResolvedAddress*>(&addresses[i]);
91
+ memcpy(&sortables[i].dest_addr.addr, addresses[i].address(),
92
+ addresses[i].size());
93
+ sortables[i].dest_addr.len = addresses[i].size();
94
+ }
95
+ address_sorting_rfc_6724_sort(sortables, addresses.size());
96
+ std::vector<EventEngine::ResolvedAddress> sorted_addresses;
97
+ sorted_addresses.reserve(addresses.size());
98
+ for (size_t i = 0; i < addresses.size(); ++i) {
99
+ sorted_addresses.emplace_back(
100
+ *static_cast<EventEngine::ResolvedAddress*>(sortables[i].user_data));
101
+ }
102
+ gpr_free(sortables);
103
+ return sorted_addresses;
104
+ }
105
+
82
106
  namespace {
83
107
 
108
+ absl::Status AresInit() {
109
+ if (ShouldUseAresDnsResolver()) {
110
+ // ares_library_init and ares_library_cleanup are currently no-op except
111
+ // under Windows. Calling them may cause race conditions when other parts of
112
+ // the binary calls these functions concurrently.
113
+ #ifdef GPR_WINDOWS
114
+ int status = ares_library_init(ARES_LIB_INIT_ALL);
115
+ if (status != ARES_SUCCESS) {
116
+ return GRPC_ERROR_CREATE(
117
+ absl::StrCat("ares_library_init failed: ", ares_strerror(status)));
118
+ }
119
+ #endif // GPR_WINDOWS
120
+ }
121
+ return absl::OkStatus();
122
+ }
123
+
124
+ absl::once_flag init_flag;
125
+
126
+ void AresOnceInit() {
127
+ grpc_core::AddressSortingInitOnce();
128
+ absl::call_once(init_flag, []() {
129
+ auto status = AresInit();
130
+ if (!status.ok()) {
131
+ VLOG(2) << "AresInit failed: " << status.message();
132
+ }
133
+ });
134
+ }
135
+
84
136
  // A hard limit on the number of records (A/AAAA or SRV) we may get from a
85
137
  // single response. This is to be defensive to prevent a bad DNS response from
86
138
  // OOMing the process.
@@ -151,28 +203,6 @@ absl::Status SetRequestDNSServer(absl::string_view dns_server,
151
203
  return absl::OkStatus();
152
204
  }
153
205
 
154
- std::vector<EventEngine::ResolvedAddress> SortAddresses(
155
- const std::vector<EventEngine::ResolvedAddress>& addresses) {
156
- address_sorting_sortable* sortables = static_cast<address_sorting_sortable*>(
157
- gpr_zalloc(sizeof(address_sorting_sortable) * addresses.size()));
158
- for (size_t i = 0; i < addresses.size(); i++) {
159
- sortables[i].user_data =
160
- const_cast<EventEngine::ResolvedAddress*>(&addresses[i]);
161
- memcpy(&sortables[i].dest_addr.addr, addresses[i].address(),
162
- addresses[i].size());
163
- sortables[i].dest_addr.len = addresses[i].size();
164
- }
165
- address_sorting_rfc_6724_sort(sortables, addresses.size());
166
- std::vector<EventEngine::ResolvedAddress> sorted_addresses;
167
- sorted_addresses.reserve(addresses.size());
168
- for (size_t i = 0; i < addresses.size(); ++i) {
169
- sorted_addresses.emplace_back(
170
- *static_cast<EventEngine::ResolvedAddress*>(sortables[i].user_data));
171
- }
172
- gpr_free(sortables);
173
- return sorted_addresses;
174
- }
175
-
176
206
  struct QueryArg {
177
207
  QueryArg(AresResolver* ar, int id, absl::string_view name)
178
208
  : ares_resolver(ar), callback_map_id(id), query_name(name) {}
@@ -253,6 +283,7 @@ AresResolver::CreateAresResolver(
253
283
  std::unique_ptr<GrpcPolledFdFactory> polled_fd_factory,
254
284
  std::shared_ptr<EventEngine> event_engine) {
255
285
  ares_channel channel;
286
+ AresOnceInit();
256
287
  absl::Status status =
257
288
  InitAresChannel(dns_server, *polled_fd_factory, &channel);
258
289
  if (!status.ok()) {
@@ -276,6 +307,7 @@ AresResolver::AresResolver(
276
307
  #endif // GRPC_ENABLE_FORK_SUPPORT
277
308
  event_engine_(std::move(event_engine)) {
278
309
  (void)dns_server; // Used whether or not compiled with fork support
310
+ AresOnceInit();
279
311
  polled_fd_factory_->Initialize(&mutex_, event_engine_.get());
280
312
  }
281
313
 
@@ -951,36 +983,8 @@ bool ShouldUseAresDnsResolver() {
951
983
  // defined(GRPC_WINDOWS_SOCKET_ARES_EV_DRIVER)
952
984
  }
953
985
 
954
- absl::Status AresInit() {
955
- if (ShouldUseAresDnsResolver()) {
956
- // ares_library_init and ares_library_cleanup are currently no-op except
957
- // under Windows. Calling them may cause race conditions when other parts of
958
- // the binary calls these functions concurrently.
959
- #ifdef GPR_WINDOWS
960
- int status = ares_library_init(ARES_LIB_INIT_ALL);
961
- if (status != ARES_SUCCESS) {
962
- return GRPC_ERROR_CREATE(
963
- absl::StrCat("ares_library_init failed: ", ares_strerror(status)));
964
- }
965
- #endif // GPR_WINDOWS
966
- }
967
- return absl::OkStatus();
968
- }
969
- void AresShutdown() {
970
- if (ShouldUseAresDnsResolver()) {
971
- // ares_library_init and ares_library_cleanup are currently no-op except
972
- // under Windows. Calling them may cause race conditions when other parts of
973
- // the binary calls these functions concurrently.
974
- #ifdef GPR_WINDOWS
975
- ares_library_cleanup();
976
- #endif // GPR_WINDOWS
977
- }
978
- }
979
-
980
986
  #else // GRPC_ARES == 1
981
987
 
982
988
  bool ShouldUseAresDnsResolver() { return false; }
983
- absl::Status AresInit() { return absl::OkStatus(); }
984
- void AresShutdown() {}
985
989
 
986
990
  #endif // GRPC_ARES == 1
@@ -41,6 +41,9 @@
41
41
 
42
42
  namespace grpc_event_engine::experimental {
43
43
 
44
+ std::vector<EventEngine::ResolvedAddress> SortAddresses(
45
+ const std::vector<EventEngine::ResolvedAddress>& addresses);
46
+
44
47
  class AresResolver : public RefCountedDNSResolverInterface {
45
48
  public:
46
49
  #ifdef GRPC_ENABLE_FORK_SUPPORT
@@ -182,7 +185,5 @@ extern bool g_event_engine_grpc_ares_test_only_force_tcp;
182
185
  #endif // GRPC_ARES == 1
183
186
 
184
187
  bool ShouldUseAresDnsResolver();
185
- absl::Status AresInit();
186
- void AresShutdown();
187
188
 
188
189
  #endif // GRPC_SRC_CORE_LIB_EVENT_ENGINE_ARES_RESOLVER_H
@@ -226,9 +226,9 @@ void Epoll1EventHandle::OrphanHandle(PosixEngineClosure* on_done,
226
226
  // shutdown() syscall on that fd)
227
227
  void Epoll1EventHandle::HandleShutdownInternal(absl::Status why,
228
228
  bool releasing_fd) {
229
- grpc_core::StatusSetInt(
230
- &why, grpc_core::StatusIntProperty::kRpcStatus,
231
- absl::IsCancelled(why) ? GRPC_STATUS_CANCELLED : GRPC_STATUS_UNAVAILABLE);
229
+ if (!absl::IsCancelled(why)) {
230
+ why = absl::UnavailableError(why.message());
231
+ }
232
232
  if (read_closure_.SetShutdown(why)) {
233
233
  if (releasing_fd) {
234
234
  auto result = poller_->posix_interface().EpollCtlDel(