[Filter Fusion] Add support for other filter methods (#38784)

Includes support for OnFinalize, OnClientToServerHalfClose, OnServerTrailingMetadata, StartTransportOp and GetChannelInfo.

Closes #38784

COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/38784 from Vignesh2208:fusion-update-next 8619e193ef
PiperOrigin-RevId: 729252149
pull/30525/merge
Vignesh Babu 7 days ago committed by Copybara-Service
parent 75dc0511e8
commit 15bfe370d4
  1. 195
      CMakeLists.txt
  2. 418
      build_autogenerated.yaml
  3. 2
      src/core/BUILD
  4. 143
      src/core/call/filter_fusion.h
  5. 2
      test/core/call/BUILD
  6. 175
      test/core/call/filter_fusion_test.cc

195
CMakeLists.txt generated

@ -15517,49 +15517,240 @@ endif()
if(gRPC_BUILD_TESTS)
add_executable(filter_fusion_test
src/core/channelz/channel_trace.cc
src/core/channelz/channelz.cc
src/core/channelz/channelz_registry.cc
src/core/config/core_configuration.cc
src/core/ext/upb-gen/google/protobuf/any.upb_minitable.c
src/core/ext/upb-gen/google/rpc/status.upb_minitable.c
src/core/ext/upb-gen/src/proto/grpc/gcp/altscontext.upb_minitable.c
src/core/ext/upb-gen/src/proto/grpc/gcp/handshaker.upb_minitable.c
src/core/ext/upb-gen/src/proto/grpc/gcp/transport_security_common.upb_minitable.c
src/core/filter/blackboard.cc
src/core/handshaker/handshaker_registry.cc
src/core/handshaker/proxy_mapper_registry.cc
src/core/lib/address_utils/parse_address.cc
src/core/lib/address_utils/sockaddr_utils.cc
src/core/lib/channel/channel_args.cc
src/core/lib/channel/channel_args_preconditioning.cc
src/core/lib/channel/channel_stack.cc
src/core/lib/channel/channel_stack_builder.cc
src/core/lib/channel/channel_stack_builder_impl.cc
src/core/lib/channel/connected_channel.cc
src/core/lib/channel/promise_based_filter.cc
src/core/lib/channel/status_util.cc
src/core/lib/compression/compression.cc
src/core/lib/compression/compression_internal.cc
src/core/lib/compression/message_compress.cc
src/core/lib/debug/trace.cc
src/core/lib/debug/trace_flags.cc
src/core/lib/event_engine/ares_resolver.cc
src/core/lib/event_engine/cf_engine/cf_engine.cc
src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc
src/core/lib/event_engine/cf_engine/dns_service_resolver.cc
src/core/lib/event_engine/channel_args_endpoint_config.cc
src/core/lib/event_engine/default_event_engine.cc
src/core/lib/event_engine/default_event_engine_factory.cc
src/core/lib/event_engine/event_engine.cc
src/core/lib/event_engine/forkable.cc
src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc
src/core/lib/event_engine/posix_engine/ev_poll_posix.cc
src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc
src/core/lib/event_engine/posix_engine/internal_errqueue.cc
src/core/lib/event_engine/posix_engine/lockfree_event.cc
src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc
src/core/lib/event_engine/posix_engine/posix_endpoint.cc
src/core/lib/event_engine/posix_engine/posix_engine.cc
src/core/lib/event_engine/posix_engine/posix_engine_listener.cc
src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc
src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc
src/core/lib/event_engine/posix_engine/timer.cc
src/core/lib/event_engine/posix_engine/timer_heap.cc
src/core/lib/event_engine/posix_engine/timer_manager.cc
src/core/lib/event_engine/posix_engine/traced_buffer_list.cc
src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc
src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc
src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc
src/core/lib/event_engine/resolved_address.cc
src/core/lib/event_engine/shim.cc
src/core/lib/event_engine/slice.cc
src/core/lib/event_engine/slice_buffer.cc
src/core/lib/event_engine/tcp_socket_utils.cc
src/core/lib/event_engine/thread_pool/thread_count.cc
src/core/lib/event_engine/thread_pool/thread_pool_factory.cc
src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc
src/core/lib/event_engine/thready_event_engine/thready_event_engine.cc
src/core/lib/event_engine/time_util.cc
src/core/lib/event_engine/utils.cc
src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc
src/core/lib/event_engine/windows/iocp.cc
src/core/lib/event_engine/windows/native_windows_dns_resolver.cc
src/core/lib/event_engine/windows/win_socket.cc
src/core/lib/event_engine/windows/windows_endpoint.cc
src/core/lib/event_engine/windows/windows_engine.cc
src/core/lib/event_engine/windows/windows_listener.cc
src/core/lib/event_engine/work_queue/basic_work_queue.cc
src/core/lib/experiments/config.cc
src/core/lib/experiments/experiments.cc
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
src/core/lib/iomgr/endpoint_cfstream.cc
src/core/lib/iomgr/endpoint_pair_posix.cc
src/core/lib/iomgr/endpoint_pair_windows.cc
src/core/lib/iomgr/error.cc
src/core/lib/iomgr/error_cfstream.cc
src/core/lib/iomgr/ev_apple.cc
src/core/lib/iomgr/ev_epoll1_linux.cc
src/core/lib/iomgr/ev_poll_posix.cc
src/core/lib/iomgr/ev_posix.cc
src/core/lib/iomgr/event_engine_shims/closure.cc
src/core/lib/iomgr/event_engine_shims/endpoint.cc
src/core/lib/iomgr/event_engine_shims/tcp_client.cc
src/core/lib/iomgr/exec_ctx.cc
src/core/lib/iomgr/executor.cc
src/core/lib/iomgr/fork_posix.cc
src/core/lib/iomgr/fork_windows.cc
src/core/lib/iomgr/internal_errqueue.cc
src/core/lib/iomgr/iocp_windows.cc
src/core/lib/iomgr/iomgr.cc
src/core/lib/iomgr/iomgr_internal.cc
src/core/lib/iomgr/iomgr_posix.cc
src/core/lib/iomgr/iomgr_posix_cfstream.cc
src/core/lib/iomgr/iomgr_windows.cc
src/core/lib/iomgr/lockfree_event.cc
src/core/lib/iomgr/polling_entity.cc
src/core/lib/iomgr/pollset.cc
src/core/lib/iomgr/pollset_set.cc
src/core/lib/iomgr/pollset_set_windows.cc
src/core/lib/iomgr/pollset_windows.cc
src/core/lib/iomgr/resolve_address.cc
src/core/lib/iomgr/resolve_address_posix.cc
src/core/lib/iomgr/resolve_address_windows.cc
src/core/lib/iomgr/sockaddr_utils_posix.cc
src/core/lib/iomgr/socket_factory_posix.cc
src/core/lib/iomgr/socket_mutator.cc
src/core/lib/iomgr/socket_utils_common_posix.cc
src/core/lib/iomgr/socket_utils_linux.cc
src/core/lib/iomgr/socket_utils_posix.cc
src/core/lib/iomgr/socket_utils_windows.cc
src/core/lib/iomgr/socket_windows.cc
src/core/lib/iomgr/systemd_utils.cc
src/core/lib/iomgr/tcp_client.cc
src/core/lib/iomgr/tcp_client_cfstream.cc
src/core/lib/iomgr/tcp_client_posix.cc
src/core/lib/iomgr/tcp_client_windows.cc
src/core/lib/iomgr/tcp_posix.cc
src/core/lib/iomgr/tcp_server.cc
src/core/lib/iomgr/tcp_server_posix.cc
src/core/lib/iomgr/tcp_server_utils_posix_common.cc
src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc
src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc
src/core/lib/iomgr/tcp_server_windows.cc
src/core/lib/iomgr/tcp_windows.cc
src/core/lib/iomgr/timer.cc
src/core/lib/iomgr/timer_generic.cc
src/core/lib/iomgr/timer_heap.cc
src/core/lib/iomgr/timer_manager.cc
src/core/lib/iomgr/unix_sockets_posix.cc
src/core/lib/iomgr/unix_sockets_posix_noop.cc
src/core/lib/iomgr/vsock.cc
src/core/lib/iomgr/wakeup_fd_eventfd.cc
src/core/lib/iomgr/wakeup_fd_nospecial.cc
src/core/lib/iomgr/wakeup_fd_pipe.cc
src/core/lib/iomgr/wakeup_fd_posix.cc
src/core/lib/promise/activity.cc
src/core/lib/promise/party.cc
src/core/lib/resource_quota/api.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/security/certificate_provider/certificate_provider_registry.cc
src/core/lib/security/credentials/alts/check_gcp_environment.cc
src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc
src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc
src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc
src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc
src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc
src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc
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_string_helpers.cc
src/core/lib/surface/byte_buffer.cc
src/core/lib/surface/byte_buffer_reader.cc
src/core/lib/surface/call.cc
src/core/lib/surface/call_details.cc
src/core/lib/surface/call_log_batch.cc
src/core/lib/surface/call_utils.cc
src/core/lib/surface/channel.cc
src/core/lib/surface/channel_init.cc
src/core/lib/surface/channel_stack_type.cc
src/core/lib/surface/client_call.cc
src/core/lib/surface/completion_queue.cc
src/core/lib/surface/completion_queue_factory.cc
src/core/lib/surface/event_string.cc
src/core/lib/surface/filter_stack_call.cc
src/core/lib/surface/init_internally.cc
src/core/lib/surface/lame_client.cc
src/core/lib/surface/metadata_array.cc
src/core/lib/surface/server_call.cc
src/core/lib/surface/validate_metadata.cc
src/core/lib/surface/version.cc
src/core/lib/transport/call_arena_allocator.cc
src/core/lib/transport/call_filters.cc
src/core/lib/transport/call_final_info.cc
src/core/lib/transport/call_spine.cc
src/core/lib/transport/call_state.cc
src/core/lib/transport/connectivity_state.cc
src/core/lib/transport/error_utils.cc
src/core/lib/transport/interception_chain.cc
src/core/lib/transport/message.cc
src/core/lib/transport/metadata.cc
src/core/lib/transport/metadata_batch.cc
src/core/lib/transport/parsed_metadata.cc
src/core/lib/transport/status_conversion.cc
src/core/lib/transport/timeout_encoding.cc
src/core/lib/transport/transport.cc
src/core/lib/transport/transport_op_string.cc
src/core/load_balancing/lb_policy.cc
src/core/load_balancing/lb_policy_registry.cc
src/core/resolver/endpoint_addresses.cc
src/core/resolver/resolver.cc
src/core/resolver/resolver_registry.cc
src/core/service_config/service_config_parser.cc
src/core/telemetry/call_tracer.cc
src/core/telemetry/histogram_view.cc
src/core/telemetry/metrics.cc
src/core/telemetry/stats.cc
src/core/telemetry/stats_data.cc
src/core/tsi/alts/handshaker/transport_security_common_api.cc
src/core/util/backoff.cc
src/core/util/dump_args.cc
src/core/util/event_log.cc
src/core/util/gethostname_fallback.cc
src/core/util/gethostname_host_name_max.cc
src/core/util/gethostname_sysconf.cc
src/core/util/glob.cc
src/core/util/grpc_if_nametoindex_posix.cc
src/core/util/grpc_if_nametoindex_unsupported.cc
src/core/util/json/json_writer.cc
src/core/util/latent_see.cc
src/core/util/load_file.cc
src/core/util/per_cpu.cc
src/core/util/ref_counted_string.cc
src/core/util/status_helper.cc
src/core/util/time.cc
src/core/util/time_averaged_stats.cc
src/core/util/uri.cc
src/core/util/validation_errors.cc
src/core/util/work_serializer.cc
test/core/call/filter_fusion_test.cc
)
if(WIN32 AND MSVC)
@ -15595,6 +15786,7 @@ target_link_libraries(filter_fusion_test
gtest
upb_mini_descriptor_lib
upb_wire_lib
${_gRPC_ZLIB_LIBRARIES}
absl::config
absl::no_destructor
absl::flat_hash_map
@ -15603,8 +15795,11 @@ target_link_libraries(filter_fusion_test
absl::hash
absl::type_traits
absl::statusor
absl::span
absl::utility
${_gRPC_CARES_LIBRARIES}
gpr
${_gRPC_ADDRESS_SORTING_LIBRARIES}
)

@ -10766,26 +10766,178 @@ targets:
language: c++
headers:
- src/core/call/filter_fusion.h
- src/core/channelz/channel_trace.h
- src/core/channelz/channelz.h
- src/core/channelz/channelz_registry.h
- src/core/config/core_configuration.h
- src/core/ext/upb-gen/google/protobuf/any.upb.h
- src/core/ext/upb-gen/google/protobuf/any.upb_minitable.h
- src/core/ext/upb-gen/google/rpc/status.upb.h
- src/core/ext/upb-gen/google/rpc/status.upb_minitable.h
- src/core/ext/upb-gen/src/proto/grpc/gcp/altscontext.upb.h
- src/core/ext/upb-gen/src/proto/grpc/gcp/altscontext.upb_minitable.h
- src/core/ext/upb-gen/src/proto/grpc/gcp/handshaker.upb.h
- src/core/ext/upb-gen/src/proto/grpc/gcp/handshaker.upb_minitable.h
- src/core/ext/upb-gen/src/proto/grpc/gcp/transport_security_common.upb.h
- src/core/ext/upb-gen/src/proto/grpc/gcp/transport_security_common.upb_minitable.h
- src/core/filter/blackboard.h
- src/core/filter/filter_args.h
- src/core/handshaker/handshaker_factory.h
- src/core/handshaker/handshaker_registry.h
- src/core/handshaker/proxy_mapper.h
- src/core/handshaker/proxy_mapper_registry.h
- src/core/lib/address_utils/parse_address.h
- src/core/lib/address_utils/sockaddr_utils.h
- src/core/lib/channel/call_finalization.h
- src/core/lib/channel/channel_args.h
- src/core/lib/channel/channel_args_preconditioning.h
- src/core/lib/channel/channel_fwd.h
- src/core/lib/channel/channel_stack.h
- src/core/lib/channel/channel_stack_builder.h
- src/core/lib/channel/channel_stack_builder_impl.h
- src/core/lib/channel/connected_channel.h
- src/core/lib/channel/promise_based_filter.h
- src/core/lib/channel/status_util.h
- src/core/lib/compression/compression_internal.h
- src/core/lib/compression/message_compress.h
- src/core/lib/debug/trace.h
- src/core/lib/debug/trace_flags.h
- src/core/lib/debug/trace_impl.h
- src/core/lib/event_engine/ares_resolver.h
- src/core/lib/event_engine/cf_engine/cf_engine.h
- src/core/lib/event_engine/cf_engine/cfstream_endpoint.h
- src/core/lib/event_engine/cf_engine/cftype_unique_ref.h
- src/core/lib/event_engine/cf_engine/dns_service_resolver.h
- src/core/lib/event_engine/channel_args_endpoint_config.h
- src/core/lib/event_engine/common_closures.h
- src/core/lib/event_engine/default_event_engine.h
- src/core/lib/event_engine/default_event_engine_factory.h
- src/core/lib/event_engine/event_engine_context.h
- src/core/lib/event_engine/extensions/can_track_errors.h
- src/core/lib/event_engine/extensions/chaotic_good_extension.h
- src/core/lib/event_engine/extensions/supports_fd.h
- src/core/lib/event_engine/extensions/tcp_trace.h
- src/core/lib/event_engine/forkable.h
- src/core/lib/event_engine/grpc_polled_fd.h
- src/core/lib/event_engine/handle_containers.h
- src/core/lib/event_engine/memory_allocator_factory.h
- src/core/lib/event_engine/nameser.h
- src/core/lib/event_engine/poller.h
- src/core/lib/event_engine/posix.h
- src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h
- src/core/lib/event_engine/posix_engine/ev_poll_posix.h
- src/core/lib/event_engine/posix_engine/event_poller.h
- src/core/lib/event_engine/posix_engine/event_poller_posix_default.h
- src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h
- src/core/lib/event_engine/posix_engine/internal_errqueue.h
- src/core/lib/event_engine/posix_engine/lockfree_event.h
- src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h
- src/core/lib/event_engine/posix_engine/posix_endpoint.h
- src/core/lib/event_engine/posix_engine/posix_engine.h
- src/core/lib/event_engine/posix_engine/posix_engine_closure.h
- src/core/lib/event_engine/posix_engine/posix_engine_listener.h
- src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h
- src/core/lib/event_engine/posix_engine/tcp_socket_utils.h
- src/core/lib/event_engine/posix_engine/timer.h
- src/core/lib/event_engine/posix_engine/timer_heap.h
- src/core/lib/event_engine/posix_engine/timer_manager.h
- src/core/lib/event_engine/posix_engine/traced_buffer_list.h
- src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h
- src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h
- src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h
- src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h
- src/core/lib/event_engine/query_extensions.h
- src/core/lib/event_engine/ref_counted_dns_resolver_interface.h
- src/core/lib/event_engine/resolved_address_internal.h
- src/core/lib/event_engine/shim.h
- src/core/lib/event_engine/tcp_socket_utils.h
- src/core/lib/event_engine/thread_pool/thread_count.h
- src/core/lib/event_engine/thread_pool/thread_pool.h
- src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h
- src/core/lib/event_engine/thready_event_engine/thready_event_engine.h
- src/core/lib/event_engine/time_util.h
- src/core/lib/event_engine/utils.h
- src/core/lib/event_engine/windows/grpc_polled_fd_windows.h
- src/core/lib/event_engine/windows/iocp.h
- src/core/lib/event_engine/windows/native_windows_dns_resolver.h
- src/core/lib/event_engine/windows/win_socket.h
- src/core/lib/event_engine/windows/windows_endpoint.h
- src/core/lib/event_engine/windows/windows_engine.h
- src/core/lib/event_engine/windows/windows_listener.h
- src/core/lib/event_engine/work_queue/basic_work_queue.h
- src/core/lib/event_engine/work_queue/work_queue.h
- src/core/lib/experiments/config.h
- src/core/lib/experiments/experiments.h
- src/core/lib/iomgr/block_annotate.h
- src/core/lib/iomgr/buffer_list.h
- src/core/lib/iomgr/call_combiner.h
- src/core/lib/iomgr/cfstream_handle.h
- src/core/lib/iomgr/closure.h
- src/core/lib/iomgr/combiner.h
- src/core/lib/iomgr/dynamic_annotations.h
- src/core/lib/iomgr/endpoint.h
- src/core/lib/iomgr/endpoint_cfstream.h
- src/core/lib/iomgr/endpoint_pair.h
- src/core/lib/iomgr/error.h
- src/core/lib/iomgr/error_cfstream.h
- src/core/lib/iomgr/ev_apple.h
- src/core/lib/iomgr/ev_epoll1_linux.h
- src/core/lib/iomgr/ev_poll_posix.h
- src/core/lib/iomgr/ev_posix.h
- src/core/lib/iomgr/event_engine_shims/closure.h
- src/core/lib/iomgr/event_engine_shims/endpoint.h
- src/core/lib/iomgr/event_engine_shims/tcp_client.h
- src/core/lib/iomgr/exec_ctx.h
- src/core/lib/iomgr/executor.h
- src/core/lib/iomgr/internal_errqueue.h
- src/core/lib/iomgr/iocp_windows.h
- src/core/lib/iomgr/iomgr.h
- src/core/lib/iomgr/iomgr_fwd.h
- src/core/lib/iomgr/iomgr_internal.h
- src/core/lib/iomgr/lockfree_event.h
- src/core/lib/iomgr/nameser.h
- src/core/lib/iomgr/polling_entity.h
- src/core/lib/iomgr/pollset.h
- src/core/lib/iomgr/pollset_set.h
- src/core/lib/iomgr/pollset_set_windows.h
- src/core/lib/iomgr/pollset_windows.h
- src/core/lib/iomgr/port.h
- src/core/lib/iomgr/python_util.h
- src/core/lib/iomgr/resolve_address.h
- src/core/lib/iomgr/resolve_address_impl.h
- src/core/lib/iomgr/resolve_address_posix.h
- src/core/lib/iomgr/resolve_address_windows.h
- src/core/lib/iomgr/resolved_address.h
- src/core/lib/iomgr/sockaddr.h
- src/core/lib/iomgr/sockaddr_posix.h
- src/core/lib/iomgr/sockaddr_windows.h
- src/core/lib/iomgr/socket_factory_posix.h
- src/core/lib/iomgr/socket_mutator.h
- src/core/lib/iomgr/socket_utils.h
- src/core/lib/iomgr/socket_utils_posix.h
- src/core/lib/iomgr/socket_windows.h
- src/core/lib/iomgr/systemd_utils.h
- src/core/lib/iomgr/tcp_client.h
- src/core/lib/iomgr/tcp_client_posix.h
- src/core/lib/iomgr/tcp_posix.h
- src/core/lib/iomgr/tcp_server.h
- src/core/lib/iomgr/tcp_server_utils_posix.h
- src/core/lib/iomgr/tcp_windows.h
- src/core/lib/iomgr/timer.h
- src/core/lib/iomgr/timer_generic.h
- src/core/lib/iomgr/timer_heap.h
- src/core/lib/iomgr/timer_manager.h
- src/core/lib/iomgr/unix_sockets_posix.h
- src/core/lib/iomgr/vsock.h
- src/core/lib/iomgr/wakeup_fd_pipe.h
- src/core/lib/iomgr/wakeup_fd_posix.h
- src/core/lib/promise/activity.h
- src/core/lib/promise/all_ok.h
- src/core/lib/promise/arena_promise.h
- src/core/lib/promise/cancel_callback.h
- src/core/lib/promise/context.h
- src/core/lib/promise/detail/basic_seq.h
- src/core/lib/promise/detail/join_state.h
- src/core/lib/promise/detail/promise_factory.h
- src/core/lib/promise/detail/promise_like.h
- src/core/lib/promise/detail/seq_state.h
@ -10793,33 +10945,63 @@ targets:
- 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/latch.h
- src/core/lib/promise/loop.h
- src/core/lib/promise/map.h
- src/core/lib/promise/party.h
- src/core/lib/promise/pipe.h
- src/core/lib/promise/poll.h
- src/core/lib/promise/prioritized_race.h
- src/core/lib/promise/promise.h
- src/core/lib/promise/race.h
- src/core/lib/promise/seq.h
- src/core/lib/promise/status_flag.h
- src/core/lib/promise/try_seq.h
- src/core/lib/resource_quota/api.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/security/certificate_provider/certificate_provider_factory.h
- src/core/lib/security/certificate_provider/certificate_provider_registry.h
- src/core/lib/security/credentials/alts/check_gcp_environment.h
- src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h
- src/core/lib/security/credentials/channel_creds_registry.h
- src/core/lib/slice/percent_encoding.h
- src/core/lib/slice/slice.h
- src/core/lib/slice/slice_buffer.h
- src/core/lib/slice/slice_internal.h
- src/core/lib/slice/slice_refcount.h
- src/core/lib/slice/slice_string_helpers.h
- src/core/lib/surface/call.h
- src/core/lib/surface/call_test_only.h
- src/core/lib/surface/call_utils.h
- src/core/lib/surface/channel.h
- src/core/lib/surface/channel_init.h
- src/core/lib/surface/channel_stack_type.h
- src/core/lib/surface/client_call.h
- src/core/lib/surface/completion_queue.h
- src/core/lib/surface/completion_queue_factory.h
- src/core/lib/surface/event_string.h
- src/core/lib/surface/filter_stack_call.h
- src/core/lib/surface/init.h
- src/core/lib/surface/init_internally.h
- src/core/lib/surface/lame_client.h
- src/core/lib/surface/server_call.h
- src/core/lib/surface/validate_metadata.h
- src/core/lib/transport/call_arena_allocator.h
- src/core/lib/transport/call_destination.h
- src/core/lib/transport/call_filters.h
- src/core/lib/transport/call_final_info.h
- src/core/lib/transport/call_spine.h
- src/core/lib/transport/call_state.h
- src/core/lib/transport/connectivity_state.h
- src/core/lib/transport/custom_metadata.h
- src/core/lib/transport/error_utils.h
- src/core/lib/transport/http2_errors.h
- src/core/lib/transport/interception_chain.h
- src/core/lib/transport/message.h
- src/core/lib/transport/metadata.h
- src/core/lib/transport/metadata_batch.h
@ -10828,81 +11010,314 @@ targets:
- src/core/lib/transport/simple_slice_based_metadata.h
- src/core/lib/transport/status_conversion.h
- src/core/lib/transport/timeout_encoding.h
- src/core/lib/transport/transport.h
- src/core/lib/transport/transport_fwd.h
- src/core/load_balancing/backend_metric_data.h
- src/core/load_balancing/lb_policy.h
- src/core/load_balancing/lb_policy_factory.h
- src/core/load_balancing/lb_policy_registry.h
- src/core/load_balancing/subchannel_interface.h
- src/core/resolver/endpoint_addresses.h
- src/core/resolver/resolver.h
- src/core/resolver/resolver_factory.h
- src/core/resolver/resolver_registry.h
- src/core/resolver/server_address.h
- src/core/server/server_interface.h
- src/core/service_config/service_config.h
- src/core/service_config/service_config_call_data.h
- src/core/service_config/service_config_parser.h
- src/core/telemetry/call_tracer.h
- src/core/telemetry/histogram_view.h
- src/core/telemetry/metrics.h
- src/core/telemetry/stats.h
- src/core/telemetry/stats_data.h
- src/core/telemetry/tcp_tracer.h
- src/core/tsi/alts/handshaker/transport_security_common_api.h
- src/core/util/atomic_utils.h
- src/core/util/avl.h
- src/core/util/backoff.h
- src/core/util/bitset.h
- src/core/util/chunked_vector.h
- src/core/util/cpp_impl_of.h
- src/core/util/down_cast.h
- src/core/util/dual_ref_counted.h
- src/core/util/dump_args.h
- src/core/util/event_log.h
- src/core/util/gethostname.h
- src/core/util/glob.h
- src/core/util/grpc_if_nametoindex.h
- src/core/util/if_list.h
- src/core/util/json/json.h
- src/core/util/json/json_args.h
- src/core/util/json/json_writer.h
- src/core/util/latent_see.h
- src/core/util/load_file.h
- src/core/util/manual_constructor.h
- src/core/util/match.h
- src/core/util/notification.h
- src/core/util/orphanable.h
- src/core/util/overload.h
- src/core/util/packed_table.h
- src/core/util/per_cpu.h
- src/core/util/ref_counted.h
- src/core/util/ref_counted_ptr.h
- src/core/util/ref_counted_string.h
- src/core/util/ring_buffer.h
- src/core/util/single_set_ptr.h
- src/core/util/sorted_pack.h
- src/core/util/spinlock.h
- src/core/util/status_helper.h
- src/core/util/table.h
- src/core/util/time.h
- src/core/util/time_averaged_stats.h
- src/core/util/type_list.h
- src/core/util/unique_type_name.h
- src/core/util/uri.h
- src/core/util/validation_errors.h
- src/core/util/wait_for_single_owner.h
- src/core/util/work_serializer.h
- third_party/upb/upb/generated_code_support.h
src:
- src/core/channelz/channel_trace.cc
- src/core/channelz/channelz.cc
- src/core/channelz/channelz_registry.cc
- src/core/config/core_configuration.cc
- src/core/ext/upb-gen/google/protobuf/any.upb_minitable.c
- src/core/ext/upb-gen/google/rpc/status.upb_minitable.c
- src/core/ext/upb-gen/src/proto/grpc/gcp/altscontext.upb_minitable.c
- src/core/ext/upb-gen/src/proto/grpc/gcp/handshaker.upb_minitable.c
- src/core/ext/upb-gen/src/proto/grpc/gcp/transport_security_common.upb_minitable.c
- src/core/filter/blackboard.cc
- src/core/handshaker/handshaker_registry.cc
- src/core/handshaker/proxy_mapper_registry.cc
- src/core/lib/address_utils/parse_address.cc
- src/core/lib/address_utils/sockaddr_utils.cc
- src/core/lib/channel/channel_args.cc
- src/core/lib/channel/channel_args_preconditioning.cc
- src/core/lib/channel/channel_stack.cc
- src/core/lib/channel/channel_stack_builder.cc
- src/core/lib/channel/channel_stack_builder_impl.cc
- src/core/lib/channel/connected_channel.cc
- src/core/lib/channel/promise_based_filter.cc
- src/core/lib/channel/status_util.cc
- src/core/lib/compression/compression.cc
- src/core/lib/compression/compression_internal.cc
- src/core/lib/compression/message_compress.cc
- src/core/lib/debug/trace.cc
- src/core/lib/debug/trace_flags.cc
- src/core/lib/event_engine/ares_resolver.cc
- src/core/lib/event_engine/cf_engine/cf_engine.cc
- src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc
- src/core/lib/event_engine/cf_engine/dns_service_resolver.cc
- src/core/lib/event_engine/channel_args_endpoint_config.cc
- src/core/lib/event_engine/default_event_engine.cc
- src/core/lib/event_engine/default_event_engine_factory.cc
- src/core/lib/event_engine/event_engine.cc
- src/core/lib/event_engine/forkable.cc
- src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc
- src/core/lib/event_engine/posix_engine/ev_poll_posix.cc
- src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc
- src/core/lib/event_engine/posix_engine/internal_errqueue.cc
- src/core/lib/event_engine/posix_engine/lockfree_event.cc
- src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc
- src/core/lib/event_engine/posix_engine/posix_endpoint.cc
- src/core/lib/event_engine/posix_engine/posix_engine.cc
- src/core/lib/event_engine/posix_engine/posix_engine_listener.cc
- src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc
- src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc
- src/core/lib/event_engine/posix_engine/timer.cc
- src/core/lib/event_engine/posix_engine/timer_heap.cc
- src/core/lib/event_engine/posix_engine/timer_manager.cc
- src/core/lib/event_engine/posix_engine/traced_buffer_list.cc
- src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc
- src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc
- src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc
- src/core/lib/event_engine/resolved_address.cc
- src/core/lib/event_engine/shim.cc
- src/core/lib/event_engine/slice.cc
- src/core/lib/event_engine/slice_buffer.cc
- src/core/lib/event_engine/tcp_socket_utils.cc
- src/core/lib/event_engine/thread_pool/thread_count.cc
- src/core/lib/event_engine/thread_pool/thread_pool_factory.cc
- src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc
- src/core/lib/event_engine/thready_event_engine/thready_event_engine.cc
- src/core/lib/event_engine/time_util.cc
- src/core/lib/event_engine/utils.cc
- src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc
- src/core/lib/event_engine/windows/iocp.cc
- src/core/lib/event_engine/windows/native_windows_dns_resolver.cc
- src/core/lib/event_engine/windows/win_socket.cc
- src/core/lib/event_engine/windows/windows_endpoint.cc
- src/core/lib/event_engine/windows/windows_engine.cc
- src/core/lib/event_engine/windows/windows_listener.cc
- src/core/lib/event_engine/work_queue/basic_work_queue.cc
- src/core/lib/experiments/config.cc
- src/core/lib/experiments/experiments.cc
- 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
- src/core/lib/iomgr/endpoint_cfstream.cc
- src/core/lib/iomgr/endpoint_pair_posix.cc
- src/core/lib/iomgr/endpoint_pair_windows.cc
- src/core/lib/iomgr/error.cc
- src/core/lib/iomgr/error_cfstream.cc
- src/core/lib/iomgr/ev_apple.cc
- src/core/lib/iomgr/ev_epoll1_linux.cc
- src/core/lib/iomgr/ev_poll_posix.cc
- src/core/lib/iomgr/ev_posix.cc
- src/core/lib/iomgr/event_engine_shims/closure.cc
- src/core/lib/iomgr/event_engine_shims/endpoint.cc
- src/core/lib/iomgr/event_engine_shims/tcp_client.cc
- src/core/lib/iomgr/exec_ctx.cc
- src/core/lib/iomgr/executor.cc
- src/core/lib/iomgr/fork_posix.cc
- src/core/lib/iomgr/fork_windows.cc
- src/core/lib/iomgr/internal_errqueue.cc
- src/core/lib/iomgr/iocp_windows.cc
- src/core/lib/iomgr/iomgr.cc
- src/core/lib/iomgr/iomgr_internal.cc
- src/core/lib/iomgr/iomgr_posix.cc
- src/core/lib/iomgr/iomgr_posix_cfstream.cc
- src/core/lib/iomgr/iomgr_windows.cc
- src/core/lib/iomgr/lockfree_event.cc
- src/core/lib/iomgr/polling_entity.cc
- src/core/lib/iomgr/pollset.cc
- src/core/lib/iomgr/pollset_set.cc
- src/core/lib/iomgr/pollset_set_windows.cc
- src/core/lib/iomgr/pollset_windows.cc
- src/core/lib/iomgr/resolve_address.cc
- src/core/lib/iomgr/resolve_address_posix.cc
- src/core/lib/iomgr/resolve_address_windows.cc
- src/core/lib/iomgr/sockaddr_utils_posix.cc
- src/core/lib/iomgr/socket_factory_posix.cc
- src/core/lib/iomgr/socket_mutator.cc
- src/core/lib/iomgr/socket_utils_common_posix.cc
- src/core/lib/iomgr/socket_utils_linux.cc
- src/core/lib/iomgr/socket_utils_posix.cc
- src/core/lib/iomgr/socket_utils_windows.cc
- src/core/lib/iomgr/socket_windows.cc
- src/core/lib/iomgr/systemd_utils.cc
- src/core/lib/iomgr/tcp_client.cc
- src/core/lib/iomgr/tcp_client_cfstream.cc
- src/core/lib/iomgr/tcp_client_posix.cc
- src/core/lib/iomgr/tcp_client_windows.cc
- src/core/lib/iomgr/tcp_posix.cc
- src/core/lib/iomgr/tcp_server.cc
- src/core/lib/iomgr/tcp_server_posix.cc
- src/core/lib/iomgr/tcp_server_utils_posix_common.cc
- src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc
- src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc
- src/core/lib/iomgr/tcp_server_windows.cc
- src/core/lib/iomgr/tcp_windows.cc
- src/core/lib/iomgr/timer.cc
- src/core/lib/iomgr/timer_generic.cc
- src/core/lib/iomgr/timer_heap.cc
- src/core/lib/iomgr/timer_manager.cc
- src/core/lib/iomgr/unix_sockets_posix.cc
- src/core/lib/iomgr/unix_sockets_posix_noop.cc
- src/core/lib/iomgr/vsock.cc
- src/core/lib/iomgr/wakeup_fd_eventfd.cc
- src/core/lib/iomgr/wakeup_fd_nospecial.cc
- src/core/lib/iomgr/wakeup_fd_pipe.cc
- src/core/lib/iomgr/wakeup_fd_posix.cc
- src/core/lib/promise/activity.cc
- src/core/lib/promise/party.cc
- src/core/lib/resource_quota/api.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/security/certificate_provider/certificate_provider_registry.cc
- src/core/lib/security/credentials/alts/check_gcp_environment.cc
- src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc
- src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc
- src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc
- src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc
- src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc
- src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc
- 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_string_helpers.cc
- src/core/lib/surface/byte_buffer.cc
- src/core/lib/surface/byte_buffer_reader.cc
- src/core/lib/surface/call.cc
- src/core/lib/surface/call_details.cc
- src/core/lib/surface/call_log_batch.cc
- src/core/lib/surface/call_utils.cc
- src/core/lib/surface/channel.cc
- src/core/lib/surface/channel_init.cc
- src/core/lib/surface/channel_stack_type.cc
- src/core/lib/surface/client_call.cc
- src/core/lib/surface/completion_queue.cc
- src/core/lib/surface/completion_queue_factory.cc
- src/core/lib/surface/event_string.cc
- src/core/lib/surface/filter_stack_call.cc
- src/core/lib/surface/init_internally.cc
- src/core/lib/surface/lame_client.cc
- src/core/lib/surface/metadata_array.cc
- src/core/lib/surface/server_call.cc
- src/core/lib/surface/validate_metadata.cc
- src/core/lib/surface/version.cc
- src/core/lib/transport/call_arena_allocator.cc
- src/core/lib/transport/call_filters.cc
- src/core/lib/transport/call_final_info.cc
- src/core/lib/transport/call_spine.cc
- src/core/lib/transport/call_state.cc
- src/core/lib/transport/connectivity_state.cc
- src/core/lib/transport/error_utils.cc
- src/core/lib/transport/interception_chain.cc
- src/core/lib/transport/message.cc
- src/core/lib/transport/metadata.cc
- src/core/lib/transport/metadata_batch.cc
- src/core/lib/transport/parsed_metadata.cc
- src/core/lib/transport/status_conversion.cc
- src/core/lib/transport/timeout_encoding.cc
- src/core/lib/transport/transport.cc
- src/core/lib/transport/transport_op_string.cc
- src/core/load_balancing/lb_policy.cc
- src/core/load_balancing/lb_policy_registry.cc
- src/core/resolver/endpoint_addresses.cc
- src/core/resolver/resolver.cc
- src/core/resolver/resolver_registry.cc
- src/core/service_config/service_config_parser.cc
- src/core/telemetry/call_tracer.cc
- src/core/telemetry/histogram_view.cc
- src/core/telemetry/metrics.cc
- src/core/telemetry/stats.cc
- src/core/telemetry/stats_data.cc
- src/core/tsi/alts/handshaker/transport_security_common_api.cc
- src/core/util/backoff.cc
- src/core/util/dump_args.cc
- src/core/util/event_log.cc
- src/core/util/gethostname_fallback.cc
- src/core/util/gethostname_host_name_max.cc
- src/core/util/gethostname_sysconf.cc
- src/core/util/glob.cc
- src/core/util/grpc_if_nametoindex_posix.cc
- src/core/util/grpc_if_nametoindex_unsupported.cc
- src/core/util/json/json_writer.cc
- src/core/util/latent_see.cc
- src/core/util/load_file.cc
- src/core/util/per_cpu.cc
- src/core/util/ref_counted_string.cc
- src/core/util/status_helper.cc
- src/core/util/time.cc
- src/core/util/time_averaged_stats.cc
- src/core/util/uri.cc
- src/core/util/validation_errors.cc
- src/core/util/work_serializer.cc
- test/core/call/filter_fusion_test.cc
deps:
- gtest
- upb_mini_descriptor_lib
- upb_wire_lib
- z
- absl/base:config
- absl/base:no_destructor
- absl/container:flat_hash_map
@ -10911,8 +11326,11 @@ targets:
- absl/hash:hash
- absl/meta:type_traits
- absl/status:statusor
- absl/types:span
- absl/utility:utility
- cares
- gpr
- address_sorting
- name: filter_init_fails_test
gtest: true
build: test

@ -8785,8 +8785,10 @@ grpc_cc_library(
],
deps = [
"call_filters",
"call_final_info",
"metadata",
"type_list",
"//:grpc_public_hdrs",
],
)

@ -14,14 +14,18 @@
#ifndef GRPC_SRC_CORE_CALL_FILTER_FUSION_H
#define GRPC_SRC_CORE_CALL_FILTER_FUSION_H
#include <grpc/impl/grpc_types.h>
#include <type_traits>
#include <utility>
#include "src/core/lib/transport/call_filters.h"
#include "src/core/lib/transport/call_final_info.h"
#include "src/core/lib/transport/metadata.h"
#include "src/core/util/type_list.h"
struct grpc_transport_op;
namespace grpc_core {
namespace filters_detail {
@ -69,6 +73,7 @@ class AdaptMethod<T, const NoInterceptor*, method> {
auto operator()(Hdl<T> x) {
return Immediate(ServerMetadataOrHandle<T>::Ok(std::move(x)));
}
void operator()(T* /*x*/) {}
};
// Overrides for Filter methods with void Return types.
@ -117,6 +122,73 @@ class AdaptMethod<T, void (Call::*)(A, Derived*), method,
Derived* filter_;
};
// primary template handles types that have no nested ::Call member:
template <class, class = void>
constexpr const bool kHasCallMember = false;
// specialization recognizes types that have a nested ::Call member:
template <class T>
constexpr const bool kHasCallMember<T, std::void_t<typename T::Call>> = true;
// Override for filter method types that take a pointer to the filter along
// with another arbitrary pointer type. Expected to be used to handle
// OnFinalize methods.
template <typename A, typename Call, typename Derived,
void (Call::*method)(const A*, Derived*)>
class AdaptMethod<
A, void (Call::*)(const A*, Derived*), method,
std::enable_if_t<std::is_same<typename Derived::Call, Call>::value, void>> {
public:
explicit AdaptMethod(Call* call, Derived* filter)
: call_(call), filter_(filter) {}
void operator()(A* arg) { (call_->*method)(arg, filter_); }
private:
Call* call_;
Derived* filter_;
};
// Same as above with the const qualifiers removed.
template <typename A, typename Call, typename Derived,
void (Call::*method)(A*, Derived*)>
class AdaptMethod<
A, void (Call::*)(A*, Derived*), method,
std::enable_if_t<std::is_same<typename Derived::Call, Call>::value, void>> {
public:
explicit AdaptMethod(Call* call, Derived* filter)
: call_(call), filter_(filter) {}
void operator()(A* arg) { (call_->*method)(arg, filter_); }
private:
Call* call_;
Derived* filter_;
};
// Override for filter method types that another arbitrary pointer type.
// Expected to be used to handle OnFinalize methods.
template <typename A, typename Call, void (Call::*method)(const A*)>
class AdaptMethod<A, void (Call::*)(const A*), method,
std::enable_if_t<!kHasCallMember<A>, void>> {
public:
explicit AdaptMethod(Call* call, void* /*filter*/) : call_(call) {}
void operator()(A* arg) { (call_->*method)(arg); }
private:
Call* call_;
};
// Same as above with the const qualifiers removed.
template <typename A, typename Call, void (Call::*method)(A*)>
class AdaptMethod<A, void (Call::*)(A*), method,
std::enable_if_t<!kHasCallMember<A>, void>> {
public:
explicit AdaptMethod(Call* call, void* /*filter*/) : call_(call) {}
void operator()(A* arg) { (call_->*method)(arg); }
private:
Call* call_;
};
template <typename T, typename AnyType = void>
struct TakeValueExists {
static constexpr bool value = false;
@ -155,9 +227,10 @@ struct HasStatusMethod<
static constexpr bool value = true;
};
// For types T which are of the form StatusOr<U>. Type TakeValue on Type T must
// return a value of type U. Further type T must have a method called status()
// and must return a bool when IsStatusOk is called on an object of type T.
// For types T which are of the form StatusOr<U>. Type TakeValue on Type T
// must return a value of type U. Further type T must have a method called
// status() and must return a bool when IsStatusOk is called on an object of
// type T.
template <typename T, typename U, typename AnyType = void>
struct StatusOrType {
static constexpr bool value = false;
@ -536,6 +609,30 @@ auto ExecuteCombinedWithChannelAccess(Call* call, Derived* channel,
typename FilterMethods::Methods(), typename FilterMethods::Idxs());
}
// Combine the result of a series of OnFinalize filter methods into a single
// method.
template <typename Call, typename Derived, typename T, typename... Filters,
auto... filter_methods, size_t... Is>
void ExecuteCombinedOnFinalizeWithChannelAccess(Call* call, Derived* channel,
T* call_final_info,
Typelist<Filters...>,
Valuelist<filter_methods...>,
std::index_sequence<Is...>) {
(AdaptMethod<T, decltype(filter_methods), filter_methods>(
call->template fused_child<Is>(),
reinterpret_cast<Filters*>(channel))(call_final_info),
...);
}
template <typename FilterMethods, typename FilterTypes, typename Call,
typename Derived, typename T>
void ExecuteCombinedWithChannelAccess(Call* call, Derived* channel,
T* call_final_info) {
ExecuteCombinedOnFinalizeWithChannelAccess(
call, channel, call_final_info, typename FilterTypes::Types(),
typename FilterMethods::Methods(), typename FilterMethods::Idxs());
}
#define GRPC_FUSE_METHOD(name, type, forward) \
template <MethodVariant variant, typename Derived, typename... Filters> \
class FuseImpl##name; \
@ -573,6 +670,9 @@ GRPC_FUSE_METHOD(OnClientInitialMetadata, ClientMetadataHandle, true);
GRPC_FUSE_METHOD(OnServerInitialMetadata, ServerMetadataHandle, false);
GRPC_FUSE_METHOD(OnClientToServerMessage, MessageHandle, true);
GRPC_FUSE_METHOD(OnServerToClientMessage, MessageHandle, false);
GRPC_FUSE_METHOD(OnServerTrailingMetadata, ServerMetadataHandle, false);
GRPC_FUSE_METHOD(OnClientToServerHalfClose, ServerMetadataHandle, true);
GRPC_FUSE_METHOD(OnFinalize, grpc_call_final_info*, true);
#undef GRPC_FUSE_METHOD
@ -582,11 +682,14 @@ class FusedFilter : public Filters... {
class Call : public FuseOnClientInitialMetadata<FusedFilter, Filters...>,
public FuseOnServerInitialMetadata<FusedFilter, Filters...>,
public FuseOnClientToServerMessage<FusedFilter, Filters...>,
public FuseOnServerToClientMessage<FusedFilter, Filters...> {
public FuseOnServerToClientMessage<FusedFilter, Filters...>,
public FuseOnServerTrailingMetadata<FusedFilter, Filters...>,
public FuseOnClientToServerHalfClose<FusedFilter, Filters...>,
public FuseOnFinalize<FusedFilter, Filters...> {
public:
template <size_t I>
auto* fused_child() {
return &std::get<I>(filters_);
return &std::get<I>(filter_calls_);
}
using FuseOnClientInitialMetadata<FusedFilter,
@ -597,10 +700,38 @@ class FusedFilter : public Filters... {
Filters...>::OnClientToServerMessage;
using FuseOnServerToClientMessage<FusedFilter,
Filters...>::OnServerToClientMessage;
using FuseOnServerTrailingMetadata<FusedFilter,
Filters...>::OnServerTrailingMetadata;
using FuseOnClientToServerHalfClose<FusedFilter,
Filters...>::OnClientToServerHalfClose;
using FuseOnFinalize<FusedFilter, Filters...>::OnFinalize;
private:
std::tuple<typename Filters::Call...> filters_;
std::tuple<typename Filters::Call...> filter_calls_;
};
bool StartTransportOp(grpc_transport_op* op) {
return StartTransportOpInternal(op, Typelist<Filters...>());
}
bool GetChannelInfo(const grpc_channel_info* info) {
return GetChannelInfoInternal(info, Typelist<Filters...>());
}
private:
template <typename... FilterTypes>
bool StartTransportOpInternal(grpc_transport_op* op,
Typelist<FilterTypes...>) {
return (std::get<FilterTypes>(filters_).StartTransportOp(op) || ...);
}
template <typename... FilterTypes>
bool GetChannelInfoInternal(const grpc_channel_info* info,
Typelist<FilterTypes...>) {
return (std::get<FilterTypes>(filters_).GetChannelInfo(info) || ...);
}
std::tuple<Filters...> filters_;
};
} // namespace filters_detail

@ -113,6 +113,8 @@ grpc_cc_test(
],
external_deps = ["gtest"],
deps = [
"//:grpc_base",
"//src/core:call_final_info",
"//src/core:filter_fusion",
],
)

@ -14,10 +14,14 @@
#include "src/core/call/filter_fusion.h"
#include <grpc/impl/grpc_types.h>
#include <type_traits>
#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include "src/core/lib/transport/call_final_info.h"
#include "src/core/lib/transport/transport.h"
using testing::ElementsAre;
@ -40,9 +44,28 @@ class Test1 {
void OnServerToClientMessage(Message&) {
history.push_back("Test1::Call::OnServerToClientMessage");
}
void OnClientToServerHalfClose() {
history.push_back("Test1::Call::OnClientToServerHalfClose");
}
void OnFinalize(const grpc_call_final_info*, Test1*) {
history.push_back("Test1::Call::OnFinalize");
}
void OnServerTrailingMetadata(ServerMetadata&) {
history.push_back("Test1::Call::OnServerTrailingMetadata");
}
private:
};
bool StartTransportOp(grpc_transport_op* op) {
history.push_back("Test1::StartTransportOp");
return false;
}
bool GetChannelInfo(const grpc_channel_info* info) {
history.push_back("Test1::GetChannelInfo");
return false;
}
};
class Test2 {
@ -59,9 +82,26 @@ class Test2 {
void OnServerToClientMessage(Message&) {
history.push_back("Test2::Call::OnServerToClientMessage");
}
void OnClientToServerHalfClose() {
history.push_back("Test2::Call::OnClientToServerHalfClose");
}
void OnServerTrailingMetadata(ServerMetadata&, Test2*) {
history.push_back("Test2::Call::OnServerTrailingMetadata");
}
static inline const NoInterceptor OnFinalize;
private:
};
bool StartTransportOp(grpc_transport_op* op) {
history.push_back("Test2::StartTransportOp");
return false;
}
bool GetChannelInfo(const grpc_channel_info* info) {
history.push_back("Test2::GetChannelInfo");
return false;
}
};
class Test3 {
@ -83,9 +123,26 @@ class Test3 {
history.push_back("Test3::Call::OnServerToClientMessage");
return handle;
}
void OnServerTrailingMetadata(ServerMetadata&) {
history.push_back("Test3::Call::OnServerTrailingMetadata");
}
static inline const NoInterceptor OnClientToServerHalfClose;
void OnFinalize(const grpc_call_final_info*) {
history.push_back("Test3::Call::OnFinalize");
}
private:
};
bool StartTransportOp(grpc_transport_op* op) {
history.push_back("Test3::StartTransportOp");
return false;
}
bool GetChannelInfo(const grpc_channel_info* info) {
history.push_back("Test3::GetChannelInfo");
return false;
}
};
class Test4 {
@ -102,9 +159,24 @@ class Test4 {
}
static inline const NoInterceptor OnClientToServerMessage;
static inline const NoInterceptor OnServerToClientMessage;
static inline const NoInterceptor OnClientToServerHalfClose;
static inline const NoInterceptor OnServerTrailingMetadata;
void OnFinalize(const grpc_call_final_info*, Test4*) {
history.push_back("Test4::Call::OnFinalize");
}
private:
};
bool StartTransportOp(grpc_transport_op* op) {
history.push_back("Test4::StartTransportOp");
return true;
}
bool GetChannelInfo(const grpc_channel_info* info) {
history.push_back("Test4::GetChannelInfo");
return true;
}
};
class Test5 {
@ -119,20 +191,45 @@ class Test5 {
}
static inline const NoInterceptor OnClientToServerMessage;
static inline const NoInterceptor OnServerToClientMessage;
static inline const NoInterceptor OnClientToServerHalfClose;
static inline const NoInterceptor OnServerTrailingMetadata;
static inline const NoInterceptor OnFinalize;
private:
};
bool StartTransportOp(grpc_transport_op* op) {
history.push_back("Test5::StartTransportOp");
return false;
}
bool GetChannelInfo(const grpc_channel_info* info) {
history.push_back("Test5::GetChannelInfo");
return false;
}
};
using Test123 = FusedFilter<Test1, Test2, Test3, Test4, Test5>;
using TestFusedFilter = FusedFilter<Test1, Test2, Test3, Test4, Test5>;
static_assert(!std::is_same_v<decltype(&Test123::Call::OnClientInitialMetadata),
const NoInterceptor*>);
static_assert(!std::is_same_v<decltype(&Test123::Call::OnServerInitialMetadata),
const NoInterceptor*>);
static_assert(!std::is_same_v<decltype(&Test123::Call::OnClientToServerMessage),
const NoInterceptor*>);
static_assert(!std::is_same_v<decltype(&Test123::Call::OnServerToClientMessage),
static_assert(
!std::is_same_v<decltype(&TestFusedFilter::Call::OnClientInitialMetadata),
const NoInterceptor*>);
static_assert(
!std::is_same_v<decltype(&TestFusedFilter::Call::OnServerInitialMetadata),
const NoInterceptor*>);
static_assert(
!std::is_same_v<decltype(&TestFusedFilter::Call::OnClientToServerMessage),
const NoInterceptor*>);
static_assert(
!std::is_same_v<decltype(&TestFusedFilter::Call::OnServerToClientMessage),
const NoInterceptor*>);
static_assert(
!std::is_same_v<decltype(&TestFusedFilter::Call::OnClientToServerHalfClose),
const NoInterceptor*>);
static_assert(
!std::is_same_v<decltype(&TestFusedFilter::Call::OnServerTrailingMetadata),
const NoInterceptor*>);
static_assert(!std::is_same_v<decltype(&TestFusedFilter::Call::OnFinalize),
const NoInterceptor*>);
template <typename T>
@ -148,13 +245,18 @@ typename ServerMetadataOrHandle<T>::ValueType RunSuccessfulPromise(
}
}
TEST(Test123, OrderCorrect) {
Test123 filter;
Test123::Call call;
TEST(FusedFilterTest, ClientFilterTest) {
history.clear();
TestFusedFilter filter;
TestFusedFilter::Call call;
history.clear();
auto message = Arena::MakePooled<Message>();
auto server_metadata_handle = Arena::MakePooled<ServerMetadata>();
auto server_trailing_metadata_handle = Arena::MakePooled<ServerMetadata>();
auto server_trailing_metadata_handle_half_close =
Arena::MakePooled<ServerMetadata>();
auto client_metadata_handle = Arena::MakePooled<ClientMetadata>();
struct grpc_call_final_info info;
message = RunSuccessfulPromise<Message>(
call.OnClientToServerMessage(std::move(message), &filter));
RunSuccessfulPromise<Message>(
@ -163,18 +265,45 @@ TEST(Test123, OrderCorrect) {
call.OnServerInitialMetadata(std::move(server_metadata_handle), &filter));
RunSuccessfulPromise<ClientMetadata>(
call.OnClientInitialMetadata(std::move(client_metadata_handle), &filter));
EXPECT_THAT(history, ElementsAre("Test2::Call::OnClientToServerMessage",
"Test3::Call::OnClientToServerMessage",
"Test3::Call::OnServerToClientMessage",
"Test2::Call::OnServerToClientMessage",
"Test1::Call::OnServerToClientMessage",
"Test5::Call::OnServerInitialMetadata",
"Test4::Call::OnServerInitialMetadata",
"Test1::Call::OnClientInitialMetadata",
"Test2::Call::OnClientInitialMetadata",
"Test3::Call::OnClientInitialMetadata",
"Test4::Call::OnClientInitialMetadata",
"Test5::Call::OnClientInitialMetadata"));
RunSuccessfulPromise<ServerMetadata>(call.OnServerTrailingMetadata(
std::move(server_trailing_metadata_handle), &filter));
RunSuccessfulPromise<ServerMetadata>(call.OnClientToServerHalfClose(
std::move(server_trailing_metadata_handle_half_close)));
call.OnFinalize(&info, &filter);
EXPECT_THAT(
history,
ElementsAre("Test2::Call::OnClientToServerMessage",
"Test3::Call::OnClientToServerMessage",
// ServerToClientMessage execution order must be reversed.
"Test3::Call::OnServerToClientMessage",
"Test2::Call::OnServerToClientMessage",
"Test1::Call::OnServerToClientMessage",
// ServerInitialMetadata execution order must be reversed.
"Test5::Call::OnServerInitialMetadata",
"Test4::Call::OnServerInitialMetadata",
"Test1::Call::OnClientInitialMetadata",
"Test2::Call::OnClientInitialMetadata",
"Test3::Call::OnClientInitialMetadata",
"Test4::Call::OnClientInitialMetadata",
"Test5::Call::OnClientInitialMetadata",
// ServerTrailingMetadata execution order must be reversed.
"Test3::Call::OnServerTrailingMetadata",
"Test2::Call::OnServerTrailingMetadata",
"Test1::Call::OnServerTrailingMetadata",
"Test1::Call::OnClientToServerHalfClose",
"Test2::Call::OnClientToServerHalfClose",
"Test1::Call::OnFinalize", "Test3::Call::OnFinalize",
"Test4::Call::OnFinalize"));
history.clear();
grpc_transport_op op;
grpc_channel_info channel_info;
EXPECT_TRUE(filter.StartTransportOp(&op));
EXPECT_TRUE(filter.GetChannelInfo(&channel_info));
EXPECT_THAT(history,
ElementsAre("Test1::StartTransportOp", "Test2::StartTransportOp",
"Test3::StartTransportOp", "Test4::StartTransportOp",
"Test1::GetChannelInfo", "Test2::GetChannelInfo",
"Test3::GetChannelInfo", "Test4::GetChannelInfo"));
}
} // namespace

Loading…
Cancel
Save