Compare commits

...

16 Commits

Author SHA1 Message Date
Mark D. Roth 7570d8b545 [reorg] move src/core/lib/config -> src/core/config (#37847) 3 days ago
Craig Tiller 394118d04d [chaotic-good] Multi-connection support (#38032) 3 days ago
Yash Tibrewal c333d60fcd [OTel] Set prometheus exporter option to populate otel scope (#38170) 4 days ago
Mark D. Roth a5703a0693 [pick_first] fix shutdown bug in new PF impl (#38144) 4 days ago
Tanvi Jagtap 67d82ecbb9
[OnCall] Minor change to Python binary metadata documentation (#38127) 4 days ago
Sourabh Singh bef33bd26e increased timeout for windows grpc basictests python (#38162) 4 days ago
AJ Heller 9801f6dae2 [deps] Upgrade google/benchmark to v1.9.0 (#38163) 5 days ago
Vignesh Babu bcc04e7dbd [Orca Service] Gracefully fail the incoming RPC if it fails deserialization 5 days ago
Esun Kim cb9375468b [CI] Keep ninja test only for Windows. (#38159) 5 days ago
Craig Tiller 4eb73bc81e [flake] Fix recursive mutex issue in legacy chaotic good (#38156) 5 days ago
Craig Tiller d61d88d130 Revert "[party] use ee for max threadyness (#38139)" (#38153) 6 days ago
Craig Tiller 14e077f9bd Extend chaotic_good_legacy_protocol expiry date 7 days ago
Esun Kim a55c0665ea [Deps] Updated OpenTelemetry to the HEAD (#38140) 7 days ago
Purnesh Dixit 45dacbe861 [interop] Add v1.65.1, v1.66.3, v1.67.1, v1.68.0 releases of grpc-go to interop matrix (#38151) 7 days ago
Craig Tiller 3cc611c7df [party] use ee for max threadyness (#38139) 7 days ago
Craig Tiller 6c37069951 [chaotic-good] Fix recursive mutex deadlock (#38150) 7 days ago
  1. 18
      BUILD
  2. 243
      CMakeLists.txt
  3. 8
      Makefile
  4. 14
      Package.swift
  5. 17
      bazel/grpc_deps.bzl
  6. 598
      build_autogenerated.yaml
  7. 10
      config.m4
  8. 10
      config.w32
  9. 1
      examples/cpp/csm/csm_greeter_client.cc
  10. 1
      examples/cpp/csm/csm_greeter_server.cc
  11. 1
      examples/cpp/csm/observability/csm_greeter_client.cc
  12. 1
      examples/cpp/csm/observability/csm_greeter_server.cc
  13. 1
      examples/cpp/otel/greeter_callback_client.cc
  14. 1
      examples/cpp/otel/greeter_callback_server.cc
  15. 4
      examples/python/metadata/metadata_client.py
  16. 12
      gRPC-C++.podspec
  17. 20
      gRPC-Core.podspec
  18. 14
      grpc.gemspec
  19. 19
      include/grpcpp/ext/orca_service.h
  20. 14
      package.xml
  21. 69
      src/core/BUILD
  22. 2
      src/core/client_channel/backup_poller.cc
  23. 2
      src/core/client_channel/client_channel.cc
  24. 2
      src/core/client_channel/client_channel_filter.cc
  25. 2
      src/core/client_channel/client_channel_plugin.cc
  26. 2
      src/core/client_channel/client_channel_service_config.h
  27. 2
      src/core/client_channel/direct_channel.cc
  28. 2
      src/core/client_channel/load_balanced_call_destination.cc
  29. 2
      src/core/client_channel/retry_service_config.cc
  30. 2
      src/core/client_channel/retry_service_config.h
  31. 2
      src/core/client_channel/subchannel.cc
  32. 4
      src/core/config/config_vars.cc
  33. 6
      src/core/config/config_vars.h
  34. 0
      src/core/config/config_vars.yaml
  35. 2
      src/core/config/config_vars_non_generated.cc
  36. 2
      src/core/config/core_configuration.cc
  37. 6
      src/core/config/core_configuration.h
  38. 2
      src/core/config/load_config.cc
  39. 6
      src/core/config/load_config.h
  40. 2
      src/core/ext/filters/backend_metrics/backend_metric_filter.cc
  41. 2
      src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc
  42. 2
      src/core/ext/filters/fault_injection/fault_injection_filter.cc
  43. 2
      src/core/ext/filters/fault_injection/fault_injection_service_config_parser.h
  44. 2
      src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc
  45. 2
      src/core/ext/filters/gcp_authentication/gcp_authentication_service_config_parser.h
  46. 2
      src/core/ext/filters/http/client_authority_filter.cc
  47. 2
      src/core/ext/filters/http/http_filters_plugin.cc
  48. 2
      src/core/ext/filters/load_reporting/server_load_reporting_filter.cc
  49. 2
      src/core/ext/filters/logging/logging_filter.cc
  50. 2
      src/core/ext/filters/message_size/message_size_filter.cc
  51. 2
      src/core/ext/filters/message_size/message_size_filter.h
  52. 2
      src/core/ext/filters/rbac/rbac_filter.cc
  53. 2
      src/core/ext/filters/rbac/rbac_service_config_parser.h
  54. 2
      src/core/ext/filters/stateful_session/stateful_session_filter.cc
  55. 2
      src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h
  56. 8
      src/core/ext/transport/chaotic_good/chaotic_good_frame.proto
  57. 203
      src/core/ext/transport/chaotic_good/chaotic_good_transport.h
  58. 95
      src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
  59. 14
      src/core/ext/transport/chaotic_good/client/chaotic_good_connector.h
  60. 114
      src/core/ext/transport/chaotic_good/client_transport.cc
  61. 8
      src/core/ext/transport/chaotic_good/client_transport.h
  62. 68
      src/core/ext/transport/chaotic_good/control_endpoint.cc
  63. 99
      src/core/ext/transport/chaotic_good/control_endpoint.h
  64. 236
      src/core/ext/transport/chaotic_good/data_endpoints.cc
  65. 199
      src/core/ext/transport/chaotic_good/data_endpoints.h
  66. 76
      src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
  67. 11
      src/core/ext/transport/chaotic_good/server/chaotic_good_server.h
  68. 137
      src/core/ext/transport/chaotic_good/server_transport.cc
  69. 9
      src/core/ext/transport/chaotic_good/server_transport.h
  70. 2
      src/core/ext/transport/chaotic_good_legacy/client/chaotic_good_connector.cc
  71. 9
      src/core/ext/transport/chaotic_good_legacy/server_transport.cc
  72. 2
      src/core/ext/transport/chttp2/client/chttp2_connector.cc
  73. 2
      src/core/ext/transport/chttp2/server/chttp2_server.cc
  74. 2
      src/core/ext/transport/chttp2/transport/chttp2_transport.cc
  75. 2
      src/core/ext/transport/cronet/client/secure/cronet_channel_create.cc
  76. 2
      src/core/ext/transport/inproc/inproc_transport.cc
  77. 2
      src/core/ext/transport/inproc/legacy_inproc_transport.cc
  78. 2
      src/core/handshaker/endpoint_info/endpoint_info_handshaker.h
  79. 2
      src/core/handshaker/http_connect/http_connect_handshaker.cc
  80. 2
      src/core/handshaker/http_connect/http_connect_handshaker.h
  81. 2
      src/core/handshaker/http_connect/http_proxy_mapper.h
  82. 2
      src/core/handshaker/http_connect/xds_http_proxy_mapper.h
  83. 2
      src/core/handshaker/security/security_handshaker.cc
  84. 2
      src/core/handshaker/security/security_handshaker.h
  85. 2
      src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc
  86. 2
      src/core/handshaker/tcp_connect/tcp_connect_handshaker.h
  87. 2
      src/core/lib/channel/connected_channel.cc
  88. 2
      src/core/lib/debug/trace.cc
  89. 2
      src/core/lib/event_engine/ares_resolver.cc
  90. 2
      src/core/lib/event_engine/default_event_engine.cc
  91. 2
      src/core/lib/event_engine/default_event_engine.h
  92. 2
      src/core/lib/event_engine/forkable.cc
  93. 2
      src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc
  94. 2
      src/core/lib/experiments/config.cc
  95. 2
      src/core/lib/experiments/experiments.yaml
  96. 2
      src/core/lib/iomgr/ev_posix.cc
  97. 2
      src/core/lib/iomgr/iomgr.cc
  98. 37
      src/core/lib/promise/all_ok.h
  99. 50
      src/core/lib/promise/detail/basic_seq.h
  100. 36
      src/core/lib/promise/join.h
  101. Some files were not shown because too many files have changed in this diff Show More

18
BUILD

@ -2600,9 +2600,13 @@ grpc_cc_library(
srcs = [
"src/cpp/server/orca/orca_service.cc",
],
hdrs = [
"src/cpp/server/orca/orca_service.h",
],
external_deps = [
"absl/base:core_headers",
"absl/log:check",
"absl/log:log",
"absl/strings",
"absl/time",
"absl/types:optional",
@ -2967,10 +2971,10 @@ grpc_filegroup(
grpc_cc_library(
name = "load_config",
srcs = [
"//src/core:lib/config/load_config.cc",
"//src/core:config/load_config.cc",
],
hdrs = [
"//src/core:lib/config/load_config.h",
"//src/core:config/load_config.h",
],
external_deps = [
"absl/flags:flag",
@ -2988,11 +2992,11 @@ grpc_cc_library(
grpc_cc_library(
name = "config_vars",
srcs = [
"//src/core:lib/config/config_vars.cc",
"//src/core:lib/config/config_vars_non_generated.cc",
"//src/core:config/config_vars.cc",
"//src/core:config/config_vars_non_generated.cc",
],
hdrs = [
"//src/core:lib/config/config_vars.h",
"//src/core:config/config_vars.h",
],
external_deps = [
"absl/flags:flag",
@ -3008,7 +3012,7 @@ grpc_cc_library(
grpc_cc_library(
name = "config",
srcs = [
"//src/core:lib/config/core_configuration.cc",
"//src/core:config/core_configuration.cc",
],
external_deps = [
"absl/functional:any_invocable",
@ -3016,7 +3020,7 @@ grpc_cc_library(
],
language = "c++",
public_hdrs = [
"//src/core:lib/config/core_configuration.h",
"//src/core:config/core_configuration.h",
],
visibility = ["@grpc:client_channel"],
deps = [

243
CMakeLists.txt generated

@ -1609,6 +1609,7 @@ if(gRPC_BUILD_TESTS)
add_dependencies(buildtests_cxx oracle_event_engine_posix_test)
endif()
add_dependencies(buildtests_cxx orca_service_end2end_test)
add_dependencies(buildtests_cxx orca_service_test)
add_dependencies(buildtests_cxx orphanable_test)
add_dependencies(buildtests_cxx osa_distance_test)
add_dependencies(buildtests_cxx out_of_bounds_bad_client_test)
@ -2035,9 +2036,9 @@ endif()
add_library(gpr
src/core/lib/config/config_vars.cc
src/core/lib/config/config_vars_non_generated.cc
src/core/lib/config/load_config.cc
src/core/config/config_vars.cc
src/core/config/config_vars_non_generated.cc
src/core/config/load_config.cc
src/core/lib/event_engine/thread_local.cc
src/core/util/alloc.cc
src/core/util/atm.cc
@ -2223,6 +2224,7 @@ add_library(grpc
src/core/client_channel/subchannel.cc
src/core/client_channel/subchannel_pool_interface.cc
src/core/client_channel/subchannel_stream_client.cc
src/core/config/core_configuration.cc
src/core/ext/filters/backend_metrics/backend_metric_filter.cc
src/core/ext/filters/census/grpc_context.cc
src/core/ext/filters/channel_idle/idle_filter_state.cc
@ -2620,7 +2622,6 @@ add_library(grpc
src/core/lib/compression/compression.cc
src/core/lib/compression/compression_internal.cc
src/core/lib/compression/message_compress.cc
src/core/lib/config/core_configuration.cc
src/core/lib/debug/trace.cc
src/core/lib/debug/trace_flags.cc
src/core/lib/event_engine/ares_resolver.cc
@ -3343,6 +3344,7 @@ add_library(grpc_unsecure
src/core/client_channel/subchannel.cc
src/core/client_channel/subchannel_pool_interface.cc
src/core/client_channel/subchannel_stream_client.cc
src/core/config/core_configuration.cc
src/core/ext/filters/backend_metrics/backend_metric_filter.cc
src/core/ext/filters/census/grpc_context.cc
src/core/ext/filters/channel_idle/idle_filter_state.cc
@ -3430,7 +3432,6 @@ add_library(grpc_unsecure
src/core/lib/compression/compression.cc
src/core/lib/compression/compression_internal.cc
src/core/lib/compression/message_compress.cc
src/core/lib/config/core_configuration.cc
src/core/lib/debug/trace.cc
src/core/lib/debug/trace_flags.cc
src/core/lib/event_engine/ares_resolver.cc
@ -5627,6 +5628,7 @@ add_library(grpc_authorization_provider
src/core/channelz/channel_trace.cc
src/core/channelz/channelz.cc
src/core/channelz/channelz_registry.cc
src/core/config/core_configuration.cc
src/core/ext/upb-gen/google/protobuf/any.upb_minitable.c
src/core/ext/upb-gen/google/rpc/status.upb_minitable.c
src/core/ext/upb-gen/src/proto/grpc/gcp/altscontext.upb_minitable.c
@ -5652,7 +5654,6 @@ add_library(grpc_authorization_provider
src/core/lib/compression/compression.cc
src/core/lib/compression/compression_internal.cc
src/core/lib/compression/message_compress.cc
src/core/lib/config/core_configuration.cc
src/core/lib/debug/trace.cc
src/core/lib/debug/trace_flags.cc
src/core/lib/event_engine/ares_resolver.cc
@ -8501,6 +8502,8 @@ add_executable(bad_ping_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -8988,6 +8991,8 @@ add_executable(binary_metadata_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -9333,6 +9338,8 @@ add_executable(call_creds_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -9545,6 +9552,8 @@ add_executable(call_host_override_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -9767,6 +9776,7 @@ add_executable(call_utils_test
src/core/channelz/channel_trace.cc
src/core/channelz/channelz.cc
src/core/channelz/channelz_registry.cc
src/core/config/core_configuration.cc
src/core/ext/upb-gen/google/protobuf/any.upb_minitable.c
src/core/ext/upb-gen/google/rpc/status.upb_minitable.c
src/core/ext/upb-gen/src/proto/grpc/gcp/altscontext.upb_minitable.c
@ -9788,7 +9798,6 @@ add_executable(call_utils_test
src/core/lib/compression/compression.cc
src/core/lib/compression/compression_internal.cc
src/core/lib/compression/message_compress.cc
src/core/lib/config/core_configuration.cc
src/core/lib/debug/trace.cc
src/core/lib/debug/trace_flags.cc
src/core/lib/event_engine/ares_resolver.cc
@ -10062,6 +10071,8 @@ add_executable(cancel_after_accept_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -10136,6 +10147,8 @@ add_executable(cancel_after_client_done_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -10210,6 +10223,8 @@ add_executable(cancel_after_invoke_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -10284,6 +10299,8 @@ add_executable(cancel_after_round_trip_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -10405,6 +10422,8 @@ add_executable(cancel_before_invoke_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -10556,6 +10575,8 @@ add_executable(cancel_in_a_vacuum_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -10630,6 +10651,8 @@ add_executable(cancel_with_status_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -12461,6 +12484,8 @@ add_executable(client_streaming_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -12811,6 +12836,8 @@ add_executable(compressed_payload_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -13211,6 +13238,8 @@ add_executable(connectivity_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -13683,6 +13712,8 @@ add_executable(default_host_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -13918,6 +13949,8 @@ add_executable(disappearing_server_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -14285,6 +14318,8 @@ add_executable(empty_batch_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -15436,6 +15471,8 @@ add_executable(filter_causes_close_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -15510,6 +15547,8 @@ add_executable(filter_init_fails_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -15634,6 +15673,8 @@ add_executable(filtered_metadata_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -16586,6 +16627,8 @@ add_executable(graceful_server_shutdown_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -16979,6 +17022,8 @@ add_executable(grpc_authz_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -18430,6 +18475,8 @@ add_executable(high_initial_seqno_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -18750,6 +18797,8 @@ add_executable(hpack_size_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -19025,6 +19074,8 @@ add_executable(http2_stats_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -19985,6 +20036,8 @@ add_executable(invoke_large_request_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -20387,6 +20440,8 @@ add_executable(keepalive_timeout_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -20504,6 +20559,8 @@ add_executable(large_metadata_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -21282,6 +21339,8 @@ add_executable(max_concurrent_streams_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -21356,6 +21415,8 @@ add_executable(max_connection_age_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -21430,6 +21491,8 @@ add_executable(max_connection_idle_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -21504,6 +21567,8 @@ add_executable(max_message_length_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -22253,6 +22318,8 @@ add_executable(negative_deadline_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -22359,6 +22426,8 @@ add_executable(no_logging_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -22433,6 +22502,8 @@ add_executable(no_op_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -22869,6 +22940,50 @@ target_link_libraries(orca_service_end2end_test
)
endif()
if(gRPC_BUILD_TESTS)
add_executable(orca_service_test
src/cpp/server/orca/orca_service.cc
test/cpp/server/orca_service_test.cc
)
if(WIN32 AND MSVC)
if(BUILD_SHARED_LIBS)
target_compile_definitions(orca_service_test
PRIVATE
"GPR_DLL_IMPORTS"
"GRPC_DLL_IMPORTS"
"GRPCXX_DLL_IMPORTS"
)
endif()
endif()
target_compile_features(orca_service_test PUBLIC cxx_std_14)
target_include_directories(orca_service_test
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/include
${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
${_gRPC_RE2_INCLUDE_DIR}
${_gRPC_SSL_INCLUDE_DIR}
${_gRPC_UPB_GENERATED_DIR}
${_gRPC_UPB_GRPC_GENERATED_DIR}
${_gRPC_UPB_INCLUDE_DIR}
${_gRPC_XXHASH_INCLUDE_DIR}
${_gRPC_ZLIB_INCLUDE_DIR}
third_party/googletest/googletest/include
third_party/googletest/googletest
third_party/googletest/googlemock/include
third_party/googletest/googlemock
${_gRPC_PROTO_GENS_DIR}
)
target_link_libraries(orca_service_test
${_gRPC_ALLTARGETS_LIBRARIES}
gtest
grpc++_test_util
)
endif()
if(gRPC_BUILD_TESTS)
@ -23429,6 +23544,8 @@ add_executable(payload_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -23807,6 +23924,8 @@ add_executable(ping_pong_streaming_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -23932,6 +24051,8 @@ add_executable(ping_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -25475,6 +25596,8 @@ add_executable(proxy_auth_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -26078,6 +26201,8 @@ add_executable(registered_call_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -26296,6 +26421,8 @@ add_executable(request_with_flags_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -26370,6 +26497,8 @@ add_executable(request_with_payload_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -26731,6 +26860,8 @@ add_executable(resource_quota_server_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -26847,6 +26978,8 @@ add_executable(retry_cancel_after_first_attempt_starts_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -26921,6 +27054,8 @@ add_executable(retry_cancel_during_delay_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -26995,6 +27130,8 @@ add_executable(retry_cancel_with_multiple_send_batches_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -27069,6 +27206,8 @@ add_executable(retry_cancellation_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -27143,6 +27282,8 @@ add_executable(retry_disabled_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -27217,6 +27358,8 @@ add_executable(retry_exceeds_buffer_size_in_delay_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -27291,6 +27434,8 @@ add_executable(retry_exceeds_buffer_size_in_initial_batch_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -27365,6 +27510,8 @@ add_executable(retry_exceeds_buffer_size_in_subsequent_batch_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -27439,6 +27586,8 @@ add_executable(retry_lb_drop_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -27513,6 +27662,8 @@ add_executable(retry_lb_fail_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -27587,6 +27738,8 @@ add_executable(retry_non_retriable_status_before_trailers_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -27661,6 +27814,8 @@ add_executable(retry_non_retriable_status_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -27735,6 +27890,8 @@ add_executable(retry_per_attempt_recv_timeout_on_last_attempt_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -27809,6 +27966,8 @@ add_executable(retry_per_attempt_recv_timeout_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -27883,6 +28042,8 @@ add_executable(retry_recv_initial_metadata_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -27957,6 +28118,8 @@ add_executable(retry_recv_message_replay_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -28031,6 +28194,8 @@ add_executable(retry_recv_message_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -28105,6 +28270,8 @@ add_executable(retry_recv_trailing_metadata_error_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -28179,6 +28346,8 @@ add_executable(retry_send_initial_metadata_refs_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -28253,6 +28422,8 @@ add_executable(retry_send_op_fails_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -28327,6 +28498,8 @@ add_executable(retry_send_recv_batch_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -28401,6 +28574,8 @@ add_executable(retry_server_pushback_delay_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -28475,6 +28650,8 @@ add_executable(retry_server_pushback_disabled_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -28591,6 +28768,8 @@ add_executable(retry_streaming_after_commit_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -28665,6 +28844,8 @@ add_executable(retry_streaming_succeeds_before_replay_finished_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -28739,6 +28920,8 @@ add_executable(retry_streaming_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -28813,6 +28996,8 @@ add_executable(retry_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -28929,6 +29114,8 @@ add_executable(retry_throttled_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -29003,6 +29190,8 @@ add_executable(retry_too_many_attempts_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -29077,6 +29266,8 @@ add_executable(retry_transparent_goaway_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -29151,6 +29342,8 @@ add_executable(retry_transparent_max_concurrent_streams_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -29225,6 +29418,8 @@ add_executable(retry_transparent_not_sent_on_wire_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -29299,6 +29494,8 @@ add_executable(retry_unref_before_finish_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -29373,6 +29570,8 @@ add_executable(retry_unref_before_recv_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -30539,6 +30738,8 @@ add_executable(server_finishes_request_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -30866,6 +31067,8 @@ add_executable(server_streaming_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -31155,6 +31358,8 @@ add_executable(shutdown_finishes_calls_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -31229,6 +31434,8 @@ add_executable(shutdown_finishes_tags_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -31382,6 +31589,8 @@ add_executable(simple_delayed_request_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -31456,6 +31665,8 @@ add_executable(simple_metadata_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -31574,6 +31785,8 @@ add_executable(simple_request_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -32513,6 +32726,8 @@ add_executable(streaming_error_response_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -33316,6 +33531,8 @@ add_executable(test_core_end2end_channelz_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -33786,6 +34003,8 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX)
${_gRPC_PROTO_GENS_DIR}/test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.pb.h
${_gRPC_PROTO_GENS_DIR}/test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.grpc.pb.h
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server_transport.cc
@ -34013,6 +34232,8 @@ add_executable(test_cpp_ext_chaotic_good_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -34599,6 +34820,8 @@ add_executable(timeout_before_request_call_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -35188,6 +35411,8 @@ add_executable(trailing_metadata_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -36169,6 +36394,8 @@ add_executable(write_buffering_at_end_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc
@ -36243,6 +36470,8 @@ add_executable(write_buffering_test
${_gRPC_PROTO_GENS_DIR}/src/core/ext/transport/chaotic_good/chaotic_good_frame.grpc.pb.h
src/core/ext/transport/chaotic_good/client/chaotic_good_connector.cc
src/core/ext/transport/chaotic_good/client_transport.cc
src/core/ext/transport/chaotic_good/control_endpoint.cc
src/core/ext/transport/chaotic_good/data_endpoints.cc
src/core/ext/transport/chaotic_good/frame.cc
src/core/ext/transport/chaotic_good/frame_header.cc
src/core/ext/transport/chaotic_good/server/chaotic_good_server.cc

8
Makefile generated

@ -688,6 +688,10 @@ LIBGRPC_SRC = \
src/core/client_channel/subchannel.cc \
src/core/client_channel/subchannel_pool_interface.cc \
src/core/client_channel/subchannel_stream_client.cc \
src/core/config/config_vars.cc \
src/core/config/config_vars_non_generated.cc \
src/core/config/core_configuration.cc \
src/core/config/load_config.cc \
src/core/ext/filters/backend_metrics/backend_metric_filter.cc \
src/core/ext/filters/census/grpc_context.cc \
src/core/ext/filters/channel_idle/idle_filter_state.cc \
@ -1085,10 +1089,6 @@ LIBGRPC_SRC = \
src/core/lib/compression/compression.cc \
src/core/lib/compression/compression_internal.cc \
src/core/lib/compression/message_compress.cc \
src/core/lib/config/config_vars.cc \
src/core/lib/config/config_vars_non_generated.cc \
src/core/lib/config/core_configuration.cc \
src/core/lib/config/load_config.cc \
src/core/lib/debug/trace.cc \
src/core/lib/debug/trace_flags.cc \
src/core/lib/event_engine/ares_resolver.cc \

14
Package.swift generated

@ -165,6 +165,13 @@ let package = Package(
"src/core/client_channel/subchannel_pool_interface.h",
"src/core/client_channel/subchannel_stream_client.cc",
"src/core/client_channel/subchannel_stream_client.h",
"src/core/config/config_vars.cc",
"src/core/config/config_vars.h",
"src/core/config/config_vars_non_generated.cc",
"src/core/config/core_configuration.cc",
"src/core/config/core_configuration.h",
"src/core/config/load_config.cc",
"src/core/config/load_config.h",
"src/core/ext/filters/backend_metrics/backend_metric_filter.cc",
"src/core/ext/filters/backend_metrics/backend_metric_filter.h",
"src/core/ext/filters/backend_metrics/backend_metric_provider.h",
@ -1130,13 +1137,6 @@ let package = Package(
"src/core/lib/compression/compression_internal.h",
"src/core/lib/compression/message_compress.cc",
"src/core/lib/compression/message_compress.h",
"src/core/lib/config/config_vars.cc",
"src/core/lib/config/config_vars.h",
"src/core/lib/config/config_vars_non_generated.cc",
"src/core/lib/config/core_configuration.cc",
"src/core/lib/config/core_configuration.h",
"src/core/lib/config/load_config.cc",
"src/core/lib/config/load_config.h",
"src/core/lib/debug/trace.cc",
"src/core/lib/debug/trace.h",
"src/core/lib/debug/trace_flags.cc",

@ -109,11 +109,12 @@ def grpc_deps():
if "com_github_google_benchmark" not in native.existing_rules():
http_archive(
name = "com_github_google_benchmark",
sha256 = "8e7b955f04bc6984e4f14074d0d191474f76a6c8e849e04a9dced49bc975f2d4",
strip_prefix = "benchmark-344117638c8ff7e239044fd0fa7085839fc03021",
sha256 = "11f344710a80fd73db0fc686b4fe40867dc34d914d9cdfd7a4b416a65d1e692f",
strip_prefix = "benchmark-12235e24652fc7f809373e7c11a5f73c5763fc4c",
urls = [
"https://storage.googleapis.com/grpc-bazel-mirror/github.com/google/benchmark/archive/344117638c8ff7e239044fd0fa7085839fc03021.tar.gz",
"https://github.com/google/benchmark/archive/344117638c8ff7e239044fd0fa7085839fc03021.tar.gz",
# v1.9.0
"https://storage.googleapis.com/grpc-bazel-mirror/github.com/google/benchmark/archive/12235e24652fc7f809373e7c11a5f73c5763fc4c.tar.gz",
"https://github.com/google/benchmark/archive/12235e24652fc7f809373e7c11a5f73c5763fc4c.tar.gz",
],
)
@ -340,11 +341,11 @@ def grpc_deps():
if "io_opentelemetry_cpp" not in native.existing_rules():
http_archive(
name = "io_opentelemetry_cpp",
sha256 = "ed681d20a684b7d485a49288e7cfb2d182bf882e5c112c5f2fa3f9e9da2278fc",
strip_prefix = "opentelemetry-cpp-4bd64c9a336fd438d6c4c9dad2e6b61b0585311f",
sha256 = "4b822a2f137b8c2ea403c5ec9a661addcc048aa8ba3afebffd58cbcf218457bc",
strip_prefix = "opentelemetry-cpp-a388e87d72b8321c189c8d41edb746ffa687ce3c",
urls = [
"https://storage.googleapis.com/grpc-bazel-mirror/github.com/open-telemetry/opentelemetry-cpp/archive/4bd64c9a336fd438d6c4c9dad2e6b61b0585311f.tar.gz",
"https://github.com/open-telemetry/opentelemetry-cpp/archive/4bd64c9a336fd438d6c4c9dad2e6b61b0585311f.tar.gz",
"https://storage.googleapis.com/grpc-bazel-mirror/github.com/open-telemetry/opentelemetry-cpp/archive/a388e87d72b8321c189c8d41edb746ffa687ce3c.tar.gz",
"https://github.com/open-telemetry/opentelemetry-cpp/archive/a388e87d72b8321c189c8d41edb746ffa687ce3c.tar.gz",
],
)

File diff suppressed because it is too large Load Diff

10
config.m4 generated

@ -63,6 +63,10 @@ if test "$PHP_GRPC" != "no"; then
src/core/client_channel/subchannel.cc \
src/core/client_channel/subchannel_pool_interface.cc \
src/core/client_channel/subchannel_stream_client.cc \
src/core/config/config_vars.cc \
src/core/config/config_vars_non_generated.cc \
src/core/config/core_configuration.cc \
src/core/config/load_config.cc \
src/core/ext/filters/backend_metrics/backend_metric_filter.cc \
src/core/ext/filters/census/grpc_context.cc \
src/core/ext/filters/channel_idle/idle_filter_state.cc \
@ -460,10 +464,6 @@ if test "$PHP_GRPC" != "no"; then
src/core/lib/compression/compression.cc \
src/core/lib/compression/compression_internal.cc \
src/core/lib/compression/message_compress.cc \
src/core/lib/config/config_vars.cc \
src/core/lib/config/config_vars_non_generated.cc \
src/core/lib/config/core_configuration.cc \
src/core/lib/config/load_config.cc \
src/core/lib/debug/trace.cc \
src/core/lib/debug/trace_flags.cc \
src/core/lib/event_engine/ares_resolver.cc \
@ -1416,6 +1416,7 @@ if test "$PHP_GRPC" != "no"; then
PHP_ADD_BUILD_DIR($ext_builddir/src/core/channelz)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/client_channel)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/config)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/backend_metrics)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/census)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/channel_idle)
@ -1548,7 +1549,6 @@ if test "$PHP_GRPC" != "no"; then
PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/address_utils)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/channel)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/compression)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/config)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/debug)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/event_engine)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/event_engine/cf_engine)

10
config.w32 generated

@ -28,6 +28,10 @@ if (PHP_GRPC != "no") {
"src\\core\\client_channel\\subchannel.cc " +
"src\\core\\client_channel\\subchannel_pool_interface.cc " +
"src\\core\\client_channel\\subchannel_stream_client.cc " +
"src\\core\\config\\config_vars.cc " +
"src\\core\\config\\config_vars_non_generated.cc " +
"src\\core\\config\\core_configuration.cc " +
"src\\core\\config\\load_config.cc " +
"src\\core\\ext\\filters\\backend_metrics\\backend_metric_filter.cc " +
"src\\core\\ext\\filters\\census\\grpc_context.cc " +
"src\\core\\ext\\filters\\channel_idle\\idle_filter_state.cc " +
@ -425,10 +429,6 @@ if (PHP_GRPC != "no") {
"src\\core\\lib\\compression\\compression.cc " +
"src\\core\\lib\\compression\\compression_internal.cc " +
"src\\core\\lib\\compression\\message_compress.cc " +
"src\\core\\lib\\config\\config_vars.cc " +
"src\\core\\lib\\config\\config_vars_non_generated.cc " +
"src\\core\\lib\\config\\core_configuration.cc " +
"src\\core\\lib\\config\\load_config.cc " +
"src\\core\\lib\\debug\\trace.cc " +
"src\\core\\lib\\debug\\trace_flags.cc " +
"src\\core\\lib\\event_engine\\ares_resolver.cc " +
@ -1408,6 +1408,7 @@ if (PHP_GRPC != "no") {
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\channelz");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\client_channel");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\config");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\backend_metrics");
@ -1689,7 +1690,6 @@ if (PHP_GRPC != "no") {
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\address_utils");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\channel");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\compression");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\config");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\debug");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\event_engine");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\event_engine\\cf_engine");

@ -161,6 +161,7 @@ absl::StatusOr<grpc::CsmObservability> InitializeObservability() {
opentelemetry::exporter::metrics::PrometheusExporterOptions opts;
// default was "localhost:9464" which causes connection issue across GKE pods
opts.url = "0.0.0.0:9464";
opts.without_otel_scope = false;
auto prometheus_exporter =
opentelemetry::exporter::metrics::PrometheusExporterFactory::Create(opts);
auto meter_provider =

@ -103,6 +103,7 @@ int main(int argc, char** argv) {
opentelemetry::exporter::metrics::PrometheusExporterOptions opts;
// default was "localhost:9464" which causes connection issue across GKE pods
opts.url = "0.0.0.0:9464";
opts.without_otel_scope = false;
auto prometheus_exporter =
opentelemetry::exporter::metrics::PrometheusExporterFactory::Create(opts);
auto meter_provider =

@ -45,6 +45,7 @@ absl::StatusOr<grpc::CsmObservability> InitializeObservability() {
opentelemetry::exporter::metrics::PrometheusExporterOptions opts;
// default was "localhost:9464" which causes connection issue across GKE pods
opts.url = "0.0.0.0:9464";
opts.without_otel_scope = false;
auto prometheus_exporter =
opentelemetry::exporter::metrics::PrometheusExporterFactory::Create(opts);
auto meter_provider =

@ -50,6 +50,7 @@ int main(int argc, char** argv) {
opentelemetry::exporter::metrics::PrometheusExporterOptions opts;
// default was "localhost:9464" which causes connection issue across GKE pods
opts.url = "0.0.0.0:9464";
opts.without_otel_scope = false;
auto prometheus_exporter =
opentelemetry::exporter::metrics::PrometheusExporterFactory::Create(opts);
auto meter_provider =

@ -49,6 +49,7 @@ int main(int argc, char** argv) {
// exporter.
opentelemetry::exporter::metrics::PrometheusExporterOptions opts;
opts.url = absl::GetFlag(FLAGS_prometheus_endpoint);
opts.without_otel_scope = false;
auto prometheus_exporter =
opentelemetry::exporter::metrics::PrometheusExporterFactory::Create(opts);
auto meter_provider =

@ -52,6 +52,7 @@ int main(int argc, char** argv) {
// exporter.
opentelemetry::exporter::metrics::PrometheusExporterOptions opts;
opts.url = absl::GetFlag(FLAGS_prometheus_endpoint);
opts.without_otel_scope = false;
auto prometheus_exporter =
opentelemetry::exporter::metrics::PrometheusExporterFactory::Create(opts);
auto meter_provider =

@ -31,10 +31,10 @@ def run():
response, call = stub.SayHello.with_call(
helloworld_pb2.HelloRequest(name="you"),
metadata=(
("initial-metadata-1", "The value should be str"),
("initial-metadata-1", "The value must be str"),
(
"binary-metadata-bin",
b"With -bin surffix, the value can be bytes",
b"With -bin surffix, the value must be bytes",
),
("accesstoken", "gRPC Python is great"),
),

12
gRPC-C++.podspec generated

@ -294,6 +294,9 @@ Pod::Spec.new do |s|
'src/core/client_channel/subchannel_interface_internal.h',
'src/core/client_channel/subchannel_pool_interface.h',
'src/core/client_channel/subchannel_stream_client.h',
'src/core/config/config_vars.h',
'src/core/config/core_configuration.h',
'src/core/config/load_config.h',
'src/core/ext/filters/backend_metrics/backend_metric_filter.h',
'src/core/ext/filters/backend_metrics/backend_metric_provider.h',
'src/core/ext/filters/channel_idle/idle_filter_state.h',
@ -862,9 +865,6 @@ Pod::Spec.new do |s|
'src/core/lib/channel/status_util.h',
'src/core/lib/compression/compression_internal.h',
'src/core/lib/compression/message_compress.h',
'src/core/lib/config/config_vars.h',
'src/core/lib/config/core_configuration.h',
'src/core/lib/config/load_config.h',
'src/core/lib/debug/trace.h',
'src/core/lib/debug/trace_flags.h',
'src/core/lib/debug/trace_impl.h',
@ -1586,6 +1586,9 @@ Pod::Spec.new do |s|
'src/core/client_channel/subchannel_interface_internal.h',
'src/core/client_channel/subchannel_pool_interface.h',
'src/core/client_channel/subchannel_stream_client.h',
'src/core/config/config_vars.h',
'src/core/config/core_configuration.h',
'src/core/config/load_config.h',
'src/core/ext/filters/backend_metrics/backend_metric_filter.h',
'src/core/ext/filters/backend_metrics/backend_metric_provider.h',
'src/core/ext/filters/channel_idle/idle_filter_state.h',
@ -2154,9 +2157,6 @@ Pod::Spec.new do |s|
'src/core/lib/channel/status_util.h',
'src/core/lib/compression/compression_internal.h',
'src/core/lib/compression/message_compress.h',
'src/core/lib/config/config_vars.h',
'src/core/lib/config/core_configuration.h',
'src/core/lib/config/load_config.h',
'src/core/lib/debug/trace.h',
'src/core/lib/debug/trace_flags.h',
'src/core/lib/debug/trace_impl.h',

20
gRPC-Core.podspec generated

@ -285,6 +285,13 @@ Pod::Spec.new do |s|
'src/core/client_channel/subchannel_pool_interface.h',
'src/core/client_channel/subchannel_stream_client.cc',
'src/core/client_channel/subchannel_stream_client.h',
'src/core/config/config_vars.cc',
'src/core/config/config_vars.h',
'src/core/config/config_vars_non_generated.cc',
'src/core/config/core_configuration.cc',
'src/core/config/core_configuration.h',
'src/core/config/load_config.cc',
'src/core/config/load_config.h',
'src/core/ext/filters/backend_metrics/backend_metric_filter.cc',
'src/core/ext/filters/backend_metrics/backend_metric_filter.h',
'src/core/ext/filters/backend_metrics/backend_metric_provider.h',
@ -1250,13 +1257,6 @@ Pod::Spec.new do |s|
'src/core/lib/compression/compression_internal.h',
'src/core/lib/compression/message_compress.cc',
'src/core/lib/compression/message_compress.h',
'src/core/lib/config/config_vars.cc',
'src/core/lib/config/config_vars.h',
'src/core/lib/config/config_vars_non_generated.cc',
'src/core/lib/config/core_configuration.cc',
'src/core/lib/config/core_configuration.h',
'src/core/lib/config/load_config.cc',
'src/core/lib/config/load_config.h',
'src/core/lib/debug/trace.cc',
'src/core/lib/debug/trace.h',
'src/core/lib/debug/trace_flags.cc',
@ -2439,6 +2439,9 @@ Pod::Spec.new do |s|
'src/core/client_channel/subchannel_interface_internal.h',
'src/core/client_channel/subchannel_pool_interface.h',
'src/core/client_channel/subchannel_stream_client.h',
'src/core/config/config_vars.h',
'src/core/config/core_configuration.h',
'src/core/config/load_config.h',
'src/core/ext/filters/backend_metrics/backend_metric_filter.h',
'src/core/ext/filters/backend_metrics/backend_metric_provider.h',
'src/core/ext/filters/channel_idle/idle_filter_state.h',
@ -3007,9 +3010,6 @@ Pod::Spec.new do |s|
'src/core/lib/channel/status_util.h',
'src/core/lib/compression/compression_internal.h',
'src/core/lib/compression/message_compress.h',
'src/core/lib/config/config_vars.h',
'src/core/lib/config/core_configuration.h',
'src/core/lib/config/load_config.h',
'src/core/lib/debug/trace.h',
'src/core/lib/debug/trace_flags.h',
'src/core/lib/debug/trace_impl.h',

14
grpc.gemspec generated

@ -171,6 +171,13 @@ Gem::Specification.new do |s|
s.files += %w( src/core/client_channel/subchannel_pool_interface.h )
s.files += %w( src/core/client_channel/subchannel_stream_client.cc )
s.files += %w( src/core/client_channel/subchannel_stream_client.h )
s.files += %w( src/core/config/config_vars.cc )
s.files += %w( src/core/config/config_vars.h )
s.files += %w( src/core/config/config_vars_non_generated.cc )
s.files += %w( src/core/config/core_configuration.cc )
s.files += %w( src/core/config/core_configuration.h )
s.files += %w( src/core/config/load_config.cc )
s.files += %w( src/core/config/load_config.h )
s.files += %w( src/core/ext/filters/backend_metrics/backend_metric_filter.cc )
s.files += %w( src/core/ext/filters/backend_metrics/backend_metric_filter.h )
s.files += %w( src/core/ext/filters/backend_metrics/backend_metric_provider.h )
@ -1136,13 +1143,6 @@ Gem::Specification.new do |s|
s.files += %w( src/core/lib/compression/compression_internal.h )
s.files += %w( src/core/lib/compression/message_compress.cc )
s.files += %w( src/core/lib/compression/message_compress.h )
s.files += %w( src/core/lib/config/config_vars.cc )
s.files += %w( src/core/lib/config/config_vars.h )
s.files += %w( src/core/lib/config/config_vars_non_generated.cc )
s.files += %w( src/core/lib/config/core_configuration.cc )
s.files += %w( src/core/lib/config/core_configuration.h )
s.files += %w( src/core/lib/config/load_config.cc )
s.files += %w( src/core/lib/config/load_config.h )
s.files += %w( src/core/lib/debug/trace.cc )
s.files += %w( src/core/lib/debug/trace.h )
s.files += %w( src/core/lib/debug/trace_flags.cc )

@ -17,20 +17,27 @@
#ifndef GRPCPP_EXT_ORCA_SERVICE_H
#define GRPCPP_EXT_ORCA_SERVICE_H
#include <grpc/event_engine/event_engine.h>
#include <grpcpp/ext/server_metric_recorder.h>
#include <grpcpp/impl/service_type.h>
#include <grpcpp/impl/sync.h>
#include <grpcpp/server_builder.h>
#include <grpcpp/support/server_callback.h>
#include <grpcpp/support/slice.h>
#include <grpcpp/support/status.h>
#include <map>
#include <string>
#include <cstdint>
#include "absl/base/thread_annotations.h"
#include "absl/time/time.h"
#include "absl/types/optional.h"
namespace grpc {
namespace testing {
class OrcaServiceTest;
} // namespace testing
namespace experimental {
// RPC service implementation for supplying out-of-band backend
@ -54,7 +61,15 @@ class OrcaService : public Service {
Options options);
private:
class ReactorHook {
public:
virtual ~ReactorHook() = default;
virtual void OnFinish(grpc::Status status) = 0;
virtual void OnStartWrite(const ByteBuffer* response) = 0;
};
class Reactor;
friend class testing::OrcaServiceTest;
Slice GetOrCreateSerializedResponse();

14
package.xml generated

@ -153,6 +153,13 @@
<file baseinstalldir="/" name="src/core/client_channel/subchannel_pool_interface.h" role="src" />
<file baseinstalldir="/" name="src/core/client_channel/subchannel_stream_client.cc" role="src" />
<file baseinstalldir="/" name="src/core/client_channel/subchannel_stream_client.h" role="src" />
<file baseinstalldir="/" name="src/core/config/config_vars.cc" role="src" />
<file baseinstalldir="/" name="src/core/config/config_vars.h" role="src" />
<file baseinstalldir="/" name="src/core/config/config_vars_non_generated.cc" role="src" />
<file baseinstalldir="/" name="src/core/config/core_configuration.cc" role="src" />
<file baseinstalldir="/" name="src/core/config/core_configuration.h" role="src" />
<file baseinstalldir="/" name="src/core/config/load_config.cc" role="src" />
<file baseinstalldir="/" name="src/core/config/load_config.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/backend_metrics/backend_metric_filter.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/backend_metrics/backend_metric_filter.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/backend_metrics/backend_metric_provider.h" role="src" />
@ -1118,13 +1125,6 @@
<file baseinstalldir="/" name="src/core/lib/compression/compression_internal.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/compression/message_compress.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/compression/message_compress.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/config/config_vars.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/config/config_vars.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/config/config_vars_non_generated.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/config/core_configuration.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/config/core_configuration.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/config/load_config.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/config/load_config.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/debug/trace.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/debug/trace.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/debug/trace_flags.cc" role="src" />

@ -928,6 +928,7 @@ grpc_cc_library(
deps = [
"join_state",
"map",
"promise_factory",
"//:gpr_platform",
],
)
@ -968,6 +969,7 @@ grpc_cc_library(
"join_state",
"map",
"poll",
"promise_factory",
"status_flag",
"//:gpr_platform",
],
@ -982,6 +984,7 @@ grpc_cc_library(
deps = [
"construct_destruct",
"poll",
"promise_factory",
"//:gpr_platform",
],
)
@ -1045,7 +1048,6 @@ grpc_cc_library(
"promise_status",
"seq_state",
"status_flag",
"//:debug_location",
"//:gpr_platform",
],
)
@ -8090,6 +8092,50 @@ grpc_cc_library(
],
)
grpc_cc_library(
name = "chaotic_good_control_endpoint",
srcs = [
"ext/transport/chaotic_good/control_endpoint.cc",
],
hdrs = [
"ext/transport/chaotic_good/control_endpoint.h",
],
external_deps = ["absl/cleanup"],
deps = [
"1999",
"event_engine_context",
"event_engine_tcp_socket_utils",
"grpc_promise_endpoint",
"loop",
"try_seq",
"//:gpr",
],
)
grpc_cc_library(
name = "chaotic_good_data_endpoints",
srcs = [
"ext/transport/chaotic_good/data_endpoints.cc",
],
hdrs = [
"ext/transport/chaotic_good/data_endpoints.h",
],
external_deps = [
"absl/cleanup",
"absl/strings",
],
deps = [
"1999",
"event_engine_context",
"grpc_promise_endpoint",
"loop",
"seq",
"slice_buffer",
"try_seq",
"//:promise",
],
)
grpc_cc_library(
name = "chaotic_good_transport",
hdrs = [
@ -8102,16 +8148,21 @@ grpc_cc_library(
],
language = "c++",
deps = [
"chaotic_good_control_endpoint",
"chaotic_good_data_endpoints",
"chaotic_good_frame",
"chaotic_good_frame_header",
"event_engine_context",
"event_engine_tcp_socket_utils",
"grpc_promise_endpoint",
"if",
"loop",
"match_promise",
"mpsc",
"seq",
"try_join",
"try_seq",
"//:gpr_platform",
"//:grpc_trace",
"//:promise",
],
)
@ -8126,8 +8177,8 @@ grpc_cc_library(
external_deps = [
"absl/base:core_headers",
"absl/container:flat_hash_map",
"absl/log:check",
"absl/log",
"absl/log:check",
"absl/random",
"absl/random:bit_gen_ref",
"absl/status",
@ -8184,12 +8235,13 @@ grpc_cc_library(
"absl/base:core_headers",
"absl/container:flat_hash_map",
"absl/functional:any_invocable",
"absl/log",
"absl/log:check",
"absl/log:log",
"absl/random",
"absl/random:bit_gen_ref",
"absl/status",
"absl/status:statusor",
"absl/cleanup",
"absl/types:optional",
"absl/types:variant",
],
@ -8331,6 +8383,7 @@ grpc_cc_library(
"absl/random:bit_gen_ref",
"absl/status",
"absl/status:statusor",
"absl/cleanup",
"absl/types:optional",
"absl/types:variant",
],
@ -8705,8 +8758,8 @@ grpc_cc_library(
],
external_deps = [
"absl/container:flat_hash_map",
"absl/log",
"absl/log:check",
"absl/log:log",
"absl/random",
"absl/random:bit_gen_ref",
"absl/status",
@ -8737,6 +8790,7 @@ grpc_cc_library(
"if",
"inter_activity_latch",
"iomgr_fwd",
"join",
"latch",
"memory_quota",
"metadata",
@ -8837,8 +8891,8 @@ grpc_cc_library(
"ext/transport/chaotic_good/client/chaotic_good_connector.h",
],
external_deps = [
"absl/log",
"absl/log:check",
"absl/log:log",
"absl/random",
"absl/random:bit_gen_ref",
"absl/status",
@ -8847,6 +8901,7 @@ grpc_cc_library(
language = "c++",
deps = [
"activity",
"all_ok",
"arena",
"channel_args",
"channel_args_endpoint_config",

@ -25,7 +25,7 @@
#include "absl/log/log.h"
#include "absl/status/status.h"
#include "src/core/lib/config/config_vars.h"
#include "src/core/config/config_vars.h"
#include "src/core/lib/iomgr/closure.h"
#include "src/core/lib/iomgr/error.h"
#include "src/core/lib/iomgr/iomgr.h"

@ -53,11 +53,11 @@
#include "src/core/client_channel/local_subchannel_pool.h"
#include "src/core/client_channel/subchannel.h"
#include "src/core/client_channel/subchannel_interface_internal.h"
#include "src/core/config/core_configuration.h"
#include "src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h"
#include "src/core/lib/address_utils/sockaddr_utils.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/channel/status_util.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/debug/trace.h"
#include "src/core/lib/event_engine/channel_args_endpoint_config.h"
#include "src/core/lib/iomgr/resolved_address.h"

@ -59,12 +59,12 @@
#include "src/core/client_channel/retry_filter.h"
#include "src/core/client_channel/subchannel.h"
#include "src/core/client_channel/subchannel_interface_internal.h"
#include "src/core/config/core_configuration.h"
#include "src/core/handshaker/proxy_mapper_registry.h"
#include "src/core/lib/address_utils/sockaddr_utils.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/channel/channel_stack.h"
#include "src/core/lib/channel/status_util.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/debug/trace.h"
#include "src/core/lib/experiments/experiments.h"
#include "src/core/lib/iomgr/exec_ctx.h"

@ -23,8 +23,8 @@
#include "src/core/client_channel/client_channel_filter.h"
#include "src/core/client_channel/client_channel_service_config.h"
#include "src/core/client_channel/retry_service_config.h"
#include "src/core/config/core_configuration.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/surface/channel_stack_type.h"
namespace grpc_core {

@ -25,8 +25,8 @@
#include "absl/strings/string_view.h"
#include "absl/types/optional.h"
#include "src/core/config/core_configuration.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/load_balancing/lb_policy.h"
#include "src/core/service_config/service_config_parser.h"
#include "src/core/util/json/json.h"

@ -14,7 +14,7 @@
#include "src/core/client_channel/direct_channel.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/config/core_configuration.h"
#include "src/core/lib/event_engine/event_engine_context.h"
#include "src/core/lib/surface/channel_stack_type.h"
#include "src/core/lib/surface/client_call.h"

@ -19,8 +19,8 @@
#include "src/core/client_channel/client_channel_internal.h"
#include "src/core/client_channel/lb_metadata.h"
#include "src/core/client_channel/subchannel.h"
#include "src/core/config/core_configuration.h"
#include "src/core/lib/channel/status_util.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/promise/loop.h"
#include "src/core/telemetry/call_tracer.h"

@ -30,9 +30,9 @@
#include "absl/strings/numbers.h"
#include "absl/strings/str_cat.h"
#include "absl/types/optional.h"
#include "src/core/config/core_configuration.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/channel/status_util.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/util/json/json_channel_args.h"
// As per the retry design, we do not allow more than 5 retry attempts.

@ -25,9 +25,9 @@
#include "absl/strings/string_view.h"
#include "absl/types/optional.h"
#include "src/core/config/core_configuration.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/channel/status_util.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/service_config/service_config_parser.h"
#include "src/core/util/json/json.h"
#include "src/core/util/json/json_args.h"

@ -39,12 +39,12 @@
#include "src/core/channelz/channelz.h"
#include "src/core/client_channel/client_channel_internal.h"
#include "src/core/client_channel/subchannel_pool_interface.h"
#include "src/core/config/core_configuration.h"
#include "src/core/handshaker/proxy_mapper_registry.h"
#include "src/core/lib/address_utils/sockaddr_utils.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/channel/channel_stack.h"
#include "src/core/lib/channel/channel_stack_builder_impl.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/debug/trace.h"
#include "src/core/lib/experiments/experiments.h"
#include "src/core/lib/iomgr/exec_ctx.h"

@ -16,13 +16,13 @@
// Automatically generated by tools/codegen/core/gen_config_vars.py
//
#include "src/core/lib/config/config_vars.h"
#include "src/core/config/config_vars.h"
#include <grpc/support/port_platform.h>
#include "absl/flags/flag.h"
#include "absl/strings/escaping.h"
#include "src/core/lib/config/load_config.h"
#include "src/core/config/load_config.h"
#ifndef GPR_DEFAULT_LOG_VERBOSITY_STRING
#define GPR_DEFAULT_LOG_VERBOSITY_STRING ""

@ -16,8 +16,8 @@
// Automatically generated by tools/codegen/core/gen_config_vars.py
//
#ifndef GRPC_SRC_CORE_LIB_CONFIG_CONFIG_VARS_H
#define GRPC_SRC_CORE_LIB_CONFIG_CONFIG_VARS_H
#ifndef GRPC_SRC_CORE_CONFIG_CONFIG_VARS_H
#define GRPC_SRC_CORE_CONFIG_CONFIG_VARS_H
#include <grpc/support/port_platform.h>
#include <stdint.h>
@ -125,4 +125,4 @@ class GPR_DLL ConfigVars {
} // namespace grpc_core
#endif // GRPC_SRC_CORE_LIB_CONFIG_CONFIG_VARS_H
#endif // GRPC_SRC_CORE_CONFIG_CONFIG_VARS_H

@ -17,7 +17,7 @@
#include <atomic>
#include <string>
#include "src/core/lib/config/config_vars.h"
#include "src/core/config/config_vars.h"
namespace grpc_core {

@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
#include "src/core/lib/config/core_configuration.h"
#include "src/core/config/core_configuration.h"
#include <grpc/support/port_platform.h>

@ -12,8 +12,8 @@
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef GRPC_SRC_CORE_LIB_CONFIG_CORE_CONFIGURATION_H
#define GRPC_SRC_CORE_LIB_CONFIG_CORE_CONFIGURATION_H
#ifndef GRPC_SRC_CORE_CONFIG_CORE_CONFIGURATION_H
#define GRPC_SRC_CORE_CONFIG_CORE_CONFIGURATION_H
#include <grpc/support/port_platform.h>
@ -239,4 +239,4 @@ extern void BuildCoreConfiguration(CoreConfiguration::Builder* builder);
} // namespace grpc_core
#endif // GRPC_SRC_CORE_LIB_CONFIG_CORE_CONFIGURATION_H
#endif // GRPC_SRC_CORE_CONFIG_CORE_CONFIGURATION_H

@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
#include "src/core/lib/config/load_config.h"
#include "src/core/config/load_config.h"
#include <grpc/support/port_platform.h>
#include <stdio.h>

@ -12,8 +12,8 @@
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef GRPC_SRC_CORE_LIB_CONFIG_LOAD_CONFIG_H
#define GRPC_SRC_CORE_LIB_CONFIG_LOAD_CONFIG_H
#ifndef GRPC_SRC_CORE_CONFIG_LOAD_CONFIG_H
#define GRPC_SRC_CORE_CONFIG_LOAD_CONFIG_H
#include <grpc/support/port_platform.h>
#include <stdint.h>
@ -51,4 +51,4 @@ std::string LoadConfig(const absl::Flag<std::vector<std::string>>& flag,
} // namespace grpc_core
#endif // GRPC_SRC_CORE_LIB_CONFIG_LOAD_CONFIG_H
#endif // GRPC_SRC_CORE_CONFIG_LOAD_CONFIG_H

@ -26,9 +26,9 @@
#include "absl/log/log.h"
#include "absl/strings/string_view.h"
#include "src/core/config/core_configuration.h"
#include "src/core/lib/channel/channel_stack.h"
#include "src/core/lib/channel/promise_based_filter.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/debug/trace.h"
#include "src/core/lib/experiments/experiments.h"
#include "src/core/lib/promise/context.h"

@ -28,9 +28,9 @@
#include "absl/random/random.h"
#include "absl/status/statusor.h"
#include "absl/types/optional.h"
#include "src/core/config/core_configuration.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/channel/promise_based_filter.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/debug/trace.h"
#include "src/core/lib/experiments/experiments.h"
#include "src/core/lib/iomgr/closure.h"

@ -35,10 +35,10 @@
#include "absl/strings/str_cat.h"
#include "absl/strings/string_view.h"
#include "absl/types/optional.h"
#include "src/core/config/core_configuration.h"
#include "src/core/ext/filters/fault_injection/fault_injection_service_config_parser.h"
#include "src/core/lib/channel/channel_stack.h"
#include "src/core/lib/channel/status_util.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/debug/trace.h"
#include "src/core/lib/promise/context.h"
#include "src/core/lib/promise/sleep.h"

@ -28,8 +28,8 @@
#include <vector>
#include "absl/strings/string_view.h"
#include "src/core/config/core_configuration.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/service_config/service_config_parser.h"
#include "src/core/util/json/json.h"
#include "src/core/util/json/json_args.h"

@ -22,9 +22,9 @@
#include "absl/log/check.h"
#include "absl/strings/str_cat.h"
#include "src/core/config/core_configuration.h"
#include "src/core/ext/filters/gcp_authentication/gcp_authentication_service_config_parser.h"
#include "src/core/lib/channel/channel_stack.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/promise/context.h"
#include "src/core/lib/resource_quota/arena.h"
#include "src/core/lib/security/context/security_context.h"

@ -25,8 +25,8 @@
#include "absl/strings/string_view.h"
#include "absl/types/optional.h"
#include "src/core/config/core_configuration.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/service_config/service_config_parser.h"
#include "src/core/util/json/json.h"
#include "src/core/util/json/json_args.h"

@ -27,8 +27,8 @@
#include "absl/status/status.h"
#include "absl/strings/string_view.h"
#include "absl/types/optional.h"
#include "src/core/config/core_configuration.h"
#include "src/core/lib/channel/channel_stack.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/security/transport/auth_filters.h"
#include "src/core/lib/surface/channel_stack_type.h"
#include "src/core/lib/transport/metadata_batch.h"

@ -19,12 +19,12 @@
#include <grpc/support/port_platform.h>
#include "absl/strings/match.h"
#include "src/core/config/core_configuration.h"
#include "src/core/ext/filters/http/client/http_client_filter.h"
#include "src/core/ext/filters/http/message_compress/compression_filter.h"
#include "src/core/ext/filters/http/server/http_server_filter.h"
#include "src/core/ext/filters/message_size/message_size_filter.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/experiments/experiments.h"
#include "src/core/lib/surface/channel_stack_type.h"
#include "src/core/lib/transport/transport.h"

@ -41,13 +41,13 @@
#include "absl/types/optional.h"
#include "opencensus/stats/stats.h"
#include "opencensus/tags/tag_key.h"
#include "src/core/config/core_configuration.h"
#include "src/core/ext/filters/load_reporting/registered_opencensus_objects.h"
#include "src/core/lib/address_utils/parse_address.h"
#include "src/core/lib/channel/call_finalization.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/channel/channel_fwd.h"
#include "src/core/lib/channel/channel_stack.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/iomgr/resolved_address.h"
#include "src/core/lib/iomgr/sockaddr.h"
#include "src/core/lib/iomgr/socket_utils.h"

@ -45,11 +45,11 @@
#include "absl/strings/strip.h"
#include "absl/types/optional.h"
#include "src/core/client_channel/client_channel_filter.h"
#include "src/core/config/core_configuration.h"
#include "src/core/ext/filters/logging/logging_sink.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/channel/channel_fwd.h"
#include "src/core/lib/channel/channel_stack.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/promise/arena_promise.h"
#include "src/core/lib/promise/cancel_callback.h"
#include "src/core/lib/promise/context.h"

@ -26,9 +26,9 @@
#include "absl/log/log.h"
#include "absl/strings/str_format.h"
#include "src/core/config/core_configuration.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/channel/channel_stack.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/debug/trace.h"
#include "src/core/lib/promise/activity.h"
#include "src/core/lib/promise/context.h"

@ -26,10 +26,10 @@
#include "absl/status/statusor.h"
#include "absl/strings/string_view.h"
#include "absl/types/optional.h"
#include "src/core/config/core_configuration.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/channel/channel_fwd.h"
#include "src/core/lib/channel/promise_based_filter.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/promise/arena_promise.h"
#include "src/core/lib/transport/transport.h"
#include "src/core/service_config/service_config_parser.h"

@ -24,10 +24,10 @@
#include <utility>
#include "absl/status/status.h"
#include "src/core/config/core_configuration.h"
#include "src/core/ext/filters/rbac/rbac_service_config_parser.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/channel/channel_stack.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/iomgr/error.h"
#include "src/core/lib/promise/context.h"
#include "src/core/lib/promise/promise.h"

@ -26,8 +26,8 @@
#include <vector>
#include "absl/strings/string_view.h"
#include "src/core/config/core_configuration.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/security/authorization/grpc_authorization_engine.h"
#include "src/core/lib/security/authorization/rbac_policy.h"
#include "src/core/service_config/service_config_parser.h"

@ -35,9 +35,9 @@
#include "absl/strings/string_view.h"
#include "absl/strings/strip.h"
#include "absl/types/optional.h"
#include "src/core/config/core_configuration.h"
#include "src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h"
#include "src/core/lib/channel/channel_stack.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/debug/trace.h"
#include "src/core/lib/promise/context.h"
#include "src/core/lib/promise/map.h"

@ -26,8 +26,8 @@
#include "absl/strings/string_view.h"
#include "absl/types/optional.h"
#include "src/core/config/core_configuration.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/service_config/service_config_parser.h"
#include "src/core/util/json/json.h"
#include "src/core/util/json/json_args.h"

@ -19,10 +19,10 @@ package chaotic_good_frame;
message Settings {
// Connection id
// - sent server->client on the control channel to specify the
// data channel connection id
// - sent client->server on the data channel to complete the
// connection
bytes connection_id = 1;
// data channel connection id, one for each desired connection
// - exactly one sent client->server on the data channel to
// complete the connection
repeated bytes connection_id = 1;
// Flag true if this is a data channel (and not a control channel)
bool data_channel = 2;
// Requested alignment for the data channel

@ -20,15 +20,18 @@
#include <cstdint>
#include <utility>
#include "absl/log/log.h"
#include "absl/random/random.h"
#include "absl/strings/escaping.h"
#include "src/core/ext/transport/chaotic_good/control_endpoint.h"
#include "src/core/ext/transport/chaotic_good/data_endpoints.h"
#include "src/core/ext/transport/chaotic_good/frame.h"
#include "src/core/ext/transport/chaotic_good/frame_header.h"
#include "src/core/lib/debug/trace.h"
#include "src/core/lib/event_engine/event_engine_context.h"
#include "src/core/lib/event_engine/tcp_socket_utils.h"
#include "src/core/lib/promise/if.h"
#include "src/core/lib/promise/promise.h"
#include "src/core/lib/promise/loop.h"
#include "src/core/lib/promise/match_promise.h"
#include "src/core/lib/promise/mpsc.h"
#include "src/core/lib/promise/seq.h"
#include "src/core/lib/promise/try_join.h"
#include "src/core/lib/promise/try_seq.h"
#include "src/core/lib/transport/promise_endpoint.h"
@ -36,6 +39,49 @@
namespace grpc_core {
namespace chaotic_good {
inline std::vector<PromiseEndpoint> OneDataEndpoint(PromiseEndpoint endpoint) {
std::vector<PromiseEndpoint> ep;
ep.emplace_back(std::move(endpoint));
return ep;
}
// One received frame: the header, and the serialized bytes of the payload.
// The payload may not yet be received into memory, so the accessor for that
// returns a promise that will need to be resolved prior to inspecting the
// bytes.
// In this way we can pull bytes from various different data connections and
// read them in any order, but still have a trivial reassembly in the receiving
// call promise.
class IncomingFrame {
public:
template <typename T>
IncomingFrame(FrameHeader header, T payload, size_t remove_padding)
: header_(header),
payload_(std::move(payload)),
remove_padding_(remove_padding) {}
const FrameHeader& header() { return header_; }
auto Payload() {
return Map(
MatchPromise(
std::move(payload_),
[](absl::StatusOr<SliceBuffer> status) { return status; },
[](DataEndpoints::ReadTicket ticket) { return ticket.Await(); }),
[remove_padding =
remove_padding_](absl::StatusOr<SliceBuffer> payload) {
if (payload.ok()) payload->RemoveLastNBytesNoInline(remove_padding);
return payload;
});
}
private:
FrameHeader header_;
absl::variant<absl::StatusOr<SliceBuffer>, DataEndpoints::ReadTicket>
payload_;
size_t remove_padding_;
};
class ChaoticGoodTransport : public RefCounted<ChaoticGoodTransport> {
public:
struct Options {
@ -44,47 +90,85 @@ class ChaoticGoodTransport : public RefCounted<ChaoticGoodTransport> {
uint32_t inlined_payload_size_threshold = 8 * 1024;
};
ChaoticGoodTransport(PromiseEndpoint control_endpoint,
PromiseEndpoint data_endpoint, Options options)
: control_endpoint_(std::move(control_endpoint)),
data_endpoint_(std::move(data_endpoint)),
options_(options) {
// Enable RxMemoryAlignment and RPC receive coalescing after the transport
// setup is complete. At this point all the settings frames should have
// been read.
data_endpoint_.EnforceRxMemoryAlignmentAndCoalescing();
}
ChaoticGoodTransport(
PromiseEndpoint control_endpoint,
std::vector<PromiseEndpoint> data_endpoints,
std::shared_ptr<grpc_event_engine::experimental::EventEngine>
event_engine,
Options options)
: event_engine_(std::move(event_engine)),
control_endpoint_(std::move(control_endpoint), event_engine_.get()),
data_endpoints_(std::move(data_endpoints), event_engine_.get()),
options_(options) {}
auto WriteFrame(const FrameInterface& frame) {
SliceBuffer control;
SliceBuffer data;
FrameHeader header = frame.MakeHeader();
if (header.payload_length > options_.inlined_payload_size_threshold) {
header.payload_connection_id = 1;
header.Serialize(control.AddTiny(FrameHeader::kFrameHeaderSize));
frame.SerializePayload(data);
const size_t padding = header.Padding(options_.encode_alignment);
if (padding != 0) {
auto slice = MutableSlice::CreateUninitialized(padding);
memset(slice.data(), 0, padding);
data.AppendIndexed(Slice(std::move(slice)));
}
} else {
header.Serialize(control.AddTiny(FrameHeader::kFrameHeaderSize));
frame.SerializePayload(control);
}
// ignore encoding errors: they will be logged separately already
GRPC_TRACE_LOG(chaotic_good, INFO)
<< "CHAOTIC_GOOD: WriteFrame to:"
<< ResolvedAddressToString(control_endpoint_.GetPeerAddress())
.value_or("<<unknown peer address>>")
<< " " << frame.ToString();
return TryJoin<absl::StatusOr>(control_endpoint_.Write(std::move(control)),
data_endpoint_.Write(std::move(data)));
return If(
// If we have no data endpoints, OR this is a small payload
data_endpoints_.empty() ||
header.payload_length <= options_.inlined_payload_size_threshold,
// ... then write it to the control endpoint
[this, &header, &frame]() {
SliceBuffer output;
header.Serialize(output.AddTiny(FrameHeader::kFrameHeaderSize));
frame.SerializePayload(output);
return control_endpoint_.Write(std::move(output));
},
// ... otherwise write it to a data connection
[this, header, &frame]() mutable {
SliceBuffer payload;
// Temporarily give a bogus connection id to get padding right
header.payload_connection_id = 1;
const size_t padding = header.Padding(options_.encode_alignment);
frame.SerializePayload(payload);
GRPC_TRACE_LOG(chaotic_good, INFO)
<< "CHAOTIC_GOOD: Send " << payload.Length()
<< "b payload on data channel; add " << padding << " bytes for "
<< options_.encode_alignment << " alignment";
if (padding != 0) {
auto slice = MutableSlice::CreateUninitialized(padding);
memset(slice.data(), 0, padding);
payload.AppendIndexed(Slice(std::move(slice)));
}
return Seq(data_endpoints_.Write(std::move(payload)),
[this, header](uint32_t connection_id) mutable {
header.payload_connection_id = connection_id + 1;
SliceBuffer header_frame;
header.Serialize(
header_frame.AddTiny(FrameHeader::kFrameHeaderSize));
return control_endpoint_.Write(std::move(header_frame));
});
});
}
// Common outbound loop for both client and server (these vary only over the
// frame type).
template <typename Frame>
auto TransportWriteLoop(MpscReceiver<Frame>& outgoing_frames) {
return Loop([self = Ref(), &outgoing_frames] {
return TrySeq(
// Get next outgoing frame.
outgoing_frames.Next(),
// Serialize and write it out.
[self = self.get()](Frame client_frame) {
return self->WriteFrame(GetFrameInterface(client_frame));
},
[]() -> LoopCtl<absl::Status> {
// The write failures will be caught in TrySeq and exit loop.
// Therefore, only need to return Continue() in the last lambda
// function.
return Continue();
});
});
}
// Read frame header and payloads for control and data portions of one frame.
// Resolves to StatusOr<tuple<FrameHeader, BufferPair>>.
// Resolves to StatusOr<IncomingFrame>.
auto ReadFrameBytes() {
return TrySeq(
control_endpoint_.ReadSlice(FrameHeader::kFrameHeaderSize),
@ -102,19 +186,36 @@ class ChaoticGoodTransport : public RefCounted<ChaoticGoodTransport> {
return frame_header;
},
[this](FrameHeader frame_header) {
current_frame_header_ = frame_header;
auto con = frame_header.payload_connection_id == 0
? &control_endpoint_
: &data_endpoint_;
return con->Read(frame_header.payload_length +
frame_header.Padding(options_.decode_alignment));
},
[this](SliceBuffer payload)
-> absl::StatusOr<std::tuple<FrameHeader, SliceBuffer>> {
payload.RemoveLastNBytesNoInline(
current_frame_header_.Padding(options_.decode_alignment));
return std::tuple<FrameHeader, SliceBuffer>(current_frame_header_,
std::move(payload));
return If(
// If the payload is on the connection frame
frame_header.payload_connection_id == 0,
// ... then read the data immediately and return an IncomingFrame
// that contains the payload.
// We need to do this here so that we do not create head of line
// blocking issues reading later control frames (but waiting for a
// call to get scheduled time to read the payload).
[this, frame_header]() {
return Map(control_endpoint_.Read(frame_header.payload_length),
[frame_header](absl::StatusOr<SliceBuffer> payload)
-> absl::StatusOr<IncomingFrame> {
if (!payload.ok()) return payload.status();
return IncomingFrame(frame_header,
std::move(payload), 0);
});
},
// ... otherwise issue a read to the appropriate data endpoint,
// which will return a read ticket - which can be used later
// in the call promise to asynchronously wait for those bytes
// to be available.
[this, frame_header]() -> absl::StatusOr<IncomingFrame> {
const auto padding =
frame_header.Padding(options_.decode_alignment);
return IncomingFrame(
frame_header,
data_endpoints_.Read(frame_header.payload_connection_id - 1,
frame_header.payload_length + padding),
padding);
});
});
}
@ -135,10 +236,10 @@ class ChaoticGoodTransport : public RefCounted<ChaoticGoodTransport> {
}
private:
PromiseEndpoint control_endpoint_;
PromiseEndpoint data_endpoint_;
FrameHeader current_frame_header_;
Options options_;
std::shared_ptr<grpc_event_engine::experimental::EventEngine> event_engine_;
ControlEndpoint control_endpoint_;
DataEndpoints data_endpoints_;
const Options options_;
};
} // namespace chaotic_good

@ -28,6 +28,7 @@
#include "absl/status/statusor.h"
#include "src/core/client_channel/client_channel_factory.h"
#include "src/core/client_channel/client_channel_filter.h"
#include "src/core/config/core_configuration.h"
#include "src/core/ext/transport/chaotic_good/chaotic_good_frame.pb.h"
#include "src/core/ext/transport/chaotic_good/client_transport.h"
#include "src/core/ext/transport/chaotic_good/frame.h"
@ -35,7 +36,6 @@
#include "src/core/ext/transport/chaotic_good_legacy/client/chaotic_good_connector.h"
#include "src/core/handshaker/handshaker.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/event_engine/channel_args_endpoint_config.h"
#include "src/core/lib/event_engine/event_engine_context.h"
#include "src/core/lib/event_engine/extensions/chaotic_good_extension.h"
@ -46,6 +46,7 @@
#include "src/core/lib/iomgr/event_engine_shims/endpoint.h"
#include "src/core/lib/iomgr/exec_ctx.h"
#include "src/core/lib/promise/activity.h"
#include "src/core/lib/promise/all_ok.h"
#include "src/core/lib/promise/context.h"
#include "src/core/lib/promise/event_engine_wakeup_scheduler.h"
#include "src/core/lib/promise/latch.h"
@ -90,48 +91,53 @@ ChaoticGoodConnector::~ChaoticGoodConnector() {
}
auto ChaoticGoodConnector::DataEndpointReadSettingsFrame(
RefCountedPtr<ChaoticGoodConnector> self) {
return TrySeq(self->data_endpoint_.ReadSlice(FrameHeader::kFrameHeaderSize),
[self](Slice slice) mutable {
// Read setting frame;
// Parse frame header
auto frame_header_ =
FrameHeader::Parse(reinterpret_cast<const uint8_t*>(
GRPC_SLICE_START_PTR(slice.c_slice())));
return If(
frame_header_.ok(),
[frame_header_ = *frame_header_, self]() {
auto frame_header_length = frame_header_.payload_length;
return TrySeq(
self->data_endpoint_.Read(frame_header_length),
RefCountedPtr<ChaoticGoodConnector> self, uint32_t data_connection_index) {
return TrySeq(
self->data_endpoints_[data_connection_index].ReadSlice(
FrameHeader::kFrameHeaderSize),
[self, data_connection_index](Slice slice) mutable {
// Read setting frame;
// Parse frame header
auto frame_header_ =
FrameHeader::Parse(reinterpret_cast<const uint8_t*>(
GRPC_SLICE_START_PTR(slice.c_slice())));
return If(
frame_header_.ok(),
[data_connection_index, frame_header_ = *frame_header_, self]() {
auto frame_header_length = frame_header_.payload_length;
return TrySeq(self->data_endpoints_[data_connection_index].Read(
frame_header_length),
[]() { return absl::OkStatus(); });
},
[status = frame_header_.status()]() { return status; });
});
},
[status = frame_header_.status()]() { return status; });
});
}
auto ChaoticGoodConnector::DataEndpointWriteSettingsFrame(
RefCountedPtr<ChaoticGoodConnector> self) {
RefCountedPtr<ChaoticGoodConnector> self, uint32_t data_connection_index) {
// Serialize setting frame.
SettingsFrame frame;
frame.settings.set_data_channel(true);
frame.settings.set_connection_id(self->connection_id_);
frame.settings.add_connection_id(
self->connection_ids_[data_connection_index]);
frame.settings.set_alignment(kDataAlignmentBytes);
SliceBuffer write_buffer;
frame.MakeHeader().Serialize(
write_buffer.AddTiny(FrameHeader::kFrameHeaderSize));
frame.SerializePayload(write_buffer);
// ignore encoding errors: they will be logged separately already
return self->data_endpoint_.Write(std::move(write_buffer));
return self->data_endpoints_[data_connection_index].Write(
std::move(write_buffer));
}
auto ChaoticGoodConnector::WaitForDataEndpointSetup(
RefCountedPtr<ChaoticGoodConnector> self) {
RefCountedPtr<ChaoticGoodConnector> self, uint32_t data_connection_index) {
// Data endpoint on_connect callback.
grpc_event_engine::experimental::EventEngine::OnConnectCallback
on_data_endpoint_connect =
[self](absl::StatusOr<std::unique_ptr<EventEngine::Endpoint>>
endpoint) mutable {
[self, data_connection_index](
absl::StatusOr<std::unique_ptr<EventEngine::Endpoint>>
endpoint) mutable {
ExecCtx exec_ctx;
if (!endpoint.ok() || self->handshake_mgr_ == nullptr) {
MutexLock lock(&self->mu_);
@ -150,9 +156,9 @@ auto ChaoticGoodConnector::WaitForDataEndpointSetup(
chaotic_good_ext->EnableStatsCollection(
/*is_control_channel=*/false);
}
self->data_endpoint_ =
self->data_endpoints_[data_connection_index] =
PromiseEndpoint(std::move(endpoint.value()), SliceBuffer());
self->data_endpoint_ready_.Set();
self->data_endpoint_ready_[data_connection_index]->Set();
};
self->event_engine_->Connect(
std::move(on_data_endpoint_connect), *self->resolved_addr_,
@ -161,13 +167,13 @@ auto ChaoticGoodConnector::WaitForDataEndpointSetup(
ResourceQuota::Default()->memory_quota()->CreateMemoryAllocator(
"data_endpoint_connection"),
std::chrono::seconds(kTimeoutSecs));
return TrySeq(Race(
TrySeq(self->data_endpoint_ready_.Wait(),
[self]() mutable {
return TrySeq(DataEndpointWriteSettingsFrame(self),
DataEndpointReadSettingsFrame(self),
[]() -> absl::Status { return absl::OkStatus(); });
TrySeq(self->data_endpoint_ready_[data_connection_index]->Wait(),
[self, data_connection_index]() mutable {
return TrySeq(
DataEndpointWriteSettingsFrame(self, data_connection_index),
DataEndpointReadSettingsFrame(self, data_connection_index),
[]() -> absl::Status { return absl::OkStatus(); });
}),
TrySeq(Sleep(Timestamp::Now() + Duration::Seconds(kTimeoutSecs)),
[]() -> absl::Status {
@ -198,10 +204,29 @@ auto ChaoticGoodConnector::ControlEndpointReadSettingsFrame(
return absl::UnavailableError(
"no connection id in settings frame");
}
self->connection_id_ = frame.settings.connection_id();
for (const auto& connection_id :
frame.settings.connection_id()) {
self->connection_ids_.push_back(connection_id);
}
self->data_endpoints_.resize(self->connection_ids_.size());
for (size_t i = 0; i < self->connection_ids_.size(); ++i) {
self->data_endpoint_ready_.emplace_back(
std::make_unique<InterActivityLatch<void>>());
}
return absl::OkStatus();
},
WaitForDataEndpointSetup(self)),
[self]() {
// TODO(ctiller): find a better way than this
std::vector<uint32_t> connection_ids;
for (uint32_t i = 0; i < self->connection_ids_.size(); i++) {
connection_ids.push_back(i);
}
return AllOkIter<absl::Status>(
connection_ids.begin(), connection_ids.end(),
[self](uint32_t connection_id) {
return WaitForDataEndpointSetup(self, connection_id);
});
}),
[status = frame_header.status()]() { return status; });
});
}
@ -318,7 +343,7 @@ void ChaoticGoodConnector::OnHandshakeDone(
if (status.ok()) {
self->result_->transport = new ChaoticGoodClientTransport(
std::move(self->control_endpoint_),
std::move(self->data_endpoint_), self->args_.channel_args,
std::move(self->data_endpoints_), self->args_.channel_args,
self->event_engine_);
self->result_->channel_args = self->args_.channel_args;
ExecCtx::Run(DEBUG_LOCATION, std::exchange(self->notify_, nullptr),

@ -65,15 +65,15 @@ class ChaoticGoodConnector : public SubchannelConnector {
private:
static auto DataEndpointReadSettingsFrame(
RefCountedPtr<ChaoticGoodConnector> self);
RefCountedPtr<ChaoticGoodConnector> self, uint32_t data_connection_index);
static auto DataEndpointWriteSettingsFrame(
RefCountedPtr<ChaoticGoodConnector> self);
RefCountedPtr<ChaoticGoodConnector> self, uint32_t data_connection_index);
static auto ControlEndpointReadSettingsFrame(
RefCountedPtr<ChaoticGoodConnector> self);
static auto ControlEndpointWriteSettingsFrame(
RefCountedPtr<ChaoticGoodConnector> self);
static auto WaitForDataEndpointSetup(
RefCountedPtr<ChaoticGoodConnector> self);
static auto WaitForDataEndpointSetup(RefCountedPtr<ChaoticGoodConnector> self,
uint32_t data_connection_index);
void OnHandshakeDone(absl::StatusOr<HandshakerArgs*> result);
RefCountedPtr<Arena> arena_ = SimpleArenaAllocator()->MakeArena();
@ -86,13 +86,13 @@ class ChaoticGoodConnector : public SubchannelConnector {
resolved_addr_;
PromiseEndpoint control_endpoint_;
PromiseEndpoint data_endpoint_;
std::vector<PromiseEndpoint> data_endpoints_;
std::vector<std::string> connection_ids_;
ActivityPtr connect_activity_ ABSL_GUARDED_BY(mu_);
const std::shared_ptr<grpc_event_engine::experimental::EventEngine>
event_engine_;
RefCountedPtr<HandshakeManager> handshake_mgr_;
InterActivityLatch<void> data_endpoint_ready_;
std::string connection_id_;
std::vector<std::unique_ptr<InterActivityLatch<void>>> data_endpoint_ready_;
};
} // namespace chaotic_good
} // namespace grpc_core

@ -62,25 +62,6 @@ void ChaoticGoodClientTransport::Orphan() {
Unref();
}
auto ChaoticGoodClientTransport::TransportWriteLoop(
RefCountedPtr<ChaoticGoodTransport> transport) {
return Loop([this, transport = std::move(transport)] {
return TrySeq(
// Get next outgoing frame.
outgoing_frames_.Next(),
// Serialize and write it out.
[transport = transport.get()](ClientFrame client_frame) {
return transport->WriteFrame(GetFrameInterface(client_frame));
},
[]() -> LoopCtl<absl::Status> {
// The write failures will be caught in TrySeq and exit loop.
// Therefore, only need to return Continue() in the last lambda
// function.
return Continue();
});
});
}
absl::optional<CallHandler> ChaoticGoodClientTransport::LookupStream(
uint32_t stream_id) {
MutexLock lock(&mu_);
@ -119,31 +100,39 @@ auto ChaoticGoodClientTransport::PushFrameIntoCall(
}
template <typename T>
auto ChaoticGoodClientTransport::DispatchFrame(ChaoticGoodTransport* transport,
const FrameHeader& header,
SliceBuffer payload) {
auto ChaoticGoodClientTransport::DispatchFrame(
RefCountedPtr<ChaoticGoodTransport> transport,
IncomingFrame incoming_frame) {
absl::optional<CallHandler> call_handler =
LookupStream(incoming_frame.header().stream_id);
return GRPC_LATENT_SEE_PROMISE(
"ChaoticGoodClientTransport::DispatchFrame",
TrySeq(
[transport, header, payload = std::move(payload)]() mutable {
return transport->DeserializeFrame<T>(header, std::move(payload));
},
[this](T frame) {
absl::optional<CallHandler> call_handler =
LookupStream(frame.stream_id);
return If(
call_handler.has_value(),
[this, &call_handler, &frame]() {
return call_handler->SpawnWaitable(
"push-frame", [this, call_handler = *call_handler,
frame = std::move(frame)]() mutable {
If(
call_handler.has_value(),
[this, &call_handler, &incoming_frame, &transport]() {
// TODO(ctiller): instead of SpawnWaitable here we probably want a
// small queue to push into, so that the call can proceed
// asynchronously to other calls regardless of frame ordering.
return call_handler->SpawnWaitable(
"push-frame", [this, call_handler = *call_handler,
incoming_frame = std::move(incoming_frame),
transport = std::move(transport)]() mutable {
return TrySeq(
incoming_frame.Payload(),
[transport = std::move(transport),
header = incoming_frame.header()](SliceBuffer payload) {
return transport->DeserializeFrame<T>(
header, std::move(payload));
},
[call_handler, this](T frame) mutable {
return Map(call_handler.CancelIfFails(PushFrameIntoCall(
std::move(frame), call_handler)),
[](StatusFlag) { return absl::OkStatus(); });
});
},
[]() { return absl::OkStatus(); });
}));
},
ImmediateOkStatus());
});
},
[]() { return absl::OkStatus(); }));
}
auto ChaoticGoodClientTransport::TransportReadLoop(
@ -151,27 +140,24 @@ auto ChaoticGoodClientTransport::TransportReadLoop(
return Loop([this, transport = std::move(transport)] {
return TrySeq(
transport->ReadFrameBytes(),
[this, transport = transport.get()](
std::tuple<FrameHeader, SliceBuffer> frame_bytes) {
const auto& header = std::get<0>(frame_bytes);
SliceBuffer& payload = std::get<1>(frame_bytes);
[this, transport](IncomingFrame incoming_frame) {
return Switch(
header.type,
incoming_frame.header().type,
Case<FrameType, FrameType::kServerInitialMetadata>([&, this]() {
return DispatchFrame<ServerInitialMetadataFrame>(
transport, header, std::move(payload));
transport, std::move(incoming_frame));
}),
Case<FrameType, FrameType::kServerTrailingMetadata>([&, this]() {
return DispatchFrame<ServerTrailingMetadataFrame>(
transport, header, std::move(payload));
transport, std::move(incoming_frame));
}),
Case<FrameType, FrameType::kMessage>([&, this]() {
return DispatchFrame<MessageFrame>(transport, header,
std::move(payload));
return DispatchFrame<MessageFrame>(transport,
std::move(incoming_frame));
}),
Default([&]() {
LOG_EVERY_N_SEC(INFO, 10)
<< "Bad frame type: " << header.ToString();
<< "Bad frame type: " << incoming_frame.header().ToString();
return absl::OkStatus();
}));
},
@ -191,36 +177,42 @@ auto ChaoticGoodClientTransport::OnTransportActivityDone(
}
ChaoticGoodClientTransport::ChaoticGoodClientTransport(
PromiseEndpoint control_endpoint, PromiseEndpoint data_endpoint,
const ChannelArgs& args,
PromiseEndpoint control_endpoint,
std::vector<PromiseEndpoint> data_endpoints, const ChannelArgs& args,
std::shared_ptr<grpc_event_engine::experimental::EventEngine> event_engine)
: allocator_(args.GetObject<ResourceQuota>()
->memory_quota()
->CreateMemoryAllocator("chaotic-good")),
outgoing_frames_(4) {
CHECK(event_engine != nullptr);
// Set up TCP tracer if enabled.
if (args.GetBool(GRPC_ARG_TCP_TRACING_ENABLED).value_or(false)) {
auto* epte = grpc_event_engine::experimental::QueryExtension<
grpc_event_engine::experimental::TcpTraceExtension>(
data_endpoint.GetEventEngineEndpoint().get());
if (epte != nullptr) {
epte->InitializeAndReturnTcpTracer();
for (auto& ep : data_endpoints) {
auto* epte = grpc_event_engine::experimental::QueryExtension<
grpc_event_engine::experimental::TcpTraceExtension>(
ep.GetEventEngineEndpoint().get());
if (epte != nullptr) {
epte->InitializeAndReturnTcpTracer();
}
}
}
CHECK(event_engine != nullptr);
ChaoticGoodTransport::Options options;
options.inlined_payload_size_threshold =
args.GetInt("grpc.chaotic_good.inlined_payload_size_threshold")
.value_or(options.inlined_payload_size_threshold);
auto transport = MakeRefCounted<ChaoticGoodTransport>(
std::move(control_endpoint), std::move(data_endpoint), options);
std::move(control_endpoint), std::move(data_endpoints), event_engine,
options);
auto party_arena = SimpleArenaAllocator(0)->MakeArena();
party_arena->SetContext<grpc_event_engine::experimental::EventEngine>(
event_engine.get());
party_ = Party::Make(std::move(party_arena));
party_->Spawn("client-chaotic-writer",
GRPC_LATENT_SEE_PROMISE("ClientTransportWriteLoop",
TransportWriteLoop(transport)),
OnTransportActivityDone("write_loop"));
party_->Spawn(
"client-chaotic-writer",
GRPC_LATENT_SEE_PROMISE("ClientTransportWriteLoop",
transport->TransportWriteLoop(outgoing_frames_)),
OnTransportActivityDone("write_loop"));
party_->Spawn(
"client-chaotic-reader",
GRPC_LATENT_SEE_PROMISE("ClientTransportReadLoop",

@ -64,7 +64,8 @@ namespace chaotic_good {
class ChaoticGoodClientTransport final : public ClientTransport {
public:
ChaoticGoodClientTransport(
PromiseEndpoint control_endpoint, PromiseEndpoint data_endpoint,
PromiseEndpoint control_endpoint,
std::vector<PromiseEndpoint> data_endpoints,
const ChannelArgs& channel_args,
std::shared_ptr<grpc_event_engine::experimental::EventEngine>
event_engine);
@ -89,10 +90,9 @@ class ChaoticGoodClientTransport final : public ClientTransport {
absl::optional<CallHandler> LookupStream(uint32_t stream_id);
auto CallOutboundLoop(uint32_t stream_id, CallHandler call_handler);
auto OnTransportActivityDone(absl::string_view what);
auto TransportWriteLoop(RefCountedPtr<ChaoticGoodTransport> transport);
template <typename T>
auto DispatchFrame(ChaoticGoodTransport* transport, const FrameHeader& header,
SliceBuffer payload);
auto DispatchFrame(RefCountedPtr<ChaoticGoodTransport> transport,
IncomingFrame incoming_frame);
auto TransportReadLoop(RefCountedPtr<ChaoticGoodTransport> transport);
// Push one frame into a call
auto PushFrameIntoCall(ServerInitialMetadataFrame frame,

@ -0,0 +1,68 @@
// Copyright 2024 gRPC authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "src/core/ext/transport/chaotic_good/control_endpoint.h"
#include "src/core/lib/event_engine/event_engine_context.h"
#include "src/core/lib/event_engine/tcp_socket_utils.h"
#include "src/core/lib/promise/loop.h"
#include "src/core/lib/promise/try_seq.h"
namespace grpc_core {
namespace chaotic_good {
auto ControlEndpoint::Buffer::Pull() {
return [this]() -> Poll<SliceBuffer> {
Waker waker;
auto cleanup = absl::MakeCleanup([&waker]() { waker.Wakeup(); });
MutexLock lock(&mu_);
if (queued_output_.Length() == 0) {
flush_waker_ = GetContext<Activity>()->MakeNonOwningWaker();
return Pending{};
}
waker = std::move(write_waker_);
return std::move(queued_output_);
};
}
ControlEndpoint::ControlEndpoint(
PromiseEndpoint endpoint,
grpc_event_engine::experimental::EventEngine* event_engine)
: endpoint_(std::make_shared<PromiseEndpoint>(std::move(endpoint))) {
CHECK(event_engine != nullptr);
write_party_->arena()->SetContext(event_engine);
write_party_->Spawn(
"flush-control",
GRPC_LATENT_SEE_PROMISE(
"FlushLoop", Loop([endpoint = endpoint_, buffer = buffer_]() {
return TrySeq(
// Pull one set of buffered writes
buffer->Pull(),
// And write them
[endpoint, buffer = buffer.get()](SliceBuffer flushing) {
GRPC_TRACE_LOG(chaotic_good, INFO)
<< "CHAOTIC_GOOD: Flush " << flushing.Length()
<< " bytes from " << buffer << " to "
<< ResolvedAddressToString(endpoint->GetPeerAddress())
.value_or("<<unknown peer address>>");
return endpoint->Write(std::move(flushing));
},
// Then repeat
[]() -> LoopCtl<absl::Status> { return Continue{}; });
})),
[](absl::Status) {});
}
} // namespace chaotic_good
} // namespace grpc_core

@ -0,0 +1,99 @@
// Copyright 2024 gRPC authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef GRPC_SRC_CORE_EXT_TRANSPORT_CHAOTIC_GOOD_CONTROL_ENDPOINT_H
#define GRPC_SRC_CORE_EXT_TRANSPORT_CHAOTIC_GOOD_CONTROL_ENDPOINT_H
#include "absl/cleanup/cleanup.h"
#include "src/core/lib/promise/party.h"
#include "src/core/lib/transport/promise_endpoint.h"
#include "src/core/util/sync.h"
namespace grpc_core {
namespace chaotic_good {
// Wrapper around PromiseEndpoint.
// Buffers all of the small writes that get enqueued to this endpoint, and then
// uses a separate party to flush them to the wire.
// In doing so we get to batch up effectively all the writes from the transport
// (since party wakeups are sticky), and then flush all the writes in one go.
class ControlEndpoint {
private:
class Buffer : public RefCounted<Buffer> {
public:
// Queue some buffer to be written.
// We cap the queue size so that we don't infinitely buffer on one
// connection - if the cap is hit, this queue operation will not resolve
// until it empties.
// Returns a promise that resolves to Empty{} when the data has been queued.
auto Queue(SliceBuffer&& buffer) {
return [buffer = std::move(buffer), this]() mutable -> Poll<Empty> {
Waker waker;
auto cleanup = absl::MakeCleanup([&waker]() { waker.Wakeup(); });
MutexLock lock(&mu_);
if (queued_output_.Length() != 0 &&
queued_output_.Length() + buffer.Length() > MaxQueued()) {
GRPC_TRACE_LOG(chaotic_good, INFO)
<< "CHAOTIC_GOOD: Delay control write"
<< " write_length=" << buffer.Length()
<< " already_buffered=" << queued_output_.Length()
<< " queue=" << this;
write_waker_ = GetContext<Activity>()->MakeNonOwningWaker();
return Pending{};
}
GRPC_TRACE_LOG(chaotic_good, INFO)
<< "CHAOTIC_GOOD: Queue control write " << buffer.Length()
<< " bytes on " << this;
waker = std::move(flush_waker_);
queued_output_.Append(buffer);
return Empty{};
};
}
auto Pull();
private:
size_t MaxQueued() const { return 1024 * 1024; }
Mutex mu_;
Waker write_waker_ ABSL_GUARDED_BY(mu_);
Waker flush_waker_ ABSL_GUARDED_BY(mu_);
SliceBuffer queued_output_ ABSL_GUARDED_BY(mu_);
};
public:
ControlEndpoint(PromiseEndpoint endpoint,
grpc_event_engine::experimental::EventEngine* event_engine);
// Write some data to the control endpoint; returns a promise that resolves
// to Empty{} -- it's not possible to see errors from this api.
auto Write(SliceBuffer&& bytes) { return buffer_->Queue(std::move(bytes)); }
// Read operations are simply passthroughs to the underlying promise endpoint.
auto ReadSlice(size_t length) { return endpoint_->ReadSlice(length); }
auto Read(size_t length) { return endpoint_->Read(length); }
auto GetPeerAddress() const { return endpoint_->GetPeerAddress(); }
auto GetLocalAddress() const { return endpoint_->GetLocalAddress(); }
private:
std::shared_ptr<PromiseEndpoint> endpoint_;
RefCountedPtr<Party> write_party_ =
Party::Make(SimpleArenaAllocator(0)->MakeArena());
RefCountedPtr<Buffer> buffer_ = MakeRefCounted<Buffer>();
};
} // namespace chaotic_good
} // namespace grpc_core
#endif // GRPC_SRC_CORE_EXT_TRANSPORT_CHAOTIC_GOOD_CONTROL_ENDPOINT_H

@ -0,0 +1,236 @@
// Copyright 2024 gRPC authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "src/core/ext/transport/chaotic_good/data_endpoints.h"
#include <cstddef>
#include "absl/cleanup/cleanup.h"
#include "absl/strings/escaping.h"
#include "src/core/lib/event_engine/event_engine_context.h"
#include "src/core/lib/promise/loop.h"
#include "src/core/lib/promise/seq.h"
#include "src/core/lib/promise/try_seq.h"
namespace grpc_core {
namespace chaotic_good {
namespace data_endpoints_detail {
///////////////////////////////////////////////////////////////////////////////
// OutputBuffer
bool OutputBuffer::Accept(SliceBuffer& buffer) {
if (pending_.Length() != 0 &&
pending_.Length() + buffer.Length() > pending_max_) {
return false;
}
pending_.Append(buffer);
return true;
}
///////////////////////////////////////////////////////////////////////////////
// OutputBuffers
OutputBuffers::OutputBuffers(uint32_t num_connections)
: buffers_(num_connections) {}
Poll<uint32_t> OutputBuffers::PollWrite(SliceBuffer& output_buffer) {
Waker waker;
auto cleanup = absl::MakeCleanup([&waker]() { waker.Wakeup(); });
const auto length = output_buffer.Length();
MutexLock lock(&mu_);
for (size_t i = 0; i < buffers_.size(); ++i) {
if (buffers_[i].Accept(output_buffer)) {
GRPC_TRACE_LOG(chaotic_good, INFO)
<< "CHAOTIC_GOOD: Queue " << length << " data onto endpoint " << i
<< " queue " << this;
waker = buffers_[i].TakeWaker();
return i;
}
}
GRPC_TRACE_LOG(chaotic_good, INFO)
<< "CHAOTIC_GOOD: No data endpoint ready for " << length
<< " bytes on queue " << this;
write_waker_ = GetContext<Activity>()->MakeNonOwningWaker();
return Pending{};
}
Poll<SliceBuffer> OutputBuffers::PollNext(uint32_t connection_id) {
Waker waker;
auto cleanup = absl::MakeCleanup([&waker]() { waker.Wakeup(); });
MutexLock lock(&mu_);
auto& buffer = buffers_[connection_id];
if (buffer.HavePending()) {
waker = std::move(write_waker_);
return buffer.TakePending();
}
buffer.SetWaker();
return Pending{};
}
///////////////////////////////////////////////////////////////////////////////
// InputQueues
InputQueues::InputQueues(uint32_t num_connections)
: read_requests_(num_connections), read_request_waker_(num_connections) {}
absl::StatusOr<uint64_t> InputQueues::CreateTicket(uint32_t connection_id,
size_t length) {
Waker waker;
auto cleanup = absl::MakeCleanup([&waker]() { waker.Wakeup(); });
MutexLock lock(&mu_);
if (connection_id >= read_requests_.size()) {
return absl::UnavailableError(
absl::StrCat("Invalid connection id: ", connection_id));
}
uint64_t ticket = next_ticket_id_;
++next_ticket_id_;
auto r = ReadRequest{length, ticket};
GRPC_TRACE_LOG(chaotic_good, INFO)
<< "CHAOTIC_GOOD: New read ticket on #" << connection_id << " " << r;
read_requests_[connection_id].push_back(r);
outstanding_reads_.emplace(ticket, Waker{});
waker = std::move(read_request_waker_[connection_id]);
return ticket;
}
Poll<absl::StatusOr<SliceBuffer>> InputQueues::PollRead(uint64_t ticket) {
MutexLock lock(&mu_);
auto it = outstanding_reads_.find(ticket);
CHECK(it != outstanding_reads_.end()) << " ticket=" << ticket;
if (auto* waker = absl::get_if<Waker>(&it->second)) {
*waker = GetContext<Activity>()->MakeNonOwningWaker();
return Pending{};
}
auto result = std::move(absl::get<absl::StatusOr<SliceBuffer>>(it->second));
outstanding_reads_.erase(it);
GRPC_TRACE_LOG(chaotic_good, INFO)
<< "CHAOTIC_GOOD: Poll for ticket #" << ticket
<< " completes: " << result.status();
return result;
}
Poll<std::vector<InputQueues::ReadRequest>> InputQueues::PollNext(
uint32_t connection_id) {
MutexLock lock(&mu_);
auto& q = read_requests_[connection_id];
if (q.empty()) {
read_request_waker_[connection_id] =
GetContext<Activity>()->MakeNonOwningWaker();
return Pending{};
}
auto r = std::move(q);
q.clear();
return r;
}
void InputQueues::CompleteRead(uint64_t ticket,
absl::StatusOr<SliceBuffer> buffer) {
Waker waker;
auto cleanup = absl::MakeCleanup([&waker]() { waker.Wakeup(); });
MutexLock lock(&mu_);
GRPC_TRACE_LOG(chaotic_good, INFO)
<< "CHAOTIC_GOOD: Complete ticket #" << ticket << ": " << buffer.status();
auto it = outstanding_reads_.find(ticket);
if (it == outstanding_reads_.end()) return; // cancelled
waker = std::move(absl::get<Waker>(it->second));
it->second.emplace<absl::StatusOr<SliceBuffer>>(std::move(buffer));
}
void InputQueues::CancelTicket(uint64_t ticket) {
MutexLock lock(&mu_);
outstanding_reads_.erase(ticket);
}
} // namespace data_endpoints_detail
///////////////////////////////////////////////////////////////////////////////
// DataEndpoints
DataEndpoints::DataEndpoints(
std::vector<PromiseEndpoint> endpoints_vec,
grpc_event_engine::experimental::EventEngine* event_engine)
: output_buffers_(MakeRefCounted<data_endpoints_detail::OutputBuffers>(
endpoints_vec.size())),
input_queues_(MakeRefCounted<data_endpoints_detail::InputQueues>(
endpoints_vec.size())) {
CHECK(event_engine != nullptr);
for (auto& endpoint : endpoints_vec) {
// Enable RxMemoryAlignment and RPC receive coalescing after the transport
// setup is complete. At this point all the settings frames should have
// been read.
endpoint.EnforceRxMemoryAlignmentAndCoalescing();
}
auto endpoints = MakeRefCounted<data_endpoints_detail::Endpoints>();
endpoints->endpoints = std::move(endpoints_vec);
parties_.reserve(2 * endpoints->endpoints.size());
auto arena = SimpleArenaAllocator(0)->MakeArena();
arena->SetContext(event_engine);
for (size_t i = 0; i < endpoints->endpoints.size(); ++i) {
auto write_party = Party::Make(arena);
auto read_party = Party::Make(arena);
write_party->Spawn(
"flush-data",
[i, endpoints, output_buffers = output_buffers_]() {
return Loop([i, endpoints, output_buffers]() {
return TrySeq(
output_buffers->Next(i),
[endpoints = endpoints.get(), i](SliceBuffer buffer) {
GRPC_TRACE_LOG(chaotic_good, INFO)
<< "CHAOTIC_GOOD: Write " << buffer.Length()
<< "b to data endpoint #" << i;
return endpoints->endpoints[i].Write(std::move(buffer));
},
[]() -> LoopCtl<absl::Status> { return Continue{}; });
});
},
[](absl::Status) {});
read_party->Spawn(
"read-data",
[i, endpoints, input_queues = input_queues_]() {
return Loop([i, endpoints, input_queues]() {
return TrySeq(
input_queues->Next(i),
[endpoints, i, input_queues](
std::vector<data_endpoints_detail::InputQueues::ReadRequest>
requests) {
return TrySeqContainer(
std::move(requests), Empty{},
[endpoints, i, input_queues](
data_endpoints_detail::InputQueues::ReadRequest
read_request,
Empty) {
return Seq(
endpoints->endpoints[i].Read(read_request.length),
[ticket = read_request.ticket,
input_queues](absl::StatusOr<SliceBuffer> buffer) {
input_queues->CompleteRead(ticket,
std::move(buffer));
return Empty{};
});
});
},
[]() -> LoopCtl<absl::Status> { return Continue{}; });
});
},
[](absl::Status) {});
parties_.emplace_back(std::move(write_party));
parties_.emplace_back(std::move(read_party));
}
}
} // namespace chaotic_good
} // namespace grpc_core

@ -0,0 +1,199 @@
// Copyright 2024 gRPC authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef GRPC_SRC_CORE_EXT_TRANSPORT_CHAOTIC_GOOD_DATA_ENDPOINTS_H
#define GRPC_SRC_CORE_EXT_TRANSPORT_CHAOTIC_GOOD_DATA_ENDPOINTS_H
#include <cstdint>
#include "src/core/lib/promise/party.h"
#include "src/core/lib/promise/promise.h"
#include "src/core/lib/slice/slice_buffer.h"
#include "src/core/lib/transport/promise_endpoint.h"
namespace grpc_core {
namespace chaotic_good {
namespace data_endpoints_detail {
struct Endpoints : public RefCounted<Endpoints> {
std::vector<PromiseEndpoint> endpoints;
};
// Buffered writes for one data endpoint
class OutputBuffer {
public:
bool Accept(SliceBuffer& buffer);
Waker TakeWaker() { return std::move(flush_waker_); }
void SetWaker() {
flush_waker_ = GetContext<Activity>()->MakeNonOwningWaker();
}
bool HavePending() const { return pending_.Length() > 0; }
SliceBuffer TakePending() { return std::move(pending_); }
private:
Waker flush_waker_;
size_t pending_max_ = 1024 * 1024;
SliceBuffer pending_;
};
// The set of output buffers for all connected data endpoints
class OutputBuffers : public RefCounted<OutputBuffers> {
public:
explicit OutputBuffers(uint32_t num_connections);
auto Write(SliceBuffer output_buffer) {
return [output_buffer = std::move(output_buffer), this]() mutable {
return PollWrite(output_buffer);
};
}
auto Next(uint32_t connection_id) {
return [this, connection_id]() { return PollNext(connection_id); };
}
private:
Poll<uint32_t> PollWrite(SliceBuffer& output_buffer);
Poll<SliceBuffer> PollNext(uint32_t connection_id);
Mutex mu_;
std::vector<OutputBuffer> buffers_ ABSL_GUARDED_BY(mu_);
Waker write_waker_ ABSL_GUARDED_BY(mu_);
};
class InputQueues : public RefCounted<InputQueues> {
public:
// One outstanding read.
// ReadTickets get filed by read requests, and all tickets are fullfilled
// by an endpoint.
// A call may Await a ticket to get the bytes back later (or it may skip that
// step - in which case the bytes are thrown away after reading).
// This decoupling is necessary to ensure that cancelled reads by calls do not
// cause data corruption for other calls.
class ReadTicket {
public:
ReadTicket(absl::StatusOr<uint64_t> ticket,
RefCountedPtr<InputQueues> input_queues)
: ticket_(std::move(ticket)), input_queues_(std::move(input_queues)) {}
ReadTicket(const ReadTicket&) = delete;
ReadTicket& operator=(const ReadTicket&) = delete;
ReadTicket(ReadTicket&& other) noexcept
: ticket_(std::move(other.ticket_)),
input_queues_(std::move(other.input_queues_)) {}
ReadTicket& operator=(ReadTicket&& other) noexcept {
ticket_ = std::move(other.ticket_);
input_queues_ = std::move(other.input_queues_);
return *this;
}
~ReadTicket() {
if (input_queues_ != nullptr && ticket_.ok()) {
input_queues_->CancelTicket(*ticket_);
}
}
auto Await() {
return If(
ticket_.ok(),
[&]() {
return
[ticket = *ticket_, input_queues = std::move(input_queues_)]() {
return input_queues->PollRead(ticket);
};
},
[&]() {
return Immediate(absl::StatusOr<SliceBuffer>(ticket_.status()));
});
}
private:
absl::StatusOr<uint64_t> ticket_;
RefCountedPtr<InputQueues> input_queues_;
};
struct ReadRequest {
size_t length;
uint64_t ticket;
template <typename Sink>
friend void AbslStringify(Sink& sink, const ReadRequest& req) {
sink.Append(absl::StrCat("read#", req.ticket, ":", req.length, "b"));
}
};
explicit InputQueues(uint32_t num_connections);
ReadTicket Read(uint32_t connection_id, size_t length) {
return ReadTicket(CreateTicket(connection_id, length), Ref());
}
auto Next(uint32_t connection_id) {
return [this, connection_id]() { return PollNext(connection_id); };
}
void CompleteRead(uint64_t ticket, absl::StatusOr<SliceBuffer> buffer);
void CancelTicket(uint64_t ticket);
private:
using ReadState = absl::variant<absl::StatusOr<SliceBuffer>, Waker>;
absl::StatusOr<uint64_t> CreateTicket(uint32_t connection_id, size_t length);
Poll<absl::StatusOr<SliceBuffer>> PollRead(uint64_t ticket);
Poll<std::vector<ReadRequest>> PollNext(uint32_t connection_id);
Mutex mu_;
uint64_t next_ticket_id_ ABSL_GUARDED_BY(mu_) = 0;
std::vector<std::vector<ReadRequest>> read_requests_ ABSL_GUARDED_BY(mu_);
std::vector<Waker> read_request_waker_;
absl::flat_hash_map<uint64_t, ReadState> outstanding_reads_
ABSL_GUARDED_BY(mu_);
};
} // namespace data_endpoints_detail
// Collection of data connections.
class DataEndpoints {
public:
using ReadTicket = data_endpoints_detail::InputQueues::ReadTicket;
explicit DataEndpoints(
std::vector<PromiseEndpoint> endpoints,
grpc_event_engine::experimental::EventEngine* event_engine);
// Try to queue output_buffer against a data endpoint.
// Returns a promise that resolves to the data endpoint connection id
// selected.
// Connection ids returned by this class are 0 based (which is different
// to how chaotic good communicates them on the wire - those are 1 based
// to allow for the control channel identification)
auto Write(SliceBuffer output_buffer) {
return output_buffers_->Write(std::move(output_buffer));
}
ReadTicket Read(uint32_t connection_id, uint32_t length) {
return input_queues_->Read(connection_id, length);
}
bool empty() const { return parties_.empty(); }
private:
RefCountedPtr<data_endpoints_detail::OutputBuffers> output_buffers_;
RefCountedPtr<data_endpoints_detail::InputQueues> input_queues_;
std::vector<RefCountedPtr<Party>> parties_;
};
} // namespace chaotic_good
} // namespace grpc_core
#endif // GRPC_SRC_CORE_EXT_TRANSPORT_CHAOTIC_GOOD_DATA_ENDPOINTS_H

@ -50,6 +50,7 @@
#include "src/core/lib/promise/context.h"
#include "src/core/lib/promise/event_engine_wakeup_scheduler.h"
#include "src/core/lib/promise/if.h"
#include "src/core/lib/promise/join.h"
#include "src/core/lib/promise/latch.h"
#include "src/core/lib/promise/race.h"
#include "src/core/lib/promise/sleep.h"
@ -175,17 +176,21 @@ void ChaoticGoodServerListener::ActiveConnection::Orphan() {
Unref();
}
void ChaoticGoodServerListener::ActiveConnection::NewConnectionID() {
bool has_new_id = false;
void ChaoticGoodServerListener::ActiveConnection::NewConnectionIDs(
size_t count) {
MutexLock lock(&listener_->mu_);
while (!has_new_id) {
connection_id_ = listener_->connection_id_generator_();
if (!listener_->connectivity_map_.contains(connection_id_)) {
has_new_id = true;
for (size_t i = 0; i < count; i++) {
std::string connection_id;
while (true) {
connection_id = listener_->connection_id_generator_();
if (!listener_->connectivity_map_.contains(connection_id)) {
break;
}
}
listener_->connectivity_map_.emplace(
connection_id, std::make_shared<InterActivityLatch<PromiseEndpoint>>());
connection_ids_.emplace_back(std::move(connection_id));
}
listener_->connectivity_map_.emplace(
connection_id_, std::make_shared<InterActivityLatch<PromiseEndpoint>>());
}
void ChaoticGoodServerListener::ActiveConnection::Done() {
@ -246,13 +251,20 @@ auto ChaoticGoodServerListener::ActiveConnection::HandshakingState::
return absl::UnavailableError(
"no connection id in data endpoint settings frame");
}
if (frame.settings.connection_id().size() != 1) {
return absl::UnavailableError(absl::StrCat(
"Got ", frame.settings.connection_id().size(),
" connection ids in data endpoint "
"settings frame (expect one)"));
}
if (frame.settings.alignment() == 0) {
return absl::UnavailableError(
"no alignment in data endpoint settings frame");
}
// Get connection-id and data-alignment for data endpoint.
self->connection_->connection_id_ =
frame.settings.connection_id();
self->connection_->connection_ids_.clear();
self->connection_->connection_ids_.push_back(
frame.settings.connection_id()[0]);
self->connection_->data_alignment_ =
frame.settings.alignment();
}
@ -278,12 +290,18 @@ auto ChaoticGoodServerListener::ActiveConnection::HandshakingState::
},
[self]() {
MutexLock lock(&self->connection_->listener_->mu_);
auto latch = self->connection_->listener_->connectivity_map_
.find(self->connection_->connection_id_)
->second;
return latch->Wait();
return JoinIter(
self->connection_->connection_ids_.begin(),
self->connection_->connection_ids_.end(),
[self](const std::string& connection_id) {
self->connection_->listener_->mu_.AssertHeld();
auto latch = self->connection_->listener_->connectivity_map_
.find(connection_id)
->second;
return latch->Wait();
});
},
[self](PromiseEndpoint ret) -> absl::Status {
[self](std::vector<PromiseEndpoint> ret) -> absl::Status {
MutexLock lock(&self->connection_->listener_->mu_);
GRPC_TRACE_LOG(chaotic_good, INFO)
<< self->connection_.get()
@ -305,19 +323,27 @@ auto ChaoticGoodServerListener::ActiveConnection::HandshakingState::
Sleep(Timestamp::Now() + kConnectionDeadline),
[self]() mutable -> absl::Status {
MutexLock lock(&self->connection_->listener_->mu_);
// Delete connection id from map when timeout;
self->connection_->listener_->connectivity_map_.erase(
self->connection_->connection_id_);
// Delete connection ids from map when timeout;
for (const std::string& connection_id :
self->connection_->connection_ids_) {
self->connection_->listener_->connectivity_map_.erase(
connection_id);
}
return absl::DeadlineExceededError("Deadline exceeded.");
}));
}
auto ChaoticGoodServerListener::ActiveConnection::HandshakingState::
ControlEndpointWriteSettingsFrame(RefCountedPtr<HandshakingState> self) {
self->connection_->NewConnectionID();
self->connection_->NewConnectionIDs(
self->connection_->listener_->args()
.GetInt(GRPC_ARG_CHAOTIC_GOOD_DATA_CONNECTIONS)
.value_or(1));
SettingsFrame frame;
frame.settings.set_data_channel(false);
frame.settings.set_connection_id(self->connection_->connection_id_);
for (const auto& connection_id : self->connection_->connection_ids_) {
frame.settings.add_connection_id(connection_id);
}
SliceBuffer write_buffer;
frame.MakeHeader().Serialize(
write_buffer.AddTiny(FrameHeader::kFrameHeaderSize));
@ -332,7 +358,6 @@ auto ChaoticGoodServerListener::ActiveConnection::HandshakingState::
// Send data endpoint setting frame
SettingsFrame frame;
frame.settings.set_data_channel(true);
frame.settings.set_connection_id(self->connection_->connection_id_);
frame.settings.set_alignment(self->connection_->data_alignment_);
SliceBuffer write_buffer;
frame.MakeHeader().Serialize(
@ -344,12 +369,13 @@ auto ChaoticGoodServerListener::ActiveConnection::HandshakingState::
[self]() mutable {
MutexLock lock(&self->connection_->listener_->mu_);
// Set endpoint to latch
CHECK_EQ(self->connection_->connection_ids_.size(), 1ull);
auto it = self->connection_->listener_->connectivity_map_.find(
self->connection_->connection_id_);
self->connection_->connection_ids_[0]);
if (it == self->connection_->listener_->connectivity_map_.end()) {
return absl::InternalError(
absl::StrCat("Connection not in map: ",
absl::CEscape(self->connection_->connection_id_)));
return absl::InternalError(absl::StrCat(
"Connection not in map: ",
absl::CEscape(self->connection_->connection_ids_[0])));
}
it->second->Set(std::move(self->connection_->endpoint_));
return absl::OkStatus();

@ -44,6 +44,11 @@
#include "src/core/util/sync.h"
#include "src/core/util/time.h"
// Channel arg: integer number of data connections to specify
// Defaults to 1 if not set
#define GRPC_ARG_CHAOTIC_GOOD_DATA_CONNECTIONS \
"grpc.chaotic_good.data_connections"
namespace grpc_core {
namespace chaotic_good {
class ChaoticGoodServerListener final : public Server::ListenerInterface {
@ -109,7 +114,7 @@ class ChaoticGoodServerListener final : public Server::ListenerInterface {
private:
void Done();
void NewConnectionID();
void NewConnectionIDs(size_t count);
RefCountedPtr<Arena> arena_ = SimpleArenaAllocator()->MakeArena();
const RefCountedPtr<ChaoticGoodServerListener> listener_;
RefCountedPtr<HandshakingState> handshaking_state_;
@ -117,9 +122,9 @@ class ChaoticGoodServerListener final : public Server::ListenerInterface {
ActivityPtr receive_settings_activity_ ABSL_GUARDED_BY(mu_);
bool orphaned_ ABSL_GUARDED_BY(mu_) = false;
PromiseEndpoint endpoint_;
absl::BitGen bitgen_;
std::string connection_id_;
std::vector<std::string> connection_ids_;
int32_t data_alignment_;
absl::BitGen bitgen_;
};
void Start(Server*, const std::vector<grpc_pollset*>*) override {

@ -23,6 +23,7 @@
#include <string>
#include <tuple>
#include "absl/cleanup/cleanup.h"
#include "absl/log/check.h"
#include "absl/log/log.h"
#include "absl/random/bit_gen_ref.h"
@ -50,25 +51,6 @@
namespace grpc_core {
namespace chaotic_good {
auto ChaoticGoodServerTransport::TransportWriteLoop(
RefCountedPtr<ChaoticGoodTransport> transport) {
return Loop([this, transport = std::move(transport)] {
return TrySeq(
// Get next outgoing frame.
outgoing_frames_.Next(),
// Serialize and write it out.
[transport = transport.get()](ServerFrame client_frame) {
return transport->WriteFrame(GetFrameInterface(client_frame));
},
[]() -> LoopCtl<absl::Status> {
// The write failures will be caught in TrySeq and exit loop.
// Therefore, only need to return Continue() in the last lambda
// function.
return Continue();
});
});
}
auto ChaoticGoodServerTransport::PushFrameIntoCall(CallInitiator call_initiator,
MessageFrame frame) {
GRPC_TRACE_LOG(chaotic_good, INFO)
@ -85,29 +67,35 @@ auto ChaoticGoodServerTransport::PushFrameIntoCall(CallInitiator call_initiator,
}
template <typename T>
auto ChaoticGoodServerTransport::DispatchFrame(ChaoticGoodTransport& transport,
const FrameHeader& header,
SliceBuffer payload) {
return TrySeq(
[&transport, header, payload = std::move(payload)]() mutable {
return transport.DeserializeFrame<T>(header, std::move(payload));
},
[this](T frame) {
absl::optional<CallInitiator> call_initiator =
LookupStream(frame.stream_id);
return If(
call_initiator.has_value(),
[this, &call_initiator, &frame]() {
return call_initiator->SpawnWaitable(
"push-frame", [this, call_initiator = *call_initiator,
frame = std::move(frame)]() mutable {
auto ChaoticGoodServerTransport::DispatchFrame(
RefCountedPtr<ChaoticGoodTransport> transport, IncomingFrame frame) {
absl::optional<CallInitiator> call_initiator =
LookupStream(frame.header().stream_id);
return If(
call_initiator.has_value(),
[this, &call_initiator, &frame, &transport]() {
// TODO(ctiller): instead of SpawnWaitable here we probably want a
// small queue to push into, so that the call can proceed
// asynchronously to other calls regardless of frame ordering.
return call_initiator->SpawnWaitable(
"push-frame",
[this, call_initiator = *call_initiator, frame = std::move(frame),
transport = std::move(transport)]() mutable {
return TrySeq(
frame.Payload(),
[transport = std::move(transport),
header = frame.header()](SliceBuffer payload) {
return transport->DeserializeFrame<T>(header,
std::move(payload));
},
[call_initiator, this](T frame) mutable {
return Map(call_initiator.CancelIfFails(PushFrameIntoCall(
call_initiator, std::move(frame))),
[](StatusFlag) { return absl::OkStatus(); });
});
},
[]() { return absl::OkStatus(); });
});
});
},
[]() { return absl::OkStatus(); });
}
namespace {
@ -239,35 +227,39 @@ absl::Status ChaoticGoodServerTransport::NewStream(
return absl::OkStatus();
}
auto ChaoticGoodServerTransport::ReadOneFrame(ChaoticGoodTransport& transport) {
auto ChaoticGoodServerTransport::ReadOneFrame(
RefCountedPtr<ChaoticGoodTransport> transport) {
return GRPC_LATENT_SEE_PROMISE(
"ReadOneFrame",
TrySeq(
transport.ReadFrameBytes(),
[this, transport = &transport](
std::tuple<FrameHeader, SliceBuffer> frame_bytes) {
const auto& header = std::get<0>(frame_bytes);
SliceBuffer& payload = std::get<1>(frame_bytes);
CHECK_EQ(header.payload_length, payload.Length());
transport->ReadFrameBytes(),
[this, transport](IncomingFrame incoming_frame) mutable {
// CHECK_EQ(header.payload_length, payload.Length());
return Switch(
header.type,
incoming_frame.header().type,
Case<FrameType, FrameType::kClientInitialMetadata>([&, this]() {
return Immediate(
NewStream(*transport, header, std::move(payload)));
return TrySeq(incoming_frame.Payload(),
[this, transport = std::move(transport),
header = incoming_frame.header()](
SliceBuffer payload) mutable {
return NewStream(*transport, header,
std::move(payload));
});
}),
Case<FrameType, FrameType::kMessage>([&, this]() {
return DispatchFrame<MessageFrame>(*transport, header,
std::move(payload));
}),
Case<FrameType, FrameType::kClientEndOfStream>([&, this]() {
return DispatchFrame<ClientEndOfStream>(*transport, header,
std::move(payload));
Case<FrameType, FrameType::kMessage>([&, this]() mutable {
return DispatchFrame<MessageFrame>(std::move(transport),
std::move(incoming_frame));
}),
Case<FrameType, FrameType::kClientEndOfStream>(
[&, this]() mutable {
return DispatchFrame<ClientEndOfStream>(
std::move(transport), std::move(incoming_frame));
}),
Case<FrameType, FrameType::kCancel>([&, this]() {
absl::optional<CallInitiator> call_initiator =
ExtractStream(header.stream_id);
ExtractStream(incoming_frame.header().stream_id);
GRPC_TRACE_LOG(chaotic_good, INFO)
<< "Cancel stream " << header.stream_id
<< "Cancel stream " << incoming_frame.header().stream_id
<< (call_initiator.has_value() ? " (active)"
: " (not found)");
return If(
@ -282,9 +274,8 @@ auto ChaoticGoodServerTransport::ReadOneFrame(ChaoticGoodTransport& transport) {
[]() -> absl::Status { return absl::OkStatus(); });
}),
Default([&]() {
return absl::InternalError(
absl::StrCat("Unexpected frame type: ",
static_cast<uint8_t>(header.type)));
return absl::InternalError(absl::StrCat(
"Unexpected frame type: ", incoming_frame.header().type));
}));
},
[]() -> LoopCtl<absl::Status> { return Continue{}; }));
@ -293,8 +284,8 @@ auto ChaoticGoodServerTransport::ReadOneFrame(ChaoticGoodTransport& transport) {
auto ChaoticGoodServerTransport::TransportReadLoop(
RefCountedPtr<ChaoticGoodTransport> transport) {
return Seq(got_acceptor_.Wait(),
Loop([this, transport = std::move(transport)] {
return ReadOneFrame(*transport);
Loop([this, transport = std::move(transport)]() mutable {
return ReadOneFrame(transport);
}));
}
@ -311,7 +302,7 @@ auto ChaoticGoodServerTransport::OnTransportActivityDone(
ChaoticGoodServerTransport::ChaoticGoodServerTransport(
const ChannelArgs& args, PromiseEndpoint control_endpoint,
PromiseEndpoint data_endpoint,
std::vector<PromiseEndpoint> data_endpoints,
std::shared_ptr<grpc_event_engine::experimental::EventEngine> event_engine)
: call_arena_allocator_(MakeRefCounted<CallArenaAllocator>(
args.GetObject<ResourceQuota>()
@ -325,15 +316,17 @@ ChaoticGoodServerTransport::ChaoticGoodServerTransport(
args.GetInt("grpc.chaotic_good.inlined_payload_size_threshold")
.value_or(options.inlined_payload_size_threshold);
auto transport = MakeRefCounted<ChaoticGoodTransport>(
std::move(control_endpoint), std::move(data_endpoint), options);
std::move(control_endpoint), std::move(data_endpoints), event_engine,
options);
auto party_arena = SimpleArenaAllocator(0)->MakeArena();
party_arena->SetContext<grpc_event_engine::experimental::EventEngine>(
event_engine.get());
party_ = Party::Make(std::move(party_arena));
party_->Spawn("server-chaotic-writer",
GRPC_LATENT_SEE_PROMISE("ServerTransportWriteLoop",
TransportWriteLoop(transport)),
OnTransportActivityDone("writer"));
party_->Spawn(
"server-chaotic-writer",
GRPC_LATENT_SEE_PROMISE("ServerTransportWriteLoop",
transport->TransportWriteLoop(outgoing_frames_)),
OnTransportActivityDone("writer"));
party_->Spawn("server-chaotic-reader",
GRPC_LATENT_SEE_PROMISE("ServerTransportReadLoop",
TransportReadLoop(transport)),
@ -440,6 +433,12 @@ absl::Status ChaoticGoodServerTransport::NewStream(
void ChaoticGoodServerTransport::PerformOp(grpc_transport_op* op) {
RefCountedPtr<Party> cancelled_party;
bool close_outgoing_frames = false;
auto cleanup = absl::MakeCleanup([&close_outgoing_frames, this]() {
if (close_outgoing_frames) {
outgoing_frames_.MarkClosed();
}
});
MutexLock lock(&mu_);
bool did_stuff = false;
if (op->start_connectivity_watch != nullptr) {
@ -461,7 +460,7 @@ void ChaoticGoodServerTransport::PerformOp(grpc_transport_op* op) {
}
if (!op->goaway_error.ok() || !op->disconnect_with_error.ok()) {
cancelled_party = std::move(party_);
outgoing_frames_.MarkClosed();
close_outgoing_frames = true;
state_tracker_.SetState(GRPC_CHANNEL_SHUTDOWN,
absl::UnavailableError("transport closed"),
"transport closed");

@ -77,7 +77,7 @@ class ChaoticGoodServerTransport final : public ServerTransport {
public:
ChaoticGoodServerTransport(
const ChannelArgs& args, PromiseEndpoint control_endpoint,
PromiseEndpoint data_endpoint,
std::vector<PromiseEndpoint> data_endpoints,
std::shared_ptr<grpc_event_engine::experimental::EventEngine>
event_engine);
@ -108,8 +108,7 @@ class ChaoticGoodServerTransport final : public ServerTransport {
auto CallOutboundLoop(uint32_t stream_id, CallInitiator call_initiator);
auto OnTransportActivityDone(absl::string_view activity);
auto TransportReadLoop(RefCountedPtr<ChaoticGoodTransport> transport);
auto ReadOneFrame(ChaoticGoodTransport& transport);
auto TransportWriteLoop(RefCountedPtr<ChaoticGoodTransport> transport);
auto ReadOneFrame(RefCountedPtr<ChaoticGoodTransport> transport);
// Read different parts of the server frame from control/data endpoints
// based on frame header.
// Resolves to a StatusOr<tuple<SliceBuffer, SliceBuffer>>
@ -125,8 +124,8 @@ class ChaoticGoodServerTransport final : public ServerTransport {
const FrameHeader& header,
SliceBuffer initial_metadata_payload);
template <typename T>
auto DispatchFrame(ChaoticGoodTransport& transport, const FrameHeader& header,
SliceBuffer payload);
auto DispatchFrame(RefCountedPtr<ChaoticGoodTransport> transport,
IncomingFrame frame);
auto PushFrameIntoCall(CallInitiator call_initiator, MessageFrame frame);
auto PushFrameIntoCall(CallInitiator call_initiator, ClientEndOfStream frame);
auto SendFrame(ServerFrame frame, MpscSender<ServerFrame> outgoing_frames,

@ -28,13 +28,13 @@
#include "absl/status/statusor.h"
#include "src/core/client_channel/client_channel_factory.h"
#include "src/core/client_channel/client_channel_filter.h"
#include "src/core/config/core_configuration.h"
#include "src/core/ext/transport/chaotic_good_legacy/client_transport.h"
#include "src/core/ext/transport/chaotic_good_legacy/frame.h"
#include "src/core/ext/transport/chaotic_good_legacy/frame_header.h"
#include "src/core/ext/transport/chaotic_good_legacy/settings_metadata.h"
#include "src/core/handshaker/handshaker.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/event_engine/channel_args_endpoint_config.h"
#include "src/core/lib/event_engine/event_engine_context.h"
#include "src/core/lib/event_engine/extensions/chaotic_good_extension.h"

@ -23,6 +23,7 @@
#include <string>
#include <tuple>
#include "absl/cleanup/cleanup.h"
#include "absl/log/check.h"
#include "absl/log/log.h"
#include "absl/random/bit_gen_ref.h"
@ -488,6 +489,12 @@ absl::Status ChaoticGoodServerTransport::NewStream(
void ChaoticGoodServerTransport::PerformOp(grpc_transport_op* op) {
RefCountedPtr<Party> cancelled_party;
bool close_outgoing_frames = false;
auto cleanup = absl::MakeCleanup([&close_outgoing_frames, this]() {
if (close_outgoing_frames) {
outgoing_frames_.MarkClosed();
}
});
MutexLock lock(&mu_);
bool did_stuff = false;
if (op->start_connectivity_watch != nullptr) {
@ -509,7 +516,7 @@ void ChaoticGoodServerTransport::PerformOp(grpc_transport_op* op) {
}
if (!op->goaway_error.ok() || !op->disconnect_with_error.ok()) {
cancelled_party = std::move(party_);
outgoing_frames_.MarkClosed();
close_outgoing_frames = true;
state_tracker_.SetState(GRPC_CHANNEL_SHUTDOWN,
absl::UnavailableError("transport closed"),
"transport closed");

@ -42,6 +42,7 @@
#include "src/core/client_channel/client_channel_filter.h"
#include "src/core/client_channel/connector.h"
#include "src/core/client_channel/subchannel.h"
#include "src/core/config/core_configuration.h"
#include "src/core/ext/transport/chttp2/transport/chttp2_transport.h"
#include "src/core/handshaker/handshaker.h"
#include "src/core/handshaker/handshaker_registry.h"
@ -49,7 +50,6 @@
#include "src/core/lib/address_utils/sockaddr_utils.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/channel/channel_args_preconditioning.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/debug/trace.h"
#include "src/core/lib/event_engine/channel_args_endpoint_config.h"
#include "src/core/lib/iomgr/endpoint.h"

@ -47,6 +47,7 @@
#include "absl/strings/strip.h"
#include "absl/types/optional.h"
#include "src/core/channelz/channelz.h"
#include "src/core/config/core_configuration.h"
#include "src/core/ext/transport/chttp2/transport/chttp2_transport.h"
#include "src/core/ext/transport/chttp2/transport/internal.h"
#include "src/core/ext/transport/chttp2/transport/legacy_frame.h"
@ -54,7 +55,6 @@
#include "src/core/handshaker/handshaker_registry.h"
#include "src/core/lib/address_utils/sockaddr_utils.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/debug/trace.h"
#include "src/core/lib/event_engine/channel_args_endpoint_config.h"
#include "src/core/lib/event_engine/extensions/supports_fd.h"

@ -55,6 +55,7 @@
#include "absl/strings/string_view.h"
#include "absl/types/optional.h"
#include "absl/types/variant.h"
#include "src/core/config/config_vars.h"
#include "src/core/ext/transport/chttp2/transport/call_tracer_wrapper.h"
#include "src/core/ext/transport/chttp2/transport/context_list_entry.h"
#include "src/core/ext/transport/chttp2/transport/flow_control.h"
@ -73,7 +74,6 @@
#include "src/core/ext/transport/chttp2/transport/varint.h"
#include "src/core/ext/transport/chttp2/transport/write_size_policy.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/config/config_vars.h"
#include "src/core/lib/event_engine/extensions/tcp_trace.h"
#include "src/core/lib/event_engine/query_extensions.h"
#include "src/core/lib/experiments/experiments.h"

@ -23,10 +23,10 @@
#include "absl/log/log.h"
#include "absl/status/statusor.h"
#include "src/core/config/core_configuration.h"
#include "src/core/ext/transport/cronet/transport/cronet_transport.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/channel/channel_args_preconditioning.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/iomgr/exec_ctx.h"
#include "src/core/lib/surface/channel.h"
#include "src/core/lib/surface/channel_create.h"

@ -23,8 +23,8 @@
#include "absl/log/check.h"
#include "absl/log/log.h"
#include "absl/status/status.h"
#include "src/core/config/core_configuration.h"
#include "src/core/ext/transport/inproc/legacy_inproc_transport.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/event_engine/event_engine_context.h"
#include "src/core/lib/experiments/experiments.h"
#include "src/core/lib/promise/promise.h"

@ -42,9 +42,9 @@
#include "absl/strings/string_view.h"
#include "absl/types/optional.h"
#include "src/core/channelz/channelz.h"
#include "src/core/config/core_configuration.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/channel/channel_args_preconditioning.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/iomgr/closure.h"
#include "src/core/lib/iomgr/endpoint.h"
#include "src/core/lib/iomgr/error.h"

@ -19,7 +19,7 @@
#include <grpc/support/port_platform.h>
#include "src/core/lib/config/core_configuration.h"
#include "src/core/config/core_configuration.h"
// Set by the handshaker to indicate the local address of the endpoint.
#define GRPC_ARG_ENDPOINT_LOCAL_ADDRESS "grpc.internal.endpoint_local_address"

@ -35,11 +35,11 @@
#include "absl/strings/str_cat.h"
#include "absl/strings/string_view.h"
#include "absl/types/optional.h"
#include "src/core/config/core_configuration.h"
#include "src/core/handshaker/handshaker.h"
#include "src/core/handshaker/handshaker_factory.h"
#include "src/core/handshaker/handshaker_registry.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/iomgr/closure.h"
#include "src/core/lib/iomgr/endpoint.h"
#include "src/core/lib/iomgr/error.h"

@ -21,7 +21,7 @@
#include <grpc/support/port_platform.h>
#include "src/core/lib/config/core_configuration.h"
#include "src/core/config/core_configuration.h"
/// Channel arg indicating the server in HTTP CONNECT request (string).
/// The presence of this arg triggers the use of HTTP CONNECT.

@ -25,9 +25,9 @@
#include "absl/strings/string_view.h"
#include "absl/types/optional.h"
#include "src/core/config/core_configuration.h"
#include "src/core/handshaker/proxy_mapper.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/iomgr/resolved_address.h"
namespace grpc_core {

@ -21,9 +21,9 @@
#include "absl/strings/string_view.h"
#include "absl/types/optional.h"
#include "src/core/config/core_configuration.h"
#include "src/core/handshaker/proxy_mapper.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/iomgr/resolved_address.h"
namespace grpc_core {

@ -42,12 +42,12 @@
#include "absl/strings/string_view.h"
#include "absl/types/optional.h"
#include "src/core/channelz/channelz.h"
#include "src/core/config/core_configuration.h"
#include "src/core/handshaker/handshaker.h"
#include "src/core/handshaker/handshaker_factory.h"
#include "src/core/handshaker/handshaker_registry.h"
#include "src/core/handshaker/security/secure_endpoint.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/iomgr/closure.h"
#include "src/core/lib/iomgr/endpoint.h"
#include "src/core/lib/iomgr/error.h"

@ -23,9 +23,9 @@
#include <grpc/support/port_platform.h>
#include "absl/status/statusor.h"
#include "src/core/config/core_configuration.h"
#include "src/core/handshaker/handshaker.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/security/security_connector/security_connector.h"
#include "src/core/tsi/transport_security_interface.h"
#include "src/core/util/ref_counted_ptr.h"

@ -32,12 +32,12 @@
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/types/optional.h"
#include "src/core/config/core_configuration.h"
#include "src/core/handshaker/handshaker.h"
#include "src/core/handshaker/handshaker_factory.h"
#include "src/core/handshaker/handshaker_registry.h"
#include "src/core/lib/address_utils/parse_address.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/event_engine/channel_args_endpoint_config.h"
#include "src/core/lib/iomgr/closure.h"
#include "src/core/lib/iomgr/endpoint.h"

@ -19,7 +19,7 @@
#include <grpc/support/port_platform.h>
#include "src/core/lib/config/core_configuration.h"
#include "src/core/config/core_configuration.h"
// Indicates the address that the tcp connect handshaker should connect to.
#define GRPC_ARG_TCP_HANDSHAKER_RESOLVED_ADDRESS \

@ -34,11 +34,11 @@
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/types/optional.h"
#include "src/core/config/core_configuration.h"
#include "src/core/lib/channel/call_finalization.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/channel/channel_fwd.h"
#include "src/core/lib/channel/channel_stack.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/debug/trace.h"
#include "src/core/lib/experiments/experiments.h"
#include "src/core/lib/iomgr/call_combiner.h"

@ -31,7 +31,7 @@
#include "absl/strings/str_split.h"
#include "absl/strings/string_view.h"
#include "absl/strings/strip.h"
#include "src/core/lib/config/config_vars.h"
#include "src/core/config/config_vars.h"
#include "src/core/util/glob.h"
int grpc_tracer_set_enabled(const char* name, int enabled);

@ -60,9 +60,9 @@
#include "absl/strings/str_cat.h"
#include "absl/strings/str_format.h"
#include "absl/types/optional.h"
#include "src/core/config/config_vars.h"
#include "src/core/lib/address_utils/parse_address.h"
#include "src/core/lib/address_utils/sockaddr_utils.h"
#include "src/core/lib/config/config_vars.h"
#include "src/core/lib/debug/trace.h"
#include "src/core/lib/event_engine/grpc_polled_fd.h"
#include "src/core/lib/event_engine/time_util.h"

@ -21,8 +21,8 @@
#include <utility>
#include "absl/functional/any_invocable.h"
#include "src/core/config/core_configuration.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/debug/trace.h"
#include "src/core/lib/event_engine/default_event_engine_factory.h"
#include "src/core/util/debug_location.h"

@ -20,7 +20,7 @@
#include <memory>
#include "src/core/lib/config/core_configuration.h"
#include "src/core/config/core_configuration.h"
#include "src/core/util/debug_location.h"
namespace grpc_event_engine {

@ -26,7 +26,7 @@
#include <utility>
#include <vector>
#include "src/core/lib/config/config_vars.h"
#include "src/core/config/config_vars.h"
#include "src/core/lib/debug/trace.h"
namespace grpc_event_engine {

@ -19,7 +19,7 @@
#include "absl/strings/str_split.h"
#include "absl/strings/string_view.h"
#include "src/core/lib/config/config_vars.h"
#include "src/core/config/config_vars.h"
#include "src/core/lib/event_engine/forkable.h"
#include "src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h"
#include "src/core/lib/event_engine/posix_engine/ev_poll_posix.h"

@ -31,7 +31,7 @@
#include "absl/strings/str_split.h"
#include "absl/strings/string_view.h"
#include "absl/strings/strip.h"
#include "src/core/lib/config/config_vars.h"
#include "src/core/config/config_vars.h"
#include "src/core/lib/experiments/experiments.h"
#include "src/core/util/crash.h" // IWYU pragma: keep
#include "src/core/util/no_destruct.h"

@ -54,7 +54,7 @@
allow_in_fuzzing_config: false
- name: chaotic_good_legacy_protocol
description: If set, use the first version of the chaotic-good protocol when that protocol is enabled.
expiry: 2024/12/01
expiry: 2025/01/15
owner: ctiller@google.com
test_tags: [core_end2end_test]
- name: client_privacy

@ -30,7 +30,7 @@
#include "absl/log/log.h"
#include "absl/strings/str_format.h"
#include "absl/strings/str_split.h"
#include "src/core/lib/config/config_vars.h"
#include "src/core/config/config_vars.h"
#include "src/core/lib/debug/trace.h"
#include "src/core/lib/iomgr/ev_epoll1_linux.h"
#include "src/core/lib/iomgr/ev_poll_posix.h"

@ -27,7 +27,7 @@
#include <string.h>
#include "absl/log/log.h"
#include "src/core/lib/config/config_vars.h"
#include "src/core/config/config_vars.h"
#include "src/core/lib/iomgr/buffer_list.h"
#include "src/core/lib/iomgr/exec_ctx.h"
#include "src/core/lib/iomgr/executor.h"

@ -24,6 +24,7 @@
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "src/core/lib/promise/detail/join_state.h"
#include "src/core/lib/promise/detail/promise_factory.h"
#include "src/core/lib/promise/map.h"
#include "src/core/lib/promise/poll.h"
#include "src/core/lib/promise/status_flag.h"
@ -81,6 +82,42 @@ GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION inline auto AllOk(Promises... promises) {
return promise_detail::AllOk<Result, Promises...>(std::move(promises)...);
}
// Construct a promise for each element of the set, then run them all.
// If any fail, cancel the rest and return the failure.
// If all succeed, return Ok.
template <typename Result, typename Iter, typename FactoryFn>
inline auto AllOkIter(Iter begin, Iter end, FactoryFn factory_fn) {
using Factory =
promise_detail::RepeatedPromiseFactory<decltype(*begin), FactoryFn>;
Factory factory(std::move(factory_fn));
using Promise = typename Factory::Promise;
std::vector<Promise> promises;
std::vector<bool> done;
for (auto it = begin; it != end; ++it) {
promises.emplace_back(factory.Make(*it));
done.push_back(false);
}
return [promises = std::move(promises),
done = std::move(done)]() mutable -> Poll<Result> {
using Traits = promise_detail::AllOkTraits<Result>;
bool still_working = false;
for (size_t i = 0; i < promises.size(); ++i) {
if (done[i]) continue;
auto p = promises[i]();
if (auto* r = p.value_if_ready()) {
if (!Traits::IsOk(*r)) {
return Traits::template EarlyReturn<Result>(std::move(*r));
}
done[i] = true;
} else {
still_working = true;
}
}
if (still_working) return Pending{};
return Traits::FinalReturn();
};
}
} // namespace grpc_core
#endif // GRPC_SRC_CORE_LIB_PROMISE_ALL_OK_H

@ -17,35 +17,41 @@
#include <grpc/support/port_platform.h>
#include "src/core/lib/promise/detail/promise_factory.h"
#include "src/core/lib/promise/poll.h"
#include "src/core/util/construct_destruct.h"
namespace grpc_core {
namespace promise_detail {
template <typename FactoryFn>
auto BindFactoryFnArgs(FactoryFn fn) {
return [fn = std::move(fn)](auto x) mutable {
return fn(std::get<0>(x), std::move(std::get<1>(x)));
};
}
// Models a sequence of unknown size
// At each element, the accumulator A and the current value V is passed to some
// function of type IterTraits::Factory as f(V, IterTraits::Argument); f is
// expected to return a promise that resolves to IterTraits::Wrapped.
template <class IterTraits>
template <template <typename> class Traits, typename Iter, typename FactoryFn,
typename Argument>
class BasicSeqIter {
private:
using Traits = typename IterTraits::Traits;
using Iter = typename IterTraits::Iter;
using Factory = typename IterTraits::Factory;
using Argument = typename IterTraits::Argument;
using IterValue = typename IterTraits::IterValue;
using StateCreated = typename IterTraits::StateCreated;
using State = typename IterTraits::State;
using Wrapped = typename IterTraits::Wrapped;
using BoundFactoryFn = decltype(BindFactoryFnArgs(std::declval<FactoryFn>()));
using TplArg = std::tuple<decltype((*std::declval<Iter>())), Argument>;
using Factory = RepeatedPromiseFactory<TplArg, BoundFactoryFn>;
using State = typename Factory::Promise;
using StateResult = typename State::Result;
public:
BasicSeqIter(Iter begin, Iter end, Factory f, Argument arg)
: cur_(begin), end_(end), f_(std::move(f)) {
BasicSeqIter(Iter begin, Iter end, FactoryFn f, Argument arg)
: cur_(begin), end_(end), f_(BindFactoryFnArgs(std::move(f))) {
if (cur_ == end_) {
Construct(&result_, std::move(arg));
} else {
Construct(&state_, f_(*cur_, std::move(arg)));
Construct(&state_, f_.Make(TplArg(*cur_, std::move(arg))));
}
}
@ -79,7 +85,7 @@ class BasicSeqIter {
return *this;
}
Poll<Wrapped> operator()() {
Poll<StateResult> operator()() {
if (cur_ == end_) {
return std::move(result_);
}
@ -87,11 +93,12 @@ class BasicSeqIter {
}
private:
Poll<Wrapped> PollNonEmpty() {
Poll<Wrapped> r = state_();
Poll<StateResult> PollNonEmpty() {
Poll<StateResult> r = state_();
if (r.pending()) return r;
return Traits::template CheckResultAndRunNext<Wrapped>(
std::move(r.value()), [this](Wrapped arg) -> Poll<Wrapped> {
using Tr = Traits<StateResult>;
return Tr::template CheckResultAndRunNext<StateResult>(
std::move(r.value()), [this](auto arg) -> Poll<StateResult> {
auto next = cur_;
++next;
if (next == end_) {
@ -99,7 +106,14 @@ class BasicSeqIter {
}
cur_ = next;
state_.~State();
Construct(&state_, Traits::CallSeqFactory(f_, *cur_, std::move(arg)));
struct WrapperFactory {
BasicSeqIter* owner;
State Make(typename Tr::UnwrappedType r) {
return owner->f_.Make(TplArg(*owner->cur_, std::move(r)));
}
};
WrapperFactory wrapper_factory{this};
Construct(&state_, Tr::CallFactory(&wrapper_factory, std::move(arg)));
return PollNonEmpty();
});
}

@ -22,6 +22,7 @@
#include "absl/meta/type_traits.h"
#include "src/core/lib/promise/detail/join_state.h"
#include "src/core/lib/promise/detail/promise_factory.h"
#include "src/core/lib/promise/map.h"
namespace grpc_core {
@ -84,6 +85,41 @@ GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION inline auto Join(F promise) {
return Map(std::move(promise), promise_detail::WrapInTuple{});
}
template <typename Iter, typename FactoryFn>
inline auto JoinIter(Iter begin, Iter end, FactoryFn factory_fn) {
using Factory =
promise_detail::RepeatedPromiseFactory<decltype(*begin), FactoryFn>;
Factory factory(std::move(factory_fn));
using Promise = typename Factory::Promise;
using Result = typename Promise::Result;
using State = absl::variant<Promise, Result>;
std::vector<State> state;
for (Iter it = begin; it != end; ++it) {
state.emplace_back(factory.Make(*it));
}
return [state = std::move(state)]() mutable -> Poll<std::vector<Result>> {
bool still_working = false;
for (auto& s : state) {
if (auto* promise = absl::get_if<Promise>(&s)) {
auto p = (*promise)();
if (auto* r = p.value_if_ready()) {
s.template emplace<Result>(std::move(*r));
} else {
still_working = true;
}
}
}
if (!still_working) {
std::vector<Result> output;
for (auto& s : state) {
output.emplace_back(std::move(absl::get<Result>(s)));
}
return output;
}
return Pending{};
};
}
} // namespace grpc_core
#endif // GRPC_SRC_CORE_LIB_PROMISE_JOIN_H

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save