diff --git a/BUILD b/BUILD
index 15930d5149f..a40aed74253 100644
--- a/BUILD
+++ b/BUILD
@@ -1439,8 +1439,6 @@ grpc_cc_library(
"//src/core:arena",
"//src/core:arena_promise",
"//src/core:atomic_utils",
- "//src/core:basic_join",
- "//src/core:basic_seq",
"//src/core:bitset",
"//src/core:channel_args",
"//src/core:channel_args_endpoint_config",
@@ -1469,7 +1467,7 @@ grpc_cc_library(
"//src/core:iomgr_fwd",
"//src/core:iomgr_port",
"//src/core:json",
- "//src/core:map",
+ "//src/core:latch",
"//src/core:match",
"//src/core:memory_quota",
"//src/core:no_destruct",
@@ -1495,8 +1493,6 @@ grpc_cc_library(
"//src/core:thread_quota",
"//src/core:time",
"//src/core:transport_fwd",
- "//src/core:try_join",
- "//src/core:try_seq",
"//src/core:useful",
],
)
@@ -3282,9 +3278,9 @@ grpc_cc_library(
"grpc_public_hdrs",
"grpc_trace",
"promise",
- "//src/core:activity",
"//src/core:arena",
"//src/core:arena_promise",
+ "//src/core:basic_seq",
"//src/core:channel_args",
"//src/core:channel_fwd",
"//src/core:channel_init",
@@ -3292,14 +3288,15 @@ grpc_cc_library(
"//src/core:context",
"//src/core:grpc_message_size_filter",
"//src/core:latch",
- "//src/core:map",
+ "//src/core:map_pipe",
"//src/core:percent_encoding",
"//src/core:pipe",
- "//src/core:poll",
- "//src/core:race",
+ "//src/core:promise_like",
+ "//src/core:seq",
"//src/core:slice",
"//src/core:slice_buffer",
"//src/core:transport_fwd",
+ "//src/core:try_concurrently",
],
)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 58a030b8062..65c76c1dc18 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1021,7 +1021,6 @@ if(gRPC_BUILD_TESTS)
add_dependencies(buildtests_cxx init_test)
add_dependencies(buildtests_cxx initial_settings_frame_bad_client_test)
add_dependencies(buildtests_cxx insecure_security_connector_test)
- add_dependencies(buildtests_cxx interceptor_list_test)
add_dependencies(buildtests_cxx interop_client)
add_dependencies(buildtests_cxx interop_server)
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX OR _gRPC_PLATFORM_WINDOWS)
@@ -2219,7 +2218,6 @@ add_library(grpc
src/core/lib/iomgr/buffer_list.cc
src/core/lib/iomgr/call_combiner.cc
src/core/lib/iomgr/cfstream_handle.cc
- src/core/lib/iomgr/closure.cc
src/core/lib/iomgr/combiner.cc
src/core/lib/iomgr/dualstack_socket_posix.cc
src/core/lib/iomgr/endpoint.cc
@@ -2301,8 +2299,8 @@ add_library(grpc
src/core/lib/load_balancing/lb_policy_registry.cc
src/core/lib/matchers/matchers.cc
src/core/lib/promise/activity.cc
+ src/core/lib/promise/pipe.cc
src/core/lib/promise/sleep.cc
- src/core/lib/promise/trace.cc
src/core/lib/resolver/resolver.cc
src/core/lib/resolver/resolver_registry.cc
src/core/lib/resolver/server_address.cc
@@ -2380,7 +2378,6 @@ add_library(grpc
src/core/lib/slice/percent_encoding.cc
src/core/lib/slice/slice.cc
src/core/lib/slice/slice_buffer.cc
- src/core/lib/slice/slice_refcount.cc
src/core/lib/slice/slice_string_helpers.cc
src/core/lib/surface/api_trace.cc
src/core/lib/surface/builtins.cc
@@ -2904,7 +2901,6 @@ add_library(grpc_unsecure
src/core/lib/iomgr/buffer_list.cc
src/core/lib/iomgr/call_combiner.cc
src/core/lib/iomgr/cfstream_handle.cc
- src/core/lib/iomgr/closure.cc
src/core/lib/iomgr/combiner.cc
src/core/lib/iomgr/dualstack_socket_posix.cc
src/core/lib/iomgr/endpoint.cc
@@ -2984,8 +2980,8 @@ add_library(grpc_unsecure
src/core/lib/load_balancing/lb_policy.cc
src/core/lib/load_balancing/lb_policy_registry.cc
src/core/lib/promise/activity.cc
+ src/core/lib/promise/pipe.cc
src/core/lib/promise/sleep.cc
- src/core/lib/promise/trace.cc
src/core/lib/resolver/resolver.cc
src/core/lib/resolver/resolver_registry.cc
src/core/lib/resolver/server_address.cc
@@ -3032,7 +3028,6 @@ add_library(grpc_unsecure
src/core/lib/slice/percent_encoding.cc
src/core/lib/slice/slice.cc
src/core/lib/slice/slice_buffer.cc
- src/core/lib/slice/slice_refcount.cc
src/core/lib/slice/slice_string_helpers.cc
src/core/lib/surface/api_trace.cc
src/core/lib/surface/builtins.cc
@@ -4416,7 +4411,6 @@ add_library(grpc_authorization_provider
src/core/lib/iomgr/buffer_list.cc
src/core/lib/iomgr/call_combiner.cc
src/core/lib/iomgr/cfstream_handle.cc
- src/core/lib/iomgr/closure.cc
src/core/lib/iomgr/combiner.cc
src/core/lib/iomgr/dualstack_socket_posix.cc
src/core/lib/iomgr/endpoint.cc
@@ -4496,7 +4490,7 @@ add_library(grpc_authorization_provider
src/core/lib/load_balancing/lb_policy_registry.cc
src/core/lib/matchers/matchers.cc
src/core/lib/promise/activity.cc
- src/core/lib/promise/trace.cc
+ src/core/lib/promise/pipe.cc
src/core/lib/resolver/resolver.cc
src/core/lib/resolver/resolver_registry.cc
src/core/lib/resolver/server_address.cc
@@ -4543,7 +4537,6 @@ add_library(grpc_authorization_provider
src/core/lib/slice/percent_encoding.cc
src/core/lib/slice/slice.cc
src/core/lib/slice/slice_buffer.cc
- src/core/lib/slice/slice_refcount.cc
src/core/lib/slice/slice_string_helpers.cc
src/core/lib/surface/api_trace.cc
src/core/lib/surface/builtins.cc
@@ -8304,7 +8297,6 @@ add_executable(chunked_vector_test
src/core/lib/experiments/experiments.cc
src/core/lib/gprpp/status_helper.cc
src/core/lib/gprpp/time.cc
- src/core/lib/iomgr/closure.cc
src/core/lib/iomgr/combiner.cc
src/core/lib/iomgr/error.cc
src/core/lib/iomgr/exec_ctx.cc
@@ -8319,7 +8311,6 @@ add_executable(chunked_vector_test
src/core/lib/resource_quota/trace.cc
src/core/lib/slice/percent_encoding.cc
src/core/lib/slice/slice.cc
- src/core/lib/slice/slice_refcount.cc
src/core/lib/slice/slice_string_helpers.cc
test/core/gprpp/chunked_vector_test.cc
third_party/googletest/googletest/src/gtest-all.cc
@@ -10595,7 +10586,6 @@ add_executable(exec_ctx_wakeup_scheduler_test
src/core/lib/debug/trace.cc
src/core/lib/gprpp/status_helper.cc
src/core/lib/gprpp/time.cc
- src/core/lib/iomgr/closure.cc
src/core/lib/iomgr/combiner.cc
src/core/lib/iomgr/error.cc
src/core/lib/iomgr/exec_ctx.cc
@@ -10604,7 +10594,6 @@ add_executable(exec_ctx_wakeup_scheduler_test
src/core/lib/promise/activity.cc
src/core/lib/slice/percent_encoding.cc
src/core/lib/slice/slice.cc
- src/core/lib/slice/slice_refcount.cc
src/core/lib/slice/slice_string_helpers.cc
test/core/promise/exec_ctx_wakeup_scheduler_test.cc
third_party/googletest/googletest/src/gtest-all.cc
@@ -11070,7 +11059,6 @@ add_executable(flow_control_test
src/core/lib/experiments/experiments.cc
src/core/lib/gprpp/status_helper.cc
src/core/lib/gprpp/time.cc
- src/core/lib/iomgr/closure.cc
src/core/lib/iomgr/combiner.cc
src/core/lib/iomgr/error.cc
src/core/lib/iomgr/exec_ctx.cc
@@ -11084,7 +11072,6 @@ add_executable(flow_control_test
src/core/lib/resource_quota/trace.cc
src/core/lib/slice/percent_encoding.cc
src/core/lib/slice/slice.cc
- src/core/lib/slice/slice_refcount.cc
src/core/lib/slice/slice_string_helpers.cc
src/core/lib/transport/bdp_estimator.cc
src/core/lib/transport/pid_controller.cc
@@ -11141,14 +11128,13 @@ add_executable(for_each_test
src/core/lib/experiments/experiments.cc
src/core/lib/gprpp/status_helper.cc
src/core/lib/gprpp/time.cc
- src/core/lib/iomgr/closure.cc
src/core/lib/iomgr/combiner.cc
src/core/lib/iomgr/error.cc
src/core/lib/iomgr/exec_ctx.cc
src/core/lib/iomgr/executor.cc
src/core/lib/iomgr/iomgr_internal.cc
src/core/lib/promise/activity.cc
- src/core/lib/promise/trace.cc
+ src/core/lib/promise/pipe.cc
src/core/lib/resource_quota/arena.cc
src/core/lib/resource_quota/memory_quota.cc
src/core/lib/resource_quota/periodic_update.cc
@@ -11157,7 +11143,6 @@ add_executable(for_each_test
src/core/lib/resource_quota/trace.cc
src/core/lib/slice/percent_encoding.cc
src/core/lib/slice/slice.cc
- src/core/lib/slice/slice_refcount.cc
src/core/lib/slice/slice_string_helpers.cc
test/core/promise/for_each_test.cc
third_party/googletest/googletest/src/gtest-all.cc
@@ -11502,7 +11487,6 @@ add_executable(frame_test
src/core/lib/iomgr/buffer_list.cc
src/core/lib/iomgr/call_combiner.cc
src/core/lib/iomgr/cfstream_handle.cc
- src/core/lib/iomgr/closure.cc
src/core/lib/iomgr/combiner.cc
src/core/lib/iomgr/dualstack_socket_posix.cc
src/core/lib/iomgr/endpoint.cc
@@ -11581,7 +11565,7 @@ add_executable(frame_test
src/core/lib/load_balancing/lb_policy.cc
src/core/lib/load_balancing/lb_policy_registry.cc
src/core/lib/promise/activity.cc
- src/core/lib/promise/trace.cc
+ src/core/lib/promise/pipe.cc
src/core/lib/resolver/resolver.cc
src/core/lib/resolver/resolver_registry.cc
src/core/lib/resolver/server_address.cc
@@ -11605,7 +11589,6 @@ add_executable(frame_test
src/core/lib/slice/percent_encoding.cc
src/core/lib/slice/slice.cc
src/core/lib/slice/slice_buffer.cc
- src/core/lib/slice/slice_refcount.cc
src/core/lib/slice/slice_string_helpers.cc
src/core/lib/surface/api_trace.cc
src/core/lib/surface/builtins.cc
@@ -13943,77 +13926,6 @@ target_link_libraries(insecure_security_connector_test
)
-endif()
-if(gRPC_BUILD_TESTS)
-
-add_executable(interceptor_list_test
- src/core/ext/upb-generated/google/protobuf/any.upb.c
- src/core/ext/upb-generated/google/rpc/status.upb.c
- src/core/lib/debug/trace.cc
- src/core/lib/event_engine/memory_allocator.cc
- src/core/lib/experiments/config.cc
- src/core/lib/experiments/experiments.cc
- src/core/lib/gprpp/status_helper.cc
- src/core/lib/gprpp/time.cc
- src/core/lib/iomgr/closure.cc
- src/core/lib/iomgr/combiner.cc
- src/core/lib/iomgr/error.cc
- src/core/lib/iomgr/exec_ctx.cc
- src/core/lib/iomgr/executor.cc
- src/core/lib/iomgr/iomgr_internal.cc
- src/core/lib/promise/activity.cc
- src/core/lib/promise/trace.cc
- src/core/lib/resource_quota/arena.cc
- src/core/lib/resource_quota/memory_quota.cc
- src/core/lib/resource_quota/periodic_update.cc
- src/core/lib/resource_quota/resource_quota.cc
- src/core/lib/resource_quota/thread_quota.cc
- src/core/lib/resource_quota/trace.cc
- src/core/lib/slice/percent_encoding.cc
- src/core/lib/slice/slice.cc
- src/core/lib/slice/slice_refcount.cc
- src/core/lib/slice/slice_string_helpers.cc
- test/core/promise/interceptor_list_test.cc
- third_party/googletest/googletest/src/gtest-all.cc
- third_party/googletest/googlemock/src/gmock-all.cc
-)
-target_compile_features(interceptor_list_test PUBLIC cxx_std_14)
-target_include_directories(interceptor_list_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(interceptor_list_test
- ${_gRPC_BASELIB_LIBRARIES}
- ${_gRPC_PROTOBUF_LIBRARIES}
- ${_gRPC_ZLIB_LIBRARIES}
- ${_gRPC_ALLTARGETS_LIBRARIES}
- absl::flat_hash_set
- absl::any_invocable
- absl::function_ref
- absl::hash
- absl::type_traits
- absl::statusor
- absl::utility
- gpr
- upb
-)
-
-
endif()
if(gRPC_BUILD_TESTS)
@@ -14496,9 +14408,7 @@ endif()
if(gRPC_BUILD_TESTS)
add_executable(latch_test
- src/core/lib/debug/trace.cc
src/core/lib/promise/activity.cc
- src/core/lib/promise/trace.cc
test/core/promise/latch_test.cc
third_party/googletest/googletest/src/gtest-all.cc
third_party/googletest/googlemock/src/gmock-all.cc
@@ -14745,14 +14655,13 @@ add_executable(map_pipe_test
src/core/lib/experiments/experiments.cc
src/core/lib/gprpp/status_helper.cc
src/core/lib/gprpp/time.cc
- src/core/lib/iomgr/closure.cc
src/core/lib/iomgr/combiner.cc
src/core/lib/iomgr/error.cc
src/core/lib/iomgr/exec_ctx.cc
src/core/lib/iomgr/executor.cc
src/core/lib/iomgr/iomgr_internal.cc
src/core/lib/promise/activity.cc
- src/core/lib/promise/trace.cc
+ src/core/lib/promise/pipe.cc
src/core/lib/resource_quota/arena.cc
src/core/lib/resource_quota/memory_quota.cc
src/core/lib/resource_quota/periodic_update.cc
@@ -14761,7 +14670,6 @@ add_executable(map_pipe_test
src/core/lib/resource_quota/trace.cc
src/core/lib/slice/percent_encoding.cc
src/core/lib/slice/slice.cc
- src/core/lib/slice/slice_refcount.cc
src/core/lib/slice/slice_string_helpers.cc
test/core/promise/map_pipe_test.cc
third_party/googletest/googletest/src/gtest-all.cc
@@ -16117,7 +16025,6 @@ add_executable(periodic_update_test
src/core/lib/debug/trace.cc
src/core/lib/gprpp/status_helper.cc
src/core/lib/gprpp/time.cc
- src/core/lib/iomgr/closure.cc
src/core/lib/iomgr/combiner.cc
src/core/lib/iomgr/error.cc
src/core/lib/iomgr/exec_ctx.cc
@@ -16126,7 +16033,6 @@ add_executable(periodic_update_test
src/core/lib/resource_quota/periodic_update.cc
src/core/lib/slice/percent_encoding.cc
src/core/lib/slice/slice.cc
- src/core/lib/slice/slice_refcount.cc
src/core/lib/slice/slice_string_helpers.cc
test/core/resource_quota/periodic_update_test.cc
third_party/googletest/googletest/src/gtest-all.cc
@@ -16256,6 +16162,30 @@ endif()
if(gRPC_BUILD_TESTS)
add_executable(pipe_test
+ src/core/ext/upb-generated/google/protobuf/any.upb.c
+ src/core/ext/upb-generated/google/rpc/status.upb.c
+ src/core/lib/debug/trace.cc
+ src/core/lib/event_engine/memory_allocator.cc
+ src/core/lib/experiments/config.cc
+ src/core/lib/experiments/experiments.cc
+ src/core/lib/gprpp/status_helper.cc
+ src/core/lib/gprpp/time.cc
+ src/core/lib/iomgr/combiner.cc
+ src/core/lib/iomgr/error.cc
+ src/core/lib/iomgr/exec_ctx.cc
+ src/core/lib/iomgr/executor.cc
+ src/core/lib/iomgr/iomgr_internal.cc
+ src/core/lib/promise/activity.cc
+ src/core/lib/promise/pipe.cc
+ src/core/lib/resource_quota/arena.cc
+ src/core/lib/resource_quota/memory_quota.cc
+ src/core/lib/resource_quota/periodic_update.cc
+ src/core/lib/resource_quota/resource_quota.cc
+ src/core/lib/resource_quota/thread_quota.cc
+ src/core/lib/resource_quota/trace.cc
+ src/core/lib/slice/percent_encoding.cc
+ src/core/lib/slice/slice.cc
+ src/core/lib/slice/slice_string_helpers.cc
test/core/promise/pipe_test.cc
third_party/googletest/googletest/src/gtest-all.cc
third_party/googletest/googlemock/src/gmock-all.cc
@@ -16285,7 +16215,15 @@ target_link_libraries(pipe_test
${_gRPC_PROTOBUF_LIBRARIES}
${_gRPC_ZLIB_LIBRARIES}
${_gRPC_ALLTARGETS_LIBRARIES}
- grpc
+ absl::flat_hash_set
+ absl::any_invocable
+ absl::function_ref
+ absl::hash
+ absl::type_traits
+ absl::statusor
+ absl::utility
+ gpr
+ upb
)
@@ -18839,9 +18777,7 @@ endif()
if(gRPC_BUILD_TESTS)
add_executable(slice_string_helpers_test
- src/core/lib/debug/trace.cc
src/core/lib/slice/slice.cc
- src/core/lib/slice/slice_refcount.cc
src/core/lib/slice/slice_string_helpers.cc
test/core/slice/slice_string_helpers_test.cc
third_party/googletest/googletest/src/gtest-all.cc
@@ -20235,14 +20171,12 @@ endif()
if(gRPC_BUILD_TESTS)
add_executable(test_core_event_engine_slice_buffer_test
- src/core/lib/debug/trace.cc
src/core/lib/event_engine/event_engine.cc
src/core/lib/event_engine/resolved_address.cc
src/core/lib/event_engine/slice.cc
src/core/lib/event_engine/slice_buffer.cc
src/core/lib/slice/slice.cc
src/core/lib/slice/slice_buffer.cc
- src/core/lib/slice/slice_refcount.cc
src/core/lib/slice/slice_string_helpers.cc
test/core/event_engine/slice_buffer_test.cc
third_party/googletest/googletest/src/gtest-all.cc
@@ -21590,21 +21524,19 @@ add_executable(try_concurrently_test
src/core/lib/experiments/experiments.cc
src/core/lib/gprpp/status_helper.cc
src/core/lib/gprpp/time.cc
- src/core/lib/iomgr/closure.cc
src/core/lib/iomgr/combiner.cc
src/core/lib/iomgr/error.cc
src/core/lib/iomgr/exec_ctx.cc
src/core/lib/iomgr/executor.cc
src/core/lib/iomgr/iomgr_internal.cc
src/core/lib/promise/activity.cc
- src/core/lib/promise/trace.cc
+ src/core/lib/promise/pipe.cc
src/core/lib/resource_quota/arena.cc
src/core/lib/resource_quota/memory_quota.cc
src/core/lib/resource_quota/periodic_update.cc
src/core/lib/resource_quota/trace.cc
src/core/lib/slice/percent_encoding.cc
src/core/lib/slice/slice.cc
- src/core/lib/slice/slice_refcount.cc
src/core/lib/slice/slice_string_helpers.cc
test/core/promise/try_concurrently_test.cc
third_party/googletest/googletest/src/gtest-all.cc
diff --git a/Makefile b/Makefile
index 8c1670e4426..5f6348a3a64 100644
--- a/Makefile
+++ b/Makefile
@@ -1473,7 +1473,6 @@ LIBGRPC_SRC = \
src/core/lib/iomgr/buffer_list.cc \
src/core/lib/iomgr/call_combiner.cc \
src/core/lib/iomgr/cfstream_handle.cc \
- src/core/lib/iomgr/closure.cc \
src/core/lib/iomgr/combiner.cc \
src/core/lib/iomgr/dualstack_socket_posix.cc \
src/core/lib/iomgr/endpoint.cc \
@@ -1555,8 +1554,8 @@ LIBGRPC_SRC = \
src/core/lib/load_balancing/lb_policy_registry.cc \
src/core/lib/matchers/matchers.cc \
src/core/lib/promise/activity.cc \
+ src/core/lib/promise/pipe.cc \
src/core/lib/promise/sleep.cc \
- src/core/lib/promise/trace.cc \
src/core/lib/resolver/resolver.cc \
src/core/lib/resolver/resolver_registry.cc \
src/core/lib/resolver/server_address.cc \
@@ -1634,7 +1633,6 @@ LIBGRPC_SRC = \
src/core/lib/slice/percent_encoding.cc \
src/core/lib/slice/slice.cc \
src/core/lib/slice/slice_buffer.cc \
- src/core/lib/slice/slice_refcount.cc \
src/core/lib/slice/slice_string_helpers.cc \
src/core/lib/surface/api_trace.cc \
src/core/lib/surface/builtins.cc \
@@ -2011,7 +2009,6 @@ LIBGRPC_UNSECURE_SRC = \
src/core/lib/iomgr/buffer_list.cc \
src/core/lib/iomgr/call_combiner.cc \
src/core/lib/iomgr/cfstream_handle.cc \
- src/core/lib/iomgr/closure.cc \
src/core/lib/iomgr/combiner.cc \
src/core/lib/iomgr/dualstack_socket_posix.cc \
src/core/lib/iomgr/endpoint.cc \
@@ -2091,8 +2088,8 @@ LIBGRPC_UNSECURE_SRC = \
src/core/lib/load_balancing/lb_policy.cc \
src/core/lib/load_balancing/lb_policy_registry.cc \
src/core/lib/promise/activity.cc \
+ src/core/lib/promise/pipe.cc \
src/core/lib/promise/sleep.cc \
- src/core/lib/promise/trace.cc \
src/core/lib/resolver/resolver.cc \
src/core/lib/resolver/resolver_registry.cc \
src/core/lib/resolver/server_address.cc \
@@ -2139,7 +2136,6 @@ LIBGRPC_UNSECURE_SRC = \
src/core/lib/slice/percent_encoding.cc \
src/core/lib/slice/slice.cc \
src/core/lib/slice/slice_buffer.cc \
- src/core/lib/slice/slice_refcount.cc \
src/core/lib/slice/slice_string_helpers.cc \
src/core/lib/surface/api_trace.cc \
src/core/lib/surface/builtins.cc \
diff --git a/bazel/experiments.bzl b/bazel/experiments.bzl
index b86d9688824..bfcbebb19ee 100644
--- a/bazel/experiments.bzl
+++ b/bazel/experiments.bzl
@@ -25,7 +25,6 @@ EXPERIMENTS = {
],
"core_end2end_test": [
"promise_based_client_call",
- "promise_based_server_call",
],
"endpoint_test": [
"tcp_frame_size_tuning",
diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml
index 3edb2256a98..a55ea46ec65 100644
--- a/build_autogenerated.yaml
+++ b/build_autogenerated.yaml
@@ -930,27 +930,25 @@ libs:
- src/core/lib/promise/activity.h
- src/core/lib/promise/arena_promise.h
- src/core/lib/promise/context.h
- - src/core/lib/promise/detail/basic_join.h
- src/core/lib/promise/detail/basic_seq.h
- src/core/lib/promise/detail/promise_factory.h
- src/core/lib/promise/detail/promise_like.h
- src/core/lib/promise/detail/status.h
- src/core/lib/promise/detail/switch.h
- src/core/lib/promise/exec_ctx_wakeup_scheduler.h
- - src/core/lib/promise/if.h
- - src/core/lib/promise/interceptor_list.h
+ - src/core/lib/promise/for_each.h
- src/core/lib/promise/intra_activity_waiter.h
- src/core/lib/promise/latch.h
- src/core/lib/promise/loop.h
- src/core/lib/promise/map.h
+ - src/core/lib/promise/map_pipe.h
- src/core/lib/promise/pipe.h
- src/core/lib/promise/poll.h
- src/core/lib/promise/promise.h
- src/core/lib/promise/race.h
- src/core/lib/promise/seq.h
- src/core/lib/promise/sleep.h
- - src/core/lib/promise/trace.h
- - src/core/lib/promise/try_join.h
+ - src/core/lib/promise/try_concurrently.h
- src/core/lib/promise/try_seq.h
- src/core/lib/resolver/resolver.h
- src/core/lib/resolver/resolver_factory.h
@@ -1610,7 +1608,6 @@ libs:
- src/core/lib/iomgr/buffer_list.cc
- src/core/lib/iomgr/call_combiner.cc
- src/core/lib/iomgr/cfstream_handle.cc
- - src/core/lib/iomgr/closure.cc
- src/core/lib/iomgr/combiner.cc
- src/core/lib/iomgr/dualstack_socket_posix.cc
- src/core/lib/iomgr/endpoint.cc
@@ -1692,8 +1689,8 @@ libs:
- src/core/lib/load_balancing/lb_policy_registry.cc
- src/core/lib/matchers/matchers.cc
- src/core/lib/promise/activity.cc
+ - src/core/lib/promise/pipe.cc
- src/core/lib/promise/sleep.cc
- - src/core/lib/promise/trace.cc
- src/core/lib/resolver/resolver.cc
- src/core/lib/resolver/resolver_registry.cc
- src/core/lib/resolver/server_address.cc
@@ -1771,7 +1768,6 @@ libs:
- src/core/lib/slice/percent_encoding.cc
- src/core/lib/slice/slice.cc
- src/core/lib/slice/slice_buffer.cc
- - src/core/lib/slice/slice_refcount.cc
- src/core/lib/slice/slice_string_helpers.cc
- src/core/lib/surface/api_trace.cc
- src/core/lib/surface/builtins.cc
@@ -2262,27 +2258,25 @@ libs:
- src/core/lib/promise/activity.h
- src/core/lib/promise/arena_promise.h
- src/core/lib/promise/context.h
- - src/core/lib/promise/detail/basic_join.h
- src/core/lib/promise/detail/basic_seq.h
- src/core/lib/promise/detail/promise_factory.h
- src/core/lib/promise/detail/promise_like.h
- src/core/lib/promise/detail/status.h
- src/core/lib/promise/detail/switch.h
- src/core/lib/promise/exec_ctx_wakeup_scheduler.h
- - src/core/lib/promise/if.h
- - src/core/lib/promise/interceptor_list.h
+ - src/core/lib/promise/for_each.h
- src/core/lib/promise/intra_activity_waiter.h
- src/core/lib/promise/latch.h
- src/core/lib/promise/loop.h
- src/core/lib/promise/map.h
+ - src/core/lib/promise/map_pipe.h
- src/core/lib/promise/pipe.h
- src/core/lib/promise/poll.h
- src/core/lib/promise/promise.h
- src/core/lib/promise/race.h
- src/core/lib/promise/seq.h
- src/core/lib/promise/sleep.h
- - src/core/lib/promise/trace.h
- - src/core/lib/promise/try_join.h
+ - src/core/lib/promise/try_concurrently.h
- src/core/lib/promise/try_seq.h
- src/core/lib/resolver/resolver.h
- src/core/lib/resolver/resolver_factory.h
@@ -2558,7 +2552,6 @@ libs:
- src/core/lib/iomgr/buffer_list.cc
- src/core/lib/iomgr/call_combiner.cc
- src/core/lib/iomgr/cfstream_handle.cc
- - src/core/lib/iomgr/closure.cc
- src/core/lib/iomgr/combiner.cc
- src/core/lib/iomgr/dualstack_socket_posix.cc
- src/core/lib/iomgr/endpoint.cc
@@ -2638,8 +2631,8 @@ libs:
- src/core/lib/load_balancing/lb_policy.cc
- src/core/lib/load_balancing/lb_policy_registry.cc
- src/core/lib/promise/activity.cc
+ - src/core/lib/promise/pipe.cc
- src/core/lib/promise/sleep.cc
- - src/core/lib/promise/trace.cc
- src/core/lib/resolver/resolver.cc
- src/core/lib/resolver/resolver_registry.cc
- src/core/lib/resolver/server_address.cc
@@ -2686,7 +2679,6 @@ libs:
- src/core/lib/slice/percent_encoding.cc
- src/core/lib/slice/slice.cc
- src/core/lib/slice/slice_buffer.cc
- - src/core/lib/slice/slice_refcount.cc
- src/core/lib/slice/slice_string_helpers.cc
- src/core/lib/surface/api_trace.cc
- src/core/lib/surface/builtins.cc
@@ -3711,16 +3703,14 @@ libs:
- src/core/lib/promise/activity.h
- src/core/lib/promise/arena_promise.h
- src/core/lib/promise/context.h
- - src/core/lib/promise/detail/basic_join.h
- src/core/lib/promise/detail/basic_seq.h
- src/core/lib/promise/detail/promise_factory.h
- src/core/lib/promise/detail/promise_like.h
- src/core/lib/promise/detail/status.h
- src/core/lib/promise/detail/switch.h
- src/core/lib/promise/exec_ctx_wakeup_scheduler.h
- - src/core/lib/promise/if.h
- - src/core/lib/promise/interceptor_list.h
- src/core/lib/promise/intra_activity_waiter.h
+ - src/core/lib/promise/latch.h
- src/core/lib/promise/loop.h
- src/core/lib/promise/map.h
- src/core/lib/promise/pipe.h
@@ -3728,8 +3718,6 @@ libs:
- src/core/lib/promise/promise.h
- src/core/lib/promise/race.h
- src/core/lib/promise/seq.h
- - src/core/lib/promise/trace.h
- - src/core/lib/promise/try_join.h
- src/core/lib/promise/try_seq.h
- src/core/lib/resolver/resolver.h
- src/core/lib/resolver/resolver_factory.h
@@ -3890,7 +3878,6 @@ libs:
- src/core/lib/iomgr/buffer_list.cc
- src/core/lib/iomgr/call_combiner.cc
- src/core/lib/iomgr/cfstream_handle.cc
- - src/core/lib/iomgr/closure.cc
- src/core/lib/iomgr/combiner.cc
- src/core/lib/iomgr/dualstack_socket_posix.cc
- src/core/lib/iomgr/endpoint.cc
@@ -3970,7 +3957,7 @@ libs:
- src/core/lib/load_balancing/lb_policy_registry.cc
- src/core/lib/matchers/matchers.cc
- src/core/lib/promise/activity.cc
- - src/core/lib/promise/trace.cc
+ - src/core/lib/promise/pipe.cc
- src/core/lib/resolver/resolver.cc
- src/core/lib/resolver/resolver_registry.cc
- src/core/lib/resolver/server_address.cc
@@ -4017,7 +4004,6 @@ libs:
- src/core/lib/slice/percent_encoding.cc
- src/core/lib/slice/slice.cc
- src/core/lib/slice/slice_buffer.cc
- - src/core/lib/slice/slice_refcount.cc
- src/core/lib/slice/slice_string_helpers.cc
- src/core/lib/surface/api_trace.cc
- src/core/lib/surface/builtins.cc
@@ -5813,7 +5799,6 @@ targets:
- src/core/lib/experiments/experiments.cc
- src/core/lib/gprpp/status_helper.cc
- src/core/lib/gprpp/time.cc
- - src/core/lib/iomgr/closure.cc
- src/core/lib/iomgr/combiner.cc
- src/core/lib/iomgr/error.cc
- src/core/lib/iomgr/exec_ctx.cc
@@ -5828,7 +5813,6 @@ targets:
- src/core/lib/resource_quota/trace.cc
- src/core/lib/slice/percent_encoding.cc
- src/core/lib/slice/slice.cc
- - src/core/lib/slice/slice_refcount.cc
- src/core/lib/slice/slice_string_helpers.cc
- test/core/gprpp/chunked_vector_test.cc
deps:
@@ -6813,7 +6797,6 @@ targets:
- src/core/lib/debug/trace.cc
- src/core/lib/gprpp/status_helper.cc
- src/core/lib/gprpp/time.cc
- - src/core/lib/iomgr/closure.cc
- src/core/lib/iomgr/combiner.cc
- src/core/lib/iomgr/error.cc
- src/core/lib/iomgr/exec_ctx.cc
@@ -6822,7 +6805,6 @@ targets:
- src/core/lib/promise/activity.cc
- src/core/lib/slice/percent_encoding.cc
- src/core/lib/slice/slice.cc
- - src/core/lib/slice/slice_refcount.cc
- src/core/lib/slice/slice_string_helpers.cc
- test/core/promise/exec_ctx_wakeup_scheduler_test.cc
deps:
@@ -7110,7 +7092,6 @@ targets:
- src/core/lib/experiments/experiments.cc
- src/core/lib/gprpp/status_helper.cc
- src/core/lib/gprpp/time.cc
- - src/core/lib/iomgr/closure.cc
- src/core/lib/iomgr/combiner.cc
- src/core/lib/iomgr/error.cc
- src/core/lib/iomgr/exec_ctx.cc
@@ -7124,7 +7105,6 @@ targets:
- src/core/lib/resource_quota/trace.cc
- src/core/lib/slice/percent_encoding.cc
- src/core/lib/slice/slice.cc
- - src/core/lib/slice/slice_refcount.cc
- src/core/lib/slice/slice_string_helpers.cc
- src/core/lib/transport/bdp_estimator.cc
- src/core/lib/transport/pid_controller.cc
@@ -7176,8 +7156,6 @@ targets:
- src/core/lib/promise/detail/switch.h
- src/core/lib/promise/exec_ctx_wakeup_scheduler.h
- src/core/lib/promise/for_each.h
- - src/core/lib/promise/if.h
- - src/core/lib/promise/interceptor_list.h
- src/core/lib/promise/intra_activity_waiter.h
- src/core/lib/promise/join.h
- src/core/lib/promise/loop.h
@@ -7186,7 +7164,6 @@ targets:
- src/core/lib/promise/poll.h
- src/core/lib/promise/race.h
- src/core/lib/promise/seq.h
- - src/core/lib/promise/trace.h
- src/core/lib/promise/try_seq.h
- src/core/lib/resource_quota/arena.h
- src/core/lib/resource_quota/memory_quota.h
@@ -7209,14 +7186,13 @@ targets:
- src/core/lib/experiments/experiments.cc
- src/core/lib/gprpp/status_helper.cc
- src/core/lib/gprpp/time.cc
- - src/core/lib/iomgr/closure.cc
- src/core/lib/iomgr/combiner.cc
- src/core/lib/iomgr/error.cc
- src/core/lib/iomgr/exec_ctx.cc
- src/core/lib/iomgr/executor.cc
- src/core/lib/iomgr/iomgr_internal.cc
- src/core/lib/promise/activity.cc
- - src/core/lib/promise/trace.cc
+ - src/core/lib/promise/pipe.cc
- src/core/lib/resource_quota/arena.cc
- src/core/lib/resource_quota/memory_quota.cc
- src/core/lib/resource_quota/periodic_update.cc
@@ -7225,7 +7201,6 @@ targets:
- src/core/lib/resource_quota/trace.cc
- src/core/lib/slice/percent_encoding.cc
- src/core/lib/slice/slice.cc
- - src/core/lib/slice/slice_refcount.cc
- src/core/lib/slice/slice_string_helpers.cc
- test/core/promise/for_each_test.cc
deps:
@@ -7525,16 +7500,14 @@ targets:
- src/core/lib/promise/activity.h
- src/core/lib/promise/arena_promise.h
- src/core/lib/promise/context.h
- - src/core/lib/promise/detail/basic_join.h
- src/core/lib/promise/detail/basic_seq.h
- src/core/lib/promise/detail/promise_factory.h
- src/core/lib/promise/detail/promise_like.h
- src/core/lib/promise/detail/status.h
- src/core/lib/promise/detail/switch.h
- src/core/lib/promise/exec_ctx_wakeup_scheduler.h
- - src/core/lib/promise/if.h
- - src/core/lib/promise/interceptor_list.h
- src/core/lib/promise/intra_activity_waiter.h
+ - src/core/lib/promise/latch.h
- src/core/lib/promise/loop.h
- src/core/lib/promise/map.h
- src/core/lib/promise/pipe.h
@@ -7542,9 +7515,6 @@ targets:
- src/core/lib/promise/promise.h
- src/core/lib/promise/race.h
- src/core/lib/promise/seq.h
- - src/core/lib/promise/trace.h
- - src/core/lib/promise/try_join.h
- - src/core/lib/promise/try_seq.h
- src/core/lib/resolver/resolver.h
- src/core/lib/resolver/resolver_factory.h
- src/core/lib/resolver/resolver_registry.h
@@ -7688,7 +7658,6 @@ targets:
- src/core/lib/iomgr/buffer_list.cc
- src/core/lib/iomgr/call_combiner.cc
- src/core/lib/iomgr/cfstream_handle.cc
- - src/core/lib/iomgr/closure.cc
- src/core/lib/iomgr/combiner.cc
- src/core/lib/iomgr/dualstack_socket_posix.cc
- src/core/lib/iomgr/endpoint.cc
@@ -7767,7 +7736,7 @@ targets:
- src/core/lib/load_balancing/lb_policy.cc
- src/core/lib/load_balancing/lb_policy_registry.cc
- src/core/lib/promise/activity.cc
- - src/core/lib/promise/trace.cc
+ - src/core/lib/promise/pipe.cc
- src/core/lib/resolver/resolver.cc
- src/core/lib/resolver/resolver_registry.cc
- src/core/lib/resolver/server_address.cc
@@ -7791,7 +7760,6 @@ targets:
- src/core/lib/slice/percent_encoding.cc
- src/core/lib/slice/slice.cc
- src/core/lib/slice/slice_buffer.cc
- - src/core/lib/slice/slice_refcount.cc
- src/core/lib/slice/slice_string_helpers.cc
- src/core/lib/surface/api_trace.cc
- src/core/lib/surface/builtins.cc
@@ -8733,7 +8701,6 @@ targets:
build: test
language: c++
headers:
- - src/core/lib/gprpp/construct_destruct.h
- src/core/lib/promise/detail/promise_factory.h
- src/core/lib/promise/detail/promise_like.h
- src/core/lib/promise/if.h
@@ -8802,98 +8769,6 @@ targets:
- test/core/util/tracer_util.cc
deps:
- grpc_test_util
-- name: interceptor_list_test
- gtest: true
- build: test
- language: c++
- headers:
- - src/core/ext/upb-generated/google/protobuf/any.upb.h
- - src/core/ext/upb-generated/google/rpc/status.upb.h
- - src/core/lib/debug/trace.h
- - src/core/lib/experiments/config.h
- - src/core/lib/experiments/experiments.h
- - src/core/lib/gpr/spinlock.h
- - src/core/lib/gprpp/atomic_utils.h
- - src/core/lib/gprpp/bitset.h
- - src/core/lib/gprpp/cpp_impl_of.h
- - src/core/lib/gprpp/manual_constructor.h
- - src/core/lib/gprpp/orphanable.h
- - src/core/lib/gprpp/ref_counted.h
- - src/core/lib/gprpp/ref_counted_ptr.h
- - src/core/lib/gprpp/status_helper.h
- - src/core/lib/gprpp/time.h
- - src/core/lib/iomgr/closure.h
- - src/core/lib/iomgr/combiner.h
- - src/core/lib/iomgr/error.h
- - src/core/lib/iomgr/exec_ctx.h
- - src/core/lib/iomgr/executor.h
- - src/core/lib/iomgr/iomgr_internal.h
- - src/core/lib/promise/activity.h
- - src/core/lib/promise/context.h
- - src/core/lib/promise/detail/basic_seq.h
- - src/core/lib/promise/detail/promise_factory.h
- - src/core/lib/promise/detail/promise_like.h
- - src/core/lib/promise/detail/status.h
- - src/core/lib/promise/detail/switch.h
- - src/core/lib/promise/exec_ctx_wakeup_scheduler.h
- - src/core/lib/promise/interceptor_list.h
- - src/core/lib/promise/loop.h
- - src/core/lib/promise/map.h
- - src/core/lib/promise/poll.h
- - src/core/lib/promise/race.h
- - src/core/lib/promise/seq.h
- - src/core/lib/promise/trace.h
- - src/core/lib/resource_quota/arena.h
- - src/core/lib/resource_quota/memory_quota.h
- - src/core/lib/resource_quota/periodic_update.h
- - src/core/lib/resource_quota/resource_quota.h
- - src/core/lib/resource_quota/thread_quota.h
- - src/core/lib/resource_quota/trace.h
- - src/core/lib/slice/percent_encoding.h
- - src/core/lib/slice/slice.h
- - src/core/lib/slice/slice_internal.h
- - src/core/lib/slice/slice_refcount.h
- - src/core/lib/slice/slice_string_helpers.h
- - test/core/promise/test_context.h
- src:
- - src/core/ext/upb-generated/google/protobuf/any.upb.c
- - src/core/ext/upb-generated/google/rpc/status.upb.c
- - src/core/lib/debug/trace.cc
- - src/core/lib/event_engine/memory_allocator.cc
- - src/core/lib/experiments/config.cc
- - src/core/lib/experiments/experiments.cc
- - src/core/lib/gprpp/status_helper.cc
- - src/core/lib/gprpp/time.cc
- - src/core/lib/iomgr/closure.cc
- - src/core/lib/iomgr/combiner.cc
- - src/core/lib/iomgr/error.cc
- - src/core/lib/iomgr/exec_ctx.cc
- - src/core/lib/iomgr/executor.cc
- - src/core/lib/iomgr/iomgr_internal.cc
- - src/core/lib/promise/activity.cc
- - src/core/lib/promise/trace.cc
- - src/core/lib/resource_quota/arena.cc
- - src/core/lib/resource_quota/memory_quota.cc
- - src/core/lib/resource_quota/periodic_update.cc
- - src/core/lib/resource_quota/resource_quota.cc
- - src/core/lib/resource_quota/thread_quota.cc
- - src/core/lib/resource_quota/trace.cc
- - src/core/lib/slice/percent_encoding.cc
- - src/core/lib/slice/slice.cc
- - src/core/lib/slice/slice_refcount.cc
- - src/core/lib/slice/slice_string_helpers.cc
- - test/core/promise/interceptor_list_test.cc
- deps:
- - absl/container:flat_hash_set
- - absl/functional:any_invocable
- - absl/functional:function_ref
- - absl/hash:hash
- - absl/meta:type_traits
- - absl/status:statusor
- - absl/utility:utility
- - gpr
- - upb
- uses_polling: false
- name: interop_client
build: test
run: false
@@ -9098,7 +8973,6 @@ targets:
build: test
language: c++
headers:
- - src/core/lib/debug/trace.h
- src/core/lib/gprpp/atomic_utils.h
- src/core/lib/gprpp/bitset.h
- src/core/lib/gprpp/orphanable.h
@@ -9117,12 +8991,9 @@ targets:
- src/core/lib/promise/latch.h
- src/core/lib/promise/poll.h
- src/core/lib/promise/seq.h
- - src/core/lib/promise/trace.h
- test/core/promise/test_wakeup_schedulers.h
src:
- - src/core/lib/debug/trace.cc
- src/core/lib/promise/activity.cc
- - src/core/lib/promise/trace.cc
- test/core/promise/latch_test.cc
deps:
- absl/meta:type_traits
@@ -9241,8 +9112,6 @@ targets:
- src/core/lib/promise/detail/switch.h
- src/core/lib/promise/exec_ctx_wakeup_scheduler.h
- src/core/lib/promise/for_each.h
- - src/core/lib/promise/if.h
- - src/core/lib/promise/interceptor_list.h
- src/core/lib/promise/intra_activity_waiter.h
- src/core/lib/promise/join.h
- src/core/lib/promise/loop.h
@@ -9252,7 +9121,6 @@ targets:
- src/core/lib/promise/poll.h
- src/core/lib/promise/race.h
- src/core/lib/promise/seq.h
- - src/core/lib/promise/trace.h
- src/core/lib/promise/try_seq.h
- src/core/lib/resource_quota/arena.h
- src/core/lib/resource_quota/memory_quota.h
@@ -9275,14 +9143,13 @@ targets:
- src/core/lib/experiments/experiments.cc
- src/core/lib/gprpp/status_helper.cc
- src/core/lib/gprpp/time.cc
- - src/core/lib/iomgr/closure.cc
- src/core/lib/iomgr/combiner.cc
- src/core/lib/iomgr/error.cc
- src/core/lib/iomgr/exec_ctx.cc
- src/core/lib/iomgr/executor.cc
- src/core/lib/iomgr/iomgr_internal.cc
- src/core/lib/promise/activity.cc
- - src/core/lib/promise/trace.cc
+ - src/core/lib/promise/pipe.cc
- src/core/lib/resource_quota/arena.cc
- src/core/lib/resource_quota/memory_quota.cc
- src/core/lib/resource_quota/periodic_update.cc
@@ -9291,7 +9158,6 @@ targets:
- src/core/lib/resource_quota/trace.cc
- src/core/lib/slice/percent_encoding.cc
- src/core/lib/slice/slice.cc
- - src/core/lib/slice/slice_refcount.cc
- src/core/lib/slice/slice_string_helpers.cc
- test/core/promise/map_pipe_test.cc
deps:
@@ -9840,7 +9706,6 @@ targets:
- src/core/lib/debug/trace.cc
- src/core/lib/gprpp/status_helper.cc
- src/core/lib/gprpp/time.cc
- - src/core/lib/iomgr/closure.cc
- src/core/lib/iomgr/combiner.cc
- src/core/lib/iomgr/error.cc
- src/core/lib/iomgr/exec_ctx.cc
@@ -9849,7 +9714,6 @@ targets:
- src/core/lib/resource_quota/periodic_update.cc
- src/core/lib/slice/percent_encoding.cc
- src/core/lib/slice/slice.cc
- - src/core/lib/slice/slice_refcount.cc
- src/core/lib/slice/slice_string_helpers.cc
- test/core/resource_quota/periodic_update_test.cc
deps:
@@ -9910,12 +9774,92 @@ targets:
build: test
language: c++
headers:
+ - src/core/ext/upb-generated/google/protobuf/any.upb.h
+ - src/core/ext/upb-generated/google/rpc/status.upb.h
+ - src/core/lib/debug/trace.h
+ - src/core/lib/experiments/config.h
+ - src/core/lib/experiments/experiments.h
+ - src/core/lib/gpr/spinlock.h
+ - src/core/lib/gprpp/atomic_utils.h
+ - src/core/lib/gprpp/bitset.h
+ - src/core/lib/gprpp/cpp_impl_of.h
+ - src/core/lib/gprpp/manual_constructor.h
+ - src/core/lib/gprpp/orphanable.h
+ - src/core/lib/gprpp/ref_counted.h
+ - src/core/lib/gprpp/ref_counted_ptr.h
+ - src/core/lib/gprpp/status_helper.h
+ - src/core/lib/gprpp/time.h
+ - src/core/lib/iomgr/closure.h
+ - src/core/lib/iomgr/combiner.h
+ - src/core/lib/iomgr/error.h
+ - src/core/lib/iomgr/exec_ctx.h
+ - src/core/lib/iomgr/executor.h
+ - src/core/lib/iomgr/iomgr_internal.h
+ - src/core/lib/promise/activity.h
+ - src/core/lib/promise/context.h
+ - src/core/lib/promise/detail/basic_join.h
+ - src/core/lib/promise/detail/basic_seq.h
+ - src/core/lib/promise/detail/promise_factory.h
+ - src/core/lib/promise/detail/promise_like.h
+ - src/core/lib/promise/detail/status.h
+ - src/core/lib/promise/detail/switch.h
+ - src/core/lib/promise/exec_ctx_wakeup_scheduler.h
+ - src/core/lib/promise/intra_activity_waiter.h
- src/core/lib/promise/join.h
+ - src/core/lib/promise/loop.h
+ - src/core/lib/promise/map.h
+ - src/core/lib/promise/pipe.h
+ - src/core/lib/promise/poll.h
+ - src/core/lib/promise/race.h
+ - src/core/lib/promise/seq.h
+ - src/core/lib/resource_quota/arena.h
+ - src/core/lib/resource_quota/memory_quota.h
+ - src/core/lib/resource_quota/periodic_update.h
+ - src/core/lib/resource_quota/resource_quota.h
+ - src/core/lib/resource_quota/thread_quota.h
+ - src/core/lib/resource_quota/trace.h
+ - src/core/lib/slice/percent_encoding.h
+ - src/core/lib/slice/slice.h
+ - src/core/lib/slice/slice_internal.h
+ - src/core/lib/slice/slice_refcount.h
+ - src/core/lib/slice/slice_string_helpers.h
- test/core/promise/test_wakeup_schedulers.h
src:
+ - src/core/ext/upb-generated/google/protobuf/any.upb.c
+ - src/core/ext/upb-generated/google/rpc/status.upb.c
+ - src/core/lib/debug/trace.cc
+ - src/core/lib/event_engine/memory_allocator.cc
+ - src/core/lib/experiments/config.cc
+ - src/core/lib/experiments/experiments.cc
+ - src/core/lib/gprpp/status_helper.cc
+ - src/core/lib/gprpp/time.cc
+ - src/core/lib/iomgr/combiner.cc
+ - src/core/lib/iomgr/error.cc
+ - src/core/lib/iomgr/exec_ctx.cc
+ - src/core/lib/iomgr/executor.cc
+ - src/core/lib/iomgr/iomgr_internal.cc
+ - src/core/lib/promise/activity.cc
+ - src/core/lib/promise/pipe.cc
+ - src/core/lib/resource_quota/arena.cc
+ - src/core/lib/resource_quota/memory_quota.cc
+ - src/core/lib/resource_quota/periodic_update.cc
+ - src/core/lib/resource_quota/resource_quota.cc
+ - src/core/lib/resource_quota/thread_quota.cc
+ - src/core/lib/resource_quota/trace.cc
+ - src/core/lib/slice/percent_encoding.cc
+ - src/core/lib/slice/slice.cc
+ - src/core/lib/slice/slice_string_helpers.cc
- test/core/promise/pipe_test.cc
deps:
- - grpc
+ - absl/container:flat_hash_set
+ - absl/functional:any_invocable
+ - absl/functional:function_ref
+ - absl/hash:hash
+ - absl/meta:type_traits
+ - absl/status:statusor
+ - absl/utility:utility
+ - gpr
+ - upb
uses_polling: false
- name: poll_test
gtest: true
@@ -10988,15 +10932,12 @@ targets:
build: test
language: c++
headers:
- - src/core/lib/debug/trace.h
- src/core/lib/slice/slice.h
- src/core/lib/slice/slice_internal.h
- src/core/lib/slice/slice_refcount.h
- src/core/lib/slice/slice_string_helpers.h
src:
- - src/core/lib/debug/trace.cc
- src/core/lib/slice/slice.cc
- - src/core/lib/slice/slice_refcount.cc
- src/core/lib/slice/slice_string_helpers.cc
- test/core/slice/slice_string_helpers_test.cc
deps:
@@ -11620,7 +11561,6 @@ targets:
build: test
language: c++
headers:
- - src/core/lib/debug/trace.h
- src/core/lib/event_engine/handle_containers.h
- src/core/lib/event_engine/resolved_address_internal.h
- src/core/lib/iomgr/port.h
@@ -11631,14 +11571,12 @@ targets:
- src/core/lib/slice/slice_refcount.h
- src/core/lib/slice/slice_string_helpers.h
src:
- - src/core/lib/debug/trace.cc
- src/core/lib/event_engine/event_engine.cc
- src/core/lib/event_engine/resolved_address.cc
- src/core/lib/event_engine/slice.cc
- src/core/lib/event_engine/slice_buffer.cc
- src/core/lib/slice/slice.cc
- src/core/lib/slice/slice_buffer.cc
- - src/core/lib/slice/slice_refcount.cc
- src/core/lib/slice/slice_string_helpers.cc
- test/core/event_engine/slice_buffer_test.cc
deps:
@@ -12246,8 +12184,6 @@ targets:
- src/core/lib/promise/detail/switch.h
- src/core/lib/promise/exec_ctx_wakeup_scheduler.h
- src/core/lib/promise/for_each.h
- - src/core/lib/promise/if.h
- - src/core/lib/promise/interceptor_list.h
- src/core/lib/promise/intra_activity_waiter.h
- src/core/lib/promise/loop.h
- src/core/lib/promise/map.h
@@ -12256,7 +12192,6 @@ targets:
- src/core/lib/promise/poll.h
- src/core/lib/promise/race.h
- src/core/lib/promise/seq.h
- - src/core/lib/promise/trace.h
- src/core/lib/promise/try_concurrently.h
- src/core/lib/promise/try_seq.h
- src/core/lib/resource_quota/arena.h
@@ -12277,21 +12212,19 @@ targets:
- src/core/lib/experiments/experiments.cc
- src/core/lib/gprpp/status_helper.cc
- src/core/lib/gprpp/time.cc
- - src/core/lib/iomgr/closure.cc
- src/core/lib/iomgr/combiner.cc
- src/core/lib/iomgr/error.cc
- src/core/lib/iomgr/exec_ctx.cc
- src/core/lib/iomgr/executor.cc
- src/core/lib/iomgr/iomgr_internal.cc
- src/core/lib/promise/activity.cc
- - src/core/lib/promise/trace.cc
+ - src/core/lib/promise/pipe.cc
- src/core/lib/resource_quota/arena.cc
- src/core/lib/resource_quota/memory_quota.cc
- src/core/lib/resource_quota/periodic_update.cc
- src/core/lib/resource_quota/trace.cc
- src/core/lib/slice/percent_encoding.cc
- src/core/lib/slice/slice.cc
- - src/core/lib/slice/slice_refcount.cc
- src/core/lib/slice/slice_string_helpers.cc
- test/core/promise/try_concurrently_test.cc
deps:
diff --git a/config.m4 b/config.m4
index 876ef5c9e36..c30182fd782 100644
--- a/config.m4
+++ b/config.m4
@@ -598,7 +598,6 @@ if test "$PHP_GRPC" != "no"; then
src/core/lib/iomgr/buffer_list.cc \
src/core/lib/iomgr/call_combiner.cc \
src/core/lib/iomgr/cfstream_handle.cc \
- src/core/lib/iomgr/closure.cc \
src/core/lib/iomgr/combiner.cc \
src/core/lib/iomgr/dualstack_socket_posix.cc \
src/core/lib/iomgr/endpoint.cc \
@@ -680,8 +679,8 @@ if test "$PHP_GRPC" != "no"; then
src/core/lib/load_balancing/lb_policy_registry.cc \
src/core/lib/matchers/matchers.cc \
src/core/lib/promise/activity.cc \
+ src/core/lib/promise/pipe.cc \
src/core/lib/promise/sleep.cc \
- src/core/lib/promise/trace.cc \
src/core/lib/resolver/resolver.cc \
src/core/lib/resolver/resolver_registry.cc \
src/core/lib/resolver/server_address.cc \
@@ -759,7 +758,6 @@ if test "$PHP_GRPC" != "no"; then
src/core/lib/slice/percent_encoding.cc \
src/core/lib/slice/slice.cc \
src/core/lib/slice/slice_buffer.cc \
- src/core/lib/slice/slice_refcount.cc \
src/core/lib/slice/slice_string_helpers.cc \
src/core/lib/surface/api_trace.cc \
src/core/lib/surface/builtins.cc \
diff --git a/config.w32 b/config.w32
index 616170f76e2..8131eadf4b1 100644
--- a/config.w32
+++ b/config.w32
@@ -564,7 +564,6 @@ if (PHP_GRPC != "no") {
"src\\core\\lib\\iomgr\\buffer_list.cc " +
"src\\core\\lib\\iomgr\\call_combiner.cc " +
"src\\core\\lib\\iomgr\\cfstream_handle.cc " +
- "src\\core\\lib\\iomgr\\closure.cc " +
"src\\core\\lib\\iomgr\\combiner.cc " +
"src\\core\\lib\\iomgr\\dualstack_socket_posix.cc " +
"src\\core\\lib\\iomgr\\endpoint.cc " +
@@ -646,8 +645,8 @@ if (PHP_GRPC != "no") {
"src\\core\\lib\\load_balancing\\lb_policy_registry.cc " +
"src\\core\\lib\\matchers\\matchers.cc " +
"src\\core\\lib\\promise\\activity.cc " +
+ "src\\core\\lib\\promise\\pipe.cc " +
"src\\core\\lib\\promise\\sleep.cc " +
- "src\\core\\lib\\promise\\trace.cc " +
"src\\core\\lib\\resolver\\resolver.cc " +
"src\\core\\lib\\resolver\\resolver_registry.cc " +
"src\\core\\lib\\resolver\\server_address.cc " +
@@ -725,7 +724,6 @@ if (PHP_GRPC != "no") {
"src\\core\\lib\\slice\\percent_encoding.cc " +
"src\\core\\lib\\slice\\slice.cc " +
"src\\core\\lib\\slice\\slice_buffer.cc " +
- "src\\core\\lib\\slice\\slice_refcount.cc " +
"src\\core\\lib\\slice\\slice_string_helpers.cc " +
"src\\core\\lib\\surface\\api_trace.cc " +
"src\\core\\lib\\surface\\builtins.cc " +
diff --git a/doc/environment_variables.md b/doc/environment_variables.md
index f5f10a285f3..d2d0ba9e798 100644
--- a/doc/environment_variables.md
+++ b/doc/environment_variables.md
@@ -118,7 +118,6 @@ some configuration as environment variables that can be set.
- queue_refcount
- error_refcount
- stream_refcount
- - slice_refcount
- workqueue_refcount
- fd_refcount
- cq_refcount
diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec
index cb816108ad5..adf5330fdb1 100644
--- a/gRPC-C++.podspec
+++ b/gRPC-C++.podspec
@@ -907,27 +907,25 @@ Pod::Spec.new do |s|
'src/core/lib/promise/activity.h',
'src/core/lib/promise/arena_promise.h',
'src/core/lib/promise/context.h',
- 'src/core/lib/promise/detail/basic_join.h',
'src/core/lib/promise/detail/basic_seq.h',
'src/core/lib/promise/detail/promise_factory.h',
'src/core/lib/promise/detail/promise_like.h',
'src/core/lib/promise/detail/status.h',
'src/core/lib/promise/detail/switch.h',
'src/core/lib/promise/exec_ctx_wakeup_scheduler.h',
- 'src/core/lib/promise/if.h',
- 'src/core/lib/promise/interceptor_list.h',
+ 'src/core/lib/promise/for_each.h',
'src/core/lib/promise/intra_activity_waiter.h',
'src/core/lib/promise/latch.h',
'src/core/lib/promise/loop.h',
'src/core/lib/promise/map.h',
+ 'src/core/lib/promise/map_pipe.h',
'src/core/lib/promise/pipe.h',
'src/core/lib/promise/poll.h',
'src/core/lib/promise/promise.h',
'src/core/lib/promise/race.h',
'src/core/lib/promise/seq.h',
'src/core/lib/promise/sleep.h',
- 'src/core/lib/promise/trace.h',
- 'src/core/lib/promise/try_join.h',
+ 'src/core/lib/promise/try_concurrently.h',
'src/core/lib/promise/try_seq.h',
'src/core/lib/resolver/resolver.h',
'src/core/lib/resolver/resolver_factory.h',
@@ -1836,27 +1834,25 @@ Pod::Spec.new do |s|
'src/core/lib/promise/activity.h',
'src/core/lib/promise/arena_promise.h',
'src/core/lib/promise/context.h',
- 'src/core/lib/promise/detail/basic_join.h',
'src/core/lib/promise/detail/basic_seq.h',
'src/core/lib/promise/detail/promise_factory.h',
'src/core/lib/promise/detail/promise_like.h',
'src/core/lib/promise/detail/status.h',
'src/core/lib/promise/detail/switch.h',
'src/core/lib/promise/exec_ctx_wakeup_scheduler.h',
- 'src/core/lib/promise/if.h',
- 'src/core/lib/promise/interceptor_list.h',
+ 'src/core/lib/promise/for_each.h',
'src/core/lib/promise/intra_activity_waiter.h',
'src/core/lib/promise/latch.h',
'src/core/lib/promise/loop.h',
'src/core/lib/promise/map.h',
+ 'src/core/lib/promise/map_pipe.h',
'src/core/lib/promise/pipe.h',
'src/core/lib/promise/poll.h',
'src/core/lib/promise/promise.h',
'src/core/lib/promise/race.h',
'src/core/lib/promise/seq.h',
'src/core/lib/promise/sleep.h',
- 'src/core/lib/promise/trace.h',
- 'src/core/lib/promise/try_join.h',
+ 'src/core/lib/promise/try_concurrently.h',
'src/core/lib/promise/try_seq.h',
'src/core/lib/resolver/resolver.h',
'src/core/lib/resolver/resolver_factory.h',
diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec
index 6e7f4d423e8..c5b87c8131b 100644
--- a/gRPC-Core.podspec
+++ b/gRPC-Core.podspec
@@ -1321,7 +1321,6 @@ Pod::Spec.new do |s|
'src/core/lib/iomgr/call_combiner.h',
'src/core/lib/iomgr/cfstream_handle.cc',
'src/core/lib/iomgr/cfstream_handle.h',
- 'src/core/lib/iomgr/closure.cc',
'src/core/lib/iomgr/closure.h',
'src/core/lib/iomgr/combiner.cc',
'src/core/lib/iomgr/combiner.h',
@@ -1477,19 +1476,19 @@ Pod::Spec.new do |s|
'src/core/lib/promise/activity.h',
'src/core/lib/promise/arena_promise.h',
'src/core/lib/promise/context.h',
- 'src/core/lib/promise/detail/basic_join.h',
'src/core/lib/promise/detail/basic_seq.h',
'src/core/lib/promise/detail/promise_factory.h',
'src/core/lib/promise/detail/promise_like.h',
'src/core/lib/promise/detail/status.h',
'src/core/lib/promise/detail/switch.h',
'src/core/lib/promise/exec_ctx_wakeup_scheduler.h',
- 'src/core/lib/promise/if.h',
- 'src/core/lib/promise/interceptor_list.h',
+ 'src/core/lib/promise/for_each.h',
'src/core/lib/promise/intra_activity_waiter.h',
'src/core/lib/promise/latch.h',
'src/core/lib/promise/loop.h',
'src/core/lib/promise/map.h',
+ 'src/core/lib/promise/map_pipe.h',
+ 'src/core/lib/promise/pipe.cc',
'src/core/lib/promise/pipe.h',
'src/core/lib/promise/poll.h',
'src/core/lib/promise/promise.h',
@@ -1497,9 +1496,7 @@ Pod::Spec.new do |s|
'src/core/lib/promise/seq.h',
'src/core/lib/promise/sleep.cc',
'src/core/lib/promise/sleep.h',
- 'src/core/lib/promise/trace.cc',
- 'src/core/lib/promise/trace.h',
- 'src/core/lib/promise/try_join.h',
+ 'src/core/lib/promise/try_concurrently.h',
'src/core/lib/promise/try_seq.h',
'src/core/lib/resolver/resolver.cc',
'src/core/lib/resolver/resolver.h',
@@ -1654,7 +1651,6 @@ Pod::Spec.new do |s|
'src/core/lib/slice/slice_buffer.cc',
'src/core/lib/slice/slice_buffer.h',
'src/core/lib/slice/slice_internal.h',
- 'src/core/lib/slice/slice_refcount.cc',
'src/core/lib/slice/slice_refcount.h',
'src/core/lib/slice/slice_string_helpers.cc',
'src/core/lib/slice/slice_string_helpers.h',
@@ -2521,27 +2517,25 @@ Pod::Spec.new do |s|
'src/core/lib/promise/activity.h',
'src/core/lib/promise/arena_promise.h',
'src/core/lib/promise/context.h',
- 'src/core/lib/promise/detail/basic_join.h',
'src/core/lib/promise/detail/basic_seq.h',
'src/core/lib/promise/detail/promise_factory.h',
'src/core/lib/promise/detail/promise_like.h',
'src/core/lib/promise/detail/status.h',
'src/core/lib/promise/detail/switch.h',
'src/core/lib/promise/exec_ctx_wakeup_scheduler.h',
- 'src/core/lib/promise/if.h',
- 'src/core/lib/promise/interceptor_list.h',
+ 'src/core/lib/promise/for_each.h',
'src/core/lib/promise/intra_activity_waiter.h',
'src/core/lib/promise/latch.h',
'src/core/lib/promise/loop.h',
'src/core/lib/promise/map.h',
+ 'src/core/lib/promise/map_pipe.h',
'src/core/lib/promise/pipe.h',
'src/core/lib/promise/poll.h',
'src/core/lib/promise/promise.h',
'src/core/lib/promise/race.h',
'src/core/lib/promise/seq.h',
'src/core/lib/promise/sleep.h',
- 'src/core/lib/promise/trace.h',
- 'src/core/lib/promise/try_join.h',
+ 'src/core/lib/promise/try_concurrently.h',
'src/core/lib/promise/try_seq.h',
'src/core/lib/resolver/resolver.h',
'src/core/lib/resolver/resolver_factory.h',
diff --git a/grpc.gemspec b/grpc.gemspec
index 5cce81b11c8..4da80f8c12c 100644
--- a/grpc.gemspec
+++ b/grpc.gemspec
@@ -1230,7 +1230,6 @@ Gem::Specification.new do |s|
s.files += %w( src/core/lib/iomgr/call_combiner.h )
s.files += %w( src/core/lib/iomgr/cfstream_handle.cc )
s.files += %w( src/core/lib/iomgr/cfstream_handle.h )
- s.files += %w( src/core/lib/iomgr/closure.cc )
s.files += %w( src/core/lib/iomgr/closure.h )
s.files += %w( src/core/lib/iomgr/combiner.cc )
s.files += %w( src/core/lib/iomgr/combiner.h )
@@ -1386,19 +1385,19 @@ Gem::Specification.new do |s|
s.files += %w( src/core/lib/promise/activity.h )
s.files += %w( src/core/lib/promise/arena_promise.h )
s.files += %w( src/core/lib/promise/context.h )
- s.files += %w( src/core/lib/promise/detail/basic_join.h )
s.files += %w( src/core/lib/promise/detail/basic_seq.h )
s.files += %w( src/core/lib/promise/detail/promise_factory.h )
s.files += %w( src/core/lib/promise/detail/promise_like.h )
s.files += %w( src/core/lib/promise/detail/status.h )
s.files += %w( src/core/lib/promise/detail/switch.h )
s.files += %w( src/core/lib/promise/exec_ctx_wakeup_scheduler.h )
- s.files += %w( src/core/lib/promise/if.h )
- s.files += %w( src/core/lib/promise/interceptor_list.h )
+ s.files += %w( src/core/lib/promise/for_each.h )
s.files += %w( src/core/lib/promise/intra_activity_waiter.h )
s.files += %w( src/core/lib/promise/latch.h )
s.files += %w( src/core/lib/promise/loop.h )
s.files += %w( src/core/lib/promise/map.h )
+ s.files += %w( src/core/lib/promise/map_pipe.h )
+ s.files += %w( src/core/lib/promise/pipe.cc )
s.files += %w( src/core/lib/promise/pipe.h )
s.files += %w( src/core/lib/promise/poll.h )
s.files += %w( src/core/lib/promise/promise.h )
@@ -1406,9 +1405,7 @@ Gem::Specification.new do |s|
s.files += %w( src/core/lib/promise/seq.h )
s.files += %w( src/core/lib/promise/sleep.cc )
s.files += %w( src/core/lib/promise/sleep.h )
- s.files += %w( src/core/lib/promise/trace.cc )
- s.files += %w( src/core/lib/promise/trace.h )
- s.files += %w( src/core/lib/promise/try_join.h )
+ s.files += %w( src/core/lib/promise/try_concurrently.h )
s.files += %w( src/core/lib/promise/try_seq.h )
s.files += %w( src/core/lib/resolver/resolver.cc )
s.files += %w( src/core/lib/resolver/resolver.h )
@@ -1563,7 +1560,6 @@ Gem::Specification.new do |s|
s.files += %w( src/core/lib/slice/slice_buffer.cc )
s.files += %w( src/core/lib/slice/slice_buffer.h )
s.files += %w( src/core/lib/slice/slice_internal.h )
- s.files += %w( src/core/lib/slice/slice_refcount.cc )
s.files += %w( src/core/lib/slice/slice_refcount.h )
s.files += %w( src/core/lib/slice/slice_string_helpers.cc )
s.files += %w( src/core/lib/slice/slice_string_helpers.h )
diff --git a/grpc.gyp b/grpc.gyp
index 42a1ac2eb33..aac09f741a8 100644
--- a/grpc.gyp
+++ b/grpc.gyp
@@ -886,7 +886,6 @@
'src/core/lib/iomgr/buffer_list.cc',
'src/core/lib/iomgr/call_combiner.cc',
'src/core/lib/iomgr/cfstream_handle.cc',
- 'src/core/lib/iomgr/closure.cc',
'src/core/lib/iomgr/combiner.cc',
'src/core/lib/iomgr/dualstack_socket_posix.cc',
'src/core/lib/iomgr/endpoint.cc',
@@ -968,8 +967,8 @@
'src/core/lib/load_balancing/lb_policy_registry.cc',
'src/core/lib/matchers/matchers.cc',
'src/core/lib/promise/activity.cc',
+ 'src/core/lib/promise/pipe.cc',
'src/core/lib/promise/sleep.cc',
- 'src/core/lib/promise/trace.cc',
'src/core/lib/resolver/resolver.cc',
'src/core/lib/resolver/resolver_registry.cc',
'src/core/lib/resolver/server_address.cc',
@@ -1047,7 +1046,6 @@
'src/core/lib/slice/percent_encoding.cc',
'src/core/lib/slice/slice.cc',
'src/core/lib/slice/slice_buffer.cc',
- 'src/core/lib/slice/slice_refcount.cc',
'src/core/lib/slice/slice_string_helpers.cc',
'src/core/lib/surface/api_trace.cc',
'src/core/lib/surface/builtins.cc',
@@ -1366,7 +1364,6 @@
'src/core/lib/iomgr/buffer_list.cc',
'src/core/lib/iomgr/call_combiner.cc',
'src/core/lib/iomgr/cfstream_handle.cc',
- 'src/core/lib/iomgr/closure.cc',
'src/core/lib/iomgr/combiner.cc',
'src/core/lib/iomgr/dualstack_socket_posix.cc',
'src/core/lib/iomgr/endpoint.cc',
@@ -1446,8 +1443,8 @@
'src/core/lib/load_balancing/lb_policy.cc',
'src/core/lib/load_balancing/lb_policy_registry.cc',
'src/core/lib/promise/activity.cc',
+ 'src/core/lib/promise/pipe.cc',
'src/core/lib/promise/sleep.cc',
- 'src/core/lib/promise/trace.cc',
'src/core/lib/resolver/resolver.cc',
'src/core/lib/resolver/resolver_registry.cc',
'src/core/lib/resolver/server_address.cc',
@@ -1494,7 +1491,6 @@
'src/core/lib/slice/percent_encoding.cc',
'src/core/lib/slice/slice.cc',
'src/core/lib/slice/slice_buffer.cc',
- 'src/core/lib/slice/slice_refcount.cc',
'src/core/lib/slice/slice_string_helpers.cc',
'src/core/lib/surface/api_trace.cc',
'src/core/lib/surface/builtins.cc',
@@ -1869,7 +1865,6 @@
'src/core/lib/iomgr/buffer_list.cc',
'src/core/lib/iomgr/call_combiner.cc',
'src/core/lib/iomgr/cfstream_handle.cc',
- 'src/core/lib/iomgr/closure.cc',
'src/core/lib/iomgr/combiner.cc',
'src/core/lib/iomgr/dualstack_socket_posix.cc',
'src/core/lib/iomgr/endpoint.cc',
@@ -1949,7 +1944,7 @@
'src/core/lib/load_balancing/lb_policy_registry.cc',
'src/core/lib/matchers/matchers.cc',
'src/core/lib/promise/activity.cc',
- 'src/core/lib/promise/trace.cc',
+ 'src/core/lib/promise/pipe.cc',
'src/core/lib/resolver/resolver.cc',
'src/core/lib/resolver/resolver_registry.cc',
'src/core/lib/resolver/server_address.cc',
@@ -1996,7 +1991,6 @@
'src/core/lib/slice/percent_encoding.cc',
'src/core/lib/slice/slice.cc',
'src/core/lib/slice/slice_buffer.cc',
- 'src/core/lib/slice/slice_refcount.cc',
'src/core/lib/slice/slice_string_helpers.cc',
'src/core/lib/surface/api_trace.cc',
'src/core/lib/surface/builtins.cc',
diff --git a/package.xml b/package.xml
index 8ffbd092a4f..3f97548e386 100644
--- a/package.xml
+++ b/package.xml
@@ -1212,7 +1212,6 @@
-
@@ -1368,19 +1367,19 @@
-
-
-
+
+
+
@@ -1388,9 +1387,7 @@
-
-
-
+
@@ -1545,7 +1542,6 @@
-
diff --git a/src/core/BUILD b/src/core/BUILD
index 0a1706f75ab..6f26534c0e0 100644
--- a/src/core/BUILD
+++ b/src/core/BUILD
@@ -384,7 +384,6 @@ grpc_cc_library(
hdrs = ["lib/promise/try_concurrently.h"],
external_deps = [
"absl/status",
- "absl/strings",
"absl/types:variant",
],
language = "c++",
@@ -392,7 +391,6 @@ grpc_cc_library(
"lib/promise/map_pipe.h",
],
deps = [
- "activity",
"construct_destruct",
"for_each",
"map",
@@ -401,10 +399,8 @@ grpc_cc_library(
"promise_factory",
"promise_like",
"promise_status",
- "promise_trace",
"try_seq",
"//:gpr",
- "//:grpc_trace",
],
)
@@ -419,13 +415,9 @@ grpc_cc_library(
"for_each",
"map",
"pipe",
- "poll",
"promise_factory",
- "promise_trace",
"try_seq",
- "//:gpr",
"//:gpr_platform",
- "//:grpc_trace",
],
)
@@ -536,7 +528,6 @@ grpc_cc_library(
language = "c++",
public_hdrs = ["lib/promise/if.h"],
deps = [
- "construct_destruct",
"poll",
"promise_factory",
"promise_like",
@@ -792,18 +783,14 @@ grpc_cc_library(
grpc_cc_library(
name = "latch",
- external_deps = ["absl/strings"],
language = "c++",
public_hdrs = [
"lib/promise/latch.h",
],
deps = [
- "activity",
"intra_activity_waiter",
"poll",
- "promise_trace",
"//:gpr",
- "//:grpc_trace",
],
)
@@ -827,38 +814,15 @@ grpc_cc_library(
],
)
-grpc_cc_library(
- name = "interceptor_list",
- hdrs = [
- "lib/promise/interceptor_list.h",
- ],
- external_deps = [
- "absl/strings",
- "absl/strings:str_format",
- "absl/types:optional",
- "absl/types:variant",
- ],
- deps = [
- "arena",
- "construct_destruct",
- "context",
- "poll",
- "promise_factory",
- "promise_trace",
- "//:debug_location",
- "//:gpr",
- "//:grpc_trace",
- ],
-)
-
grpc_cc_library(
name = "pipe",
+ srcs = [
+ "lib/promise/pipe.cc",
+ ],
hdrs = [
"lib/promise/pipe.h",
],
external_deps = [
- "absl/base:core_headers",
- "absl/memory",
"absl/strings",
"absl/types:optional",
"absl/types:variant",
@@ -868,32 +832,10 @@ grpc_cc_library(
"activity",
"arena",
"context",
- "if",
- "interceptor_list",
"intra_activity_waiter",
- "map",
"poll",
- "promise_trace",
- "seq",
- "//:debug_location",
"//:gpr",
"//:grpc_trace",
- "//:ref_counted_ptr",
- ],
-)
-
-grpc_cc_library(
- name = "promise_trace",
- srcs = [
- "lib/promise/trace.cc",
- ],
- hdrs = [
- "lib/promise/trace.h",
- ],
- language = "c++",
- deps = [
- "//:gpr_platform",
- "//:grpc_trace",
],
)
@@ -918,20 +860,16 @@ grpc_cc_library(
name = "for_each",
external_deps = [
"absl/status",
- "absl/strings",
"absl/types:variant",
],
language = "c++",
public_hdrs = ["lib/promise/for_each.h"],
deps = [
- "activity",
"construct_destruct",
"poll",
"promise_factory",
- "promise_trace",
"//:gpr",
"//:gpr_platform",
- "//:grpc_trace",
],
)
@@ -1189,9 +1127,6 @@ grpc_cc_library(
grpc_cc_library(
name = "slice_refcount",
- srcs = [
- "lib/slice/slice_refcount.cc",
- ],
hdrs = [
"lib/slice/slice_refcount.h",
],
@@ -1199,10 +1134,8 @@ grpc_cc_library(
"//:include/grpc/slice.h",
],
deps = [
- "//:debug_location",
"//:event_engine_base_hdrs",
"//:gpr",
- "//:grpc_trace",
],
)
@@ -1226,7 +1159,6 @@ grpc_cc_library(
deps = [
"slice_cast",
"slice_refcount",
- "//:debug_location",
"//:event_engine_base_hdrs",
"//:gpr",
],
@@ -1241,7 +1173,6 @@ grpc_cc_library(
"lib/slice/slice_buffer.h",
"//:include/grpc/slice_buffer.h",
],
- external_deps = ["absl/memory"],
deps = [
"slice",
"slice_refcount",
@@ -1277,13 +1208,9 @@ grpc_cc_library(
grpc_cc_library(
name = "closure",
- srcs = [
- "lib/iomgr/closure.cc",
- ],
hdrs = [
"lib/iomgr/closure.h",
],
- external_deps = ["absl/strings:str_format"],
visibility = ["@grpc:alt_grpc_base_legacy"],
deps = [
"error",
@@ -3591,6 +3518,7 @@ grpc_cc_library(
"ext/filters/stateful_session/stateful_session_service_config_parser.h",
],
external_deps = [
+ "absl/status",
"absl/status:statusor",
"absl/strings",
"absl/types:optional",
@@ -3599,6 +3527,7 @@ grpc_cc_library(
deps = [
"arena",
"arena_promise",
+ "basic_seq",
"channel_args",
"channel_fwd",
"context",
@@ -3606,12 +3535,12 @@ grpc_cc_library(
"json",
"json_args",
"json_object_loader",
- "map",
- "pipe",
- "poll",
+ "latch",
+ "seq",
"service_config_parser",
"slice",
"time",
+ "try_concurrently",
"unique_type_name",
"validation_errors",
"//:config",
@@ -3649,29 +3578,26 @@ grpc_cc_library(
],
language = "c++",
deps = [
- "arena",
"arena_promise",
"channel_args",
"channel_fwd",
"channel_init",
"channel_stack_type",
"closure",
- "context",
"error",
"gpr_atm",
"grpc_sockaddr",
"json",
"json_args",
"json_object_loader",
+ "latch",
"lb_policy",
"lb_policy_factory",
"lb_policy_registry",
- "map",
- "pipe",
- "poll",
"pollset_set",
"ref_counted",
"resolved_address",
+ "seq",
"slice",
"slice_refcount",
"status_helper",
@@ -3695,6 +3621,7 @@ grpc_cc_library(
"//:grpc_security_base",
"//:grpc_trace",
"//:orphanable",
+ "//:promise",
"//:protobuf_duration_upb",
"//:protobuf_timestamp_upb",
"//:ref_counted_ptr",
diff --git a/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc b/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc
index d9e979b7c43..45e875ba2a6 100644
--- a/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc
+++ b/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc
@@ -31,11 +31,9 @@
#include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h"
#include "src/core/lib/channel/channel_stack.h"
#include "src/core/lib/gprpp/ref_counted_ptr.h"
-#include "src/core/lib/promise/context.h"
-#include "src/core/lib/promise/map.h"
-#include "src/core/lib/promise/pipe.h"
-#include "src/core/lib/promise/poll.h"
-#include "src/core/lib/resource_quota/arena.h"
+#include "src/core/lib/promise/latch.h"
+#include "src/core/lib/promise/promise.h"
+#include "src/core/lib/promise/seq.h"
#include "src/core/lib/transport/metadata_batch.h"
#include "src/core/lib/transport/transport.h"
@@ -63,21 +61,16 @@ ArenaPromise ClientLoadReportingFilter::MakeCallPromise(
client_stats.reset(*client_stats_md);
}
- auto* saw_initial_metadata = GetContext()->New(false);
- call_args.server_initial_metadata->InterceptAndMap(
- [saw_initial_metadata](ServerMetadataHandle md) {
- *saw_initial_metadata = true;
- return md;
- });
+ auto* server_initial_metadata = call_args.server_initial_metadata;
- return Map(next_promise_factory(std::move(call_args)),
- [saw_initial_metadata, client_stats = std::move(client_stats)](
+ return Seq(next_promise_factory(std::move(call_args)),
+ [server_initial_metadata, client_stats = std::move(client_stats)](
ServerMetadataHandle trailing_metadata) {
if (client_stats != nullptr) {
client_stats->AddCallFinished(
trailing_metadata->get(GrpcStreamNetworkState()) ==
GrpcStreamNetworkState::kNotSentOnWire,
- *saw_initial_metadata);
+ NowOrNever(server_initial_metadata->Wait()).has_value());
}
return trailing_metadata;
});
diff --git a/src/core/ext/filters/http/client/http_client_filter.cc b/src/core/ext/filters/http/client/http_client_filter.cc
index 58f9a709024..7e299e3f2c7 100644
--- a/src/core/ext/filters/http/client/http_client_filter.cc
+++ b/src/core/ext/filters/http/client/http_client_filter.cc
@@ -40,11 +40,10 @@
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/channel/channel_stack.h"
#include "src/core/lib/promise/context.h"
+#include "src/core/lib/promise/detail/basic_seq.h"
#include "src/core/lib/promise/latch.h"
-#include "src/core/lib/promise/map.h"
-#include "src/core/lib/promise/pipe.h"
-#include "src/core/lib/promise/poll.h"
-#include "src/core/lib/promise/race.h"
+#include "src/core/lib/promise/seq.h"
+#include "src/core/lib/promise/try_concurrently.h"
#include "src/core/lib/resource_quota/arena.h"
#include "src/core/lib/slice/percent_encoding.h"
#include "src/core/lib/transport/status_conversion.h"
@@ -119,27 +118,24 @@ ArenaPromise HttpClientFilter::MakeCallPromise(
md->Set(ContentTypeMetadata(), ContentTypeMetadata::kApplicationGrpc);
md->Set(UserAgentMetadata(), user_agent_.Ref());
- auto* initial_metadata_err =
- GetContext()->New>();
+ auto* read_latch = GetContext()->New>();
+ auto* write_latch =
+ std::exchange(call_args.server_initial_metadata, read_latch);
- call_args.server_initial_metadata->InterceptAndMap(
- [initial_metadata_err](
- ServerMetadataHandle md) -> absl::optional {
- auto r = CheckServerMetadata(md.get());
- if (!r.ok()) {
- initial_metadata_err->Set(ServerMetadataFromStatus(r));
- return absl::nullopt;
- }
- return std::move(md);
- });
-
- return Race(Map(next_promise_factory(std::move(call_args)),
- [](ServerMetadataHandle md) -> ServerMetadataHandle {
- auto r = CheckServerMetadata(md.get());
- if (!r.ok()) return ServerMetadataFromStatus(r);
- return md;
- }),
- initial_metadata_err->Wait());
+ return TryConcurrently(
+ Seq(next_promise_factory(std::move(call_args)),
+ [](ServerMetadataHandle md) -> ServerMetadataHandle {
+ auto r = CheckServerMetadata(md.get());
+ if (!r.ok()) return ServerMetadataFromStatus(r);
+ return md;
+ }))
+ .NecessaryPull(Seq(read_latch->Wait(),
+ [write_latch](ServerMetadata** md) -> absl::Status {
+ auto r = *md == nullptr ? absl::OkStatus()
+ : CheckServerMetadata(*md);
+ write_latch->Set(*md);
+ return r;
+ }));
}
HttpClientFilter::HttpClientFilter(HttpSchemeMetadata::ValueType scheme,
diff --git a/src/core/ext/filters/http/message_compress/compression_filter.cc b/src/core/ext/filters/http/message_compress/compression_filter.cc
index 5a84aceefe5..69a7f0a25f7 100644
--- a/src/core/ext/filters/http/message_compress/compression_filter.cc
+++ b/src/core/ext/filters/http/message_compress/compression_filter.cc
@@ -21,7 +21,7 @@
#include
#include
#include
-#include
+#include
#include
#include "absl/meta/type_traits.h"
@@ -43,16 +43,17 @@
#include "src/core/lib/compression/compression_internal.h"
#include "src/core/lib/compression/message_compress.h"
#include "src/core/lib/debug/trace.h"
-#include "src/core/lib/promise/activity.h"
#include "src/core/lib/promise/context.h"
+#include "src/core/lib/promise/detail/promise_like.h"
#include "src/core/lib/promise/latch.h"
+#include "src/core/lib/promise/map_pipe.h"
#include "src/core/lib/promise/pipe.h"
-#include "src/core/lib/promise/poll.h"
-#include "src/core/lib/promise/race.h"
+#include "src/core/lib/promise/promise.h"
+#include "src/core/lib/promise/seq.h"
+#include "src/core/lib/promise/try_concurrently.h"
#include "src/core/lib/resource_quota/arena.h"
#include "src/core/lib/slice/slice_buffer.h"
#include "src/core/lib/surface/call.h"
-#include "src/core/lib/surface/call_trace.h"
#include "src/core/lib/transport/metadata_batch.h"
#include "src/core/lib/transport/transport.h"
@@ -157,19 +158,20 @@ MessageHandle CompressionFilter::CompressMessage(
}
absl::StatusOr CompressionFilter::DecompressMessage(
- MessageHandle message, DecompressArgs args) const {
+ MessageHandle message, grpc_compression_algorithm algorithm,
+ absl::optional max_recv_message_length) const {
if (GRPC_TRACE_FLAG_ENABLED(grpc_compression_trace)) {
gpr_log(GPR_ERROR, "DecompressMessage: len=%" PRIdPTR " max=%d alg=%d",
- message->payload()->Length(),
- args.max_recv_message_length.value_or(-1), args.algorithm);
+ message->payload()->Length(), max_recv_message_length.value_or(-1),
+ algorithm);
}
// Check max message length.
- if (args.max_recv_message_length.has_value() &&
+ if (max_recv_message_length.has_value() &&
message->payload()->Length() >
- static_cast(*args.max_recv_message_length)) {
+ static_cast(*max_recv_message_length)) {
return absl::ResourceExhaustedError(absl::StrFormat(
"Received message larger than max (%u vs. %d)",
- message->payload()->Length(), *args.max_recv_message_length));
+ message->payload()->Length(), *max_recv_message_length));
}
// Check if decompression is enabled (if not, we can just pass the message
// up).
@@ -179,11 +181,11 @@ absl::StatusOr CompressionFilter::DecompressMessage(
}
// Try to decompress the payload.
SliceBuffer decompressed_slices;
- if (grpc_msg_decompress(args.algorithm, message->payload()->c_slice_buffer(),
+ if (grpc_msg_decompress(algorithm, message->payload()->c_slice_buffer(),
decompressed_slices.c_slice_buffer()) == 0) {
return absl::InternalError(
absl::StrCat("Unexpected error decompressing data for algorithm ",
- CompressionAlgorithmAsString(args.algorithm)));
+ CompressionAlgorithmAsString(algorithm)));
}
// Swap the decompressed slices into the message.
message->payload()->Swap(&decompressed_slices);
@@ -192,114 +194,123 @@ absl::StatusOr CompressionFilter::DecompressMessage(
return std::move(message);
}
-grpc_compression_algorithm CompressionFilter::HandleOutgoingMetadata(
- grpc_metadata_batch& outgoing_metadata) {
- const auto algorithm = outgoing_metadata.Take(GrpcInternalEncodingRequest())
- .value_or(default_compression_algorithm());
- // Convey supported compression algorithms.
- outgoing_metadata.Set(GrpcAcceptEncodingMetadata(),
- enabled_compression_algorithms());
- if (algorithm != GRPC_COMPRESS_NONE) {
- outgoing_metadata.Set(GrpcEncodingMetadata(), algorithm);
- }
- return algorithm;
-}
+class CompressionFilter::DecompressLoop {
+ public:
+ explicit DecompressLoop(CompressionFilter* filter, CallArgs& call_args)
+ : filter_(filter),
+ mapper_(PipeMapper::Intercept(
+ *call_args.incoming_messages)) {}
-CompressionFilter::DecompressArgs CompressionFilter::HandleIncomingMetadata(
- const grpc_metadata_batch& incoming_metadata) {
- // Configure max receive size.
- auto max_recv_message_length = max_recv_size_;
- const MessageSizeParsedConfig* limits =
- MessageSizeParsedConfig::GetFromCallContext(
- GetContext(),
- message_size_service_config_parser_index_);
- if (limits != nullptr && limits->max_recv_size().has_value() &&
- (!max_recv_message_length.has_value() ||
- *limits->max_recv_size() < *max_recv_message_length)) {
- max_recv_message_length = *limits->max_recv_size();
+ // Once we have a compression algorithm we can construct the decompression
+ // loop.
+ // Returns a promise that resolves to MessageHandle.
+ auto TakeAndRun(grpc_compression_algorithm algorithm) {
+ // Configure max receive size.
+ auto max_recv_message_length = filter_->max_recv_size_;
+ const MessageSizeParsedConfig* limits =
+ MessageSizeParsedConfig::GetFromCallContext(
+ GetContext(),
+ filter_->message_size_service_config_parser_index_);
+ if (limits != nullptr && limits->max_recv_size().has_value() &&
+ (!max_recv_message_length.has_value() ||
+ *limits->max_recv_size() < *max_recv_message_length)) {
+ max_recv_message_length = *limits->max_recv_size();
+ }
+ // Interject decompression into the message loop.
+ return mapper_.TakeAndRun([algorithm, max_recv_message_length,
+ filter = filter_](MessageHandle message) {
+ return filter->DecompressMessage(std::move(message), algorithm,
+ max_recv_message_length);
+ });
}
- return DecompressArgs{incoming_metadata.get(GrpcEncodingMetadata())
- .value_or(GRPC_COMPRESS_NONE),
- max_recv_message_length};
-}
+
+ private:
+ CompressionFilter* filter_;
+ PipeMapper mapper_;
+};
+
+class CompressionFilter::CompressLoop {
+ public:
+ explicit CompressLoop(CompressionFilter* filter, CallArgs& call_args)
+ : filter_(filter),
+ mapper_(PipeMapper::Intercept(
+ *call_args.outgoing_messages)) {}
+
+ // Once we're ready to send initial metadata we can construct the compression
+ // loop.
+ // Returns a promise that resolves to MessageHandle.
+ auto TakeAndRun(grpc_metadata_batch& outgoing_metadata) {
+ const auto algorithm =
+ outgoing_metadata.Take(GrpcInternalEncodingRequest())
+ .value_or(filter_->default_compression_algorithm());
+ // Convey supported compression algorithms.
+ outgoing_metadata.Set(GrpcAcceptEncodingMetadata(),
+ filter_->enabled_compression_algorithms());
+ if (algorithm != GRPC_COMPRESS_NONE) {
+ outgoing_metadata.Set(GrpcEncodingMetadata(), algorithm);
+ }
+ // Interject compression into the message loop.
+ return mapper_.TakeAndRun([filter = filter_, algorithm](MessageHandle m) {
+ return filter->CompressMessage(std::move(m), algorithm);
+ });
+ }
+
+ private:
+ CompressionFilter* filter_;
+ PipeMapper mapper_;
+};
ArenaPromise ClientCompressionFilter::MakeCallPromise(
CallArgs call_args, NextPromiseFactory next_promise_factory) {
- auto compression_algorithm =
- HandleOutgoingMetadata(*call_args.client_initial_metadata);
- call_args.client_to_server_messages->InterceptAndMap(
- [compression_algorithm,
- this](MessageHandle message) -> absl::optional {
- return CompressMessage(std::move(message), compression_algorithm);
- });
- auto* decompress_args = GetContext()->New(
- DecompressArgs{GRPC_COMPRESS_NONE, absl::nullopt});
- auto* decompress_err =
- GetContext()->New>();
- call_args.server_initial_metadata->InterceptAndMap(
- [decompress_args, this](ServerMetadataHandle server_initial_metadata)
- -> absl::optional {
- if (server_initial_metadata == nullptr) return absl::nullopt;
- *decompress_args = HandleIncomingMetadata(*server_initial_metadata);
- return std::move(server_initial_metadata);
- });
- call_args.server_to_client_messages->InterceptAndMap(
- [decompress_err, decompress_args,
- this](MessageHandle message) -> absl::optional {
- auto r = DecompressMessage(std::move(message), *decompress_args);
- if (!r.ok()) {
- decompress_err->Set(ServerMetadataFromStatus(r.status()));
- return absl::nullopt;
- }
- return std::move(*r);
- });
- // Run the next filter, and race it with getting an error from decompression.
- return Race(next_promise_factory(std::move(call_args)),
- decompress_err->Wait());
+ auto compress_loop = CompressLoop(this, call_args)
+ .TakeAndRun(*call_args.client_initial_metadata);
+ DecompressLoop decompress_loop(this, call_args);
+ auto* server_initial_metadata = call_args.server_initial_metadata;
+ // Concurrently:
+ // - call the next filter
+ // - wait for initial metadata from the server and then commence decompression
+ // - compress outgoing messages
+ return TryConcurrently(next_promise_factory(std::move(call_args)))
+ .NecessaryPull(Seq(server_initial_metadata->Wait(),
+ [decompress_loop = std::move(decompress_loop)](
+ ServerMetadata** server_initial_metadata) mutable
+ -> ArenaPromise {
+ if (*server_initial_metadata == nullptr) {
+ return ImmediateOkStatus();
+ }
+ return decompress_loop.TakeAndRun(
+ (*server_initial_metadata)
+ ->get(GrpcEncodingMetadata())
+ .value_or(GRPC_COMPRESS_NONE));
+ }))
+ .Push(std::move(compress_loop));
}
ArenaPromise ServerCompressionFilter::MakeCallPromise(
CallArgs call_args, NextPromiseFactory next_promise_factory) {
- auto decompress_args =
- HandleIncomingMetadata(*call_args.client_initial_metadata);
- auto* decompress_err =
- GetContext()->New>();
- call_args.client_to_server_messages->InterceptAndMap(
- [decompress_err, decompress_args,
- this](MessageHandle message) -> absl::optional {
- auto r = DecompressMessage(std::move(message), decompress_args);
- gpr_log(GPR_DEBUG, "DecompressMessage returned %s",
- r.status().ToString().c_str());
- if (!r.ok()) {
- decompress_err->Set(ServerMetadataFromStatus(r.status()));
- return absl::nullopt;
- }
- return std::move(*r);
- });
- auto* compression_algorithm =
- GetContext()->New();
- call_args.server_initial_metadata->InterceptAndMap(
- [this, compression_algorithm](ServerMetadataHandle md) {
- if (grpc_call_trace.enabled()) {
- gpr_log(GPR_INFO, "%s[compression] Write metadata",
- Activity::current()->DebugTag().c_str());
- }
- // Find the compression algorithm.
- *compression_algorithm = HandleOutgoingMetadata(*md);
- return md;
- });
- call_args.server_to_client_messages->InterceptAndMap(
- [compression_algorithm,
- this](MessageHandle message) -> absl::optional {
- return CompressMessage(std::move(message), *compression_algorithm);
- });
+ CompressLoop compress_loop(this, call_args);
+ auto decompress_loop = DecompressLoop(this, call_args)
+ .TakeAndRun(call_args.client_initial_metadata
+ ->get(GrpcEncodingMetadata())
+ .value_or(GRPC_COMPRESS_NONE));
+ auto* read_latch = GetContext()->New>();
+ auto* write_latch =
+ std::exchange(call_args.server_initial_metadata, read_latch);
// Concurrently:
// - call the next filter
// - decompress incoming messages
// - wait for initial metadata to be sent, and then commence compression of
// outgoing messages
- return Race(next_promise_factory(std::move(call_args)),
- decompress_err->Wait());
+ return TryConcurrently(next_promise_factory(std::move(call_args)))
+ .Pull(std::move(decompress_loop))
+ .Push(Seq(read_latch->Wait(),
+ [write_latch, compress_loop = std::move(compress_loop)](
+ ServerMetadata** md) mutable {
+ // Find the compression algorithm.
+ auto loop = compress_loop.TakeAndRun(**md);
+ write_latch->Set(*md);
+ return loop;
+ }));
}
} // namespace grpc_core
diff --git a/src/core/ext/filters/http/message_compress/compression_filter.h b/src/core/ext/filters/http/message_compress/compression_filter.h
index caf49c03336..8a17bebe0dc 100644
--- a/src/core/ext/filters/http/message_compress/compression_filter.h
+++ b/src/core/ext/filters/http/message_compress/compression_filter.h
@@ -34,7 +34,6 @@
#include "src/core/lib/channel/promise_based_filter.h"
#include "src/core/lib/compression/compression_internal.h"
#include "src/core/lib/promise/arena_promise.h"
-#include "src/core/lib/transport/metadata_batch.h"
#include "src/core/lib/transport/transport.h"
namespace grpc_core {
@@ -63,13 +62,11 @@ namespace grpc_core {
class CompressionFilter : public ChannelFilter {
protected:
- struct DecompressArgs {
- grpc_compression_algorithm algorithm;
- absl::optional max_recv_message_length;
- };
-
explicit CompressionFilter(const ChannelArgs& args);
+ class CompressLoop;
+ class DecompressLoop;
+
grpc_compression_algorithm default_compression_algorithm() const {
return default_compression_algorithm_;
}
@@ -78,19 +75,15 @@ class CompressionFilter : public ChannelFilter {
return enabled_compression_algorithms_;
}
- grpc_compression_algorithm HandleOutgoingMetadata(
- grpc_metadata_batch& outgoing_metadata);
- DecompressArgs HandleIncomingMetadata(
- const grpc_metadata_batch& incoming_metadata);
-
+ private:
// Compress one message synchronously.
MessageHandle CompressMessage(MessageHandle message,
grpc_compression_algorithm algorithm) const;
// Decompress one message synchronously.
- absl::StatusOr DecompressMessage(MessageHandle message,
- DecompressArgs args) const;
+ absl::StatusOr DecompressMessage(
+ MessageHandle message, grpc_compression_algorithm algorithm,
+ absl::optional max_recv_message_length) const;
- private:
// Max receive message length, if set.
absl::optional max_recv_size_;
size_t message_size_service_config_parser_index_;
diff --git a/src/core/ext/filters/http/server/http_server_filter.cc b/src/core/ext/filters/http/server/http_server_filter.cc
index 8ec0e54df0b..23062d5c007 100644
--- a/src/core/ext/filters/http/server/http_server_filter.cc
+++ b/src/core/ext/filters/http/server/http_server_filter.cc
@@ -22,7 +22,6 @@
#include
#include
-#include
#include
#include "absl/base/attributes.h"
@@ -31,19 +30,18 @@
#include "absl/types/optional.h"
#include
-#include
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/channel/channel_stack.h"
-#include "src/core/lib/debug/trace.h"
-#include "src/core/lib/promise/activity.h"
-#include "src/core/lib/promise/map.h"
-#include "src/core/lib/promise/pipe.h"
-#include "src/core/lib/promise/poll.h"
+#include "src/core/lib/promise/context.h"
+#include "src/core/lib/promise/detail/basic_seq.h"
+#include "src/core/lib/promise/latch.h"
#include "src/core/lib/promise/promise.h"
+#include "src/core/lib/promise/seq.h"
+#include "src/core/lib/promise/try_concurrently.h"
+#include "src/core/lib/resource_quota/arena.h"
#include "src/core/lib/slice/percent_encoding.h"
#include "src/core/lib/slice/slice.h"
-#include "src/core/lib/surface/call_trace.h"
#include "src/core/lib/transport/metadata_batch.h"
namespace grpc_core {
@@ -131,23 +129,24 @@ ArenaPromise HttpServerFilter::MakeCallPromise(
md->Remove(UserAgentMetadata());
}
- call_args.server_initial_metadata->InterceptAndMap(
- [](ServerMetadataHandle md) {
- if (grpc_call_trace.enabled()) {
- gpr_log(GPR_INFO, "%s[http-server] Write metadata",
- Activity::current()->DebugTag().c_str());
- }
- FilterOutgoingMetadata(md.get());
- md->Set(HttpStatusMetadata(), 200);
- md->Set(ContentTypeMetadata(), ContentTypeMetadata::kApplicationGrpc);
- return md;
- });
+ auto* read_latch = GetContext()->New>();
+ auto* write_latch =
+ std::exchange(call_args.server_initial_metadata, read_latch);
- return Map(next_promise_factory(std::move(call_args)),
- [](ServerMetadataHandle md) -> ServerMetadataHandle {
- FilterOutgoingMetadata(md.get());
- return md;
- });
+ return TryConcurrently(
+ Seq(next_promise_factory(std::move(call_args)),
+ [](ServerMetadataHandle md) -> ServerMetadataHandle {
+ FilterOutgoingMetadata(md.get());
+ return md;
+ }))
+ .Push(Seq(read_latch->Wait(), [write_latch](ServerMetadata** md) {
+ FilterOutgoingMetadata(*md);
+ (*md)->Set(HttpStatusMetadata(), 200);
+ (*md)->Set(ContentTypeMetadata(),
+ ContentTypeMetadata::kApplicationGrpc);
+ write_latch->Set(*md);
+ return absl::OkStatus();
+ }));
}
absl::StatusOr HttpServerFilter::Create(
diff --git a/src/core/ext/filters/stateful_session/stateful_session_filter.cc b/src/core/ext/filters/stateful_session/stateful_session_filter.cc
index e64975fd9b4..cefed052921 100644
--- a/src/core/ext/filters/stateful_session/stateful_session_filter.cc
+++ b/src/core/ext/filters/stateful_session/stateful_session_filter.cc
@@ -27,6 +27,7 @@
#include
#include
+#include "absl/status/status.h"
#include "absl/strings/escaping.h"
#include "absl/strings/match.h"
#include "absl/strings/str_cat.h"
@@ -46,9 +47,10 @@
#include "src/core/lib/gprpp/crash.h"
#include "src/core/lib/gprpp/time.h"
#include "src/core/lib/promise/context.h"
-#include "src/core/lib/promise/map.h"
-#include "src/core/lib/promise/pipe.h"
-#include "src/core/lib/promise/poll.h"
+#include "src/core/lib/promise/detail/basic_seq.h"
+#include "src/core/lib/promise/latch.h"
+#include "src/core/lib/promise/seq.h"
+#include "src/core/lib/promise/try_concurrently.h"
#include "src/core/lib/resource_quota/arena.h"
#include "src/core/lib/service_config/service_config_call_data.h"
#include "src/core/lib/slice/slice.h"
@@ -163,23 +165,32 @@ ArenaPromise StatefulSessionFilter::MakeCallPromise(
*cookie_value);
}
// Intercept server initial metadata.
- call_args.server_initial_metadata->InterceptAndMap(
- [cookie_config, cookie_value](ServerMetadataHandle md) {
- // Add cookie to server initial metadata if needed.
- MaybeUpdateServerInitialMetadata(cookie_config, cookie_value, md.get());
- return md;
- });
- return Map(next_promise_factory(std::move(call_args)),
- [cookie_config, cookie_value](ServerMetadataHandle md) {
- // If we got a Trailers-Only response, then add the
- // cookie to the trailing metadata instead of the
- // initial metadata.
- if (md->get(GrpcTrailersOnly()).value_or(false)) {
- MaybeUpdateServerInitialMetadata(cookie_config, cookie_value,
- md.get());
- }
- return md;
- });
+ auto* read_latch = GetContext()->New>();
+ auto* write_latch =
+ std::exchange(call_args.server_initial_metadata, read_latch);
+ return TryConcurrently(
+ Seq(next_promise_factory(std::move(call_args)),
+ [cookie_config, cookie_value](ServerMetadataHandle md) {
+ // If we got a Trailers-Only response, then add the
+ // cookie to the trailing metadata instead of the
+ // initial metadata.
+ if (md->get(GrpcTrailersOnly()).value_or(false)) {
+ MaybeUpdateServerInitialMetadata(cookie_config,
+ cookie_value, md.get());
+ }
+ return md;
+ }))
+ .NecessaryPull(Seq(read_latch->Wait(),
+ [write_latch, cookie_config,
+ cookie_value](ServerMetadata** md) -> absl::Status {
+ if (*md != nullptr) {
+ // Add cookie to server initial metadata if needed.
+ MaybeUpdateServerInitialMetadata(
+ cookie_config, cookie_value, *md);
+ }
+ write_latch->Set(*md);
+ return absl::OkStatus();
+ }));
}
absl::optional
diff --git a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc b/src/core/ext/transport/chttp2/transport/chttp2_transport.cc
index 2c54d917d25..ed0b6276575 100644
--- a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc
+++ b/src/core/ext/transport/chttp2/transport/chttp2_transport.cc
@@ -668,10 +668,6 @@ grpc_chttp2_stream::grpc_chttp2_stream(grpc_chttp2_transport* t,
flow_control(&t->flow_control) {
if (server_data) {
id = static_cast(reinterpret_cast(server_data));
- if (grpc_http_trace.enabled()) {
- gpr_log(GPR_DEBUG, "HTTP:%p/%p creating accept stream %d [from %p]", t,
- this, id, server_data);
- }
*t->accepting_stream = this;
grpc_chttp2_stream_map_add(&t->stream_map, id, this);
post_destructive_reclaimer(t);
@@ -1833,12 +1829,6 @@ void grpc_chttp2_maybe_complete_recv_message(grpc_chttp2_transport* t,
// Lambda is immediately invoked as a big scoped section that can be
// exited out of at any point by returning.
[&]() {
- if (grpc_http_trace.enabled()) {
- gpr_log(GPR_DEBUG,
- "maybe_complete_recv_message %p final_metadata_requested=%d "
- "seen_error=%d",
- s, s->final_metadata_requested, s->seen_error);
- }
if (s->final_metadata_requested && s->seen_error) {
grpc_slice_buffer_reset_and_unref(&s->frame_storage);
s->recv_message->reset();
@@ -1849,12 +1839,6 @@ void grpc_chttp2_maybe_complete_recv_message(grpc_chttp2_transport* t,
int64_t min_progress_size;
auto r = grpc_deframe_unprocessed_incoming_frames(
s, &min_progress_size, &**s->recv_message, s->recv_message_flags);
- if (grpc_http_trace.enabled()) {
- gpr_log(GPR_DEBUG, "Deframe data frame: %s",
- grpc_core::PollToString(r, [](absl::Status r) {
- return r.ToString();
- }).c_str());
- }
if (absl::holds_alternative(r)) {
if (s->read_closed) {
grpc_slice_buffer_reset_and_unref(&s->frame_storage);
@@ -1905,14 +1889,6 @@ void grpc_chttp2_maybe_complete_recv_message(grpc_chttp2_transport* t,
void grpc_chttp2_maybe_complete_recv_trailing_metadata(grpc_chttp2_transport* t,
grpc_chttp2_stream* s) {
grpc_chttp2_maybe_complete_recv_message(t, s);
- if (grpc_http_trace.enabled()) {
- gpr_log(GPR_DEBUG,
- "maybe_complete_recv_trailing_metadata cli=%d s=%p closure=%p "
- "read_closed=%d "
- "write_closed=%d %" PRIdPTR,
- t->is_client, s, s->recv_trailing_metadata_finished, s->read_closed,
- s->write_closed, s->frame_storage.length);
- }
if (s->recv_trailing_metadata_finished != nullptr && s->read_closed &&
s->write_closed) {
if (s->seen_error || !t->is_client) {
@@ -2072,14 +2048,6 @@ void grpc_chttp2_fail_pending_writes(grpc_chttp2_transport* t,
void grpc_chttp2_mark_stream_closed(grpc_chttp2_transport* t,
grpc_chttp2_stream* s, int close_reads,
int close_writes, grpc_error_handle error) {
- if (grpc_http_trace.enabled()) {
- gpr_log(
- GPR_DEBUG, "MARK_STREAM_CLOSED: t=%p s=%p(id=%d) %s [%s]", t, s, s->id,
- (close_reads && close_writes)
- ? "read+write"
- : (close_reads ? "read" : (close_writes ? "write" : "nothing??")),
- error.ToString().c_str());
- }
if (s->read_closed && s->write_closed) {
// already closed, but we should still fake the status if needed.
grpc_error_handle overall_error = removal_error(error, s, "Stream removed");
diff --git a/src/core/ext/transport/chttp2/transport/internal.h b/src/core/ext/transport/chttp2/transport/internal.h
index 58b1e02effc..0724e70cfe8 100644
--- a/src/core/ext/transport/chttp2/transport/internal.h
+++ b/src/core/ext/transport/chttp2/transport/internal.h
@@ -389,16 +389,12 @@ struct grpc_chttp2_transport
uint32_t incoming_frame_size = 0;
uint32_t incoming_stream_id = 0;
- grpc_chttp2_stream* incoming_stream = nullptr;
// active parser
- struct Parser {
- const char* name;
- grpc_error_handle (*parser)(void* parser_user_data,
- grpc_chttp2_transport* t, grpc_chttp2_stream* s,
- const grpc_slice& slice, int is_last);
- void* user_data = nullptr;
- };
- Parser parser;
+ void* parser_data = nullptr;
+ grpc_chttp2_stream* incoming_stream = nullptr;
+ grpc_error_handle (*parser)(void* parser_user_data, grpc_chttp2_transport* t,
+ grpc_chttp2_stream* s, const grpc_slice& slice,
+ int is_last);
grpc_chttp2_write_cb* write_cb_pool = nullptr;
diff --git a/src/core/ext/transport/chttp2/transport/parsing.cc b/src/core/ext/transport/chttp2/transport/parsing.cc
index b4d719e5623..2913543e171 100644
--- a/src/core/ext/transport/chttp2/transport/parsing.cc
+++ b/src/core/ext/transport/chttp2/transport/parsing.cc
@@ -18,7 +18,7 @@
#include
-#include
+#include
#include
#include
@@ -28,7 +28,6 @@
#include "absl/status/status.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/str_format.h"
-#include "absl/strings/string_view.h"
#include
#include
@@ -128,65 +127,6 @@ uint32_t grpc_chttp2_min_read_progress_size(grpc_chttp2_transport* t) {
GPR_UNREACHABLE_CODE(return 1);
}
-namespace {
-struct KnownFlag {
- uint8_t flag;
- absl::string_view name;
-};
-
-std::string MakeFrameTypeString(absl::string_view frame_type, uint8_t flags,
- std::initializer_list known_flags) {
- std::string result(frame_type);
- for (const KnownFlag& known_flag : known_flags) {
- if (flags & known_flag.flag) {
- absl::StrAppend(&result, ":", known_flag.name);
- flags &= ~known_flag.flag;
- }
- }
- if (flags != 0) {
- absl::StrAppend(&result, ":UNKNOWN_FLAGS=0x",
- absl::Hex(flags, absl::kZeroPad2));
- }
- return result;
-}
-
-std::string FrameTypeString(uint8_t frame_type, uint8_t flags) {
- switch (frame_type) {
- case GRPC_CHTTP2_FRAME_DATA:
- return MakeFrameTypeString(
- "DATA", flags, {{GRPC_CHTTP2_DATA_FLAG_END_STREAM, "END_STREAM"}});
- case GRPC_CHTTP2_FRAME_HEADER:
- return MakeFrameTypeString(
- "HEADERS", flags,
- {{GRPC_CHTTP2_DATA_FLAG_END_STREAM, "END_STREAM"},
- {GRPC_CHTTP2_DATA_FLAG_END_HEADERS, "END_HEADERS"},
- {GRPC_CHTTP2_FLAG_HAS_PRIORITY, "PRIORITY"}});
- case GRPC_CHTTP2_FRAME_CONTINUATION:
- return MakeFrameTypeString(
- "HEADERS", flags,
- {{GRPC_CHTTP2_DATA_FLAG_END_STREAM, "END_STREAM"},
- {GRPC_CHTTP2_DATA_FLAG_END_HEADERS, "END_HEADERS"},
- {GRPC_CHTTP2_FLAG_HAS_PRIORITY, "PRIORITY"}});
- case GRPC_CHTTP2_FRAME_RST_STREAM:
- return MakeFrameTypeString("RST_STREAM", flags, {});
- case GRPC_CHTTP2_FRAME_SETTINGS:
- return MakeFrameTypeString("SETTINGS", flags,
- {{GRPC_CHTTP2_FLAG_ACK, "ACK"}});
- case GRPC_CHTTP2_FRAME_PING:
- return MakeFrameTypeString("PING", flags,
- {{GRPC_CHTTP2_FLAG_ACK, "ACK"}});
- case GRPC_CHTTP2_FRAME_GOAWAY:
- return MakeFrameTypeString("GOAWAY", flags, {});
- case GRPC_CHTTP2_FRAME_WINDOW_UPDATE:
- return MakeFrameTypeString("WINDOW_UPDATE", flags, {});
- default:
- return MakeFrameTypeString(
- absl::StrCat("UNKNOWN_FRAME_TYPE_", static_cast(frame_type)),
- flags, {});
- }
-}
-} // namespace
-
grpc_error_handle grpc_chttp2_perform_read(grpc_chttp2_transport* t,
const grpc_slice& slice) {
const uint8_t* beg = GRPC_SLICE_START_PTR(slice);
@@ -310,12 +250,6 @@ grpc_error_handle grpc_chttp2_perform_read(grpc_chttp2_transport* t,
case GRPC_DTS_FH_8:
GPR_DEBUG_ASSERT(cur < end);
t->incoming_stream_id |= (static_cast(*cur));
- if (grpc_http_trace.enabled()) {
- gpr_log(GPR_INFO, "INCOMING[%p]: %s len:%d id:0x%08x", t,
- FrameTypeString(t->incoming_frame_type, t->incoming_frame_flags)
- .c_str(),
- t->incoming_frame_size, t->incoming_stream_id);
- }
t->deframe_state = GRPC_DTS_FRAME;
err = init_frame_parser(t);
if (!err.ok()) {
@@ -470,8 +404,8 @@ static HPackParser::LogInfo hpack_parser_log_info(
static grpc_error_handle init_header_skip_frame_parser(
grpc_chttp2_transport* t, HPackParser::Priority priority_type) {
bool is_eoh = t->expect_continuation_stream_id != 0;
- t->parser = grpc_chttp2_transport::Parser{
- "header", grpc_chttp2_header_parser_parse, &t->hpack_parser};
+ t->parser = grpc_chttp2_header_parser_parse;
+ t->parser_data = &t->hpack_parser;
t->hpack_parser.BeginFrame(
nullptr,
t->settings[GRPC_ACKED_SETTINGS]
@@ -483,17 +417,15 @@ static grpc_error_handle init_header_skip_frame_parser(
static grpc_error_handle init_non_header_skip_frame_parser(
grpc_chttp2_transport* t) {
- t->parser =
- grpc_chttp2_transport::Parser{"skip_parser", skip_parser, nullptr};
+ t->parser = skip_parser;
return absl::OkStatus();
}
void grpc_chttp2_parsing_become_skip_parser(grpc_chttp2_transport* t) {
- if (t->parser.parser == grpc_chttp2_header_parser_parse) {
+ if (t->parser == grpc_chttp2_header_parser_parse) {
t->hpack_parser.StopBufferingFrame();
} else {
- t->parser =
- grpc_chttp2_transport::Parser{"skip_parser", skip_parser, nullptr};
+ t->parser = skip_parser;
}
}
@@ -540,8 +472,9 @@ static grpc_error_handle init_data_frame_parser(grpc_chttp2_transport* t) {
error_handler:
if (status.ok()) {
t->incoming_stream = s;
- t->parser = grpc_chttp2_transport::Parser{
- "data", grpc_chttp2_data_parser_parse, nullptr};
+ // t->parser = grpc_chttp2_data_parser_parse;
+ t->parser = grpc_chttp2_data_parser_parse;
+ t->parser_data = nullptr;
t->ping_state.last_ping_sent_time = grpc_core::Timestamp::InfPast();
return absl::OkStatus();
} else if (s != nullptr) {
@@ -651,8 +584,8 @@ static grpc_error_handle init_header_frame_parser(grpc_chttp2_transport* t,
t->incoming_stream = nullptr;
return init_header_skip_frame_parser(t, priority_type);
}
- t->parser = grpc_chttp2_transport::Parser{
- "header", grpc_chttp2_header_parser_parse, &t->hpack_parser};
+ t->parser = grpc_chttp2_header_parser_parse;
+ t->parser_data = &t->hpack_parser;
if (t->header_eof) {
s->eos_received = true;
}
@@ -707,17 +640,12 @@ static grpc_error_handle init_window_update_frame_parser(
grpc_chttp2_stream* s = t->incoming_stream =
grpc_chttp2_parsing_lookup_stream(t, t->incoming_stream_id);
if (s == nullptr) {
- if (grpc_http_trace.enabled()) {
- gpr_log(GPR_ERROR, "Stream %d not found, ignoring WINDOW_UPDATE",
- t->incoming_stream_id);
- }
return init_non_header_skip_frame_parser(t);
}
s->stats.incoming.framing_bytes += 9;
}
- t->parser = grpc_chttp2_transport::Parser{
- "window_update", grpc_chttp2_window_update_parser_parse,
- &t->simple.window_update};
+ t->parser = grpc_chttp2_window_update_parser_parse;
+ t->parser_data = &t->simple.window_update;
return absl::OkStatus();
}
@@ -725,8 +653,8 @@ static grpc_error_handle init_ping_parser(grpc_chttp2_transport* t) {
grpc_error_handle err = grpc_chttp2_ping_parser_begin_frame(
&t->simple.ping, t->incoming_frame_size, t->incoming_frame_flags);
if (!err.ok()) return err;
- t->parser = grpc_chttp2_transport::Parser{
- "ping", grpc_chttp2_ping_parser_parse, &t->simple.ping};
+ t->parser = grpc_chttp2_ping_parser_parse;
+ t->parser_data = &t->simple.ping;
return absl::OkStatus();
}
@@ -740,8 +668,8 @@ static grpc_error_handle init_rst_stream_parser(grpc_chttp2_transport* t) {
return init_non_header_skip_frame_parser(t);
}
s->stats.incoming.framing_bytes += 9;
- t->parser = grpc_chttp2_transport::Parser{
- "rst_stream", grpc_chttp2_rst_stream_parser_parse, &t->simple.rst_stream};
+ t->parser = grpc_chttp2_rst_stream_parser_parse;
+ t->parser_data = &t->simple.rst_stream;
return absl::OkStatus();
}
@@ -749,8 +677,8 @@ static grpc_error_handle init_goaway_parser(grpc_chttp2_transport* t) {
grpc_error_handle err = grpc_chttp2_goaway_parser_begin_frame(
&t->goaway_parser, t->incoming_frame_size, t->incoming_frame_flags);
if (!err.ok()) return err;
- t->parser = grpc_chttp2_transport::Parser{
- "goaway", grpc_chttp2_goaway_parser_parse, &t->goaway_parser};
+ t->parser = grpc_chttp2_goaway_parser_parse;
+ t->parser_data = &t->goaway_parser;
return absl::OkStatus();
}
@@ -778,8 +706,8 @@ static grpc_error_handle init_settings_frame_parser(grpc_chttp2_transport* t) {
t, nullptr);
t->sent_local_settings = false;
}
- t->parser = grpc_chttp2_transport::Parser{
- "settings", grpc_chttp2_settings_parser_parse, &t->simple.settings};
+ t->parser = grpc_chttp2_settings_parser_parse;
+ t->parser_data = &t->simple.settings;
return absl::OkStatus();
}
@@ -787,24 +715,15 @@ static grpc_error_handle parse_frame_slice(grpc_chttp2_transport* t,
const grpc_slice& slice,
int is_last) {
grpc_chttp2_stream* s = t->incoming_stream;
- if (grpc_http_trace.enabled()) {
- gpr_log(GPR_DEBUG,
- "INCOMING[%p;%p]: Parse %" PRIdPTR "b %sframe fragment with %s", t,
- s, GRPC_SLICE_LENGTH(slice), is_last ? "last " : "",
- t->parser.name);
- }
- grpc_error_handle err =
- t->parser.parser(t->parser.user_data, t, s, slice, is_last);
+ grpc_error_handle err = t->parser(t->parser_data, t, s, slice, is_last);
intptr_t unused;
if (GPR_LIKELY(err.ok())) {
return err;
- }
- if (grpc_http_trace.enabled()) {
- gpr_log(GPR_ERROR, "INCOMING[%p;%p]: Parse failed with %s", t, s,
- err.ToString().c_str());
- }
- if (grpc_error_get_int(err, grpc_core::StatusIntProperty::kStreamId,
- &unused)) {
+ } else if (grpc_error_get_int(err, grpc_core::StatusIntProperty::kStreamId,
+ &unused)) {
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) {
+ gpr_log(GPR_ERROR, "%s", grpc_core::StatusToString(err).c_str());
+ }
grpc_chttp2_parsing_become_skip_parser(t);
if (s) {
s->forced_close_error = err;
diff --git a/src/core/lib/channel/channel_stack_builder_impl.cc b/src/core/lib/channel/channel_stack_builder_impl.cc
index 98cb7a0a4c8..c57e12258c4 100644
--- a/src/core/lib/channel/channel_stack_builder_impl.cc
+++ b/src/core/lib/channel/channel_stack_builder_impl.cc
@@ -37,7 +37,6 @@
#include "src/core/lib/gpr/useful.h"
#include "src/core/lib/iomgr/error.h"
#include "src/core/lib/surface/call_trace.h"
-#include "src/core/lib/surface/channel_stack_type.h"
#include "src/core/lib/transport/error_utils.h"
#include "src/core/lib/transport/transport.h"
@@ -54,24 +53,12 @@ absl::StatusOr>
ChannelStackBuilderImpl::Build() {
std::vector stack;
const bool is_promising = IsPromising();
- const bool is_client =
- grpc_channel_stack_type_is_client(channel_stack_type());
- const bool client_promise_tracing =
- is_client && is_promising && grpc_call_trace.enabled();
- const bool server_promise_tracing =
- !is_client && is_promising && grpc_call_trace.enabled();
for (const auto* filter : this->stack()) {
- if (client_promise_tracing) {
+ if (is_promising && grpc_call_trace.enabled()) {
stack.push_back(PromiseTracingFilterFor(filter));
}
stack.push_back(filter);
- if (server_promise_tracing) {
- stack.push_back(PromiseTracingFilterFor(filter));
- }
- }
- if (server_promise_tracing) {
- stack.pop_back(); // connected_channel must be last => can't be traced
}
// calculate the size of the channel stack
diff --git a/src/core/lib/channel/connected_channel.cc b/src/core/lib/channel/connected_channel.cc
index 01e93dfe877..5e74c5d97c5 100644
--- a/src/core/lib/channel/connected_channel.cc
+++ b/src/core/lib/channel/connected_channel.cc
@@ -24,15 +24,12 @@
#include
#include
-#include
-#include
#include
#include
#include
#include
#include "absl/base/thread_annotations.h"
-#include "absl/container/inlined_vector.h"
#include "absl/status/status.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/str_join.h"
@@ -40,7 +37,6 @@
#include "absl/types/variant.h"
#include
-#include
#include
#include
@@ -64,11 +60,10 @@
#include "src/core/lib/promise/activity.h"
#include "src/core/lib/promise/arena_promise.h"
#include "src/core/lib/promise/context.h"
-#include "src/core/lib/promise/detail/basic_seq.h"
+#include "src/core/lib/promise/latch.h"
#include "src/core/lib/promise/pipe.h"
#include "src/core/lib/promise/poll.h"
#include "src/core/lib/resource_quota/arena.h"
-#include "src/core/lib/slice/slice.h"
#include "src/core/lib/slice/slice_buffer.h"
#include "src/core/lib/surface/call.h"
#include "src/core/lib/surface/call_trace.h"
@@ -249,12 +244,57 @@ static void connected_channel_get_channel_info(
namespace grpc_core {
namespace {
-#if defined(GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_CLIENT_CALL) || \
- defined(GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_SERVER_CALL)
-class ConnectedChannelStream : public Orphanable {
+#ifdef GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_CLIENT_CALL
+class ClientStream : public Orphanable {
public:
- grpc_transport* transport() { return transport_; }
- grpc_closure* stream_destroyed_closure() { return &stream_destroyed_; }
+ ClientStream(grpc_transport* transport, CallArgs call_args)
+ : transport_(transport),
+ stream_(nullptr, StreamDeleter(this)),
+ server_initial_metadata_latch_(call_args.server_initial_metadata),
+ client_to_server_messages_(call_args.outgoing_messages),
+ server_to_client_messages_(call_args.incoming_messages),
+ client_initial_metadata_(std::move(call_args.client_initial_metadata)) {
+ call_context_->IncrementRefCount("client_stream");
+ GRPC_STREAM_REF_INIT(
+ &stream_refcount_, 1,
+ [](void* p, grpc_error_handle) {
+ static_cast(p)->BeginDestroy();
+ },
+ this, "client_stream");
+ if (grpc_call_trace.enabled()) {
+ gpr_log(GPR_INFO, "%sInitImpl: intitial_metadata=%s",
+ Activity::current()->DebugTag().c_str(),
+ client_initial_metadata_->DebugString().c_str());
+ }
+ }
+
+ void Orphan() override {
+ bool finished;
+ {
+ MutexLock lock(&mu_);
+ if (grpc_call_trace.enabled()) {
+ gpr_log(GPR_INFO, "%sDropStream: %s",
+ Activity::current()->DebugTag().c_str(),
+ ActiveOpsString().c_str());
+ }
+ finished = finished_;
+ }
+ // If we hadn't already observed the stream to be finished, we need to
+ // cancel it at the transport.
+ if (!finished) {
+ IncrementRefCount("shutdown client stream");
+ auto* cancel_op =
+ GetContext()->New();
+ cancel_op->cancel_stream = true;
+ cancel_op->payload = &batch_payload_;
+ auto* stream = stream_.get();
+ cancel_op->on_complete = NewClosure(
+ [this](grpc_error_handle) { Unref("shutdown client stream"); });
+ batch_payload_.cancel_stream.cancel_error = absl::CancelledError();
+ grpc_transport_perform_stream_op(transport_, stream, cancel_op);
+ }
+ Unref("orphan client stream");
+ }
void IncrementRefCount(const char* reason) {
#ifndef NDEBUG
@@ -274,157 +314,183 @@ class ConnectedChannelStream : public Orphanable {
#endif
}
- void Orphan() final {
- bool finished;
- {
- MutexLock lock(mu());
- if (grpc_call_trace.enabled()) {
- gpr_log(GPR_INFO, "%s[connected] DropStream: %s finished=%s",
- Activity::current()->DebugTag().c_str(),
- ActiveOpsString().c_str(), finished_ ? "true" : "false");
- }
- finished = finished_;
+ void BeginDestroy() {
+ if (stream_ != nullptr) {
+ stream_.reset();
+ } else {
+ StreamDestroyed();
}
- // If we hadn't already observed the stream to be finished, we need to
- // cancel it at the transport.
- if (!finished) {
- IncrementRefCount("shutdown client stream");
- auto* cancel_op =
- GetContext()->New();
- cancel_op->cancel_stream = true;
- cancel_op->payload = batch_payload();
- auto* s = stream();
- cancel_op->on_complete = NewClosure(
- [this](grpc_error_handle) { Unref("shutdown client stream"); });
- batch_payload()->cancel_stream.cancel_error = absl::CancelledError();
- grpc_transport_perform_stream_op(transport(), s, cancel_op);
- }
- Unref("orphan client stream");
}
- protected:
- explicit ConnectedChannelStream(grpc_transport* transport)
- : transport_(transport), stream_(nullptr, StreamDeleter(this)) {
- call_context_->IncrementRefCount("connected_channel_stream");
- GRPC_STREAM_REF_INIT(
- &stream_refcount_, 1,
- [](void* p, grpc_error_handle) {
- static_cast(p)->BeginDestroy();
- },
- this, "client_stream");
- }
+ Poll PollOnce() {
+ MutexLock lock(&mu_);
+ GPR_ASSERT(!finished_);
- grpc_stream* stream() { return stream_.get(); }
- void SetStream(grpc_stream* stream) { stream_.reset(stream); }
- grpc_stream_refcount* stream_refcount() { return &stream_refcount_; }
- Mutex* mu() const ABSL_LOCK_RETURNED(mu_) { return &mu_; }
- grpc_transport_stream_op_batch_payload* batch_payload() {
- return &batch_payload_;
- }
- bool finished() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) { return finished_; }
- void set_finished() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) { finished_ = true; }
- virtual std::string ActiveOpsString() const
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) = 0;
-
- void SchedulePush(grpc_transport_stream_op_batch* batch)
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
if (grpc_call_trace.enabled()) {
- gpr_log(GPR_DEBUG, "%s[connected] Push batch to transport: %s",
+ gpr_log(GPR_INFO, "%sPollConnectedChannel: %s",
Activity::current()->DebugTag().c_str(),
- grpc_transport_stream_op_batch_string(batch).c_str());
+ ActiveOpsString().c_str());
}
- if (push_batches_.empty()) {
- IncrementRefCount("push");
- ExecCtx::Run(DEBUG_LOCATION, &push_, absl::OkStatus());
- }
- push_batches_.push_back(batch);
- }
- void PollSendMessage(PipeReceiver* outgoing_messages,
- ClientMetadataHandle* client_trailing_metadata)
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
+ auto push_recv_message = [this]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
+ recv_message_state_ = PendingReceiveMessage{};
+ auto& pending_recv_message =
+ absl::get(recv_message_state_);
+ memset(&recv_message_, 0, sizeof(recv_message_));
+ recv_message_.payload = &batch_payload_;
+ recv_message_.on_complete = nullptr;
+ recv_message_.recv_message = true;
+ batch_payload_.recv_message.recv_message = &pending_recv_message.payload;
+ batch_payload_.recv_message.flags = &pending_recv_message.flags;
+ batch_payload_.recv_message.call_failed_before_recv_message = nullptr;
+ batch_payload_.recv_message.recv_message_ready =
+ &recv_message_batch_done_;
+ IncrementRefCount("recv_message");
+ recv_message_waker_ = Activity::current()->MakeOwningWaker();
+ push_recv_message_ = true;
+ SchedulePush();
+ };
+
+ if (!std::exchange(requested_metadata_, true)) {
+ if (grpc_call_trace.enabled()) {
+ gpr_log(GPR_INFO, "%sPollConnectedChannel: requesting metadata",
+ Activity::current()->DebugTag().c_str());
+ }
+ stream_.reset(static_cast(
+ GetContext()->Alloc(transport_->vtable->sizeof_stream)));
+ grpc_transport_init_stream(transport_, stream_.get(), &stream_refcount_,
+ nullptr, GetContext());
+ grpc_transport_set_pops(transport_, stream_.get(),
+ GetContext()->polling_entity());
+ memset(&metadata_, 0, sizeof(metadata_));
+ metadata_.send_initial_metadata = true;
+ metadata_.recv_initial_metadata = true;
+ metadata_.recv_trailing_metadata = true;
+ metadata_.payload = &batch_payload_;
+ metadata_.on_complete = &metadata_batch_done_;
+ batch_payload_.send_initial_metadata.send_initial_metadata =
+ client_initial_metadata_.get();
+ batch_payload_.send_initial_metadata.peer_string =
+ GetContext()->peer_string_atm_ptr();
+ server_initial_metadata_ =
+ GetContext()->MakePooled(GetContext());
+ batch_payload_.recv_initial_metadata.recv_initial_metadata =
+ server_initial_metadata_.get();
+ batch_payload_.recv_initial_metadata.recv_initial_metadata_ready =
+ &recv_initial_metadata_ready_;
+ batch_payload_.recv_initial_metadata.trailing_metadata_available =
+ nullptr;
+ batch_payload_.recv_initial_metadata.peer_string = nullptr;
+ server_trailing_metadata_ =
+ GetContext()->MakePooled(GetContext());
+ batch_payload_.recv_trailing_metadata.recv_trailing_metadata =
+ server_trailing_metadata_.get();
+ batch_payload_.recv_trailing_metadata.collect_stats =
+ &GetContext()->call_stats()->transport_stream_stats;
+ batch_payload_.recv_trailing_metadata.recv_trailing_metadata_ready =
+ &recv_trailing_metadata_ready_;
+ push_metadata_ = true;
+ IncrementRefCount("metadata_batch_done");
+ IncrementRefCount("initial_metadata_ready");
+ IncrementRefCount("trailing_metadata_ready");
+ initial_metadata_waker_ = Activity::current()->MakeOwningWaker();
+ trailing_metadata_waker_ = Activity::current()->MakeOwningWaker();
+ SchedulePush();
+ }
if (absl::holds_alternative(send_message_state_)) {
message_to_send_.reset();
}
if (absl::holds_alternative(send_message_state_)) {
message_to_send_.reset();
- send_message_state_.emplace>(
- outgoing_messages->Next());
+ send_message_state_ = client_to_server_messages_->Next();
}
- if (auto* next = absl::get_if>(
+ if (auto* next = absl::get_if::NextType>(
&send_message_state_)) {
auto r = (*next)();
if (auto* p = absl::get_if>(&r)) {
memset(&send_message_, 0, sizeof(send_message_));
- send_message_.payload = batch_payload();
+ send_message_.payload = &batch_payload_;
send_message_.on_complete = &send_message_batch_done_;
// No value => half close from above.
if (p->has_value()) {
- message_to_send_ = std::move(*p);
+ message_to_send_ = std::move(**p);
send_message_state_ = SendMessageToTransport{};
send_message_.send_message = true;
- batch_payload()->send_message.send_message =
- (*message_to_send_)->payload();
- batch_payload()->send_message.flags = (*message_to_send_)->flags();
+ batch_payload_.send_message.send_message =
+ message_to_send_->payload();
+ batch_payload_.send_message.flags = message_to_send_->flags();
} else {
if (grpc_call_trace.enabled()) {
- gpr_log(GPR_INFO, "%s[connected] PollConnectedChannel: half close",
+ gpr_log(GPR_INFO, "%sPollConnectedChannel: half close",
Activity::current()->DebugTag().c_str());
}
GPR_ASSERT(!absl::holds_alternative(send_message_state_));
+ client_trailing_metadata_ =
+ GetContext()->MakePooled(
+ GetContext());
send_message_state_ = Closed{};
send_message_.send_trailing_metadata = true;
- if (client_trailing_metadata != nullptr) {
- *client_trailing_metadata =
- GetContext()->MakePooled(
- GetContext());
- batch_payload()->send_trailing_metadata.send_trailing_metadata =
- client_trailing_metadata->get();
- batch_payload()->send_trailing_metadata.sent = nullptr;
- } else {
- return; // Skip rest of function for server
- }
+ batch_payload_.send_trailing_metadata.send_trailing_metadata =
+ client_trailing_metadata_.get();
+ batch_payload_.send_trailing_metadata.sent = nullptr;
}
IncrementRefCount("send_message");
send_message_waker_ = Activity::current()->MakeOwningWaker();
- SchedulePush(&send_message_);
+ push_send_message_ = true;
+ SchedulePush();
}
}
- }
-
- void PollRecvMessage(PipeSender*& incoming_messages)
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
if (auto* pending =
absl::get_if(&recv_message_state_)) {
if (pending->received) {
if (pending->payload.has_value()) {
if (grpc_call_trace.enabled()) {
gpr_log(GPR_INFO,
- "%s[connected] PollRecvMessage: received payload of "
- "%" PRIdPTR " bytes",
+ "%sRecvMessageBatchDone: received payload of %" PRIdPTR
+ " bytes",
recv_message_waker_.ActivityDebugTag().c_str(),
pending->payload->Length());
}
- recv_message_state_ =
- incoming_messages->Push(GetContext()->MakePooled(
+ recv_message_state_ = server_to_client_messages_->Push(
+ GetContext()->MakePooled(
std::move(*pending->payload), pending->flags));
} else {
if (grpc_call_trace.enabled()) {
- gpr_log(GPR_INFO,
- "%s[connected] PollRecvMessage: received no payload",
+ gpr_log(GPR_INFO, "%sRecvMessageBatchDone: received no payload",
recv_message_waker_.ActivityDebugTag().c_str());
}
recv_message_state_ = Closed{};
- std::exchange(incoming_messages, nullptr)->Close();
+ std::exchange(server_to_client_messages_, nullptr)->Close();
}
}
}
+ if (server_initial_metadata_state_ ==
+ ServerInitialMetadataState::kReceivedButNotSet) {
+ server_initial_metadata_state_ = ServerInitialMetadataState::kSet;
+ server_initial_metadata_latch_->Set(server_initial_metadata_.get());
+ }
if (absl::holds_alternative(recv_message_state_)) {
if (grpc_call_trace.enabled()) {
- gpr_log(GPR_INFO, "%s[connected] PollRecvMessage: requesting message",
+ gpr_log(GPR_INFO, "%sPollConnectedChannel: requesting message",
Activity::current()->DebugTag().c_str());
}
- PushRecvMessage();
+ push_recv_message();
+ }
+ if (server_initial_metadata_state_ == ServerInitialMetadataState::kSet &&
+ !absl::holds_alternative::PushType>(
+ recv_message_state_) &&
+ !absl::holds_alternative(recv_message_state_) &&
+ std::exchange(queued_trailing_metadata_, false)) {
+ if (grpc_call_trace.enabled()) {
+ gpr_log(GPR_INFO,
+ "%sPollConnectedChannel: finished request, returning: {%s}; "
+ "active_ops: %s",
+ Activity::current()->DebugTag().c_str(),
+ server_trailing_metadata_->DebugString().c_str(),
+ ActiveOpsString().c_str());
+ }
+ finished_ = true;
+ return ServerMetadataHandle(std::move(server_trailing_metadata_));
}
if (auto* push = absl::get_if::PushType>(
&recv_message_state_)) {
@@ -434,120 +500,57 @@ class ConnectedChannelStream : public Orphanable {
if (!finished_) {
if (grpc_call_trace.enabled()) {
gpr_log(GPR_INFO,
- "%s[connected] PollRecvMessage: pushed message; "
- "requesting next",
+ "%sPollConnectedChannel: pushed message; requesting next",
Activity::current()->DebugTag().c_str());
}
- PushRecvMessage();
+ push_recv_message();
} else {
if (grpc_call_trace.enabled()) {
gpr_log(GPR_INFO,
- "%s[connected] PollRecvMessage: pushed message "
- "and finished; "
+ "%sPollConnectedChannel: pushed message and finished; "
"marking closed",
Activity::current()->DebugTag().c_str());
}
recv_message_state_ = Closed{};
- std::exchange(incoming_messages, nullptr)->Close();
}
} else {
if (grpc_call_trace.enabled()) {
gpr_log(GPR_INFO,
- "%s[connected] PollRecvMessage: failed to push "
- "message; marking "
+ "%sPollConnectedChannel: failed to push message; marking "
"closed",
Activity::current()->DebugTag().c_str());
}
recv_message_state_ = Closed{};
- std::exchange(incoming_messages, nullptr)->Close();
}
}
}
+ return Pending{};
}
- std::string SendMessageString() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu()) {
- return Match(
- send_message_state_, [](Idle) -> std::string { return "IDLE"; },
- [](Closed) -> std::string { return "CLOSED"; },
- [](const PipeReceiverNextType&) -> std::string {
- return "WAITING";
- },
- [](SendMessageToTransport) -> std::string { return "SENDING"; });
- }
-
- std::string RecvMessageString() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu()) {
- return Match(
- recv_message_state_, [](Idle) -> std::string { return "IDLE"; },
- [](Closed) -> std::string { return "CLOSED"; },
- [](const PendingReceiveMessage&) -> std::string { return "WAITING"; },
- [](const absl::optional& message) -> std::string {
- return absl::StrCat(
- "READY:", message.has_value()
- ? absl::StrCat((*message)->payload()->Length(), "b")
- : "EOS");
- },
- [](const PipeSender::PushType&) -> std::string {
- return "PUSHING";
- });
- }
-
- bool IsPromiseReceiving() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu()) {
- return absl::holds_alternative::PushType>(
- recv_message_state_) ||
- absl::holds_alternative(recv_message_state_);
- }
-
- private:
- struct SendMessageToTransport {};
- struct Idle {};
- struct Closed {};
-
- class StreamDeleter {
- public:
- explicit StreamDeleter(ConnectedChannelStream* impl) : impl_(impl) {}
- void operator()(grpc_stream* stream) const {
- if (stream == nullptr) return;
- grpc_transport_destroy_stream(impl_->transport(), stream,
- impl_->stream_destroyed_closure());
- }
-
- private:
- ConnectedChannelStream* impl_;
- };
- using StreamPtr = std::unique_ptr;
-
- void StreamDestroyed() {
- call_context_->RunInContext([this] {
- auto* cc = call_context_;
- this->~ConnectedChannelStream();
- cc->Unref("child_stream");
- });
- }
-
- void BeginDestroy() {
- if (stream_ != nullptr) {
- stream_.reset();
- } else {
- StreamDestroyed();
- }
- }
-
- // Called from outside the activity to push work down to the transport.
- void Push() {
- PushBatches push_batches;
+ void RecvInitialMetadataReady(grpc_error_handle error) {
+ GPR_ASSERT(error == absl::OkStatus());
{
MutexLock lock(&mu_);
- push_batches.swap(push_batches_);
+ server_initial_metadata_state_ =
+ ServerInitialMetadataState::kReceivedButNotSet;
+ initial_metadata_waker_.Wakeup();
}
- for (auto* batch : push_batches) {
- if (stream() != nullptr) {
- grpc_transport_perform_stream_op(transport(), stream(), batch);
- } else {
- grpc_transport_stream_op_batch_finish_with_failure_from_transport(
- batch, absl::CancelledError());
- }
+ Unref("initial_metadata_ready");
+ }
+
+ void RecvTrailingMetadataReady(grpc_error_handle error) {
+ GPR_ASSERT(error == absl::OkStatus());
+ {
+ MutexLock lock(&mu_);
+ queued_trailing_metadata_ = true;
+ trailing_metadata_waker_.Wakeup();
}
- Unref("push");
+ Unref("trailing_metadata_ready");
+ }
+
+ void MetadataBatchDone(grpc_error_handle error) {
+ GPR_ASSERT(error == absl::OkStatus());
+ Unref("metadata_batch_done");
}
void SendMessageBatchDone(grpc_error_handle error) {
@@ -570,24 +573,21 @@ class ConnectedChannelStream : public Orphanable {
void RecvMessageBatchDone(grpc_error_handle error) {
{
- MutexLock lock(mu());
+ MutexLock lock(&mu_);
if (error != absl::OkStatus()) {
if (grpc_call_trace.enabled()) {
- gpr_log(GPR_INFO, "%s[connected] RecvMessageBatchDone: error=%s",
+ gpr_log(GPR_INFO, "%sRecvMessageBatchDone: error=%s",
recv_message_waker_.ActivityDebugTag().c_str(),
StatusToString(error).c_str());
}
} else if (absl::holds_alternative(recv_message_state_)) {
if (grpc_call_trace.enabled()) {
- gpr_log(GPR_INFO,
- "%s[connected] RecvMessageBatchDone: already closed, "
- "ignoring",
+ gpr_log(GPR_INFO, "%sRecvMessageBatchDone: already closed, ignoring",
recv_message_waker_.ActivityDebugTag().c_str());
}
} else {
if (grpc_call_trace.enabled()) {
- gpr_log(GPR_INFO,
- "%s[connected] RecvMessageBatchDone: received message",
+ gpr_log(GPR_INFO, "%sRecvMessageBatchDone: received message",
recv_message_waker_.ActivityDebugTag().c_str());
}
auto pending =
@@ -601,250 +601,95 @@ class ConnectedChannelStream : public Orphanable {
Unref("recv_message");
}
- void PushRecvMessage() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
- recv_message_state_ = PendingReceiveMessage{};
- auto& pending_recv_message =
- absl::get(recv_message_state_);
- memset(&recv_message_, 0, sizeof(recv_message_));
- recv_message_.payload = batch_payload();
- recv_message_.on_complete = nullptr;
- recv_message_.recv_message = true;
- batch_payload()->recv_message.recv_message = &pending_recv_message.payload;
- batch_payload()->recv_message.flags = &pending_recv_message.flags;
- batch_payload()->recv_message.call_failed_before_recv_message = nullptr;
- batch_payload()->recv_message.recv_message_ready =
- &recv_message_batch_done_;
- IncrementRefCount("recv_message");
- recv_message_waker_ = Activity::current()->MakeOwningWaker();
- SchedulePush(&recv_message_);
- }
-
- mutable Mutex mu_;
- grpc_transport* const transport_;
- CallContext* const call_context_{GetContext()};
- grpc_closure stream_destroyed_ =
- MakeMemberClosure(
- this, DEBUG_LOCATION);
- grpc_stream_refcount stream_refcount_;
- StreamPtr stream_;
- using PushBatches = absl::InlinedVector;
- PushBatches push_batches_ ABSL_GUARDED_BY(mu_);
- grpc_closure push_ =
- MakeMemberClosure(
- this, DEBUG_LOCATION);
-
- NextResult message_to_send_ ABSL_GUARDED_BY(mu_);
- absl::variant,
- SendMessageToTransport>
- send_message_state_ ABSL_GUARDED_BY(mu_);
- grpc_transport_stream_op_batch send_message_;
- grpc_closure send_message_batch_done_ =
- MakeMemberClosure(
- this, DEBUG_LOCATION);
-
- struct PendingReceiveMessage {
- absl::optional payload;
- uint32_t flags;
- bool received = false;
- };
- absl::variant::PushType>
- recv_message_state_ ABSL_GUARDED_BY(mu_);
- grpc_closure recv_message_batch_done_ =
- MakeMemberClosure(
- this, DEBUG_LOCATION);
- grpc_transport_stream_op_batch recv_message_;
-
- Waker send_message_waker_ ABSL_GUARDED_BY(mu_);
- Waker recv_message_waker_ ABSL_GUARDED_BY(mu_);
- bool finished_ ABSL_GUARDED_BY(mu_) = false;
-
- grpc_transport_stream_op_batch_payload batch_payload_{
- GetContext()};
-};
-#endif
-
-#ifdef GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_CLIENT_CALL
-class ClientStream : public ConnectedChannelStream {
- public:
- ClientStream(grpc_transport* transport, CallArgs call_args)
- : ConnectedChannelStream(transport),
- server_initial_metadata_pipe_(call_args.server_initial_metadata),
- client_to_server_messages_(call_args.client_to_server_messages),
- server_to_client_messages_(call_args.server_to_client_messages),
- client_initial_metadata_(std::move(call_args.client_initial_metadata)) {
- if (grpc_call_trace.enabled()) {
- gpr_log(GPR_INFO, "%s[connected] InitImpl: intitial_metadata=%s",
- Activity::current()->DebugTag().c_str(),
- client_initial_metadata_->DebugString().c_str());
- }
- }
-
- Poll PollOnce() {
- MutexLock lock(mu());
- GPR_ASSERT(!finished());
-
- if (grpc_call_trace.enabled()) {
- gpr_log(GPR_INFO, "%s[connected] PollConnectedChannel: %s",
- Activity::current()->DebugTag().c_str(),
- ActiveOpsString().c_str());
- }
-
- if (!std::exchange(requested_metadata_, true)) {
- if (grpc_call_trace.enabled()) {
- gpr_log(GPR_INFO,
- "%s[connected] PollConnectedChannel: requesting metadata",
- Activity::current()->DebugTag().c_str());
+ // Called from outside the activity to push work down to the transport.
+ void Push() {
+ auto do_push = [this](grpc_transport_stream_op_batch* batch) {
+ if (stream_ != nullptr) {
+ grpc_transport_perform_stream_op(transport_, stream_.get(), batch);
+ } else {
+ grpc_transport_stream_op_batch_finish_with_failure_from_transport(
+ batch, absl::CancelledError());
}
- SetStream(static_cast(
- GetContext()->Alloc(transport()->vtable->sizeof_stream)));
- grpc_transport_init_stream(transport(), stream(), stream_refcount(),
- nullptr, GetContext());
- grpc_transport_set_pops(transport(), stream(),
- GetContext()->polling_entity());
- memset(&metadata_, 0, sizeof(metadata_));
- metadata_.send_initial_metadata = true;
- metadata_.recv_initial_metadata = true;
- metadata_.recv_trailing_metadata = true;
- metadata_.payload = batch_payload();
- metadata_.on_complete = &metadata_batch_done_;
- batch_payload()->send_initial_metadata.send_initial_metadata =
- client_initial_metadata_.get();
- batch_payload()->send_initial_metadata.peer_string =
- GetContext()->peer_string_atm_ptr();
- server_initial_metadata_ =
- GetContext()->MakePooled(GetContext());
- batch_payload()->recv_initial_metadata.recv_initial_metadata =
- server_initial_metadata_.get();
- batch_payload()->recv_initial_metadata.recv_initial_metadata_ready =
- &recv_initial_metadata_ready_;
- batch_payload()->recv_initial_metadata.trailing_metadata_available =
- nullptr;
- batch_payload()->recv_initial_metadata.peer_string = nullptr;
- server_trailing_metadata_ =
- GetContext()->MakePooled(GetContext());
- batch_payload()->recv_trailing_metadata.recv_trailing_metadata =
- server_trailing_metadata_.get();
- batch_payload()->recv_trailing_metadata.collect_stats =
- &GetContext()->call_stats()->transport_stream_stats;
- batch_payload()->recv_trailing_metadata.recv_trailing_metadata_ready =
- &recv_trailing_metadata_ready_;
- IncrementRefCount("metadata_batch_done");
- IncrementRefCount("initial_metadata_ready");
- IncrementRefCount("trailing_metadata_ready");
- initial_metadata_waker_ = Activity::current()->MakeOwningWaker();
- trailing_metadata_waker_ = Activity::current()->MakeOwningWaker();
- SchedulePush(&metadata_);
- }
- if (server_initial_metadata_state_ ==
- ServerInitialMetadataState::kReceivedButNotPushed) {
- server_initial_metadata_state_ = ServerInitialMetadataState::kPushing;
- server_initial_metadata_push_promise_ =
- server_initial_metadata_pipe_->Push(
- std::move(server_initial_metadata_));
- }
- if (server_initial_metadata_state_ ==
- ServerInitialMetadataState::kPushing) {
- auto r = (*server_initial_metadata_push_promise_)();
- if (absl::holds_alternative(r)) {
- server_initial_metadata_state_ = ServerInitialMetadataState::kPushed;
- server_initial_metadata_push_promise_.reset();
- }
- }
- PollSendMessage(client_to_server_messages_, &client_trailing_metadata_);
- PollRecvMessage(server_to_client_messages_);
- if (server_initial_metadata_state_ == ServerInitialMetadataState::kPushed &&
- !IsPromiseReceiving() &&
- std::exchange(queued_trailing_metadata_, false)) {
- if (grpc_call_trace.enabled()) {
- gpr_log(GPR_INFO,
- "%s[connected] PollConnectedChannel: finished request, "
- "returning: {%s}; "
- "active_ops: %s",
- Activity::current()->DebugTag().c_str(),
- server_trailing_metadata_->DebugString().c_str(),
- ActiveOpsString().c_str());
- }
- set_finished();
- return ServerMetadataHandle(std::move(server_trailing_metadata_));
- }
- return Pending{};
- }
-
- void RecvInitialMetadataReady(grpc_error_handle error) {
- GPR_ASSERT(error == absl::OkStatus());
+ };
+ bool push_metadata;
+ bool push_send_message;
+ bool push_recv_message;
{
- MutexLock lock(mu());
- server_initial_metadata_state_ =
- ServerInitialMetadataState::kReceivedButNotPushed;
- initial_metadata_waker_.Wakeup();
+ MutexLock lock(&mu_);
+ push_metadata = std::exchange(push_metadata_, false);
+ push_send_message = std::exchange(push_send_message_, false);
+ push_recv_message = std::exchange(push_recv_message_, false);
+ scheduled_push_ = false;
}
- Unref("initial_metadata_ready");
+ if (push_metadata) do_push(&metadata_);
+ if (push_send_message) do_push(&send_message_);
+ if (push_recv_message) do_push(&recv_message_);
+ Unref("push");
}
- void RecvTrailingMetadataReady(grpc_error_handle error) {
- GPR_ASSERT(error == absl::OkStatus());
- {
- MutexLock lock(mu());
- queued_trailing_metadata_ = true;
- if (grpc_call_trace.enabled()) {
- gpr_log(GPR_DEBUG,
- "%s[connected] RecvTrailingMetadataReady: "
- "queued_trailing_metadata_ "
- "set to true; active_ops: %s",
- trailing_metadata_waker_.ActivityDebugTag().c_str(),
- ActiveOpsString().c_str());
- }
- trailing_metadata_waker_.Wakeup();
- }
- Unref("trailing_metadata_ready");
- }
-
- void MetadataBatchDone(grpc_error_handle error) {
- GPR_ASSERT(error == absl::OkStatus());
- Unref("metadata_batch_done");
+ void StreamDestroyed() {
+ call_context_->RunInContext([this] {
+ auto* cc = call_context_;
+ this->~ClientStream();
+ cc->Unref("child_stream");
+ });
}
private:
+ struct Idle {};
+ struct Closed {};
+ struct SendMessageToTransport {};
+
enum class ServerInitialMetadataState : uint8_t {
// Initial metadata has not been received from the server.
kNotReceived,
// Initial metadata has been received from the server via the transport, but
- // has not yet been pushed onto the pipe to publish it up the call stack.
- kReceivedButNotPushed,
+ // has not yet been set on the latch to publish it up the call stack.
+ kReceivedButNotSet,
// Initial metadata has been received from the server via the transport and
- // has been pushed on the pipe to publish it up the call stack.
- // It's still in the pipe and has not been removed by the call at the top
- // yet.
- kPushing,
- // Initial metadata has been received from the server via the transport and
- // has been pushed on the pipe to publish it up the call stack AND removed
- // by the call at the top.
- kPushed,
+ // has been set on the latch to publish it up the call stack.
+ kSet,
};
- std::string ActiveOpsString() const override
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu()) {
+ class StreamDeleter {
+ public:
+ explicit StreamDeleter(ClientStream* impl) : impl_(impl) {}
+ void operator()(grpc_stream* stream) const {
+ if (stream == nullptr) return;
+ grpc_transport_destroy_stream(impl_->transport_, stream,
+ &impl_->stream_destroyed_);
+ }
+
+ private:
+ ClientStream* impl_;
+ };
+ using StreamPtr = std::unique_ptr;
+
+ void SchedulePush() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
+ if (std::exchange(scheduled_push_, true)) return;
+ IncrementRefCount("push");
+ ExecCtx::Run(DEBUG_LOCATION, &push_, absl::OkStatus());
+ }
+
+ std::string ActiveOpsString() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
std::vector ops;
- if (finished()) ops.push_back("FINISHED");
- // Outstanding Operations on Transport
- std::vector waiting;
- if (initial_metadata_waker_ != Waker()) {
- waiting.push_back("initial_metadata");
- }
- if (trailing_metadata_waker_ != Waker()) {
- waiting.push_back("trailing_metadata");
- }
- if (!waiting.empty()) {
- ops.push_back(absl::StrCat("waiting:", absl::StrJoin(waiting, ",")));
+ if (finished_) ops.push_back("FINISHED");
+ // Pushes
+ std::vector pushes;
+ if (push_metadata_) pushes.push_back("metadata");
+ if (push_send_message_) pushes.push_back("send_message");
+ if (push_recv_message_) pushes.push_back("recv_message");
+ if (!pushes.empty()) {
+ ops.push_back(
+ absl::StrCat(scheduled_push_ ? "push:" : "unscheduled-push:",
+ absl::StrJoin(pushes, ",")));
+ } else if (scheduled_push_) {
+ ops.push_back("push:nothing");
}
// Results from transport
std::vector queued;
if (server_initial_metadata_state_ ==
- ServerInitialMetadataState::kReceivedButNotPushed) {
+ ServerInitialMetadataState::kReceivedButNotSet) {
queued.push_back("initial_metadata");
}
if (queued_trailing_metadata_) queued.push_back("trailing_metadata");
@@ -864,31 +709,94 @@ class ClientStream : public ConnectedChannelStream {
return absl::StrJoin(ops, " ");
}
+ std::string SendMessageString() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
+ return Match(
+ send_message_state_, [](Idle) -> std::string { return "IDLE"; },
+ [](Closed) -> std::string { return "CLOSED"; },
+ [](const PipeReceiver::NextType&) -> std::string {
+ return "WAITING";
+ },
+ [](SendMessageToTransport) -> std::string { return "SENDING"; });
+ }
+
+ std::string RecvMessageString() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
+ return Match(
+ recv_message_state_, [](Idle) -> std::string { return "IDLE"; },
+ [](Closed) -> std::string { return "CLOSED"; },
+ [](const PendingReceiveMessage&) -> std::string { return "WAITING"; },
+ [](const absl::optional& message) -> std::string {
+ return absl::StrCat(
+ "READY:", message.has_value()
+ ? absl::StrCat((*message)->payload()->Length(), "b")
+ : "EOS");
+ },
+ [](const PipeSender::PushType&) -> std::string {
+ return "PUSHING";
+ });
+ }
+
+ Mutex mu_;
bool requested_metadata_ = false;
+ bool push_metadata_ ABSL_GUARDED_BY(mu_) = false;
+ bool push_send_message_ ABSL_GUARDED_BY(mu_) = false;
+ bool push_recv_message_ ABSL_GUARDED_BY(mu_) = false;
+ bool scheduled_push_ ABSL_GUARDED_BY(mu_) = false;
ServerInitialMetadataState server_initial_metadata_state_
- ABSL_GUARDED_BY(mu()) = ServerInitialMetadataState::kNotReceived;
- bool queued_trailing_metadata_ ABSL_GUARDED_BY(mu()) = false;
- Waker initial_metadata_waker_ ABSL_GUARDED_BY(mu());
- Waker trailing_metadata_waker_ ABSL_GUARDED_BY(mu());
- PipeSender* server_initial_metadata_pipe_;
+ ABSL_GUARDED_BY(mu_) = ServerInitialMetadataState::kNotReceived;
+ bool queued_trailing_metadata_ ABSL_GUARDED_BY(mu_) = false;
+ bool finished_ ABSL_GUARDED_BY(mu_) = false;
+ CallContext* const call_context_{GetContext()};
+ Waker initial_metadata_waker_ ABSL_GUARDED_BY(mu_);
+ Waker trailing_metadata_waker_ ABSL_GUARDED_BY(mu_);
+ Waker send_message_waker_ ABSL_GUARDED_BY(mu_);
+ Waker recv_message_waker_ ABSL_GUARDED_BY(mu_);
+ grpc_transport* const transport_;
+ grpc_stream_refcount stream_refcount_;
+ StreamPtr stream_;
+ Latch* server_initial_metadata_latch_;
PipeReceiver* client_to_server_messages_;
PipeSender* server_to_client_messages_;
+ MessageHandle message_to_send_ ABSL_GUARDED_BY(mu_);
+ absl::variant::NextType,
+ SendMessageToTransport>
+ send_message_state_ ABSL_GUARDED_BY(mu_);
+ struct PendingReceiveMessage {
+ absl::optional payload;
+ uint32_t flags;
+ bool received = false;
+ };
+ absl::variant::PushType>
+ recv_message_state_ ABSL_GUARDED_BY(mu_);
grpc_closure recv_initial_metadata_ready_ =
MakeMemberClosure(
this, DEBUG_LOCATION);
grpc_closure recv_trailing_metadata_ready_ =
MakeMemberClosure(
this, DEBUG_LOCATION);
+ grpc_closure push_ = MakeMemberClosure(
+ this, DEBUG_LOCATION);
ClientMetadataHandle client_initial_metadata_;
ClientMetadataHandle client_trailing_metadata_;
ServerMetadataHandle server_initial_metadata_;
ServerMetadataHandle server_trailing_metadata_;
- absl::optional::PushType>
- server_initial_metadata_push_promise_;
grpc_transport_stream_op_batch metadata_;
grpc_closure metadata_batch_done_ =
MakeMemberClosure(
this, DEBUG_LOCATION);
+ grpc_transport_stream_op_batch send_message_;
+ grpc_closure send_message_batch_done_ =
+ MakeMemberClosure(
+ this, DEBUG_LOCATION);
+ grpc_closure recv_message_batch_done_ =
+ MakeMemberClosure(
+ this, DEBUG_LOCATION);
+ grpc_transport_stream_op_batch recv_message_;
+ grpc_transport_stream_op_batch_payload batch_payload_{
+ GetContext()};
+ grpc_closure stream_destroyed_ =
+ MakeMemberClosure(
+ this, DEBUG_LOCATION);
};
class ClientConnectedCallPromise {
@@ -909,8 +817,7 @@ class ClientConnectedCallPromise {
}
static ArenaPromise Make(grpc_transport* transport,
- CallArgs call_args,
- NextPromiseFactory) {
+ CallArgs call_args) {
return ClientConnectedCallPromise(transport, std::move(call_args));
}
@@ -921,432 +828,8 @@ class ClientConnectedCallPromise {
};
#endif
-#ifdef GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_SERVER_CALL
-class ServerStream final : public ConnectedChannelStream {
- public:
- ServerStream(grpc_transport* transport,
- NextPromiseFactory next_promise_factory)
- : ConnectedChannelStream(transport) {
- SetStream(static_cast(
- GetContext()->Alloc(transport->vtable->sizeof_stream)));
- grpc_transport_init_stream(
- transport, stream(), stream_refcount(),
- GetContext()->server_call_context()->server_stream_data(),
- GetContext());
- grpc_transport_set_pops(transport, stream(),
- GetContext()->polling_entity());
-
- // Fetch initial metadata
- auto& gim = call_state_.emplace(this);
- gim.recv_initial_metadata_ready_waker =
- Activity::current()->MakeOwningWaker();
- memset(&gim.recv_initial_metadata, 0, sizeof(gim.recv_initial_metadata));
- gim.recv_initial_metadata.payload = batch_payload();
- gim.recv_initial_metadata.on_complete = nullptr;
- gim.recv_initial_metadata.recv_initial_metadata = true;
- gim.next_promise_factory = std::move(next_promise_factory);
- batch_payload()->recv_initial_metadata.recv_initial_metadata =
- gim.client_initial_metadata.get();
- batch_payload()->recv_initial_metadata.recv_initial_metadata_ready =
- &gim.recv_initial_metadata_ready;
- SchedulePush(&gim.recv_initial_metadata);
-
- // Fetch trailing metadata (to catch cancellations)
- auto& gtm =
- client_trailing_metadata_state_.emplace();
- gtm.recv_trailing_metadata_ready =
- MakeMemberClosure(this);
- memset(>m.recv_trailing_metadata, 0, sizeof(gtm.recv_trailing_metadata));
- gtm.recv_trailing_metadata.payload = batch_payload();
- gtm.recv_trailing_metadata.recv_trailing_metadata = true;
- batch_payload()->recv_trailing_metadata.recv_trailing_metadata =
- gtm.result.get();
- batch_payload()->recv_trailing_metadata.collect_stats =
- &GetContext()->call_stats()->transport_stream_stats;
- batch_payload()->recv_trailing_metadata.recv_trailing_metadata_ready =
- >m.recv_trailing_metadata_ready;
- SchedulePush(>m.recv_trailing_metadata);
- gtm.waker = Activity::current()->MakeOwningWaker();
- }
-
- Poll PollOnce() {
- MutexLock lock(mu());
-
- auto poll_send_initial_metadata = [this]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(
- mu()) {
- if (auto* promise =
- absl::get_if>(
- &server_initial_metadata_)) {
- auto r = (*promise)();
- if (auto* md = absl::get_if>(&r)) {
- if (grpc_call_trace.enabled()) {
- gpr_log(
- GPR_INFO, "%s[connected] got initial metadata %s",
- Activity::current()->DebugTag().c_str(),
- (md->has_value() ? (**md)->DebugString() : "")
- .c_str());
- }
- memset(&send_initial_metadata_, 0, sizeof(send_initial_metadata_));
- send_initial_metadata_.send_initial_metadata = true;
- send_initial_metadata_.payload = batch_payload();
- send_initial_metadata_.on_complete = &send_initial_metadata_done_;
- batch_payload()->send_initial_metadata.send_initial_metadata =
- server_initial_metadata_
- .emplace(std::move(**md))
- .get();
- batch_payload()->send_initial_metadata.peer_string = nullptr;
- SchedulePush(&send_initial_metadata_);
- return true;
- } else {
- return false;
- }
- } else {
- return true;
- }
- };
-
- if (grpc_call_trace.enabled()) {
- gpr_log(GPR_INFO, "%s[connected] PollConnectedChannel: %s",
- Activity::current()->DebugTag().c_str(),
- ActiveOpsString().c_str());
- }
-
- poll_send_initial_metadata();
-
- if (auto* p = absl::get_if(
- &client_trailing_metadata_state_)) {
- pipes_.client_to_server.sender.Close();
- if (!p->result.ok()) {
- // client cancelled, we should cancel too
- if (absl::holds_alternative(call_state_) ||
- absl::holds_alternative(call_state_) ||
- absl::holds_alternative(call_state_)) {
- if (!absl::holds_alternative(
- server_initial_metadata_)) {
- // pretend we've sent initial metadata to stop that op from
- // progressing if it's stuck somewhere above us in the stack
- server_initial_metadata_.emplace();
- }
- // cancel the call - this status will be returned to the server bottom
- // promise
- call_state_.emplace(
- Complete{ServerMetadataFromStatus(p->result)});
- }
- }
- }
-
- if (auto* p = absl::get_if(&call_state_)) {
- incoming_messages_ = &pipes_.client_to_server.sender;
- auto promise = p->next_promise_factory(CallArgs{
- std::move(p->client_initial_metadata),
- &pipes_.server_initial_metadata.sender,
- &pipes_.client_to_server.receiver, &pipes_.server_to_client.sender});
- call_state_.emplace(
- MessageLoop{&pipes_.server_to_client.receiver, std::move(promise)});
- server_initial_metadata_
- .emplace>(
- pipes_.server_initial_metadata.receiver.Next());
- }
- if (incoming_messages_ != nullptr) {
- PollRecvMessage(incoming_messages_);
- }
- if (auto* p = absl::get_if(&call_state_)) {
- if (absl::holds_alternative(
- server_initial_metadata_)) {
- PollSendMessage(p->outgoing_messages, nullptr);
- }
- auto poll = p->promise();
- if (auto* r = absl::get_if(&poll)) {
- if (grpc_call_trace.enabled()) {
- gpr_log(GPR_INFO, "%s[connected] got trailing metadata %s; %s",
- Activity::current()->DebugTag().c_str(),
- (*r)->DebugString().c_str(), ActiveOpsString().c_str());
- }
- auto& completing = call_state_.emplace();
- completing.server_trailing_metadata = std::move(*r);
- completing.on_complete =
- MakeMemberClosure(this);
- completing.waker = Activity::current()->MakeOwningWaker();
- auto& op = completing.send_trailing_metadata;
- memset(&op, 0, sizeof(op));
- op.payload = batch_payload();
- op.on_complete = &completing.on_complete;
- // If we've gotten initial server metadata, we can send trailing
- // metadata.
- // Otherwise we need to cancel the call.
- // There could be an unlucky ordering, so we poll here to make sure.
- if (poll_send_initial_metadata()) {
- op.send_trailing_metadata = true;
- batch_payload()->send_trailing_metadata.send_trailing_metadata =
- completing.server_trailing_metadata.get();
- batch_payload()->send_trailing_metadata.sent = &completing.sent;
- } else {
- op.cancel_stream = true;
- const auto status_code =
- completing.server_trailing_metadata->get(GrpcStatusMetadata())
- .value_or(GRPC_STATUS_UNKNOWN);
- batch_payload()->cancel_stream.cancel_error = grpc_error_set_int(
- absl::Status(static_cast(status_code),
- completing.server_trailing_metadata
- ->GetOrCreatePointer(GrpcMessageMetadata())
- ->as_string_view()),
- StatusIntProperty::kRpcStatus, status_code);
- }
- SchedulePush(&op);
- }
- }
- if (auto* p = absl::get_if(&call_state_)) {
- set_finished();
- return std::move(p->result);
- }
- return Pending{};
- }
-
- private:
- // Call state: we've asked the transport for initial metadata and are
- // waiting for it before proceeding.
- struct GettingInitialMetadata {
- explicit GettingInitialMetadata(ServerStream* stream)
- : recv_initial_metadata_ready(
- MakeMemberClosure(
- stream)) {}
- // The batch we're using to get initial metadata.
- grpc_transport_stream_op_batch recv_initial_metadata;
- // Waker to re-enter the activity once the transport returns.
- Waker recv_initial_metadata_ready_waker;
- // Initial metadata storage for the transport.
- ClientMetadataHandle client_initial_metadata =
- GetContext()->MakePooled(GetContext());
- // Closure for the transport to call when it's ready.
- grpc_closure recv_initial_metadata_ready;
- // Next promise factory to use once we have initial metadata.
- NextPromiseFactory next_promise_factory;
- };
-
- // Call state: transport has returned initial metadata, we're waiting to
- // re-enter the activity to process it.
- struct GotInitialMetadata {
- ClientMetadataHandle client_initial_metadata;
- NextPromiseFactory next_promise_factory;
- };
-
- // Call state: we're sending/receiving messages and processing the filter
- // stack.
- struct MessageLoop {
- PipeReceiver* outgoing_messages;
- ArenaPromise promise;
- };
-
- // Call state: promise stack has returned trailing metadata, we're sending it
- // to the transport to communicate.
- struct Completing {
- ServerMetadataHandle server_trailing_metadata;
- grpc_transport_stream_op_batch send_trailing_metadata;
- grpc_closure on_complete;
- bool sent = false;
- Waker waker;
- };
-
- // Call state: server metadata has been communicated to the transport and sent
- // to the client.
- // The metadata will be returned down to the server call to tick the
- // cancellation bit or not on the originating batch.
- struct Complete {
- ServerMetadataHandle result;
- };
-
- // Trailing metadata state: we've asked the transport for trailing metadata
- // and are waiting for it before proceeding.
- struct WaitingForTrailingMetadata {
- ClientMetadataHandle result =
- GetContext()->MakePooled(GetContext());
- grpc_transport_stream_op_batch recv_trailing_metadata;
- grpc_closure recv_trailing_metadata_ready;
- Waker waker;
- };
-
- // We've received trailing metadata from the transport - which indicates reads
- // are closed.
- // We convert to an absl::Status here and use that to drive a decision to
- // cancel the call (on error) or not.
- struct GotClientHalfClose {
- absl::Status result;
- };
-
- void RecvInitialMetadataReady(absl::Status status) {
- MutexLock lock(mu());
- auto& getting = absl::get(call_state_);
- auto waker = std::move(getting.recv_initial_metadata_ready_waker);
- if (grpc_call_trace.enabled()) {
- gpr_log(GPR_DEBUG, "%sGOT INITIAL METADATA: err=%s %s",
- waker.ActivityDebugTag().c_str(), status.ToString().c_str(),
- getting.client_initial_metadata->DebugString().c_str());
- }
- GotInitialMetadata got{std::move(getting.client_initial_metadata),
- std::move(getting.next_promise_factory)};
- call_state_.emplace(std::move(got));
- waker.Wakeup();
- }
-
- void SendTrailingMetadataDone(absl::Status result) {
- MutexLock lock(mu());
- auto& completing = absl::get(call_state_);
- auto md = std::move(completing.server_trailing_metadata);
- auto waker = std::move(completing.waker);
- if (grpc_call_trace.enabled()) {
- gpr_log(GPR_DEBUG, "%sSEND TRAILING METADATA DONE: err=%s sent=%s %s",
- waker.ActivityDebugTag().c_str(), result.ToString().c_str(),
- completing.sent ? "true" : "false", md->DebugString().c_str());
- }
- md->Set(GrpcStatusFromWire(), completing.sent);
- if (!result.ok()) {
- md->Clear();
- md->Set(GrpcStatusMetadata(),
- static_cast(result.code()));
- md->Set(GrpcMessageMetadata(), Slice::FromCopiedString(result.message()));
- md->Set(GrpcStatusFromWire(), false);
- }
- call_state_.emplace(Complete{std::move(md)});
- waker.Wakeup();
- }
-
- std::string ActiveOpsString() const override
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu()) {
- std::vector ops;
- ops.push_back(absl::StrCat(
- "call_state:",
- Match(
- call_state_,
- [](const absl::monostate&) { return "absl::monostate"; },
- [](const GettingInitialMetadata&) { return "GETTING"; },
- [](const GotInitialMetadata&) { return "GOT"; },
- [](const MessageLoop&) { return "RUNNING"; },
- [](const Completing&) { return "COMPLETING"; },
- [](const Complete&) { return "COMPLETE"; })));
- ops.push_back(
- absl::StrCat("client_trailing_metadata_state:",
- Match(
- client_trailing_metadata_state_,
- [](const absl::monostate&) -> std::string {
- return "absl::monostate";
- },
- [](const WaitingForTrailingMetadata&) -> std::string {
- return "WAITING";
- },
- [](const GotClientHalfClose& got) -> std::string {
- return absl::StrCat("GOT:", got.result.ToString());
- })));
- // Send initial metadata
- ops.push_back(absl::StrCat(
- "server_initial_metadata_state:",
- Match(
- server_initial_metadata_,
- [](const absl::monostate&) { return "absl::monostate"; },
- [](const PipeReceiverNextType&) {
- return "WAITING";
- },
- [](const ServerMetadataHandle&) { return "GOT"; })));
- // Send message
- std::string send_message_state = SendMessageString();
- if (send_message_state != "WAITING") {
- ops.push_back(absl::StrCat("send_message:", send_message_state));
- }
- // Receive message
- std::string recv_message_state = RecvMessageString();
- if (recv_message_state != "IDLE") {
- ops.push_back(absl::StrCat("recv_message:", recv_message_state));
- }
- return absl::StrJoin(ops, " ");
- }
-
- void SendInitialMetadataDone() {}
-
- void RecvTrailingMetadataReady(absl::Status error) {
- MutexLock lock(mu());
- auto& state =
- absl::get(client_trailing_metadata_state_);
- if (grpc_call_trace.enabled()) {
- gpr_log(GPR_INFO,
- "%sRecvTrailingMetadataReady: error:%s metadata:%s state:%s",
- state.waker.ActivityDebugTag().c_str(), error.ToString().c_str(),
- state.result->DebugString().c_str(), ActiveOpsString().c_str());
- }
- auto waker = std::move(state.waker);
- ServerMetadataHandle result = std::move(state.result);
- if (error.ok()) {
- auto* message = result->get_pointer(GrpcMessageMetadata());
- error = absl::Status(
- static_cast(
- result->get(GrpcStatusMetadata()).value_or(GRPC_STATUS_UNKNOWN)),
- message == nullptr ? "" : message->as_string_view());
- }
- client_trailing_metadata_state_.emplace(
- GotClientHalfClose{error});
- waker.Wakeup();
- }
-
- struct Pipes {
- Pipe server_to_client;
- Pipe client_to_server;
- Pipe server_initial_metadata;
- };
-
- using CallState =
- absl::variant;
- CallState call_state_ ABSL_GUARDED_BY(mu()) = absl::monostate{};
- using ClientTrailingMetadataState =
- absl::variant;
- ClientTrailingMetadataState client_trailing_metadata_state_
- ABSL_GUARDED_BY(mu()) = absl::monostate{};
- absl::variant,
- ServerMetadataHandle>
- ABSL_GUARDED_BY(mu()) server_initial_metadata_ = absl::monostate{};
- PipeSender* incoming_messages_ = nullptr;
- grpc_transport_stream_op_batch send_initial_metadata_;
- grpc_closure send_initial_metadata_done_ =
- MakeMemberClosure(
- this);
- Pipes pipes_ ABSL_GUARDED_BY(mu());
-};
-
-class ServerConnectedCallPromise {
- public:
- ServerConnectedCallPromise(grpc_transport* transport,
- NextPromiseFactory next_promise_factory)
- : impl_(GetContext