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,593 @@
1
+ //
2
+ //
3
+ // Copyright 2024 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_HTTP2_CLIENT_TRANSPORT_H
20
+ #define GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HTTP2_CLIENT_TRANSPORT_H
21
+
22
+ #include <cstdint>
23
+ #include <utility>
24
+
25
+ #include "src/core/call/call_spine.h"
26
+ #include "src/core/ext/transport/chttp2/transport/frame.h"
27
+ #include "src/core/ext/transport/chttp2/transport/header_assembler.h"
28
+ #include "src/core/ext/transport/chttp2/transport/hpack_encoder.h"
29
+ #include "src/core/ext/transport/chttp2/transport/hpack_parser.h"
30
+ #include "src/core/ext/transport/chttp2/transport/http2_settings.h"
31
+ #include "src/core/ext/transport/chttp2/transport/http2_status.h"
32
+ #include "src/core/ext/transport/chttp2/transport/http2_transport.h"
33
+ #include "src/core/ext/transport/chttp2/transport/keepalive.h"
34
+ #include "src/core/ext/transport/chttp2/transport/message_assembler.h"
35
+ #include "src/core/ext/transport/chttp2/transport/ping_promise.h"
36
+ #include "src/core/lib/promise/inter_activity_mutex.h"
37
+ #include "src/core/lib/promise/mpsc.h"
38
+ #include "src/core/lib/promise/party.h"
39
+ #include "src/core/lib/transport/connectivity_state.h"
40
+ #include "src/core/lib/transport/promise_endpoint.h"
41
+ #include "src/core/lib/transport/transport.h"
42
+ #include "src/core/util/orphanable.h"
43
+ #include "src/core/util/ref_counted_ptr.h"
44
+ #include "src/core/util/sync.h"
45
+
46
+ namespace grpc_core {
47
+ namespace http2 {
48
+
49
+ // All Promise Based HTTP2 Transport TODOs have the tag
50
+ // [PH2][Pn] where n = 0 to 5.
51
+ // This helps to maintain the uniformity for quick lookup and fixing.
52
+ //
53
+ // [PH2][P0] MUST be fixed before the current PR is submitted.
54
+ // [PH2][P1] MUST be fixed before the current sub-project is considered
55
+ // complete.
56
+ // [PH2][P2] MUST be fixed before the current Milestone is considered
57
+ // complete.
58
+ // [PH2][P3] MUST be fixed before Milestone 3 is considered complete.
59
+ // [PH2][P4] Can be fixed after roll out begins. Evaluate these during
60
+ // Milestone 4. Either do the TODOs or delete them.
61
+ // [PH2][P5] This MUST be a separate standalone project.
62
+ // [PH2][EXT] This is a TODO related to a project unrelated to PH2 but happening
63
+ // in parallel.
64
+
65
+ // Http2 Client Transport Spawns Overview
66
+
67
+ // | Promise Spawn | Max Duration | Promise Resolution | Max Spawns |
68
+ // | | for Spawn | | |
69
+ // |---------------------|--------------|-----------------------|------------|
70
+ // | Endpoint Read Loop | Infinite | On transport close | One |
71
+ // | Endpoint Write Loop | Infinite | On transport close | One |
72
+ // | Close Transport | CloseTimeout | On transport close | One |
73
+
74
+ // Max Party Slots (Always): 2
75
+ // Max Promise Slots (Worst Case): 3
76
+
77
+ // Experimental : This is just the initial skeleton of class
78
+ // and it is functions. The code will be written iteratively.
79
+ // Do not use or edit any of these functions unless you are
80
+ // familiar with the PH2 project (Moving chttp2 to promises.)
81
+ // TODO(tjagtap) : [PH2][P3] : Update the experimental status of the code before
82
+ // http2 rollout begins.
83
+ class Http2ClientTransport final : public ClientTransport {
84
+ // TODO(tjagtap) : [PH2][P3] Move the definitions to the header for better
85
+ // inlining. For now definitions are in the cc file to
86
+ // reduce cognitive load in the header.
87
+ public:
88
+ Http2ClientTransport(
89
+ PromiseEndpoint endpoint, GRPC_UNUSED const ChannelArgs& channel_args,
90
+ std::shared_ptr<grpc_event_engine::experimental::EventEngine>
91
+ event_engine,
92
+ grpc_closure* on_receive_settings);
93
+
94
+ Http2ClientTransport(const Http2ClientTransport&) = delete;
95
+ Http2ClientTransport& operator=(const Http2ClientTransport&) = delete;
96
+ Http2ClientTransport(Http2ClientTransport&&) = delete;
97
+ Http2ClientTransport& operator=(Http2ClientTransport&&) = delete;
98
+ ~Http2ClientTransport() override;
99
+
100
+ FilterStackTransport* filter_stack_transport() override { return nullptr; }
101
+ ClientTransport* client_transport() override { return this; }
102
+ ServerTransport* server_transport() override { return nullptr; }
103
+ absl::string_view GetTransportName() const override { return "http2"; }
104
+
105
+ // TODO(tjagtap) : [PH2][EXT] : These can be removed when event engine rollout
106
+ // is complete.
107
+ void SetPollset(grpc_stream*, grpc_pollset*) override {}
108
+ void SetPollsetSet(grpc_stream*, grpc_pollset_set*) override {}
109
+
110
+ // Called at the start of a stream.
111
+ void StartCall(CallHandler call_handler) override;
112
+
113
+ void PerformOp(grpc_transport_op*) override;
114
+ void StartConnectivityWatch(
115
+ grpc_connectivity_state state,
116
+ OrphanablePtr<ConnectivityStateWatcherInterface> watcher);
117
+ void StopConnectivityWatch(ConnectivityStateWatcherInterface* watcher);
118
+
119
+ void Orphan() override;
120
+ void AbortWithError();
121
+
122
+ RefCountedPtr<channelz::SocketNode> GetSocketNode() const override {
123
+ return nullptr;
124
+ }
125
+
126
+ auto TestOnlyEnqueueOutgoingFrame(Http2Frame frame) {
127
+ // TODO(tjagtap) : [PH2][P3] : See if making a sender in the constructor
128
+ // and using that always would be more efficient.
129
+ return AssertResultType<absl::Status>(Map(
130
+ outgoing_frames_.MakeSender().Send(std::move(frame), 1),
131
+ [](StatusFlag status) {
132
+ GRPC_HTTP2_CLIENT_DLOG
133
+ << "Http2ClientTransport::TestOnlyEnqueueOutgoingFrame status="
134
+ << status;
135
+ return (status.ok()) ? absl::OkStatus()
136
+ : absl::InternalError("Failed to enqueue frame");
137
+ }));
138
+ }
139
+
140
+ auto TestOnlySendPing(absl::AnyInvocable<void()> on_initiate) {
141
+ return ping_manager_.RequestPing(std::move(on_initiate));
142
+ }
143
+
144
+ template <typename Factory>
145
+ auto TestOnlySpawnPromise(absl::string_view name, Factory factory) {
146
+ return general_party_->Spawn(name, std::move(factory), [](auto) {});
147
+ }
148
+
149
+ private:
150
+ // Promise factory for processing each type of frame
151
+ Http2Status ProcessHttp2DataFrame(Http2DataFrame frame);
152
+ Http2Status ProcessHttp2HeaderFrame(Http2HeaderFrame frame);
153
+ Http2Status ProcessHttp2RstStreamFrame(Http2RstStreamFrame frame);
154
+ Http2Status ProcessHttp2SettingsFrame(Http2SettingsFrame frame);
155
+ auto ProcessHttp2PingFrame(Http2PingFrame frame);
156
+ Http2Status ProcessHttp2GoawayFrame(Http2GoawayFrame frame);
157
+ Http2Status ProcessHttp2WindowUpdateFrame(Http2WindowUpdateFrame frame);
158
+ Http2Status ProcessHttp2ContinuationFrame(Http2ContinuationFrame frame);
159
+ Http2Status ProcessHttp2SecurityFrame(Http2SecurityFrame frame);
160
+ Http2Status ProcessMetadata(uint32_t stream_id, HeaderAssembler& assembler,
161
+ CallHandler& call,
162
+ bool& did_push_initial_metadata,
163
+ bool& did_push_trailing_metadata);
164
+
165
+ // Reading from the endpoint.
166
+
167
+ // Returns a promise to keep reading in a Loop till a fail/close is
168
+ // received.
169
+ auto ReadLoop();
170
+
171
+ // Returns a promise that will read and process one HTTP2 frame.
172
+ auto ReadAndProcessOneFrame();
173
+
174
+ // Returns a promise that will process one HTTP2 frame.
175
+ auto ProcessOneFrame(Http2Frame frame);
176
+
177
+ // Returns a promise that will do the cleanup after the ReadLoop ends.
178
+ auto OnReadLoopEnded();
179
+
180
+ // Writing to the endpoint.
181
+
182
+ // Read from the MPSC queue and write it.
183
+ auto WriteFromQueue();
184
+
185
+ // Returns a promise to keep writing in a Loop till a fail/close is
186
+ // received.
187
+ auto WriteLoop();
188
+
189
+ // Returns a promise that will do the cleanup after the WriteLoop ends.
190
+ auto OnWriteLoopEnded();
191
+
192
+ // Returns a promise to fetch data from the callhandler and pass it further
193
+ // down towards the endpoint.
194
+ auto CallOutboundLoop(CallHandler call_handler, uint32_t stream_id,
195
+ InterActivityMutex<uint32_t>::Lock lock,
196
+ ClientMetadataHandle metadata);
197
+
198
+ // Returns a promise to enqueue a frame to MPSC
199
+ auto EnqueueOutgoingFrame(Http2Frame frame) {
200
+ // TODO(tjagtap) : [PH2][P3] : See if making a sender in the constructor
201
+ // and using that always would be more efficient.
202
+ return AssertResultType<absl::Status>(Map(
203
+ outgoing_frames_.MakeSender().Send(std::move(frame), 1),
204
+ [self = RefAsSubclass<Http2ClientTransport>()](StatusFlag status) {
205
+ GRPC_HTTP2_CLIENT_DLOG
206
+ << "Http2ClientTransport::EnqueueOutgoingFrame status=" << status;
207
+ return (status.ok())
208
+ ? absl::OkStatus()
209
+ : self->HandleError(Http2Status::AbslConnectionError(
210
+ absl::StatusCode::kInternal,
211
+ "Failed to enqueue frame"));
212
+ }));
213
+ }
214
+
215
+ // Force triggers a transport write cycle
216
+ auto TriggerWriteCycle() { return EnqueueOutgoingFrame(Http2EmptyFrame{}); }
217
+
218
+ RefCountedPtr<Party> general_party_;
219
+
220
+ PromiseEndpoint endpoint_;
221
+ Http2SettingsManager settings_;
222
+
223
+ Http2FrameHeader current_frame_header_;
224
+
225
+ // Managing the streams
226
+ struct Stream : public RefCounted<Stream> {
227
+ explicit Stream(CallHandler call, const uint32_t stream_id1)
228
+ : call(std::move(call)),
229
+ stream_state(HttpStreamState::kIdle),
230
+ stream_id(stream_id1),
231
+ header_assembler(stream_id1),
232
+ did_push_initial_metadata(false),
233
+ did_push_trailing_metadata(false) {}
234
+
235
+ // Modify the stream state
236
+ // The possible stream transitions are as follows:
237
+ // kIdle -> kOpen
238
+ // kOpen -> kClosed/kHalfClosedLocal/kHalfClosedRemote
239
+ // kHalfClosedLocal/kHalfClosedRemote -> kClosed
240
+ // kClosed -> kClosed
241
+ void SentInitialMetadata() {
242
+ DCHECK(stream_state == HttpStreamState::kIdle);
243
+ stream_state = HttpStreamState::kOpen;
244
+ }
245
+
246
+ void MarkHalfClosedLocal() {
247
+ switch (stream_state) {
248
+ case HttpStreamState::kIdle:
249
+ DCHECK(false) << "MarkHalfClosedLocal called for an idle stream";
250
+ break;
251
+ case HttpStreamState::kOpen:
252
+ stream_state = HttpStreamState::kHalfClosedLocal;
253
+ break;
254
+ case HttpStreamState::kHalfClosedRemote:
255
+ stream_state = HttpStreamState::kClosed;
256
+ break;
257
+ case HttpStreamState::kHalfClosedLocal:
258
+ break;
259
+ case HttpStreamState::kClosed:
260
+ break;
261
+ }
262
+ }
263
+
264
+ void MarkHalfClosedRemote() {
265
+ switch (stream_state) {
266
+ case HttpStreamState::kIdle:
267
+ DCHECK(false) << "MarkHalfClosedRemote called for an idle stream";
268
+ break;
269
+ case HttpStreamState::kOpen:
270
+ stream_state = HttpStreamState::kHalfClosedRemote;
271
+ break;
272
+ case HttpStreamState::kHalfClosedLocal:
273
+ stream_state = HttpStreamState::kClosed;
274
+ break;
275
+ case HttpStreamState::kHalfClosedRemote:
276
+ break;
277
+ case HttpStreamState::kClosed:
278
+ break;
279
+ }
280
+ }
281
+
282
+ inline bool IsClosed() const {
283
+ return stream_state == HttpStreamState::kClosed;
284
+ }
285
+
286
+ CallHandler call;
287
+ // TODO(akshitpatel) : [PH2][P3] : Investigate if this needs to be atomic.
288
+ HttpStreamState stream_state;
289
+ const uint32_t stream_id;
290
+ TransportSendQeueue send_queue;
291
+ GrpcMessageAssembler assembler;
292
+ HeaderAssembler header_assembler;
293
+ // TODO(akshitpatel) : [PH2][P2] : StreamQ should maintain a flag that
294
+ // tracks if the half close has been sent for this stream. This flag is used
295
+ // to notify the mixer that this stream is closed for
296
+ // writes(HalfClosedLocal). When the mixer dequeues the last message for
297
+ // the streamQ, it will mark the stream as closed for writes and send a
298
+ // frame with end_stream or set the end_stream flag in the last data
299
+ // frame being sent out. This is done as the stream state should not
300
+ // transition to HalfClosedLocal till the end_stream frame is sent.
301
+ bool did_push_initial_metadata;
302
+ bool did_push_trailing_metadata;
303
+ };
304
+
305
+ uint32_t NextStreamId(
306
+ InterActivityMutex<uint32_t>::Lock& next_stream_id_lock) {
307
+ const uint32_t stream_id = *next_stream_id_lock;
308
+ if (stream_id > RFC9113::kMaxStreamId31Bit) {
309
+ // TODO(tjagtap) : [PH2][P3] : Handle case if transport runs out of stream
310
+ // ids
311
+ // RFC9113 : Stream identifiers cannot be reused. Long-lived connections
312
+ // can result in an endpoint exhausting the available range of stream
313
+ // identifiers. A client that is unable to establish a new stream
314
+ // identifier can establish a new connection for new streams. A server
315
+ // that is unable to establish a new stream identifier can send a GOAWAY
316
+ // frame so that the client is forced to open a new connection for new
317
+ // streams.
318
+ }
319
+ // RFC9113 : Streams initiated by a client MUST use odd-numbered stream
320
+ // identifiers.
321
+ (*next_stream_id_lock) += 2;
322
+ return stream_id;
323
+ }
324
+
325
+ MpscReceiver<Http2Frame> outgoing_frames_;
326
+
327
+ Mutex transport_mutex_;
328
+ // TODO(tjagtap) : [PH2][P2] : Add to map in StartCall and clean this
329
+ // mapping up in the on_done of the CallInitiator or CallHandler
330
+ absl::flat_hash_map<uint32_t, RefCountedPtr<Stream>> stream_list_
331
+ ABSL_GUARDED_BY(transport_mutex_);
332
+
333
+ // Mutex to preserve the order of headers being sent out for new streams.
334
+ // This also tracks the stream_id for creating new streams.
335
+ InterActivityMutex<uint32_t> stream_id_mutex_;
336
+ HPackCompressor encoder_;
337
+ HPackParser parser_;
338
+ bool is_transport_closed_ ABSL_GUARDED_BY(transport_mutex_) = false;
339
+
340
+ ConnectivityStateTracker state_tracker_ ABSL_GUARDED_BY(transport_mutex_){
341
+ "http2_client", GRPC_CHANNEL_READY};
342
+
343
+ bool MakeStream(CallHandler call_handler, uint32_t stream_id);
344
+
345
+ struct CloseStreamArgs {
346
+ bool close_reads;
347
+ bool close_writes;
348
+ bool send_rst_stream;
349
+ bool push_trailing_metadata;
350
+ };
351
+
352
+ // This function MUST be idempotent.
353
+ void CloseStream(uint32_t stream_id, absl::Status status,
354
+ CloseStreamArgs args, DebugLocation whence = {});
355
+
356
+ RefCountedPtr<Http2ClientTransport::Stream> LookupStream(uint32_t stream_id);
357
+
358
+ auto EndpointReadSlice(const size_t num_bytes) {
359
+ return Map(endpoint_.ReadSlice(num_bytes),
360
+ [self = RefAsSubclass<Http2ClientTransport>()](
361
+ absl::StatusOr<Slice> status) {
362
+ // We are ignoring the case where the read fails and call
363
+ // GotData() regardless. Reasoning:
364
+ // 1. It is expected that if the read fails, the transport will
365
+ // close and the keepalive loop will be stopped.
366
+ // 2. It does not seem worth to have an extra condition for the
367
+ // success cases which would be way more common.
368
+ self->keepalive_manager_.GotData();
369
+ return status;
370
+ });
371
+ }
372
+
373
+ auto EndpointRead(const size_t num_bytes) {
374
+ return Map(endpoint_.Read(num_bytes),
375
+ [self = RefAsSubclass<Http2ClientTransport>()](
376
+ absl::StatusOr<SliceBuffer> status) {
377
+ // We are ignoring the case where the read fails and call
378
+ // GotData() regardless. Reasoning:
379
+ // 1. It is expected that if the read fails, the transport will
380
+ // close and the keepalive loop will be stopped.
381
+ // 2. It does not seem worth to have an extra condition for the
382
+ // success cases which would be way more common.
383
+ self->keepalive_manager_.GotData();
384
+ return status;
385
+ });
386
+ }
387
+
388
+ // This function MUST run on the transport party.
389
+ void CloseTransport();
390
+
391
+ void MaybeSpawnCloseTransport(Http2Status http2_status,
392
+ DebugLocation whence = {});
393
+
394
+ // Handles the error status and returns the corresponding absl status. Absl
395
+ // Status is returned so that the error can be gracefully handled
396
+ // by promise primitives.
397
+ // If the error is a stream error, it closes the stream and returns an ok
398
+ // status. Ok status is returned because the calling transport promise loops
399
+ // should not be cancelled in case of stream errors.
400
+ // If the error is a connection error, it closes the transport and returns the
401
+ // corresponding (failed) absl status.
402
+ absl::Status HandleError(Http2Status status, DebugLocation whence = {}) {
403
+ auto error_type = status.GetType();
404
+ DCHECK(error_type != Http2Status::Http2ErrorType::kOk);
405
+
406
+ if (error_type == Http2Status::Http2ErrorType::kStreamError) {
407
+ LOG(ERROR) << "Stream Error: " << status.DebugString();
408
+ CloseStream(current_frame_header_.stream_id, status.GetAbslStreamError(),
409
+ CloseStreamArgs{
410
+ /*close_reads=*/true,
411
+ /*close_writes=*/true,
412
+ /*send_rst_stream=*/true,
413
+ /*push_trailing_metadata=*/true,
414
+ },
415
+ whence);
416
+ return absl::OkStatus();
417
+ } else if (error_type == Http2Status::Http2ErrorType::kConnectionError) {
418
+ LOG(ERROR) << "Connection Error: " << status.DebugString();
419
+ absl::Status absl_status = status.GetAbslConnectionError();
420
+ MaybeSpawnCloseTransport(std::move(status), whence);
421
+ return absl_status;
422
+ }
423
+ GPR_UNREACHABLE_CODE(return absl::InternalError("Invalid error type"));
424
+ }
425
+
426
+ bool bytes_sent_in_last_write_;
427
+ bool incoming_header_in_progress_;
428
+ bool incoming_header_end_stream_;
429
+ bool is_first_write_;
430
+ uint32_t incoming_header_stream_id_;
431
+ grpc_closure* on_receive_settings_;
432
+
433
+ // Ping related members
434
+ // TODO(akshitpatel) : [PH2][P2] : Consider removing the timeout related
435
+ // members.
436
+ // Duration between two consecutive keepalive pings
437
+ const Duration keepalive_time_;
438
+ // Duration to wait for a keepalive ping ack before triggering timeout. This
439
+ // only takes effect if the assigned value is less than the ping timeout.
440
+ const Duration keepalive_timeout_;
441
+ // Duration to wait for ping ack before triggering timeout
442
+ const Duration ping_timeout_;
443
+ PingManager ping_manager_;
444
+ std::vector<uint64_t> pending_ping_acks_;
445
+ KeepaliveManager keepalive_manager_;
446
+
447
+ // Flags
448
+ bool keepalive_permit_without_calls_;
449
+
450
+ auto SendPing(absl::AnyInvocable<void()> on_initiate) {
451
+ return ping_manager_.RequestPing(std::move(on_initiate));
452
+ }
453
+ auto WaitForPingAck() { return ping_manager_.WaitForPingAck(); }
454
+
455
+ // Ping Helper functions
456
+ // Returns a promise that resolves once a ping frame is written to the
457
+ // endpoint.
458
+ auto CreateAndWritePing(bool ack, uint64_t opaque_data) {
459
+ Http2Frame frame = Http2PingFrame{ack, opaque_data};
460
+ SliceBuffer output_buf;
461
+ Serialize(absl::Span<Http2Frame>(&frame, 1), output_buf);
462
+ return endpoint_.Write(std::move(output_buf), {});
463
+ }
464
+
465
+ Duration NextAllowedPingInterval() {
466
+ MutexLock lock(&transport_mutex_);
467
+ return (!keepalive_permit_without_calls_ && stream_list_.empty())
468
+ ? Duration::Hours(2)
469
+ : Duration::Seconds(1);
470
+ }
471
+
472
+ auto MaybeSendPing() {
473
+ return ping_manager_.MaybeSendPing(NextAllowedPingInterval(),
474
+ ping_timeout_);
475
+ }
476
+
477
+ auto MaybeSendPingAcks() {
478
+ return AssertResultType<absl::Status>(If(
479
+ pending_ping_acks_.empty(), [] { return absl::OkStatus(); },
480
+ [this] {
481
+ std::vector<Http2Frame> frames;
482
+ frames.reserve(pending_ping_acks_.size());
483
+ for (auto& opaque_data : pending_ping_acks_) {
484
+ frames.emplace_back(Http2PingFrame{true, opaque_data});
485
+ }
486
+ pending_ping_acks_.clear();
487
+ SliceBuffer output_buf;
488
+ Serialize(absl::Span<Http2Frame>(frames), output_buf);
489
+ return endpoint_.Write(std::move(output_buf), {});
490
+ }));
491
+ }
492
+
493
+ class PingSystemInterfaceImpl : public PingInterface {
494
+ public:
495
+ static std::unique_ptr<PingInterface> Make(
496
+ Http2ClientTransport* transport) {
497
+ return std::make_unique<PingSystemInterfaceImpl>(
498
+ PingSystemInterfaceImpl(transport));
499
+ }
500
+
501
+ // Returns a promise that resolves once a ping frame is written to the
502
+ // endpoint.
503
+ Promise<absl::Status> SendPing(SendPingArgs args) override {
504
+ return transport_->CreateAndWritePing(args.ack, args.opaque_data);
505
+ }
506
+
507
+ Promise<absl::Status> TriggerWrite() override {
508
+ return transport_->TriggerWriteCycle();
509
+ }
510
+
511
+ Promise<absl::Status> PingTimeout() override {
512
+ // TODO(akshitpatel) : [PH2][P2] : Trigger goaway here.
513
+ // Returns a promise that resolves once goaway is sent.
514
+ LOG(INFO) << "Ping timeout at time: " << Timestamp::Now();
515
+
516
+ // TODO(akshitpatel) : [PH2][P2] : The error code here has been chosen
517
+ // based on CHTTP2's usage of GRPC_STATUS_UNAVAILABLE (which corresponds
518
+ // to kRefusedStream). However looking at RFC9113, definition of
519
+ // kRefusedStream doesn't seem to fit this case. We should revisit this
520
+ // and update the error code.
521
+ return Immediate(
522
+ transport_->HandleError(Http2Status::Http2ConnectionError(
523
+ Http2ErrorCode::kRefusedStream, "Ping timeout")));
524
+ }
525
+
526
+ private:
527
+ // TODO(akshitpatel) : [PH2][P2] : Eventually there should be a separate ref
528
+ // counted struct/class passed to all the transport promises/members. This
529
+ // will help removing back references from the transport members to
530
+ // transport and greatly simpilfy the cleanup path.
531
+ Http2ClientTransport* transport_;
532
+ explicit PingSystemInterfaceImpl(Http2ClientTransport* transport)
533
+ : transport_(transport) {}
534
+ };
535
+
536
+ class KeepAliveInterfaceImpl : public KeepAliveInterface {
537
+ public:
538
+ static std::unique_ptr<KeepAliveInterface> Make(
539
+ Http2ClientTransport* transport) {
540
+ return std::make_unique<KeepAliveInterfaceImpl>(
541
+ KeepAliveInterfaceImpl(transport));
542
+ }
543
+
544
+ private:
545
+ explicit KeepAliveInterfaceImpl(Http2ClientTransport* transport)
546
+ : transport_(transport) {}
547
+ Promise<absl::Status> SendPingAndWaitForAck() override {
548
+ return TrySeq(transport_->TriggerWriteCycle(), [transport = transport_] {
549
+ return transport->WaitForPingAck();
550
+ });
551
+ }
552
+ Promise<absl::Status> OnKeepAliveTimeout() override {
553
+ // TODO(akshitpatel) : [PH2][P2] : Trigger goaway here.
554
+ LOG(INFO) << "Keepalive timeout triggered";
555
+
556
+ // TODO(akshitpatel) : [PH2][P2] : The error code here has been chosen
557
+ // based on CHTTP2's usage of GRPC_STATUS_UNAVAILABLE (which corresponds
558
+ // to kRefusedStream). However looking at RFC9113, definition of
559
+ // kRefusedStream doesn't seem to fit this case. We should revisit this
560
+ // and update the error code.
561
+ return Immediate(
562
+ transport_->HandleError(Http2Status::Http2ConnectionError(
563
+ Http2ErrorCode::kRefusedStream, "Keepalive timeout")));
564
+ }
565
+
566
+ bool NeedToSendKeepAlivePing() override {
567
+ bool need_to_send_ping = false;
568
+ {
569
+ MutexLock lock(&transport_->transport_mutex_);
570
+ need_to_send_ping = (transport_->keepalive_permit_without_calls_ ||
571
+ !transport_->stream_list_.empty());
572
+ }
573
+ return need_to_send_ping;
574
+ }
575
+
576
+ // TODO(akshitpatel) : [PH2][P2] : Eventually there should be a separate ref
577
+ // counted struct/class passed to all the transport promises/members. This
578
+ // will help removing back references from the transport members to
579
+ // transport and greatly simpilfy the cleanup path.
580
+ Http2ClientTransport* transport_;
581
+ };
582
+ };
583
+
584
+ // Since the corresponding class in CHTTP2 is about 3.9KB, our goal is to
585
+ // remain within that range. When this check fails, please update it to size
586
+ // (current size + 32) to make sure that it does not fail each time we add a
587
+ // small variable to the class.
588
+ GRPC_CHECK_CLASS_SIZE(Http2ClientTransport, 600);
589
+
590
+ } // namespace http2
591
+ } // namespace grpc_core
592
+
593
+ #endif // GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HTTP2_CLIENT_TRANSPORT_H
@@ -25,9 +25,9 @@
25
25
 
26
26
  #include "absl/functional/function_ref.h"
27
27
  #include "absl/strings/string_view.h"
28
+ #include "src/core/channelz/property_list.h"
28
29
  #include "src/core/ext/transport/chttp2/transport/frame.h"
29
30
  #include "src/core/ext/transport/chttp2/transport/http2_status.h"
30
- #include "src/core/util/json/json.h"
31
31
  #include "src/core/util/useful.h"
32
32
 
33
33
  namespace grpc_core {
@@ -133,20 +133,18 @@ class Http2Settings {
133
133
 
134
134
  bool operator!=(const Http2Settings& rhs) const { return !operator==(rhs); }
135
135
 
136
- Json::Object ToJsonObject() const {
137
- Json::Object object;
138
- object["headerTableSize"] = Json::FromNumber(header_table_size());
139
- object["maxConcurrentStreams"] = Json::FromNumber(max_concurrent_streams());
140
- object["initialWindowSize"] = Json::FromNumber(initial_window_size());
141
- object["maxFrameSize"] = Json::FromNumber(max_frame_size());
142
- object["maxHeaderListSize"] = Json::FromNumber(max_header_list_size());
143
- object["preferredReceiveCryptoMessageSize"] =
144
- Json::FromNumber(preferred_receive_crypto_message_size());
145
- object["enablePush"] = Json::FromBool(enable_push());
146
- object["allowTrueBinaryMetadata"] =
147
- Json::FromBool(allow_true_binary_metadata());
148
- object["allowSecurityFrame"] = Json::FromBool(allow_security_frame());
149
- return object;
136
+ channelz::PropertyList ChannelzProperties() const {
137
+ return channelz::PropertyList()
138
+ .Set(header_table_size_name(), header_table_size())
139
+ .Set(max_concurrent_streams_name(), max_concurrent_streams())
140
+ .Set(initial_window_size_name(), initial_window_size())
141
+ .Set(max_frame_size_name(), max_frame_size())
142
+ .Set(max_header_list_size_name(), max_header_list_size())
143
+ .Set(preferred_receive_crypto_message_size_name(),
144
+ preferred_receive_crypto_message_size())
145
+ .Set(enable_push_name(), enable_push())
146
+ .Set(allow_true_binary_metadata_name(), allow_true_binary_metadata())
147
+ .Set(allow_security_frame_name(), allow_security_frame());
150
148
  }
151
149
 
152
150
  private:
@@ -169,13 +167,12 @@ class Http2SettingsManager {
169
167
  Http2Settings& mutable_peer() { return peer_; }
170
168
  const Http2Settings& peer() const { return peer_; }
171
169
 
172
- Json::Object ToJsonObject() const {
173
- Json::Object object;
174
- object["local"] = Json::FromObject(local_.ToJsonObject());
175
- object["sent"] = Json::FromObject(sent_.ToJsonObject());
176
- object["peer"] = Json::FromObject(peer_.ToJsonObject());
177
- object["acked"] = Json::FromObject(acked_.ToJsonObject());
178
- return object;
170
+ channelz::PropertyGrid ChannelzProperties() const {
171
+ return channelz::PropertyGrid()
172
+ .SetColumn("local", local_.ChannelzProperties())
173
+ .SetColumn("sent", sent_.ChannelzProperties())
174
+ .SetColumn("peer", peer_.ChannelzProperties())
175
+ .SetColumn("acked", acked_.ChannelzProperties());
179
176
  }
180
177
 
181
178
  std::optional<Http2SettingsFrame> MaybeSendUpdate();