grpc 1.60.2 → 1.61.0.pre2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +208 -165
  3. data/include/grpc/event_engine/event_engine.h +59 -12
  4. data/include/grpc/event_engine/internal/memory_allocator_impl.h +6 -0
  5. data/include/grpc/event_engine/internal/slice_cast.h +12 -0
  6. data/include/grpc/event_engine/memory_allocator.h +3 -1
  7. data/include/grpc/event_engine/slice.h +5 -0
  8. data/include/grpc/grpc_security.h +22 -1
  9. data/include/grpc/impl/call.h +29 -0
  10. data/include/grpc/impl/channel_arg_names.h +12 -1
  11. data/include/grpc/impl/slice_type.h +1 -1
  12. data/include/grpc/module.modulemap +1 -0
  13. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +54 -7
  14. data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +20 -6
  15. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +10 -13
  16. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +18 -10
  17. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +326 -0
  18. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h +143 -0
  19. data/src/core/ext/filters/client_channel/backend_metric.cc +2 -2
  20. data/src/core/ext/filters/client_channel/client_channel.cc +32 -6
  21. data/src/core/ext/filters/client_channel/client_channel_internal.h +2 -0
  22. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +1 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +54 -21
  24. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +3 -2
  25. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +2 -1
  26. data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.cc +12 -15
  27. data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.h +8 -5
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +139 -92
  29. data/src/core/ext/filters/client_channel/lb_policy/health_check_client.cc +9 -4
  30. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +9 -4
  31. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +10 -11
  32. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +94 -93
  33. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +5 -3
  34. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +12 -15
  35. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +38 -16
  36. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +25 -28
  37. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +10 -10
  38. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +37 -35
  39. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +11 -9
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +504 -461
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +232 -122
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -6
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +642 -251
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.h +2 -6
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +7 -8
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +2 -1
  47. data/src/core/ext/filters/client_channel/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +3 -1
  48. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +2 -2
  49. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +2 -2
  50. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +6 -8
  51. data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.cc +1031 -0
  52. data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.h +277 -0
  53. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +128 -270
  54. data/src/core/ext/filters/client_channel/resolver/xds/{xds_resolver.h → xds_resolver_attributes.h} +5 -4
  55. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.cc +25 -0
  56. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.h +30 -0
  57. data/src/core/ext/filters/client_channel/retry_filter.cc +1 -0
  58. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +35 -17
  59. data/src/core/ext/filters/deadline/deadline_filter.cc +12 -0
  60. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +17 -13
  61. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +13 -4
  62. data/src/core/ext/filters/http/client/http_client_filter.cc +23 -32
  63. data/src/core/ext/filters/http/client/http_client_filter.h +10 -5
  64. data/src/core/ext/filters/http/client_authority_filter.cc +14 -14
  65. data/src/core/ext/filters/http/client_authority_filter.h +12 -4
  66. data/src/core/ext/filters/http/http_filters_plugin.cc +42 -20
  67. data/src/core/ext/filters/http/message_compress/compression_filter.cc +55 -80
  68. data/src/core/ext/filters/http/message_compress/compression_filter.h +54 -12
  69. data/src/core/ext/filters/http/message_compress/legacy_compression_filter.cc +325 -0
  70. data/src/core/ext/filters/http/message_compress/legacy_compression_filter.h +139 -0
  71. data/src/core/ext/filters/http/server/http_server_filter.cc +41 -41
  72. data/src/core/ext/filters/http/server/http_server_filter.h +11 -4
  73. data/src/core/ext/filters/message_size/message_size_filter.cc +56 -76
  74. data/src/core/ext/filters/message_size/message_size_filter.h +35 -23
  75. data/src/core/ext/filters/rbac/rbac_filter.cc +15 -11
  76. data/src/core/ext/filters/rbac/rbac_filter.h +11 -4
  77. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +25 -13
  78. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +47 -50
  79. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +21 -4
  80. data/src/core/ext/transport/chttp2/alpn/alpn.cc +1 -1
  81. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -2
  82. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +11 -2
  83. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +68 -145
  84. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -3
  85. data/src/core/ext/transport/chttp2/transport/flow_control.cc +21 -82
  86. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -8
  87. data/src/core/ext/transport/chttp2/transport/frame.cc +506 -0
  88. data/src/core/ext/transport/chttp2/transport/frame.h +214 -0
  89. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +1 -1
  90. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +33 -79
  91. data/src/core/ext/transport/chttp2/transport/frame_settings.h +4 -7
  92. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +27 -36
  93. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +0 -2
  94. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +122 -32
  95. data/src/core/ext/transport/chttp2/transport/http2_settings.h +142 -37
  96. data/src/core/ext/transport/chttp2/transport/internal.h +1 -22
  97. data/src/core/ext/transport/chttp2/transport/parsing.cc +23 -37
  98. data/src/core/ext/transport/chttp2/transport/writing.cc +26 -58
  99. data/src/core/ext/transport/inproc/inproc_transport.cc +172 -13
  100. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb.h +712 -0
  101. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.c +151 -0
  102. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.h +33 -0
  103. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.c +133 -0
  104. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.h +50 -0
  105. data/src/core/ext/xds/certificate_provider_store.cc +2 -1
  106. data/src/core/ext/xds/certificate_provider_store.h +0 -5
  107. data/src/core/ext/xds/xds_api.cc +31 -18
  108. data/src/core/ext/xds/xds_api.h +2 -2
  109. data/src/core/ext/xds/xds_bootstrap.h +3 -0
  110. data/src/core/ext/xds/xds_certificate_provider.cc +88 -287
  111. data/src/core/ext/xds/xds_certificate_provider.h +44 -111
  112. data/src/core/ext/xds/xds_client.cc +420 -414
  113. data/src/core/ext/xds/xds_client.h +31 -22
  114. data/src/core/ext/xds/xds_client_grpc.cc +3 -1
  115. data/src/core/ext/xds/xds_cluster.cc +104 -11
  116. data/src/core/ext/xds/xds_cluster.h +9 -1
  117. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +9 -5
  118. data/src/core/ext/xds/xds_common_types.cc +14 -10
  119. data/src/core/ext/xds/xds_endpoint.cc +9 -4
  120. data/src/core/ext/xds/xds_endpoint.h +5 -1
  121. data/src/core/ext/xds/xds_health_status.cc +12 -2
  122. data/src/core/ext/xds/xds_health_status.h +4 -2
  123. data/src/core/ext/xds/xds_http_rbac_filter.cc +5 -3
  124. data/src/core/ext/xds/xds_listener.cc +14 -8
  125. data/src/core/ext/xds/xds_resource_type_impl.h +6 -4
  126. data/src/core/ext/xds/xds_route_config.cc +34 -22
  127. data/src/core/ext/xds/xds_route_config.h +1 -0
  128. data/src/core/ext/xds/xds_server_config_fetcher.cc +61 -57
  129. data/src/core/ext/xds/xds_transport.h +3 -0
  130. data/src/core/ext/xds/xds_transport_grpc.cc +47 -50
  131. data/src/core/ext/xds/xds_transport_grpc.h +4 -0
  132. data/src/core/lib/channel/call_tracer.cc +12 -0
  133. data/src/core/lib/channel/call_tracer.h +17 -3
  134. data/src/core/lib/channel/channel_args.cc +24 -14
  135. data/src/core/lib/channel/channel_args.h +74 -13
  136. data/src/core/lib/channel/channel_stack.cc +27 -0
  137. data/src/core/lib/channel/channel_stack.h +10 -10
  138. data/src/core/lib/channel/connected_channel.cc +64 -18
  139. data/src/core/lib/channel/promise_based_filter.h +1041 -1
  140. data/src/core/lib/channel/server_call_tracer_filter.cc +43 -35
  141. data/src/core/lib/compression/compression_internal.cc +0 -3
  142. data/src/core/lib/event_engine/ares_resolver.cc +35 -14
  143. data/src/core/lib/event_engine/ares_resolver.h +9 -10
  144. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +8 -1
  145. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +132 -0
  146. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h +61 -0
  147. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +52 -36
  148. data/src/core/lib/event_engine/posix_engine/posix_engine.h +4 -9
  149. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +11 -3
  150. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +9 -2
  151. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +7 -0
  152. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +17 -27
  153. data/src/core/lib/event_engine/posix_engine/timer_manager.h +0 -3
  154. data/src/core/lib/event_engine/ref_counted_dns_resolver_interface.h +55 -0
  155. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.cc +114 -0
  156. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.h +51 -0
  157. data/src/core/lib/event_engine/windows/windows_engine.cc +7 -7
  158. data/src/core/lib/experiments/config.cc +13 -0
  159. data/src/core/lib/experiments/config.h +3 -0
  160. data/src/core/lib/experiments/experiments.cc +245 -366
  161. data/src/core/lib/experiments/experiments.h +50 -156
  162. data/src/core/lib/gprpp/debug_location.h +13 -0
  163. data/src/core/lib/gprpp/dual_ref_counted.h +36 -7
  164. data/src/core/lib/gprpp/orphanable.h +27 -0
  165. data/src/core/lib/gprpp/ref_counted.h +63 -22
  166. data/src/core/lib/gprpp/ref_counted_ptr.h +70 -27
  167. data/src/core/lib/gprpp/ref_counted_string.h +13 -0
  168. data/src/core/lib/gprpp/status_helper.cc +1 -2
  169. data/src/core/lib/iomgr/combiner.cc +15 -51
  170. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +31 -0
  171. data/src/core/lib/iomgr/event_engine_shims/endpoint.h +16 -0
  172. data/src/core/lib/iomgr/tcp_client_posix.cc +4 -3
  173. data/src/core/lib/load_balancing/lb_policy.h +1 -1
  174. data/src/core/lib/promise/activity.cc +17 -2
  175. data/src/core/lib/promise/activity.h +5 -4
  176. data/src/core/lib/promise/all_ok.h +80 -0
  177. data/src/core/lib/promise/detail/join_state.h +2077 -0
  178. data/src/core/lib/promise/detail/promise_factory.h +1 -0
  179. data/src/core/lib/promise/detail/promise_like.h +8 -1
  180. data/src/core/lib/promise/detail/seq_state.h +3458 -150
  181. data/src/core/lib/promise/detail/status.h +42 -5
  182. data/src/core/lib/promise/for_each.h +13 -1
  183. data/src/core/lib/promise/if.h +4 -0
  184. data/src/core/lib/promise/latch.h +6 -3
  185. data/src/core/lib/promise/party.cc +33 -31
  186. data/src/core/lib/promise/party.h +142 -6
  187. data/src/core/lib/promise/poll.h +39 -13
  188. data/src/core/lib/promise/promise.h +4 -0
  189. data/src/core/lib/promise/seq.h +107 -7
  190. data/src/core/lib/promise/status_flag.h +196 -0
  191. data/src/core/lib/promise/try_join.h +132 -0
  192. data/src/core/lib/promise/try_seq.h +132 -10
  193. data/src/core/lib/resolver/endpoint_addresses.cc +0 -1
  194. data/src/core/lib/resolver/endpoint_addresses.h +48 -0
  195. data/src/core/lib/resource_quota/arena.h +2 -2
  196. data/src/core/lib/resource_quota/memory_quota.cc +57 -8
  197. data/src/core/lib/resource_quota/memory_quota.h +6 -0
  198. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +14 -11
  199. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +14 -5
  200. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +4 -0
  201. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +4 -0
  202. data/src/core/lib/security/credentials/external/external_account_credentials.cc +28 -20
  203. data/src/core/lib/security/credentials/external/external_account_credentials.h +4 -0
  204. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +4 -0
  205. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -0
  206. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +4 -0
  207. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +4 -0
  208. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -1
  209. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +0 -3
  210. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +12 -0
  211. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.cc +22 -5
  212. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.h +1 -5
  213. data/src/core/lib/security/credentials/tls/tls_credentials.cc +16 -0
  214. data/src/core/lib/security/credentials/xds/xds_credentials.cc +21 -28
  215. data/src/core/lib/security/credentials/xds/xds_credentials.h +2 -4
  216. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +4 -3
  217. data/src/core/lib/security/transport/auth_filters.h +71 -4
  218. data/src/core/lib/security/transport/client_auth_filter.cc +2 -4
  219. data/src/core/lib/security/transport/legacy_server_auth_filter.cc +244 -0
  220. data/src/core/lib/security/transport/server_auth_filter.cc +70 -90
  221. data/src/core/lib/slice/slice_buffer.h +3 -0
  222. data/src/core/lib/surface/builtins.cc +1 -1
  223. data/src/core/lib/surface/call.cc +683 -196
  224. data/src/core/lib/surface/call.h +26 -13
  225. data/src/core/lib/surface/call_trace.cc +42 -1
  226. data/src/core/lib/surface/channel.cc +0 -1
  227. data/src/core/lib/surface/channel.h +0 -6
  228. data/src/core/lib/surface/channel_init.h +26 -0
  229. data/src/core/lib/surface/init.cc +14 -8
  230. data/src/core/lib/surface/server.cc +256 -237
  231. data/src/core/lib/surface/server.h +26 -54
  232. data/src/core/lib/surface/version.cc +2 -2
  233. data/src/core/lib/surface/wait_for_cq_end_op.h +94 -0
  234. data/src/core/lib/transport/call_final_info.cc +38 -0
  235. data/src/core/lib/transport/call_final_info.h +54 -0
  236. data/src/core/lib/transport/connectivity_state.cc +3 -2
  237. data/src/core/lib/transport/connectivity_state.h +4 -0
  238. data/src/core/lib/transport/metadata_batch.h +4 -4
  239. data/src/core/lib/transport/transport.cc +70 -19
  240. data/src/core/lib/transport/transport.h +395 -25
  241. data/src/core/plugin_registry/grpc_plugin_registry.cc +3 -0
  242. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +0 -3
  243. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  244. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
  245. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -1
  246. data/src/core/tsi/ssl_transport_security.cc +65 -43
  247. data/src/ruby/ext/grpc/rb_channel_args.c +3 -1
  248. data/src/ruby/ext/grpc/rb_grpc.c +0 -1
  249. data/src/ruby/ext/grpc/rb_grpc.h +0 -2
  250. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  251. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  252. data/src/ruby/lib/grpc/version.rb +1 -1
  253. data/third_party/upb/upb/reflection/def_pool.h +2 -2
  254. data/third_party/zlib/adler32.c +5 -27
  255. data/third_party/zlib/compress.c +5 -16
  256. data/third_party/zlib/crc32.c +86 -162
  257. data/third_party/zlib/deflate.c +233 -336
  258. data/third_party/zlib/deflate.h +8 -8
  259. data/third_party/zlib/gzguts.h +11 -12
  260. data/third_party/zlib/infback.c +7 -23
  261. data/third_party/zlib/inffast.c +1 -4
  262. data/third_party/zlib/inffast.h +1 -1
  263. data/third_party/zlib/inflate.c +30 -99
  264. data/third_party/zlib/inftrees.c +6 -11
  265. data/third_party/zlib/inftrees.h +3 -3
  266. data/third_party/zlib/trees.c +224 -302
  267. data/third_party/zlib/uncompr.c +4 -12
  268. data/third_party/zlib/zconf.h +6 -2
  269. data/third_party/zlib/zlib.h +191 -188
  270. data/third_party/zlib/zutil.c +16 -44
  271. data/third_party/zlib/zutil.h +10 -10
  272. metadata +35 -13
  273. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +0 -1173
  274. data/src/core/lib/event_engine/memory_allocator.cc +0 -74
  275. data/src/core/lib/transport/pid_controller.cc +0 -51
  276. data/src/core/lib/transport/pid_controller.h +0 -116
  277. data/third_party/upb/upb/collections/array.h +0 -17
  278. data/third_party/upb/upb/collections/map.h +0 -17
  279. data/third_party/upb/upb/upb.hpp +0 -18
@@ -47,7 +47,8 @@ namespace grpc_core {
47
47
 
48
48
  namespace {
49
49
 
50
- class ServerConfigSelectorFilter final : public ChannelFilter {
50
+ class ServerConfigSelectorFilter final
51
+ : public ImplementChannelFilter<ServerConfigSelectorFilter> {
51
52
  public:
52
53
  ~ServerConfigSelectorFilter() override;
53
54
 
@@ -60,8 +61,16 @@ class ServerConfigSelectorFilter final : public ChannelFilter {
60
61
  static absl::StatusOr<ServerConfigSelectorFilter> Create(
61
62
  const ChannelArgs& args, ChannelFilter::Args);
62
63
 
63
- ArenaPromise<ServerMetadataHandle> MakeCallPromise(
64
- CallArgs call_args, NextPromiseFactory next_promise_factory) override;
64
+ class Call {
65
+ public:
66
+ absl::Status OnClientInitialMetadata(ClientMetadata& md,
67
+ ServerConfigSelectorFilter* filter);
68
+ static const NoInterceptor OnServerInitialMetadata;
69
+ static const NoInterceptor OnServerTrailingMetadata;
70
+ static const NoInterceptor OnClientToServerMessage;
71
+ static const NoInterceptor OnServerToClientMessage;
72
+ static const NoInterceptor OnFinalize;
73
+ };
65
74
 
66
75
  absl::StatusOr<RefCountedPtr<ServerConfigSelector>> config_selector() {
67
76
  MutexLock lock(&state_->mu);
@@ -130,25 +139,28 @@ ServerConfigSelectorFilter::~ServerConfigSelectorFilter() {
130
139
  }
131
140
  }
132
141
 
133
- ArenaPromise<ServerMetadataHandle> ServerConfigSelectorFilter::MakeCallPromise(
134
- CallArgs call_args, NextPromiseFactory next_promise_factory) {
135
- auto sel = config_selector();
136
- if (!sel.ok()) return Immediate(ServerMetadataFromStatus(sel.status()));
137
- auto call_config =
138
- sel.value()->GetCallConfig(call_args.client_initial_metadata.get());
142
+ absl::Status ServerConfigSelectorFilter::Call::OnClientInitialMetadata(
143
+ ClientMetadata& md, ServerConfigSelectorFilter* filter) {
144
+ auto sel = filter->config_selector();
145
+ if (!sel.ok()) return sel.status();
146
+ auto call_config = sel.value()->GetCallConfig(&md);
139
147
  if (!call_config.ok()) {
140
- auto r = Immediate(ServerMetadataFromStatus(
141
- absl::UnavailableError(StatusToString(call_config.status()))));
142
- return std::move(r);
148
+ return absl::UnavailableError(StatusToString(call_config.status()));
143
149
  }
144
150
  auto* service_config_call_data =
145
151
  GetContext<Arena>()->New<ServiceConfigCallData>(
146
152
  GetContext<Arena>(), GetContext<grpc_call_context_element>());
147
153
  service_config_call_data->SetServiceConfig(
148
154
  std::move(call_config->service_config), call_config->method_configs);
149
- return next_promise_factory(std::move(call_args));
155
+ return absl::OkStatus();
150
156
  }
151
157
 
158
+ const NoInterceptor ServerConfigSelectorFilter::Call::OnServerInitialMetadata;
159
+ const NoInterceptor ServerConfigSelectorFilter::Call::OnServerTrailingMetadata;
160
+ const NoInterceptor ServerConfigSelectorFilter::Call::OnClientToServerMessage;
161
+ const NoInterceptor ServerConfigSelectorFilter::Call::OnServerToClientMessage;
162
+ const NoInterceptor ServerConfigSelectorFilter::Call::OnFinalize;
163
+
152
164
  } // namespace
153
165
 
154
166
  const grpc_channel_filter kServerConfigSelectorFilter =
@@ -38,7 +38,7 @@
38
38
 
39
39
  #include <grpc/support/log.h>
40
40
 
41
- #include "src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h"
41
+ #include "src/core/ext/filters/client_channel/resolver/xds/xds_resolver_attributes.h"
42
42
  #include "src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h"
43
43
  #include "src/core/lib/channel/channel_stack.h"
44
44
  #include "src/core/lib/channel/context.h"
@@ -58,6 +58,9 @@
58
58
  namespace grpc_core {
59
59
 
60
60
  TraceFlag grpc_stateful_session_filter_trace(false, "stateful_session_filter");
61
+ const NoInterceptor StatefulSessionFilter::Call::OnClientToServerMessage;
62
+ const NoInterceptor StatefulSessionFilter::Call::OnServerToClientMessage;
63
+ const NoInterceptor StatefulSessionFilter::Call::OnFinalize;
61
64
 
62
65
  UniqueTypeName XdsOverrideHostAttribute::TypeName() {
63
66
  static UniqueTypeName::Factory kFactory("xds_override_host");
@@ -103,7 +106,7 @@ void MaybeUpdateServerInitialMetadata(
103
106
  bool cluster_changed, absl::string_view actual_cluster,
104
107
  absl::string_view cookie_address_list,
105
108
  XdsOverrideHostAttribute* override_host_attribute,
106
- ServerMetadata* server_initial_metadata) {
109
+ ServerMetadata& server_initial_metadata) {
107
110
  // If cookie doesn't need to change, do nothing.
108
111
  if (cookie_address_list == override_host_attribute->actual_address_list() &&
109
112
  !cluster_changed) {
@@ -121,7 +124,7 @@ void MaybeUpdateServerInitialMetadata(
121
124
  parts.emplace_back(
122
125
  absl::StrCat("Max-Age=", cookie_config->ttl.as_timespec().tv_sec));
123
126
  }
124
- server_initial_metadata->Append(
127
+ server_initial_metadata.Append(
125
128
  "set-cookie", Slice::FromCopiedString(absl::StrJoin(parts, "; ")),
126
129
  [](absl::string_view error, const Slice&) {
127
130
  Crash(absl::StrCat("ERROR ADDING set-cookie METADATA: ", error));
@@ -168,12 +171,11 @@ absl::string_view GetClusterToUse(
168
171
  return absl::StripPrefix(arena_allocated_cluster, kClusterPrefix);
169
172
  }
170
173
 
171
- std::string GetCookieValue(const ClientMetadataHandle& client_initial_metadata,
174
+ std::string GetCookieValue(const ClientMetadata& client_initial_metadata,
172
175
  absl::string_view cookie_name) {
173
176
  // Check to see if the cookie header is present.
174
177
  std::string buffer;
175
- auto header_value =
176
- client_initial_metadata->GetStringValue("cookie", &buffer);
178
+ auto header_value = client_initial_metadata.GetStringValue("cookie", &buffer);
177
179
  if (!header_value.has_value()) return "";
178
180
  // Parse cookie header.
179
181
  std::vector<absl::string_view> values;
@@ -193,13 +195,14 @@ std::string GetCookieValue(const ClientMetadataHandle& client_initial_metadata,
193
195
  }
194
196
 
195
197
  bool IsConfiguredPath(absl::string_view configured_path,
196
- const ClientMetadataHandle& client_initial_metadata) {
198
+ const ClientMetadata& client_initial_metadata) {
197
199
  // No path configured meaning all paths match
198
200
  if (configured_path.empty()) {
199
201
  return true;
200
202
  }
201
203
  // Check to see if the configured path matches the request path.
202
- Slice* path_slice = client_initial_metadata->get_pointer(HttpPathMetadata());
204
+ const Slice* path_slice =
205
+ client_initial_metadata.get_pointer(HttpPathMetadata());
203
206
  GPR_ASSERT(path_slice != nullptr);
204
207
  absl::string_view path = path_slice->as_string_view();
205
208
  // Matching criteria from
@@ -218,9 +221,8 @@ bool IsConfiguredPath(absl::string_view configured_path,
218
221
  }
219
222
  } // namespace
220
223
 
221
- // Construct a promise for one call.
222
- ArenaPromise<ServerMetadataHandle> StatefulSessionFilter::MakeCallPromise(
223
- CallArgs call_args, NextPromiseFactory next_promise_factory) {
224
+ void StatefulSessionFilter::Call::OnClientInitialMetadata(
225
+ ClientMetadata& md, StatefulSessionFilter* filter) {
224
226
  // Get config.
225
227
  auto* service_config_call_data = static_cast<ServiceConfigCallData*>(
226
228
  GetContext<
@@ -229,62 +231,57 @@ ArenaPromise<ServerMetadataHandle> StatefulSessionFilter::MakeCallPromise(
229
231
  GPR_ASSERT(service_config_call_data != nullptr);
230
232
  auto* method_params = static_cast<StatefulSessionMethodParsedConfig*>(
231
233
  service_config_call_data->GetMethodParsedConfig(
232
- service_config_parser_index_));
234
+ filter->service_config_parser_index_));
233
235
  GPR_ASSERT(method_params != nullptr);
234
- auto* cookie_config = method_params->GetConfig(index_);
235
- GPR_ASSERT(cookie_config != nullptr);
236
- if (!cookie_config->name.has_value() ||
237
- !IsConfiguredPath(cookie_config->path,
238
- call_args.client_initial_metadata)) {
239
- return next_promise_factory(std::move(call_args));
236
+ cookie_config_ = method_params->GetConfig(filter->index_);
237
+ GPR_ASSERT(cookie_config_ != nullptr);
238
+ if (!cookie_config_->name.has_value() ||
239
+ !IsConfiguredPath(cookie_config_->path, md)) {
240
+ return;
240
241
  }
241
242
  // Base64-decode cookie value.
242
- std::string cookie_value =
243
- GetCookieValue(call_args.client_initial_metadata, *cookie_config->name);
243
+ std::string cookie_value = GetCookieValue(md, *cookie_config_->name);
244
244
  // Cookie format is "host;cluster"
245
245
  std::pair<absl::string_view, absl::string_view> host_cluster =
246
246
  absl::StrSplit(cookie_value, absl::MaxSplits(';', 1));
247
- absl::string_view cookie_address_list;
248
247
  // Allocate the string on the arena, so that it has the right lifetime.
249
248
  if (!host_cluster.first.empty()) {
250
- cookie_address_list = AllocateStringOnArena(host_cluster.first);
249
+ cookie_address_list_ = AllocateStringOnArena(host_cluster.first);
251
250
  }
252
251
  // Set override host attribute.
253
- auto* override_host_attribute =
252
+ override_host_attribute_ =
254
253
  GetContext<Arena>()->ManagedNew<XdsOverrideHostAttribute>(
255
- cookie_address_list);
256
- service_config_call_data->SetCallAttribute(override_host_attribute);
254
+ cookie_address_list_);
255
+ service_config_call_data->SetCallAttribute(override_host_attribute_);
257
256
  // Check if the cluster override is valid, and apply it if necessary.
258
257
  // Note that cluster_name will point to an arena-allocated string
259
258
  // that will still be alive when we see the server initial metadata.
260
259
  // If the cluster name is empty, that means we cannot use a
261
260
  // cluster override (i.e., the route uses a cluster specifier plugin).
262
- absl::string_view cluster_name =
261
+ cluster_name_ =
263
262
  GetClusterToUse(host_cluster.second, service_config_call_data);
264
- bool cluster_changed = cluster_name != host_cluster.second;
265
- // Intercept server initial metadata.
266
- call_args.server_initial_metadata->InterceptAndMap(
267
- [cookie_config, cluster_changed, cluster_name, cookie_address_list,
268
- override_host_attribute](ServerMetadataHandle md) {
269
- // Add cookie to server initial metadata if needed.
270
- MaybeUpdateServerInitialMetadata(cookie_config, cluster_changed,
271
- cluster_name, cookie_address_list,
272
- override_host_attribute, md.get());
273
- return md;
274
- });
275
- return Map(next_promise_factory(std::move(call_args)),
276
- [cookie_config, cluster_changed, cluster_name, cookie_address_list,
277
- override_host_attribute](ServerMetadataHandle md) {
278
- // If we got a Trailers-Only response, then add the
279
- // cookie to the trailing metadata instead of the
280
- // initial metadata.
281
- if (md->get(GrpcTrailersOnly()).value_or(false)) {
282
- MaybeUpdateServerInitialMetadata(
283
- cookie_config, cluster_changed, cluster_name,
284
- cookie_address_list, override_host_attribute, md.get());
285
- }
286
- return md;
287
- });
263
+ cluster_changed_ = cluster_name_ != host_cluster.second;
264
+ perform_filtering_ = true;
265
+ }
266
+
267
+ void StatefulSessionFilter::Call::OnServerInitialMetadata(ServerMetadata& md) {
268
+ if (!perform_filtering_) return;
269
+ // Add cookie to server initial metadata if needed.
270
+ MaybeUpdateServerInitialMetadata(cookie_config_, cluster_changed_,
271
+ cluster_name_, cookie_address_list_,
272
+ override_host_attribute_, md);
273
+ }
274
+
275
+ void StatefulSessionFilter::Call::OnServerTrailingMetadata(ServerMetadata& md) {
276
+ if (!perform_filtering_) return;
277
+ // If we got a Trailers-Only response, then add the
278
+ // cookie to the trailing metadata instead of the
279
+ // initial metadata.
280
+ if (md.get(GrpcTrailersOnly()).value_or(false)) {
281
+ MaybeUpdateServerInitialMetadata(cookie_config_, cluster_changed_,
282
+ cluster_name_, cookie_address_list_,
283
+ override_host_attribute_, md);
284
+ }
288
285
  }
289
286
 
290
287
  void StatefulSessionFilterRegister(CoreConfiguration::Builder* builder) {
@@ -26,6 +26,7 @@
26
26
  #include "absl/status/statusor.h"
27
27
  #include "absl/strings/string_view.h"
28
28
 
29
+ #include "src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h"
29
30
  #include "src/core/lib/channel/channel_args.h"
30
31
  #include "src/core/lib/channel/channel_fwd.h"
31
32
  #include "src/core/lib/channel/promise_based_filter.h"
@@ -68,16 +69,32 @@ class XdsOverrideHostAttribute
68
69
  };
69
70
 
70
71
  // A filter to provide cookie-based stateful session affinity.
71
- class StatefulSessionFilter : public ChannelFilter {
72
+ class StatefulSessionFilter
73
+ : public ImplementChannelFilter<StatefulSessionFilter> {
72
74
  public:
73
75
  static const grpc_channel_filter kFilter;
74
76
 
75
77
  static absl::StatusOr<StatefulSessionFilter> Create(
76
78
  const ChannelArgs& args, ChannelFilter::Args filter_args);
77
79
 
78
- // Construct a promise for one call.
79
- ArenaPromise<ServerMetadataHandle> MakeCallPromise(
80
- CallArgs call_args, NextPromiseFactory next_promise_factory) override;
80
+ class Call {
81
+ public:
82
+ void OnClientInitialMetadata(ClientMetadata& md,
83
+ StatefulSessionFilter* filter);
84
+ void OnServerInitialMetadata(ServerMetadata& md);
85
+ void OnServerTrailingMetadata(ServerMetadata& md);
86
+ static const NoInterceptor OnClientToServerMessage;
87
+ static const NoInterceptor OnServerToClientMessage;
88
+ static const NoInterceptor OnFinalize;
89
+
90
+ private:
91
+ const StatefulSessionMethodParsedConfig::CookieConfig* cookie_config_;
92
+ XdsOverrideHostAttribute* override_host_attribute_;
93
+ absl::string_view cluster_name_;
94
+ absl::string_view cookie_address_list_;
95
+ bool cluster_changed_;
96
+ bool perform_filtering_ = false;
97
+ };
81
98
 
82
99
  private:
83
100
  explicit StatefulSessionFilter(ChannelFilter::Args filter_args);
@@ -25,7 +25,7 @@
25
25
  #include "src/core/lib/gpr/useful.h"
26
26
 
27
27
  // in order of preference
28
- static const char* const supported_versions[] = {"grpc-exp", "h2"};
28
+ static const char* const supported_versions[] = {"h2"};
29
29
 
30
30
  int grpc_chttp2_is_alpn_version_supported(const char* version, size_t size) {
31
31
  size_t i;
@@ -177,9 +177,9 @@ void Chttp2Connector::OnHandshakeDone(void* arg, grpc_error_handle error) {
177
177
  grpc_chttp2_transport_start_reading(self->result_->transport,
178
178
  args->read_buffer,
179
179
  &self->on_receive_settings_, nullptr);
180
- RefCountedPtr<Chttp2Connector> cc = self->Ref();
181
180
  self->timer_handle_ = self->event_engine_->RunAfter(
182
- self->args_.deadline - Timestamp::Now(), [self = std::move(cc)] {
181
+ self->args_.deadline - Timestamp::Now(),
182
+ [self = self->RefAsSubclass<Chttp2Connector>()] {
183
183
  ApplicationCallbackExecCtx callback_exec_ctx;
184
184
  ExecCtx exec_ctx;
185
185
  self->OnTimeout();
@@ -617,8 +617,17 @@ void Chttp2ServerListener::ActiveConnection::Start(
617
617
  RefCountedPtr<HandshakingState> handshaking_state_ref;
618
618
  listener_ = std::move(listener);
619
619
  {
620
- MutexLock lock(&mu_);
621
- if (shutdown_) return;
620
+ ReleasableMutexLock lock(&mu_);
621
+ if (shutdown_) {
622
+ lock.Release();
623
+ // If the Connection is already shutdown at this point, it implies the
624
+ // owning Chttp2ServerListener and all associated ActiveConnections have
625
+ // been orphaned. The generated endpoints need to be shutdown here to
626
+ // ensure the tcp connections are closed appropriately.
627
+ grpc_endpoint_shutdown(endpoint, absl::OkStatus());
628
+ grpc_endpoint_destroy(endpoint);
629
+ return;
630
+ }
622
631
  // Hold a ref to HandshakingState to allow starting the handshake outside
623
632
  // the critical region.
624
633
  handshaking_state_ref = handshaking_state_->Ref();