grpc 1.60.0 → 1.61.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 (277) 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 +67 -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/http2_settings.cc +122 -32
  93. data/src/core/ext/transport/chttp2/transport/http2_settings.h +142 -37
  94. data/src/core/ext/transport/chttp2/transport/internal.h +1 -22
  95. data/src/core/ext/transport/chttp2/transport/parsing.cc +23 -37
  96. data/src/core/ext/transport/chttp2/transport/writing.cc +26 -58
  97. data/src/core/ext/transport/inproc/inproc_transport.cc +172 -13
  98. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb.h +712 -0
  99. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.c +151 -0
  100. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.h +33 -0
  101. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.c +133 -0
  102. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.h +50 -0
  103. data/src/core/ext/xds/certificate_provider_store.cc +2 -1
  104. data/src/core/ext/xds/certificate_provider_store.h +0 -5
  105. data/src/core/ext/xds/xds_api.cc +31 -18
  106. data/src/core/ext/xds/xds_api.h +2 -2
  107. data/src/core/ext/xds/xds_bootstrap.h +3 -0
  108. data/src/core/ext/xds/xds_certificate_provider.cc +88 -287
  109. data/src/core/ext/xds/xds_certificate_provider.h +44 -111
  110. data/src/core/ext/xds/xds_client.cc +420 -414
  111. data/src/core/ext/xds/xds_client.h +31 -22
  112. data/src/core/ext/xds/xds_client_grpc.cc +3 -1
  113. data/src/core/ext/xds/xds_cluster.cc +104 -11
  114. data/src/core/ext/xds/xds_cluster.h +9 -1
  115. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +9 -5
  116. data/src/core/ext/xds/xds_common_types.cc +14 -10
  117. data/src/core/ext/xds/xds_endpoint.cc +9 -4
  118. data/src/core/ext/xds/xds_endpoint.h +5 -1
  119. data/src/core/ext/xds/xds_health_status.cc +12 -2
  120. data/src/core/ext/xds/xds_health_status.h +4 -2
  121. data/src/core/ext/xds/xds_http_rbac_filter.cc +5 -3
  122. data/src/core/ext/xds/xds_listener.cc +14 -8
  123. data/src/core/ext/xds/xds_resource_type_impl.h +6 -4
  124. data/src/core/ext/xds/xds_route_config.cc +34 -22
  125. data/src/core/ext/xds/xds_route_config.h +1 -0
  126. data/src/core/ext/xds/xds_server_config_fetcher.cc +61 -57
  127. data/src/core/ext/xds/xds_transport.h +3 -0
  128. data/src/core/ext/xds/xds_transport_grpc.cc +47 -50
  129. data/src/core/ext/xds/xds_transport_grpc.h +4 -0
  130. data/src/core/lib/channel/call_tracer.cc +12 -0
  131. data/src/core/lib/channel/call_tracer.h +17 -3
  132. data/src/core/lib/channel/channel_args.cc +24 -14
  133. data/src/core/lib/channel/channel_args.h +74 -13
  134. data/src/core/lib/channel/channel_stack.cc +27 -0
  135. data/src/core/lib/channel/channel_stack.h +10 -10
  136. data/src/core/lib/channel/connected_channel.cc +64 -18
  137. data/src/core/lib/channel/promise_based_filter.h +1041 -1
  138. data/src/core/lib/channel/server_call_tracer_filter.cc +43 -35
  139. data/src/core/lib/compression/compression_internal.cc +0 -3
  140. data/src/core/lib/event_engine/ares_resolver.cc +35 -14
  141. data/src/core/lib/event_engine/ares_resolver.h +9 -10
  142. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +8 -1
  143. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +132 -0
  144. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h +61 -0
  145. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +52 -36
  146. data/src/core/lib/event_engine/posix_engine/posix_engine.h +4 -9
  147. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +11 -3
  148. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +9 -2
  149. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +7 -0
  150. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +17 -27
  151. data/src/core/lib/event_engine/posix_engine/timer_manager.h +0 -3
  152. data/src/core/lib/event_engine/ref_counted_dns_resolver_interface.h +55 -0
  153. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.cc +114 -0
  154. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.h +51 -0
  155. data/src/core/lib/event_engine/windows/windows_engine.cc +7 -7
  156. data/src/core/lib/experiments/config.cc +13 -0
  157. data/src/core/lib/experiments/config.h +3 -0
  158. data/src/core/lib/experiments/experiments.cc +245 -366
  159. data/src/core/lib/experiments/experiments.h +50 -156
  160. data/src/core/lib/gprpp/debug_location.h +13 -0
  161. data/src/core/lib/gprpp/dual_ref_counted.h +36 -7
  162. data/src/core/lib/gprpp/orphanable.h +27 -0
  163. data/src/core/lib/gprpp/ref_counted.h +63 -22
  164. data/src/core/lib/gprpp/ref_counted_ptr.h +70 -27
  165. data/src/core/lib/gprpp/ref_counted_string.h +13 -0
  166. data/src/core/lib/gprpp/status_helper.cc +1 -2
  167. data/src/core/lib/iomgr/combiner.cc +15 -51
  168. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +31 -0
  169. data/src/core/lib/iomgr/event_engine_shims/endpoint.h +16 -0
  170. data/src/core/lib/iomgr/tcp_client_posix.cc +4 -3
  171. data/src/core/lib/load_balancing/lb_policy.h +1 -1
  172. data/src/core/lib/promise/activity.cc +17 -2
  173. data/src/core/lib/promise/activity.h +5 -4
  174. data/src/core/lib/promise/all_ok.h +80 -0
  175. data/src/core/lib/promise/detail/join_state.h +2077 -0
  176. data/src/core/lib/promise/detail/promise_factory.h +1 -0
  177. data/src/core/lib/promise/detail/promise_like.h +8 -1
  178. data/src/core/lib/promise/detail/seq_state.h +3458 -150
  179. data/src/core/lib/promise/detail/status.h +42 -5
  180. data/src/core/lib/promise/for_each.h +13 -1
  181. data/src/core/lib/promise/if.h +4 -0
  182. data/src/core/lib/promise/latch.h +6 -3
  183. data/src/core/lib/promise/party.cc +33 -31
  184. data/src/core/lib/promise/party.h +142 -6
  185. data/src/core/lib/promise/poll.h +39 -13
  186. data/src/core/lib/promise/promise.h +4 -0
  187. data/src/core/lib/promise/seq.h +107 -7
  188. data/src/core/lib/promise/status_flag.h +196 -0
  189. data/src/core/lib/promise/try_join.h +132 -0
  190. data/src/core/lib/promise/try_seq.h +132 -10
  191. data/src/core/lib/resolver/endpoint_addresses.cc +0 -1
  192. data/src/core/lib/resolver/endpoint_addresses.h +48 -0
  193. data/src/core/lib/resource_quota/arena.h +2 -2
  194. data/src/core/lib/resource_quota/memory_quota.cc +57 -8
  195. data/src/core/lib/resource_quota/memory_quota.h +6 -0
  196. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +14 -11
  197. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +14 -5
  198. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +4 -0
  199. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +4 -0
  200. data/src/core/lib/security/credentials/external/external_account_credentials.cc +28 -20
  201. data/src/core/lib/security/credentials/external/external_account_credentials.h +4 -0
  202. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +4 -0
  203. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -0
  204. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +4 -0
  205. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +4 -0
  206. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -1
  207. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +0 -3
  208. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +12 -0
  209. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.cc +22 -5
  210. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.h +1 -5
  211. data/src/core/lib/security/credentials/tls/tls_credentials.cc +16 -0
  212. data/src/core/lib/security/credentials/xds/xds_credentials.cc +21 -28
  213. data/src/core/lib/security/credentials/xds/xds_credentials.h +2 -4
  214. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +4 -3
  215. data/src/core/lib/security/transport/auth_filters.h +71 -4
  216. data/src/core/lib/security/transport/client_auth_filter.cc +2 -4
  217. data/src/core/lib/security/transport/legacy_server_auth_filter.cc +244 -0
  218. data/src/core/lib/security/transport/server_auth_filter.cc +70 -90
  219. data/src/core/lib/slice/slice_buffer.h +3 -0
  220. data/src/core/lib/surface/builtins.cc +1 -1
  221. data/src/core/lib/surface/call.cc +683 -196
  222. data/src/core/lib/surface/call.h +26 -13
  223. data/src/core/lib/surface/call_trace.cc +42 -1
  224. data/src/core/lib/surface/channel.cc +0 -1
  225. data/src/core/lib/surface/channel.h +0 -6
  226. data/src/core/lib/surface/channel_init.h +26 -0
  227. data/src/core/lib/surface/init.cc +14 -8
  228. data/src/core/lib/surface/server.cc +256 -237
  229. data/src/core/lib/surface/server.h +26 -54
  230. data/src/core/lib/surface/version.cc +2 -2
  231. data/src/core/lib/surface/wait_for_cq_end_op.h +94 -0
  232. data/src/core/lib/transport/call_final_info.cc +38 -0
  233. data/src/core/lib/transport/call_final_info.h +54 -0
  234. data/src/core/lib/transport/connectivity_state.cc +3 -2
  235. data/src/core/lib/transport/connectivity_state.h +4 -0
  236. data/src/core/lib/transport/metadata_batch.h +4 -4
  237. data/src/core/lib/transport/transport.cc +70 -19
  238. data/src/core/lib/transport/transport.h +395 -25
  239. data/src/core/plugin_registry/grpc_plugin_registry.cc +3 -0
  240. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +0 -3
  241. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  242. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
  243. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -1
  244. data/src/core/tsi/ssl_transport_security.cc +65 -43
  245. data/src/ruby/ext/grpc/rb_channel_args.c +3 -1
  246. data/src/ruby/ext/grpc/rb_grpc.c +0 -1
  247. data/src/ruby/ext/grpc/rb_grpc.h +0 -2
  248. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  249. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  250. data/src/ruby/lib/grpc/version.rb +1 -1
  251. data/third_party/upb/upb/reflection/def_pool.h +2 -2
  252. data/third_party/zlib/adler32.c +5 -27
  253. data/third_party/zlib/compress.c +5 -16
  254. data/third_party/zlib/crc32.c +86 -162
  255. data/third_party/zlib/deflate.c +233 -336
  256. data/third_party/zlib/deflate.h +8 -8
  257. data/third_party/zlib/gzguts.h +11 -12
  258. data/third_party/zlib/infback.c +7 -23
  259. data/third_party/zlib/inffast.c +1 -4
  260. data/third_party/zlib/inffast.h +1 -1
  261. data/third_party/zlib/inflate.c +30 -99
  262. data/third_party/zlib/inftrees.c +6 -11
  263. data/third_party/zlib/inftrees.h +3 -3
  264. data/third_party/zlib/trees.c +224 -302
  265. data/third_party/zlib/uncompr.c +4 -12
  266. data/third_party/zlib/zconf.h +6 -2
  267. data/third_party/zlib/zlib.h +191 -188
  268. data/third_party/zlib/zutil.c +16 -44
  269. data/third_party/zlib/zutil.h +10 -10
  270. metadata +35 -13
  271. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +0 -1173
  272. data/src/core/lib/event_engine/memory_allocator.cc +0 -74
  273. data/src/core/lib/transport/pid_controller.cc +0 -51
  274. data/src/core/lib/transport/pid_controller.h +0 -116
  275. data/third_party/upb/upb/collections/array.h +0 -17
  276. data/third_party/upb/upb/collections/map.h +0 -17
  277. 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();
@@ -79,6 +79,7 @@
79
79
  #include "src/core/lib/debug/stats.h"
80
80
  #include "src/core/lib/debug/stats_data.h"
81
81
  #include "src/core/lib/experiments/experiments.h"
82
+ #include "src/core/lib/gpr/string.h"
82
83
  #include "src/core/lib/gpr/useful.h"
83
84
  #include "src/core/lib/gprpp/bitset.h"
84
85
  #include "src/core/lib/gprpp/crash.h"
@@ -162,10 +163,6 @@ static void read_action_locked(grpc_core::RefCountedPtr<grpc_chttp2_transport>,
162
163
  static void continue_read_action_locked(
163
164
  grpc_core::RefCountedPtr<grpc_chttp2_transport> t);
164
165
 
165
- // Set a transport level setting, and push it to our peer
166
- static void queue_setting_update(grpc_chttp2_transport* t,
167
- grpc_chttp2_setting_id id, uint32_t value);
168
-
169
166
  static void close_from_api(grpc_chttp2_transport* t, grpc_chttp2_stream* s,
170
167
  grpc_error_handle error, bool tarpit);
171
168
 
@@ -342,7 +339,7 @@ void ForEachContextListEntryExecute(void* arg, Timestamps* ts,
342
339
  }
343
340
 
344
341
  HttpAnnotation::HttpAnnotation(
345
- Type type, Timestamp time,
342
+ Type type, gpr_timespec time,
346
343
  absl::optional<chttp2::TransportFlowControl::Stats> transport_stats,
347
344
  absl::optional<chttp2::StreamFlowControl::Stats> stream_stats)
348
345
  : CallTracerAnnotationInterface::Annotation(
@@ -367,7 +364,7 @@ std::string HttpAnnotation::ToString() const {
367
364
  default:
368
365
  absl::StrAppend(&s, "Unknown");
369
366
  }
370
- absl::StrAppend(&s, " time: ", time_.ToString());
367
+ absl::StrAppend(&s, " time: ", gpr_format_timespec(time_));
371
368
  if (transport_stats_.has_value()) {
372
369
  absl::StrAppend(&s, " transport:[", transport_stats_->ToString(), "]");
373
370
  }
@@ -503,10 +500,8 @@ static void read_channel_args(grpc_chttp2_transport* t,
503
500
  if (max_requests_per_read.has_value()) {
504
501
  t->max_requests_per_read =
505
502
  grpc_core::Clamp(*max_requests_per_read, 1, 10000);
506
- } else if (grpc_core::IsChttp2BatchRequestsEnabled()) {
507
- t->max_requests_per_read = 32;
508
503
  } else {
509
- t->max_requests_per_read = std::numeric_limits<size_t>::max();
504
+ t->max_requests_per_read = 32;
510
505
  }
511
506
 
512
507
  if (channel_args.GetBool(GRPC_ARG_ENABLE_CHANNELZ)
@@ -523,8 +518,8 @@ static void read_channel_args(grpc_chttp2_transport* t,
523
518
 
524
519
  t->ack_pings = channel_args.GetBool("grpc.http2.ack_pings").value_or(true);
525
520
 
526
- t->allow_tarpit = channel_args.GetBool(GRPC_ARG_HTTP_ALLOW_TARPIT)
527
- .value_or(grpc_core::IsTarpitEnabled());
521
+ t->allow_tarpit =
522
+ channel_args.GetBool(GRPC_ARG_HTTP_ALLOW_TARPIT).value_or(true);
528
523
  t->min_tarpit_duration_ms =
529
524
  channel_args
530
525
  .GetDurationFromIntMillis(GRPC_ARG_HTTP_TARPIT_MIN_DURATION_MS)
@@ -551,93 +546,54 @@ static void read_channel_args(grpc_chttp2_transport* t,
551
546
  t->max_header_list_size_soft_limit = soft_limit;
552
547
  }
553
548
 
554
- static const struct {
555
- absl::string_view channel_arg_name;
556
- grpc_chttp2_setting_id setting_id;
557
- int default_value;
558
- int min;
559
- int max;
560
- bool availability[2] /* server, client */;
561
- } settings_map[] = {{GRPC_ARG_MAX_CONCURRENT_STREAMS,
562
- GRPC_CHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS,
563
- -1,
564
- 0,
565
- INT32_MAX,
566
- {true, false}},
567
- {GRPC_ARG_HTTP2_HPACK_TABLE_SIZE_DECODER,
568
- GRPC_CHTTP2_SETTINGS_HEADER_TABLE_SIZE,
569
- -1,
570
- 0,
571
- INT32_MAX,
572
- {true, true}},
573
- {GRPC_ARG_ABSOLUTE_MAX_METADATA_SIZE,
574
- GRPC_CHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE,
575
- -1,
576
- 0,
577
- INT32_MAX,
578
- {true, true}},
579
- {GRPC_ARG_HTTP2_MAX_FRAME_SIZE,
580
- GRPC_CHTTP2_SETTINGS_MAX_FRAME_SIZE,
581
- -1,
582
- 16384,
583
- 16777215,
584
- {true, true}},
585
- {GRPC_ARG_HTTP2_ENABLE_TRUE_BINARY,
586
- GRPC_CHTTP2_SETTINGS_GRPC_ALLOW_TRUE_BINARY_METADATA,
587
- 1,
588
- 0,
589
- 1,
590
- {true, true}},
591
- {GRPC_ARG_HTTP2_STREAM_LOOKAHEAD_BYTES,
592
- GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE,
593
- -1,
594
- 5,
595
- INT32_MAX,
596
- {true, true}}};
597
-
598
- for (size_t i = 0; i < GPR_ARRAY_SIZE(settings_map); i++) {
599
- const auto& setting = settings_map[i];
600
- if (setting.availability[is_client]) {
601
- const int value = channel_args.GetInt(setting.channel_arg_name)
602
- .value_or(setting.default_value);
603
- if (value >= 0) {
604
- const int clamped_value =
605
- grpc_core::Clamp(value, setting.min, setting.max);
606
- queue_setting_update(t, setting.setting_id, clamped_value);
607
- if (setting.setting_id == GRPC_CHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS) {
608
- t->max_concurrent_streams_policy.SetTarget(clamped_value);
609
- }
610
- } else if (setting.setting_id ==
611
- GRPC_CHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE) {
612
- // Set value to 1.25 * soft limit if this is larger than
613
- // `DEFAULT_MAX_HEADER_LIST_SIZE` and
614
- // `GRPC_ARG_ABSOLUTE_MAX_METADATA_SIZE` is not set.
615
- const int soft_limit = channel_args.GetInt(GRPC_ARG_MAX_METADATA_SIZE)
616
- .value_or(setting.default_value);
617
- const int value = (soft_limit >= 0 && soft_limit < (INT_MAX / 1.25))
618
- ? static_cast<int>(soft_limit * 1.25)
619
- : soft_limit;
620
- if (value > DEFAULT_MAX_HEADER_LIST_SIZE) {
621
- queue_setting_update(
622
- t, setting.setting_id,
623
- grpc_core::Clamp(value, setting.min, setting.max));
624
- }
625
- }
626
- } else if (channel_args.Contains(setting.channel_arg_name)) {
627
- gpr_log(GPR_DEBUG, "%s is not available on %s",
628
- std::string(setting.channel_arg_name).c_str(),
629
- is_client ? "clients" : "servers");
549
+ int value;
550
+ if (!is_client) {
551
+ value = channel_args.GetInt(GRPC_ARG_MAX_CONCURRENT_STREAMS).value_or(-1);
552
+ if (value >= 0) {
553
+ t->settings.mutable_local().SetMaxConcurrentStreams(value);
554
+ t->max_concurrent_streams_policy.SetTarget(value);
555
+ }
556
+ } else if (channel_args.Contains(GRPC_ARG_MAX_CONCURRENT_STREAMS)) {
557
+ gpr_log(GPR_DEBUG, "%s is not available on clients",
558
+ GRPC_ARG_MAX_CONCURRENT_STREAMS);
559
+ }
560
+ value =
561
+ channel_args.GetInt(GRPC_ARG_HTTP2_HPACK_TABLE_SIZE_DECODER).value_or(-1);
562
+ if (value >= 0) {
563
+ t->settings.mutable_local().SetHeaderTableSize(value);
564
+ }
565
+ value = channel_args.GetInt(GRPC_ARG_ABSOLUTE_MAX_METADATA_SIZE).value_or(-1);
566
+ if (value >= 0) {
567
+ t->settings.mutable_local().SetMaxHeaderListSize(value);
568
+ } else {
569
+ // Set value to 1.25 * soft limit if this is larger than
570
+ // `DEFAULT_MAX_HEADER_LIST_SIZE` and
571
+ // `GRPC_ARG_ABSOLUTE_MAX_METADATA_SIZE` is not set.
572
+ const int soft_limit =
573
+ channel_args.GetInt(GRPC_ARG_MAX_METADATA_SIZE).value_or(-1);
574
+ const int value = (soft_limit >= 0 && soft_limit < (INT_MAX / 1.25))
575
+ ? static_cast<int>(soft_limit * 1.25)
576
+ : soft_limit;
577
+ if (value > DEFAULT_MAX_HEADER_LIST_SIZE) {
578
+ t->settings.mutable_local().SetMaxHeaderListSize(value);
630
579
  }
631
580
  }
581
+ value = channel_args.GetInt(GRPC_ARG_HTTP2_MAX_FRAME_SIZE).value_or(-1);
582
+ if (value >= 0) {
583
+ t->settings.mutable_local().SetMaxFrameSize(value);
584
+ }
585
+ value =
586
+ channel_args.GetInt(GRPC_ARG_HTTP2_STREAM_LOOKAHEAD_BYTES).value_or(-1);
587
+ if (value >= 0) {
588
+ t->settings.mutable_local().SetInitialWindowSize(value);
589
+ }
590
+ value = channel_args.GetInt(GRPC_ARG_HTTP2_ENABLE_TRUE_BINARY).value_or(-1);
591
+ if (value >= 0) {
592
+ t->settings.mutable_local().SetAllowTrueBinaryMetadata(value != 0);
593
+ }
632
594
 
633
595
  if (t->enable_preferred_rx_crypto_frame_advertisement) {
634
- const grpc_chttp2_setting_parameters* sp =
635
- &grpc_chttp2_settings_parameters
636
- [GRPC_CHTTP2_SETTINGS_GRPC_PREFERRED_RECEIVE_CRYPTO_FRAME_SIZE];
637
- queue_setting_update(
638
- t, GRPC_CHTTP2_SETTINGS_GRPC_PREFERRED_RECEIVE_CRYPTO_FRAME_SIZE,
639
- grpc_core::Clamp(INT_MAX, static_cast<int>(sp->min_value),
640
- static_cast<int>(sp->max_value)));
596
+ t->settings.mutable_local().SetPreferredReceiveCryptoMessageSize(INT_MAX);
641
597
  }
642
598
 
643
599
  t->ping_on_rst_stream_percent = grpc_core::Clamp(
@@ -647,7 +603,7 @@ static void read_channel_args(grpc_chttp2_transport* t,
647
603
 
648
604
  t->max_concurrent_streams_overload_protection =
649
605
  channel_args.GetBool(GRPC_ARG_MAX_CONCURRENT_STREAMS_OVERLOAD_PROTECTION)
650
- .value_or(grpc_core::IsOverloadProtectionEnabled());
606
+ .value_or(true);
651
607
  }
652
608
 
653
609
  static void init_keepalive_pings_if_enabled_locked(
@@ -711,33 +667,22 @@ grpc_chttp2_transport::grpc_chttp2_transport(
711
667
  grpc_slice_from_copied_string(GRPC_CHTTP2_CLIENT_CONNECT_STRING));
712
668
  }
713
669
  grpc_slice_buffer_init(&qbuf);
714
- // copy in initial settings to all setting sets
715
- size_t i;
716
- int j;
717
- for (i = 0; i < GRPC_CHTTP2_NUM_SETTINGS; i++) {
718
- for (j = 0; j < GRPC_NUM_SETTING_SETS; j++) {
719
- settings[j][i] = grpc_chttp2_settings_parameters[i].default_value;
720
- }
721
- }
722
670
  grpc_chttp2_goaway_parser_init(&goaway_parser);
723
671
 
724
672
  // configure http2 the way we like it
725
673
  if (is_client) {
726
- queue_setting_update(this, GRPC_CHTTP2_SETTINGS_ENABLE_PUSH, 0);
727
- queue_setting_update(this, GRPC_CHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS, 0);
674
+ settings.mutable_local().SetEnablePush(false);
675
+ settings.mutable_local().SetMaxConcurrentStreams(0);
728
676
  }
729
- queue_setting_update(this, GRPC_CHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE,
730
- DEFAULT_MAX_HEADER_LIST_SIZE);
731
- queue_setting_update(this,
732
- GRPC_CHTTP2_SETTINGS_GRPC_ALLOW_TRUE_BINARY_METADATA, 1);
677
+ settings.mutable_local().SetMaxHeaderListSize(DEFAULT_MAX_HEADER_LIST_SIZE);
678
+ settings.mutable_local().SetAllowTrueBinaryMetadata(true);
733
679
 
734
680
  read_channel_args(this, channel_args, is_client);
735
681
 
736
682
  // Initially allow *UP TO* MAX_CONCURRENT_STREAMS incoming before we start
737
683
  // blanket cancelling them.
738
684
  num_incoming_streams_before_settings_ack =
739
- settings[GRPC_LOCAL_SETTINGS]
740
- [GRPC_CHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS];
685
+ settings.local().max_concurrent_streams();
741
686
 
742
687
  grpc_core::ExecCtx exec_ctx;
743
688
  combiner->Run(
@@ -1127,9 +1072,7 @@ static void write_action(grpc_chttp2_transport* t) {
1127
1072
  // Choose max_frame_size as the prefered rx crypto frame size indicated by the
1128
1073
  // peer.
1129
1074
  int max_frame_size =
1130
- t->settings
1131
- [GRPC_PEER_SETTINGS]
1132
- [GRPC_CHTTP2_SETTINGS_GRPC_PREFERRED_RECEIVE_CRYPTO_FRAME_SIZE];
1075
+ t->settings.peer().preferred_receive_crypto_message_size();
1133
1076
  // Note: max frame size is 0 if the remote peer does not support adjusting the
1134
1077
  // sending frame size.
1135
1078
  if (max_frame_size == 0) {
@@ -1206,23 +1149,6 @@ static void write_action_end_locked(
1206
1149
  grpc_chttp2_end_write(t.get(), error);
1207
1150
  }
1208
1151
 
1209
- // Dirties an HTTP2 setting to be sent out next time a writing path occurs.
1210
- // If the change needs to occur immediately, manually initiate a write.
1211
- static void queue_setting_update(grpc_chttp2_transport* t,
1212
- grpc_chttp2_setting_id id, uint32_t value) {
1213
- const grpc_chttp2_setting_parameters* sp =
1214
- &grpc_chttp2_settings_parameters[id];
1215
- uint32_t use_value = grpc_core::Clamp(value, sp->min_value, sp->max_value);
1216
- if (use_value != value) {
1217
- gpr_log(GPR_INFO, "Requested parameter %s clamped from %d to %d", sp->name,
1218
- value, use_value);
1219
- }
1220
- if (use_value != t->settings[GRPC_LOCAL_SETTINGS][id]) {
1221
- t->settings[GRPC_LOCAL_SETTINGS][id] = use_value;
1222
- t->dirtied_local_settings = true;
1223
- }
1224
- }
1225
-
1226
1152
  // Cancel out streams that haven't yet started if we have received a GOAWAY
1227
1153
  static void cancel_unstarted_streams(grpc_chttp2_transport* t,
1228
1154
  grpc_error_handle error, bool tarpit) {
@@ -1321,9 +1247,7 @@ static void maybe_start_some_streams(grpc_chttp2_transport* t) {
1321
1247
  // start streams where we have free grpc_chttp2_stream ids and free
1322
1248
  // * concurrency
1323
1249
  while (t->next_stream_id <= MAX_CLIENT_STREAM_ID &&
1324
- t->stream_map.size() <
1325
- t->settings[GRPC_PEER_SETTINGS]
1326
- [GRPC_CHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS] &&
1250
+ t->stream_map.size() < t->settings.peer().max_concurrent_streams() &&
1327
1251
  grpc_chttp2_list_pop_waiting_for_concurrency(t, &s)) {
1328
1252
  // safe since we can't (legally) be parsing this stream yet
1329
1253
  GRPC_CHTTP2_IF_TRACING(gpr_log(
@@ -1510,7 +1434,7 @@ static void perform_stream_op_locked(void* stream_op,
1510
1434
  if (op->send_initial_metadata) {
1511
1435
  if (s->call_tracer) {
1512
1436
  s->call_tracer->RecordAnnotation(grpc_core::HttpAnnotation(
1513
- grpc_core::HttpAnnotation::Type::kStart, grpc_core::Timestamp::Now(),
1437
+ grpc_core::HttpAnnotation::Type::kStart, gpr_now(GPR_CLOCK_REALTIME),
1514
1438
  s->t->flow_control.stats(), s->flow_control.stats()));
1515
1439
  }
1516
1440
  if (t->is_client && t->channelz_socket != nullptr) {
@@ -2708,21 +2632,19 @@ void grpc_chttp2_act_on_flowctl_action(
2708
2632
  GRPC_CHTTP2_INITIATE_WRITE_TRANSPORT_FLOW_CONTROL, []() {});
2709
2633
  WithUrgency(t, action.send_initial_window_update(),
2710
2634
  GRPC_CHTTP2_INITIATE_WRITE_SEND_SETTINGS, [t, &action]() {
2711
- queue_setting_update(t,
2712
- GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE,
2713
- action.initial_window_size());
2714
- });
2715
- WithUrgency(t, action.send_max_frame_size_update(),
2716
- GRPC_CHTTP2_INITIATE_WRITE_SEND_SETTINGS, [t, &action]() {
2717
- queue_setting_update(t, GRPC_CHTTP2_SETTINGS_MAX_FRAME_SIZE,
2718
- action.max_frame_size());
2635
+ t->settings.mutable_local().SetInitialWindowSize(
2636
+ action.initial_window_size());
2719
2637
  });
2638
+ WithUrgency(
2639
+ t, action.send_max_frame_size_update(),
2640
+ GRPC_CHTTP2_INITIATE_WRITE_SEND_SETTINGS, [t, &action]() {
2641
+ t->settings.mutable_local().SetMaxFrameSize(action.max_frame_size());
2642
+ });
2720
2643
  if (t->enable_preferred_rx_crypto_frame_advertisement) {
2721
2644
  WithUrgency(
2722
2645
  t, action.preferred_rx_crypto_frame_size_update(),
2723
2646
  GRPC_CHTTP2_INITIATE_WRITE_SEND_SETTINGS, [t, &action]() {
2724
- queue_setting_update(
2725
- t, GRPC_CHTTP2_SETTINGS_GRPC_PREFERRED_RECEIVE_CRYPTO_FRAME_SIZE,
2647
+ t->settings.mutable_local().SetPreferredReceiveCryptoMessageSize(
2726
2648
  action.preferred_rx_crypto_frame_size());
2727
2649
  });
2728
2650
  }