grpc 1.73.0 → 1.74.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 (499) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +38 -17
  3. data/include/grpc/create_channel_from_endpoint.h +54 -0
  4. data/include/grpc/credentials.h +11 -5
  5. data/include/grpc/event_engine/event_engine.h +74 -17
  6. data/include/grpc/grpc_posix.h +20 -1
  7. data/include/grpc/impl/channel_arg_names.h +2 -4
  8. data/include/grpc/module.modulemap +1 -0
  9. data/include/grpc/support/json.h +24 -0
  10. data/src/core/call/interception_chain.h +7 -11
  11. data/src/core/channelz/channel_trace.cc +213 -115
  12. data/src/core/channelz/channel_trace.h +380 -86
  13. data/src/core/channelz/channelz.cc +270 -181
  14. data/src/core/channelz/channelz.h +168 -55
  15. data/src/core/channelz/channelz_registry.cc +2 -1
  16. data/src/core/channelz/channelz_registry.h +24 -0
  17. data/src/core/channelz/property_list.cc +357 -0
  18. data/src/core/channelz/property_list.h +202 -0
  19. data/src/core/channelz/ztrace_collector.h +3 -2
  20. data/src/core/client_channel/backup_poller.cc +17 -2
  21. data/src/core/client_channel/client_channel.cc +17 -28
  22. data/src/core/client_channel/client_channel_filter.cc +19 -29
  23. data/src/core/client_channel/config_selector.h +8 -2
  24. data/src/core/client_channel/dynamic_filters.cc +5 -6
  25. data/src/core/client_channel/dynamic_filters.h +1 -1
  26. data/src/core/client_channel/global_subchannel_pool.cc +4 -1
  27. data/src/core/client_channel/retry_filter.cc +21 -27
  28. data/src/core/client_channel/retry_filter.h +10 -7
  29. data/src/core/client_channel/retry_filter_legacy_call_data.cc +5 -5
  30. data/src/core/client_channel/retry_filter_legacy_call_data.h +1 -1
  31. data/src/core/client_channel/retry_interceptor.cc +30 -44
  32. data/src/core/client_channel/retry_interceptor.h +18 -17
  33. data/src/core/client_channel/retry_throttle.cc +46 -61
  34. data/src/core/client_channel/retry_throttle.h +17 -39
  35. data/src/core/client_channel/subchannel.cc +43 -19
  36. data/src/core/client_channel/subchannel.h +8 -0
  37. data/src/core/config/config_vars.cc +2 -0
  38. data/src/core/config/core_configuration.cc +1 -0
  39. data/src/core/config/core_configuration.h +11 -0
  40. data/src/core/credentials/call/call_creds_registry.h +125 -0
  41. data/src/core/credentials/call/call_creds_registry_init.cc +91 -0
  42. data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.cc +6 -48
  43. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.cc +86 -0
  44. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.h +74 -0
  45. data/src/core/credentials/call/jwt_util.cc +70 -0
  46. data/src/core/credentials/call/jwt_util.h +32 -0
  47. data/src/core/credentials/transport/channel_creds_registry_init.cc +1 -1
  48. data/src/core/credentials/transport/google_default/google_default_credentials.cc +72 -4
  49. data/src/core/credentials/transport/ssl/ssl_credentials.cc +0 -1
  50. data/src/core/credentials/transport/tls/load_system_roots_supported.cc +1 -0
  51. data/src/core/credentials/transport/xds/xds_credentials.cc +0 -3
  52. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +8 -8
  53. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.h +16 -16
  54. data/src/core/ext/filters/http/client_authority_filter.cc +2 -4
  55. data/src/core/ext/filters/http/message_compress/compression_filter.h +25 -22
  56. data/src/core/ext/filters/http/server/http_server_filter.h +12 -11
  57. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +120 -35
  58. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +6 -5
  59. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +162 -115
  60. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +0 -3
  61. data/src/core/ext/transport/chttp2/transport/decode_huff.cc +1239 -3514
  62. data/src/core/ext/transport/chttp2/transport/decode_huff.h +1008 -1486
  63. data/src/core/ext/transport/chttp2/transport/flow_control.h +22 -17
  64. data/src/core/ext/transport/chttp2/transport/frame.cc +10 -0
  65. data/src/core/ext/transport/chttp2/transport/frame.h +2 -2
  66. data/src/core/ext/transport/chttp2/transport/frame_data.cc +1 -1
  67. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +7 -8
  68. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -5
  69. data/src/core/ext/transport/chttp2/transport/header_assembler.h +299 -0
  70. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +1 -1
  71. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +11 -5
  72. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +12 -1
  73. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +1017 -0
  74. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +593 -0
  75. data/src/core/ext/transport/chttp2/transport/http2_settings.h +19 -22
  76. data/{third_party/abseil-cpp/absl/strings/cord_buffer.cc → src/core/ext/transport/chttp2/transport/http2_stats_collector.cc} +14 -14
  77. data/src/core/ext/transport/chttp2/transport/http2_stats_collector.h +33 -0
  78. data/src/core/ext/transport/chttp2/transport/http2_status.h +6 -1
  79. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +43 -0
  80. data/src/core/ext/transport/chttp2/transport/http2_transport.h +65 -0
  81. data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +0 -29
  82. data/src/core/ext/transport/chttp2/transport/internal.h +18 -8
  83. data/src/core/ext/transport/chttp2/transport/keepalive.cc +105 -0
  84. data/src/core/ext/transport/chttp2/transport/keepalive.h +138 -0
  85. data/src/core/ext/transport/chttp2/transport/message_assembler.h +185 -0
  86. data/src/core/ext/transport/chttp2/transport/parsing.cc +2 -4
  87. data/src/core/ext/transport/chttp2/transport/ping_callbacks.h +19 -0
  88. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +151 -0
  89. data/src/core/ext/transport/chttp2/transport/ping_promise.h +180 -0
  90. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +5 -9
  91. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.h +11 -0
  92. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +39 -1
  93. data/src/core/ext/transport/chttp2/transport/transport_common.cc +19 -0
  94. data/src/core/ext/transport/chttp2/transport/transport_common.h +27 -0
  95. data/src/core/ext/transport/chttp2/transport/writing.cc +37 -11
  96. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb.h +571 -0
  97. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb_minitable.c +120 -0
  98. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb_minitable.h +36 -0
  99. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb.h +1272 -0
  100. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.c +312 -0
  101. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.h +50 -0
  102. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb.h +984 -0
  103. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.c +226 -0
  104. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.h +44 -0
  105. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.c +175 -0
  106. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.h +82 -0
  107. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.c +135 -0
  108. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.h +67 -0
  109. data/src/core/filter/auth/auth_filters.h +0 -25
  110. data/src/core/filter/auth/client_auth_filter.cc +0 -118
  111. data/src/core/filter/filter_args.h +9 -23
  112. data/src/core/handshaker/handshaker.cc +23 -14
  113. data/src/core/handshaker/handshaker.h +3 -0
  114. data/src/core/handshaker/http_connect/http_connect_handshaker.cc +3 -1
  115. data/src/core/handshaker/security/legacy_secure_endpoint.cc +6 -5
  116. data/src/core/handshaker/security/secure_endpoint.cc +70 -25
  117. data/src/core/handshaker/security/security_handshaker.cc +4 -1
  118. data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +7 -1
  119. data/src/core/lib/channel/channel_args.cc +15 -0
  120. data/src/core/lib/channel/channel_args.h +3 -0
  121. data/src/core/lib/channel/channel_stack.cc +22 -23
  122. data/src/core/lib/channel/channel_stack.h +9 -7
  123. data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -1
  124. data/src/core/lib/channel/channel_stack_builder_impl.h +2 -7
  125. data/src/core/lib/channel/promise_based_filter.h +5 -5
  126. data/src/core/lib/debug/trace_impl.h +0 -1
  127. data/src/core/lib/event_engine/ares_resolver.cc +165 -46
  128. data/src/core/lib/event_engine/ares_resolver.h +48 -2
  129. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +3 -1
  130. data/src/core/lib/event_engine/cf_engine/cf_engine.h +1 -4
  131. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +2 -6
  132. data/src/core/lib/event_engine/endpoint_channel_arg_wrapper.cc +40 -0
  133. data/src/core/lib/event_engine/endpoint_channel_arg_wrapper.h +60 -0
  134. data/src/core/lib/event_engine/event_engine.cc +7 -0
  135. data/src/core/lib/event_engine/extensions/channelz.h +10 -6
  136. data/src/core/lib/event_engine/grpc_polled_fd.h +5 -0
  137. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +130 -162
  138. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +11 -15
  139. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +75 -117
  140. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +7 -9
  141. data/src/core/lib/event_engine/posix_engine/event_poller.h +18 -15
  142. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +0 -18
  143. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.cc +124 -0
  144. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.h +243 -0
  145. data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +29 -19
  146. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +6 -2
  147. data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +6 -1
  148. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +145 -92
  149. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +9 -19
  150. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +333 -116
  151. data/src/core/lib/event_engine/posix_engine/posix_engine.h +61 -18
  152. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +45 -37
  153. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +6 -4
  154. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +32 -142
  155. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +6 -5
  156. data/src/core/lib/event_engine/posix_engine/posix_interface.h +211 -0
  157. data/src/core/lib/event_engine/posix_engine/posix_interface_posix.cc +1083 -0
  158. data/src/core/lib/event_engine/posix_engine/posix_interface_windows.cc +281 -0
  159. data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.cc +154 -0
  160. data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.h +174 -0
  161. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +3 -719
  162. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +10 -170
  163. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +33 -22
  164. data/src/core/lib/event_engine/posix_engine/timer_manager.h +13 -11
  165. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +117 -151
  166. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +26 -94
  167. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +26 -25
  168. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +6 -2
  169. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +36 -62
  170. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +6 -2
  171. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +7 -6
  172. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +12 -6
  173. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +3 -1
  174. data/src/core/lib/event_engine/shim.cc +9 -0
  175. data/src/core/lib/event_engine/shim.h +3 -0
  176. data/src/core/lib/event_engine/thread_pool/thread_pool.h +7 -3
  177. data/src/core/lib/event_engine/thread_pool/thread_pool_factory.cc +0 -17
  178. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +4 -2
  179. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +3 -2
  180. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +4 -0
  181. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.h +4 -0
  182. data/src/core/lib/event_engine/windows/windows_endpoint.h +2 -6
  183. data/src/core/lib/event_engine/windows/windows_engine.cc +0 -1
  184. data/src/core/lib/event_engine/windows/windows_engine.h +1 -3
  185. data/src/core/lib/event_engine/windows/windows_listener.cc +14 -2
  186. data/src/core/lib/experiments/experiments.cc +45 -93
  187. data/src/core/lib/experiments/experiments.h +21 -51
  188. data/src/core/lib/iomgr/endpoint.cc +4 -3
  189. data/src/core/lib/iomgr/endpoint.h +7 -4
  190. data/src/core/lib/iomgr/endpoint_cfstream.cc +3 -2
  191. data/src/core/lib/iomgr/ev_epoll1_linux.cc +7 -2
  192. data/src/core/lib/iomgr/ev_poll_posix.cc +7 -2
  193. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +4 -6
  194. data/src/core/lib/iomgr/tcp_posix.cc +12 -6
  195. data/src/core/lib/iomgr/tcp_windows.cc +3 -2
  196. data/src/core/lib/promise/activity.h +1 -0
  197. data/src/core/lib/promise/arena_promise.h +23 -7
  198. data/src/core/lib/promise/detail/promise_factory.h +10 -0
  199. data/src/core/lib/promise/detail/promise_like.h +118 -11
  200. data/src/core/lib/promise/detail/promise_variant.h +50 -0
  201. data/src/core/lib/promise/detail/seq_state.h +687 -548
  202. data/src/core/lib/promise/if.h +20 -0
  203. data/src/core/lib/promise/inter_activity_latch.h +147 -0
  204. data/src/core/lib/promise/inter_activity_mutex.h +547 -0
  205. data/src/core/lib/promise/loop.h +65 -3
  206. data/src/core/lib/promise/map.h +24 -0
  207. data/src/core/lib/promise/match_promise.h +103 -0
  208. data/src/core/lib/promise/mpsc.cc +425 -0
  209. data/src/core/lib/promise/mpsc.h +490 -0
  210. data/src/core/lib/promise/party.cc +50 -1
  211. data/src/core/lib/promise/party.h +66 -1
  212. data/src/core/lib/promise/race.h +31 -0
  213. data/src/core/lib/promise/seq.h +4 -1
  214. data/src/core/lib/promise/status_flag.h +7 -0
  215. data/src/core/lib/promise/try_seq.h +4 -1
  216. data/src/core/lib/promise/wait_set.cc +28 -0
  217. data/src/core/lib/promise/wait_set.h +86 -0
  218. data/src/core/lib/resource_quota/arena.h +19 -0
  219. data/src/core/lib/slice/slice.h +5 -0
  220. data/src/core/lib/surface/channel_create.cc +88 -13
  221. data/src/core/lib/surface/channel_create.h +4 -0
  222. data/src/core/lib/surface/channel_init.cc +164 -47
  223. data/src/core/lib/surface/channel_init.h +64 -1
  224. data/src/core/lib/surface/filter_stack_call.cc +18 -9
  225. data/src/core/lib/surface/init.cc +6 -15
  226. data/src/core/lib/surface/legacy_channel.cc +3 -5
  227. data/src/core/lib/surface/legacy_channel.h +3 -1
  228. data/src/core/lib/surface/version.cc +2 -2
  229. data/src/core/lib/transport/promise_endpoint.cc +110 -0
  230. data/src/core/lib/transport/promise_endpoint.h +307 -0
  231. data/src/core/load_balancing/child_policy_handler.cc +2 -4
  232. data/src/core/load_balancing/delegating_helper.h +2 -3
  233. data/src/core/load_balancing/health_check_client.cc +1 -5
  234. data/src/core/load_balancing/lb_policy.h +1 -3
  235. data/src/core/load_balancing/oob_backend_metric.cc +1 -5
  236. data/src/core/load_balancing/pick_first/pick_first.cc +3 -0
  237. data/src/core/load_balancing/xds/cds.cc +10 -1
  238. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +2 -0
  239. data/src/core/resolver/xds/xds_config.cc +6 -3
  240. data/src/core/resolver/xds/xds_config.h +9 -4
  241. data/src/core/resolver/xds/xds_dependency_manager.cc +21 -6
  242. data/src/core/resolver/xds/xds_dependency_manager.h +2 -1
  243. data/src/core/resolver/xds/xds_resolver.cc +31 -11
  244. data/src/core/server/server.cc +83 -12
  245. data/src/core/server/server.h +21 -2
  246. data/src/core/server/xds_server_config_fetcher.cc +63 -25
  247. data/src/core/service_config/service_config.h +1 -1
  248. data/src/core/service_config/service_config_impl.h +1 -1
  249. data/src/core/telemetry/context_list_entry.cc +38 -0
  250. data/src/core/telemetry/context_list_entry.h +42 -12
  251. data/src/core/telemetry/stats_data.cc +233 -207
  252. data/src/core/telemetry/stats_data.h +250 -153
  253. data/src/core/telemetry/tcp_tracer.h +1 -1
  254. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +11 -3
  255. data/src/core/tsi/fake_transport_security.cc +17 -0
  256. data/src/core/tsi/ssl_transport_security.cc +2 -0
  257. data/src/core/tsi/transport_security_grpc.cc +8 -0
  258. data/src/core/tsi/transport_security_grpc.h +15 -0
  259. data/src/core/util/backoff.cc +1 -5
  260. data/src/core/util/backoff.h +1 -0
  261. data/src/core/util/down_cast.h +1 -1
  262. data/src/core/util/function_signature.h +15 -1
  263. data/src/core/util/http_client/httpcli.cc +12 -5
  264. data/src/core/util/http_client/httpcli.h +4 -1
  265. data/src/core/util/latent_see.h +8 -5
  266. data/src/core/util/log.cc +4 -0
  267. data/src/core/util/memory_usage.h +268 -0
  268. data/src/core/util/per_cpu.cc +2 -0
  269. data/src/core/util/per_cpu.h +7 -0
  270. data/src/core/util/shared_bit_gen.h +20 -0
  271. data/src/core/util/single_set_ptr.h +2 -2
  272. data/src/core/util/upb_utils.h +42 -0
  273. data/src/core/util/uri.cc +3 -2
  274. data/src/core/util/useful.h +53 -2
  275. data/src/core/util/wait_for_single_owner.cc +31 -0
  276. data/src/core/util/wait_for_single_owner.h +24 -0
  277. data/src/core/xds/grpc/xds_bootstrap_grpc.cc +2 -0
  278. data/src/core/xds/grpc/xds_bootstrap_grpc.h +5 -0
  279. data/src/core/xds/grpc/xds_client_grpc.cc +6 -2
  280. data/src/core/xds/grpc/xds_common_types_parser.cc +138 -50
  281. data/src/core/xds/grpc/xds_common_types_parser.h +12 -0
  282. data/src/core/xds/grpc/xds_http_filter.h +7 -0
  283. data/src/core/xds/grpc/xds_http_gcp_authn_filter.cc +22 -0
  284. data/src/core/xds/grpc/xds_http_gcp_authn_filter.h +3 -0
  285. data/src/core/xds/grpc/xds_route_config_parser.cc +15 -38
  286. data/src/core/xds/grpc/xds_server_grpc.cc +63 -13
  287. data/src/core/xds/grpc/xds_server_grpc.h +10 -2
  288. data/src/core/xds/grpc/xds_server_grpc_interface.h +4 -0
  289. data/src/core/xds/grpc/xds_transport_grpc.cc +18 -0
  290. data/src/core/xds/xds_client/xds_bootstrap.h +2 -0
  291. data/src/core/xds/xds_client/xds_client.cc +26 -5
  292. data/src/ruby/ext/grpc/extconf.rb +2 -0
  293. data/src/ruby/ext/grpc/rb_call.c +1 -8
  294. data/src/ruby/ext/grpc/rb_channel.c +72 -568
  295. data/src/ruby/ext/grpc/rb_channel.h +0 -3
  296. data/src/ruby/ext/grpc/rb_completion_queue.c +26 -14
  297. data/src/ruby/ext/grpc/rb_completion_queue.h +1 -7
  298. data/src/ruby/ext/grpc/rb_grpc.c +9 -5
  299. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
  300. data/src/ruby/ext/grpc/rb_loader.c +0 -4
  301. data/src/ruby/ext/grpc/rb_server.c +31 -50
  302. data/src/ruby/lib/grpc/generic/client_stub.rb +4 -4
  303. data/src/ruby/lib/grpc/version.rb +1 -1
  304. data/src/ruby/spec/core_spec.rb +22 -0
  305. data/src/ruby/spec/generic/active_call_spec.rb +1 -1
  306. data/third_party/abseil-cpp/absl/algorithm/container.h +2 -19
  307. data/third_party/abseil-cpp/absl/base/attributes.h +76 -7
  308. data/third_party/abseil-cpp/absl/base/call_once.h +11 -12
  309. data/third_party/abseil-cpp/absl/base/config.h +20 -129
  310. data/third_party/abseil-cpp/absl/base/{internal/fast_type_id.h → fast_type_id.h} +11 -16
  311. data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +0 -5
  312. data/third_party/abseil-cpp/absl/base/internal/cycleclock_config.h +7 -7
  313. data/third_party/abseil-cpp/absl/base/internal/endian.h +34 -38
  314. data/third_party/abseil-cpp/absl/base/internal/iterator_traits.h +71 -0
  315. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +6 -5
  316. data/third_party/abseil-cpp/absl/base/internal/{nullability_impl.h → nullability_deprecated.h} +45 -8
  317. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +0 -9
  318. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +3 -13
  319. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +6 -6
  320. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +8 -3
  321. data/third_party/abseil-cpp/absl/base/no_destructor.h +11 -32
  322. data/third_party/abseil-cpp/absl/base/nullability.h +84 -72
  323. data/third_party/abseil-cpp/absl/base/options.h +3 -80
  324. data/third_party/abseil-cpp/absl/base/policy_checks.h +7 -7
  325. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +1 -3
  326. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +3 -4
  327. data/third_party/abseil-cpp/absl/container/btree_map.h +4 -2
  328. data/third_party/abseil-cpp/absl/container/btree_set.h +4 -2
  329. data/third_party/abseil-cpp/absl/container/fixed_array.h +7 -14
  330. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +5 -0
  331. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +6 -1
  332. data/third_party/abseil-cpp/absl/container/inlined_vector.h +8 -5
  333. data/third_party/abseil-cpp/absl/container/internal/btree.h +132 -29
  334. data/third_party/abseil-cpp/absl/container/internal/btree_container.h +175 -71
  335. data/third_party/abseil-cpp/absl/container/internal/common.h +43 -0
  336. data/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -2
  337. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +9 -10
  338. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +1 -8
  339. data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +0 -4
  340. data/third_party/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +527 -0
  341. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +20 -4
  342. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +31 -12
  343. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +2 -7
  344. data/third_party/abseil-cpp/absl/container/internal/layout.h +26 -42
  345. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +199 -68
  346. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +1354 -183
  347. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +881 -1424
  348. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl.h +80 -0
  349. data/third_party/abseil-cpp/absl/crc/crc32c.cc +0 -4
  350. data/third_party/abseil-cpp/absl/crc/crc32c.h +7 -5
  351. data/third_party/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +0 -22
  352. data/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +45 -74
  353. data/third_party/abseil-cpp/absl/debugging/internal/addresses.h +57 -0
  354. data/third_party/abseil-cpp/absl/debugging/internal/decode_rust_punycode.cc +1 -1
  355. data/third_party/abseil-cpp/absl/debugging/internal/decode_rust_punycode.h +5 -5
  356. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +8 -35
  357. data/third_party/abseil-cpp/absl/debugging/internal/demangle_rust.cc +16 -16
  358. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +40 -37
  359. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +16 -7
  360. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +14 -5
  361. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +10 -4
  362. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +27 -16
  363. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +13 -4
  364. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc +4 -3
  365. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +15 -28
  366. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +19 -9
  367. data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +144 -27
  368. data/third_party/abseil-cpp/absl/debugging/stacktrace.h +73 -5
  369. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +19 -9
  370. data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +3 -2
  371. data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +25 -6
  372. data/third_party/abseil-cpp/absl/flags/commandlineflag.h +2 -2
  373. data/third_party/abseil-cpp/absl/flags/flag.h +4 -3
  374. data/third_party/abseil-cpp/absl/flags/internal/commandlineflag.h +2 -2
  375. data/third_party/abseil-cpp/absl/flags/internal/flag.cc +2 -1
  376. data/third_party/abseil-cpp/absl/flags/internal/flag.h +7 -6
  377. data/third_party/abseil-cpp/absl/flags/internal/registry.h +4 -3
  378. data/third_party/abseil-cpp/absl/flags/reflection.cc +2 -3
  379. data/third_party/abseil-cpp/absl/functional/any_invocable.h +8 -10
  380. data/third_party/abseil-cpp/absl/functional/function_ref.h +2 -9
  381. data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +110 -226
  382. data/third_party/abseil-cpp/absl/functional/internal/front_binder.h +10 -12
  383. data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +2 -5
  384. data/third_party/abseil-cpp/absl/hash/hash.h +18 -0
  385. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +1 -5
  386. data/third_party/abseil-cpp/absl/hash/internal/hash.h +86 -61
  387. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc +25 -68
  388. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.h +2 -6
  389. data/third_party/abseil-cpp/absl/hash/internal/weakly_mixed_integer.h +38 -0
  390. data/third_party/abseil-cpp/absl/log/check.h +2 -1
  391. data/third_party/abseil-cpp/absl/log/globals.h +4 -5
  392. data/third_party/abseil-cpp/absl/log/internal/append_truncated.h +28 -0
  393. data/third_party/abseil-cpp/absl/log/internal/check_op.cc +22 -22
  394. data/third_party/abseil-cpp/absl/log/internal/check_op.h +65 -62
  395. data/third_party/abseil-cpp/absl/log/internal/conditions.cc +5 -3
  396. data/third_party/abseil-cpp/absl/log/internal/conditions.h +7 -2
  397. data/third_party/abseil-cpp/absl/log/internal/log_message.cc +85 -43
  398. data/third_party/abseil-cpp/absl/log/internal/log_message.h +84 -59
  399. data/third_party/abseil-cpp/absl/log/internal/nullstream.h +1 -0
  400. data/third_party/abseil-cpp/absl/log/internal/proto.cc +3 -2
  401. data/third_party/abseil-cpp/absl/log/internal/proto.h +3 -3
  402. data/third_party/abseil-cpp/absl/log/internal/strip.h +4 -12
  403. data/third_party/abseil-cpp/absl/log/internal/vlog_config.h +8 -6
  404. data/third_party/abseil-cpp/absl/log/internal/voidify.h +10 -4
  405. data/third_party/abseil-cpp/absl/log/log.h +48 -35
  406. data/third_party/abseil-cpp/absl/log/log_sink_registry.h +2 -2
  407. data/third_party/abseil-cpp/absl/meta/type_traits.h +46 -175
  408. data/third_party/abseil-cpp/absl/numeric/bits.h +68 -2
  409. data/third_party/abseil-cpp/absl/numeric/int128.cc +0 -52
  410. data/third_party/abseil-cpp/absl/numeric/internal/bits.h +7 -3
  411. data/third_party/abseil-cpp/absl/profiling/internal/exponential_biased.cc +1 -1
  412. data/third_party/abseil-cpp/absl/random/bit_gen_ref.h +10 -11
  413. data/third_party/abseil-cpp/absl/random/distributions.h +6 -8
  414. data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +1 -1
  415. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +5 -6
  416. data/third_party/abseil-cpp/absl/random/internal/{pool_urbg.cc → entropy_pool.cc} +22 -90
  417. data/third_party/abseil-cpp/absl/random/internal/entropy_pool.h +35 -0
  418. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +5 -6
  419. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +1 -1
  420. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +20 -12
  421. data/third_party/abseil-cpp/absl/random/internal/seed_material.h +5 -5
  422. data/third_party/abseil-cpp/absl/random/random.h +88 -53
  423. data/third_party/abseil-cpp/absl/random/seed_sequences.cc +6 -2
  424. data/third_party/abseil-cpp/absl/status/internal/status_internal.cc +3 -4
  425. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +3 -4
  426. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +4 -3
  427. data/third_party/abseil-cpp/absl/status/status.cc +4 -8
  428. data/third_party/abseil-cpp/absl/status/status.h +8 -8
  429. data/third_party/abseil-cpp/absl/status/status_payload_printer.h +2 -2
  430. data/third_party/abseil-cpp/absl/status/statusor.cc +2 -2
  431. data/third_party/abseil-cpp/absl/status/statusor.h +6 -6
  432. data/third_party/abseil-cpp/absl/strings/ascii.cc +9 -9
  433. data/third_party/abseil-cpp/absl/strings/ascii.h +18 -18
  434. data/third_party/abseil-cpp/absl/strings/charconv.cc +21 -22
  435. data/third_party/abseil-cpp/absl/strings/charconv.h +5 -5
  436. data/third_party/abseil-cpp/absl/strings/cord.cc +54 -58
  437. data/third_party/abseil-cpp/absl/strings/cord.h +94 -83
  438. data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +11 -11
  439. data/third_party/abseil-cpp/absl/strings/cord_analysis.h +3 -3
  440. data/third_party/abseil-cpp/absl/strings/escaping.cc +130 -149
  441. data/third_party/abseil-cpp/absl/strings/escaping.h +9 -10
  442. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +1 -1
  443. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +6 -8
  444. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +0 -4
  445. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +0 -4
  446. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +7 -63
  447. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -11
  448. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +0 -22
  449. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.cc +5 -3
  450. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +4 -2
  451. data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +3 -3
  452. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +0 -5
  453. data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +96 -1
  454. data/third_party/abseil-cpp/absl/strings/internal/utf8.h +15 -1
  455. data/third_party/abseil-cpp/absl/strings/numbers.cc +53 -32
  456. data/third_party/abseil-cpp/absl/strings/numbers.h +87 -58
  457. data/third_party/abseil-cpp/absl/strings/str_cat.cc +6 -7
  458. data/third_party/abseil-cpp/absl/strings/str_cat.h +32 -32
  459. data/third_party/abseil-cpp/absl/strings/str_format.h +18 -18
  460. data/third_party/abseil-cpp/absl/strings/str_replace.cc +3 -3
  461. data/third_party/abseil-cpp/absl/strings/str_replace.h +6 -6
  462. data/third_party/abseil-cpp/absl/strings/string_view.cc +4 -9
  463. data/third_party/abseil-cpp/absl/strings/string_view.h +27 -32
  464. data/third_party/abseil-cpp/absl/strings/strip.h +4 -4
  465. data/third_party/abseil-cpp/absl/strings/substitute.cc +5 -4
  466. data/third_party/abseil-cpp/absl/strings/substitute.h +66 -64
  467. data/third_party/abseil-cpp/absl/synchronization/internal/futex_waiter.cc +0 -4
  468. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.cc +0 -5
  469. data/third_party/abseil-cpp/absl/synchronization/internal/pthread_waiter.cc +0 -4
  470. data/third_party/abseil-cpp/absl/synchronization/internal/sem_waiter.cc +0 -4
  471. data/third_party/abseil-cpp/absl/synchronization/internal/stdcpp_waiter.cc +0 -4
  472. data/third_party/abseil-cpp/absl/synchronization/internal/waiter_base.cc +0 -4
  473. data/third_party/abseil-cpp/absl/synchronization/internal/win32_waiter.cc +0 -4
  474. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +1 -1
  475. data/third_party/abseil-cpp/absl/synchronization/mutex.h +97 -69
  476. data/third_party/abseil-cpp/absl/synchronization/notification.h +1 -1
  477. data/third_party/abseil-cpp/absl/time/civil_time.cc +1 -0
  478. data/third_party/abseil-cpp/absl/time/duration.cc +12 -7
  479. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +1 -1
  480. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +90 -111
  481. data/third_party/abseil-cpp/absl/time/time.h +20 -15
  482. data/third_party/abseil-cpp/absl/types/optional.h +7 -747
  483. data/third_party/abseil-cpp/absl/types/span.h +13 -11
  484. data/third_party/abseil-cpp/absl/types/variant.h +5 -784
  485. data/third_party/abseil-cpp/absl/utility/utility.h +10 -185
  486. metadata +72 -20
  487. data/src/core/lib/event_engine/forkable.cc +0 -105
  488. data/src/core/lib/event_engine/forkable.h +0 -67
  489. data/src/core/lib/iomgr/python_util.h +0 -46
  490. data/third_party/abseil-cpp/absl/base/internal/inline_variable.h +0 -108
  491. data/third_party/abseil-cpp/absl/base/internal/invoke.h +0 -241
  492. data/third_party/abseil-cpp/absl/log/log_entry.cc +0 -41
  493. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +0 -131
  494. data/third_party/abseil-cpp/absl/types/bad_optional_access.cc +0 -66
  495. data/third_party/abseil-cpp/absl/types/bad_optional_access.h +0 -78
  496. data/third_party/abseil-cpp/absl/types/bad_variant_access.cc +0 -82
  497. data/third_party/abseil-cpp/absl/types/bad_variant_access.h +0 -82
  498. data/third_party/abseil-cpp/absl/types/internal/optional.h +0 -352
  499. data/third_party/abseil-cpp/absl/types/internal/variant.h +0 -1622
@@ -32,6 +32,7 @@
32
32
  #include "absl/log/check.h"
33
33
  #include "absl/status/status.h"
34
34
  #include "absl/strings/string_view.h"
35
+ #include "src/core/channelz/property_list.h"
35
36
  #include "src/core/ext/transport/chttp2/transport/http2_settings.h"
36
37
  #include "src/core/lib/debug/trace.h"
37
38
  #include "src/core/lib/resource_quota/memory_quota.h"
@@ -271,6 +272,11 @@ class TransportFlowControl final {
271
272
 
272
273
  FlowControlAction SetAckedInitialWindow(uint32_t value);
273
274
 
275
+ void set_target_initial_window_size(uint32_t value) {
276
+ target_initial_window_size_ =
277
+ std::min(value, Http2Settings::max_initial_window_size());
278
+ }
279
+
274
280
  // Getters
275
281
  int64_t remote_window() const { return remote_window_; }
276
282
  int64_t announced_window() const { return announced_window_; }
@@ -302,23 +308,22 @@ class TransportFlowControl final {
302
308
  double bdp_bw_est;
303
309
 
304
310
  std::string ToString() const;
305
- Json::Object ToJsonObject() {
306
- Json::Object object;
307
- object["targetWindow"] = Json::FromNumber(target_window);
308
- object["targetFrameSize"] = Json::FromNumber(target_frame_size);
309
- object["targetPreferredRxCryptoFrameSize"] =
310
- Json::FromNumber(target_preferred_rx_crypto_frame_size);
311
- object["ackedInitWindow"] = Json::FromNumber(acked_init_window);
312
- object["queuedInitWindow"] = Json::FromNumber(queued_init_window);
313
- object["sentInitWindow"] = Json::FromNumber(sent_init_window);
314
- object["remoteWindow"] = Json::FromNumber(remote_window);
315
- object["announcedWindow"] = Json::FromNumber(announced_window);
316
- object["announcedStreamTotalOverIncomingWindow"] =
317
- Json::FromNumber(announced_stream_total_over_incoming_window);
318
- object["bdpAccumulator"] = Json::FromNumber(bdp_accumulator);
319
- object["bdpEstimate"] = Json::FromNumber(bdp_estimate);
320
- object["bdpBwEst"] = Json::FromNumber(bdp_bw_est);
321
- return object;
311
+ channelz::PropertyList ChannelzProperties() const {
312
+ return channelz::PropertyList()
313
+ .Set("target_window", target_window)
314
+ .Set("target_frame_size", target_frame_size)
315
+ .Set("target_preferred_rx_crypto_frame_size",
316
+ target_preferred_rx_crypto_frame_size)
317
+ .Set("acked_init_window", acked_init_window)
318
+ .Set("queued_init_window", queued_init_window)
319
+ .Set("sent_init_window", sent_init_window)
320
+ .Set("remote_window", remote_window)
321
+ .Set("announced_window", announced_window)
322
+ .Set("announced_stream_total_over_incoming_window",
323
+ announced_stream_total_over_incoming_window)
324
+ .Set("bdp_accumulator", bdp_accumulator)
325
+ .Set("bdp_estimate", bdp_estimate)
326
+ .Set("bdp_bw_est", bdp_bw_est);
322
327
  }
323
328
  };
324
329
 
@@ -632,6 +632,16 @@ http2::ValueOrHttp2Status<Http2Frame> ParseFramePayload(
632
632
  }
633
633
  }
634
634
 
635
+ http2::Http2ErrorCode Http2ErrorCodeFromRstFrameErrorCode(uint32_t error_code) {
636
+ if (GPR_UNLIKELY(error_code > http2::GetMaxHttp2ErrorCode())) {
637
+ LOG(ERROR) << "Http2ErrorCodeFromRstFrameErrorCode: Invalid error code "
638
+ "received from RST_STREAM frame: "
639
+ << error_code;
640
+ return http2::Http2ErrorCode::kInternalError;
641
+ }
642
+ return static_cast<http2::Http2ErrorCode>(error_code);
643
+ }
644
+
635
645
  GrpcMessageHeader ExtractGrpcHeader(SliceBuffer& payload) {
636
646
  CHECK_GE(payload.Length(), kGrpcHeaderSizeInBytes);
637
647
  uint8_t buffer[kGrpcHeaderSizeInBytes];
@@ -237,6 +237,8 @@ http2::ValueOrHttp2Status<Http2Frame> ParseFramePayload(
237
237
  // move things out of frames)
238
238
  void Serialize(absl::Span<Http2Frame> frames, SliceBuffer& out);
239
239
 
240
+ http2::Http2ErrorCode Http2ErrorCodeFromRstFrameErrorCode(uint32_t error_code);
241
+
240
242
  ///////////////////////////////////////////////////////////////////////////////
241
243
  // GRPC Header
242
244
 
@@ -321,8 +323,6 @@ inline constexpr absl::string_view kGoAwayLength8 =
321
323
  "GOAWAY frame should have a Last-Stream-ID and Error Code making the "
322
324
  "minimum length 8 octets";
323
325
 
324
- // TODO(tjagtap) : [PH2][P2] : Take care that our transport class does not make
325
- // stream id larger than this.
326
326
  inline constexpr uint32_t kMaxStreamId31Bit = 0x7fffffffu;
327
327
 
328
328
  } // namespace RFC9113
@@ -80,7 +80,7 @@ void grpc_chttp2_encode_data(uint32_t id, grpc_slice_buffer* inbuf,
80
80
 
81
81
  grpc_slice_buffer_move_first_no_ref(inbuf, write_bytes, outbuf);
82
82
 
83
- grpc_core::global_stats().IncrementHttp2WriteDataFrameSize(write_bytes);
83
+ grpc_core::http2_global_stats().IncrementHttp2WriteDataFrameSize(write_bytes);
84
84
  call_tracer->RecordOutgoingBytes({header_size, 0, 0});
85
85
  }
86
86
 
@@ -108,19 +108,18 @@ grpc_error_handle grpc_chttp2_settings_parser_parse(void* p,
108
108
  if (is_last) {
109
109
  grpc_core::Http2Settings* target_settings =
110
110
  parser->incoming_settings.get();
111
- grpc_core::global_stats().IncrementHttp2HeaderTableSize(
111
+ t->http2_stats->IncrementHttp2HeaderTableSize(
112
112
  target_settings->header_table_size());
113
- grpc_core::global_stats().IncrementHttp2InitialWindowSize(
113
+ t->http2_stats->IncrementHttp2InitialWindowSize(
114
114
  target_settings->initial_window_size());
115
- grpc_core::global_stats().IncrementHttp2MaxConcurrentStreams(
115
+ t->http2_stats->IncrementHttp2MaxConcurrentStreams(
116
116
  target_settings->max_concurrent_streams());
117
- grpc_core::global_stats().IncrementHttp2MaxFrameSize(
117
+ t->http2_stats->IncrementHttp2MaxFrameSize(
118
118
  target_settings->max_frame_size());
119
- grpc_core::global_stats().IncrementHttp2MaxHeaderListSize(
119
+ t->http2_stats->IncrementHttp2MaxHeaderListSize(
120
120
  target_settings->max_header_list_size());
121
- grpc_core::global_stats()
122
- .IncrementHttp2PreferredReceiveCryptoMessageSize(
123
- target_settings->preferred_receive_crypto_message_size());
121
+ t->http2_stats->IncrementHttp2PreferredReceiveCryptoMessageSize(
122
+ target_settings->preferred_receive_crypto_message_size());
124
123
  t->http2_ztrace_collector.Append([parser]() {
125
124
  grpc_core::H2SettingsTrace<true> settings{false, {}};
126
125
  // TODO(ctiller): produce actual wire settings here, not a
@@ -109,15 +109,14 @@ grpc_error_handle grpc_chttp2_window_update_parser_parse(
109
109
  if (s != nullptr) {
110
110
  grpc_core::Timestamp now = grpc_core::Timestamp::Now();
111
111
  if (s->last_window_update_time != grpc_core::Timestamp::InfPast()) {
112
- grpc_core::global_stats().IncrementHttp2StreamWindowUpdatePeriod(
112
+ t->http2_stats->IncrementHttp2StreamWindowUpdatePeriod(
113
113
  (now - s->last_window_update_time).millis());
114
114
  }
115
115
  s->last_window_update_time = now;
116
116
  grpc_core::chttp2::StreamFlowControl::OutgoingUpdateContext(
117
117
  &s->flow_control)
118
118
  .RecvUpdate(received_update);
119
- grpc_core::global_stats().IncrementHttp2StreamRemoteWindowUpdate(
120
- received_update);
119
+ t->http2_stats->IncrementHttp2StreamRemoteWindowUpdate(received_update);
121
120
  if (grpc_chttp2_list_remove_stalled_by_stream(t, s)) {
122
121
  grpc_chttp2_mark_stream_writable(t, s);
123
122
  grpc_chttp2_initiate_write(
@@ -129,11 +128,11 @@ grpc_error_handle grpc_chttp2_window_update_parser_parse(
129
128
  &t->flow_control);
130
129
  grpc_core::Timestamp now = grpc_core::Timestamp::Now();
131
130
  if (t->last_window_update_time != grpc_core::Timestamp::InfPast()) {
132
- grpc_core::global_stats().IncrementHttp2TransportWindowUpdatePeriod(
131
+ t->http2_stats->IncrementHttp2TransportWindowUpdatePeriod(
133
132
  (now - t->last_window_update_time).millis());
134
133
  }
135
134
  t->last_window_update_time = now;
136
- grpc_core::global_stats().IncrementHttp2TransportRemoteWindowUpdate(
135
+ t->http2_stats->IncrementHttp2TransportRemoteWindowUpdate(
137
136
  received_update);
138
137
  upd.RecvUpdate(received_update);
139
138
  if (upd.Finish() == grpc_core::chttp2::StallEdge::kUnstalled) {
@@ -0,0 +1,299 @@
1
+ //
2
+ //
3
+ // Copyright 2025 gRPC authors.
4
+ //
5
+ // Licensed under the Apache License, Version 2.0 (the "License");
6
+ // you may not use this file except in compliance with the License.
7
+ // You may obtain a copy of the License at
8
+ //
9
+ // http://www.apache.org/licenses/LICENSE-2.0
10
+ //
11
+ // Unless required by applicable law or agreed to in writing, software
12
+ // distributed under the License is distributed on an "AS IS" BASIS,
13
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ // See the License for the specific language governing permissions and
15
+ // limitations under the License.
16
+ //
17
+ //
18
+
19
+ #ifndef GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HEADER_ASSEMBLER_H
20
+ #define GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HEADER_ASSEMBLER_H
21
+
22
+ #include <grpc/support/port_platform.h>
23
+
24
+ #include <cstddef>
25
+ #include <cstdint>
26
+
27
+ #include "absl/log/check.h"
28
+ #include "absl/log/log.h"
29
+ #include "src/core/call/metadata_batch.h"
30
+ #include "src/core/ext/transport/chttp2/transport/frame.h"
31
+ #include "src/core/ext/transport/chttp2/transport/hpack_encoder.h"
32
+ #include "src/core/ext/transport/chttp2/transport/hpack_parser.h"
33
+ #include "src/core/ext/transport/chttp2/transport/http2_status.h"
34
+ #include "src/core/lib/slice/slice.h"
35
+ #include "src/core/lib/slice/slice_buffer.h"
36
+ #include "src/core/util/shared_bit_gen.h"
37
+
38
+ // TODO(tjagtap) TODO(akshitpatel): [PH2][P3] : Write micro benchmarks for
39
+ // assembler and disassembler code
40
+
41
+ namespace grpc_core {
42
+ namespace http2 {
43
+
44
+ // If the Client Transport code is using HeaderAssembler in the wrong way,
45
+ // we fail with a DCHECK.
46
+ // If the peer sent some bad data, we fail with the appropriate Http2Status.
47
+
48
+ #define ASSEMBLER_LOG DVLOG(3)
49
+
50
+ constexpr absl::string_view kAssemblerContiguousSequenceError =
51
+ "RFC9113 : Field blocks MUST be transmitted as a contiguous sequence "
52
+ "of frames, with no interleaved frames of any other type or from any "
53
+ "other stream.";
54
+
55
+ constexpr absl::string_view kAssemblerMismatchedStreamId =
56
+ "CONTINUATION frame has a different Stream Identifier than the preceeding "
57
+ "HEADERS frame.";
58
+
59
+ constexpr absl::string_view kAssemblerHpackError =
60
+ "RFC9113 : A decoding error in a field block MUST be treated as a "
61
+ "connection error of type COMPRESSION_ERROR.";
62
+
63
+ constexpr absl::string_view kGrpcErrorMaxTwoHeaderFrames =
64
+ "Too many header frames sent by peer";
65
+
66
+ // A gRPC server is permitted to send both initial metadata and trailing
67
+ // metadata where initial metadata is optional. A gRPC C++ client is permitted
68
+ // to send only initial metadata. However, other gRPC Client implementations may
69
+ // send trailing metadata too. So we allow only a maximum of 2 metadata per
70
+ // streams. Which means only 2 HEADER frames are legal per stream.
71
+ constexpr uint8_t kMaxHeaderFrames = 2;
72
+
73
+ // TODO(tjagtap) : [PH2][P3] : Handle the case where a Server receives two
74
+ // header frames. Which means that the client sent trailing metadata. While we
75
+ // dont expect a gRPC C++ peer to behave like this, this might break interop
76
+ // tests and genuine interop cases.
77
+
78
+ // RFC9113
79
+ // https://www.rfc-editor.org/rfc/rfc9113.html#name-field-section-compression-a
80
+ // A complete field section (which contains our gRPC Metadata) consists of
81
+ // either: a single HEADERS or PUSH_PROMISE frame, with the END_HEADERS flag
82
+ // set, or a HEADERS or PUSH_PROMISE frame with the END_HEADERS flag unset
83
+ // and one or more CONTINUATION frames, where the last CONTINUATION frame
84
+ // has the END_HEADERS flag set.
85
+ //
86
+ // Each field block is processed as a discrete unit. Field blocks MUST be
87
+ // transmitted as a contiguous sequence of frames, with no interleaved
88
+ // frames of any other type or from any other stream. The last frame in a
89
+ // sequence of HEADERS or CONTINUATION frames has the END_HEADERS flag set.
90
+ //
91
+ // This class will first assemble all the header data into one SliceBuffer
92
+ // from each frame. And when END_HEADERS is received, the caller can generate
93
+ // the gRPC Metadata.
94
+ class HeaderAssembler {
95
+ public:
96
+ // Call this for each incoming HTTP2 Header frame.
97
+ // The payload of the Http2HeaderFrame will be cleared in this function.
98
+ Http2Status AppendHeaderFrame(Http2HeaderFrame&& frame) {
99
+ // Validate input frame
100
+ DCHECK_GT(frame.stream_id, 0u)
101
+ << "RFC9113 : HEADERS frames MUST be associated with a stream.";
102
+
103
+ // Manage size constraints
104
+ const size_t current_len = frame.payload.Length();
105
+ if constexpr (sizeof(size_t) == 4) {
106
+ if (GPR_UNLIKELY(buffer_.Length() >= UINT32_MAX - current_len)) {
107
+ Cleanup();
108
+ LOG(ERROR)
109
+ << "Stream Error: SliceBuffer overflow for 32 bit platforms.";
110
+ return Http2Status::Http2StreamError(
111
+ Http2ErrorCode::kInternalError,
112
+ "Stream Error: SliceBuffer overflow for 32 bit platforms.");
113
+ }
114
+ }
115
+
116
+ // Start header workflow
117
+ header_in_progress_ = true;
118
+
119
+ // Manage payload
120
+ frame.payload.MoveFirstNBytesIntoSliceBuffer(current_len, buffer_);
121
+ ASSEMBLER_LOG << "AppendHeaderFrame " << current_len << " Bytes.";
122
+
123
+ // Manage if last frame
124
+ if (frame.end_headers) {
125
+ ASSEMBLER_LOG << "AppendHeaderFrame end_headers";
126
+ is_ready_ = true;
127
+ }
128
+
129
+ return Http2Status::Ok();
130
+ }
131
+
132
+ // Call this for each incoming HTTP2 Continuation frame.
133
+ // The payload of the Http2ContinuationFrame will be cleared in this function.
134
+ Http2Status AppendContinuationFrame(Http2ContinuationFrame&& frame) {
135
+ // Manage payload
136
+ const size_t current_len = frame.payload.Length();
137
+ frame.payload.MoveFirstNBytesIntoSliceBuffer(current_len, buffer_);
138
+ ASSEMBLER_LOG << "AppendContinuationFrame " << current_len << " Bytes.";
139
+
140
+ // Manage if last frame
141
+ if (frame.end_headers) {
142
+ ASSEMBLER_LOG << "AppendHeaderFrame end_headers";
143
+ is_ready_ = true;
144
+ }
145
+
146
+ return Http2Status::Ok();
147
+ }
148
+
149
+ // The caller MUST check using IsReady() before calling this function
150
+ ValueOrHttp2Status<Arena::PoolPtr<grpc_metadata_batch>> ReadMetadata(
151
+ HPackParser& parser, bool is_initial_metadata, bool is_client) {
152
+ ASSEMBLER_LOG << "ReadMetadata " << buffer_.Length() << " Bytes.";
153
+
154
+ // Validate
155
+ DCHECK_EQ(is_ready_, true);
156
+
157
+ // Generate the gRPC Metadata from buffer_
158
+ // RFC9113 : A receiver MUST terminate the connection with a connection
159
+ // error (Section 5.4.1) of type COMPRESSION_ERROR if it does not decompress
160
+ // a field block. A decoding error in a field block MUST be treated as a
161
+ // connection error (Section 5.4.1) of type COMPRESSION_ERROR.
162
+ Arena::PoolPtr<grpc_metadata_batch> metadata =
163
+ Arena::MakePooledForOverwrite<grpc_metadata_batch>();
164
+ parser.BeginFrame(
165
+ /*grpc_metadata_batch*/ metadata.get(),
166
+ // TODO(tjagtap) : [PH2][P2] : Manage limits
167
+ /*metadata_size_soft_limit*/ std::numeric_limits<uint32_t>::max(),
168
+ /*metadata_size_hard_limit*/ std::numeric_limits<uint32_t>::max(),
169
+ is_initial_metadata ? HPackParser::Boundary::EndOfHeaders
170
+ : HPackParser::Boundary::EndOfStream,
171
+ HPackParser::Priority::None,
172
+ HPackParser::LogInfo{stream_id_,
173
+ is_initial_metadata
174
+ ? HPackParser::LogInfo::Type::kHeaders
175
+ : HPackParser::LogInfo::Type::kTrailers,
176
+ is_client});
177
+ for (size_t i = 0; i < buffer_.Count(); i++) {
178
+ absl::Status result = parser.Parse(
179
+ buffer_.c_slice_at(i), i == buffer_.Count() - 1, SharedBitGen(),
180
+ /*call_tracer=*/nullptr);
181
+ if (GPR_UNLIKELY(!result.ok())) {
182
+ Cleanup();
183
+ LOG(ERROR) << "Connection Error: " << kAssemblerHpackError;
184
+ return Http2Status::Http2ConnectionError(
185
+ Http2ErrorCode::kCompressionError,
186
+ std::string(kAssemblerHpackError));
187
+ }
188
+ }
189
+ parser.FinishFrame();
190
+
191
+ Cleanup();
192
+
193
+ return ValueOrHttp2Status<Arena::PoolPtr<grpc_metadata_batch>>(
194
+ std::move(metadata));
195
+ }
196
+
197
+ size_t GetBufferedHeadersLength() const { return buffer_.Length(); }
198
+
199
+ // This value MUST be checked before calling ReadMetadata()
200
+ bool IsReady() const { return is_ready_; }
201
+
202
+ explicit HeaderAssembler(const uint32_t stream_id)
203
+ : header_in_progress_(false), is_ready_(false), stream_id_(stream_id) {}
204
+
205
+ ~HeaderAssembler() = default;
206
+
207
+ HeaderAssembler(HeaderAssembler&& rvalue) = delete;
208
+ HeaderAssembler& operator=(HeaderAssembler&& rvalue) = delete;
209
+ HeaderAssembler(const HeaderAssembler&) = delete;
210
+ HeaderAssembler& operator=(const HeaderAssembler&) = delete;
211
+
212
+ private:
213
+ void Cleanup() {
214
+ buffer_.Clear();
215
+ header_in_progress_ = false;
216
+ is_ready_ = false;
217
+ }
218
+
219
+ bool header_in_progress_;
220
+ bool is_ready_;
221
+ const uint32_t stream_id_;
222
+ SliceBuffer buffer_;
223
+ };
224
+
225
+ class HeaderDisassembler {
226
+ public:
227
+ // This function will take ownership of metadata object
228
+ // The method will return false if encoding fails. A failed encoding operation
229
+ // is MUST be treated as a connection error by the caller.
230
+ // This function can queue a trailing metadata for sending even before the
231
+ // initial metadata has been extracted.
232
+ bool PrepareForSending(Arena::PoolPtr<grpc_metadata_batch>&& metadata,
233
+ HPackCompressor& encoder) {
234
+ // Validate disassembler state
235
+ DCHECK(!is_done_);
236
+ // Prepare metadata for sending
237
+ return encoder.EncodeRawHeaders(*metadata.get(), buffer_);
238
+ }
239
+
240
+ Http2Frame GetNextFrame(const uint32_t max_frame_length,
241
+ bool& out_end_headers) {
242
+ if (buffer_.Length() == 0 || is_done_) {
243
+ DCHECK(false) << "Calling code must check size using HasMoreData() "
244
+ "before GetNextFrame()";
245
+ }
246
+ out_end_headers = buffer_.Length() <= max_frame_length;
247
+ SliceBuffer temp;
248
+ if (out_end_headers) {
249
+ is_done_ = true;
250
+ temp.Swap(&buffer_);
251
+ } else {
252
+ buffer_.MoveFirstNBytesIntoSliceBuffer(max_frame_length, temp);
253
+ }
254
+ if (!did_send_header_frame_) {
255
+ did_send_header_frame_ = true;
256
+ return Http2HeaderFrame{stream_id_, out_end_headers, end_stream_,
257
+ std::move(temp)};
258
+ } else {
259
+ return Http2ContinuationFrame{stream_id_, out_end_headers,
260
+ std::move(temp)};
261
+ }
262
+ }
263
+
264
+ bool HasMoreData() const { return !is_done_ && buffer_.Length() > 0; }
265
+
266
+ // This number can be used for backpressure related calculations.
267
+ size_t GetBufferedLength() const { return buffer_.Length(); }
268
+
269
+ // A separate HeaderDisassembler object MUST be made for Initial Metadata and
270
+ // Trailing Metadata
271
+ explicit HeaderDisassembler(const uint32_t stream_id,
272
+ const bool is_trailing_metadata)
273
+ : stream_id_(stream_id),
274
+ end_stream_(is_trailing_metadata),
275
+ did_send_header_frame_(false),
276
+ is_done_(false) {}
277
+
278
+ ~HeaderDisassembler() = default;
279
+
280
+ HeaderDisassembler(HeaderDisassembler&& rvalue) = delete;
281
+ HeaderDisassembler& operator=(HeaderDisassembler&& rvalue) = delete;
282
+ HeaderDisassembler(const HeaderDisassembler&) = delete;
283
+ HeaderDisassembler& operator=(const HeaderDisassembler&) = delete;
284
+
285
+ size_t TestOnlyGetMainBufferLength() const { return buffer_.Length(); }
286
+
287
+ private:
288
+ const uint32_t stream_id_;
289
+ const bool end_stream_;
290
+ bool did_send_header_frame_;
291
+ bool is_done_; // Protect against the same disassembler from being used twice
292
+
293
+ SliceBuffer buffer_;
294
+ };
295
+
296
+ } // namespace http2
297
+ } // namespace grpc_core
298
+
299
+ #endif // GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HEADER_ASSEMBLER_H
@@ -1137,7 +1137,7 @@ grpc_error_handle HPackParser::ParseInput(
1137
1137
  input.bitsrc())) {
1138
1138
  HandleMetadataSoftSizeLimitExceeded(&input);
1139
1139
  }
1140
- global_stats().IncrementHttp2MetadataSize(state_.frame_length);
1140
+ http2_global_stats().IncrementHttp2MetadataSize(state_.frame_length);
1141
1141
  if (call_tracer != nullptr && call_tracer->IsSampled() &&
1142
1142
  metadata_buffer_ != nullptr) {
1143
1143
  MetadataSizesAnnotation metadata_sizes_annotation(
@@ -33,6 +33,7 @@
33
33
  #include "absl/strings/string_view.h"
34
34
  #include "src/core/ext/transport/chttp2/transport/hpack_constants.h"
35
35
  #include "src/core/ext/transport/chttp2/transport/hpack_parse_result.h"
36
+ #include "src/core/ext/transport/chttp2/transport/http2_stats_collector.h"
36
37
  #include "src/core/lib/debug/trace.h"
37
38
  #include "src/core/lib/slice/slice.h"
38
39
  #include "src/core/telemetry/stats.h"
@@ -58,7 +59,7 @@ auto HPackTable::MementoRingBuffer::PopOne() -> Memento {
58
59
  CHECK_GT(num_entries_, 0u);
59
60
  size_t index = first_entry_ % max_entries_;
60
61
  if (index == timestamp_index_) {
61
- global_stats().IncrementHttp2HpackEntryLifetime(
62
+ http2_stats_collector_->IncrementHttp2HpackEntryLifetime(
62
63
  (Timestamp::Now() - timestamp_).millis());
63
64
  timestamp_index_ = kNoTimestamp;
64
65
  }
@@ -66,7 +67,7 @@ auto HPackTable::MementoRingBuffer::PopOne() -> Memento {
66
67
  --num_entries_;
67
68
  auto& entry = entries_[index];
68
69
  if (!entry.parse_status.TestBit(Memento::kUsedBit)) {
69
- global_stats().IncrementHttp2HpackMisses();
70
+ http2_stats_collector_->IncrementHttp2HpackMisses();
70
71
  }
71
72
  return std::move(entry);
72
73
  }
@@ -77,7 +78,7 @@ auto HPackTable::MementoRingBuffer::Lookup(uint32_t index) -> const Memento* {
77
78
  auto& entry = entries_[offset];
78
79
  const bool was_used = entry.parse_status.TestBit(Memento::kUsedBit);
79
80
  entry.parse_status.SetBit(Memento::kUsedBit);
80
- if (!was_used) global_stats().IncrementHttp2HpackHits();
81
+ if (!was_used) http2_stats_collector_->IncrementHttp2HpackHits();
81
82
  return &entry;
82
83
  }
83
84
 
@@ -110,9 +111,9 @@ void HPackTable::MementoRingBuffer::ForEach(F f) const {
110
111
  }
111
112
 
112
113
  HPackTable::MementoRingBuffer::~MementoRingBuffer() {
113
- ForEach([](uint32_t, const Memento& m) {
114
+ ForEach([this](uint32_t, const Memento& m) {
114
115
  if (!m.parse_status.TestBit(Memento::kUsedBit)) {
115
- global_stats().IncrementHttp2HpackMisses();
116
+ http2_stats_collector_->IncrementHttp2HpackMisses();
116
117
  }
117
118
  });
118
119
  }
@@ -124,6 +125,11 @@ void HPackTable::EvictOne() {
124
125
  mem_used_ -= first_entry.md.transport_size();
125
126
  }
126
127
 
128
+ void HPackTable::SetHttp2StatsCollector(
129
+ std::shared_ptr<Http2StatsCollector> http2_stats_collector) {
130
+ entries_.SetHttp2StatsCollector(http2_stats_collector);
131
+ }
132
+
127
133
  void HPackTable::SetMaxBytes(uint32_t max_bytes) {
128
134
  if (max_bytes_ == max_bytes) {
129
135
  return;
@@ -33,6 +33,7 @@
33
33
  #include "src/core/call/parsed_metadata.h"
34
34
  #include "src/core/ext/transport/chttp2/transport/hpack_constants.h"
35
35
  #include "src/core/ext/transport/chttp2/transport/hpack_parse_result.h"
36
+ #include "src/core/ext/transport/chttp2/transport/http2_stats_collector.h"
36
37
  #include "src/core/util/no_destruct.h"
37
38
  #include "src/core/util/unique_ptr_with_bitset.h"
38
39
 
@@ -49,6 +50,8 @@ class HPackTable {
49
50
  HPackTable(HPackTable&&) = default;
50
51
  HPackTable& operator=(HPackTable&&) = default;
51
52
 
53
+ void SetHttp2StatsCollector(
54
+ std::shared_ptr<Http2StatsCollector> http2_stats_collector);
52
55
  void SetMaxBytes(uint32_t max_bytes);
53
56
  bool SetCurrentTableSize(uint32_t bytes);
54
57
  uint32_t current_table_size() { return current_table_bytes_; }
@@ -101,7 +104,8 @@ class HPackTable {
101
104
 
102
105
  class MementoRingBuffer {
103
106
  public:
104
- MementoRingBuffer() {}
107
+ MementoRingBuffer()
108
+ : http2_stats_collector_(CreateHttp2StatsCollector(nullptr)) {}
105
109
  ~MementoRingBuffer();
106
110
 
107
111
  MementoRingBuffer(const MementoRingBuffer&) = delete;
@@ -109,6 +113,11 @@ class HPackTable {
109
113
  MementoRingBuffer(MementoRingBuffer&&) = default;
110
114
  MementoRingBuffer& operator=(MementoRingBuffer&&) = default;
111
115
 
116
+ void SetHttp2StatsCollector(
117
+ std::shared_ptr<Http2StatsCollector> http2_stats_collector) {
118
+ http2_stats_collector_ = http2_stats_collector;
119
+ }
120
+
112
121
  // Rebuild this buffer with a new max_entries_ size.
113
122
  void Rebuild(uint32_t max_entries);
114
123
 
@@ -146,6 +155,8 @@ class HPackTable {
146
155
  // The timestamp associated with timestamp_entry_.
147
156
  Timestamp timestamp_;
148
157
 
158
+ std::shared_ptr<Http2StatsCollector> http2_stats_collector_ = nullptr;
159
+
149
160
  std::vector<Memento> entries_;
150
161
  };
151
162