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
@@ -0,0 +1,185 @@
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_MESSAGE_ASSEMBLER_H
20
+ #define GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_MESSAGE_ASSEMBLER_H
21
+
22
+ #include <cstdint>
23
+ #include <utility>
24
+
25
+ #include "absl/log/check.h"
26
+ #include "src/core/call/message.h"
27
+ #include "src/core/ext/transport/chttp2/transport/frame.h"
28
+ #include "src/core/ext/transport/chttp2/transport/http2_status.h"
29
+ #include "src/core/lib/resource_quota/arena.h"
30
+ #include "src/core/lib/slice/slice.h"
31
+ #include "src/core/lib/slice/slice_buffer.h"
32
+ #include "src/core/util/ref_counted_ptr.h"
33
+
34
+ namespace grpc_core {
35
+ namespace http2 {
36
+
37
+ // TODO(tjagtap) TODO(akshitpatel): [PH2][P3] : Write micro benchmarks for
38
+ // assembler and disassembler code
39
+
40
+ constexpr uint32_t kOneGb = (1024u * 1024u * 1024u);
41
+
42
+ // For the mapping of gRPC Messages to Http2DataFrame, we can have
43
+ // 1. One gRPC Message in one Http2DataFrame
44
+ // 2. Many gRPC Messages in one Http2DataFrame
45
+ // 3. One gRPC Message spread across multiple consecutive Http2DataFrames
46
+ // 4. An Http2DataFrame could also hold multiple gRPC Messages with the first
47
+ // and last gRPC Messages being partial messages.
48
+ // This class helps to assemble gRPC Messages from a series of Http2DataFrame
49
+ // payloads by processing the payloads one at a time.
50
+ class GrpcMessageAssembler {
51
+ public:
52
+ // Input : The input must contain the payload from the Http2DataFrame.
53
+ // This function will move the payload into an internal buffer.
54
+ Http2Status AppendNewDataFrame(SliceBuffer& payload,
55
+ const bool is_end_stream) {
56
+ DCHECK(!is_end_stream_)
57
+ << "Calling this function when a previous frame was marked as the last "
58
+ "frame does not make sense.";
59
+ is_end_stream_ = is_end_stream;
60
+ if constexpr (sizeof(size_t) == 4) {
61
+ if (GPR_UNLIKELY(message_buffer_.Length() >=
62
+ UINT32_MAX - payload.Length())) {
63
+ return Http2Status::Http2StreamError(
64
+ Http2ErrorCode::kInternalError,
65
+ "Stream Error: SliceBuffer overflow for 32 bit platforms.");
66
+ }
67
+ }
68
+ payload.MoveFirstNBytesIntoSliceBuffer(payload.Length(), message_buffer_);
69
+ DCHECK_EQ(payload.Length(), 0u);
70
+ return Http2Status::Ok();
71
+ }
72
+
73
+ // Returns a valid MessageHandle if it has a complete message.
74
+ // Returns a nullptr if it does not have a complete message.
75
+ // Returns an error if an incomplete message is received and the stream ends.
76
+ ValueOrHttp2Status<MessageHandle> ExtractMessage() {
77
+ const size_t current_len = message_buffer_.Length();
78
+ if (current_len < kGrpcHeaderSizeInBytes) {
79
+ // TODO(tjagtap) : [PH2][P3] : Write a test for this failure.
80
+ LOG(ERROR) << "Incomplete gRPC message received";
81
+ return ReturnNullOrError();
82
+ }
83
+ GrpcMessageHeader header = ExtractGrpcHeader(message_buffer_);
84
+ if constexpr (sizeof(size_t) == 4) {
85
+ if (GPR_UNLIKELY(header.length > kOneGb)) {
86
+ return Http2Status::Http2StreamError(
87
+ Http2ErrorCode::kInternalError,
88
+ "Stream Error: SliceBuffer overflow for 32 bit platforms.");
89
+ }
90
+ }
91
+ if (GPR_LIKELY(current_len - kGrpcHeaderSizeInBytes >= header.length)) {
92
+ SliceBuffer discard;
93
+ message_buffer_.MoveFirstNBytesIntoSliceBuffer(kGrpcHeaderSizeInBytes,
94
+ discard);
95
+ discard.Clear();
96
+ // If gRPC header has length 0, we return an empty message.
97
+ // Bounds: Max len of a valid gRPC message is 4 GB in gRPC C++. 2GB for
98
+ // other stacks. Since 4 bytes can hold length of 4GB, we dont check
99
+ // bounds.
100
+ MessageHandle grpc_message = Arena::MakePooled<Message>();
101
+ message_buffer_.MoveFirstNBytesIntoSliceBuffer(
102
+ header.length, *(grpc_message->payload()));
103
+ uint32_t& flag = grpc_message->mutable_flags();
104
+ flag = header.flags;
105
+ return std::move(grpc_message);
106
+ }
107
+ return ReturnNullOrError();
108
+ }
109
+
110
+ private:
111
+ ValueOrHttp2Status<MessageHandle> ReturnNullOrError() {
112
+ if (GPR_UNLIKELY(is_end_stream_ && message_buffer_.Length() > 0)) {
113
+ return Http2Status::Http2StreamError(Http2ErrorCode::kInternalError,
114
+ "Incomplete gRPC frame received");
115
+ }
116
+ return ValueOrHttp2Status<MessageHandle>(nullptr);
117
+ }
118
+ bool is_end_stream_ = false;
119
+ SliceBuffer message_buffer_;
120
+ };
121
+
122
+ constexpr uint32_t kMaxMessageBatchSize = (16 * 1024u);
123
+
124
+ // This class is meant to convert gRPC Messages into Http2DataFrame ensuring
125
+ // that the payload size of the data frame is configurable.
126
+ // This class is not responsible for queueing or backpressure. That will be done
127
+ // by other classes.
128
+ // TODO(tjagtap) : [PH2][P2] Edit comment once this
129
+ // class is integrated and exercised.
130
+ class GrpcMessageDisassembler {
131
+ public:
132
+ // One GrpcMessageDisassembler instance MUST be associated with one stream
133
+ // for its lifetime.
134
+ GrpcMessageDisassembler() = default;
135
+
136
+ // GrpcMessageDisassembler object will take ownership of the message.
137
+ void PrepareSingleMessageForSending(MessageHandle message) {
138
+ DCHECK_EQ(GetBufferedLength(), 0u);
139
+ PrepareMessageForSending(std::move(message));
140
+ }
141
+
142
+ // GrpcMessageDisassembler object will take ownership of the message.
143
+ void PrepareBatchedMessageForSending(MessageHandle message) {
144
+ PrepareMessageForSending(std::move(message));
145
+ DCHECK_LE(GetBufferedLength(), kMaxMessageBatchSize)
146
+ << "Avoid batches larger than " << kMaxMessageBatchSize << "bytes";
147
+ }
148
+
149
+ size_t GetBufferedLength() const { return message_.Length(); }
150
+
151
+ // Gets the next Http2DataFrame with a payload of size max_length or lesser.
152
+ Http2DataFrame GenerateNextFrame(const uint32_t stream_id,
153
+ const uint32_t max_length,
154
+ const bool is_end_stream = false) {
155
+ DCHECK_GT(max_length, 0u);
156
+ DCHECK_GT(GetBufferedLength(), 0u);
157
+ SliceBuffer temp;
158
+ const uint32_t current_length =
159
+ message_.Length() >= max_length ? max_length : message_.Length();
160
+ message_.MoveFirstNBytesIntoSliceBuffer(current_length, temp);
161
+ return Http2DataFrame{stream_id, is_end_stream, std::move(temp)};
162
+ }
163
+
164
+ Http2DataFrame GenerateEmptyEndFrame(const uint32_t stream_id) {
165
+ // RFC9113 : Frames with zero length with the END_STREAM flag set (that is,
166
+ // an empty DATA frame) MAY be sent if there is no available space in either
167
+ // flow-control window.
168
+ SliceBuffer temp;
169
+ return Http2DataFrame{stream_id, /*end_stream=*/true, std::move(temp)};
170
+ }
171
+
172
+ private:
173
+ void PrepareMessageForSending(MessageHandle message) {
174
+ AppendGrpcHeaderToSliceBuffer(message_, message->flags(),
175
+ message->payload()->Length());
176
+ message_.Append(*(message->payload()));
177
+ }
178
+
179
+ SliceBuffer message_;
180
+ };
181
+
182
+ } // namespace http2
183
+ } // namespace grpc_core
184
+
185
+ #endif // GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_MESSAGE_ASSEMBLER_H
@@ -545,8 +545,7 @@ void grpc_chttp2_parsing_become_skip_parser(grpc_chttp2_transport* t) {
545
545
  static grpc_error_handle init_data_frame_parser(grpc_chttp2_transport* t) {
546
546
  // Update BDP accounting since we have received a data frame.
547
547
  grpc_core::BdpEstimator* bdp_est = t->flow_control.bdp_estimator();
548
- grpc_core::global_stats().IncrementHttp2ReadDataFrameSize(
549
- t->incoming_frame_size);
548
+ t->http2_stats->IncrementHttp2ReadDataFrameSize(t->incoming_frame_size);
550
549
  if (bdp_est) {
551
550
  if (t->bdp_ping_blocked) {
552
551
  t->bdp_ping_blocked = false;
@@ -671,8 +670,7 @@ static grpc_error_handle init_header_frame_parser(grpc_chttp2_transport* t,
671
670
  nullptr, &t->http2_ztrace_collector));
672
671
  grpc_chttp2_initiate_write(t, GRPC_CHTTP2_INITIATE_WRITE_RST_STREAM);
673
672
  return init_header_skip_frame_parser(t, priority_type, is_eoh);
674
- } else if (grpc_core::IsRqFastRejectEnabled() &&
675
- GPR_UNLIKELY(t->memory_owner.IsMemoryPressureHigh())) {
673
+ } else if (GPR_UNLIKELY(t->memory_owner.IsMemoryPressureHigh())) {
676
674
  // We have more streams allocated than we'd like, so apply some pushback
677
675
  // by refusing this stream.
678
676
  grpc_core::global_stats().IncrementRqCallsRejected();
@@ -28,6 +28,7 @@
28
28
  #include "absl/functional/any_invocable.h"
29
29
  #include "absl/hash/hash.h"
30
30
  #include "absl/random/bit_gen_ref.h"
31
+ #include "src/core/channelz/property_list.h"
31
32
  #include "src/core/lib/debug/trace.h"
32
33
  #include "src/core/util/time.h"
33
34
 
@@ -90,6 +91,24 @@ class Chttp2PingCallbacks {
90
91
  grpc_event_engine::experimental::EventEngine* event_engine,
91
92
  Callback callback);
92
93
 
94
+ channelz::PropertyList ChannelzProperties() const {
95
+ return channelz::PropertyList()
96
+ .Set("ping_requested", ping_requested_)
97
+ .Set("most_recent_inflight", most_recent_inflight_)
98
+ .Set("started_new_ping_without_setting_timeout",
99
+ started_new_ping_without_setting_timeout_)
100
+ .Set("inflight",
101
+ [this]() {
102
+ channelz::PropertyTable inflight;
103
+ for (const auto& [id, ping] : inflight_) {
104
+ inflight.AppendRow(channelz::PropertyList().Set("id", id));
105
+ }
106
+ return inflight;
107
+ }())
108
+ .Set("num_on_start", on_start_.size())
109
+ .Set("num_on_ack", on_ack_.size());
110
+ }
111
+
93
112
  private:
94
113
  using CallbackVec = std::vector<Callback>;
95
114
  struct InflightPing {
@@ -0,0 +1,151 @@
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
+ #include "src/core/ext/transport/chttp2/transport/ping_promise.h"
19
+
20
+ #include "src/core/lib/promise/if.h"
21
+ #include "src/core/lib/promise/latch.h"
22
+ #include "src/core/lib/promise/map.h"
23
+ #include "src/core/lib/promise/party.h"
24
+ #include "src/core/lib/promise/race.h"
25
+ #include "src/core/lib/promise/sleep.h"
26
+ #include "src/core/lib/promise/try_seq.h"
27
+ #include "src/core/util/match.h"
28
+ #include "src/core/util/time.h"
29
+
30
+ namespace grpc_core {
31
+ namespace http2 {
32
+ using SendPingArgs = ::grpc_core::http2::PingInterface::SendPingArgs;
33
+ using Callback = absl::AnyInvocable<void()>;
34
+ using grpc_event_engine::experimental::EventEngine;
35
+
36
+ #define GRPC_HTTP2_PING_LOG \
37
+ LOG_IF(INFO, (GRPC_TRACE_FLAG_ENABLED(http) || \
38
+ GRPC_TRACE_FLAG_ENABLED(bdp_estimator) || \
39
+ GRPC_TRACE_FLAG_ENABLED(http_keepalive) || \
40
+ GRPC_TRACE_FLAG_ENABLED(http2_ping)))
41
+
42
+ Promise<absl::Status> PingManager::PingPromiseCallbacks::RequestPing(
43
+ Callback on_initiate) {
44
+ std::shared_ptr<Latch<void>> latch = std::make_shared<Latch<void>>();
45
+ auto on_ack = [latch]() { latch->Set(); };
46
+ ping_callbacks_.OnPing(std::move(on_initiate), std::move(on_ack));
47
+ return Map(latch->Wait(), [latch](Empty) { return absl::OkStatus(); });
48
+ }
49
+
50
+ Promise<absl::Status> PingManager::PingPromiseCallbacks::WaitForPingAck() {
51
+ std::shared_ptr<Latch<void>> latch = std::make_shared<Latch<void>>();
52
+ auto on_ack = [latch]() { latch->Set(); };
53
+ ping_callbacks_.OnPingAck(std::move(on_ack));
54
+ return Map(latch->Wait(), [latch](Empty) { return absl::OkStatus(); });
55
+ }
56
+
57
+ // Ping System implementation
58
+ PingManager::PingManager(const ChannelArgs& channel_args,
59
+ std::unique_ptr<PingInterface> ping_interface,
60
+ std::shared_ptr<EventEngine> event_engine)
61
+ : ping_callbacks_(event_engine),
62
+ ping_abuse_policy_(channel_args),
63
+ ping_rate_policy_(channel_args, /*is_client=*/true),
64
+ ping_interface_(std::move(ping_interface)) {}
65
+
66
+ void PingManager::TriggerDelayedPing(Duration wait) {
67
+ // Spawn at most once.
68
+ if (delayed_ping_spawned_) {
69
+ return;
70
+ }
71
+ delayed_ping_spawned_ = true;
72
+ GetContext<Party>()->Spawn(
73
+ "DelayedPing",
74
+ [this, wait]() mutable {
75
+ VLOG(2) << "Scheduling delayed ping after wait=" << wait;
76
+ return AssertResultType<absl::Status>(TrySeq(
77
+ Sleep(wait),
78
+ [this]() mutable { return ping_interface_->TriggerWrite(); }));
79
+ },
80
+ [this](auto) { delayed_ping_spawned_ = false; });
81
+ }
82
+
83
+ bool PingManager::NeedToPing(Duration next_allowed_ping_interval) {
84
+ if (!ping_callbacks_.PingRequested()) {
85
+ return false;
86
+ }
87
+
88
+ return Match(
89
+ ping_rate_policy_.RequestSendPing(next_allowed_ping_interval,
90
+ ping_callbacks_.CountPingInflight()),
91
+ [this](Chttp2PingRatePolicy::SendGranted) {
92
+ // TODO(akshitpatel) : [PH2][P1] : Update some keepalive flags.
93
+ GRPC_HTTP2_PING_LOG << "CLIENT" << "[" << "PH2"
94
+ << "]: Ping sent"
95
+ << ping_rate_policy_.GetDebugString();
96
+ return true;
97
+ },
98
+ [this](Chttp2PingRatePolicy::TooManyRecentPings) {
99
+ GRPC_HTTP2_PING_LOG << "CLIENT" << "[" << "PH2"
100
+ << "]: Ping delayed too many recent pings: "
101
+ << ping_rate_policy_.GetDebugString();
102
+ return false;
103
+ },
104
+ [this](Chttp2PingRatePolicy::TooSoon too_soon) mutable {
105
+ GRPC_HTTP2_PING_LOG
106
+ << "]: Ping delayed not enough time elapsed since last "
107
+ "ping. Last ping:"
108
+ << too_soon.last_ping
109
+ << ", minimum wait:" << too_soon.next_allowed_ping_interval
110
+ << ", need to wait:" << too_soon.wait;
111
+ TriggerDelayedPing(too_soon.wait);
112
+ return false;
113
+ });
114
+ }
115
+
116
+ void PingManager::SpawnTimeout(Duration ping_timeout,
117
+ const uint64_t opaque_data) {
118
+ GetContext<Party>()->Spawn(
119
+ "PingTimeout",
120
+ [this, ping_timeout, opaque_data]() {
121
+ return AssertResultType<absl::Status>(Race(
122
+ TrySeq(ping_callbacks_.PingTimeout(ping_timeout),
123
+ [this, opaque_data]() mutable {
124
+ VLOG(2) << " Ping ack not received for id=" << opaque_data
125
+ << ". Ping timeout triggered.";
126
+ return ping_interface_->PingTimeout();
127
+ }),
128
+ ping_callbacks_.WaitForPingAck()));
129
+ },
130
+ [](auto) {});
131
+ }
132
+
133
+ Promise<absl::Status> PingManager::MaybeSendPing(
134
+ Duration next_allowed_ping_interval, Duration ping_timeout) {
135
+ return If(
136
+ NeedToPing(next_allowed_ping_interval),
137
+ [this, ping_timeout]() mutable {
138
+ const uint64_t opaque_data = ping_callbacks_.StartPing();
139
+ return AssertResultType<absl::Status>(
140
+ TrySeq(ping_interface_->SendPing(SendPingArgs{false, opaque_data}),
141
+ [this, ping_timeout, opaque_data]() {
142
+ VLOG(2) << "Ping Sent with id: " << opaque_data;
143
+ SpawnTimeout(ping_timeout, opaque_data);
144
+ SentPing();
145
+ return absl::OkStatus();
146
+ }));
147
+ },
148
+ []() { return Immediate(absl::OkStatus()); });
149
+ }
150
+ } // namespace http2
151
+ } // namespace grpc_core
@@ -0,0 +1,180 @@
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
+ #ifndef GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_PING_PROMISE_H
19
+ #define GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_PING_PROMISE_H
20
+
21
+ #include <memory>
22
+
23
+ #include "src/core/ext/transport/chttp2/transport/ping_abuse_policy.h"
24
+ #include "src/core/ext/transport/chttp2/transport/ping_callbacks.h"
25
+ #include "src/core/ext/transport/chttp2/transport/ping_rate_policy.h"
26
+ #include "src/core/lib/promise/inter_activity_latch.h"
27
+ #include "src/core/lib/promise/map.h"
28
+ #include "src/core/lib/promise/promise.h"
29
+ #include "src/core/util/shared_bit_gen.h"
30
+ #include "src/core/util/time.h"
31
+
32
+ namespace grpc_core {
33
+ namespace http2 {
34
+
35
+ // Ping Promise Spawns Overview
36
+
37
+ // | Promise Spawn | Max Duration | Promise | Max Spawns |
38
+ // | | for Spawn | Resolution | |
39
+ // |-----------------|--------------|--------------|-------------------------|
40
+ // | Ping Timeout | 1 minute | On Ping ack | One per inflight ping |
41
+ // | | | or timeout | |
42
+ // | Delayed Ping | 2 Hours | On scheduled | One |
43
+ // | | | time | |
44
+ // | Ping Waiter | 1 minute | On Ping ack | One per ping request |
45
+ // | | | or timeout | |
46
+ // Max Party Slots:
47
+ // - Without multi ping:
48
+ // - 1 per ping request + 1 (for delayed ping) + 1 (for ping timeout)
49
+ // - Worst case(3 ping requests): 5
50
+
51
+ // - With multi ping:
52
+ // - 1 per ping request + 1 (for delayed ping) + 1 per inflight ping
53
+ // (for ping timeout)
54
+ // - Worst case(3 ping requests): 7
55
+
56
+ class PingInterface {
57
+ public:
58
+ struct SendPingArgs {
59
+ bool ack = false;
60
+ // RFC9113: PING frames MUST contain 8 octets of opaque data in the frame
61
+ // payload. A sender can include any value it chooses and use those octets
62
+ // in any fashion.
63
+ uint64_t opaque_data = 0;
64
+ };
65
+
66
+ // Returns a promise that creates and sends a ping frame to the peer.
67
+ virtual Promise<absl::Status> SendPing(SendPingArgs args) = 0;
68
+
69
+ // Returns a promise that triggers a write cycle on the transport.
70
+ virtual Promise<absl::Status> TriggerWrite() = 0;
71
+
72
+ // Returns a promise that handles the ping timeout.
73
+ virtual Promise<absl::Status> PingTimeout() = 0;
74
+ virtual ~PingInterface() = default;
75
+ };
76
+
77
+ // The code in this class is NOT thread safe. It has been designed to run on a
78
+ // single thread. This guarantee is achieved by spawning all the promises
79
+ // returned by this class on the same transport party.
80
+ class PingManager {
81
+ public:
82
+ PingManager(const ChannelArgs& channel_args,
83
+ std::unique_ptr<PingInterface> ping_interface,
84
+ std::shared_ptr<grpc_event_engine::experimental::EventEngine>
85
+ event_engine);
86
+
87
+ // Returns a promise that determines if a ping frame should be sent to the
88
+ // peer. If a ping frame is sent, it also spawns a timeout promise that
89
+ // handles the ping timeout.
90
+ Promise<absl::Status> MaybeSendPing(Duration next_allowed_ping_interval,
91
+ Duration ping_timeout);
92
+
93
+ // Ping Rate policy wrapper
94
+ void ReceivedDataFrame() { ping_rate_policy_.ReceivedDataFrame(); }
95
+
96
+ // Ping abuse policy wrapper
97
+ bool NotifyPingAbusePolicy(const bool transport_idle) {
98
+ return ping_abuse_policy_.ReceivedOnePing(transport_idle);
99
+ }
100
+
101
+ void ResetPingClock(bool is_client) {
102
+ if (!is_client) {
103
+ ping_abuse_policy_.ResetPingStrikes();
104
+ }
105
+ ping_rate_policy_.ResetPingsBeforeDataRequired();
106
+ }
107
+
108
+ // Ping callbacks wrapper
109
+
110
+ // Returns a promise that resolves once a new ping is initiated and ack is
111
+ // received for the same. The on_initiate callback is executed when the
112
+ // ping is initiated.
113
+ auto RequestPing(absl::AnyInvocable<void()> on_initiate) {
114
+ return ping_callbacks_.RequestPing(std::move(on_initiate));
115
+ }
116
+
117
+ // Returns a promise that resolves once the next valid ping ack is received.
118
+ auto WaitForPingAck() { return ping_callbacks_.WaitForPingAck(); }
119
+
120
+ // Cancels all the callbacks for the inflight pings. This function does not
121
+ // cancel the promises that are waiting on the ping ack.
122
+ // This should be called as part of closing the transport to free up any
123
+ // memory in use by the ping callbacks.
124
+ void CancelCallbacks() { ping_callbacks_.CancelCallbacks(); }
125
+
126
+ uint64_t StartPing() { return ping_callbacks_.StartPing(); }
127
+ bool PingRequested() { return ping_callbacks_.PingRequested(); }
128
+ bool AckPing(uint64_t id) { return ping_callbacks_.AckPing(id); }
129
+ size_t CountPingInflight() { return ping_callbacks_.CountPingInflight(); }
130
+
131
+ private:
132
+ class PingPromiseCallbacks {
133
+ public:
134
+ explicit PingPromiseCallbacks(
135
+ std::shared_ptr<grpc_event_engine::experimental::EventEngine>
136
+ event_engine)
137
+ : event_engine_(event_engine) {}
138
+ Promise<absl::Status> RequestPing(absl::AnyInvocable<void()> on_initiate);
139
+ Promise<absl::Status> WaitForPingAck();
140
+ void CancelCallbacks() { ping_callbacks_.CancelAll(event_engine_.get()); }
141
+ uint64_t StartPing() { return ping_callbacks_.StartPing(SharedBitGen()); }
142
+ bool PingRequested() { return ping_callbacks_.ping_requested(); }
143
+ bool AckPing(uint64_t id) {
144
+ return ping_callbacks_.AckPing(id, event_engine_.get());
145
+ }
146
+ size_t CountPingInflight() { return ping_callbacks_.pings_inflight(); }
147
+
148
+ auto PingTimeout(Duration ping_timeout) {
149
+ std::shared_ptr<InterActivityLatch<void>> latch =
150
+ std::make_shared<InterActivityLatch<void>>();
151
+ auto timeout_cb = [latch]() { latch->Set(); };
152
+ auto id = ping_callbacks_.OnPingTimeout(ping_timeout, event_engine_.get(),
153
+ std::move(timeout_cb));
154
+ DCHECK(id.has_value());
155
+ VLOG(2) << "Ping timeout of duration: " << ping_timeout
156
+ << " initiated for ping id: " << *id;
157
+ return Map(latch->Wait(), [latch](Empty) { return absl::OkStatus(); });
158
+ }
159
+
160
+ private:
161
+ Chttp2PingCallbacks ping_callbacks_;
162
+ std::shared_ptr<grpc_event_engine::experimental::EventEngine> event_engine_;
163
+ };
164
+
165
+ PingPromiseCallbacks ping_callbacks_;
166
+ Chttp2PingAbusePolicy ping_abuse_policy_;
167
+ Chttp2PingRatePolicy ping_rate_policy_;
168
+ bool delayed_ping_spawned_ = false;
169
+ std::unique_ptr<PingInterface> ping_interface_;
170
+
171
+ void TriggerDelayedPing(Duration wait);
172
+ bool NeedToPing(Duration next_allowed_ping_interval);
173
+ void SpawnTimeout(Duration ping_timeout, uint64_t opaque_data);
174
+
175
+ void SentPing() { ping_rate_policy_.SentPing(); }
176
+ };
177
+ } // namespace http2
178
+ } // namespace grpc_core
179
+
180
+ #endif // GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_PING_PROMISE_H
@@ -79,15 +79,11 @@ Chttp2PingRatePolicy::RequestSendPing(Duration next_allowed_ping_interval,
79
79
  // Throttle pings to 1 minute if we haven't sent any data recently
80
80
  if (max_pings_without_data_sent_ != 0 &&
81
81
  pings_before_data_sending_required_ == 0) {
82
- if (IsMaxPingsWoDataThrottleEnabled()) {
83
- const Timestamp next_allowed_ping =
84
- last_ping_sent_time_ + kThrottleIntervalWithoutDataSent;
85
- if (next_allowed_ping > now) {
86
- return TooSoon{kThrottleIntervalWithoutDataSent, last_ping_sent_time_,
87
- next_allowed_ping - now};
88
- }
89
- } else {
90
- return TooManyRecentPings{};
82
+ const Timestamp next_allowed_ping =
83
+ last_ping_sent_time_ + kThrottleIntervalWithoutDataSent;
84
+ if (next_allowed_ping > now) {
85
+ return TooSoon{kThrottleIntervalWithoutDataSent, last_ping_sent_time_,
86
+ next_allowed_ping - now};
91
87
  }
92
88
  }
93
89
 
@@ -22,7 +22,9 @@
22
22
  #include <string>
23
23
  #include <variant>
24
24
 
25
+ #include "src/core/channelz/property_list.h"
25
26
  #include "src/core/lib/channel/channel_args.h"
27
+ #include "src/core/util/string.h"
26
28
  #include "src/core/util/time.h"
27
29
 
28
30
  namespace grpc_core {
@@ -78,6 +80,15 @@ class Chttp2PingRatePolicy {
78
80
  return max_pings_without_data_sent_;
79
81
  }
80
82
 
83
+ channelz::PropertyList ChannelzProperties() const {
84
+ return channelz::PropertyList()
85
+ .Set("max_pings_without_data_sent", max_pings_without_data_sent_)
86
+ .Set("max_inflight_pings", max_inflight_pings_)
87
+ .Set("pings_before_data_sending_required",
88
+ pings_before_data_sending_required_)
89
+ .Set("last_ping_sent_time", last_ping_sent_time_);
90
+ }
91
+
81
92
  private:
82
93
  const int max_pings_without_data_sent_;
83
94
  const int max_inflight_pings_;