grpc 1.78.0 → 1.80.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 (431) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +22 -8
  3. data/include/grpc/credentials.h +47 -37
  4. data/include/grpc/credentials_cpp.h +39 -0
  5. data/include/grpc/event_engine/event_engine.h +8 -3
  6. data/include/grpc/grpc.h +4 -0
  7. data/include/grpc/impl/call.h +9 -0
  8. data/include/grpc/impl/channel_arg_names.h +7 -0
  9. data/include/grpc/module.modulemap +2 -0
  10. data/include/grpc/private_key_signer.h +104 -0
  11. data/include/grpc/support/port_platform.h +6 -0
  12. data/src/core/call/call_filters.h +101 -78
  13. data/src/core/call/call_spine.h +91 -68
  14. data/src/core/call/call_state.h +60 -4
  15. data/src/core/call/client_call.cc +9 -9
  16. data/src/core/call/client_call.h +1 -1
  17. data/src/core/call/metadata_batch.cc +2 -0
  18. data/src/core/call/metadata_batch.h +48 -1
  19. data/src/core/call/metadata_info.cc +35 -0
  20. data/src/core/call/metadata_info.h +2 -0
  21. data/src/core/call/simple_slice_based_metadata.h +2 -1
  22. data/src/core/channelz/channelz.cc +9 -6
  23. data/src/core/channelz/channelz.h +7 -4
  24. data/src/core/channelz/property_list.h +5 -0
  25. data/src/core/channelz/v2tov1/convert.cc +1 -1
  26. data/src/core/channelz/v2tov1/legacy_api.cc +164 -307
  27. data/src/core/client_channel/buffered_call.cc +7 -3
  28. data/src/core/client_channel/buffered_call.h +11 -5
  29. data/src/core/client_channel/client_channel.cc +106 -44
  30. data/src/core/client_channel/client_channel.h +3 -6
  31. data/src/core/client_channel/client_channel_filter.cc +90 -64
  32. data/src/core/client_channel/client_channel_filter.h +3 -6
  33. data/src/core/client_channel/client_channel_internal.h +5 -0
  34. data/src/core/client_channel/config_selector.h +17 -12
  35. data/src/core/client_channel/dynamic_filters.cc +8 -7
  36. data/src/core/client_channel/dynamic_filters.h +7 -5
  37. data/src/core/client_channel/retry_filter.cc +1 -1
  38. data/src/core/client_channel/retry_filter.h +2 -2
  39. data/src/core/client_channel/subchannel.cc +1682 -266
  40. data/src/core/client_channel/subchannel.h +411 -134
  41. data/src/core/client_channel/subchannel_stream_client.cc +22 -18
  42. data/src/core/client_channel/subchannel_stream_client.h +8 -9
  43. data/src/core/client_channel/subchannel_stream_limiter.cc +76 -0
  44. data/src/core/client_channel/subchannel_stream_limiter.h +51 -0
  45. data/src/core/config/config_vars.cc +9 -1
  46. data/src/core/config/config_vars.h +6 -0
  47. data/src/core/credentials/call/call_creds_registry.h +51 -22
  48. data/src/core/credentials/call/call_creds_registry_init.cc +86 -2
  49. data/src/core/credentials/call/external/aws_external_account_credentials.cc +2 -2
  50. data/src/core/credentials/call/external/external_account_credentials.cc +11 -4
  51. data/src/core/credentials/call/external/file_external_account_credentials.cc +2 -2
  52. data/src/core/credentials/transport/channel_creds_registry.h +71 -20
  53. data/src/core/credentials/transport/channel_creds_registry_init.cc +338 -29
  54. data/src/core/credentials/transport/ssl/ssl_credentials.cc +43 -24
  55. data/src/core/credentials/transport/ssl/ssl_credentials.h +7 -1
  56. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +2 -8
  57. data/src/core/credentials/transport/ssl/ssl_security_connector.h +4 -3
  58. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +25 -5
  59. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +7 -5
  60. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +181 -109
  61. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +55 -42
  62. data/src/core/credentials/transport/tls/grpc_tls_credentials_options.cc +28 -23
  63. data/src/core/credentials/transport/tls/grpc_tls_credentials_options.h +26 -23
  64. data/src/core/credentials/transport/tls/spiffe_utils.cc +2 -2
  65. data/src/core/credentials/transport/tls/ssl_utils.cc +18 -18
  66. data/src/core/credentials/transport/tls/ssl_utils.h +12 -10
  67. data/src/core/credentials/transport/tls/tls_security_connector.cc +106 -74
  68. data/src/core/credentials/transport/tls/tls_security_connector.h +12 -8
  69. data/src/core/credentials/transport/xds/xds_credentials.cc +76 -32
  70. data/src/core/credentials/transport/xds/xds_credentials.h +4 -2
  71. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +117 -35
  72. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +42 -4
  73. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +58 -29
  74. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.h +19 -11
  75. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +82 -25
  76. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +28 -3
  77. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.cc +9 -7
  78. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h +1 -1
  79. data/src/core/ext/transport/chttp2/transport/call_tracer_wrapper.h +7 -1
  80. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +117 -67
  81. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +2 -0
  82. data/src/core/ext/transport/chttp2/transport/flow_control.h +11 -1
  83. data/src/core/ext/transport/chttp2/transport/frame.cc +2 -15
  84. data/src/core/ext/transport/chttp2/transport/frame.h +0 -4
  85. data/src/core/ext/transport/chttp2/transport/goaway.cc +17 -2
  86. data/src/core/ext/transport/chttp2/transport/goaway.h +27 -6
  87. data/src/core/ext/transport/chttp2/transport/header_assembler.h +8 -21
  88. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +101 -40
  89. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +95 -0
  90. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +923 -772
  91. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +406 -423
  92. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +1 -0
  93. data/src/core/ext/transport/chttp2/transport/http2_settings.h +8 -1
  94. data/src/core/ext/transport/chttp2/transport/http2_settings_promises.h +25 -13
  95. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +71 -24
  96. data/src/core/ext/transport/chttp2/transport/http2_transport.h +25 -49
  97. data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +2 -2
  98. data/src/core/ext/transport/chttp2/transport/incoming_metadata_tracker.h +29 -9
  99. data/src/core/ext/transport/chttp2/transport/internal.h +6 -2
  100. data/src/core/ext/transport/chttp2/transport/keepalive.cc +14 -20
  101. data/src/core/ext/transport/chttp2/transport/keepalive.h +9 -6
  102. data/src/core/ext/transport/chttp2/transport/parsing.cc +11 -0
  103. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +34 -74
  104. data/src/core/ext/transport/chttp2/transport/ping_promise.h +123 -79
  105. data/src/core/ext/transport/chttp2/transport/security_frame.h +233 -3
  106. data/src/core/ext/transport/chttp2/transport/stream.h +152 -73
  107. data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +155 -85
  108. data/src/core/ext/transport/chttp2/transport/transport_common.h +0 -5
  109. data/src/core/ext/transport/chttp2/transport/writable_streams.h +8 -7
  110. data/src/core/ext/transport/chttp2/transport/write_cycle.cc +86 -0
  111. data/src/core/ext/transport/chttp2/transport/write_cycle.h +355 -0
  112. data/src/core/ext/transport/chttp2/transport/writing.cc +31 -29
  113. data/src/core/ext/upb-gen/cel/expr/checked.upb.h +1875 -0
  114. data/src/core/ext/upb-gen/cel/expr/checked.upb_minitable.c +409 -0
  115. data/src/core/ext/upb-gen/cel/expr/checked.upb_minitable.h +56 -0
  116. data/src/core/ext/upb-gen/cel/expr/syntax.upb.h +2223 -0
  117. data/src/core/ext/upb-gen/cel/expr/syntax.upb_minitable.c +489 -0
  118. data/src/core/ext/upb-gen/cel/expr/syntax.upb_minitable.h +60 -0
  119. data/src/core/ext/upb-gen/envoy/config/accesslog/v3/accesslog.upb.h +2 -1
  120. data/src/core/ext/upb-gen/envoy/config/bootstrap/v3/bootstrap.upb.h +130 -18
  121. data/src/core/ext/upb-gen/envoy/config/bootstrap/v3/bootstrap.upb_minitable.c +18 -13
  122. data/src/core/ext/upb-gen/envoy/config/cluster/v3/cluster.upb.h +70 -38
  123. data/src/core/ext/upb-gen/envoy/config/cluster/v3/cluster.upb_minitable.c +20 -17
  124. data/src/core/ext/upb-gen/envoy/config/common/matcher/v3/matcher.upb.h +26 -10
  125. data/src/core/ext/upb-gen/envoy/config/common/matcher/v3/matcher.upb_minitable.c +8 -7
  126. data/src/core/ext/upb-gen/envoy/config/common/mutation_rules/v3/mutation_rules.upb.h +495 -0
  127. data/src/core/ext/upb-gen/envoy/config/common/mutation_rules/v3/mutation_rules.upb_minitable.c +114 -0
  128. data/src/core/ext/upb-gen/envoy/config/common/mutation_rules/v3/mutation_rules.upb_minitable.h +36 -0
  129. data/src/core/ext/upb-gen/envoy/config/core/v3/address.upb.h +26 -10
  130. data/src/core/ext/upb-gen/envoy/config/core/v3/address.upb_minitable.c +8 -7
  131. data/src/core/ext/upb-gen/envoy/config/core/v3/cel.upb.h +121 -0
  132. data/src/core/ext/upb-gen/envoy/config/core/v3/cel.upb_minitable.c +54 -0
  133. data/src/core/ext/upb-gen/envoy/config/core/v3/cel.upb_minitable.h +32 -0
  134. data/src/core/ext/upb-gen/envoy/config/core/v3/grpc_service.upb.h +143 -9
  135. data/src/core/ext/upb-gen/envoy/config/core/v3/grpc_service.upb_minitable.c +18 -6
  136. data/src/core/ext/upb-gen/envoy/config/core/v3/protocol.upb.h +112 -11
  137. data/src/core/ext/upb-gen/envoy/config/core/v3/protocol.upb_minitable.c +22 -9
  138. data/src/core/ext/upb-gen/envoy/config/core/v3/proxy_protocol.upb.h +276 -0
  139. data/src/core/ext/upb-gen/envoy/config/core/v3/proxy_protocol.upb_minitable.c +60 -5
  140. data/src/core/ext/upb-gen/envoy/config/core/v3/proxy_protocol.upb_minitable.h +4 -0
  141. data/src/core/ext/upb-gen/envoy/config/endpoint/v3/endpoint_components.upb.h +72 -0
  142. data/src/core/ext/upb-gen/envoy/config/endpoint/v3/endpoint_components.upb_minitable.c +23 -2
  143. data/src/core/ext/upb-gen/envoy/config/endpoint/v3/endpoint_components.upb_minitable.h +2 -0
  144. data/src/core/ext/upb-gen/envoy/config/listener/v3/listener.upb.h +129 -13
  145. data/src/core/ext/upb-gen/envoy/config/listener/v3/listener.upb_minitable.c +36 -10
  146. data/src/core/ext/upb-gen/envoy/config/listener/v3/listener.upb_minitable.h +2 -0
  147. data/src/core/ext/upb-gen/envoy/config/listener/v3/quic_config.upb.h +30 -0
  148. data/src/core/ext/upb-gen/envoy/config/listener/v3/quic_config.upb_minitable.c +5 -3
  149. data/src/core/ext/upb-gen/envoy/config/metrics/v3/metrics_service.upb.h +16 -0
  150. data/src/core/ext/upb-gen/envoy/config/metrics/v3/metrics_service.upb_minitable.c +4 -3
  151. data/src/core/ext/upb-gen/envoy/config/metrics/v3/stats.upb.h +31 -0
  152. data/src/core/ext/upb-gen/envoy/config/metrics/v3/stats.upb_minitable.c +5 -3
  153. data/src/core/ext/upb-gen/envoy/config/overload/v3/overload.upb.h +2 -1
  154. data/src/core/ext/upb-gen/envoy/config/rbac/v3/rbac.upb.h +63 -0
  155. data/src/core/ext/upb-gen/envoy/config/rbac/v3/rbac.upb_minitable.c +12 -7
  156. data/src/core/ext/upb-gen/envoy/config/route/v3/route.upb.h +97 -81
  157. data/src/core/ext/upb-gen/envoy/config/route/v3/route.upb_minitable.c +40 -23
  158. data/src/core/ext/upb-gen/envoy/config/route/v3/route_components.upb.h +604 -228
  159. data/src/core/ext/upb-gen/envoy/config/route/v3/route_components.upb_minitable.c +146 -100
  160. data/src/core/ext/upb-gen/envoy/config/tap/v3/common.upb.h +30 -0
  161. data/src/core/ext/upb-gen/envoy/config/tap/v3/common.upb_minitable.c +5 -3
  162. data/src/core/ext/upb-gen/envoy/config/trace/v3/opentelemetry.upb.h +35 -3
  163. data/src/core/ext/upb-gen/envoy/config/trace/v3/opentelemetry.upb_minitable.c +7 -4
  164. data/src/core/ext/upb-gen/envoy/config/trace/v3/zipkin.upb.h +66 -14
  165. data/src/core/ext/upb-gen/envoy/config/trace/v3/zipkin.upb_minitable.c +22 -11
  166. data/src/core/ext/upb-gen/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +87 -0
  167. data/src/core/ext/upb-gen/envoy/extensions/clusters/aggregate/v3/cluster.upb_minitable.c +29 -2
  168. data/src/core/ext/upb-gen/envoy/extensions/clusters/aggregate/v3/cluster.upb_minitable.h +2 -0
  169. data/src/core/ext/upb-gen/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +0 -1
  170. data/src/core/ext/upb-gen/envoy/extensions/filters/http/rbac/v3/rbac.upb_minitable.c +0 -1
  171. data/src/core/ext/upb-gen/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.h +20 -4
  172. data/src/core/ext/upb-gen/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb_minitable.c +5 -4
  173. data/src/core/ext/upb-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +239 -60
  174. data/src/core/ext/upb-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb_minitable.c +59 -28
  175. data/src/core/ext/upb-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb_minitable.h +2 -0
  176. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/call_credentials/access_token/v3/access_token_credentials.upb.h +89 -0
  177. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/call_credentials/access_token/v3/access_token_credentials.upb_minitable.c +50 -0
  178. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/call_credentials/access_token/v3/access_token_credentials.upb_minitable.h +32 -0
  179. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/channel_credentials/tls/v3/tls_credentials.upb.h +135 -0
  180. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/channel_credentials/tls/v3/tls_credentials.upb_minitable.c +53 -0
  181. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/channel_credentials/tls/v3/tls_credentials.upb_minitable.h +32 -0
  182. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/channel_credentials/xds/v3/xds_credentials.upb.h +105 -0
  183. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/channel_credentials/xds/v3/xds_credentials.upb_minitable.c +51 -0
  184. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/channel_credentials/xds/v3/xds_credentials.upb_minitable.h +32 -0
  185. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb.h +32 -0
  186. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb_minitable.c +6 -3
  187. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/common/v3/common.upb.h +206 -0
  188. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/common/v3/common.upb_minitable.c +41 -8
  189. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/common/v3/common.upb_minitable.h +2 -0
  190. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/common.upb.h +64 -0
  191. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/common.upb_minitable.c +4 -3
  192. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +64 -0
  193. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/secret.upb_minitable.c +31 -5
  194. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/secret.upb_minitable.h +2 -0
  195. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb.h +283 -14
  196. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.c +48 -11
  197. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.h +2 -0
  198. data/src/core/ext/upb-gen/envoy/type/http/v3/cookie.upb.h +144 -6
  199. data/src/core/ext/upb-gen/envoy/type/http/v3/cookie.upb_minitable.c +35 -7
  200. data/src/core/ext/upb-gen/envoy/type/http/v3/cookie.upb_minitable.h +2 -0
  201. data/src/core/ext/upb-gen/envoy/type/tracing/v3/custom_tag.upb.h +42 -21
  202. data/src/core/ext/upb-gen/envoy/type/tracing/v3/custom_tag.upb_minitable.c +9 -8
  203. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb.h +164 -1
  204. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.c +37 -6
  205. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.h +2 -0
  206. data/src/core/ext/upb-gen/xds/type/matcher/v3/cel.upb.h +0 -1
  207. data/src/core/ext/upb-gen/xds/type/matcher/v3/cel.upb_minitable.c +0 -1
  208. data/src/core/ext/upb-gen/xds/type/matcher/v3/http_inputs.upb.h +0 -1
  209. data/src/core/ext/upb-gen/xds/type/matcher/v3/http_inputs.upb_minitable.c +0 -1
  210. data/src/core/ext/upb-gen/xds/type/matcher/v3/matcher.upb.h +26 -11
  211. data/src/core/ext/upb-gen/xds/type/matcher/v3/matcher.upb_minitable.c +8 -8
  212. data/src/core/ext/upb-gen/xds/type/matcher/v3/string.upb.h +33 -0
  213. data/src/core/ext/upb-gen/xds/type/matcher/v3/string.upb_minitable.c +14 -3
  214. data/src/core/ext/upb-gen/xds/type/v3/cel.upb.h +90 -10
  215. data/src/core/ext/upb-gen/xds/type/v3/cel.upb_minitable.c +18 -7
  216. data/src/core/ext/upbdefs-gen/cel/expr/checked.upbdefs.c +248 -0
  217. data/src/core/ext/upbdefs-gen/cel/expr/checked.upbdefs.h +97 -0
  218. data/src/core/ext/upbdefs-gen/cel/expr/syntax.upbdefs.c +283 -0
  219. data/src/core/ext/upbdefs-gen/cel/expr/syntax.upbdefs.h +107 -0
  220. data/src/core/ext/upbdefs-gen/envoy/config/accesslog/v3/accesslog.upbdefs.c +213 -211
  221. data/src/core/ext/upbdefs-gen/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +635 -614
  222. data/src/core/ext/upbdefs-gen/envoy/config/cluster/v3/cluster.upbdefs.c +1012 -1000
  223. data/src/core/ext/upbdefs-gen/envoy/config/common/matcher/v3/matcher.upbdefs.c +276 -273
  224. data/src/core/ext/upbdefs-gen/envoy/config/common/mutation_rules/v3/mutation_rules.upbdefs.c +152 -0
  225. data/src/core/ext/upbdefs-gen/envoy/config/common/mutation_rules/v3/mutation_rules.upbdefs.h +47 -0
  226. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/address.upbdefs.c +149 -144
  227. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/base.upbdefs.c +367 -370
  228. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/cel.upbdefs.c +63 -0
  229. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/cel.upbdefs.h +37 -0
  230. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/grpc_service.upbdefs.c +297 -284
  231. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/protocol.upbdefs.c +492 -469
  232. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/proxy_protocol.upbdefs.c +74 -43
  233. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/proxy_protocol.upbdefs.h +10 -0
  234. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/substitution_format_string.upbdefs.c +60 -59
  235. data/src/core/ext/upbdefs-gen/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +202 -184
  236. data/src/core/ext/upbdefs-gen/envoy/config/endpoint/v3/endpoint_components.upbdefs.h +5 -0
  237. data/src/core/ext/upbdefs-gen/envoy/config/listener/v3/listener.upbdefs.c +354 -339
  238. data/src/core/ext/upbdefs-gen/envoy/config/listener/v3/listener.upbdefs.h +5 -0
  239. data/src/core/ext/upbdefs-gen/envoy/config/listener/v3/quic_config.upbdefs.c +28 -19
  240. data/src/core/ext/upbdefs-gen/envoy/config/metrics/v3/metrics_service.upbdefs.c +30 -27
  241. data/src/core/ext/upbdefs-gen/envoy/config/metrics/v3/stats.upbdefs.c +71 -66
  242. data/src/core/ext/upbdefs-gen/envoy/config/overload/v3/overload.upbdefs.c +94 -91
  243. data/src/core/ext/upbdefs-gen/envoy/config/rbac/v3/rbac.upbdefs.c +386 -369
  244. data/src/core/ext/upbdefs-gen/envoy/config/route/v3/route.upbdefs.c +60 -57
  245. data/src/core/ext/upbdefs-gen/envoy/config/route/v3/route_components.upbdefs.c +1974 -1884
  246. data/src/core/ext/upbdefs-gen/envoy/config/tap/v3/common.upbdefs.c +119 -112
  247. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/opentelemetry.upbdefs.c +62 -51
  248. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/zipkin.upbdefs.c +109 -88
  249. data/src/core/ext/upbdefs-gen/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +54 -36
  250. data/src/core/ext/upbdefs-gen/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h +5 -0
  251. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +78 -84
  252. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.c +48 -46
  253. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +1041 -984
  254. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +5 -0
  255. data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +304 -290
  256. data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +94 -77
  257. data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h +5 -0
  258. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.c +246 -193
  259. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.h +5 -0
  260. data/src/core/ext/upbdefs-gen/envoy/type/http/v3/cookie.upbdefs.c +37 -23
  261. data/src/core/ext/upbdefs-gen/envoy/type/http/v3/cookie.upbdefs.h +5 -0
  262. data/src/core/ext/upbdefs-gen/envoy/type/tracing/v3/custom_tag.upbdefs.c +5 -3
  263. data/src/core/ext/upbdefs-gen/google/api/http.upbdefs.c +4 -4
  264. data/src/core/ext/upbdefs-gen/google/api/httpbody.upbdefs.c +4 -5
  265. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.c +113 -87
  266. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.h +5 -0
  267. data/src/core/ext/upbdefs-gen/udpa/annotations/migrate.upbdefs.c +5 -5
  268. data/src/core/ext/upbdefs-gen/udpa/annotations/security.upbdefs.c +6 -5
  269. data/src/core/ext/upbdefs-gen/udpa/annotations/sensitive.upbdefs.c +5 -5
  270. data/src/core/ext/upbdefs-gen/udpa/annotations/status.upbdefs.c +5 -5
  271. data/src/core/ext/upbdefs-gen/udpa/annotations/versioning.upbdefs.c +5 -5
  272. data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/cel.upbdefs.c +25 -30
  273. data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/http_inputs.upbdefs.c +14 -20
  274. data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/matcher.upbdefs.c +180 -183
  275. data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/string.upbdefs.c +56 -47
  276. data/src/core/ext/upbdefs-gen/xds/type/v3/cel.upbdefs.c +69 -47
  277. data/src/core/filter/filter_chain.h +95 -0
  278. data/src/core/handshaker/http_connect/{http_connect_handshaker.cc → http_connect_client_handshaker.cc} +32 -31
  279. data/src/core/handshaker/http_connect/{http_connect_handshaker.h → http_connect_client_handshaker.h} +4 -4
  280. data/src/core/handshaker/http_connect/http_proxy_mapper.cc +1 -1
  281. data/src/core/handshaker/http_connect/xds_http_proxy_mapper.cc +1 -1
  282. data/src/core/handshaker/security/pipelined_secure_endpoint.cc +14 -13
  283. data/src/core/handshaker/security/secure_endpoint.cc +282 -68
  284. data/src/core/handshaker/security/secure_endpoint.h +0 -7
  285. data/src/core/lib/channel/channel_args.h +1 -1
  286. data/src/core/lib/channel/promise_based_filter.cc +17 -4
  287. data/src/core/lib/channel/promise_based_filter.h +3 -2
  288. data/src/core/lib/debug/trace_flags.cc +2 -0
  289. data/src/core/lib/debug/trace_flags.h +1 -0
  290. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +35 -8
  291. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.h +1 -2
  292. data/src/core/lib/event_engine/event_engine.cc +9 -0
  293. data/src/core/lib/event_engine/extensions/tcp_trace.h +0 -3
  294. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +2 -2
  295. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +1 -1
  296. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +34 -9
  297. data/src/core/lib/event_engine/posix_engine/posix_engine.h +24 -2
  298. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +1 -3
  299. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +141 -14
  300. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +19 -2
  301. data/src/core/lib/event_engine/posix_engine/posix_interface.h +7 -0
  302. data/src/core/lib/event_engine/posix_engine/posix_interface_posix.cc +21 -3
  303. data/src/core/lib/event_engine/posix_engine/posix_interface_windows.cc +16 -0
  304. data/src/core/lib/experiments/experiments.cc +309 -201
  305. data/src/core/lib/experiments/experiments.h +141 -80
  306. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +2 -2
  307. data/src/core/lib/iomgr/resolve_address.h +0 -2
  308. data/src/core/lib/iomgr/resolved_address.h +0 -2
  309. data/src/core/lib/iomgr/tcp_posix.cc +13 -5
  310. data/src/core/lib/iomgr/tcp_server.cc +0 -5
  311. data/src/core/lib/iomgr/tcp_server.h +0 -7
  312. data/src/core/lib/iomgr/tcp_server_posix.cc +0 -17
  313. data/src/core/lib/iomgr/tcp_server_utils_posix.h +0 -3
  314. data/src/core/lib/iomgr/tcp_server_windows.cc +12 -51
  315. data/src/core/lib/promise/all_ok.h +17 -12
  316. data/src/core/lib/promise/cancel_callback.h +12 -13
  317. data/src/core/lib/promise/detail/join_state.h +626 -0
  318. data/src/core/lib/promise/detail/promise_factory.h +14 -14
  319. data/src/core/lib/promise/for_each.h +32 -8
  320. data/src/core/lib/promise/if.h +9 -7
  321. data/src/core/lib/promise/loop.h +18 -16
  322. data/src/core/lib/promise/map.h +54 -47
  323. data/src/core/lib/promise/mpsc.h +11 -10
  324. data/src/core/lib/promise/observable.h +6 -6
  325. data/src/core/lib/promise/party.h +25 -19
  326. data/src/core/lib/promise/poll.h +5 -5
  327. data/src/core/lib/promise/prioritized_race.h +10 -7
  328. data/src/core/lib/promise/promise.h +16 -11
  329. data/src/core/lib/promise/race.h +6 -5
  330. data/src/core/lib/promise/seq.h +109 -74
  331. data/src/core/lib/promise/try_join.h +14 -6
  332. data/src/core/lib/promise/try_seq.h +76 -60
  333. data/src/core/lib/resource_quota/api.cc +7 -0
  334. data/src/core/lib/resource_quota/arena.h +1 -1
  335. data/src/core/lib/resource_quota/memory_quota.cc +4 -1
  336. data/src/core/lib/resource_quota/resource_quota.cc +2 -1
  337. data/src/core/lib/resource_quota/resource_quota.h +3 -0
  338. data/src/core/lib/resource_quota/stream_quota.cc +77 -1
  339. data/src/core/lib/resource_quota/stream_quota.h +64 -1
  340. data/src/core/lib/resource_quota/telemetry.h +1 -1
  341. data/src/core/lib/surface/call.cc +13 -0
  342. data/src/core/lib/surface/call_utils.h +58 -43
  343. data/src/core/lib/surface/channel.h +1 -4
  344. data/src/core/lib/surface/completion_queue.cc +13 -6
  345. data/src/core/lib/surface/validate_metadata.cc +20 -15
  346. data/src/core/lib/surface/validate_metadata.h +3 -1
  347. data/src/core/lib/surface/version.cc +2 -2
  348. data/src/core/lib/transport/promise_endpoint.cc +1 -1
  349. data/src/core/lib/transport/promise_endpoint.h +1 -1
  350. data/src/core/lib/transport/transport.h +5 -0
  351. data/src/core/load_balancing/health_check_client.cc +1 -15
  352. data/src/core/load_balancing/health_check_client_internal.h +0 -2
  353. data/src/core/load_balancing/oob_backend_metric.cc +1 -5
  354. data/src/core/load_balancing/oob_backend_metric_internal.h +0 -1
  355. data/src/core/load_balancing/xds/xds_cluster_impl.cc +12 -9
  356. data/src/core/plugin_registry/grpc_plugin_registry.cc +3 -2
  357. data/src/core/resolver/xds/xds_resolver.cc +162 -116
  358. data/src/core/server/server.cc +18 -1
  359. data/src/core/server/server.h +2 -0
  360. data/src/core/server/xds_server_config_fetcher.cc +4 -4
  361. data/src/core/telemetry/call_tracer.cc +87 -2
  362. data/src/core/telemetry/call_tracer.h +46 -8
  363. data/src/core/telemetry/instrument.cc +102 -40
  364. data/src/core/telemetry/instrument.h +246 -65
  365. data/src/core/tsi/fake_transport_security.cc +3 -1
  366. data/src/core/tsi/ssl_transport_security.cc +516 -137
  367. data/src/core/tsi/ssl_transport_security.h +28 -22
  368. data/src/core/tsi/ssl_transport_security_utils.cc +2 -2
  369. data/src/core/tsi/ssl_transport_security_utils.h +2 -2
  370. data/src/core/util/bitset.h +6 -0
  371. data/src/core/util/function_signature.h +3 -1
  372. data/src/core/util/http_client/httpcli_security_connector.cc +2 -1
  373. data/src/core/util/json/json_reader.cc +0 -4
  374. data/src/core/xds/grpc/certificate_provider_store.cc +2 -1
  375. data/src/core/xds/grpc/certificate_provider_store.h +3 -17
  376. data/src/core/xds/grpc/certificate_provider_store_interface.h +61 -0
  377. data/src/core/xds/grpc/xds_bootstrap_grpc.cc +48 -0
  378. data/src/core/xds/grpc/xds_bootstrap_grpc.h +18 -0
  379. data/src/core/xds/grpc/xds_certificate_provider.cc +7 -2
  380. data/src/core/xds/grpc/xds_certificate_provider.h +13 -2
  381. data/src/core/xds/grpc/xds_client_grpc.cc +13 -6
  382. data/src/core/xds/grpc/xds_client_grpc.h +10 -7
  383. data/src/core/xds/grpc/xds_cluster.cc +18 -4
  384. data/src/core/xds/grpc/xds_cluster.h +17 -2
  385. data/src/core/xds/grpc/xds_cluster_parser.cc +36 -11
  386. data/src/core/xds/grpc/xds_common_types.cc +45 -0
  387. data/src/core/xds/grpc/xds_common_types.h +31 -0
  388. data/src/core/xds/grpc/xds_common_types_parser.cc +274 -16
  389. data/src/core/xds/grpc/xds_common_types_parser.h +12 -0
  390. data/src/core/xds/grpc/xds_http_fault_filter.cc +128 -24
  391. data/src/core/xds/grpc/xds_http_fault_filter.h +19 -10
  392. data/src/core/xds/grpc/xds_http_filter.cc +38 -0
  393. data/src/core/xds/grpc/xds_http_filter.h +70 -47
  394. data/src/core/xds/grpc/xds_http_filter_registry.cc +48 -14
  395. data/src/core/xds/grpc/xds_http_filter_registry.h +29 -15
  396. data/src/core/xds/grpc/xds_http_gcp_authn_filter.cc +88 -22
  397. data/src/core/xds/grpc/xds_http_gcp_authn_filter.h +22 -11
  398. data/src/core/xds/grpc/xds_http_rbac_filter.cc +36 -20
  399. data/src/core/xds/grpc/xds_http_rbac_filter.h +19 -10
  400. data/src/core/xds/grpc/xds_http_stateful_session_filter.cc +143 -26
  401. data/src/core/xds/grpc/xds_http_stateful_session_filter.h +19 -10
  402. data/src/core/xds/grpc/xds_listener.cc +4 -1
  403. data/src/core/xds/grpc/xds_listener.h +10 -2
  404. data/src/core/xds/grpc/xds_listener_parser.cc +23 -18
  405. data/src/core/xds/grpc/xds_matcher.cc +40 -5
  406. data/src/core/xds/grpc/xds_matcher.h +13 -0
  407. data/src/core/xds/grpc/xds_matcher_action.h +1 -1
  408. data/src/core/xds/grpc/xds_matcher_parse.cc +60 -40
  409. data/src/core/xds/grpc/xds_matcher_parse.h +2 -1
  410. data/src/core/xds/grpc/xds_route_config.cc +12 -1
  411. data/src/core/xds/grpc/xds_route_config.h +15 -2
  412. data/src/core/xds/grpc/xds_route_config_parser.cc +11 -5
  413. data/src/core/xds/grpc/xds_routing.cc +181 -6
  414. data/src/core/xds/grpc/xds_routing.h +57 -0
  415. data/src/core/xds/grpc/xds_server_grpc.cc +55 -43
  416. data/src/core/xds/grpc/xds_server_grpc.h +13 -6
  417. data/src/core/xds/grpc/xds_server_grpc_interface.h +3 -2
  418. data/src/core/xds/grpc/xds_transport_grpc.cc +12 -6
  419. data/src/core/xds/grpc/xds_transport_grpc.h +5 -1
  420. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +12 -8
  421. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +18 -12
  422. data/src/ruby/lib/grpc/grpc.rb +7 -9
  423. data/src/ruby/lib/grpc/version.rb +1 -1
  424. data/src/ruby/pb/generate_proto_ruby.sh +1 -1
  425. data/src/ruby/spec/client_server_spec.rb +1 -1
  426. data/src/ruby/spec/generic/rpc_server_pool_spec.rb +1 -1
  427. data/src/ruby/spec/generic/rpc_server_spec.rb +3 -4
  428. data/src/ruby/spec/spec_helper.rb +1 -1
  429. metadata +64 -14
  430. data/src/core/ext/transport/chttp2/transport/security_frame.cc +0 -31
  431. data/src/core/handshaker/security/legacy_secure_endpoint.cc +0 -597
@@ -17,15 +17,245 @@
17
17
  #ifndef GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_SECURITY_FRAME_H
18
18
  #define GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_SECURITY_FRAME_H
19
19
 
20
- #include <grpc/slice.h>
21
- #include <stdint.h>
20
+ #include <grpc/event_engine/event_engine.h>
21
+ #include <grpc/support/port_platform.h>
22
22
 
23
+ #include <cstdint>
24
+ #include <memory>
25
+ #include <string>
26
+ #include <utility>
27
+
28
+ #include "src/core/ext/transport/chttp2/transport/frame.h"
29
+ #include "src/core/ext/transport/chttp2/transport/write_cycle.h"
30
+ #include "src/core/lib/debug/trace.h"
31
+ #include "src/core/lib/event_engine/query_extensions.h"
32
+ #include "src/core/lib/promise/activity.h"
33
+ #include "src/core/lib/promise/context.h"
34
+ #include "src/core/lib/promise/poll.h"
23
35
  #include "src/core/lib/slice/slice_buffer.h"
24
36
  #include "src/core/lib/transport/transport_framing_endpoint_extension.h"
37
+ #include "src/core/util/grpc_check.h"
38
+ #include "src/core/util/ref_counted.h"
39
+ #include "src/core/util/sync.h"
40
+ #include "absl/base/thread_annotations.h"
41
+ #include "absl/log/log.h"
42
+ #include "absl/strings/str_format.h"
25
43
 
26
44
  namespace grpc_core {
27
45
 
28
- // TODO(tjagtap) [PH2][P1] Implement
46
+ #define GRPC_HTTP2_SECURITY_FRAME_DLOG \
47
+ DLOG_IF(INFO, GRPC_TRACE_FLAG_ENABLED(http2_ph2_transport))
48
+
49
+ // Manages sending and receiving HTTP2 security frames (type 0x08).
50
+ // It bridges HTTP2 Transport and TransportFramingEndpointExtension.
51
+ class SecurityFrameHandler final : public RefCounted<SecurityFrameHandler> {
52
+ public:
53
+ SecurityFrameHandler() = default;
54
+ ~SecurityFrameHandler() override {
55
+ GRPC_HTTP2_SECURITY_FRAME_DLOG << "SecurityFrameHandler::Destructor";
56
+ };
57
+ SecurityFrameHandler(const SecurityFrameHandler&) = delete;
58
+ SecurityFrameHandler& operator=(const SecurityFrameHandler&) = delete;
59
+ SecurityFrameHandler(SecurityFrameHandler&&) = delete;
60
+ SecurityFrameHandler& operator=(SecurityFrameHandler&&) = delete;
61
+
62
+ ///////////////////////////////////////////////////////////////////////////////
63
+ // Initialization
64
+
65
+ // SendFrameCallbackFactory is called from the Transport Party.
66
+ // But the callback that it returns is run on some other thread.
67
+ auto SendFrameCallbackFactory(
68
+ std::shared_ptr<grpc_event_engine::experimental::EventEngine>
69
+ event_engine) {
70
+ return [self = this->Ref(), event_engine](SliceBuffer* data) {
71
+ event_engine->Run([self, data = std::move(*data)]() mutable {
72
+ GRPC_HTTP2_SECURITY_FRAME_DLOG << "SecurityFrameHandler::Callback";
73
+ bool call_wakeup = false;
74
+ {
75
+ MutexLock lock(&self->mutex_);
76
+ // In the rare possibility that we receive 2 quick callbacks in
77
+ // succession before the transport is able to read the payload_
78
+ // then we will apply the latest key and discard the old key.
79
+ self->payload_.Clear();
80
+ if (!self->transport_closed_) {
81
+ self->payload_.Swap(&data);
82
+ call_wakeup = true;
83
+ }
84
+ }
85
+ if (call_wakeup) {
86
+ GRPC_HTTP2_SECURITY_FRAME_DLOG
87
+ << "SecurityFrameHandler::Callback Wakeup";
88
+ self->waker_.Wakeup();
89
+ }
90
+ });
91
+ };
92
+ }
93
+
94
+ struct EndpointExtensionState {
95
+ bool is_set = false;
96
+ };
97
+
98
+ // Only run on the Transport Party
99
+ GRPC_MUST_USE_RESULT EndpointExtensionState Initialize(
100
+ std::shared_ptr<grpc_event_engine::experimental::EventEngine>
101
+ event_engine) {
102
+ GRPC_HTTP2_SECURITY_FRAME_DLOG << "SecurityFrameHandler::Initialize";
103
+ endpoint_extension_ = grpc_event_engine::experimental::QueryExtension<
104
+ TransportFramingEndpointExtension>(event_engine.get());
105
+ if (endpoint_extension_ != nullptr) {
106
+ endpoint_extension_->SetSendFrameCallback(
107
+ SendFrameCallbackFactory(event_engine));
108
+ return EndpointExtensionState{true};
109
+ }
110
+ LOG(ERROR) << "SecurityFrameHandler::Initialize could not initialize "
111
+ "TransportFramingEndpointExtension";
112
+ return EndpointExtensionState{false};
113
+ }
114
+
115
+ ///////////////////////////////////////////////////////////////////////////////
116
+ // When a Security Frame is received by the Transport
117
+
118
+ // Only run on the Transport Party
119
+ void ProcessPayload(SliceBuffer&& payload) {
120
+ GRPC_HTTP2_SECURITY_FRAME_DLOG << "SecurityFrameHandler::ProcessPayload";
121
+ if (endpoint_extension_ != nullptr) {
122
+ MutexLock lock(&mutex_);
123
+ if (!transport_closed_) {
124
+ endpoint_extension_->ReceiveFrame(std::move(payload));
125
+ }
126
+ }
127
+ }
128
+
129
+ //////////////////////////////////////////////////////////////////////////////
130
+ // When a Security Frame needs to be sent by the Transport
131
+
132
+ enum class SleepState : uint8_t {
133
+ kWaitingForFrame, // Sleep until we have a security frame to send
134
+ kWriteOneFrame,
135
+ kScheduledWrite,
136
+ kTransportClosed,
137
+ };
138
+
139
+ // Only run on the Transport Party - From SecurityFrameLoop Promise
140
+ auto WaitForSecurityFrameSending() {
141
+ GRPC_DCHECK(endpoint_extension_ != nullptr);
142
+ return [self = this->Ref()]() -> Poll<Empty> {
143
+ GRPC_HTTP2_SECURITY_FRAME_DLOG
144
+ << "SecurityFrameHandler::WaitForSecurityFrameSending";
145
+ if (self->sleep_state_ == SleepState::kTransportClosed) {
146
+ return Empty{};
147
+ } else if (self->sleep_state_ == SleepState::kWaitingForFrame) {
148
+ MutexLock lock(&self->mutex_);
149
+ if (self->payload_.Length() > 0) {
150
+ self->sleep_state_ = SleepState::kWriteOneFrame;
151
+ return Empty{};
152
+ }
153
+ }
154
+ GRPC_HTTP2_SECURITY_FRAME_DLOG
155
+ << "SecurityFrameHandler::WaitForSecurityFrameSending Add Waker";
156
+ self->waker_ = GetContext<Activity>()->MakeNonOwningWaker();
157
+ return Pending{};
158
+ };
159
+ }
160
+
161
+ struct TerminateSecurityFrameLoop {
162
+ bool terminate = false;
163
+ };
164
+
165
+ // Only run on the Transport Party - From SecurityFrameLoop Promise
166
+ TerminateSecurityFrameLoop TriggerWriteSecurityFrame() {
167
+ GRPC_HTTP2_SECURITY_FRAME_DLOG
168
+ << "SecurityFrameHandler::TriggerWriteSecurityFrame";
169
+ GRPC_DCHECK(endpoint_extension_ != nullptr);
170
+ GRPC_DCHECK(sleep_state_ == SleepState::kWriteOneFrame ||
171
+ sleep_state_ == SleepState::kTransportClosed);
172
+ if (sleep_state_ == SleepState::kWriteOneFrame) {
173
+ sleep_state_ = SleepState::kScheduledWrite;
174
+ }
175
+ return TerminateSecurityFrameLoop{
176
+ (sleep_state_ == SleepState::kTransportClosed)};
177
+ }
178
+
179
+ // TODO(tjagtap) [PH2][P5] Simplify WaitForSecurityFrameSending and
180
+ // TriggerWriteSecurityFrame by merging the two.
181
+
182
+ // Only run on the Transport Party - From MultiplexerLoop Promise
183
+ void MaybeAppendSecurityFrame(http2::FrameSender& frame_sender) {
184
+ GRPC_DCHECK(sleep_state_ != SleepState::kWriteOneFrame);
185
+ if (sleep_state_ == SleepState::kScheduledWrite &&
186
+ endpoint_extension_ != nullptr) {
187
+ Http2Frame frame = Http2SecurityFrame();
188
+ {
189
+ MutexLock lock(&mutex_);
190
+ GRPC_DCHECK(payload_.Length() != 0);
191
+ GRPC_HTTP2_SECURITY_FRAME_DLOG
192
+ << "SecurityFrameHandler::MaybeAppendSecurityFrame Write Frame "
193
+ "Length "
194
+ << payload_.Length();
195
+ std::get<Http2SecurityFrame>(frame).payload.Swap(&payload_);
196
+ GRPC_DCHECK(payload_.Length() == 0);
197
+ }
198
+ frame_sender.AddRegularFrame(std::move(frame));
199
+ sleep_state_ = SleepState::kWaitingForFrame;
200
+ }
201
+ }
202
+
203
+ //////////////////////////////////////////////////////////////////////////////
204
+ // Cleanup
205
+
206
+ // Only run on the Transport Party
207
+ void OnTransportClosed() {
208
+ GRPC_HTTP2_SECURITY_FRAME_DLOG << "SecurityFrameHandler::OnTransportClosed";
209
+ MutexLock lock(&mutex_);
210
+ transport_closed_ = true;
211
+ sleep_state_ = SleepState::kTransportClosed;
212
+ payload_.Clear();
213
+ waker_.Wakeup(); // To terminate the SecurityFrameLoop
214
+ }
215
+
216
+ SleepState TestOnlySleepState() { return sleep_state_; }
217
+
218
+ std::string TestOnlyDebugString() {
219
+ std::string sleep_state_str;
220
+ switch (sleep_state_) {
221
+ case SleepState::kWaitingForFrame:
222
+ sleep_state_str = "kWaitingForFrame";
223
+ break;
224
+ case SleepState::kWriteOneFrame:
225
+ sleep_state_str = "kWriteOneFrame";
226
+ break;
227
+ case SleepState::kScheduledWrite:
228
+ sleep_state_str = "kScheduledWrite";
229
+ break;
230
+ case SleepState::kTransportClosed:
231
+ sleep_state_str = "kTransportClosed";
232
+ break;
233
+ }
234
+ MutexLock lock(&mutex_);
235
+ // Do not ever LOG the payload. It has a security key.
236
+ return absl::StrFormat(
237
+ "SecurityFrameHandler{endpoint_extension_=%s, sleep_state_=%s, "
238
+ "payload_length=%d, transport_closed_=%s}",
239
+ endpoint_extension_ == nullptr ? "null" : "non-null", sleep_state_str,
240
+ payload_.Length(), transport_closed_ ? "true" : "false");
241
+ }
242
+
243
+ private:
244
+ // Only access endpoint_extension_ from the transport party
245
+ TransportFramingEndpointExtension* endpoint_extension_ = nullptr;
246
+
247
+ // Initialized on the transport party and woken up by some other thread.
248
+ Waker waker_;
249
+
250
+ Mutex mutex_;
251
+ // Written/Cleared by the other thread, Read and Cleared by transport party.
252
+ SliceBuffer payload_ ABSL_GUARDED_BY(mutex_);
253
+ // Written by transport party, read by both threads.
254
+ bool transport_closed_ ABSL_GUARDED_BY(mutex_) = false;
255
+
256
+ // Only access sleep_state_ from the transport party
257
+ SleepState sleep_state_ = SleepState::kWaitingForFrame;
258
+ };
29
259
 
30
260
  } // namespace grpc_core
31
261
 
@@ -21,10 +21,11 @@
21
21
 
22
22
  #include <grpc/support/port_platform.h>
23
23
 
24
+ #include <atomic>
24
25
  #include <cstdint>
25
- #include <limits>
26
26
  #include <string>
27
27
  #include <utility>
28
+ #include <variant>
28
29
 
29
30
  #include "src/core/call/call_spine.h"
30
31
  #include "src/core/call/message.h"
@@ -36,6 +37,7 @@
36
37
  #include "src/core/ext/transport/chttp2/transport/http2_status.h"
37
38
  #include "src/core/ext/transport/chttp2/transport/message_assembler.h"
38
39
  #include "src/core/ext/transport/chttp2/transport/stream_data_queue.h"
40
+ #include "src/core/ext/transport/chttp2/transport/write_cycle.h"
39
41
  #include "src/core/util/grpc_check.h"
40
42
  #include "src/core/util/ref_counted.h"
41
43
  #include "src/core/util/ref_counted_ptr.h"
@@ -60,20 +62,42 @@ enum class HttpStreamState : uint8_t {
60
62
  };
61
63
 
62
64
  // Managing the streams
63
- struct Stream : public RefCounted<Stream> {
64
- explicit Stream(CallHandler call,
65
+ class Stream : public RefCounted<Stream> {
66
+ public:
67
+ explicit Stream(CallHandler call_handler,
65
68
  chttp2::TransportFlowControl& transport_flow_control)
66
- : call(std::move(call)),
67
- is_write_closed(false),
68
- stream_state(HttpStreamState::kIdle),
69
- stream_id(kInvalidStreamId),
70
- did_receive_initial_metadata(false),
71
- did_receive_trailing_metadata(false),
72
- did_push_server_trailing_metadata(false),
73
- data_queue(MakeRefCounted<StreamDataQueue<ClientMetadataHandle>>(
74
- /*is_client*/ true,
75
- /*queue_size*/ kStreamQueueSize)),
76
- flow_control(&transport_flow_control) {}
69
+ : header_assembler_(/*is_client*/ true),
70
+ flow_control_(&transport_flow_control),
71
+ call_(std::move(call_handler)),
72
+ is_write_closed_(false),
73
+ stream_id_(kInvalidStreamId),
74
+ stream_state_(HttpStreamState::kIdle),
75
+ did_receive_initial_metadata_(false),
76
+ did_receive_trailing_metadata_(false),
77
+ did_push_server_trailing_metadata_(false),
78
+ data_queue_(MakeRefCounted<StreamDataQueue<ClientMetadataHandle>>(
79
+ std::get<CallHandler>(call_).arena(), /*is_client*/ true,
80
+ /*queue_size*/ kStreamQueueSize)) {}
81
+
82
+ explicit Stream(CallInitiator call_initiator,
83
+ chttp2::TransportFlowControl& transport_flow_control)
84
+ : header_assembler_(/*is_client*/ false),
85
+ flow_control_(&transport_flow_control),
86
+ call_(std::move(call_initiator)),
87
+ is_write_closed_(false),
88
+ stream_id_(kInvalidStreamId),
89
+ stream_state_(HttpStreamState::kIdle),
90
+ did_receive_initial_metadata_(false),
91
+ did_receive_trailing_metadata_(false),
92
+ did_push_server_trailing_metadata_(false),
93
+ data_queue_(MakeRefCounted<StreamDataQueue<ClientMetadataHandle>>(
94
+ std::get<CallInitiator>(call_).arena(), /*is_client*/ false,
95
+ /*queue_size*/ kStreamQueueSize)) {}
96
+
97
+ Stream(const Stream&) = delete;
98
+ Stream(Stream&&) = delete;
99
+ Stream& operator=(const Stream&) = delete;
100
+ Stream& operator=(Stream&&) = delete;
77
101
 
78
102
  // TODO(akshitpatel) : [PH2][P4] : SetStreamId can be avoided if we pass the
79
103
  // stream id as a parameter to the dequeue function. The only downside here
@@ -84,13 +108,13 @@ struct Stream : public RefCounted<Stream> {
84
108
  const bool allow_true_binary_metadata_peer,
85
109
  const bool allow_true_binary_metadata_acked) {
86
110
  GRPC_DCHECK_NE(stream_id, 0u);
87
- GRPC_DCHECK_EQ(this->stream_id, 0u);
111
+ GRPC_DCHECK_EQ(this->stream_id_, 0u);
88
112
  GRPC_HTTP2_STREAM_LOG << "Stream::InitializeStream stream_id=" << stream_id;
89
- if (GPR_LIKELY(this->stream_id == 0)) {
90
- this->stream_id = stream_id;
91
- header_assembler.InitializeStream(stream_id,
92
- allow_true_binary_metadata_acked);
93
- data_queue->SetStreamId(stream_id, allow_true_binary_metadata_peer);
113
+ if (GPR_LIKELY(this->stream_id_ == 0)) {
114
+ this->stream_id_ = stream_id;
115
+ header_assembler_.InitializeStream(stream_id,
116
+ allow_true_binary_metadata_acked);
117
+ data_queue_->SetStreamId(stream_id, allow_true_binary_metadata_peer);
94
118
  }
95
119
  }
96
120
 
@@ -100,12 +124,12 @@ struct Stream : public RefCounted<Stream> {
100
124
 
101
125
  auto EnqueueInitialMetadata(ClientMetadataHandle&& metadata) {
102
126
  GRPC_HTTP2_STREAM_LOG << "Stream::EnqueueInitialMetadata";
103
- return data_queue->EnqueueInitialMetadata(std::move(metadata));
127
+ return data_queue_->EnqueueInitialMetadata(std::move(metadata));
104
128
  }
105
129
 
106
130
  auto EnqueueTrailingMetadata(ClientMetadataHandle&& metadata) {
107
131
  GRPC_HTTP2_STREAM_LOG << "Stream::EnqueueTrailingMetadata";
108
- return data_queue->EnqueueTrailingMetadata(std::move(metadata));
132
+ return data_queue_->EnqueueTrailingMetadata(std::move(metadata));
109
133
  }
110
134
 
111
135
  auto EnqueueMessage(MessageHandle&& message) {
@@ -113,36 +137,37 @@ struct Stream : public RefCounted<Stream> {
113
137
  << " with payload size = "
114
138
  << message->payload()->Length()
115
139
  << " and flags = " << message->flags();
116
- return data_queue->EnqueueMessage(std::move(message));
140
+ return data_queue_->EnqueueMessage(std::move(message));
117
141
  }
118
142
 
119
143
  auto EnqueueHalfClosed() {
120
144
  GRPC_HTTP2_STREAM_LOG << "Stream::EnqueueHalfClosed";
121
- return data_queue->EnqueueHalfClosed();
145
+ return data_queue_->EnqueueHalfClosed();
122
146
  }
123
147
 
124
148
  auto EnqueueResetStream(const uint32_t error_code) {
125
149
  GRPC_HTTP2_STREAM_LOG << "Stream::EnqueueResetStream"
126
150
  << " with error_code = " << error_code;
127
- return data_queue->EnqueueResetStream(error_code);
151
+ return data_queue_->EnqueueResetStream(error_code);
128
152
  }
129
153
 
130
154
  // Called from the transport party
131
155
  auto DequeueFrames(const uint32_t tokens,
132
156
  const uint32_t stream_flow_control_tokens,
133
- const uint32_t max_frame_length,
134
- HPackCompressor& encoder) {
135
- HttpStreamState state = stream_state;
157
+ const uint32_t max_frame_length, HPackCompressor& encoder,
158
+ FrameSender& frame_sender) {
159
+ HttpStreamState state = stream_state_;
136
160
  // Reset stream MUST not be sent if the stream is idle or closed.
137
- return data_queue->DequeueFrames(tokens, max_frame_length,
138
- stream_flow_control_tokens, encoder,
139
- /*can_send_reset_stream=*/
140
- !(state == HttpStreamState::kIdle ||
141
- state == HttpStreamState::kClosed));
161
+ return data_queue_->DequeueFrames(tokens, max_frame_length,
162
+ stream_flow_control_tokens, encoder,
163
+ frame_sender,
164
+ /*can_send_reset_stream=*/
165
+ !(state == HttpStreamState::kIdle ||
166
+ state == HttpStreamState::kClosed));
142
167
  }
143
168
 
144
169
  auto ReceivedFlowControlWindowUpdate(const uint32_t stream_fc_tokens) {
145
- return data_queue->ReceivedFlowControlWindowUpdate(stream_fc_tokens);
170
+ return data_queue_->ReceivedFlowControlWindowUpdate(stream_fc_tokens);
146
171
  }
147
172
 
148
173
  ////////////////////////////////////////////////////////////////////////////
@@ -156,78 +181,90 @@ struct Stream : public RefCounted<Stream> {
156
181
  // kHalfClosedLocal/kHalfClosedRemote -> kClosed
157
182
  // kClosed -> kClosed
158
183
  void SentInitialMetadata() {
159
- GRPC_DCHECK(stream_state == HttpStreamState::kIdle);
160
- stream_state = HttpStreamState::kOpen;
184
+ GRPC_DCHECK(stream_state_ == HttpStreamState::kIdle);
185
+ stream_state_ = HttpStreamState::kOpen;
161
186
  }
162
187
 
163
188
  void MarkHalfClosedLocal() {
164
- switch (stream_state) {
189
+ switch (stream_state_) {
165
190
  case HttpStreamState::kIdle:
166
191
  GRPC_DCHECK(false) << "MarkHalfClosedLocal called for an idle stream";
167
192
  break;
168
193
  case HttpStreamState::kOpen:
169
194
  GRPC_HTTP2_STREAM_LOG
170
- << "Stream::MarkHalfClosedLocal stream_id=" << stream_id
195
+ << "Stream::MarkHalfClosedLocal stream_id=" << stream_id_
171
196
  << " transitioning to kHalfClosedLocal";
172
- stream_state = HttpStreamState::kHalfClosedLocal;
197
+ stream_state_ = HttpStreamState::kHalfClosedLocal;
173
198
  break;
174
199
  case HttpStreamState::kHalfClosedRemote:
175
200
  GRPC_HTTP2_STREAM_LOG
176
- << "Stream::MarkHalfClosedLocal stream_id=" << stream_id
201
+ << "Stream::MarkHalfClosedLocal stream_id=" << stream_id_
177
202
  << " transitioning to kClosed";
178
- stream_state = HttpStreamState::kClosed;
203
+ stream_state_ = HttpStreamState::kClosed;
179
204
  break;
180
205
  case HttpStreamState::kHalfClosedLocal:
181
206
  break;
182
207
  case HttpStreamState::kClosed:
183
208
  GRPC_HTTP2_STREAM_LOG
184
- << "Stream::MarkHalfClosedLocal stream_id=" << stream_id
209
+ << "Stream::MarkHalfClosedLocal stream_id=" << stream_id_
185
210
  << " already closed";
186
211
  break;
187
212
  }
188
213
  }
189
214
 
190
215
  void MarkHalfClosedRemote() {
191
- switch (stream_state) {
216
+ switch (stream_state_) {
192
217
  case HttpStreamState::kIdle:
193
218
  GRPC_DCHECK(false) << "MarkHalfClosedRemote called for an idle stream";
194
219
  break;
195
220
  case HttpStreamState::kOpen:
196
221
  GRPC_HTTP2_STREAM_LOG
197
- << "Stream::MarkHalfClosedRemote stream_id=" << stream_id
222
+ << "Stream::MarkHalfClosedRemote stream_id=" << stream_id_
198
223
  << " transitioning to kHalfClosedRemote";
199
- stream_state = HttpStreamState::kHalfClosedRemote;
224
+ stream_state_ = HttpStreamState::kHalfClosedRemote;
200
225
  break;
201
226
  case HttpStreamState::kHalfClosedLocal:
202
227
  GRPC_HTTP2_STREAM_LOG
203
- << "Stream::MarkHalfClosedRemote stream_id=" << stream_id
228
+ << "Stream::MarkHalfClosedRemote stream_id=" << stream_id_
204
229
  << " transitioning to kClosed";
205
- stream_state = HttpStreamState::kClosed;
230
+ stream_state_ = HttpStreamState::kClosed;
206
231
  break;
207
232
  case HttpStreamState::kHalfClosedRemote:
208
233
  break;
209
234
  case HttpStreamState::kClosed:
210
235
  GRPC_HTTP2_STREAM_LOG
211
- << "Stream::MarkHalfClosedRemote stream_id=" << stream_id
236
+ << "Stream::MarkHalfClosedRemote stream_id=" << stream_id_
212
237
  << " already closed";
213
238
  break;
214
239
  }
215
240
  }
216
241
 
217
242
  inline bool IsStreamIdle() const {
218
- return stream_state == HttpStreamState::kIdle;
243
+ return stream_state_ == HttpStreamState::kIdle;
219
244
  }
220
245
  inline bool IsStreamHalfClosedRemote() const {
221
- return stream_state == HttpStreamState::kHalfClosedRemote;
246
+ return stream_state_ == HttpStreamState::kHalfClosedRemote;
247
+ }
248
+ inline bool IsHalfClosedLocal() const {
249
+ return stream_state_ == HttpStreamState::kHalfClosedLocal;
222
250
  }
223
- inline uint32_t GetStreamId() const { return stream_id; }
251
+ inline bool IsStreamClosed() const {
252
+ return stream_state_ == HttpStreamState::kClosed;
253
+ }
254
+
255
+ inline uint32_t GetStreamId() const { return stream_id_; }
224
256
 
225
- inline bool IsClosedForWrites() const { return is_write_closed; }
226
- inline void SetWriteClosed() { is_write_closed = true; }
257
+ inline bool IsClosedForWrites() const {
258
+ return is_write_closed_.load(std::memory_order_relaxed);
259
+ }
260
+
261
+ inline void SetWriteClosed() {
262
+ is_write_closed_.store(true, std::memory_order_relaxed);
263
+ }
227
264
 
228
265
  inline bool CanSendWindowUpdateFrames() const {
229
- return stream_state == HttpStreamState::kOpen ||
230
- stream_state == HttpStreamState::kHalfClosedLocal;
266
+ return stream_state_ == HttpStreamState::kOpen ||
267
+ stream_state_ == HttpStreamState::kHalfClosedLocal;
231
268
  }
232
269
 
233
270
  inline Http2Status CanStreamReceiveDataFrames() const {
@@ -236,7 +273,7 @@ struct Stream : public RefCounted<Stream> {
236
273
  Http2ErrorCode::kStreamClosed,
237
274
  std::string(RFC9113::kHalfClosedRemoteState));
238
275
  }
239
- if (!did_receive_initial_metadata || did_receive_trailing_metadata) {
276
+ if (!IsInitialMetadataReceived() || IsTrailingMetadataReceived()) {
240
277
  return Http2Status::Http2StreamError(
241
278
  Http2ErrorCode::kStreamClosed,
242
279
  std::string(GrpcErrors::kOutOfOrderDataFrame));
@@ -245,20 +282,64 @@ struct Stream : public RefCounted<Stream> {
245
282
  }
246
283
 
247
284
  void MaybePushServerTrailingMetadata(ServerMetadataHandle&& metadata) {
285
+ GRPC_DCHECK(std::holds_alternative<CallHandler>(call_));
248
286
  GRPC_HTTP2_STREAM_LOG << "Stream::MaybePushServerTrailingMetadata "
249
287
  "stream_id="
250
- << stream_id
288
+ << stream_id_
251
289
  << " metadata=" << metadata->DebugString()
252
290
  << " did_push_server_trailing_metadata="
253
- << did_push_server_trailing_metadata;
291
+ << did_push_server_trailing_metadata_;
254
292
 
255
- if (!did_push_server_trailing_metadata) {
256
- did_push_server_trailing_metadata = true;
257
- call.SpawnPushServerTrailingMetadata(std::move(metadata));
293
+ if (!did_push_server_trailing_metadata_) {
294
+ did_push_server_trailing_metadata_ = true;
295
+ GetCallHandler().SpawnPushServerTrailingMetadata(std::move(metadata));
258
296
  }
259
297
  }
260
298
 
261
- CallHandler call;
299
+ GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION bool IsInitialMetadataReceived() const {
300
+ return did_receive_initial_metadata_;
301
+ }
302
+
303
+ GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION void SetInitialMetadataReceived() {
304
+ did_receive_initial_metadata_ = true;
305
+ }
306
+
307
+ GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION bool IsTrailingMetadataReceived() const {
308
+ return did_receive_trailing_metadata_;
309
+ }
310
+
311
+ GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION void SetTrailingMetadataReceived() {
312
+ did_receive_trailing_metadata_ = true;
313
+ }
314
+
315
+ GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION CallHandler& GetCallHandler() {
316
+ return std::get<CallHandler>(call_);
317
+ }
318
+
319
+ GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION CallInitiator& GetCallInitiator() {
320
+ return std::get<CallInitiator>(call_);
321
+ }
322
+
323
+ GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION GrpcMessageAssembler&
324
+ GetGrpcMessageAssembler() {
325
+ return assembler_;
326
+ }
327
+
328
+ GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION HeaderAssembler& GetHeaderAssembler() {
329
+ return header_assembler_;
330
+ }
331
+
332
+ GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION chttp2::StreamFlowControl&
333
+ GetStreamFlowControl() {
334
+ return flow_control_;
335
+ }
336
+
337
+ private:
338
+ GrpcMessageAssembler assembler_;
339
+ HeaderAssembler header_assembler_;
340
+ chttp2::StreamFlowControl flow_control_;
341
+ std::variant<CallInitiator, CallHandler> call_;
342
+
262
343
  // This flag is kept separate from the stream_state as the stream_state
263
344
  // is inline with the HTTP2 spec, whereas this flag is an implementation
264
345
  // detail of the PH2 transport. As far as PH2 is concerned, if a stream is
@@ -266,19 +347,17 @@ struct Stream : public RefCounted<Stream> {
266
347
  // Similarly if a stream is closed for reads(this is achieved by removing the
267
348
  // stream from the transport map), then all the frames read on that stream
268
349
  // will be dropped.
269
- bool is_write_closed;
350
+ std::atomic<bool> is_write_closed_;
351
+ uint32_t stream_id_;
352
+
270
353
  // This MUST be accessed from the transport party.
271
- HttpStreamState stream_state;
272
- uint32_t stream_id;
273
- GrpcMessageAssembler assembler;
274
- HeaderAssembler header_assembler;
275
- bool did_receive_initial_metadata;
276
- bool did_receive_trailing_metadata;
277
- bool did_push_server_trailing_metadata;
278
- // TODO(akshitpatel) : [PH2][P3][Server] : This would need to change to
354
+ HttpStreamState stream_state_;
355
+ bool did_receive_initial_metadata_;
356
+ bool did_receive_trailing_metadata_;
357
+ bool did_push_server_trailing_metadata_;
358
+ // TODO(akshitpatel) : [PH2][P0][Server] : This would need to change to
279
359
  // accomodate ServerMetadataHandle for the server side.
280
- RefCountedPtr<StreamDataQueue<ClientMetadataHandle>> data_queue;
281
- chttp2::StreamFlowControl flow_control;
360
+ RefCountedPtr<StreamDataQueue<ClientMetadataHandle>> data_queue_;
282
361
  };
283
362
 
284
363
  } // namespace http2