grpc 1.76.0 → 1.78.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 (763) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +11 -5
  3. data/include/grpc/credentials.h +6 -1
  4. data/include/grpc/event_engine/memory_allocator.h +2 -0
  5. data/include/grpc/impl/channel_arg_names.h +5 -0
  6. data/include/grpc/support/metrics.h +7 -1
  7. data/src/core/call/call_filters.cc +1 -1
  8. data/src/core/call/call_filters.h +175 -1
  9. data/src/core/call/call_spine.cc +1 -1
  10. data/src/core/call/call_spine.h +27 -5
  11. data/src/core/call/channelz_context.h +30 -0
  12. data/src/core/call/client_call.cc +43 -5
  13. data/src/core/call/client_call.h +6 -3
  14. data/src/core/call/filter_fusion.h +4 -4
  15. data/src/core/call/interception_chain.h +7 -6
  16. data/src/core/call/metadata_batch.cc +49 -55
  17. data/src/core/call/metadata_batch.h +7 -6
  18. data/src/core/call/metadata_info.cc +1 -1
  19. data/src/core/call/parsed_metadata.h +2 -2
  20. data/src/core/call/request_buffer.cc +1 -1
  21. data/src/core/call/security_context.cc +1 -1
  22. data/src/core/call/security_context.h +1 -1
  23. data/src/core/call/server_call.cc +1 -1
  24. data/src/core/call/server_call.h +5 -3
  25. data/src/core/call/simple_slice_based_metadata.h +1 -1
  26. data/src/core/call/status_util.cc +1 -1
  27. data/src/core/channelz/channel_trace.cc +1 -1
  28. data/src/core/channelz/channel_trace.h +3 -3
  29. data/src/core/channelz/channelz.cc +13 -11
  30. data/src/core/channelz/channelz.h +41 -6
  31. data/src/core/channelz/channelz_registry.cc +2 -2
  32. data/src/core/channelz/channelz_registry.h +42 -2
  33. data/src/core/channelz/property_list.h +6 -4
  34. data/src/core/channelz/v2tov1/convert.cc +6 -6
  35. data/src/core/channelz/v2tov1/legacy_api.cc +4 -5
  36. data/src/core/channelz/v2tov1/property_list.cc +1 -1
  37. data/src/core/channelz/ztrace_collector.h +14 -2
  38. data/src/core/client_channel/backup_poller.cc +2 -2
  39. data/src/core/client_channel/buffered_call.cc +140 -0
  40. data/src/core/client_channel/buffered_call.h +104 -0
  41. data/src/core/client_channel/client_channel.cc +124 -71
  42. data/src/core/client_channel/client_channel.h +8 -11
  43. data/src/core/client_channel/client_channel_factory.h +1 -1
  44. data/src/core/client_channel/client_channel_filter.cc +393 -663
  45. data/src/core/client_channel/client_channel_filter.h +57 -150
  46. data/src/core/client_channel/client_channel_internal.h +5 -1
  47. data/src/core/client_channel/client_channel_service_config.cc +43 -3
  48. data/src/core/client_channel/client_channel_service_config.h +12 -1
  49. data/src/core/client_channel/config_selector.h +2 -2
  50. data/src/core/client_channel/connector.h +2 -0
  51. data/src/core/client_channel/dynamic_filters.cc +2 -2
  52. data/src/core/client_channel/global_subchannel_pool.h +1 -1
  53. data/src/core/client_channel/lb_metadata.h +1 -1
  54. data/src/core/client_channel/load_balanced_call_destination.cc +3 -5
  55. data/src/core/client_channel/load_balanced_call_destination.h +1 -1
  56. data/src/core/client_channel/retry_filter.cc +2 -2
  57. data/src/core/client_channel/retry_filter_legacy_call_data.cc +6 -7
  58. data/src/core/client_channel/retry_filter_legacy_call_data.h +6 -8
  59. data/src/core/client_channel/retry_service_config.cc +3 -3
  60. data/src/core/client_channel/retry_service_config.h +1 -1
  61. data/src/core/client_channel/subchannel.cc +106 -17
  62. data/src/core/client_channel/subchannel.h +24 -8
  63. data/src/core/client_channel/subchannel_pool_interface.cc +2 -2
  64. data/src/core/client_channel/subchannel_pool_interface.h +1 -1
  65. data/src/core/client_channel/subchannel_stream_client.cc +1 -1
  66. data/src/core/client_channel/subchannel_stream_client.h +3 -3
  67. data/src/core/config/config_vars.cc +8 -2
  68. data/src/core/config/config_vars.h +5 -0
  69. data/src/core/config/core_configuration.h +1 -1
  70. data/src/core/config/load_config.cc +1 -1
  71. data/src/core/credentials/call/call_credentials.h +2 -2
  72. data/src/core/credentials/call/call_creds_registry.h +1 -1
  73. data/src/core/credentials/call/call_creds_registry_init.cc +2 -2
  74. data/src/core/credentials/call/call_creds_util.cc +3 -3
  75. data/src/core/credentials/call/composite/composite_call_credentials.cc +2 -2
  76. data/src/core/credentials/call/composite/composite_call_credentials.h +1 -1
  77. data/src/core/credentials/call/external/aws_external_account_credentials.cc +6 -6
  78. data/src/core/credentials/call/external/aws_external_account_credentials.h +1 -1
  79. data/src/core/credentials/call/external/external_account_credentials.cc +12 -12
  80. data/src/core/credentials/call/external/external_account_credentials.h +1 -1
  81. data/src/core/credentials/call/external/file_external_account_credentials.cc +3 -3
  82. data/src/core/credentials/call/external/file_external_account_credentials.h +1 -1
  83. data/src/core/credentials/call/external/url_external_account_credentials.cc +6 -6
  84. data/src/core/credentials/call/external/url_external_account_credentials.h +1 -1
  85. data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.cc +24 -71
  86. data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.h +1 -8
  87. data/src/core/credentials/call/iam/iam_credentials.cc +2 -2
  88. data/src/core/credentials/call/iam/iam_credentials.h +1 -1
  89. data/src/core/credentials/call/json_util.cc +1 -1
  90. data/src/core/credentials/call/jwt/json_token.cc +4 -4
  91. data/src/core/credentials/call/jwt/jwt_credentials.cc +3 -3
  92. data/src/core/credentials/call/jwt/jwt_credentials.h +4 -4
  93. data/src/core/credentials/call/jwt/jwt_verifier.cc +5 -5
  94. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.cc +2 -2
  95. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.h +3 -3
  96. data/src/core/credentials/call/jwt_util.cc +3 -3
  97. data/src/core/credentials/call/jwt_util.h +1 -1
  98. data/src/core/credentials/call/oauth2/oauth2_credentials.cc +29 -60
  99. data/src/core/credentials/call/oauth2/oauth2_credentials.h +3 -9
  100. data/src/core/credentials/call/plugin/plugin_credentials.cc +4 -4
  101. data/src/core/credentials/call/plugin/plugin_credentials.h +2 -2
  102. data/src/core/credentials/call/token_fetcher/token_fetcher_credentials.cc +46 -0
  103. data/src/core/credentials/call/token_fetcher/token_fetcher_credentials.h +32 -3
  104. data/src/core/credentials/transport/alts/alts_credentials.cc +3 -3
  105. data/src/core/credentials/transport/alts/alts_security_connector.cc +3 -3
  106. data/src/core/credentials/transport/alts/check_gcp_environment_no_op.cc +1 -1
  107. data/src/core/credentials/transport/alts/grpc_alts_credentials_client_options.cc +1 -1
  108. data/src/core/credentials/transport/alts/grpc_alts_credentials_options.h +1 -1
  109. data/src/core/credentials/transport/channel_creds_registry.h +1 -1
  110. data/src/core/credentials/transport/channel_creds_registry_init.cc +1 -1
  111. data/src/core/credentials/transport/composite/composite_channel_credentials.cc +2 -2
  112. data/src/core/credentials/transport/composite/composite_channel_credentials.h +1 -1
  113. data/src/core/credentials/transport/fake/fake_credentials.cc +1 -1
  114. data/src/core/credentials/transport/fake/fake_credentials.h +1 -1
  115. data/src/core/credentials/transport/fake/fake_security_connector.cc +5 -5
  116. data/src/core/credentials/transport/google_default/credentials_generic.cc +2 -2
  117. data/src/core/credentials/transport/google_default/google_default_credentials.cc +5 -11
  118. data/src/core/credentials/transport/google_default/google_default_credentials.h +0 -2
  119. data/src/core/credentials/transport/insecure/insecure_security_connector.h +2 -2
  120. data/src/core/credentials/transport/local/local_security_connector.cc +5 -5
  121. data/src/core/credentials/transport/security_connector.cc +1 -1
  122. data/src/core/credentials/transport/security_connector.h +2 -2
  123. data/src/core/credentials/transport/ssl/ssl_credentials.cc +1 -1
  124. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +5 -5
  125. data/src/core/credentials/transport/tls/certificate_provider_factory.h +1 -1
  126. data/src/core/credentials/transport/tls/certificate_provider_registry.cc +1 -1
  127. data/src/core/credentials/transport/tls/certificate_provider_registry.h +1 -1
  128. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +1 -1
  129. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +2 -2
  130. data/src/core/credentials/transport/tls/grpc_tls_certificate_match.cc +1 -1
  131. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +3 -3
  132. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +3 -3
  133. data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.cc +1 -1
  134. data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.h +2 -2
  135. data/src/core/credentials/transport/tls/grpc_tls_credentials_options.cc +1 -1
  136. data/src/core/credentials/transport/tls/grpc_tls_crl_provider.cc +5 -5
  137. data/src/core/credentials/transport/tls/grpc_tls_crl_provider.h +3 -3
  138. data/src/core/credentials/transport/tls/load_system_roots_supported.cc +1 -1
  139. data/src/core/credentials/transport/tls/spiffe_utils.cc +10 -8
  140. data/src/core/credentials/transport/tls/spiffe_utils.h +2 -2
  141. data/src/core/credentials/transport/tls/ssl_utils.cc +4 -4
  142. data/src/core/credentials/transport/tls/ssl_utils.h +2 -2
  143. data/src/core/credentials/transport/tls/tls_credentials.cc +1 -1
  144. data/src/core/credentials/transport/tls/tls_security_connector.cc +4 -4
  145. data/src/core/credentials/transport/tls/tls_security_connector.h +3 -3
  146. data/src/core/credentials/transport/transport_credentials.cc +1 -1
  147. data/src/core/credentials/transport/transport_credentials.h +2 -2
  148. data/src/core/credentials/transport/xds/xds_credentials.h +1 -1
  149. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +2 -2
  150. data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +4 -1
  151. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +5 -5
  152. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h +2 -2
  153. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +7 -7
  154. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +6 -3
  155. data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.h +1 -1
  156. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +1 -1
  157. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.h +6 -3
  158. data/src/core/ext/filters/gcp_authentication/gcp_authentication_service_config_parser.h +1 -1
  159. data/src/core/ext/filters/http/client/http_client_filter.cc +6 -6
  160. data/src/core/ext/filters/http/client/http_client_filter.h +4 -1
  161. data/src/core/ext/filters/http/client_authority_filter.cc +2 -2
  162. data/src/core/ext/filters/http/client_authority_filter.h +4 -1
  163. data/src/core/ext/filters/http/http_filters_plugin.cc +1 -1
  164. data/src/core/ext/filters/http/message_compress/compression_filter.cc +3 -3
  165. data/src/core/ext/filters/http/message_compress/compression_filter.h +21 -2
  166. data/src/core/ext/filters/http/server/http_server_filter.cc +3 -3
  167. data/src/core/ext/filters/http/server/http_server_filter.h +4 -1
  168. data/src/core/ext/filters/message_size/message_size_filter.cc +2 -2
  169. data/src/core/ext/filters/message_size/message_size_filter.h +8 -2
  170. data/src/core/ext/filters/rbac/rbac_filter.cc +1 -1
  171. data/src/core/ext/filters/rbac/rbac_filter.h +4 -1
  172. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +3 -3
  173. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +1 -1
  174. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +7 -7
  175. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +13 -2
  176. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h +1 -1
  177. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +50 -37
  178. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +2 -3
  179. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +15 -17
  180. data/src/core/ext/transport/chttp2/server/chttp2_server.h +1 -2
  181. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +2 -2
  182. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +210 -60
  183. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +10 -2
  184. data/src/core/ext/transport/chttp2/transport/flow_control.cc +39 -4
  185. data/src/core/ext/transport/chttp2/transport/flow_control.h +213 -78
  186. data/src/core/ext/transport/chttp2/transport/flow_control_manager.h +46 -1
  187. data/src/core/ext/transport/chttp2/transport/frame.cc +147 -21
  188. data/src/core/ext/transport/chttp2/transport/frame.h +44 -10
  189. data/src/core/ext/transport/chttp2/transport/frame_data.cc +2 -2
  190. data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -1
  191. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -2
  192. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +4 -4
  193. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +5 -5
  194. data/src/core/ext/transport/chttp2/transport/frame_security.cc +1 -1
  195. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +7 -15
  196. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +3 -3
  197. data/src/core/ext/transport/chttp2/transport/goaway.cc +129 -0
  198. data/src/core/ext/transport/chttp2/transport/goaway.h +350 -0
  199. data/src/core/ext/transport/chttp2/transport/header_assembler.h +175 -51
  200. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +1 -1
  201. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +4 -4
  202. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.cc +1 -1
  203. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.h +3 -3
  204. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +7 -7
  205. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +4 -4
  206. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +4 -4
  207. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +1 -1
  208. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +1177 -511
  209. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +264 -174
  210. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +1 -1
  211. data/src/core/ext/transport/chttp2/transport/http2_settings.h +6 -4
  212. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.cc +4 -6
  213. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.h +6 -16
  214. data/src/core/ext/transport/chttp2/transport/http2_settings_promises.h +320 -82
  215. data/src/core/ext/transport/chttp2/transport/http2_status.h +7 -1
  216. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +286 -7
  217. data/src/core/ext/transport/chttp2/transport/http2_transport.h +187 -19
  218. data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +57 -1
  219. data/src/core/ext/transport/chttp2/transport/incoming_metadata_tracker.h +128 -0
  220. data/src/core/ext/transport/chttp2/transport/internal.h +25 -5
  221. data/src/core/ext/transport/chttp2/transport/keepalive.cc +12 -5
  222. data/src/core/ext/transport/chttp2/transport/keepalive.h +14 -10
  223. data/src/core/ext/transport/chttp2/transport/message_assembler.h +24 -15
  224. data/src/core/ext/transport/chttp2/transport/parsing.cc +8 -8
  225. data/src/core/ext/transport/chttp2/transport/ping_callbacks.cc +1 -1
  226. data/src/core/ext/transport/chttp2/transport/ping_callbacks.h +3 -3
  227. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +11 -5
  228. data/src/core/ext/transport/chttp2/transport/ping_promise.h +7 -3
  229. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +1 -1
  230. data/src/core/ext/transport/chttp2/transport/security_frame.cc +31 -0
  231. data/src/core/ext/transport/chttp2/transport/security_frame.h +32 -0
  232. data/src/core/ext/transport/chttp2/transport/stream.h +139 -59
  233. data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +225 -98
  234. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +1 -1
  235. data/src/core/ext/transport/chttp2/transport/transport_common.cc +1 -1
  236. data/src/core/ext/transport/chttp2/transport/transport_common.h +5 -0
  237. data/src/core/ext/transport/chttp2/transport/writable_streams.h +27 -11
  238. data/src/core/ext/transport/chttp2/transport/writing.cc +3 -3
  239. data/src/core/ext/transport/inproc/inproc_transport.cc +8 -2
  240. data/src/core/ext/transport/inproc/legacy_inproc_transport.cc +8 -5
  241. data/src/core/filter/auth/auth_filters.h +7 -1
  242. data/src/core/filter/auth/client_auth_filter.cc +2 -2
  243. data/src/core/filter/auth/server_auth_filter.cc +3 -3
  244. data/src/core/filter/blackboard.h +2 -2
  245. data/src/core/filter/filter_args.h +40 -2
  246. data/src/core/handshaker/endpoint_info/endpoint_info_handshaker.cc +2 -2
  247. data/src/core/handshaker/handshaker.cc +5 -5
  248. data/src/core/handshaker/handshaker.h +2 -2
  249. data/src/core/handshaker/http_connect/http_connect_handshaker.cc +5 -5
  250. data/src/core/handshaker/http_connect/http_proxy_mapper.cc +11 -11
  251. data/src/core/handshaker/http_connect/http_proxy_mapper.h +1 -1
  252. data/src/core/handshaker/http_connect/xds_http_proxy_mapper.cc +1 -1
  253. data/src/core/handshaker/http_connect/xds_http_proxy_mapper.h +1 -1
  254. data/src/core/handshaker/proxy_mapper.h +1 -1
  255. data/src/core/handshaker/proxy_mapper_registry.h +1 -1
  256. data/src/core/handshaker/security/legacy_secure_endpoint.cc +4 -4
  257. data/src/core/handshaker/security/pipelined_secure_endpoint.cc +7 -7
  258. data/src/core/handshaker/security/secure_endpoint.cc +15 -5
  259. data/src/core/handshaker/security/security_handshaker.cc +8 -5
  260. data/src/core/handshaker/security/security_handshaker.h +1 -1
  261. data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +4 -4
  262. data/src/core/lib/address_utils/parse_address.cc +5 -5
  263. data/src/core/lib/address_utils/parse_address.h +2 -2
  264. data/src/core/lib/address_utils/sockaddr_utils.cc +4 -4
  265. data/src/core/lib/address_utils/sockaddr_utils.h +1 -1
  266. data/src/core/lib/channel/channel_args.cc +1 -1
  267. data/src/core/lib/channel/channel_args.h +2 -2
  268. data/src/core/lib/channel/channel_stack.cc +22 -21
  269. data/src/core/lib/channel/channel_stack.h +5 -3
  270. data/src/core/lib/channel/channel_stack_builder.cc +8 -4
  271. data/src/core/lib/channel/channel_stack_builder.h +10 -9
  272. data/src/core/lib/channel/channel_stack_builder_impl.cc +7 -13
  273. data/src/core/lib/channel/channel_stack_builder_impl.h +1 -1
  274. data/src/core/lib/channel/connected_channel.cc +2 -2
  275. data/src/core/lib/channel/promise_based_filter.cc +63 -8
  276. data/src/core/lib/channel/promise_based_filter.h +23 -8
  277. data/src/core/lib/compression/compression_internal.cc +4 -4
  278. data/src/core/lib/compression/compression_internal.h +1 -1
  279. data/src/core/lib/compression/message_compress.cc +1 -1
  280. data/src/core/lib/debug/trace.cc +2 -5
  281. data/src/core/lib/debug/trace.h +10 -0
  282. data/src/core/lib/debug/trace_flags.cc +2 -2
  283. data/src/core/lib/debug/trace_flags.h +1 -1
  284. data/src/core/lib/event_engine/ares_resolver.cc +8 -8
  285. data/src/core/lib/event_engine/ares_resolver.h +4 -4
  286. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +1 -1
  287. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +2 -2
  288. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +1 -1
  289. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +2 -2
  290. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.h +1 -1
  291. data/src/core/lib/event_engine/channel_args_endpoint_config.h +1 -1
  292. data/src/core/lib/event_engine/default_event_engine.cc +1 -1
  293. data/src/core/lib/event_engine/event_engine.cc +1 -1
  294. data/src/core/lib/event_engine/extensions/channelz.h +1 -1
  295. data/src/core/lib/event_engine/extensions/chaotic_good_extension.h +1 -1
  296. data/src/core/lib/event_engine/extensions/tcp_trace.h +8 -1
  297. data/src/core/lib/event_engine/grpc_polled_fd.h +1 -1
  298. data/src/core/lib/event_engine/memory_allocator_factory.h +1 -1
  299. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +4 -4
  300. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +5 -5
  301. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +5 -5
  302. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +3 -3
  303. data/src/core/lib/event_engine/posix_engine/event_poller.h +2 -2
  304. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +2 -2
  305. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.cc +1 -1
  306. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.h +1 -1
  307. data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +4 -4
  308. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +1 -1
  309. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +1 -1
  310. data/src/core/lib/event_engine/posix_engine/lockfree_event.h +1 -1
  311. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +3 -3
  312. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h +1 -1
  313. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +5 -5
  314. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +6 -6
  315. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +7 -7
  316. data/src/core/lib/event_engine/posix_engine/posix_engine.h +7 -7
  317. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +7 -4
  318. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +4 -4
  319. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +4 -4
  320. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +1 -1
  321. data/src/core/lib/event_engine/posix_engine/posix_interface.h +1 -1
  322. data/src/core/lib/event_engine/posix_engine/posix_interface_posix.cc +5 -5
  323. data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.h +1 -1
  324. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +1 -1
  325. data/src/core/lib/event_engine/posix_engine/timer.h +1 -1
  326. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +2 -2
  327. data/src/core/lib/event_engine/posix_engine/timer_manager.h +1 -1
  328. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +2 -2
  329. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +2 -2
  330. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +1 -1
  331. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +2 -2
  332. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +1 -1
  333. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +2 -2
  334. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +1 -1
  335. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +2 -2
  336. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +1 -1
  337. data/src/core/lib/event_engine/ref_counted_dns_resolver_interface.h +1 -1
  338. data/src/core/lib/event_engine/tcp_socket_utils.cc +4 -4
  339. data/src/core/lib/event_engine/thread_pool/thread_count.cc +1 -1
  340. data/src/core/lib/event_engine/thread_pool/thread_count.h +1 -1
  341. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +4 -4
  342. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +3 -3
  343. data/src/core/lib/event_engine/utils.cc +3 -3
  344. data/src/core/lib/event_engine/utils.h +1 -1
  345. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +1 -1
  346. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.h +2 -2
  347. data/src/core/lib/event_engine/windows/iocp.cc +1 -1
  348. data/src/core/lib/event_engine/windows/iocp.h +1 -1
  349. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.cc +5 -2
  350. data/src/core/lib/event_engine/windows/win_socket.cc +1 -1
  351. data/src/core/lib/event_engine/windows/win_socket.h +2 -2
  352. data/src/core/lib/event_engine/windows/windows_endpoint.cc +5 -5
  353. data/src/core/lib/event_engine/windows/windows_engine.cc +4 -4
  354. data/src/core/lib/event_engine/windows/windows_engine.h +3 -3
  355. data/src/core/lib/event_engine/windows/windows_listener.cc +3 -3
  356. data/src/core/lib/event_engine/windows/windows_listener.h +2 -2
  357. data/src/core/lib/event_engine/work_queue/basic_work_queue.h +2 -2
  358. data/src/core/lib/experiments/config.cc +4 -4
  359. data/src/core/lib/experiments/experiments.cc +174 -48
  360. data/src/core/lib/experiments/experiments.h +76 -24
  361. data/src/core/lib/iomgr/buffer_list.cc +1 -1
  362. data/src/core/lib/iomgr/call_combiner.cc +1 -1
  363. data/src/core/lib/iomgr/call_combiner.h +2 -2
  364. data/src/core/lib/iomgr/cfstream_handle.cc +1 -1
  365. data/src/core/lib/iomgr/closure.h +2 -2
  366. data/src/core/lib/iomgr/combiner.cc +2 -2
  367. data/src/core/lib/iomgr/endpoint.h +1 -1
  368. data/src/core/lib/iomgr/endpoint_cfstream.cc +1 -1
  369. data/src/core/lib/iomgr/endpoint_pair_posix.cc +1 -1
  370. data/src/core/lib/iomgr/endpoint_pair_windows.cc +1 -1
  371. data/src/core/lib/iomgr/error.cc +1 -1
  372. data/src/core/lib/iomgr/error.h +2 -2
  373. data/src/core/lib/iomgr/error_cfstream.cc +1 -1
  374. data/src/core/lib/iomgr/ev_apple.cc +1 -1
  375. data/src/core/lib/iomgr/ev_epoll1_linux.cc +4 -4
  376. data/src/core/lib/iomgr/ev_poll_posix.cc +3 -3
  377. data/src/core/lib/iomgr/ev_posix.cc +3 -3
  378. data/src/core/lib/iomgr/event_engine_shims/closure.cc +3 -3
  379. data/src/core/lib/iomgr/event_engine_shims/closure.h +1 -1
  380. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +5 -5
  381. data/src/core/lib/iomgr/event_engine_shims/tcp_client.cc +2 -2
  382. data/src/core/lib/iomgr/exec_ctx.cc +3 -3
  383. data/src/core/lib/iomgr/exec_ctx.h +1 -1
  384. data/src/core/lib/iomgr/fork_posix.cc +1 -1
  385. data/src/core/lib/iomgr/internal_errqueue.cc +1 -1
  386. data/src/core/lib/iomgr/iocp_windows.cc +1 -1
  387. data/src/core/lib/iomgr/iomgr.cc +1 -1
  388. data/src/core/lib/iomgr/lockfree_event.cc +1 -1
  389. data/src/core/lib/iomgr/polling_entity.cc +1 -1
  390. data/src/core/lib/iomgr/resolve_address.cc +1 -1
  391. data/src/core/lib/iomgr/resolve_address.h +2 -2
  392. data/src/core/lib/iomgr/resolve_address_posix.cc +4 -4
  393. data/src/core/lib/iomgr/resolve_address_windows.cc +1 -1
  394. data/src/core/lib/iomgr/sockaddr_utils_posix.cc +1 -1
  395. data/src/core/lib/iomgr/socket_utils_common_posix.cc +2 -2
  396. data/src/core/lib/iomgr/socket_windows.cc +2 -2
  397. data/src/core/lib/iomgr/tcp_client_cfstream.cc +1 -1
  398. data/src/core/lib/iomgr/tcp_client_posix.cc +3 -3
  399. data/src/core/lib/iomgr/tcp_posix.cc +5 -5
  400. data/src/core/lib/iomgr/tcp_server_posix.cc +20 -9
  401. data/src/core/lib/iomgr/tcp_server_utils_posix.h +1 -1
  402. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +2 -2
  403. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +2 -2
  404. data/src/core/lib/iomgr/tcp_server_windows.cc +2 -2
  405. data/src/core/lib/iomgr/tcp_windows.cc +1 -1
  406. data/src/core/lib/iomgr/timer_generic.cc +3 -3
  407. data/src/core/lib/iomgr/timer_manager.cc +1 -1
  408. data/src/core/lib/iomgr/unix_sockets_posix.cc +1 -1
  409. data/src/core/lib/iomgr/unix_sockets_posix.h +1 -1
  410. data/src/core/lib/iomgr/vsock.cc +1 -1
  411. data/src/core/lib/iomgr/vsock.h +1 -1
  412. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +1 -1
  413. data/src/core/lib/promise/activity.cc +2 -2
  414. data/src/core/lib/promise/activity.h +5 -4
  415. data/src/core/lib/promise/all_ok.h +3 -3
  416. data/src/core/lib/promise/arena_promise.h +47 -6
  417. data/src/core/lib/promise/context.h +1 -1
  418. data/src/core/lib/promise/detail/join_state.h +1 -1
  419. data/src/core/lib/promise/detail/promise_factory.h +1 -1
  420. data/src/core/lib/promise/detail/promise_like.h +1 -1
  421. data/src/core/lib/promise/detail/seq_state.h +3 -3
  422. data/src/core/lib/promise/detail/status.h +1 -1
  423. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +1 -1
  424. data/src/core/lib/promise/for_each.h +3 -3
  425. data/src/core/lib/promise/if.h +1 -1
  426. data/src/core/lib/promise/inter_activity_latch.h +3 -3
  427. data/src/core/lib/promise/inter_activity_mutex.h +1 -1
  428. data/src/core/lib/promise/interceptor_list.h +3 -3
  429. data/src/core/lib/promise/latch.h +2 -2
  430. data/src/core/lib/promise/loop.h +2 -2
  431. data/src/core/lib/promise/map.h +2 -2
  432. data/src/core/lib/promise/mpsc.cc +5 -4
  433. data/src/core/lib/promise/observable.h +2 -2
  434. data/src/core/lib/promise/party.cc +14 -8
  435. data/src/core/lib/promise/party.h +11 -4
  436. data/src/core/lib/promise/pipe.h +16 -2
  437. data/src/core/lib/promise/poll.h +2 -2
  438. data/src/core/lib/promise/promise.h +2 -2
  439. data/src/core/lib/promise/sleep.h +1 -1
  440. data/src/core/lib/promise/status_flag.h +2 -2
  441. data/src/core/lib/promise/try_join.h +3 -3
  442. data/src/core/lib/promise/try_seq.h +3 -3
  443. data/src/core/lib/promise/wait_set.h +2 -2
  444. data/src/core/lib/resource_quota/api.cc +1 -1
  445. data/src/core/lib/resource_quota/arena.cc +1 -1
  446. data/src/core/lib/resource_quota/connection_quota.h +1 -1
  447. data/src/core/lib/resource_quota/memory_quota.cc +3 -3
  448. data/src/core/lib/resource_quota/memory_quota.h +9 -5
  449. data/src/core/lib/resource_quota/periodic_update.h +1 -1
  450. data/src/core/lib/resource_quota/resource_quota.cc +8 -0
  451. data/src/core/lib/resource_quota/resource_quota.h +2 -1
  452. data/src/core/lib/resource_quota/stream_quota.cc +22 -0
  453. data/src/core/lib/resource_quota/stream_quota.h +31 -0
  454. data/src/core/lib/resource_quota/telemetry.h +1 -0
  455. data/src/core/lib/resource_quota/thread_quota.h +1 -1
  456. data/src/core/lib/security/authorization/audit_logging.cc +3 -3
  457. data/src/core/lib/security/authorization/audit_logging.h +1 -1
  458. data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
  459. data/src/core/lib/security/authorization/evaluate_args.cc +5 -5
  460. data/src/core/lib/security/authorization/evaluate_args.h +1 -1
  461. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +3 -3
  462. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +4 -1
  463. data/src/core/lib/security/authorization/matchers.cc +2 -2
  464. data/src/core/lib/security/authorization/stdout_logger.cc +1 -1
  465. data/src/core/lib/slice/percent_encoding.cc +1 -1
  466. data/src/core/lib/slice/slice.cc +1 -1
  467. data/src/core/lib/slice/slice.h +2 -2
  468. data/src/core/lib/slice/slice_buffer.cc +1 -1
  469. data/src/core/lib/slice/slice_internal.h +1 -1
  470. data/src/core/lib/surface/call.cc +42 -14
  471. data/src/core/lib/surface/call.h +12 -5
  472. data/src/core/lib/surface/call_log_batch.cc +2 -2
  473. data/src/core/lib/surface/call_utils.cc +5 -5
  474. data/src/core/lib/surface/call_utils.h +83 -18
  475. data/src/core/lib/surface/channel.cc +2 -1
  476. data/src/core/lib/surface/channel.h +13 -3
  477. data/src/core/lib/surface/channel_create.cc +2 -2
  478. data/src/core/lib/surface/channel_create.h +1 -1
  479. data/src/core/lib/surface/channel_init.cc +5 -5
  480. data/src/core/lib/surface/channel_init.h +4 -2
  481. data/src/core/lib/surface/completion_queue.cc +4 -4
  482. data/src/core/lib/surface/filter_stack_call.cc +13 -8
  483. data/src/core/lib/surface/filter_stack_call.h +3 -3
  484. data/src/core/lib/surface/init.cc +4 -4
  485. data/src/core/lib/surface/lame_client.cc +2 -2
  486. data/src/core/lib/surface/lame_client.h +3 -3
  487. data/src/core/lib/surface/legacy_channel.cc +3 -3
  488. data/src/core/lib/surface/legacy_channel.h +1 -1
  489. data/src/core/lib/surface/validate_metadata.cc +2 -2
  490. data/src/core/lib/surface/validate_metadata.h +1 -1
  491. data/src/core/lib/surface/version.cc +2 -2
  492. data/src/core/lib/transport/bdp_estimator.cc +1 -1
  493. data/src/core/lib/transport/bdp_estimator.h +2 -2
  494. data/src/core/lib/transport/connectivity_state.cc +1 -1
  495. data/src/core/lib/transport/connectivity_state.h +2 -2
  496. data/src/core/lib/transport/error_utils.h +1 -1
  497. data/src/core/lib/transport/promise_endpoint.cc +1 -1
  498. data/src/core/lib/transport/promise_endpoint.h +3 -3
  499. data/src/core/lib/transport/timeout_encoding.cc +1 -1
  500. data/src/core/lib/transport/transport.cc +3 -3
  501. data/src/core/lib/transport/transport.h +62 -4
  502. data/src/core/lib/transport/transport_framing_endpoint_extension.h +1 -1
  503. data/src/core/lib/transport/transport_op_string.cc +2 -2
  504. data/src/core/load_balancing/address_filtering.cc +1 -1
  505. data/src/core/load_balancing/address_filtering.h +2 -2
  506. data/src/core/load_balancing/backend_metric_parser.cc +1 -1
  507. data/src/core/load_balancing/backend_metric_parser.h +1 -1
  508. data/src/core/load_balancing/child_policy_handler.cc +4 -4
  509. data/src/core/load_balancing/child_policy_handler.h +2 -2
  510. data/src/core/load_balancing/delegating_helper.h +2 -2
  511. data/src/core/load_balancing/endpoint_list.cc +4 -4
  512. data/src/core/load_balancing/endpoint_list.h +2 -2
  513. data/src/core/load_balancing/grpclb/client_load_reporting_filter.cc +7 -5
  514. data/src/core/load_balancing/grpclb/client_load_reporting_filter.h +5 -1
  515. data/src/core/load_balancing/grpclb/grpclb.cc +13 -24
  516. data/src/core/load_balancing/grpclb/grpclb_client_stats.h +2 -2
  517. data/src/core/load_balancing/grpclb/load_balancer_api.cc +1 -1
  518. data/src/core/load_balancing/grpclb/load_balancer_api.h +1 -1
  519. data/src/core/load_balancing/health_check_client.cc +9 -5
  520. data/src/core/load_balancing/health_check_client_internal.h +3 -3
  521. data/src/core/load_balancing/lb_policy.h +11 -8
  522. data/src/core/load_balancing/lb_policy_factory.h +2 -2
  523. data/src/core/load_balancing/lb_policy_registry.cc +2 -2
  524. data/src/core/load_balancing/lb_policy_registry.h +2 -2
  525. data/src/core/load_balancing/oob_backend_metric.cc +7 -3
  526. data/src/core/load_balancing/oob_backend_metric_internal.h +2 -2
  527. data/src/core/load_balancing/outlier_detection/outlier_detection.cc +7 -15
  528. data/src/core/load_balancing/pick_first/pick_first.cc +48 -18
  529. data/src/core/load_balancing/priority/priority.cc +6 -6
  530. data/src/core/load_balancing/ring_hash/ring_hash.cc +8 -8
  531. data/src/core/load_balancing/rls/rls.cc +10 -10
  532. data/src/core/load_balancing/round_robin/round_robin.cc +7 -7
  533. data/src/core/load_balancing/subchannel_interface.h +2 -2
  534. data/src/core/load_balancing/weighted_round_robin/static_stride_scheduler.cc +1 -1
  535. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +9 -15
  536. data/src/core/load_balancing/weighted_target/weighted_target.cc +9 -9
  537. data/src/core/load_balancing/xds/cds.cc +5 -5
  538. data/src/core/load_balancing/xds/xds_cluster_impl.cc +22 -39
  539. data/src/core/load_balancing/xds/xds_cluster_manager.cc +6 -6
  540. data/src/core/load_balancing/xds/xds_override_host.cc +10 -10
  541. data/src/core/load_balancing/xds/xds_override_host.h +1 -1
  542. data/src/core/load_balancing/xds/xds_wrr_locality.cc +5 -5
  543. data/src/core/resolver/dns/c_ares/dns_resolver_ares.cc +8 -8
  544. data/src/core/resolver/dns/c_ares/dns_resolver_ares.h +1 -1
  545. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -1
  546. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
  547. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +2 -2
  548. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +6 -6
  549. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.h +2 -2
  550. data/src/core/resolver/dns/dns_resolver_plugin.cc +2 -2
  551. data/src/core/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +8 -8
  552. data/src/core/resolver/dns/event_engine/event_engine_client_channel_resolver.h +1 -1
  553. data/src/core/resolver/dns/event_engine/service_config_helper.cc +2 -2
  554. data/src/core/resolver/dns/native/dns_resolver.cc +7 -7
  555. data/src/core/resolver/endpoint_addresses.cc +4 -4
  556. data/src/core/resolver/endpoint_addresses.h +1 -1
  557. data/src/core/resolver/fake/fake_resolver.cc +1 -1
  558. data/src/core/resolver/fake/fake_resolver.h +3 -3
  559. data/src/core/resolver/google_c2p/google_c2p_resolver.cc +5 -5
  560. data/src/core/resolver/polling_resolver.cc +5 -5
  561. data/src/core/resolver/polling_resolver.h +1 -1
  562. data/src/core/resolver/resolver.h +2 -2
  563. data/src/core/resolver/resolver_factory.h +2 -2
  564. data/src/core/resolver/resolver_registry.cc +1 -1
  565. data/src/core/resolver/resolver_registry.h +1 -1
  566. data/src/core/resolver/sockaddr/sockaddr_resolver.cc +4 -4
  567. data/src/core/resolver/xds/xds_config.cc +1 -1
  568. data/src/core/resolver/xds/xds_config.h +3 -3
  569. data/src/core/resolver/xds/xds_dependency_manager.cc +2 -2
  570. data/src/core/resolver/xds/xds_dependency_manager.h +3 -3
  571. data/src/core/resolver/xds/xds_resolver.cc +16 -13
  572. data/src/core/resolver/xds/xds_resolver_attributes.h +1 -1
  573. data/src/core/server/add_port.cc +2 -2
  574. data/src/core/server/server.cc +9 -5
  575. data/src/core/server/server.h +8 -7
  576. data/src/core/server/server_call_tracer_filter.cc +1 -1
  577. data/src/core/server/server_call_tracer_filter.h +5 -1
  578. data/src/core/server/server_config_selector.h +2 -2
  579. data/src/core/server/server_config_selector_filter.cc +3 -3
  580. data/src/core/server/xds_channel_stack_modifier.cc +3 -2
  581. data/src/core/server/xds_channel_stack_modifier.h +1 -1
  582. data/src/core/server/xds_server_config_fetcher.cc +10 -10
  583. data/src/core/service_config/service_config.h +1 -1
  584. data/src/core/service_config/service_config_channel_arg_filter.h +4 -1
  585. data/src/core/service_config/service_config_impl.cc +3 -3
  586. data/src/core/service_config/service_config_impl.h +2 -2
  587. data/src/core/service_config/service_config_parser.h +1 -1
  588. data/src/core/telemetry/call_tracer.h +2 -2
  589. data/src/core/telemetry/default_tcp_tracer.h +3 -3
  590. data/src/core/telemetry/histogram.h +1 -1
  591. data/src/core/telemetry/instrument.cc +550 -270
  592. data/src/core/telemetry/instrument.h +301 -128
  593. data/src/core/telemetry/metrics.cc +2 -0
  594. data/src/core/telemetry/metrics.h +33 -4
  595. data/src/core/telemetry/stats.h +2 -2
  596. data/src/core/telemetry/stats_data.cc +1 -1
  597. data/src/core/telemetry/stats_data.h +2 -2
  598. data/src/core/transport/auth_context.cc +1 -1
  599. data/src/core/transport/auth_context.h +2 -1
  600. data/src/core/transport/auth_context_comparator_registry.h +1 -1
  601. data/src/core/tsi/alts/crypt/aes_gcm.cc +1 -1
  602. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +2 -2
  603. data/src/core/tsi/alts/frame_protector/frame_handler.cc +1 -1
  604. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +3 -3
  605. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -1
  606. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +9 -7
  607. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +1 -1
  608. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -1
  609. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +1 -1
  610. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +11 -3
  611. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h +10 -0
  612. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +9 -1
  613. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +3 -0
  614. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +15 -2
  615. data/src/core/tsi/fake_transport_security.cc +2 -1
  616. data/src/core/tsi/local_transport_security.cc +1 -1
  617. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +1 -1
  618. data/src/core/tsi/ssl/key_logging/ssl_key_logging.h +1 -1
  619. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +1 -1
  620. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +1 -1
  621. data/src/core/tsi/ssl_transport_security.cc +6 -6
  622. data/src/core/tsi/ssl_transport_security.h +1 -1
  623. data/src/core/tsi/ssl_transport_security_utils.cc +2 -2
  624. data/src/core/tsi/ssl_transport_security_utils.h +2 -2
  625. data/src/core/tsi/transport_security_grpc.cc +8 -0
  626. data/src/core/tsi/transport_security_grpc.h +15 -0
  627. data/src/core/util/alloc.cc +1 -1
  628. data/src/core/util/backoff.h +1 -1
  629. data/src/core/util/crash.h +1 -1
  630. data/src/core/util/dual_ref_counted.h +2 -2
  631. data/src/core/util/event_log.cc +1 -1
  632. data/src/core/util/event_log.h +3 -3
  633. data/src/core/util/gcp_metadata_query.cc +5 -5
  634. data/src/core/util/gcp_metadata_query.h +2 -2
  635. data/src/core/util/grpc_check.cc +2 -0
  636. data/src/core/util/grpc_check.h +1 -1
  637. data/src/core/util/grpc_if_nametoindex_posix.cc +1 -1
  638. data/src/core/util/grpc_if_nametoindex_unsupported.cc +1 -1
  639. data/src/core/util/http_client/format_request.cc +1 -1
  640. data/src/core/util/http_client/httpcli.cc +3 -3
  641. data/src/core/util/http_client/httpcli.h +4 -4
  642. data/src/core/util/http_client/httpcli_security_connector.cc +4 -4
  643. data/src/core/util/http_client/parser.cc +1 -1
  644. data/src/core/util/json/json_channel_args.h +1 -1
  645. data/src/core/util/json/json_object_loader.h +6 -6
  646. data/src/core/util/json/json_reader.cc +2 -2
  647. data/src/core/util/json/json_reader.h +1 -1
  648. data/src/core/util/json/json_util.h +3 -3
  649. data/src/core/util/json/json_writer.cc +1 -1
  650. data/src/core/util/latent_see.cc +45 -24
  651. data/src/core/util/latent_see.h +192 -24
  652. data/src/core/util/linux/cpu.cc +1 -1
  653. data/src/core/util/load_file.cc +1 -1
  654. data/src/core/util/load_file.h +1 -1
  655. data/src/core/util/log.cc +3 -3
  656. data/src/core/util/lru_cache.h +1 -1
  657. data/src/core/util/matchers.h +1 -1
  658. data/src/core/util/memory_usage.h +3 -3
  659. data/src/core/util/mpscq.h +1 -1
  660. data/src/core/util/notification.h +1 -1
  661. data/src/core/util/posix/cpu.cc +1 -1
  662. data/src/core/util/posix/stat.cc +2 -2
  663. data/src/core/util/posix/thd.cc +2 -2
  664. data/src/core/util/posix/tmpfile.cc +2 -2
  665. data/src/core/util/ref_counted.h +2 -2
  666. data/src/core/util/ref_counted_ptr.h +1 -1
  667. data/src/core/util/ref_counted_string.h +1 -1
  668. data/src/core/util/single_set_ptr.h +3 -1
  669. data/src/core/util/status_helper.cc +8 -8
  670. data/src/core/util/status_helper.h +1 -1
  671. data/src/core/util/string.cc +2 -2
  672. data/src/core/util/sync_abseil.cc +1 -1
  673. data/src/core/util/table.h +1 -1
  674. data/src/core/util/time.cc +1 -1
  675. data/src/core/util/time_precise.cc +1 -1
  676. data/src/core/util/unique_ptr_with_bitset.h +1 -1
  677. data/src/core/util/unique_type_name.h +1 -1
  678. data/src/core/util/upb_utils.h +6 -1
  679. data/src/core/util/validation_errors.cc +2 -2
  680. data/src/core/util/validation_errors.h +2 -3
  681. data/src/core/util/wait_for_single_owner.h +2 -2
  682. data/src/core/util/windows/directory_reader.cc +1 -1
  683. data/src/core/util/windows/stat.cc +2 -2
  684. data/src/core/util/windows/thd.cc +2 -2
  685. data/src/core/util/windows/time.cc +1 -1
  686. data/src/core/util/work_serializer.cc +3 -3
  687. data/src/core/util/work_serializer.h +2 -2
  688. data/src/core/xds/grpc/certificate_provider_store.cc +2 -2
  689. data/src/core/xds/grpc/certificate_provider_store.h +2 -2
  690. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.cc +3 -3
  691. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.h +1 -1
  692. data/src/core/xds/grpc/xds_audit_logger_registry.cc +3 -3
  693. data/src/core/xds/grpc/xds_audit_logger_registry.h +1 -1
  694. data/src/core/xds/grpc/xds_bootstrap_grpc.cc +7 -7
  695. data/src/core/xds/grpc/xds_bootstrap_grpc.h +2 -2
  696. data/src/core/xds/grpc/xds_certificate_provider.cc +1 -1
  697. data/src/core/xds/grpc/xds_certificate_provider.h +2 -2
  698. data/src/core/xds/grpc/xds_client_grpc.cc +5 -5
  699. data/src/core/xds/grpc/xds_client_grpc.h +2 -2
  700. data/src/core/xds/grpc/xds_cluster.cc +2 -2
  701. data/src/core/xds/grpc/xds_cluster.h +1 -1
  702. data/src/core/xds/grpc/xds_cluster_parser.cc +5 -5
  703. data/src/core/xds/grpc/xds_cluster_parser.h +1 -1
  704. data/src/core/xds/grpc/xds_cluster_specifier_plugin.cc +2 -2
  705. data/src/core/xds/grpc/xds_cluster_specifier_plugin.h +1 -1
  706. data/src/core/xds/grpc/xds_common_types.cc +1 -1
  707. data/src/core/xds/grpc/xds_common_types.h +1 -1
  708. data/src/core/xds/grpc/xds_common_types_parser.cc +5 -5
  709. data/src/core/xds/grpc/xds_endpoint.h +2 -2
  710. data/src/core/xds/grpc/xds_endpoint_parser.cc +5 -5
  711. data/src/core/xds/grpc/xds_endpoint_parser.h +1 -1
  712. data/src/core/xds/grpc/xds_health_status.cc +1 -1
  713. data/src/core/xds/grpc/xds_health_status.h +1 -1
  714. data/src/core/xds/grpc/xds_http_fault_filter.cc +4 -4
  715. data/src/core/xds/grpc/xds_http_fault_filter.h +2 -2
  716. data/src/core/xds/grpc/xds_http_filter.h +3 -3
  717. data/src/core/xds/grpc/xds_http_filter_registry.h +2 -2
  718. data/src/core/xds/grpc/xds_http_gcp_authn_filter.cc +3 -3
  719. data/src/core/xds/grpc/xds_http_gcp_authn_filter.h +2 -2
  720. data/src/core/xds/grpc/xds_http_rbac_filter.cc +4 -4
  721. data/src/core/xds/grpc/xds_http_rbac_filter.h +2 -2
  722. data/src/core/xds/grpc/xds_http_stateful_session_filter.cc +3 -3
  723. data/src/core/xds/grpc/xds_http_stateful_session_filter.h +2 -2
  724. data/src/core/xds/grpc/xds_lb_policy_registry.cc +1 -1
  725. data/src/core/xds/grpc/xds_lb_policy_registry.h +1 -1
  726. data/src/core/xds/grpc/xds_listener.cc +2 -2
  727. data/src/core/xds/grpc/xds_listener_parser.cc +6 -6
  728. data/src/core/xds/grpc/xds_listener_parser.h +1 -1
  729. data/src/core/xds/grpc/xds_matcher.cc +1 -1
  730. data/src/core/xds/grpc/xds_matcher.h +3 -3
  731. data/src/core/xds/grpc/xds_matcher_input.h +1 -1
  732. data/src/core/xds/grpc/xds_metadata.cc +1 -1
  733. data/src/core/xds/grpc/xds_metadata.h +3 -3
  734. data/src/core/xds/grpc/xds_metadata_parser.cc +2 -2
  735. data/src/core/xds/grpc/xds_route_config.cc +3 -3
  736. data/src/core/xds/grpc/xds_route_config_parser.cc +8 -8
  737. data/src/core/xds/grpc/xds_route_config_parser.h +1 -1
  738. data/src/core/xds/grpc/xds_routing.cc +4 -4
  739. data/src/core/xds/grpc/xds_routing.h +2 -2
  740. data/src/core/xds/grpc/xds_server_grpc.cc +2 -2
  741. data/src/core/xds/grpc/xds_transport_grpc.cc +1 -1
  742. data/src/core/xds/grpc/xds_transport_grpc.h +2 -2
  743. data/src/core/xds/xds_client/lrs_client.cc +3 -3
  744. data/src/core/xds/xds_client/lrs_client.h +4 -4
  745. data/src/core/xds/xds_client/xds_api.h +1 -1
  746. data/src/core/xds/xds_client/xds_backend_metric_propagation.cc +1 -1
  747. data/src/core/xds/xds_client/xds_backend_metric_propagation.h +1 -1
  748. data/src/core/xds/xds_client/xds_client.cc +8 -8
  749. data/src/core/xds/xds_client/xds_client.h +5 -5
  750. data/src/core/xds/xds_client/xds_locality.h +2 -2
  751. data/src/core/xds/xds_client/xds_resource_type.h +2 -2
  752. data/src/core/xds/xds_client/xds_resource_type_impl.h +1 -1
  753. data/src/core/xds/xds_client/xds_transport.h +2 -2
  754. data/src/ruby/ext/grpc/extconf.rb +14 -12
  755. data/src/ruby/ext/grpc/rb_call.c +0 -1
  756. data/src/ruby/ext/grpc/rb_channel_args.c +0 -1
  757. data/src/ruby/ext/grpc/rb_channel_credentials.c +0 -1
  758. data/src/ruby/ext/grpc/rb_compression_options.c +0 -1
  759. data/src/ruby/ext/grpc/rb_server_credentials.c +0 -1
  760. data/src/ruby/ext/grpc/rb_xds_channel_credentials.c +0 -1
  761. data/src/ruby/ext/grpc/rb_xds_server_credentials.c +0 -1
  762. data/src/ruby/lib/grpc/version.rb +1 -1
  763. metadata +16 -6
@@ -22,9 +22,9 @@
22
22
 
23
23
  #include <grpc/support/port_platform.h>
24
24
 
25
- #include "absl/strings/str_cat.h"
26
25
  #include "src/core/ext/transport/chttp2/transport/http2_status.h"
27
26
  #include "src/core/util/useful.h"
27
+ #include "absl/strings/str_cat.h"
28
28
 
29
29
  using grpc_core::http2::Http2ErrorCode;
30
30
 
@@ -23,11 +23,11 @@
23
23
  #include <cstdint>
24
24
  #include <optional>
25
25
 
26
- #include "absl/functional/function_ref.h"
27
- #include "absl/strings/string_view.h"
28
26
  #include "src/core/channelz/property_list.h"
29
27
  #include "src/core/ext/transport/chttp2/transport/http2_status.h"
30
28
  #include "src/core/util/useful.h"
29
+ #include "absl/functional/function_ref.h"
30
+ #include "absl/strings/string_view.h"
31
31
 
32
32
  namespace grpc_core {
33
33
 
@@ -193,10 +193,12 @@ class Http2Settings {
193
193
  bool enable_push_ = true;
194
194
 
195
195
  // gRPC defined setting
196
- // Unlike most other SETTINGS, this setting is negotiated between the client
197
- // and the server.
198
196
  // Currently this is set only once in the lifetime of a transport.
199
197
  // Disconnect if it is received more than once from the peer.
198
+ // Non-Binary Metadata (usually UTF-8) is ALWAYS valid irrespective of this
199
+ // flag. Both peers can send each other the default non-binary METADATA
200
+ // irrespective of this flag. This flag says if we are willing to accept
201
+ // Binary-Metadata from the peer or not.
200
202
  bool allow_true_binary_metadata_ = false;
201
203
 
202
204
  // gRPC defined setting
@@ -22,18 +22,16 @@
22
22
 
23
23
  #include <grpc/support/port_platform.h>
24
24
 
25
- #include "absl/strings/str_cat.h"
25
+ #include <cstdint>
26
+ #include <optional>
27
+ #include <utility>
28
+
26
29
  #include "src/core/ext/transport/chttp2/transport/frame.h"
27
30
  #include "src/core/ext/transport/chttp2/transport/http2_settings.h"
28
- #include "src/core/ext/transport/chttp2/transport/http2_status.h"
29
- #include "src/core/util/useful.h"
30
31
 
31
32
  namespace grpc_core {
32
33
 
33
34
  std::optional<Http2SettingsFrame> Http2SettingsManager::MaybeSendUpdate() {
34
- if (!IsPreviousSettingsPromiseResolved()) {
35
- return std::nullopt;
36
- }
37
35
  switch (update_state_) {
38
36
  case UpdateState::kSending:
39
37
  return std::nullopt;
@@ -22,19 +22,18 @@
22
22
 
23
23
  #include <cstdint>
24
24
  #include <optional>
25
- #include <queue>
25
+ #include <vector>
26
26
 
27
- #include "absl/functional/function_ref.h"
28
- #include "absl/strings/string_view.h"
29
27
  #include "src/core/channelz/property_list.h"
30
28
  #include "src/core/ext/transport/chttp2/transport/frame.h"
31
29
  #include "src/core/ext/transport/chttp2/transport/http2_settings.h"
32
30
  #include "src/core/ext/transport/chttp2/transport/http2_status.h"
33
- #include "src/core/lib/channel/channel_args.h"
34
- #include "src/core/util/useful.h"
31
+ #include "absl/strings/string_view.h"
35
32
 
36
33
  namespace grpc_core {
37
34
 
35
+ // TODO(tjagtap) [PH2][P1][Settings] : Add new DCHECKs to PH2-Only functions in
36
+ // this class.
38
37
  class Http2SettingsManager {
39
38
  public:
40
39
  // Only local and peer settings can be edited by the transport.
@@ -55,7 +54,7 @@ class Http2SettingsManager {
55
54
  .SetColumn("acked", acked_.ChannelzProperties());
56
55
  }
57
56
 
58
- // Returns nullopt if we don't need to send a SETTINGS frame to the peer.
57
+ // Returns std::nullopt if we don't need to send a SETTINGS frame to the peer.
59
58
  // Returns Http2SettingsFrame if we need to send a SETTINGS frame to the
60
59
  // peer. Transport MUST send a frame returned by this function to the peer.
61
60
  // This function is not idempotent.
@@ -63,7 +62,7 @@ class Http2SettingsManager {
63
62
 
64
63
  // To be called from a promise based HTTP2 transport only
65
64
  http2::Http2ErrorCode ApplyIncomingSettings(
66
- std::vector<Http2SettingsFrame::Setting>& settings) {
65
+ const std::vector<Http2SettingsFrame::Setting>& settings) {
67
66
  for (const auto& setting : settings) {
68
67
  http2::Http2ErrorCode error1 =
69
68
  count_updates_.IsUpdatePermitted(setting.id, setting.value, peer_);
@@ -82,13 +81,6 @@ class Http2SettingsManager {
82
81
  // This function is not idempotent.
83
82
  GRPC_MUST_USE_RESULT bool AckLastSend();
84
83
 
85
- GRPC_MUST_USE_RESULT bool IsPreviousSettingsPromiseResolved() const {
86
- return did_previous_settings_promise_resolve_;
87
- }
88
- void SetPreviousSettingsPromiseResolved(const bool value) {
89
- did_previous_settings_promise_resolve_ = value;
90
- }
91
-
92
84
  private:
93
85
  struct CountUpdates {
94
86
  http2::Http2ErrorCode IsUpdatePermitted(const uint16_t setting_id,
@@ -144,8 +136,6 @@ class Http2SettingsManager {
144
136
  Http2Settings local_;
145
137
  Http2Settings sent_;
146
138
  Http2Settings acked_;
147
-
148
- bool did_previous_settings_promise_resolve_ = true;
149
139
  };
150
140
 
151
141
  } // namespace grpc_core
@@ -19,159 +19,397 @@
19
19
  #ifndef GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HTTP2_SETTINGS_PROMISES_H
20
20
  #define GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HTTP2_SETTINGS_PROMISES_H
21
21
 
22
+ #include <grpc/event_engine/event_engine.h>
22
23
  #include <grpc/support/port_platform.h>
23
- #include <stdint.h>
24
24
 
25
+ #include <algorithm>
25
26
  #include <cstdint>
26
27
  #include <optional>
27
- #include <queue>
28
+ #include <string>
29
+ #include <utility>
30
+ #include <vector>
28
31
 
29
- #include "absl/functional/function_ref.h"
30
- #include "absl/strings/string_view.h"
31
32
  #include "src/core/channelz/property_list.h"
33
+ #include "src/core/ext/transport/chttp2/transport/flow_control.h"
32
34
  #include "src/core/ext/transport/chttp2/transport/frame.h"
33
35
  #include "src/core/ext/transport/chttp2/transport/http2_settings.h"
34
36
  #include "src/core/ext/transport/chttp2/transport/http2_settings_manager.h"
35
37
  #include "src/core/ext/transport/chttp2/transport/http2_status.h"
36
38
  #include "src/core/lib/channel/channel_args.h"
39
+ #include "src/core/lib/iomgr/exec_ctx.h"
40
+ #include "src/core/lib/promise/activity.h"
41
+ #include "src/core/lib/promise/context.h"
42
+ #include "src/core/lib/promise/poll.h"
43
+ #include "src/core/lib/promise/promise.h"
37
44
  #include "src/core/lib/promise/race.h"
38
45
  #include "src/core/lib/promise/sleep.h"
39
46
  #include "src/core/lib/promise/try_seq.h"
47
+ #include "src/core/lib/slice/slice_buffer.h"
40
48
  #include "src/core/util/grpc_check.h"
49
+ #include "src/core/util/ref_counted.h"
41
50
  #include "src/core/util/time.h"
42
- #include "src/core/util/useful.h"
51
+ #include "absl/functional/any_invocable.h"
52
+ #include "absl/log/log.h"
53
+ #include "absl/status/status.h"
54
+ #include "absl/status/statusor.h"
55
+ #include "absl/strings/str_cat.h"
56
+ #include "absl/types/span.h"
57
+
43
58
  namespace grpc_core {
44
59
 
45
60
  // Timeout for getting an ack back on settings changes
46
61
  #define GRPC_ARG_SETTINGS_TIMEOUT "grpc.http2.settings_timeout"
47
62
 
48
- #define GRPC_SETTINGS_TIMEOUT_DLOG DLOG(INFO)
63
+ #define GRPC_SETTINGS_TIMEOUT_DLOG \
64
+ DLOG_IF(INFO, GRPC_TRACE_FLAG_ENABLED(http2_ph2_transport))
49
65
 
50
66
  // This class can only be used only from a promise based HTTP2 transports
51
67
  // general_party_ .
52
68
  // This class is designed with the assumption that only 1 SETTINGS frame will be
53
69
  // in flight at a time. And we do not send a second SETTINGS frame till we
54
- // receive and process the SETTINGS ACK.
55
- class SettingsTimeoutManager {
70
+ // receive and process the SETTINGS ACK and resolve the ACK promise.
71
+ class SettingsPromiseManager final : public RefCounted<SettingsPromiseManager> {
56
72
  public:
73
+ explicit SettingsPromiseManager(
74
+ absl::AnyInvocable<void(absl::StatusOr<uint32_t>)> on_receive_settings)
75
+ : on_receive_first_settings_(std::move(on_receive_settings)),
76
+ state_(SettingsState::kWaitingForFirstPeerSettings) {}
77
+
78
+ ~SettingsPromiseManager() override {
79
+ GRPC_DCHECK(on_receive_first_settings_ == nullptr);
80
+ }
81
+
82
+ // Not copyable, movable or assignable.
83
+ SettingsPromiseManager(const SettingsPromiseManager&) = delete;
84
+ SettingsPromiseManager& operator=(const SettingsPromiseManager&) = delete;
85
+ SettingsPromiseManager(SettingsPromiseManager&&) = delete;
86
+ SettingsPromiseManager& operator=(SettingsPromiseManager&&) = delete;
87
+
88
+ void HandleTransportShutdown(
89
+ grpc_event_engine::experimental::EventEngine* event_engine) {
90
+ // If some scenario causes the transport to close without ever receiving
91
+ // settings, we need to still invoke the closure passed to the transport.
92
+ // Additionally, as this function will always run on the transport party, it
93
+ // cannot race with reading a settings frame.
94
+ // TODO(akshitpatel): [PH2][P4] Pass the actual error that caused the
95
+ // transport to be closed here.
96
+ MaybeReportInitialSettingsAbort(event_engine);
97
+ }
98
+
99
+ bool IsFirstPeerSettingsApplied() const {
100
+ return state_ == SettingsState::kReady;
101
+ }
102
+
103
+ //////////////////////////////////////////////////////////////////////////////
104
+ // Functions for SETTINGS being sent from our transport to the peer.
105
+
57
106
  // Assumption : This would be set only once in the life of the transport.
58
- inline void SetSettingsTimeout(const ChannelArgs& channel_args,
59
- const Duration keepalive_timeout) {
60
- timeout_ =
61
- channel_args.GetDurationFromIntMillis(GRPC_ARG_SETTINGS_TIMEOUT)
62
- .value_or(std::max(keepalive_timeout * 2, Duration::Minutes(1)));
107
+ inline void SetSettingsTimeout(const Duration timeout) {
108
+ GRPC_DCHECK(state_ == SettingsState::kWaitingForFirstPeerSettings);
109
+ settings_ack_timeout_ = timeout;
63
110
  }
64
111
 
65
- // To be called when a promise based Transport receives an a SETTINGS ACK
66
- // frame.
67
- inline void OnSettingsAckReceived() { RecordReceivedAck(); }
112
+ // Called when transport receives a SETTINGS ACK frame from peer.
113
+ // This SETTINGS ACK was sent by peer to confirm receipt of SETTINGS frame
114
+ // sent by us. Stop the settings timeout promise.
115
+ GRPC_MUST_USE_RESULT bool OnSettingsAckReceived() {
116
+ bool is_valid = settings_.AckLastSend();
117
+ if (is_valid) {
118
+ RecordReceivedAck();
119
+ }
120
+ return is_valid;
121
+ }
68
122
 
69
- // This returns a promise which must be spawned on transports general party.
70
- // This must be spawned soon after the transport sends a SETTINGS frame on the
71
- // endpoint.
72
- // If we don't get an ACK before timeout, the caller MUST close the transport.
123
+ // Called when our transport enqueues a SETTINGS frame to send to the peer.
124
+ // However, the enqueued frames have not yet been written to the endpoint.
125
+ void WillSendSettings() {
126
+ GRPC_DCHECK(!should_wait_for_settings_ack_);
127
+ should_wait_for_settings_ack_ = true;
128
+ }
129
+
130
+ // Returns true if we should spawn WaitForSettingsTimeout promise.
131
+ bool ShouldSpawnWaitForSettingsTimeout() const {
132
+ return should_wait_for_settings_ack_;
133
+ }
134
+
135
+ // This returns a promise which must be spawned on transports general
136
+ // party. This must be spawned soon after the transport sends a SETTINGS
137
+ // frame on the endpoint. If we don't get an ACK before timeout, the
138
+ // caller MUST close the transport.
73
139
  auto WaitForSettingsTimeout() {
140
+ did_previous_settings_promise_resolve_ = false;
141
+ TimeoutWaiterSpawned();
74
142
  GRPC_SETTINGS_TIMEOUT_DLOG
75
- << "SettingsTimeoutManager::WaitForSettingsTimeout Factory";
143
+ << "SettingsPromiseManager::WaitForSettingsTimeout Factory timeout_"
144
+ << settings_ack_timeout_;
76
145
  StartSettingsTimeoutTimer();
77
- // TODO(tjagtap) : [PH2][P1] : Make this a ref counted class and manage the
78
- // lifetime
79
- return AssertResultType<absl::Status>(
80
- Race(
81
- [this]() -> Poll<absl::Status> {
82
- GRPC_SETTINGS_TIMEOUT_DLOG
83
- << "SettingsTimeoutManager::WaitForSettingsTimeout Race";
84
- // This Promise will "win" the race if we receive the SETTINGS
85
- // ACK from the peer within the timeout time.
86
- if (DidReceiveAck()) {
87
- GRPC_DCHECK(
88
- sent_time_ +
89
- (timeout_ *
90
- 1.1 /* 10% grace time for this promise to be scheduled*/) >
146
+ return AssertResultType<absl::Status>(Race(
147
+ [self = this->Ref()]() -> Poll<absl::Status> {
148
+ GRPC_SETTINGS_TIMEOUT_DLOG
149
+ << "SettingsPromiseManager::WaitForSettingsTimeout Race";
150
+ // This Promise will "win" the race if we receive the SETTINGS
151
+ // ACK from the peer within the timeout time.
152
+ if (self->HasReceivedAck()) {
153
+ GRPC_DCHECK(
154
+ self->sent_time_ +
155
+ (self->settings_ack_timeout_ *
156
+ 1.2 /* Grace time for this promise to be scheduled*/) >
91
157
  Timestamp::Now())
92
158
  << "Should have timed out";
93
- RemoveReceivedAck();
94
- return absl::OkStatus();
95
- }
96
- AddWaitingForAck();
97
- return Pending{};
98
- },
99
- // This promise will "Win" the Race if timeout is crossed and we did
100
- // not receive the ACK. The transport must close when this happens.
101
- TrySeq(Sleep(timeout_), [sent_time = sent_time_,
102
- timeout = timeout_]() {
103
- GRPC_SETTINGS_TIMEOUT_DLOG
104
- << "SettingsTimeoutManager::WaitForSettingsTimeout Timeout"
105
- " triggered. Transport will close. Sent Time : "
106
- << sent_time << " Timeout Time : " << (sent_time + timeout)
107
- << " Current Time " << Timestamp::Now();
108
- return absl::CancelledError(
109
- std::string(RFC9113::kSettingsTimeout));
110
- })));
159
+ self->MarkReceivedAckAsProcessed();
160
+ self->did_previous_settings_promise_resolve_ = true;
161
+ return absl::OkStatus();
162
+ }
163
+ self->AddWaitingForAck();
164
+ return Pending{};
165
+ },
166
+ // This promise will "Win" the Race if timeout is crossed and we did
167
+ // not receive the ACK. The transport must close when this happens.
168
+ TrySeq(Sleep(settings_ack_timeout_),
169
+ [sent_time = sent_time_, timeout = settings_ack_timeout_]() {
170
+ const std::string message = absl::StrCat(
171
+ RFC9113::kSettingsTimeout,
172
+ " Sent Time : ", sent_time.ToString(),
173
+ " Timeout Time : ", (sent_time + timeout).ToString(),
174
+ " Current Time : ", Timestamp::Now().ToString());
175
+ GRPC_SETTINGS_TIMEOUT_DLOG
176
+ << "SettingsPromiseManager::WaitForSettingsTimeout"
177
+ << message;
178
+ // Ideally we must set did_previous_settings_promise_resolve_
179
+ // to false, but in this case the transport will be closed so
180
+ // it does not matter. I am trying to avoid taking another ref
181
+ // on self in this TrySeq.
182
+ return absl::CancelledError(message);
183
+ })));
184
+ }
185
+
186
+ void TestOnlyRecordReceivedAck() { RecordReceivedAck(); }
187
+ void TestOnlyTimeoutWaiterSpawned() { TimeoutWaiterSpawned(); }
188
+
189
+ //////////////////////////////////////////////////////////////////////////////
190
+ // Functions for SETTINGS being received from the peer.
191
+
192
+ // Buffers SETTINGS frames received from peer.
193
+ // Buffered to apply settings at start of next write cycle, only after
194
+ // SETTINGS ACK is written to the endpoint.
195
+ void BufferPeerSettings(std::vector<Http2SettingsFrame::Setting>&& settings) {
196
+ if (state_ == SettingsState::kWaitingForFirstPeerSettings) {
197
+ state_ = SettingsState::kFirstPeerSettingsReceived;
198
+ }
199
+ ++num_acks_to_send_;
200
+ pending_peer_settings_.reserve(pending_peer_settings_.size() +
201
+ settings.size());
202
+ pending_peer_settings_.insert(pending_peer_settings_.end(),
203
+ settings.begin(), settings.end());
204
+ }
205
+
206
+ // Applies settings buffered by BufferPeerSettings().
207
+ // Should be called at start of write cycle, after the SETTINGS ACK has been
208
+ // written to apply the settings. If the first settings frame is received from
209
+ // the peer that that needs some special handling too.
210
+ http2::Http2ErrorCode MaybeReportAndApplyBufferedPeerSettings(
211
+ grpc_event_engine::experimental::EventEngine* event_engine) {
212
+ http2::Http2ErrorCode status = settings_.ApplyIncomingSettings(
213
+ std::exchange(pending_peer_settings_, {}));
214
+ if (state_ == SettingsState::kFirstPeerSettingsReceived) {
215
+ MaybeReportInitialSettings(event_engine);
216
+ state_ = SettingsState::kReady;
217
+ }
218
+ return status;
219
+ }
220
+
221
+ //////////////////////////////////////////////////////////////////////////////
222
+ // Wrappers around Http2SettingsManager
223
+
224
+ // Appends SETTINGS and SETTINGS ACK frames to output_buf if needed.
225
+ // A SETTINGS frame is appended if local settings changed.
226
+ // SETTINGS ACK frames are appended for any incoming settings that need
227
+ // acknowledgment. This MUST be called only after the
228
+ // MaybeReportAndApplyBufferedPeerSettings function.
229
+ void MaybeGetSettingsAndSettingsAckFrames(
230
+ chttp2::TransportFlowControl& flow_control, SliceBuffer& output_buf) {
231
+ GRPC_SETTINGS_TIMEOUT_DLOG << "MaybeGetSettingsAndSettingsAckFrames";
232
+ if (did_previous_settings_promise_resolve_) {
233
+ std::optional<Http2Frame> settings_frame = settings_.MaybeSendUpdate();
234
+ if (settings_frame.has_value()) {
235
+ GRPC_SETTINGS_TIMEOUT_DLOG
236
+ << "MaybeGetSettingsAndSettingsAckFrames Frame Settings ";
237
+ Serialize(absl::Span<Http2Frame>(&settings_frame.value(), 1),
238
+ output_buf);
239
+ flow_control.FlushedSettings();
240
+ WillSendSettings();
241
+ }
242
+ }
243
+ if (num_acks_to_send_ > 0) {
244
+ GRPC_SETTINGS_TIMEOUT_DLOG << "Sending " << num_acks_to_send_
245
+ << " settings ACK frames";
246
+ std::vector<Http2Frame> ack_frames(num_acks_to_send_);
247
+ for (uint32_t i = 0; i < num_acks_to_send_; ++i) {
248
+ ack_frames[i] = Http2SettingsFrame{true, {}};
249
+ }
250
+ Serialize(absl::MakeSpan(ack_frames), output_buf);
251
+ num_acks_to_send_ = 0;
252
+ }
111
253
  }
112
254
 
255
+ Http2Settings& mutable_local() { return settings_.mutable_local(); }
256
+ Http2Settings& mutable_peer() { return settings_.mutable_peer(); }
257
+
258
+ const Http2Settings& local() const { return settings_.local(); }
259
+ const Http2Settings& acked() const { return settings_.acked(); }
260
+ const Http2Settings& peer() const { return settings_.peer(); }
261
+
262
+ channelz::PropertyGrid ChannelzProperties() const {
263
+ return settings_.ChannelzProperties();
264
+ }
265
+
266
+ bool IsSecurityFrameExpected() const {
267
+ GRPC_DCHECK(IsFirstPeerSettingsApplied())
268
+ << "Security frame must not be received before SETTINGS frame";
269
+ // TODO(tjagtap) : [PH2][P3] : Evaluate when to accept the frame and when to
270
+ // reject it. Compare it with the requirement and with CHTTP2.
271
+ return (settings_.acked().allow_security_frame() ||
272
+ settings_.local().allow_security_frame()) &&
273
+ settings_.peer().allow_security_frame();
274
+ };
275
+
113
276
  private:
277
+ Http2SettingsManager settings_;
278
+
279
+ //////////////////////////////////////////////////////////////////////////////
280
+ // Plumbing Settings with Chttp2Connector class
281
+
282
+ void MaybeReportInitialSettings(
283
+ grpc_event_engine::experimental::EventEngine* event_engine) {
284
+ // TODO(tjagtap) [PH2][P2] Relook at this while writing server. I think this
285
+ // will be different for client and server.
286
+ if (on_receive_first_settings_ != nullptr) {
287
+ GRPC_DCHECK(state_ == SettingsState::kFirstPeerSettingsReceived);
288
+ GRPC_DCHECK(event_engine != nullptr);
289
+ event_engine->Run(
290
+ [on_receive_settings = std::move(on_receive_first_settings_),
291
+ peer_max_concurrent_streams =
292
+ settings_.peer().max_concurrent_streams()]() mutable {
293
+ ExecCtx exec_ctx;
294
+ std::move(on_receive_settings)(peer_max_concurrent_streams);
295
+ });
296
+ GRPC_DCHECK(on_receive_first_settings_ == nullptr);
297
+ }
298
+ }
299
+
300
+ void MaybeReportInitialSettingsAbort(
301
+ grpc_event_engine::experimental::EventEngine* event_engine) {
302
+ // TODO(tjagtap) [PH2][P2] Relook at this while writing server. I think this
303
+ // will be different for client and server.
304
+ if (on_receive_first_settings_ != nullptr) {
305
+ GRPC_DCHECK(event_engine != nullptr);
306
+ GRPC_DCHECK(state_ != SettingsState::kReady);
307
+ event_engine->Run([on_receive_settings =
308
+ std::move(on_receive_first_settings_)]() mutable {
309
+ ExecCtx exec_ctx;
310
+ std::move(on_receive_settings)(
311
+ absl::UnavailableError("transport closed"));
312
+ });
313
+ GRPC_DCHECK(on_receive_first_settings_ == nullptr);
314
+ }
315
+ }
316
+
317
+ //////////////////////////////////////////////////////////////////////////////
318
+ // Functions for SETTINGS being sent from our transport to the peer.
319
+
320
+ void TimeoutWaiterSpawned() { should_wait_for_settings_ack_ = false; }
321
+
114
322
  inline void StartSettingsTimeoutTimer() {
115
323
  GRPC_SETTINGS_TIMEOUT_DLOG
116
- << "SettingsTimeoutManager::StartSettingsTimeoutTimer "
324
+ << "SettingsPromiseManager::StartSettingsTimeoutTimer "
117
325
  "did_register_waker_ "
118
- << did_register_waker_
326
+ << did_register_ack_timeout_waker_
119
327
  << " number_of_acks_unprocessed_ : " << number_of_acks_unprocessed_;
120
328
  GRPC_DCHECK_EQ(number_of_acks_unprocessed_, 0);
121
- GRPC_DCHECK(!did_register_waker_);
329
+ GRPC_DCHECK(!did_register_ack_timeout_waker_);
122
330
  sent_time_ = Timestamp::Now();
123
331
  }
124
- inline bool DidReceiveAck() {
332
+
333
+ inline bool HasReceivedAck() {
125
334
  GRPC_SETTINGS_TIMEOUT_DLOG
126
- << "SettingsTimeoutManager::DidReceiveAck did_register_waker_ "
127
- << did_register_waker_
335
+ << "SettingsPromiseManager::DidReceiveAck did_register_waker_ "
336
+ << did_register_ack_timeout_waker_
128
337
  << " number_of_acks_unprocessed_ : " << number_of_acks_unprocessed_;
129
338
  return number_of_acks_unprocessed_ > 0;
130
339
  }
131
340
  inline void AddWaitingForAck() {
132
341
  GRPC_SETTINGS_TIMEOUT_DLOG
133
- << "SettingsTimeoutManager::AddWaitingForAck did_register_waker_ "
134
- << did_register_waker_
342
+ << "SettingsPromiseManager::AddWaitingForAck did_register_waker_ "
343
+ << did_register_ack_timeout_waker_
135
344
  << " number_of_acks_unprocessed_ : " << number_of_acks_unprocessed_;
136
- if (!did_register_waker_) {
345
+ if (!did_register_ack_timeout_waker_) {
137
346
  GRPC_DCHECK_EQ(number_of_acks_unprocessed_, 0);
138
- waker_ = GetContext<Activity>()->MakeNonOwningWaker();
139
- did_register_waker_ = true;
347
+ ack_timeout_waker_ = GetContext<Activity>()->MakeNonOwningWaker();
348
+ did_register_ack_timeout_waker_ = true;
140
349
  }
141
- GRPC_DCHECK(did_register_waker_);
350
+ GRPC_DCHECK(did_register_ack_timeout_waker_);
142
351
  }
143
352
  inline void RecordReceivedAck() {
144
353
  GRPC_SETTINGS_TIMEOUT_DLOG
145
- << "SettingsTimeoutManager::RecordReceivedAck did_register_waker_ "
146
- << did_register_waker_
354
+ << "SettingsPromiseManager::RecordReceivedAck did_register_waker_ "
355
+ << did_register_ack_timeout_waker_
147
356
  << " number_of_acks_unprocessed_ : " << number_of_acks_unprocessed_;
148
357
  GRPC_DCHECK_EQ(number_of_acks_unprocessed_, 0);
149
358
  ++number_of_acks_unprocessed_;
150
- if (did_register_waker_) {
151
- // It is possible that we receive the ACK before WaitForSettingsTimeout is
152
- // scheduled. That is why we do this inside an if.
153
- waker_.Wakeup();
154
- did_register_waker_ = false;
359
+ if (did_register_ack_timeout_waker_) {
360
+ ack_timeout_waker_.Wakeup();
361
+ did_register_ack_timeout_waker_ = false;
362
+ } else {
363
+ GRPC_SETTINGS_TIMEOUT_DLOG
364
+ << "We receive the ACK before WaitForSettingsTimeout promise was "
365
+ "scheduled.";
155
366
  }
156
- GRPC_DCHECK(!did_register_waker_);
367
+ GRPC_DCHECK(!did_register_ack_timeout_waker_);
157
368
  }
158
- inline void RemoveReceivedAck() {
369
+ inline void MarkReceivedAckAsProcessed() {
159
370
  GRPC_SETTINGS_TIMEOUT_DLOG
160
- << "SettingsTimeoutManager::RemoveReceivedAck did_register_waker_ "
161
- << did_register_waker_
371
+ << "SettingsPromiseManager::RemoveReceivedAck did_register_waker_ "
372
+ << did_register_ack_timeout_waker_
162
373
  << " number_of_acks_unprocessed_ : " << number_of_acks_unprocessed_;
163
374
  --number_of_acks_unprocessed_;
164
375
  GRPC_DCHECK_EQ(number_of_acks_unprocessed_, 0);
165
- GRPC_DCHECK(!did_register_waker_);
376
+ GRPC_DCHECK(!did_register_ack_timeout_waker_);
166
377
  }
167
378
 
168
- Duration timeout_;
169
- // We don't actually use this for the timeout. We are just keeping this as
170
- // book keeping for better debuggability.
379
+ //////////////////////////////////////////////////////////////////////////////
380
+ // Data Members for SETTINGS being sent from our transport to the peer.
381
+
382
+ Duration settings_ack_timeout_;
383
+ // TODO(tjagtap) [PH2][P5][Settings] Delete sent_time_. We don't actually use
384
+ // sent_time_ for the timeout. We are just keeping this as book keeping for
385
+ // better debuggability.
171
386
  Timestamp sent_time_ = Timestamp::InfFuture();
172
- Waker waker_;
173
- bool did_register_waker_ = false;
387
+ Waker ack_timeout_waker_;
388
+ bool did_register_ack_timeout_waker_ = false;
174
389
  int number_of_acks_unprocessed_ = 0;
390
+ bool should_wait_for_settings_ack_ = false;
391
+
392
+ // For CHTTP2, MaybeSendUpdate() checks `update_state_` to ensure only one
393
+ // SETTINGS frame is in flight at a time. PH2 requires an additional
394
+ // constraint: a new SETTINGS frame cannot be sent until the SETTINGS-ACK
395
+ // timeout promise for the previous frame has resolved. This flag tracks this
396
+ // condition for PH2.
397
+ bool did_previous_settings_promise_resolve_ = true;
398
+
399
+ //////////////////////////////////////////////////////////////////////////////
400
+ // Data Members for SETTINGS being received from the peer.
401
+
402
+ absl::AnyInvocable<void(absl::StatusOr<uint32_t>)> on_receive_first_settings_;
403
+ std::vector<Http2SettingsFrame::Setting> pending_peer_settings_;
404
+ // Number of incoming SETTINGS frames that we have received but not ACKed yet.
405
+ uint32_t num_acks_to_send_ = 0;
406
+
407
+ enum class SettingsState : uint8_t {
408
+ kWaitingForFirstPeerSettings,
409
+ kFirstPeerSettingsReceived,
410
+ kReady,
411
+ };
412
+ SettingsState state_;
175
413
  };
176
414
 
177
415
  } // namespace grpc_core
@@ -25,10 +25,10 @@
25
25
  #include <string>
26
26
  #include <variant>
27
27
 
28
+ #include "src/core/util/time.h"
28
29
  #include "absl/log/check.h"
29
30
  #include "absl/status/status.h"
30
31
  #include "absl/strings/str_cat.h"
31
- #include "src/core/util/time.h"
32
32
 
33
33
  namespace grpc_core {
34
34
  namespace http2 {
@@ -408,6 +408,12 @@ GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION inline T TakeValue(
408
408
  return std::move(value.value());
409
409
  }
410
410
 
411
+ inline Http2Status ToHttpOkOrConnError(const absl::Status& status) {
412
+ return status.ok() ? Http2Status::Ok()
413
+ : Http2Status::AbslConnectionError(
414
+ status.code(), std::string(status.message()));
415
+ }
416
+
411
417
  } // namespace http2
412
418
  } // namespace grpc_core
413
419