grpc 1.75.0.pre1 → 1.76.0.pre1

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 (387) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +18 -5
  3. data/include/grpc/credentials.h +21 -5
  4. data/src/core/call/call_filters.cc +4 -4
  5. data/src/core/call/call_filters.h +36 -36
  6. data/src/core/call/call_spine.h +27 -27
  7. data/src/core/call/client_call.cc +6 -5
  8. data/src/core/call/filter_fusion.h +5 -5
  9. data/src/core/call/metadata_batch.h +3 -3
  10. data/src/core/call/security_context.cc +1 -1
  11. data/src/core/call/server_call.cc +4 -4
  12. data/src/core/call/server_call.h +1 -1
  13. data/src/core/channelz/channelz.cc +12 -18
  14. data/src/core/channelz/channelz.h +32 -16
  15. data/src/core/channelz/channelz_registry.h +11 -0
  16. data/src/core/channelz/property_list.cc +18 -0
  17. data/src/core/channelz/property_list.h +10 -1
  18. data/src/core/channelz/text_encode.cc +66 -0
  19. data/src/core/channelz/text_encode.h +29 -0
  20. data/src/core/channelz/v2tov1/convert.cc +11 -0
  21. data/src/core/channelz/v2tov1/legacy_api.cc +15 -8
  22. data/src/core/channelz/ztrace_collector.h +247 -86
  23. data/src/core/client_channel/backup_poller.cc +5 -6
  24. data/src/core/client_channel/client_channel.cc +20 -13
  25. data/src/core/client_channel/client_channel_filter.cc +53 -45
  26. data/src/core/client_channel/client_channel_filter.h +2 -2
  27. data/src/core/client_channel/client_channel_internal.h +3 -4
  28. data/src/core/client_channel/config_selector.h +3 -3
  29. data/src/core/client_channel/dynamic_filters.cc +3 -3
  30. data/src/core/client_channel/global_subchannel_pool.cc +0 -37
  31. data/src/core/client_channel/global_subchannel_pool.h +0 -27
  32. data/src/core/client_channel/load_balanced_call_destination.cc +7 -7
  33. data/src/core/client_channel/local_subchannel_pool.cc +4 -4
  34. data/src/core/client_channel/retry_filter.h +3 -3
  35. data/src/core/client_channel/retry_filter_legacy_call_data.cc +5 -5
  36. data/src/core/client_channel/subchannel.cc +8 -8
  37. data/src/core/client_channel/subchannel_stream_client.cc +4 -4
  38. data/src/core/config/config_vars.cc +30 -1
  39. data/src/core/config/config_vars.h +21 -0
  40. data/src/core/config/core_configuration.cc +5 -5
  41. data/src/core/config/core_configuration.h +7 -7
  42. data/src/core/config/load_config.cc +12 -0
  43. data/src/core/config/load_config.h +2 -0
  44. data/src/core/credentials/call/call_credentials.h +2 -2
  45. data/src/core/credentials/call/call_creds_util.cc +4 -3
  46. data/src/core/credentials/call/composite/composite_call_credentials.cc +4 -4
  47. data/src/core/credentials/call/external/aws_external_account_credentials.cc +3 -3
  48. data/src/core/credentials/call/external/external_account_credentials.cc +1 -1
  49. data/src/core/credentials/call/external/url_external_account_credentials.cc +1 -1
  50. data/src/core/credentials/call/iam/iam_credentials.cc +4 -4
  51. data/src/core/credentials/call/jwt/json_token.cc +3 -3
  52. data/src/core/credentials/call/jwt/jwt_credentials.cc +2 -2
  53. data/src/core/credentials/call/jwt/jwt_verifier.cc +14 -13
  54. data/src/core/credentials/call/oauth2/oauth2_credentials.cc +20 -12
  55. data/src/core/credentials/call/plugin/plugin_credentials.cc +2 -2
  56. data/src/core/credentials/transport/alts/alts_credentials.cc +4 -4
  57. data/src/core/credentials/transport/alts/alts_security_connector.cc +14 -12
  58. data/src/core/credentials/transport/alts/grpc_alts_credentials_client_options.cc +22 -2
  59. data/src/core/credentials/transport/alts/grpc_alts_credentials_options.cc +10 -1
  60. data/src/core/credentials/transport/alts/grpc_alts_credentials_options.h +31 -0
  61. data/src/core/credentials/transport/alts/grpc_alts_credentials_server_options.cc +8 -3
  62. data/src/core/credentials/transport/composite/composite_channel_credentials.cc +5 -5
  63. data/src/core/credentials/transport/fake/fake_security_connector.cc +2 -2
  64. data/src/core/credentials/transport/google_default/google_default_credentials.cc +78 -28
  65. data/src/core/credentials/transport/insecure/insecure_security_connector.cc +3 -3
  66. data/src/core/credentials/transport/local/local_security_connector.cc +8 -8
  67. data/src/core/credentials/transport/security_connector.cc +5 -5
  68. data/src/core/credentials/transport/ssl/ssl_credentials.cc +12 -12
  69. data/src/core/credentials/transport/ssl/ssl_credentials.h +2 -2
  70. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +3 -3
  71. data/src/core/credentials/transport/tls/certificate_provider_registry.cc +2 -2
  72. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +24 -24
  73. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +5 -5
  74. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +2 -2
  75. data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.cc +2 -2
  76. data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.h +2 -2
  77. data/src/core/credentials/transport/tls/grpc_tls_credentials_options.cc +17 -17
  78. data/src/core/credentials/transport/tls/ssl_utils.cc +14 -9
  79. data/src/core/credentials/transport/tls/tls_credentials.cc +2 -2
  80. data/src/core/credentials/transport/tls/tls_security_connector.cc +11 -11
  81. data/src/core/credentials/transport/transport_credentials.cc +2 -2
  82. data/src/core/credentials/transport/transport_credentials.h +2 -2
  83. data/src/core/credentials/transport/xds/xds_credentials.cc +5 -5
  84. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +2 -0
  85. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +1 -1
  86. data/src/core/ext/filters/http/message_compress/compression_filter.cc +8 -8
  87. data/src/core/ext/filters/http/message_compress/compression_filter.h +3 -3
  88. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +7 -7
  89. data/src/core/ext/transport/chttp2/alpn/alpn.cc +2 -2
  90. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +10 -9
  91. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +10 -7
  92. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +5 -5
  93. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +6 -6
  94. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +96 -88
  95. data/src/core/ext/transport/chttp2/transport/flow_control.cc +3 -3
  96. data/src/core/ext/transport/chttp2/transport/flow_control.h +12 -7
  97. data/src/core/ext/transport/chttp2/transport/flow_control_manager.h +60 -0
  98. data/src/core/ext/transport/chttp2/transport/frame.cc +32 -10
  99. data/src/core/ext/transport/chttp2/transport/frame.h +16 -2
  100. data/src/core/ext/transport/chttp2/transport/frame_data.cc +2 -2
  101. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +4 -4
  102. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +2 -2
  103. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +2 -2
  104. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +3 -3
  105. data/src/core/ext/transport/chttp2/transport/header_assembler.h +28 -12
  106. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +2 -2
  107. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +4 -2
  108. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +8 -8
  109. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.cc +2 -2
  110. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.h +2 -2
  111. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +27 -27
  112. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +2 -3
  113. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +4 -4
  114. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +543 -366
  115. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +198 -277
  116. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.cc +3 -0
  117. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.h +11 -0
  118. data/src/core/ext/transport/chttp2/transport/http2_settings_promises.h +179 -0
  119. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +51 -23
  120. data/src/core/ext/transport/chttp2/transport/http2_transport.h +13 -6
  121. data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +115 -71
  122. data/src/core/ext/transport/chttp2/transport/internal.h +6 -14
  123. data/src/core/ext/transport/chttp2/transport/message_assembler.h +7 -7
  124. data/src/core/ext/transport/chttp2/transport/parsing.cc +17 -15
  125. data/src/core/ext/transport/chttp2/transport/ping_callbacks.cc +2 -2
  126. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +62 -26
  127. data/src/core/ext/transport/chttp2/transport/ping_promise.h +58 -22
  128. data/src/core/ext/transport/chttp2/transport/stream.h +207 -0
  129. data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +328 -187
  130. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +7 -7
  131. data/src/core/ext/transport/chttp2/transport/transport_common.cc +17 -1
  132. data/src/core/ext/transport/chttp2/transport/transport_common.h +52 -0
  133. data/src/core/ext/transport/chttp2/transport/varint.h +2 -2
  134. data/src/core/ext/transport/chttp2/transport/writable_streams.h +181 -79
  135. data/src/core/ext/transport/chttp2/transport/write_size_policy.cc +2 -2
  136. data/src/core/ext/transport/chttp2/transport/writing.cc +3 -3
  137. data/src/core/ext/transport/inproc/inproc_transport.cc +1 -1
  138. data/src/core/ext/transport/inproc/legacy_inproc_transport.cc +3 -3
  139. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb.h +740 -0
  140. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb_minitable.c +218 -0
  141. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb_minitable.h +46 -0
  142. data/src/core/ext/upb-gen/src/proto/grpc/gcp/handshaker.upb.h +87 -55
  143. data/src/core/ext/upb-gen/src/proto/grpc/gcp/handshaker.upb_minitable.c +23 -21
  144. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/channelz.upbdefs.c +80 -0
  145. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/channelz.upbdefs.h +47 -0
  146. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/service.upbdefs.c +129 -0
  147. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/service.upbdefs.h +72 -0
  148. data/src/core/filter/auth/server_auth_filter.cc +2 -2
  149. data/src/core/handshaker/handshaker.cc +3 -3
  150. data/src/core/handshaker/http_connect/http_proxy_mapper.cc +2 -2
  151. data/src/core/handshaker/security/legacy_secure_endpoint.cc +2 -2
  152. data/src/core/handshaker/security/pipelined_secure_endpoint.cc +31 -8
  153. data/src/core/handshaker/security/secure_endpoint.cc +16 -6
  154. data/src/core/handshaker/security/security_handshaker.cc +3 -3
  155. data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +2 -2
  156. data/src/core/lib/channel/channel_stack.cc +8 -5
  157. data/src/core/lib/channel/channel_stack.h +3 -0
  158. data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -0
  159. data/src/core/lib/channel/connected_channel.cc +2 -2
  160. data/src/core/lib/channel/promise_based_filter.cc +69 -64
  161. data/src/core/lib/channel/promise_based_filter.h +16 -15
  162. data/src/core/lib/compression/compression_internal.cc +2 -2
  163. data/src/core/lib/compression/message_compress.cc +7 -7
  164. data/src/core/lib/event_engine/ares_resolver.cc +22 -20
  165. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +2 -2
  166. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +2 -2
  167. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.h +2 -2
  168. data/src/core/lib/event_engine/extensions/channelz.h +2 -2
  169. data/src/core/lib/event_engine/extensions/supports_fd.h +5 -5
  170. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +8 -8
  171. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +10 -10
  172. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +2 -2
  173. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +23 -22
  174. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +11 -11
  175. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +168 -170
  176. data/src/core/lib/event_engine/posix_engine/posix_engine.h +33 -54
  177. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +4 -3
  178. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +5 -5
  179. data/src/core/lib/event_engine/posix_engine/posix_interface.h +1 -1
  180. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +1 -1
  181. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +3 -3
  182. data/src/core/lib/event_engine/resolved_address.cc +3 -3
  183. data/src/core/lib/event_engine/shim.cc +8 -11
  184. data/src/core/lib/event_engine/shim.h +2 -1
  185. data/src/core/lib/event_engine/slice.cc +2 -2
  186. data/src/core/lib/event_engine/tcp_socket_utils.cc +11 -11
  187. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +7 -7
  188. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +31 -31
  189. data/src/core/lib/event_engine/windows/iocp.cc +10 -10
  190. data/src/core/lib/event_engine/windows/win_socket.cc +6 -6
  191. data/src/core/lib/event_engine/windows/windows_endpoint.cc +11 -11
  192. data/src/core/lib/event_engine/windows/windows_engine.cc +16 -14
  193. data/src/core/lib/event_engine/windows/windows_listener.cc +7 -7
  194. data/src/core/lib/experiments/experiments.cc +105 -18
  195. data/src/core/lib/experiments/experiments.h +43 -11
  196. data/src/core/lib/iomgr/call_combiner.cc +3 -3
  197. data/src/core/lib/iomgr/endpoint_cfstream.cc +6 -6
  198. data/src/core/lib/iomgr/endpoint_pair_posix.cc +5 -5
  199. data/src/core/lib/iomgr/endpoint_pair_windows.cc +15 -14
  200. data/src/core/lib/iomgr/ev_epoll1_linux.cc +15 -15
  201. data/src/core/lib/iomgr/ev_poll_posix.cc +11 -11
  202. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +5 -4
  203. data/src/core/lib/iomgr/event_engine_shims/endpoint.h +1 -1
  204. data/src/core/lib/iomgr/iocp_windows.cc +8 -8
  205. data/src/core/lib/iomgr/iomgr_windows.cc +3 -3
  206. data/src/core/lib/iomgr/lockfree_event.cc +2 -2
  207. data/src/core/lib/iomgr/polling_entity.cc +3 -3
  208. data/src/core/lib/iomgr/socket_utils_common_posix.cc +2 -2
  209. data/src/core/lib/iomgr/socket_windows.cc +4 -4
  210. data/src/core/lib/iomgr/tcp_client_posix.cc +4 -4
  211. data/src/core/lib/iomgr/tcp_client_windows.cc +4 -4
  212. data/src/core/lib/iomgr/tcp_posix.cc +42 -42
  213. data/src/core/lib/iomgr/tcp_server.cc +5 -0
  214. data/src/core/lib/iomgr/tcp_server.h +7 -0
  215. data/src/core/lib/iomgr/tcp_server_posix.cc +47 -27
  216. data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -0
  217. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +5 -5
  218. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +2 -2
  219. data/src/core/lib/iomgr/tcp_server_windows.cc +68 -29
  220. data/src/core/lib/iomgr/tcp_windows.cc +7 -7
  221. data/src/core/lib/iomgr/timer_generic.cc +2 -2
  222. data/src/core/lib/iomgr/timer_manager.cc +2 -2
  223. data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -2
  224. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +2 -2
  225. data/src/core/lib/promise/activity.cc +2 -2
  226. data/src/core/lib/promise/activity.h +6 -6
  227. data/src/core/lib/promise/context.h +2 -2
  228. data/src/core/lib/promise/detail/join_state.h +9 -9
  229. data/src/core/lib/promise/detail/seq_state.h +13 -13
  230. data/src/core/lib/promise/detail/status.h +2 -2
  231. data/src/core/lib/promise/for_each.h +5 -5
  232. data/src/core/lib/promise/interceptor_list.h +2 -2
  233. data/src/core/lib/promise/latch.h +7 -7
  234. data/src/core/lib/promise/mpsc.cc +26 -26
  235. data/src/core/lib/promise/mpsc.h +2 -2
  236. data/src/core/lib/promise/observable.h +4 -4
  237. data/src/core/lib/promise/party.cc +32 -25
  238. data/src/core/lib/promise/party.h +16 -19
  239. data/src/core/lib/promise/pipe.h +15 -15
  240. data/src/core/lib/promise/poll.h +5 -4
  241. data/src/core/lib/promise/promise.h +0 -2
  242. data/src/core/lib/promise/sleep.cc +3 -1
  243. data/src/core/lib/promise/status_flag.h +7 -7
  244. data/src/core/lib/promise/try_join.h +2 -2
  245. data/src/core/lib/promise/try_seq.h +2 -2
  246. data/src/core/lib/resource_quota/arena.h +15 -2
  247. data/src/core/lib/resource_quota/connection_quota.cc +9 -7
  248. data/src/core/lib/resource_quota/memory_quota.cc +45 -24
  249. data/src/core/lib/resource_quota/memory_quota.h +48 -16
  250. data/src/core/lib/resource_quota/telemetry.h +54 -0
  251. data/src/core/lib/resource_quota/thread_quota.cc +2 -2
  252. data/src/core/lib/resource_tracker/resource_tracker.cc +33 -0
  253. data/src/core/lib/resource_tracker/resource_tracker.h +46 -0
  254. data/src/core/lib/security/authorization/audit_logging.cc +5 -5
  255. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +2 -2
  256. data/src/core/lib/security/authorization/stdout_logger.cc +3 -3
  257. data/src/core/lib/surface/byte_buffer_reader.cc +2 -2
  258. data/src/core/lib/surface/call.cc +16 -14
  259. data/src/core/lib/surface/call.h +1 -1
  260. data/src/core/lib/surface/call_utils.cc +2 -2
  261. data/src/core/lib/surface/call_utils.h +2 -2
  262. data/src/core/lib/surface/channel.cc +4 -4
  263. data/src/core/lib/surface/channel_create.cc +10 -6
  264. data/src/core/lib/surface/channel_init.cc +80 -23
  265. data/src/core/lib/surface/channel_init.h +26 -11
  266. data/src/core/lib/surface/completion_queue.cc +17 -16
  267. data/src/core/lib/surface/completion_queue_factory.cc +7 -7
  268. data/src/core/lib/surface/connection_context.h +45 -2
  269. data/src/core/lib/surface/filter_stack_call.cc +12 -23
  270. data/src/core/lib/surface/filter_stack_call.h +3 -4
  271. data/src/core/lib/surface/legacy_channel.cc +7 -7
  272. data/src/core/lib/surface/validate_metadata.h +2 -2
  273. data/src/core/lib/surface/version.cc +2 -2
  274. data/src/core/lib/transport/bdp_estimator.cc +2 -2
  275. data/src/core/lib/transport/bdp_estimator.h +3 -3
  276. data/src/core/lib/transport/promise_endpoint.cc +3 -3
  277. data/src/core/lib/transport/promise_endpoint.h +8 -8
  278. data/src/core/lib/transport/timeout_encoding.cc +4 -4
  279. data/src/core/load_balancing/child_policy_handler.cc +4 -4
  280. data/src/core/load_balancing/endpoint_list.cc +2 -2
  281. data/src/core/load_balancing/grpclb/grpclb.cc +24 -24
  282. data/src/core/load_balancing/health_check_client.cc +4 -4
  283. data/src/core/load_balancing/health_check_client_internal.h +2 -2
  284. data/src/core/load_balancing/lb_policy_registry.cc +2 -2
  285. data/src/core/load_balancing/oob_backend_metric.cc +4 -4
  286. data/src/core/load_balancing/oob_backend_metric_internal.h +2 -2
  287. data/src/core/load_balancing/outlier_detection/outlier_detection.cc +2 -2
  288. data/src/core/load_balancing/pick_first/pick_first.cc +14 -14
  289. data/src/core/load_balancing/priority/priority.cc +23 -24
  290. data/src/core/load_balancing/ring_hash/ring_hash.cc +3 -3
  291. data/src/core/load_balancing/rls/rls.cc +13 -13
  292. data/src/core/load_balancing/round_robin/round_robin.cc +9 -9
  293. data/src/core/load_balancing/weighted_round_robin/static_stride_scheduler.cc +3 -3
  294. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +33 -26
  295. data/src/core/load_balancing/weighted_target/weighted_target.cc +5 -5
  296. data/src/core/load_balancing/xds/cds.cc +76 -32
  297. data/src/core/load_balancing/xds/xds_cluster_impl.cc +3 -3
  298. data/src/core/load_balancing/xds/xds_override_host.cc +4 -4
  299. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
  300. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +33 -33
  301. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +10 -10
  302. data/src/core/resolver/dns/dns_resolver_plugin.cc +6 -3
  303. data/src/core/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +2 -2
  304. data/src/core/resolver/endpoint_addresses.cc +3 -3
  305. data/src/core/resolver/endpoint_addresses.h +3 -0
  306. data/src/core/resolver/fake/fake_resolver.cc +2 -2
  307. data/src/core/resolver/google_c2p/google_c2p_resolver.cc +41 -54
  308. data/src/core/resolver/polling_resolver.cc +3 -3
  309. data/src/core/resolver/resolver_registry.cc +5 -4
  310. data/src/core/resolver/xds/xds_dependency_manager.cc +5 -5
  311. data/src/core/resolver/xds/xds_resolver.cc +9 -9
  312. data/src/core/server/server.cc +38 -38
  313. data/src/core/server/server_call_tracer_filter.h +4 -4
  314. data/src/core/server/server_config_selector_filter.cc +2 -2
  315. data/src/core/server/xds_server_config_fetcher.cc +9 -8
  316. data/src/core/service_config/service_config_impl.h +2 -2
  317. data/src/core/telemetry/call_tracer.cc +39 -49
  318. data/src/core/telemetry/call_tracer.h +199 -22
  319. data/src/core/telemetry/histogram.h +205 -0
  320. data/src/core/telemetry/instrument.cc +719 -0
  321. data/src/core/telemetry/instrument.h +932 -0
  322. data/src/core/telemetry/metrics.cc +13 -5
  323. data/src/core/telemetry/metrics.h +3 -1
  324. data/src/core/telemetry/stats_data.cc +0 -19
  325. data/src/core/telemetry/stats_data.h +0 -19
  326. data/src/core/transport/auth_context.cc +2 -2
  327. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +78 -45
  328. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -0
  329. data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +3 -3
  330. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +39 -31
  331. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +3 -3
  332. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +3 -3
  333. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +7 -7
  334. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +3 -3
  335. data/src/core/tsi/fake_transport_security.cc +4 -4
  336. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +4 -4
  337. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +9 -9
  338. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +3 -3
  339. data/src/core/tsi/ssl_transport_security.cc +26 -25
  340. data/src/core/tsi/ssl_transport_security_utils.cc +9 -9
  341. data/src/core/util/chunked_vector.h +4 -4
  342. data/src/core/util/event_log.cc +2 -2
  343. data/src/core/util/gcp_metadata_query.cc +2 -2
  344. data/src/core/util/grpc_check.cc +22 -0
  345. data/src/core/util/grpc_check.h +103 -0
  346. data/src/core/util/http_client/httpcli.cc +3 -3
  347. data/src/core/util/http_client/parser.cc +4 -4
  348. data/src/core/util/latent_see.h +7 -4
  349. data/src/core/util/lru_cache.h +4 -4
  350. data/src/core/util/memory_usage.h +16 -0
  351. data/src/core/util/posix/directory_reader.cc +3 -2
  352. data/src/core/util/posix/sync.cc +24 -24
  353. data/src/core/util/postmortem_emit.cc +52 -0
  354. data/src/core/util/postmortem_emit.h +30 -0
  355. data/src/core/util/ref_counted_ptr.h +5 -0
  356. data/src/core/util/trie_lookup.h +170 -0
  357. data/src/core/util/unique_ptr_with_bitset.h +5 -5
  358. data/src/core/xds/grpc/xds_bootstrap_grpc.h +6 -1
  359. data/src/core/xds/grpc/xds_certificate_provider.cc +3 -3
  360. data/src/core/xds/grpc/xds_client_grpc.cc +34 -15
  361. data/src/core/xds/grpc/xds_client_grpc.h +4 -1
  362. data/src/core/xds/grpc/xds_cluster_parser.cc +2 -2
  363. data/src/core/xds/grpc/xds_cluster_specifier_plugin.cc +2 -2
  364. data/src/core/xds/grpc/xds_endpoint_parser.cc +2 -2
  365. data/src/core/xds/grpc/xds_http_filter_registry.cc +4 -3
  366. data/src/core/xds/grpc/xds_listener_parser.cc +3 -3
  367. data/src/core/xds/grpc/xds_matcher.cc +277 -0
  368. data/src/core/xds/grpc/xds_matcher.h +432 -0
  369. data/src/core/xds/grpc/xds_matcher_action.cc +47 -0
  370. data/src/core/xds/grpc/xds_matcher_action.h +48 -0
  371. data/src/core/xds/grpc/xds_matcher_context.cc +29 -0
  372. data/src/core/xds/grpc/xds_matcher_context.h +46 -0
  373. data/src/core/xds/grpc/xds_matcher_input.cc +79 -0
  374. data/src/core/xds/grpc/xds_matcher_input.h +105 -0
  375. data/src/core/xds/grpc/xds_matcher_parse.cc +356 -0
  376. data/src/core/xds/grpc/xds_matcher_parse.h +39 -0
  377. data/src/core/xds/grpc/xds_metadata.cc +4 -3
  378. data/src/core/xds/grpc/xds_route_config_parser.cc +6 -6
  379. data/src/core/xds/grpc/xds_routing.cc +3 -3
  380. data/src/core/xds/grpc/xds_transport_grpc.cc +10 -10
  381. data/src/core/xds/xds_client/lrs_client.cc +6 -6
  382. data/src/core/xds/xds_client/xds_client.cc +9 -9
  383. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +2 -2
  384. data/src/ruby/lib/grpc/version.rb +1 -1
  385. data/third_party/abseil-cpp/absl/container/internal/node_slot_policy.h +95 -0
  386. data/third_party/abseil-cpp/absl/container/node_hash_map.h +687 -0
  387. metadata +37 -2
@@ -17,7 +17,6 @@
17
17
  //
18
18
  #include "src/core/ext/transport/chttp2/transport/ping_promise.h"
19
19
 
20
- #include "src/core/lib/promise/if.h"
21
20
  #include "src/core/lib/promise/latch.h"
22
21
  #include "src/core/lib/promise/map.h"
23
22
  #include "src/core/lib/promise/party.h"
@@ -29,7 +28,6 @@
29
28
 
30
29
  namespace grpc_core {
31
30
  namespace http2 {
32
- using SendPingArgs = ::grpc_core::http2::PingInterface::SendPingArgs;
33
31
  using Callback = absl::AnyInvocable<void()>;
34
32
  using grpc_event_engine::experimental::EventEngine;
35
33
 
@@ -64,7 +62,7 @@ PingManager::PingManager(const ChannelArgs& channel_args,
64
62
  ping_rate_policy_(channel_args, /*is_client=*/true),
65
63
  ping_interface_(std::move(ping_interface)) {}
66
64
 
67
- void PingManager::TriggerDelayedPing(Duration wait) {
65
+ void PingManager::TriggerDelayedPing(const Duration wait) {
68
66
  // Spawn at most once.
69
67
  if (delayed_ping_spawned_) {
70
68
  return;
@@ -72,8 +70,10 @@ void PingManager::TriggerDelayedPing(Duration wait) {
72
70
  delayed_ping_spawned_ = true;
73
71
  GetContext<Party>()->Spawn(
74
72
  "DelayedPing",
73
+ // TODO(akshitpatel) : [PH2][P2] : Verify if we need a RefCountedPtr for
74
+ // ping_manager.
75
75
  [this, wait]() mutable {
76
- VLOG(2) << "Scheduling delayed ping after wait=" << wait;
76
+ GRPC_HTTP2_PING_LOG << "Scheduling delayed ping after wait=" << wait;
77
77
  return AssertResultType<absl::Status>(TrySeq(
78
78
  Sleep(wait),
79
79
  [this]() mutable { return ping_interface_->TriggerWrite(); }));
@@ -81,7 +81,7 @@ void PingManager::TriggerDelayedPing(Duration wait) {
81
81
  [this](auto) { delayed_ping_spawned_ = false; });
82
82
  }
83
83
 
84
- bool PingManager::NeedToPing(Duration next_allowed_ping_interval) {
84
+ bool PingManager::NeedToPing(const Duration next_allowed_ping_interval) {
85
85
  if (!ping_callbacks_.PingRequested()) {
86
86
  return false;
87
87
  }
@@ -114,39 +114,75 @@ bool PingManager::NeedToPing(Duration next_allowed_ping_interval) {
114
114
  });
115
115
  }
116
116
 
117
- void PingManager::SpawnTimeout(Duration ping_timeout,
117
+ void PingManager::SpawnTimeout(const Duration ping_timeout,
118
118
  const uint64_t opaque_data) {
119
119
  GetContext<Party>()->Spawn(
120
120
  "PingTimeout",
121
+ // TODO(akshitpatel) : [PH2][P2] : Verify if we need a RefCountedPtr for
122
+ // ping_manager.
121
123
  [this, ping_timeout, opaque_data]() {
122
124
  return AssertResultType<absl::Status>(Race(
123
125
  TrySeq(ping_callbacks_.PingTimeout(ping_timeout),
124
- [this, opaque_data]() mutable {
125
- VLOG(2) << " Ping ack not received for id=" << opaque_data
126
- << ". Ping timeout triggered.";
127
- return ping_interface_->PingTimeout();
126
+ [this, opaque_data](bool trigger_ping_timeout) mutable {
127
+ return If(
128
+ trigger_ping_timeout,
129
+ [this, opaque_data]() {
130
+ GRPC_HTTP2_PING_LOG
131
+ << " Ping ack not received for id="
132
+ << opaque_data << ". Ping timeout triggered.";
133
+ return ping_interface_->PingTimeout();
134
+ },
135
+ []() { return absl::OkStatus(); });
128
136
  }),
129
137
  ping_callbacks_.WaitForPingAck()));
130
138
  },
131
139
  [](auto) {});
132
140
  }
133
141
 
134
- Promise<absl::Status> PingManager::MaybeSendPing(
135
- Duration next_allowed_ping_interval, Duration ping_timeout) {
136
- return If(
137
- NeedToPing(next_allowed_ping_interval),
138
- [this, ping_timeout]() mutable {
139
- const uint64_t opaque_data = ping_callbacks_.StartPing();
140
- return AssertResultType<absl::Status>(
141
- TrySeq(ping_interface_->SendPing(SendPingArgs{false, opaque_data}),
142
- [this, ping_timeout, opaque_data]() {
143
- VLOG(2) << "Ping Sent with id: " << opaque_data;
144
- SpawnTimeout(ping_timeout, opaque_data);
145
- SentPing();
146
- return absl::OkStatus();
147
- }));
148
- },
149
- []() { return Immediate(absl::OkStatus()); });
142
+ void PingManager::MaybeGetSerializedPingFrames(
143
+ SliceBuffer& output_buffer, const Duration next_allowed_ping_interval) {
144
+ GRPC_HTTP2_PING_LOG << "PingManager MaybeGetSerializedPingFrames "
145
+ "pending_ping_acks_ size: "
146
+ << pending_ping_acks_.size()
147
+ << " next_allowed_ping_interval: "
148
+ << next_allowed_ping_interval;
149
+ DCHECK(!opaque_data_.has_value());
150
+ std::vector<Http2Frame> frames;
151
+ frames.reserve(pending_ping_acks_.size() + 1); // +1 for the ping frame.
152
+
153
+ // Get the serialized ping acks if needed.
154
+ for (uint64_t opaque_data : pending_ping_acks_) {
155
+ frames.emplace_back(GetHttp2PingFrame(/*ack=*/true, opaque_data));
156
+ }
157
+ pending_ping_acks_.clear();
158
+
159
+ // Get the serialized ping frame if needed.
160
+ if (NeedToPing(next_allowed_ping_interval)) {
161
+ const uint64_t opaque_data = ping_callbacks_.StartPing();
162
+ frames.emplace_back(GetHttp2PingFrame(/*ack=*/false, opaque_data));
163
+ opaque_data_ = opaque_data;
164
+ GRPC_HTTP2_PING_LOG << "Created ping frame for id= " << opaque_data;
165
+ }
166
+
167
+ // Serialize the frames if any.
168
+ if (!frames.empty()) {
169
+ Serialize(absl::Span<Http2Frame>(frames), output_buffer);
170
+ }
150
171
  }
172
+
173
+ void PingManager::NotifyPingSent(const Duration ping_timeout) {
174
+ if (opaque_data_.has_value()) {
175
+ SpawnTimeout(ping_timeout, opaque_data_.value());
176
+ SentPing();
177
+ opaque_data_.reset();
178
+ }
179
+ }
180
+
181
+ void PingManager::AddPendingPingAck(const uint64_t opaque_data) {
182
+ GRPC_HTTP2_PING_LOG << "Adding pending ping ack for id=" << opaque_data
183
+ << " to the list of pending ping acks.";
184
+ pending_ping_acks_.push_back(opaque_data);
185
+ }
186
+
151
187
  } // namespace http2
152
188
  } // namespace grpc_core
@@ -20,12 +20,15 @@
20
20
 
21
21
  #include <memory>
22
22
 
23
+ #include "src/core/ext/transport/chttp2/transport/frame.h"
23
24
  #include "src/core/ext/transport/chttp2/transport/ping_abuse_policy.h"
24
25
  #include "src/core/ext/transport/chttp2/transport/ping_callbacks.h"
25
26
  #include "src/core/ext/transport/chttp2/transport/ping_rate_policy.h"
27
+ #include "src/core/lib/promise/if.h"
26
28
  #include "src/core/lib/promise/inter_activity_latch.h"
27
29
  #include "src/core/lib/promise/map.h"
28
30
  #include "src/core/lib/promise/promise.h"
31
+ #include "src/core/lib/slice/slice_buffer.h"
29
32
  #include "src/core/util/shared_bit_gen.h"
30
33
  #include "src/core/util/time.h"
31
34
 
@@ -55,17 +58,6 @@ namespace http2 {
55
58
 
56
59
  class PingInterface {
57
60
  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
61
  // Returns a promise that triggers a write cycle on the transport.
70
62
  virtual Promise<absl::Status> TriggerWrite() = 0;
71
63
 
@@ -84,11 +76,14 @@ class PingManager {
84
76
  std::shared_ptr<grpc_event_engine::experimental::EventEngine>
85
77
  event_engine);
86
78
 
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);
79
+ // If there are any pending ping requests or ping acks, populates the output
80
+ // buffer with the serialized ping frames.
81
+ void MaybeGetSerializedPingFrames(SliceBuffer& output_buf,
82
+ Duration next_allowed_ping_interval);
83
+
84
+ // Notify the ping system that a ping has been sent. This will spawn a ping
85
+ // timeout promise.
86
+ void NotifyPingSent(Duration ping_timeout);
92
87
 
93
88
  // Ping Rate policy wrapper
94
89
  void ReceivedDataFrame() { ping_rate_policy_.ReceivedDataFrame(); }
@@ -131,6 +126,26 @@ class PingManager {
131
126
  bool AckPing(uint64_t id) { return ping_callbacks_.AckPing(id); }
132
127
  size_t CountPingInflight() { return ping_callbacks_.CountPingInflight(); }
133
128
 
129
+ Http2Frame GetHttp2PingFrame(uint64_t opaque_data) {
130
+ return Http2PingFrame{/*ack=*/false, opaque_data};
131
+ }
132
+
133
+ std::optional<uint64_t> TestOnlyMaybeGetSerializedPingFrames(
134
+ SliceBuffer& output_buffer, Duration next_allowed_ping_interval) {
135
+ DCHECK(!opaque_data_.has_value());
136
+ if (NeedToPing(next_allowed_ping_interval)) {
137
+ uint64_t opaque_data = ping_callbacks_.StartPing();
138
+ Http2Frame frame = GetHttp2PingFrame(/*ack*/ false, opaque_data);
139
+ Serialize(absl::Span<Http2Frame>(&frame, 1), output_buffer);
140
+ opaque_data_ = opaque_data;
141
+ return opaque_data;
142
+ }
143
+
144
+ return std::nullopt;
145
+ }
146
+
147
+ void AddPendingPingAck(uint64_t opaque_data);
148
+
134
149
  private:
135
150
  class PingPromiseCallbacks {
136
151
  public:
@@ -160,12 +175,27 @@ class PingManager {
160
175
  std::shared_ptr<InterActivityLatch<void>> latch =
161
176
  std::make_shared<InterActivityLatch<void>>();
162
177
  auto timeout_cb = [latch]() { latch->Set(); };
163
- auto id = ping_callbacks_.OnPingTimeout(ping_timeout, event_engine_.get(),
164
- std::move(timeout_cb));
165
- DCHECK(id.has_value());
166
- VLOG(2) << "Ping timeout of duration: " << ping_timeout
167
- << " initiated for ping id: " << *id;
168
- return Map(latch->Wait(), [latch](Empty) { return absl::OkStatus(); });
178
+ std::optional<uint64_t> id = ping_callbacks_.OnPingTimeout(
179
+ ping_timeout, event_engine_.get(), std::move(timeout_cb));
180
+
181
+ return AssertResultType<bool>(If(
182
+ // The scenario where OnPingTimeout returns an invalid id is when
183
+ // the ping ack is received before spawning the ping timeout.
184
+ // In such a case, we don't wait for the ping timeout.
185
+ id.has_value(),
186
+ [latch, id, ping_timeout]() {
187
+ VLOG(2) << "Ping timeout of duration: " << ping_timeout
188
+ << " initiated for ping id: " << *id;
189
+ return Map(latch->Wait(), [latch](Empty) {
190
+ return /*trigger_ping_timeout*/ true;
191
+ });
192
+ },
193
+ []() {
194
+ // This happens if for some reason the ping ack is received before
195
+ // the timeout timer is spawned.
196
+ VLOG(2) << "Ping ack received. Not waiting for ping timeout.";
197
+ return /*trigger_ping_timeout*/ false;
198
+ }));
169
199
  }
170
200
 
171
201
  private:
@@ -179,11 +209,17 @@ class PingManager {
179
209
  bool important_ping_requested_ = false;
180
210
  };
181
211
 
212
+ Http2Frame GetHttp2PingFrame(bool ack, uint64_t opaque_data) {
213
+ return Http2PingFrame{ack, opaque_data};
214
+ }
215
+
182
216
  PingPromiseCallbacks ping_callbacks_;
183
217
  Chttp2PingAbusePolicy ping_abuse_policy_;
184
218
  Chttp2PingRatePolicy ping_rate_policy_;
185
219
  bool delayed_ping_spawned_ = false;
220
+ std::optional<uint64_t> opaque_data_;
186
221
  std::unique_ptr<PingInterface> ping_interface_;
222
+ std::vector<uint64_t> pending_ping_acks_;
187
223
 
188
224
  void TriggerDelayedPing(Duration wait);
189
225
  bool NeedToPing(Duration next_allowed_ping_interval);
@@ -0,0 +1,207 @@
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_STREAM_H
20
+ #define GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_STREAM_H
21
+
22
+ #include "src/core/call/call_spine.h"
23
+ #include "src/core/ext/transport/chttp2/transport/flow_control.h"
24
+ #include "src/core/ext/transport/chttp2/transport/http2_transport.h"
25
+ #include "src/core/ext/transport/chttp2/transport/stream_data_queue.h"
26
+ #include "src/core/util/ref_counted_ptr.h"
27
+
28
+ namespace grpc_core {
29
+ namespace http2 {
30
+
31
+ // Managing the streams
32
+ struct Stream : public RefCounted<Stream> {
33
+ explicit Stream(CallHandler call, const uint32_t stream_id1,
34
+ bool allow_true_binary_metadata_peer,
35
+ bool allow_true_binary_metadata_acked,
36
+ chttp2::TransportFlowControl& transport_flow_control)
37
+ : call(std::move(call)),
38
+ is_write_closed(false),
39
+ stream_state(HttpStreamState::kIdle),
40
+ stream_id(stream_id1),
41
+ header_assembler(stream_id1, allow_true_binary_metadata_acked),
42
+ did_push_initial_metadata(false),
43
+ did_push_trailing_metadata(false),
44
+ data_queue(MakeRefCounted<StreamDataQueue<ClientMetadataHandle>>(
45
+ /*is_client*/ true, /*stream_id*/ stream_id1,
46
+ /*queue_size*/ kStreamQueueSize, allow_true_binary_metadata_peer)),
47
+ flow_control(&transport_flow_control) {}
48
+
49
+ ////////////////////////////////////////////////////////////////////////////
50
+ // Data Queue Helpers
51
+ // All enqueue methods are called from the call party.
52
+
53
+ auto EnqueueInitialMetadata(ClientMetadataHandle&& metadata) {
54
+ GRPC_HTTP2_CLIENT_DLOG
55
+ << "Http2ClientTransport::Stream::EnqueueInitialMetadata stream_id="
56
+ << stream_id;
57
+ return data_queue->EnqueueInitialMetadata(std::move(metadata));
58
+ }
59
+
60
+ auto EnqueueTrailingMetadata(ClientMetadataHandle&& metadata) {
61
+ GRPC_HTTP2_CLIENT_DLOG
62
+ << "Http2ClientTransport::Stream::EnqueueTrailingMetadata stream_id="
63
+ << stream_id;
64
+ return data_queue->EnqueueTrailingMetadata(std::move(metadata));
65
+ }
66
+
67
+ auto EnqueueMessage(MessageHandle&& message) {
68
+ GRPC_HTTP2_CLIENT_DLOG
69
+ << "Http2ClientTransport::Stream::EnqueueMessage stream_id="
70
+ << stream_id << " with payload size = " << message->payload()->Length();
71
+ return data_queue->EnqueueMessage(std::move(message));
72
+ }
73
+
74
+ auto EnqueueHalfClosed() {
75
+ GRPC_HTTP2_CLIENT_DLOG
76
+ << "Http2ClientTransport::Stream::EnqueueHalfClosed stream_id="
77
+ << stream_id;
78
+ return data_queue->EnqueueHalfClosed();
79
+ }
80
+
81
+ auto EnqueueResetStream(const uint32_t error_code) {
82
+ GRPC_HTTP2_CLIENT_DLOG
83
+ << "Http2ClientTransport::Stream::EnqueueResetStream stream_id="
84
+ << stream_id << " with error_code = " << error_code;
85
+ return data_queue->EnqueueResetStream(error_code);
86
+ }
87
+
88
+ // Called from the transport party
89
+ auto DequeueFrames(const uint32_t transport_tokens,
90
+ const uint32_t max_frame_length,
91
+ HPackCompressor& encoder) {
92
+ HttpStreamState state = GetStreamState();
93
+ // Reset stream MUST not be sent if the stream is idle or closed.
94
+ return data_queue->DequeueFrames(transport_tokens, max_frame_length,
95
+ encoder,
96
+ /*can_send_reset_stream=*/
97
+ !(state == HttpStreamState::kIdle ||
98
+ state == HttpStreamState::kClosed));
99
+ }
100
+
101
+ ////////////////////////////////////////////////////////////////////////////
102
+ // Stream State Management
103
+ // All state management helpers MUST be called from the transport party.
104
+
105
+ // Modify the stream state
106
+ // The possible stream transitions are as follows:
107
+ // kIdle -> kOpen
108
+ // kOpen -> kClosed/kHalfClosedLocal/kHalfClosedRemote
109
+ // kHalfClosedLocal/kHalfClosedRemote -> kClosed
110
+ // kClosed -> kClosed
111
+ void SentInitialMetadata() {
112
+ GRPC_DCHECK(stream_state == HttpStreamState::kIdle);
113
+ stream_state = HttpStreamState::kOpen;
114
+ }
115
+
116
+ void MarkHalfClosedLocal() {
117
+ switch (stream_state) {
118
+ case HttpStreamState::kIdle:
119
+ GRPC_DCHECK(false) << "MarkHalfClosedLocal called for an idle stream";
120
+ break;
121
+ case HttpStreamState::kOpen:
122
+ GRPC_HTTP2_CLIENT_DLOG
123
+ << "Http2ClientTransport::Stream::MarkHalfClosedLocal stream_id="
124
+ << stream_id << " transitioning to kHalfClosedLocal";
125
+ stream_state = HttpStreamState::kHalfClosedLocal;
126
+ break;
127
+ case HttpStreamState::kHalfClosedRemote:
128
+ GRPC_HTTP2_CLIENT_DLOG
129
+ << "Http2ClientTransport::Stream::MarkHalfClosedLocal stream_id="
130
+ << stream_id << " transitioning to kClosed";
131
+ stream_state = HttpStreamState::kClosed;
132
+ break;
133
+ case HttpStreamState::kHalfClosedLocal:
134
+ break;
135
+ case HttpStreamState::kClosed:
136
+ GRPC_HTTP2_CLIENT_DLOG
137
+ << "Http2ClientTransport::Stream::MarkHalfClosedLocal stream_id="
138
+ << stream_id << " already closed";
139
+ break;
140
+ }
141
+ }
142
+
143
+ void MarkHalfClosedRemote() {
144
+ switch (stream_state) {
145
+ case HttpStreamState::kIdle:
146
+ GRPC_DCHECK(false) << "MarkHalfClosedRemote called for an idle stream";
147
+ break;
148
+ case HttpStreamState::kOpen:
149
+ GRPC_HTTP2_CLIENT_DLOG
150
+ << "Http2ClientTransport::Stream::MarkHalfClosedRemote stream_id="
151
+ << stream_id << " transitioning to kHalfClosedRemote";
152
+ stream_state = HttpStreamState::kHalfClosedRemote;
153
+ break;
154
+ case HttpStreamState::kHalfClosedLocal:
155
+ GRPC_HTTP2_CLIENT_DLOG
156
+ << "Http2ClientTransport::Stream::MarkHalfClosedRemote stream_id="
157
+ << stream_id << " transitioning to kClosed";
158
+ stream_state = HttpStreamState::kClosed;
159
+ break;
160
+ case HttpStreamState::kHalfClosedRemote:
161
+ break;
162
+ case HttpStreamState::kClosed:
163
+ GRPC_HTTP2_CLIENT_DLOG
164
+ << "Http2ClientTransport::Stream::MarkHalfClosedRemote stream_id="
165
+ << stream_id << " already closed";
166
+ break;
167
+ }
168
+ }
169
+
170
+ inline HttpStreamState GetStreamState() const { return stream_state; }
171
+ inline uint32_t GetStreamId() const { return stream_id; }
172
+
173
+ inline bool IsClosedForWrites() const { return is_write_closed; }
174
+ inline void SetWriteClosed() { is_write_closed = true; }
175
+
176
+ CallHandler call;
177
+ // This flag is kept separate from the stream_state as the stream_state
178
+ // is inline with the HTTP2 spec, whereas this flag is an implementation
179
+ // detail of the PH2 transport. As far as PH2 is concerned, if a stream is
180
+ // closed for writes, it will not send any more frames on that stream.
181
+ // Similarly if a stream is closed for reads(this is achieved by removing the
182
+ // stream from the transport map), then all the frames read on that stream
183
+ // will be dropped.
184
+ bool is_write_closed;
185
+ // This MUST be accessed from the transport party.
186
+ HttpStreamState stream_state;
187
+ const uint32_t stream_id;
188
+ GrpcMessageAssembler assembler;
189
+ HeaderAssembler header_assembler;
190
+ // TODO(akshitpatel) : [PH2][P2] : StreamQ should maintain a flag that
191
+ // tracks if the half close has been sent for this stream. This flag is used
192
+ // to notify the mixer that this stream is closed for
193
+ // writes(HalfClosedLocal). When the mixer dequeues the last message for
194
+ // the streamQ, it will mark the stream as closed for writes and send a
195
+ // frame with end_stream or set the end_stream flag in the last data
196
+ // frame being sent out. This is done as the stream state should not
197
+ // transition to HalfClosedLocal till the end_stream frame is sent.
198
+ bool did_push_initial_metadata;
199
+ bool did_push_trailing_metadata;
200
+ RefCountedPtr<StreamDataQueue<ClientMetadataHandle>> data_queue;
201
+ chttp2::StreamFlowControl flow_control;
202
+ };
203
+
204
+ } // namespace http2
205
+ } // namespace grpc_core
206
+
207
+ #endif // GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_STREAM_H