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
@@ -11,7 +11,7 @@
11
11
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  // See the License for the specific language governing permissions and
13
13
  // limitations under the License.
14
- #include "src/core/resolver/dns/event_engine/event_engine_client_channel_resolver.h"
14
+ #include "src/core/resolver/dns/dns_resolver.h"
15
15
 
16
16
  #include <grpc/event_engine/event_engine.h>
17
17
  #include <grpc/impl/channel_arg_names.h>
@@ -27,13 +27,13 @@
27
27
  #include <utility>
28
28
  #include <vector>
29
29
 
30
+ #include "src/core/config/core_configuration.h"
30
31
  #include "src/core/lib/channel/channel_args.h"
31
32
  #include "src/core/lib/debug/trace.h"
32
33
  #include "src/core/lib/event_engine/resolved_address_internal.h"
33
34
  #include "src/core/lib/iomgr/exec_ctx.h"
34
- #include "src/core/lib/iomgr/resolve_address.h"
35
35
  #include "src/core/load_balancing/grpclb/grpclb_balancer_addresses.h"
36
- #include "src/core/resolver/dns/event_engine/service_config_helper.h"
36
+ #include "src/core/resolver/dns/service_config_helper.h"
37
37
  #include "src/core/resolver/endpoint_addresses.h"
38
38
  #include "src/core/resolver/polling_resolver.h"
39
39
  #include "src/core/resolver/resolver.h"
@@ -61,6 +61,8 @@
61
61
  namespace grpc_core {
62
62
  namespace {
63
63
 
64
+ const char* kDefaultSecurePort = "https";
65
+
64
66
  #define GRPC_DNS_INITIAL_CONNECT_BACKOFF_SECONDS 1
65
67
  #define GRPC_DNS_RECONNECT_BACKOFF_MULTIPLIER 1.6
66
68
  #define GRPC_DNS_RECONNECT_MAX_BACKOFF_SECONDS 120
@@ -76,12 +78,12 @@ using grpc_event_engine::experimental::EventEngine;
76
78
  // addresses.
77
79
 
78
80
  // ----------------------------------------------------------------------------
79
- // EventEngineClientChannelDNSResolver
81
+ // ClientChannelDNSResolver
80
82
  // ----------------------------------------------------------------------------
81
- class EventEngineClientChannelDNSResolver final : public PollingResolver {
83
+ class ClientChannelDNSResolver final : public PollingResolver {
82
84
  public:
83
- EventEngineClientChannelDNSResolver(ResolverArgs args,
84
- Duration min_time_between_resolutions);
85
+ ClientChannelDNSResolver(ResolverArgs args,
86
+ Duration min_time_between_resolutions);
85
87
  OrphanablePtr<Orphanable> StartRequest() override;
86
88
 
87
89
  private:
@@ -92,7 +94,7 @@ class EventEngineClientChannelDNSResolver final : public PollingResolver {
92
94
  : public InternallyRefCounted<EventEngineDNSRequestWrapper> {
93
95
  public:
94
96
  EventEngineDNSRequestWrapper(
95
- RefCountedPtr<EventEngineClientChannelDNSResolver> resolver,
97
+ RefCountedPtr<ClientChannelDNSResolver> resolver,
96
98
  std::unique_ptr<EventEngine::DNSResolver> event_engine_resolver);
97
99
  ~EventEngineDNSRequestWrapper() override;
98
100
 
@@ -128,7 +130,7 @@ class EventEngineClientChannelDNSResolver final : public PollingResolver {
128
130
  void MaybePopulateServiceConfigLocked(Resolver::Result* result)
129
131
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(on_resolved_mu_);
130
132
 
131
- RefCountedPtr<EventEngineClientChannelDNSResolver> resolver_;
133
+ RefCountedPtr<ClientChannelDNSResolver> resolver_;
132
134
  Mutex on_resolved_mu_;
133
135
  // Lookup callbacks
134
136
  bool is_hostname_inflight_ ABSL_GUARDED_BY(on_resolved_mu_) = false;
@@ -160,7 +162,7 @@ class EventEngineClientChannelDNSResolver final : public PollingResolver {
160
162
  std::shared_ptr<EventEngine> event_engine_;
161
163
  };
162
164
 
163
- EventEngineClientChannelDNSResolver::EventEngineClientChannelDNSResolver(
165
+ ClientChannelDNSResolver::ClientChannelDNSResolver(
164
166
  ResolverArgs args, Duration min_time_between_resolutions)
165
167
  : PollingResolver(std::move(args), min_time_between_resolutions,
166
168
  BackOff::Options()
@@ -185,7 +187,7 @@ EventEngineClientChannelDNSResolver::EventEngineClientChannelDNSResolver(
185
187
  .value_or(GRPC_DNS_DEFAULT_QUERY_TIMEOUT_MS)))),
186
188
  event_engine_(channel_args().GetObjectRef<EventEngine>()) {}
187
189
 
188
- OrphanablePtr<Orphanable> EventEngineClientChannelDNSResolver::StartRequest() {
190
+ OrphanablePtr<Orphanable> ClientChannelDNSResolver::StartRequest() {
189
191
  auto dns_resolver =
190
192
  event_engine_->GetDNSResolver({/*dns_server=*/authority()});
191
193
  if (!dns_resolver.ok()) {
@@ -196,8 +198,7 @@ OrphanablePtr<Orphanable> EventEngineClientChannelDNSResolver::StartRequest() {
196
198
  return nullptr;
197
199
  }
198
200
  return MakeOrphanable<EventEngineDNSRequestWrapper>(
199
- RefAsSubclass<EventEngineClientChannelDNSResolver>(DEBUG_LOCATION,
200
- "dns-resolving"),
201
+ RefAsSubclass<ClientChannelDNSResolver>(DEBUG_LOCATION, "dns-resolving"),
201
202
  std::move(*dns_resolver));
202
203
  }
203
204
 
@@ -205,9 +206,9 @@ OrphanablePtr<Orphanable> EventEngineClientChannelDNSResolver::StartRequest() {
205
206
  // EventEngineDNSRequestWrapper definition
206
207
  // ----------------------------------------------------------------------------
207
208
 
208
- EventEngineClientChannelDNSResolver::EventEngineDNSRequestWrapper::
209
+ ClientChannelDNSResolver::EventEngineDNSRequestWrapper::
209
210
  EventEngineDNSRequestWrapper(
210
- RefCountedPtr<EventEngineClientChannelDNSResolver> resolver,
211
+ RefCountedPtr<ClientChannelDNSResolver> resolver,
211
212
  std::unique_ptr<EventEngine::DNSResolver> event_engine_resolver)
212
213
  : resolver_(std::move(resolver)),
213
214
  event_engine_resolver_(std::move(event_engine_resolver)) {
@@ -270,13 +271,12 @@ EventEngineClientChannelDNSResolver::EventEngineDNSRequestWrapper::
270
271
  });
271
272
  }
272
273
 
273
- EventEngineClientChannelDNSResolver::EventEngineDNSRequestWrapper::
274
+ ClientChannelDNSResolver::EventEngineDNSRequestWrapper::
274
275
  ~EventEngineDNSRequestWrapper() {
275
276
  resolver_.reset(DEBUG_LOCATION, "dns-resolving");
276
277
  }
277
278
 
278
- void EventEngineClientChannelDNSResolver::EventEngineDNSRequestWrapper::
279
- Orphan() {
279
+ void ClientChannelDNSResolver::EventEngineDNSRequestWrapper::Orphan() {
280
280
  {
281
281
  MutexLock lock(&on_resolved_mu_);
282
282
  orphaned_ = true;
@@ -291,8 +291,7 @@ void EventEngineClientChannelDNSResolver::EventEngineDNSRequestWrapper::
291
291
  Unref(DEBUG_LOCATION, "Orphan");
292
292
  }
293
293
 
294
- void EventEngineClientChannelDNSResolver::EventEngineDNSRequestWrapper::
295
- OnTimeout() {
294
+ void ClientChannelDNSResolver::EventEngineDNSRequestWrapper::OnTimeout() {
296
295
  MutexLock lock(&on_resolved_mu_);
297
296
  GRPC_TRACE_VLOG(event_engine_client_channel_resolver, 2)
298
297
  << "(event_engine client channel resolver) DNSResolver::"
@@ -301,9 +300,8 @@ void EventEngineClientChannelDNSResolver::EventEngineDNSRequestWrapper::
301
300
  event_engine_resolver_.reset();
302
301
  }
303
302
 
304
- void EventEngineClientChannelDNSResolver::EventEngineDNSRequestWrapper::
305
- OnHostnameResolved(absl::StatusOr<std::vector<EventEngine::ResolvedAddress>>
306
- new_addresses) {
303
+ void ClientChannelDNSResolver::EventEngineDNSRequestWrapper::OnHostnameResolved(
304
+ absl::StatusOr<std::vector<EventEngine::ResolvedAddress>> new_addresses) {
307
305
  std::optional<Resolver::Result> result;
308
306
  {
309
307
  MutexLock lock(&on_resolved_mu_);
@@ -326,10 +324,9 @@ void EventEngineClientChannelDNSResolver::EventEngineDNSRequestWrapper::
326
324
  }
327
325
  }
328
326
 
329
- void EventEngineClientChannelDNSResolver::EventEngineDNSRequestWrapper::
330
- OnSRVResolved(
331
- absl::StatusOr<std::vector<EventEngine::DNSResolver::SRVRecord>>
332
- srv_records) {
327
+ void ClientChannelDNSResolver::EventEngineDNSRequestWrapper::OnSRVResolved(
328
+ absl::StatusOr<std::vector<EventEngine::DNSResolver::SRVRecord>>
329
+ srv_records) {
333
330
  std::optional<Resolver::Result> result;
334
331
  auto cleanup = absl::MakeCleanup([&]() {
335
332
  if (result.has_value()) {
@@ -379,7 +376,7 @@ void EventEngineClientChannelDNSResolver::EventEngineDNSRequestWrapper::
379
376
  }
380
377
  }
381
378
 
382
- void EventEngineClientChannelDNSResolver::EventEngineDNSRequestWrapper::
379
+ void ClientChannelDNSResolver::EventEngineDNSRequestWrapper::
383
380
  OnBalancerHostnamesResolved(
384
381
  std::string authority,
385
382
  absl::StatusOr<std::vector<EventEngine::ResolvedAddress>>
@@ -413,8 +410,8 @@ void EventEngineClientChannelDNSResolver::EventEngineDNSRequestWrapper::
413
410
  result = OnResolvedLocked();
414
411
  }
415
412
 
416
- void EventEngineClientChannelDNSResolver::EventEngineDNSRequestWrapper::
417
- OnTXTResolved(absl::StatusOr<std::vector<std::string>> service_config) {
413
+ void ClientChannelDNSResolver::EventEngineDNSRequestWrapper::OnTXTResolved(
414
+ absl::StatusOr<std::vector<std::string>> service_config) {
418
415
  std::optional<Resolver::Result> result;
419
416
  {
420
417
  MutexLock lock(&on_resolved_mu_);
@@ -456,13 +453,13 @@ void EventEngineClientChannelDNSResolver::EventEngineDNSRequestWrapper::
456
453
  }
457
454
  }
458
455
 
459
- void EventEngineClientChannelDNSResolver::EventEngineDNSRequestWrapper::
456
+ void ClientChannelDNSResolver::EventEngineDNSRequestWrapper::
460
457
  MaybePopulateAddressesLocked(Resolver::Result* result) {
461
458
  if (addresses_.empty()) return;
462
459
  result->addresses = std::move(addresses_);
463
460
  }
464
461
 
465
- void EventEngineClientChannelDNSResolver::EventEngineDNSRequestWrapper::
462
+ void ClientChannelDNSResolver::EventEngineDNSRequestWrapper::
466
463
  MaybePopulateBalancerAddressesLocked(Resolver::Result* result) {
467
464
  if (!balancer_addresses_.empty()) {
468
465
  result->args =
@@ -470,7 +467,7 @@ void EventEngineClientChannelDNSResolver::EventEngineDNSRequestWrapper::
470
467
  }
471
468
  }
472
469
 
473
- void EventEngineClientChannelDNSResolver::EventEngineDNSRequestWrapper::
470
+ void ClientChannelDNSResolver::EventEngineDNSRequestWrapper::
474
471
  MaybePopulateServiceConfigLocked(Resolver::Result* result) {
475
472
  // This function is called only if we are returning addresses. In that case,
476
473
  // we currently ignore TXT lookup failures.
@@ -498,8 +495,8 @@ void EventEngineClientChannelDNSResolver::EventEngineDNSRequestWrapper::
498
495
  }
499
496
  }
500
497
 
501
- std::optional<Resolver::Result> EventEngineClientChannelDNSResolver::
502
- EventEngineDNSRequestWrapper::OnResolvedLocked() {
498
+ std::optional<Resolver::Result>
499
+ ClientChannelDNSResolver::EventEngineDNSRequestWrapper::OnResolvedLocked() {
503
500
  if (orphaned_) return std::nullopt;
504
501
  // Wait for all requested queries to return.
505
502
  if (is_hostname_inflight_ || is_srv_inflight_ || is_txt_inflight_ ||
@@ -552,8 +549,7 @@ std::optional<Resolver::Result> EventEngineClientChannelDNSResolver::
552
549
 
553
550
  } // namespace
554
551
 
555
- bool EventEngineClientChannelDNSResolverFactory::IsValidUri(
556
- const URI& uri) const {
552
+ bool ClientChannelDNSResolverFactory::IsValidUri(const URI& uri) const {
557
553
  if (absl::StripPrefix(uri.path(), "/").empty()) {
558
554
  LOG(ERROR) << "no server name supplied in dns URI";
559
555
  return false;
@@ -561,16 +557,21 @@ bool EventEngineClientChannelDNSResolverFactory::IsValidUri(
561
557
  return true;
562
558
  }
563
559
 
564
- OrphanablePtr<Resolver>
565
- EventEngineClientChannelDNSResolverFactory::CreateResolver(
560
+ OrphanablePtr<Resolver> ClientChannelDNSResolverFactory::CreateResolver(
566
561
  ResolverArgs args) const {
567
562
  Duration min_time_between_resolutions = std::max(
568
563
  Duration::Zero(), args.args
569
564
  .GetDurationFromIntMillis(
570
565
  GRPC_ARG_DNS_MIN_TIME_BETWEEN_RESOLUTIONS_MS)
571
566
  .value_or(Duration::Seconds(30)));
572
- return MakeOrphanable<EventEngineClientChannelDNSResolver>(
573
- std::move(args), min_time_between_resolutions);
567
+ return MakeOrphanable<ClientChannelDNSResolver>(std::move(args),
568
+ min_time_between_resolutions);
569
+ }
570
+
571
+ void RegisterDnsResolver(CoreConfiguration::Builder* builder) {
572
+ VLOG(2) << "Using EventEngine dns resolver";
573
+ builder->resolver_registry()->RegisterResolverFactory(
574
+ std::make_unique<ClientChannelDNSResolverFactory>());
574
575
  }
575
576
 
576
577
  } // namespace grpc_core
@@ -11,10 +11,11 @@
11
11
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  // See the License for the specific language governing permissions and
13
13
  // limitations under the License.
14
- #ifndef GRPC_SRC_CORE_RESOLVER_DNS_EVENT_ENGINE_EVENT_ENGINE_CLIENT_CHANNEL_RESOLVER_H
15
- #define GRPC_SRC_CORE_RESOLVER_DNS_EVENT_ENGINE_EVENT_ENGINE_CLIENT_CHANNEL_RESOLVER_H
14
+ #ifndef GRPC_SRC_CORE_RESOLVER_DNS_DNS_RESOLVER_H
15
+ #define GRPC_SRC_CORE_RESOLVER_DNS_DNS_RESOLVER_H
16
16
  #include <grpc/support/port_platform.h>
17
17
 
18
+ #include "src/core/config/core_configuration.h"
18
19
  #include "src/core/resolver/resolver.h"
19
20
  #include "src/core/resolver/resolver_factory.h"
20
21
  #include "src/core/util/orphanable.h"
@@ -23,14 +24,16 @@
23
24
 
24
25
  namespace grpc_core {
25
26
 
26
- class EventEngineClientChannelDNSResolverFactory final
27
- : public ResolverFactory {
27
+ class ClientChannelDNSResolverFactory final : public ResolverFactory {
28
28
  public:
29
29
  absl::string_view scheme() const override { return "dns"; }
30
30
  bool IsValidUri(const URI& uri) const override;
31
31
  OrphanablePtr<Resolver> CreateResolver(ResolverArgs args) const override;
32
32
  };
33
33
 
34
+ // Centralized decision logic about which client channel DNS resolver to enable.
35
+ void RegisterDnsResolver(CoreConfiguration::Builder* builder);
36
+
34
37
  } // namespace grpc_core
35
38
 
36
- #endif // GRPC_SRC_CORE_RESOLVER_DNS_EVENT_ENGINE_EVENT_ENGINE_CLIENT_CHANNEL_RESOLVER_H
39
+ #endif // GRPC_SRC_CORE_RESOLVER_DNS_DNS_RESOLVER_H
@@ -11,7 +11,7 @@
11
11
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  // See the License for the specific language governing permissions and
13
13
  // limitations under the License.
14
- #include "src/core/resolver/dns/event_engine/service_config_helper.h"
14
+ #include "src/core/resolver/dns/service_config_helper.h"
15
15
 
16
16
  #include <grpc/support/port_platform.h>
17
17
  #include <stdlib.h>
@@ -12,8 +12,8 @@
12
12
  // See the License for the specific language governing permissions and
13
13
  // limitations under the License.
14
14
 
15
- #ifndef GRPC_SRC_CORE_RESOLVER_DNS_EVENT_ENGINE_SERVICE_CONFIG_HELPER_H
16
- #define GRPC_SRC_CORE_RESOLVER_DNS_EVENT_ENGINE_SERVICE_CONFIG_HELPER_H
15
+ #ifndef GRPC_SRC_CORE_RESOLVER_DNS_SERVICE_CONFIG_HELPER_H
16
+ #define GRPC_SRC_CORE_RESOLVER_DNS_SERVICE_CONFIG_HELPER_H
17
17
 
18
18
  #include <grpc/support/port_platform.h>
19
19
 
@@ -29,4 +29,4 @@ absl::StatusOr<std::string> ChooseServiceConfig(
29
29
 
30
30
  } // namespace grpc_core
31
31
 
32
- #endif // GRPC_SRC_CORE_RESOLVER_DNS_EVENT_ENGINE_SERVICE_CONFIG_HELPER_H
32
+ #endif // GRPC_SRC_CORE_RESOLVER_DNS_SERVICE_CONFIG_HELPER_H
@@ -45,6 +45,9 @@
45
45
  // Backend service name associated with the addresses.
46
46
  #define GRPC_ARG_BACKEND_SERVICE "grpc.internal.backend_service"
47
47
 
48
+ // Locality name associated with the addresses.
49
+ #define GRPC_ARG_LB_LOCALITY "grpc.internal.lb_locality"
50
+
48
51
  namespace grpc_core {
49
52
 
50
53
  // A list of addresses for a given endpoint with an associated set of channel
@@ -44,6 +44,7 @@
44
44
  #include "src/core/util/time.h"
45
45
  #include "src/core/util/uri.h"
46
46
  #include "src/core/util/work_serializer.h"
47
+ #include "src/core/xds/grpc/xds_bootstrap_grpc_builder.h"
47
48
  #include "src/core/xds/grpc/xds_client_grpc.h"
48
49
  #include "src/core/xds/xds_client/xds_bootstrap.h"
49
50
  #include "absl/log/log.h"
@@ -237,7 +238,7 @@ std::shared_ptr<GrpcXdsBootstrap> GoogleCloud2ProdResolver::ConstructBootstrap()
237
238
  })},
238
239
  {"node", Json::FromObject(std::move(node))},
239
240
  });
240
- return GrpcXdsBootstrap::Create(JsonDump(bootstrap)).value();
241
+ return GrpcXdsBootstrapBuilder::Build(JsonDump(bootstrap)).value();
241
242
  }
242
243
 
243
244
  void GoogleCloud2ProdResolver::StartXdsResolver() {
@@ -79,6 +79,7 @@
79
79
  #include "src/core/xds/grpc/xds_route_config.h"
80
80
  #include "src/core/xds/grpc/xds_routing.h"
81
81
  #include "src/core/xds/xds_client/xds_bootstrap.h"
82
+ #include "src/core/xds/xds_client/xds_transport.h"
82
83
  #include "absl/log/log.h"
83
84
  #include "absl/meta/type_traits.h"
84
85
  #include "absl/random/random.h"
@@ -219,7 +220,9 @@ class XdsResolver final : public Resolver {
219
220
 
220
221
  void BuildFilterChains(const XdsConfig& xds_config,
221
222
  const XdsHttpFilterRegistry& http_filter_registry,
222
- FilterChainBuilder& builder, Blackboard& blackboard);
223
+ FilterChainBuilder& builder,
224
+ XdsTransportFactory& transport_factory,
225
+ Blackboard& blackboard);
223
226
 
224
227
  private:
225
228
  class RouteListIterator;
@@ -318,6 +321,29 @@ class XdsResolver final : public Resolver {
318
321
  };
319
322
  };
320
323
 
324
+ // Wraps a FilterChainBuilder in an XdsFilterChainBuilder.
325
+ // Also adds the ClusterSelectionFilter to the end of each filter chain.
326
+ class FilterChainBuilderWrapper final
327
+ : public XdsRouting::RouteConfigFilterChainBuilder::
328
+ XdsFilterChainBuilder {
329
+ public:
330
+ explicit FilterChainBuilderWrapper(FilterChainBuilder& builder)
331
+ : builder_(builder) {}
332
+
333
+ void AddFilter(const XdsHttpFilterFactory* factory,
334
+ RefCountedPtr<const FilterConfig> config) override {
335
+ factory->AddFilter(builder_, std::move(config));
336
+ }
337
+
338
+ absl::StatusOr<RefCountedPtr<FilterChain>> Build() override {
339
+ builder_.AddFilter<ClusterSelectionFilter>(nullptr);
340
+ return builder_.Build();
341
+ }
342
+
343
+ private:
344
+ FilterChainBuilder& builder_;
345
+ };
346
+
321
347
  RefCountedPtr<ClusterRef> GetOrCreateClusterRef(
322
348
  absl::string_view cluster_key, absl::string_view cluster_name) {
323
349
  auto it = cluster_ref_map_.find(cluster_key);
@@ -420,15 +446,14 @@ XdsResolver::RouteConfigData::GetRouteForRequest(
420
446
  void XdsResolver::RouteConfigData::BuildFilterChains(
421
447
  const XdsConfig& xds_config,
422
448
  const XdsHttpFilterRegistry& http_filter_registry,
423
- FilterChainBuilder& builder, Blackboard& blackboard) {
449
+ FilterChainBuilder& builder, XdsTransportFactory& transport_factory,
450
+ Blackboard& blackboard) {
424
451
  const auto& hcm = std::get<XdsListenerResource::HttpConnectionManager>(
425
452
  xds_config.listener->listener);
453
+ FilterChainBuilderWrapper builder_wrapper(builder);
426
454
  XdsRouting::RouteConfigFilterChainBuilder route_config_builder(
427
- hcm.http_filters, http_filter_registry, builder,
428
- [](FilterChainBuilder& builder) {
429
- builder.AddFilter<ClusterSelectionFilter>(nullptr);
430
- },
431
- blackboard);
455
+ hcm.http_filters, http_filter_registry, builder_wrapper,
456
+ transport_factory, blackboard);
432
457
  auto vhost_builder = route_config_builder.MakeVirtualHostFilterChainBuilder(
433
458
  *xds_config.virtual_host);
434
459
  // Set the filter chain for each route.
@@ -759,8 +784,9 @@ void XdsResolver::XdsConfigSelector::BuildFilterChains(
759
784
  const auto& http_filter_registry =
760
785
  DownCast<const GrpcXdsBootstrap&>(resolver_->xds_client_->bootstrap())
761
786
  .http_filter_registry();
762
- route_config_data_->BuildFilterChains(*xds_config_, http_filter_registry,
763
- builder, *resolver_->blackboard_);
787
+ route_config_data_->BuildFilterChains(
788
+ *xds_config_, http_filter_registry, builder,
789
+ *resolver_->xds_client_->transport_factory(), *resolver_->blackboard_);
764
790
  }
765
791
 
766
792
  //
@@ -1323,9 +1323,7 @@ grpc_error_handle Server::SetupTransport(
1323
1323
  args.SetObject(transport).SetObject<channelz::BaseNode>(
1324
1324
  transport->GetSocketNode()),
1325
1325
  channel_stack_type);
1326
- if (!destination.ok()) {
1327
- return absl_status_to_grpc_error(destination.status());
1328
- }
1326
+ if (!destination.ok()) return destination.status();
1329
1327
  t->SetCallDestination(std::move(*destination));
1330
1328
  MutexLock lock(&mu_global_);
1331
1329
  if (ShutdownCalled()) {
@@ -1347,9 +1345,7 @@ grpc_error_handle Server::SetupTransport(
1347
1345
  args.SetObject(transport).SetObject<channelz::BaseNode>(
1348
1346
  transport->GetSocketNode()),
1349
1347
  channel_stack_type);
1350
- if (!channel.ok()) {
1351
- return absl_status_to_grpc_error(channel.status());
1352
- }
1348
+ if (!channel.ok()) return channel.status();
1353
1349
  GRPC_CHECK(*channel != nullptr);
1354
1350
  auto* channel_stack = (*channel)->channel_stack();
1355
1351
  GRPC_CHECK(channel_stack != nullptr);
@@ -22,6 +22,7 @@
22
22
  #include <memory>
23
23
 
24
24
  #include "src/core/call/metadata_batch.h"
25
+ #include "src/core/filter/filter_chain.h"
25
26
  #include "src/core/service_config/service_config.h"
26
27
  #include "src/core/service_config/service_config_parser.h"
27
28
  #include "src/core/util/dual_ref_counted.h"
@@ -37,17 +38,31 @@ namespace grpc_core {
37
38
  // server-side call based on the received initial metadata.
38
39
  class ServerConfigSelector : public RefCounted<ServerConfigSelector> {
39
40
  public:
41
+ // A base class for connection state.
42
+ class ConnectionState {
43
+ public:
44
+ virtual ~ConnectionState() = default;
45
+ };
46
+
47
+ // The server will call this when the provider returns a new
48
+ // ServerConfigSelector to initialize the filter chains that the
49
+ // ServerConfigSelector may need.
50
+ virtual std::unique_ptr<ConnectionState> BuildFilterChains(
51
+ FilterChainBuilder& builder) = 0;
52
+
40
53
  // Configuration to apply to an incoming call
54
+ // TODO(roth): When we remove the xds_server_filter_chain_per_route
55
+ // experiment, remove this struct and have GetCallConfig() return
56
+ // the filter chain directly.
41
57
  struct CallConfig {
42
58
  const ServiceConfigParser::ParsedConfigVector* method_configs = nullptr;
43
59
  RefCountedPtr<ServiceConfig> service_config;
60
+ absl::StatusOr<RefCountedPtr<const FilterChain>> filter_chain;
44
61
  };
45
62
 
46
- ~ServerConfigSelector() override = default;
47
-
48
63
  // Returns the CallConfig to apply to a call based on the incoming \a metadata
49
64
  virtual absl::StatusOr<CallConfig> GetCallConfig(
50
- grpc_metadata_batch* metadata) = 0;
65
+ const ConnectionState* state, grpc_metadata_batch* metadata) = 0;
51
66
  };
52
67
 
53
68
  // ServerConfigSelectorProvider allows for subscribers to watch for updates on