grpc 1.50.0-x86_64-linux → 1.51.0-x86_64-linux
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of grpc might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Makefile +131 -42
- data/include/grpc/event_engine/event_engine.h +10 -3
- data/include/grpc/event_engine/slice_buffer.h +17 -0
- data/include/grpc/grpc.h +0 -10
- data/include/grpc/impl/codegen/grpc_types.h +1 -5
- data/include/grpc/impl/codegen/port_platform.h +0 -3
- data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +19 -13
- data/src/core/ext/filters/channel_idle/channel_idle_filter.h +1 -0
- data/src/core/ext/filters/client_channel/backup_poller.cc +3 -3
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +7 -5
- data/src/core/ext/filters/client_channel/client_channel.cc +120 -140
- data/src/core/ext/filters/client_channel/client_channel.h +3 -4
- data/src/core/ext/filters/client_channel/client_channel_channelz.cc +0 -2
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
- data/src/core/ext/filters/client_channel/client_channel_service_config.cc +153 -0
- data/src/core/ext/filters/client_channel/{resolver_result_parsing.h → client_channel_service_config.h} +26 -23
- data/src/core/ext/filters/client_channel/connector.h +1 -1
- data/src/core/ext/filters/client_channel/dynamic_filters.cc +20 -47
- data/src/core/ext/filters/client_channel/dynamic_filters.h +7 -8
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +3 -4
- data/src/core/ext/filters/client_channel/http_proxy.cc +0 -1
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +3 -4
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +5 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +8 -7
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +35 -44
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +0 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +1 -3
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +3 -4
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +41 -29
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +2 -2
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +9 -11
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +15 -12
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +8 -10
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +26 -27
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +7 -9
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +44 -26
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +17 -27
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.cc +42 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/{xds.h → xds_attributes.h} +15 -17
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +13 -7
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +48 -47
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +40 -126
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +364 -0
- data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +9 -9
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +23 -32
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +1 -2
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +22 -23
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +50 -52
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -1
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +2 -4
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +1 -3
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +34 -26
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +3 -4
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +4 -7
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +63 -46
- data/src/core/ext/filters/client_channel/retry_filter.cc +80 -102
- data/src/core/ext/filters/client_channel/retry_service_config.cc +192 -234
- data/src/core/ext/filters/client_channel/retry_service_config.h +20 -23
- data/src/core/ext/filters/client_channel/retry_throttle.cc +8 -8
- data/src/core/ext/filters/client_channel/retry_throttle.h +8 -7
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +2 -2
- data/src/core/ext/filters/client_channel/subchannel.cc +21 -25
- data/src/core/ext/filters/client_channel/subchannel.h +2 -2
- data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +11 -12
- data/src/core/ext/filters/deadline/deadline_filter.cc +13 -14
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -1
- data/src/core/ext/filters/fault_injection/fault_injection_filter.h +0 -4
- data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc +118 -0
- data/src/core/ext/filters/fault_injection/{service_config_parser.h → fault_injection_service_config_parser.h} +20 -12
- data/src/core/ext/filters/http/client/http_client_filter.cc +16 -16
- data/src/core/ext/filters/http/client_authority_filter.cc +1 -1
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +13 -13
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +34 -34
- data/src/core/ext/filters/http/server/http_server_filter.cc +26 -25
- data/src/core/ext/filters/message_size/message_size_filter.cc +86 -117
- data/src/core/ext/filters/message_size/message_size_filter.h +22 -15
- data/src/core/ext/filters/rbac/rbac_filter.cc +12 -12
- data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +728 -530
- data/src/core/ext/filters/rbac/rbac_service_config_parser.h +4 -3
- data/src/core/ext/filters/server_config_selector/server_config_selector.h +1 -1
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +6 -7
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +17 -21
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +57 -72
- data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +5 -5
- data/src/core/ext/transport/chttp2/transport/bin_encoder.h +1 -1
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +212 -253
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +42 -11
- data/src/core/ext/transport/chttp2/transport/flow_control.h +4 -3
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +16 -15
- data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +13 -13
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +4 -3
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +10 -7
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +15 -17
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +5 -4
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +5 -6
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +1 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +2 -1
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +31 -39
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +7 -6
- data/src/core/ext/transport/chttp2/transport/internal.h +24 -8
- data/src/core/ext/transport/chttp2/transport/parsing.cc +51 -52
- data/src/core/ext/transport/chttp2/transport/varint.cc +2 -3
- data/src/core/ext/transport/chttp2/transport/varint.h +11 -8
- data/src/core/ext/transport/chttp2/transport/writing.cc +16 -16
- data/src/core/ext/transport/inproc/inproc_transport.cc +97 -115
- data/src/core/ext/xds/certificate_provider_store.cc +4 -4
- data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +4 -7
- data/src/core/ext/xds/xds_api.cc +15 -68
- data/src/core/ext/xds/xds_api.h +3 -7
- data/src/core/ext/xds/xds_bootstrap.h +0 -1
- data/src/core/ext/xds/xds_bootstrap_grpc.cc +3 -12
- data/src/core/ext/xds/xds_bootstrap_grpc.h +16 -1
- data/src/core/ext/xds/xds_certificate_provider.cc +22 -25
- data/src/core/ext/xds/xds_channel_stack_modifier.cc +0 -1
- data/src/core/ext/xds/xds_client.cc +122 -90
- data/src/core/ext/xds/xds_client.h +7 -2
- data/src/core/ext/xds/xds_client_grpc.cc +5 -24
- data/src/core/ext/xds/xds_cluster.cc +291 -183
- data/src/core/ext/xds/xds_cluster.h +11 -15
- data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +32 -29
- data/src/core/ext/xds/xds_cluster_specifier_plugin.h +35 -16
- data/src/core/ext/xds/xds_common_types.cc +208 -141
- data/src/core/ext/xds/xds_common_types.h +19 -13
- data/src/core/ext/xds/xds_endpoint.cc +214 -129
- data/src/core/ext/xds/xds_endpoint.h +4 -7
- data/src/core/ext/xds/xds_http_fault_filter.cc +56 -43
- data/src/core/ext/xds/xds_http_fault_filter.h +13 -21
- data/src/core/ext/xds/xds_http_filters.cc +60 -73
- data/src/core/ext/xds/xds_http_filters.h +67 -19
- data/src/core/ext/xds/xds_http_rbac_filter.cc +152 -207
- data/src/core/ext/xds/xds_http_rbac_filter.h +12 -15
- data/src/core/ext/xds/xds_lb_policy_registry.cc +122 -169
- data/src/core/ext/xds/xds_lb_policy_registry.h +10 -11
- data/src/core/ext/xds/xds_listener.cc +459 -417
- data/src/core/ext/xds/xds_listener.h +43 -47
- data/src/core/ext/xds/xds_resource_type.h +3 -11
- data/src/core/ext/xds/xds_resource_type_impl.h +8 -13
- data/src/core/ext/xds/xds_route_config.cc +94 -80
- data/src/core/ext/xds/xds_route_config.h +10 -10
- data/src/core/ext/xds/xds_routing.cc +2 -1
- data/src/core/ext/xds/xds_routing.h +2 -0
- data/src/core/ext/xds/xds_server_config_fetcher.cc +109 -94
- data/src/core/ext/xds/xds_transport_grpc.cc +4 -5
- data/src/core/lib/address_utils/parse_address.cc +11 -10
- data/src/core/lib/channel/channel_args.h +16 -1
- data/src/core/lib/channel/channel_stack.cc +23 -20
- data/src/core/lib/channel/channel_stack.h +17 -4
- data/src/core/lib/channel/channel_stack_builder.cc +4 -7
- data/src/core/lib/channel/channel_stack_builder.h +14 -6
- data/src/core/lib/channel/channel_stack_builder_impl.cc +25 -7
- data/src/core/lib/channel/channel_stack_builder_impl.h +2 -0
- data/src/core/lib/channel/channel_trace.cc +4 -5
- data/src/core/lib/channel/channelz.cc +1 -1
- data/src/core/lib/channel/connected_channel.cc +695 -35
- data/src/core/lib/channel/connected_channel.h +0 -4
- data/src/core/lib/channel/promise_based_filter.cc +1004 -140
- data/src/core/lib/channel/promise_based_filter.h +364 -87
- data/src/core/lib/compression/message_compress.cc +5 -5
- data/src/core/lib/debug/event_log.cc +88 -0
- data/src/core/lib/debug/event_log.h +81 -0
- data/src/core/lib/debug/histogram_view.cc +69 -0
- data/src/core/lib/{slice/slice_refcount.cc → debug/histogram_view.h} +15 -13
- data/src/core/lib/debug/stats.cc +22 -119
- data/src/core/lib/debug/stats.h +29 -35
- data/src/core/lib/debug/stats_data.cc +224 -73
- data/src/core/lib/debug/stats_data.h +263 -122
- data/src/core/lib/event_engine/common_closures.h +71 -0
- data/src/core/lib/event_engine/default_event_engine.cc +38 -15
- data/src/core/lib/event_engine/default_event_engine.h +15 -3
- data/src/core/lib/event_engine/default_event_engine_factory.cc +2 -4
- data/src/core/lib/event_engine/memory_allocator.cc +1 -1
- data/src/core/lib/event_engine/poller.h +10 -4
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +618 -0
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +129 -0
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +901 -0
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +97 -0
- data/src/core/lib/event_engine/posix_engine/event_poller.h +111 -0
- data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +74 -0
- data/src/core/lib/event_engine/{executor/threaded_executor.cc → posix_engine/event_poller_posix_default.h} +13 -16
- data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +77 -0
- data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +179 -0
- data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +267 -0
- data/src/core/lib/event_engine/posix_engine/lockfree_event.h +73 -0
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +1270 -0
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +682 -0
- data/src/core/lib/event_engine/posix_engine/posix_engine.cc +453 -18
- data/src/core/lib/event_engine/posix_engine/posix_engine.h +148 -24
- data/src/core/lib/event_engine/posix_engine/posix_engine_closure.h +80 -0
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +1081 -0
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +361 -0
- data/src/core/lib/event_engine/posix_engine/timer.h +9 -8
- data/src/core/lib/event_engine/posix_engine/timer_manager.cc +57 -194
- data/src/core/lib/event_engine/posix_engine/timer_manager.h +21 -49
- data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +301 -0
- data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +179 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +126 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +45 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +151 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +45 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +76 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +67 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +37 -0
- data/src/core/lib/event_engine/slice.cc +7 -6
- data/src/core/lib/event_engine/slice_buffer.cc +2 -2
- data/src/core/lib/event_engine/thread_pool.cc +106 -25
- data/src/core/lib/event_engine/thread_pool.h +32 -9
- data/src/core/lib/event_engine/windows/win_socket.cc +7 -7
- data/src/core/lib/event_engine/windows/windows_engine.cc +18 -12
- data/src/core/lib/event_engine/windows/windows_engine.h +8 -4
- data/src/core/lib/experiments/config.cc +1 -1
- data/src/core/lib/experiments/experiments.cc +13 -2
- data/src/core/lib/experiments/experiments.h +8 -1
- data/src/core/lib/gpr/cpu_linux.cc +6 -2
- data/src/core/lib/gpr/log_linux.cc +3 -4
- data/src/core/lib/gpr/string.h +1 -1
- data/src/core/lib/gpr/tmpfile_posix.cc +3 -2
- data/src/core/lib/gprpp/load_file.cc +75 -0
- data/src/core/lib/gprpp/load_file.h +33 -0
- data/src/core/lib/gprpp/per_cpu.h +46 -0
- data/src/core/lib/gprpp/stat_posix.cc +5 -4
- data/src/core/lib/gprpp/stat_windows.cc +3 -2
- data/src/core/lib/gprpp/status_helper.h +1 -3
- data/src/core/lib/gprpp/strerror.cc +41 -0
- data/src/core/{ext/xds/xds_resource_type.cc → lib/gprpp/strerror.h} +9 -13
- data/src/core/lib/gprpp/thd_windows.cc +1 -2
- data/src/core/lib/gprpp/time.cc +3 -4
- data/src/core/lib/gprpp/time.h +13 -2
- data/src/core/lib/gprpp/validation_errors.h +18 -1
- data/src/core/lib/http/httpcli.cc +40 -44
- data/src/core/lib/http/httpcli.h +6 -5
- data/src/core/lib/http/httpcli_security_connector.cc +4 -6
- data/src/core/lib/http/parser.cc +54 -65
- data/src/core/lib/iomgr/buffer_list.cc +105 -116
- data/src/core/lib/iomgr/buffer_list.h +60 -44
- data/src/core/lib/iomgr/call_combiner.cc +11 -10
- data/src/core/lib/iomgr/call_combiner.h +3 -4
- data/src/core/lib/iomgr/cfstream_handle.cc +13 -16
- data/src/core/lib/iomgr/closure.h +49 -5
- data/src/core/lib/iomgr/combiner.cc +2 -2
- data/src/core/lib/iomgr/endpoint.h +1 -1
- data/src/core/lib/iomgr/endpoint_cfstream.cc +26 -25
- data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -2
- data/src/core/lib/iomgr/error.cc +27 -42
- data/src/core/lib/iomgr/error.h +22 -152
- data/src/core/lib/iomgr/ev_apple.cc +4 -4
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +26 -25
- data/src/core/lib/iomgr/ev_poll_posix.cc +27 -31
- data/src/core/lib/iomgr/exec_ctx.cc +3 -4
- data/src/core/lib/iomgr/exec_ctx.h +2 -3
- data/src/core/lib/iomgr/executor.cc +1 -2
- data/src/core/lib/iomgr/internal_errqueue.cc +3 -1
- data/src/core/lib/iomgr/iocp_windows.cc +1 -0
- data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
- data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -1
- data/src/core/lib/iomgr/iomgr_windows.cc +2 -1
- data/src/core/lib/iomgr/load_file.cc +5 -9
- data/src/core/lib/iomgr/lockfree_event.cc +10 -10
- data/src/core/lib/iomgr/pollset_windows.cc +4 -4
- data/src/core/lib/iomgr/python_util.h +2 -2
- data/src/core/lib/iomgr/resolve_address.cc +8 -3
- data/src/core/lib/iomgr/resolve_address.h +3 -4
- data/src/core/lib/iomgr/resolve_address_impl.h +1 -1
- data/src/core/lib/iomgr/resolve_address_posix.cc +14 -25
- data/src/core/lib/iomgr/resolve_address_posix.h +1 -2
- data/src/core/lib/iomgr/resolve_address_windows.cc +14 -17
- data/src/core/lib/iomgr/resolve_address_windows.h +1 -2
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +30 -29
- data/src/core/lib/iomgr/socket_utils_posix.cc +1 -0
- data/src/core/lib/iomgr/socket_utils_posix.h +2 -2
- data/src/core/lib/iomgr/socket_windows.cc +2 -2
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +6 -10
- data/src/core/lib/iomgr/tcp_client_posix.cc +31 -35
- data/src/core/lib/iomgr/tcp_client_windows.cc +8 -12
- data/src/core/lib/iomgr/tcp_posix.cc +92 -108
- data/src/core/lib/iomgr/tcp_server_posix.cc +34 -34
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +1 -1
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +18 -21
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +12 -13
- data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +1 -1
- data/src/core/lib/iomgr/tcp_server_windows.cc +26 -29
- data/src/core/lib/iomgr/tcp_windows.cc +27 -34
- data/src/core/lib/iomgr/timer.h +8 -8
- data/src/core/lib/iomgr/timer_generic.cc +9 -15
- data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -4
- data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +4 -3
- data/src/core/lib/iomgr/wakeup_fd_pipe.cc +10 -8
- data/src/core/lib/json/json_channel_args.h +42 -0
- data/src/core/lib/json/json_object_loader.cc +7 -2
- data/src/core/lib/json/json_object_loader.h +22 -0
- data/src/core/lib/json/json_util.cc +5 -5
- data/src/core/lib/json/json_util.h +4 -4
- data/src/core/lib/load_balancing/lb_policy.cc +1 -1
- data/src/core/lib/load_balancing/lb_policy.h +4 -0
- data/src/core/lib/load_balancing/subchannel_interface.h +0 -7
- data/src/core/lib/matchers/matchers.cc +3 -4
- data/src/core/lib/promise/activity.cc +16 -2
- data/src/core/lib/promise/activity.h +38 -15
- data/src/core/lib/promise/arena_promise.h +80 -51
- data/src/core/lib/promise/context.h +13 -6
- data/src/core/lib/promise/detail/basic_seq.h +9 -28
- data/src/core/lib/promise/detail/promise_factory.h +58 -10
- data/src/core/lib/promise/detail/status.h +28 -0
- data/src/core/lib/promise/detail/switch.h +1455 -0
- data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +3 -1
- data/src/core/lib/promise/for_each.h +129 -0
- data/src/core/lib/promise/loop.h +7 -5
- data/src/core/lib/promise/map_pipe.h +87 -0
- data/src/core/lib/promise/pipe.cc +19 -0
- data/src/core/lib/promise/pipe.h +505 -0
- data/src/core/lib/promise/poll.h +13 -0
- data/src/core/lib/promise/seq.h +3 -5
- data/src/core/lib/promise/sleep.cc +5 -4
- data/src/core/lib/promise/sleep.h +1 -2
- data/src/core/lib/promise/try_concurrently.h +341 -0
- data/src/core/lib/promise/try_seq.h +10 -13
- data/src/core/lib/resolver/server_address.cc +1 -0
- data/src/core/lib/resolver/server_address.h +1 -3
- data/src/core/lib/resource_quota/api.cc +0 -1
- data/src/core/lib/resource_quota/arena.cc +19 -0
- data/src/core/lib/resource_quota/arena.h +89 -0
- data/src/core/lib/resource_quota/memory_quota.cc +1 -0
- data/src/core/lib/security/authorization/grpc_authorization_engine.cc +1 -3
- data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +4 -2
- data/src/core/lib/security/authorization/matchers.cc +25 -22
- data/src/core/lib/security/authorization/rbac_policy.cc +2 -3
- data/src/core/lib/security/context/security_context.h +10 -0
- data/src/core/lib/security/credentials/channel_creds_registry_init.cc +3 -4
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +1 -1
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +77 -55
- data/src/core/lib/security/credentials/external/aws_request_signer.cc +4 -3
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +40 -51
- data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +17 -21
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +21 -25
- data/src/core/lib/security/credentials/fake/fake_credentials.cc +1 -0
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +27 -24
- data/src/core/lib/security/credentials/iam/iam_credentials.cc +1 -0
- data/src/core/lib/security/credentials/jwt/json_token.cc +1 -2
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +1 -1
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -5
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +24 -30
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -5
- data/src/core/lib/security/credentials/plugin/plugin_credentials.h +3 -3
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +19 -27
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +4 -11
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +29 -41
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +1 -1
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +6 -11
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +8 -15
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +2 -6
- data/src/core/lib/security/security_connector/load_system_roots_supported.cc +1 -4
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +7 -11
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +9 -14
- data/src/core/lib/security/security_connector/ssl_utils.cc +5 -7
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +21 -27
- data/src/core/lib/security/transport/client_auth_filter.cc +1 -1
- data/src/core/lib/security/transport/secure_endpoint.cc +26 -28
- data/src/core/lib/security/transport/security_handshaker.cc +53 -53
- data/src/core/lib/security/transport/server_auth_filter.cc +21 -21
- data/src/core/lib/security/transport/tsi_error.cc +6 -3
- data/src/core/lib/security/util/json_util.cc +4 -5
- data/src/core/lib/service_config/service_config.h +1 -1
- data/src/core/lib/service_config/service_config_impl.cc +111 -158
- data/src/core/lib/service_config/service_config_impl.h +14 -17
- data/src/core/lib/service_config/service_config_parser.cc +14 -31
- data/src/core/lib/service_config/service_config_parser.h +14 -10
- data/src/core/lib/slice/b64.cc +2 -2
- data/src/core/lib/slice/slice.cc +7 -1
- data/src/core/lib/slice/slice.h +19 -6
- data/src/core/lib/slice/slice_buffer.cc +13 -14
- data/src/core/lib/slice/slice_internal.h +13 -21
- data/src/core/lib/slice/slice_refcount.h +34 -19
- data/src/core/lib/surface/byte_buffer.cc +3 -4
- data/src/core/lib/surface/byte_buffer_reader.cc +4 -4
- data/src/core/lib/surface/call.cc +1366 -239
- data/src/core/lib/surface/call.h +44 -0
- data/src/core/lib/surface/call_details.cc +3 -3
- data/src/core/lib/surface/call_trace.cc +113 -0
- data/src/core/lib/surface/call_trace.h +30 -0
- data/src/core/lib/surface/channel.cc +44 -49
- data/src/core/lib/surface/channel.h +9 -1
- data/src/core/lib/surface/channel_ping.cc +1 -1
- data/src/core/lib/surface/channel_stack_type.cc +4 -0
- data/src/core/lib/surface/channel_stack_type.h +2 -0
- data/src/core/lib/surface/completion_queue.cc +38 -52
- data/src/core/lib/surface/init.cc +8 -39
- data/src/core/lib/surface/init_internally.h +8 -0
- data/src/core/lib/surface/lame_client.cc +10 -8
- data/src/core/lib/surface/server.cc +48 -70
- data/src/core/lib/surface/server.h +3 -4
- data/src/core/lib/surface/validate_metadata.cc +11 -12
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/connectivity_state.cc +2 -2
- data/src/core/lib/transport/error_utils.cc +34 -28
- data/src/core/lib/transport/error_utils.h +3 -3
- data/src/core/lib/transport/handshaker.cc +14 -14
- data/src/core/lib/transport/handshaker.h +1 -1
- data/src/core/lib/transport/handshaker_factory.h +26 -0
- data/src/core/lib/transport/handshaker_registry.cc +8 -2
- data/src/core/lib/transport/handshaker_registry.h +3 -4
- data/src/core/lib/transport/http_connect_handshaker.cc +23 -24
- data/src/core/lib/transport/metadata_batch.h +17 -1
- data/src/core/lib/transport/parsed_metadata.cc +2 -6
- data/src/core/lib/transport/tcp_connect_handshaker.cc +15 -20
- data/src/core/lib/transport/transport.cc +63 -17
- data/src/core/lib/transport/transport.h +64 -68
- data/src/core/lib/transport/transport_impl.h +1 -1
- data/src/core/lib/transport/transport_op_string.cc +7 -6
- data/src/core/plugin_registry/grpc_plugin_registry.cc +6 -10
- data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +2 -14
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +10 -10
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +8 -8
- data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +2 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +7 -7
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +7 -6
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +5 -5
- data/src/core/tsi/fake_transport_security.cc +3 -3
- data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +7 -3
- data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -1
- data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +6 -2
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +0 -2
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +0 -3
- data/src/ruby/lib/grpc/2.6/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/2.7/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/3.0/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/3.1/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/spec/channel_spec.rb +0 -43
- data/src/ruby/spec/generic/active_call_spec.rb +12 -3
- data/third_party/abseil-cpp/absl/cleanup/cleanup.h +140 -0
- data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +100 -0
- data/third_party/zlib/compress.c +3 -3
- data/third_party/zlib/crc32.c +21 -12
- data/third_party/zlib/deflate.c +112 -106
- data/third_party/zlib/deflate.h +2 -2
- data/third_party/zlib/gzlib.c +1 -1
- data/third_party/zlib/gzread.c +3 -5
- data/third_party/zlib/gzwrite.c +1 -1
- data/third_party/zlib/infback.c +10 -7
- data/third_party/zlib/inflate.c +5 -2
- data/third_party/zlib/inftrees.c +2 -2
- data/third_party/zlib/inftrees.h +1 -1
- data/third_party/zlib/trees.c +61 -62
- data/third_party/zlib/uncompr.c +2 -2
- data/third_party/zlib/zconf.h +16 -3
- data/third_party/zlib/zlib.h +10 -10
- data/third_party/zlib/zutil.c +9 -7
- data/third_party/zlib/zutil.h +1 -0
- metadata +55 -18
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +0 -188
- data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -187
- data/src/core/lib/event_engine/executor/threaded_executor.h +0 -44
- data/src/core/lib/gpr/murmur_hash.cc +0 -82
- data/src/core/lib/gpr/murmur_hash.h +0 -29
- data/src/core/lib/gpr/tls.h +0 -156
- data/src/core/lib/promise/call_push_pull.h +0 -148
- data/src/core/lib/slice/slice_api.cc +0 -39
- data/src/core/lib/slice/slice_buffer_api.cc +0 -35
- data/src/core/lib/slice/slice_refcount_base.h +0 -60
@@ -19,18 +19,27 @@
|
|
19
19
|
// promise-style. Most of this will be removed once the promises conversion is
|
20
20
|
// completed.
|
21
21
|
|
22
|
+
// TODO(ctiller): When removing this file, also reduce the number of *'s on the
|
23
|
+
// server initial metadata latch.
|
24
|
+
|
22
25
|
#include <grpc/support/port_platform.h>
|
23
26
|
|
24
27
|
#include <stdint.h>
|
25
28
|
#include <stdlib.h>
|
26
29
|
|
27
30
|
#include <atomic>
|
31
|
+
#include <memory>
|
28
32
|
#include <new>
|
33
|
+
#include <string>
|
29
34
|
#include <utility>
|
30
35
|
|
31
36
|
#include "absl/container/inlined_vector.h"
|
32
37
|
#include "absl/meta/type_traits.h"
|
38
|
+
#include "absl/status/status.h"
|
39
|
+
#include "absl/strings/string_view.h"
|
40
|
+
#include "absl/types/optional.h"
|
33
41
|
|
42
|
+
#include <grpc/event_engine/event_engine.h>
|
34
43
|
#include <grpc/impl/codegen/grpc_types.h>
|
35
44
|
#include <grpc/support/log.h>
|
36
45
|
|
@@ -39,6 +48,7 @@
|
|
39
48
|
#include "src/core/lib/channel/channel_fwd.h"
|
40
49
|
#include "src/core/lib/channel/channel_stack.h"
|
41
50
|
#include "src/core/lib/channel/context.h"
|
51
|
+
#include "src/core/lib/event_engine/default_event_engine.h" // IWYU pragma: keep
|
42
52
|
#include "src/core/lib/gprpp/debug_location.h"
|
43
53
|
#include "src/core/lib/gprpp/time.h"
|
44
54
|
#include "src/core/lib/iomgr/call_combiner.h"
|
@@ -50,8 +60,10 @@
|
|
50
60
|
#include "src/core/lib/promise/arena_promise.h"
|
51
61
|
#include "src/core/lib/promise/context.h"
|
52
62
|
#include "src/core/lib/promise/latch.h"
|
63
|
+
#include "src/core/lib/promise/pipe.h"
|
53
64
|
#include "src/core/lib/promise/poll.h"
|
54
65
|
#include "src/core/lib/resource_quota/arena.h"
|
66
|
+
#include "src/core/lib/slice/slice_buffer.h"
|
55
67
|
#include "src/core/lib/transport/error_utils.h"
|
56
68
|
#include "src/core/lib/transport/metadata_batch.h"
|
57
69
|
#include "src/core/lib/transport/transport.h"
|
@@ -99,6 +111,16 @@ class ChannelFilter {
|
|
99
111
|
virtual bool GetChannelInfo(const grpc_channel_info*) { return false; }
|
100
112
|
|
101
113
|
virtual ~ChannelFilter() = default;
|
114
|
+
|
115
|
+
grpc_event_engine::experimental::EventEngine*
|
116
|
+
hack_until_per_channel_stack_event_engines_land_get_event_engine() {
|
117
|
+
return event_engine_.get();
|
118
|
+
}
|
119
|
+
|
120
|
+
private:
|
121
|
+
// TODO(ctiller): remove once per-channel-stack event engines land
|
122
|
+
std::shared_ptr<grpc_event_engine::experimental::EventEngine> event_engine_ =
|
123
|
+
grpc_event_engine::experimental::GetDefaultEventEngine();
|
102
124
|
};
|
103
125
|
|
104
126
|
// Designator for whether a filter is client side or server side.
|
@@ -112,6 +134,8 @@ enum class FilterEndpoint {
|
|
112
134
|
// Flags for MakePromiseBasedFilter.
|
113
135
|
static constexpr uint8_t kFilterExaminesServerInitialMetadata = 1;
|
114
136
|
static constexpr uint8_t kFilterIsLast = 2;
|
137
|
+
static constexpr uint8_t kFilterExaminesOutboundMessages = 4;
|
138
|
+
static constexpr uint8_t kFilterExaminesInboundMessages = 8;
|
115
139
|
|
116
140
|
namespace promise_filter_detail {
|
117
141
|
|
@@ -142,16 +166,22 @@ class BaseCallData : public Activity, private Wakeable {
|
|
142
166
|
Waker MakeNonOwningWaker() final;
|
143
167
|
Waker MakeOwningWaker() final;
|
144
168
|
|
169
|
+
std::string ActivityDebugTag() const override { return DebugTag(); }
|
170
|
+
|
145
171
|
void Finalize(const grpc_call_final_info* final_info) {
|
146
172
|
finalization_.Run(final_info);
|
147
173
|
}
|
148
174
|
|
175
|
+
virtual void StartBatch(grpc_transport_stream_op_batch* batch) = 0;
|
176
|
+
|
149
177
|
protected:
|
150
178
|
class ScopedContext
|
151
179
|
: public promise_detail::Context<Arena>,
|
152
180
|
public promise_detail::Context<grpc_call_context_element>,
|
153
181
|
public promise_detail::Context<grpc_polling_entity>,
|
154
|
-
public promise_detail::Context<CallFinalization
|
182
|
+
public promise_detail::Context<CallFinalization>,
|
183
|
+
public promise_detail::Context<
|
184
|
+
grpc_event_engine::experimental::EventEngine> {
|
155
185
|
public:
|
156
186
|
explicit ScopedContext(BaseCallData* call_data)
|
157
187
|
: promise_detail::Context<Arena>(call_data->arena_),
|
@@ -159,8 +189,9 @@ class BaseCallData : public Activity, private Wakeable {
|
|
159
189
|
call_data->context_),
|
160
190
|
promise_detail::Context<grpc_polling_entity>(
|
161
191
|
call_data->pollent_.load(std::memory_order_acquire)),
|
162
|
-
promise_detail::Context<CallFinalization>(&call_data->finalization_)
|
163
|
-
|
192
|
+
promise_detail::Context<CallFinalization>(&call_data->finalization_),
|
193
|
+
promise_detail::Context<grpc_event_engine::experimental::EventEngine>(
|
194
|
+
call_data->event_engine_) {}
|
164
195
|
};
|
165
196
|
|
166
197
|
class Flusher {
|
@@ -181,7 +212,7 @@ class BaseCallData : public Activity, private Wakeable {
|
|
181
212
|
}
|
182
213
|
|
183
214
|
void Complete(grpc_transport_stream_op_batch* batch) {
|
184
|
-
call_closures_.Add(batch->on_complete,
|
215
|
+
call_closures_.Add(batch->on_complete, absl::OkStatus(),
|
185
216
|
"Flusher::Complete");
|
186
217
|
}
|
187
218
|
|
@@ -227,16 +258,170 @@ class BaseCallData : public Activity, private Wakeable {
|
|
227
258
|
grpc_transport_stream_op_batch* batch_;
|
228
259
|
};
|
229
260
|
|
230
|
-
static
|
261
|
+
static Arena::PoolPtr<grpc_metadata_batch> WrapMetadata(
|
231
262
|
grpc_metadata_batch* p) {
|
232
|
-
return
|
263
|
+
return Arena::PoolPtr<grpc_metadata_batch>(p,
|
264
|
+
Arena::PooledDeleter(nullptr));
|
233
265
|
}
|
234
266
|
|
235
267
|
static grpc_metadata_batch* UnwrapMetadata(
|
236
|
-
|
237
|
-
return p.
|
268
|
+
Arena::PoolPtr<grpc_metadata_batch> p) {
|
269
|
+
return p.release();
|
238
270
|
}
|
239
271
|
|
272
|
+
// State machine for sending messages: handles intercepting send_message ops
|
273
|
+
// and forwarding them through pipes to the promise, then getting the result
|
274
|
+
// down the stack.
|
275
|
+
// Split into its own class so that we don't spend the memory instantiating
|
276
|
+
// these members for filters that don't need to intercept sent messages.
|
277
|
+
class SendMessage {
|
278
|
+
public:
|
279
|
+
explicit SendMessage(BaseCallData* base)
|
280
|
+
: base_(base), pipe_(base->arena()) {}
|
281
|
+
PipeReceiver<MessageHandle>* outgoing_pipe() { return &pipe_.receiver; }
|
282
|
+
|
283
|
+
// Start a send_message op.
|
284
|
+
void StartOp(CapturedBatch batch);
|
285
|
+
// Publish the outbound pipe to the filter.
|
286
|
+
// This happens when the promise requests to call the next filter: until
|
287
|
+
// this occurs messages can't be sent as we don't know the pipe that the
|
288
|
+
// promise expects to send on.
|
289
|
+
void GotPipe(PipeReceiver<MessageHandle>* receiver);
|
290
|
+
// Called from client/server polling to do the send message part of the
|
291
|
+
// work.
|
292
|
+
void WakeInsideCombiner(Flusher* flusher);
|
293
|
+
// Call is completed, we have trailing metadata. Close things out.
|
294
|
+
void Done(const ServerMetadata& metadata);
|
295
|
+
// Return true if we have a batch captured (for debug logs)
|
296
|
+
bool HaveCapturedBatch() const { return batch_.is_captured(); }
|
297
|
+
// Return true if we're not actively sending a message.
|
298
|
+
bool IsIdle() const;
|
299
|
+
|
300
|
+
private:
|
301
|
+
enum class State : uint8_t {
|
302
|
+
// Starting state: no batch started, no outgoing pipe configured.
|
303
|
+
kInitial,
|
304
|
+
// We have an outgoing pipe, but no batch started.
|
305
|
+
// (this is the steady state).
|
306
|
+
kIdle,
|
307
|
+
// We have a batch started, but no outgoing pipe configured.
|
308
|
+
// Stall until we have one.
|
309
|
+
kGotBatchNoPipe,
|
310
|
+
// We have a batch, and an outgoing pipe. On the next poll we'll push the
|
311
|
+
// message into the pipe to the promise.
|
312
|
+
kGotBatch,
|
313
|
+
// We've pushed a message into the promise, and we're now waiting for it
|
314
|
+
// to pop out the other end so we can forward it down the stack.
|
315
|
+
kPushedToPipe,
|
316
|
+
// We've forwarded a message down the stack, and now we're waiting for
|
317
|
+
// completion.
|
318
|
+
kForwardedBatch,
|
319
|
+
// We've got the completion callback, we'll close things out during poll
|
320
|
+
// and then forward completion callbacks up and transition back to idle.
|
321
|
+
kBatchCompleted,
|
322
|
+
// We're done.
|
323
|
+
kCancelled,
|
324
|
+
};
|
325
|
+
static const char* StateString(State);
|
326
|
+
|
327
|
+
void OnComplete(absl::Status status);
|
328
|
+
|
329
|
+
BaseCallData* const base_;
|
330
|
+
State state_ = State::kInitial;
|
331
|
+
Pipe<MessageHandle> pipe_;
|
332
|
+
PipeReceiver<MessageHandle>* receiver_ = nullptr;
|
333
|
+
absl::optional<PipeSender<MessageHandle>::PushType> push_;
|
334
|
+
absl::optional<PipeReceiver<MessageHandle>::NextType> next_;
|
335
|
+
absl::optional<NextResult<MessageHandle>> next_result_;
|
336
|
+
CapturedBatch batch_;
|
337
|
+
grpc_closure* intercepted_on_complete_;
|
338
|
+
grpc_closure on_complete_ =
|
339
|
+
MakeMemberClosure<SendMessage, &SendMessage::OnComplete>(this);
|
340
|
+
absl::Status completed_status_;
|
341
|
+
};
|
342
|
+
|
343
|
+
// State machine for receiving messages: handles intercepting recv_message
|
344
|
+
// ops, forwarding them down the stack, and then publishing the result via
|
345
|
+
// pipes to the promise (and ultimately calling the right callbacks for the
|
346
|
+
// batch when our promise has completed processing of them).
|
347
|
+
// Split into its own class so that we don't spend the memory instantiating
|
348
|
+
// these members for filters that don't need to intercept sent messages.
|
349
|
+
class ReceiveMessage {
|
350
|
+
public:
|
351
|
+
explicit ReceiveMessage(BaseCallData* base)
|
352
|
+
: base_(base), pipe_(base->arena()) {}
|
353
|
+
PipeSender<MessageHandle>* incoming_pipe() { return &pipe_.sender; }
|
354
|
+
|
355
|
+
// Start a recv_message op.
|
356
|
+
void StartOp(CapturedBatch& batch);
|
357
|
+
// Publish the inbound pipe to the filter.
|
358
|
+
// This happens when the promise requests to call the next filter: until
|
359
|
+
// this occurs messages can't be received as we don't know the pipe that the
|
360
|
+
// promise expects to forward them with.
|
361
|
+
void GotPipe(PipeSender<MessageHandle>* sender);
|
362
|
+
// Called from client/server polling to do the receive message part of the
|
363
|
+
// work.
|
364
|
+
void WakeInsideCombiner(Flusher* flusher);
|
365
|
+
// Call is completed, we have trailing metadata. Close things out.
|
366
|
+
void Done(const ServerMetadata& metadata, Flusher* flusher);
|
367
|
+
|
368
|
+
private:
|
369
|
+
enum class State : uint8_t {
|
370
|
+
// Starting state: no batch started, no incoming pipe configured.
|
371
|
+
kInitial,
|
372
|
+
// We have an incoming pipe, but no batch started.
|
373
|
+
// (this is the steady state).
|
374
|
+
kIdle,
|
375
|
+
// We received a batch and forwarded it on, but have not got an incoming
|
376
|
+
// pipe configured.
|
377
|
+
kForwardedBatchNoPipe,
|
378
|
+
// We received a batch and forwarded it on.
|
379
|
+
kForwardedBatch,
|
380
|
+
// We got the completion for the recv_message, but we don't yet have a
|
381
|
+
// pipe configured. Stall until this changes.
|
382
|
+
kBatchCompletedNoPipe,
|
383
|
+
// We got the completion for the recv_message, and we have a pipe
|
384
|
+
// configured: next poll will push the message into the pipe for the
|
385
|
+
// filter to process.
|
386
|
+
kBatchCompleted,
|
387
|
+
// We've pushed a message into the promise, and we're now waiting for it
|
388
|
+
// to pop out the other end so we can forward it up the stack.
|
389
|
+
kPushedToPipe,
|
390
|
+
// We've got a message out of the pipe, now we need to wait for processing
|
391
|
+
// to completely quiesce in the promise prior to forwarding the completion
|
392
|
+
// up the stack.
|
393
|
+
kPulledFromPipe,
|
394
|
+
// We're done.
|
395
|
+
kCancelled,
|
396
|
+
// Call got terminated whilst we had forwarded a recv_message down the
|
397
|
+
// stack: we need to keep track of that until we get the completion so
|
398
|
+
// that we do the right thing in OnComplete.
|
399
|
+
kCancelledWhilstForwarding,
|
400
|
+
// Call got terminated whilst we had a recv_message batch completed, and
|
401
|
+
// we've now received the completion.
|
402
|
+
// On the next poll we'll close things out and forward on completions,
|
403
|
+
// then transition to cancelled.
|
404
|
+
kBatchCompletedButCancelled,
|
405
|
+
};
|
406
|
+
static const char* StateString(State);
|
407
|
+
|
408
|
+
void OnComplete(absl::Status status);
|
409
|
+
|
410
|
+
BaseCallData* const base_;
|
411
|
+
Pipe<MessageHandle> pipe_;
|
412
|
+
PipeSender<MessageHandle>* sender_;
|
413
|
+
State state_ = State::kInitial;
|
414
|
+
uint32_t scratch_flags_;
|
415
|
+
absl::optional<SliceBuffer>* intercepted_slice_buffer_;
|
416
|
+
uint32_t* intercepted_flags_;
|
417
|
+
absl::optional<PipeSender<MessageHandle>::PushType> push_;
|
418
|
+
absl::optional<PipeReceiver<MessageHandle>::NextType> next_;
|
419
|
+
absl::Status completed_status_;
|
420
|
+
grpc_closure* intercepted_on_complete_;
|
421
|
+
grpc_closure on_complete_ =
|
422
|
+
MakeMemberClosure<ReceiveMessage, &ReceiveMessage::OnComplete>(this);
|
423
|
+
};
|
424
|
+
|
240
425
|
Arena* arena() { return arena_; }
|
241
426
|
grpc_call_element* elem() const { return elem_; }
|
242
427
|
CallCombiner* call_combiner() const { return call_combiner_; }
|
@@ -245,12 +430,26 @@ class BaseCallData : public Activity, private Wakeable {
|
|
245
430
|
Latch<ServerMetadata*>* server_initial_metadata_latch() const {
|
246
431
|
return server_initial_metadata_latch_;
|
247
432
|
}
|
433
|
+
PipeReceiver<MessageHandle>* outgoing_messages_pipe() const {
|
434
|
+
return send_message_ == nullptr ? nullptr : send_message_->outgoing_pipe();
|
435
|
+
}
|
436
|
+
PipeSender<MessageHandle>* incoming_messages_pipe() const {
|
437
|
+
return receive_message_ == nullptr ? nullptr
|
438
|
+
: receive_message_->incoming_pipe();
|
439
|
+
}
|
440
|
+
SendMessage* send_message() const { return send_message_; }
|
441
|
+
ReceiveMessage* receive_message() const { return receive_message_; }
|
248
442
|
|
249
443
|
bool is_last() const {
|
250
444
|
return grpc_call_stack_element(call_stack_, call_stack_->count - 1) ==
|
251
445
|
elem_;
|
252
446
|
}
|
253
447
|
|
448
|
+
virtual void WakeInsideCombiner(Flusher* flusher) = 0;
|
449
|
+
|
450
|
+
virtual absl::string_view ClientOrServerString() const = 0;
|
451
|
+
std::string LogTag() const;
|
452
|
+
|
254
453
|
private:
|
255
454
|
// Wakeable implementation.
|
256
455
|
void Wakeup() final;
|
@@ -266,7 +465,10 @@ class BaseCallData : public Activity, private Wakeable {
|
|
266
465
|
CallFinalization finalization_;
|
267
466
|
grpc_call_context_element* const context_;
|
268
467
|
std::atomic<grpc_polling_entity*> pollent_{nullptr};
|
269
|
-
Latch<ServerMetadata*>* server_initial_metadata_latch_
|
468
|
+
Latch<ServerMetadata*>* const server_initial_metadata_latch_;
|
469
|
+
SendMessage* const send_message_;
|
470
|
+
ReceiveMessage* const receive_message_;
|
471
|
+
grpc_event_engine::experimental::EventEngine* event_engine_;
|
270
472
|
};
|
271
473
|
|
272
474
|
class ClientCallData : public BaseCallData {
|
@@ -278,7 +480,7 @@ class ClientCallData : public BaseCallData {
|
|
278
480
|
// Activity implementation.
|
279
481
|
void ForceImmediateRepoll() final;
|
280
482
|
// Handle one grpc_transport_stream_op_batch
|
281
|
-
void StartBatch(grpc_transport_stream_op_batch* batch);
|
483
|
+
void StartBatch(grpc_transport_stream_op_batch* batch) override;
|
282
484
|
|
283
485
|
private:
|
284
486
|
// At what stage is our handling of send initial metadata?
|
@@ -303,8 +505,8 @@ class ClientCallData : public BaseCallData {
|
|
303
505
|
kQueued,
|
304
506
|
// We've forwarded the op to the next filter.
|
305
507
|
kForwarded,
|
306
|
-
// The op has completed from below, but we haven't yet forwarded it up
|
307
|
-
// promise gets to interject and mutate it).
|
508
|
+
// The op has completed from below, but we haven't yet forwarded it up
|
509
|
+
// (the promise gets to interject and mutate it).
|
308
510
|
kComplete,
|
309
511
|
// We've called the recv_metadata_ready callback from the original
|
310
512
|
// recv_trailing_metadata op that was presented to us.
|
@@ -314,11 +516,15 @@ class ClientCallData : public BaseCallData {
|
|
314
516
|
kCancelled
|
315
517
|
};
|
316
518
|
|
519
|
+
static const char* StateString(SendInitialState);
|
520
|
+
static const char* StateString(RecvTrailingState);
|
521
|
+
std::string DebugString() const;
|
522
|
+
|
317
523
|
struct RecvInitialMetadata;
|
318
524
|
class PollContext;
|
319
525
|
|
320
526
|
// Handle cancellation.
|
321
|
-
void Cancel(grpc_error_handle error);
|
527
|
+
void Cancel(grpc_error_handle error, Flusher* flusher);
|
322
528
|
// Begin running the promise - which will ultimately take some initial
|
323
529
|
// metadata and return some trailing metadata.
|
324
530
|
void StartPromise(Flusher* flusher);
|
@@ -344,15 +550,20 @@ class ClientCallData : public BaseCallData {
|
|
344
550
|
void SetStatusFromError(grpc_metadata_batch* metadata,
|
345
551
|
grpc_error_handle error);
|
346
552
|
// Wakeup and poll the promise if appropriate.
|
347
|
-
void WakeInsideCombiner(Flusher* flusher);
|
553
|
+
void WakeInsideCombiner(Flusher* flusher) override;
|
348
554
|
void OnWakeup() override;
|
349
555
|
|
556
|
+
absl::string_view ClientOrServerString() const override { return "CLI"; }
|
557
|
+
|
350
558
|
// Contained promise
|
351
559
|
ArenaPromise<ServerMetadataHandle> promise_;
|
352
560
|
// Queued batch containing at least a send_initial_metadata op.
|
353
561
|
CapturedBatch send_initial_metadata_batch_;
|
354
562
|
// Pointer to where trailing metadata will be stored.
|
355
563
|
grpc_metadata_batch* recv_trailing_metadata_ = nullptr;
|
564
|
+
// Trailing metadata as returned by the promise, if we hadn't received
|
565
|
+
// trailing metadata from below yet (so we can substitute it in).
|
566
|
+
ServerMetadataHandle cancelling_metadata_;
|
356
567
|
// State tracking recv initial metadata for filters that care about it.
|
357
568
|
RecvInitialMetadata* recv_initial_metadata_ = nullptr;
|
358
569
|
// Closure to call when we're done with the trailing metadata.
|
@@ -360,7 +571,7 @@ class ClientCallData : public BaseCallData {
|
|
360
571
|
// Our closure pointing to RecvTrailingMetadataReadyCallback.
|
361
572
|
grpc_closure recv_trailing_metadata_ready_;
|
362
573
|
// Error received during cancellation.
|
363
|
-
grpc_error_handle cancelled_error_
|
574
|
+
grpc_error_handle cancelled_error_;
|
364
575
|
// State of the send_initial_metadata op.
|
365
576
|
SendInitialState send_initial_state_ = SendInitialState::kInitial;
|
366
577
|
// State of the recv_trailing_metadata op.
|
@@ -378,7 +589,10 @@ class ServerCallData : public BaseCallData {
|
|
378
589
|
// Activity implementation.
|
379
590
|
void ForceImmediateRepoll() final;
|
380
591
|
// Handle one grpc_transport_stream_op_batch
|
381
|
-
void StartBatch(grpc_transport_stream_op_batch* batch);
|
592
|
+
void StartBatch(grpc_transport_stream_op_batch* batch) override;
|
593
|
+
|
594
|
+
protected:
|
595
|
+
absl::string_view ClientOrServerString() const override { return "SVR"; }
|
382
596
|
|
383
597
|
private:
|
384
598
|
// At what stage is our handling of recv initial metadata?
|
@@ -398,6 +612,10 @@ class ServerCallData : public BaseCallData {
|
|
398
612
|
enum class SendTrailingState {
|
399
613
|
// Start state: no op seen
|
400
614
|
kInitial,
|
615
|
+
// We saw the op, but it was with a send message op (or one was in progress)
|
616
|
+
// - so we'll wait for that to complete before processing the trailing
|
617
|
+
// metadata.
|
618
|
+
kQueuedBehindSendMessage,
|
401
619
|
// We saw the op, and are waiting for the promise to complete
|
402
620
|
// to forward it.
|
403
621
|
kQueued,
|
@@ -407,11 +625,15 @@ class ServerCallData : public BaseCallData {
|
|
407
625
|
kCancelled
|
408
626
|
};
|
409
627
|
|
628
|
+
static const char* StateString(RecvInitialState state);
|
629
|
+
static const char* StateString(SendTrailingState state);
|
630
|
+
std::string DebugString() const;
|
631
|
+
|
410
632
|
class PollContext;
|
411
633
|
struct SendInitialMetadata;
|
412
634
|
|
413
|
-
//
|
414
|
-
void
|
635
|
+
// Shut things down when the call completes.
|
636
|
+
void Completed(grpc_error_handle error, Flusher* flusher);
|
415
637
|
// Construct a promise that will "call" the next filter.
|
416
638
|
// Effectively:
|
417
639
|
// - put the modified initial metadata into the batch being sent up.
|
@@ -424,22 +646,31 @@ class ServerCallData : public BaseCallData {
|
|
424
646
|
static void RecvInitialMetadataReadyCallback(void* arg,
|
425
647
|
grpc_error_handle error);
|
426
648
|
void RecvInitialMetadataReady(grpc_error_handle error);
|
649
|
+
static void RecvTrailingMetadataReadyCallback(void* arg,
|
650
|
+
grpc_error_handle error);
|
651
|
+
void RecvTrailingMetadataReady(grpc_error_handle error);
|
427
652
|
// Wakeup and poll the promise if appropriate.
|
428
|
-
void WakeInsideCombiner(Flusher* flusher);
|
653
|
+
void WakeInsideCombiner(Flusher* flusher) override;
|
429
654
|
void OnWakeup() override;
|
430
655
|
|
431
656
|
// Contained promise
|
432
657
|
ArenaPromise<ServerMetadataHandle> promise_;
|
433
658
|
// Pointer to where initial metadata will be stored.
|
434
659
|
grpc_metadata_batch* recv_initial_metadata_ = nullptr;
|
660
|
+
// Pointer to where trailing metadata will be stored.
|
661
|
+
grpc_metadata_batch* recv_trailing_metadata_ = nullptr;
|
435
662
|
// State for sending initial metadata.
|
436
663
|
SendInitialMetadata* send_initial_metadata_ = nullptr;
|
437
|
-
// Closure to call when we're done with the
|
664
|
+
// Closure to call when we're done with the initial metadata.
|
438
665
|
grpc_closure* original_recv_initial_metadata_ready_ = nullptr;
|
439
666
|
// Our closure pointing to RecvInitialMetadataReadyCallback.
|
440
667
|
grpc_closure recv_initial_metadata_ready_;
|
668
|
+
// Closure to call when we're done with the trailing metadata.
|
669
|
+
grpc_closure* original_recv_trailing_metadata_ready_ = nullptr;
|
670
|
+
// Our closure pointing to RecvTrailingMetadataReadyCallback.
|
671
|
+
grpc_closure recv_trailing_metadata_ready_;
|
441
672
|
// Error received during cancellation.
|
442
|
-
grpc_error_handle cancelled_error_
|
673
|
+
grpc_error_handle cancelled_error_;
|
443
674
|
// Trailing metadata batch
|
444
675
|
CapturedBatch send_trailing_metadata_batch_;
|
445
676
|
// State of the send_initial_metadata op.
|
@@ -456,23 +687,116 @@ class ServerCallData : public BaseCallData {
|
|
456
687
|
// Specific call data per channel filter.
|
457
688
|
// Note that we further specialize for clients and servers since their
|
458
689
|
// implementations are very different.
|
459
|
-
template <
|
690
|
+
template <FilterEndpoint endpoint>
|
460
691
|
class CallData;
|
461
692
|
|
462
693
|
// Client implementation of call data.
|
463
|
-
template
|
464
|
-
class CallData<
|
694
|
+
template <>
|
695
|
+
class CallData<FilterEndpoint::kClient> : public ClientCallData {
|
465
696
|
public:
|
466
697
|
using ClientCallData::ClientCallData;
|
467
698
|
};
|
468
699
|
|
469
700
|
// Server implementation of call data.
|
470
|
-
template
|
471
|
-
class CallData<
|
701
|
+
template <>
|
702
|
+
class CallData<FilterEndpoint::kServer> : public ServerCallData {
|
472
703
|
public:
|
473
704
|
using ServerCallData::ServerCallData;
|
474
705
|
};
|
475
706
|
|
707
|
+
struct BaseCallDataMethods {
|
708
|
+
static void SetPollsetOrPollsetSet(grpc_call_element* elem,
|
709
|
+
grpc_polling_entity* pollent) {
|
710
|
+
static_cast<BaseCallData*>(elem->call_data)->set_pollent(pollent);
|
711
|
+
}
|
712
|
+
|
713
|
+
static void DestructCallData(grpc_call_element* elem,
|
714
|
+
const grpc_call_final_info* final_info) {
|
715
|
+
auto* cd = static_cast<BaseCallData*>(elem->call_data);
|
716
|
+
cd->Finalize(final_info);
|
717
|
+
cd->~BaseCallData();
|
718
|
+
}
|
719
|
+
|
720
|
+
static void StartTransportStreamOpBatch(
|
721
|
+
grpc_call_element* elem, grpc_transport_stream_op_batch* batch) {
|
722
|
+
static_cast<BaseCallData*>(elem->call_data)->StartBatch(batch);
|
723
|
+
}
|
724
|
+
};
|
725
|
+
|
726
|
+
template <typename CallData, uint8_t kFlags>
|
727
|
+
struct CallDataFilterWithFlagsMethods {
|
728
|
+
static absl::Status InitCallElem(grpc_call_element* elem,
|
729
|
+
const grpc_call_element_args* args) {
|
730
|
+
new (elem->call_data) CallData(elem, args, kFlags);
|
731
|
+
return absl::OkStatus();
|
732
|
+
}
|
733
|
+
|
734
|
+
static void DestroyCallElem(grpc_call_element* elem,
|
735
|
+
const grpc_call_final_info* final_info,
|
736
|
+
grpc_closure* then_schedule_closure) {
|
737
|
+
BaseCallDataMethods::DestructCallData(elem, final_info);
|
738
|
+
if ((kFlags & kFilterIsLast) != 0) {
|
739
|
+
ExecCtx::Run(DEBUG_LOCATION, then_schedule_closure, absl::OkStatus());
|
740
|
+
} else {
|
741
|
+
GPR_ASSERT(then_schedule_closure == nullptr);
|
742
|
+
}
|
743
|
+
}
|
744
|
+
};
|
745
|
+
|
746
|
+
struct ChannelFilterMethods {
|
747
|
+
static ArenaPromise<ServerMetadataHandle> MakeCallPromise(
|
748
|
+
grpc_channel_element* elem, CallArgs call_args,
|
749
|
+
NextPromiseFactory next_promise_factory) {
|
750
|
+
return static_cast<ChannelFilter*>(elem->channel_data)
|
751
|
+
->MakeCallPromise(std::move(call_args),
|
752
|
+
std::move(next_promise_factory));
|
753
|
+
}
|
754
|
+
|
755
|
+
static void StartTransportOp(grpc_channel_element* elem,
|
756
|
+
grpc_transport_op* op) {
|
757
|
+
if (!static_cast<ChannelFilter*>(elem->channel_data)
|
758
|
+
->StartTransportOp(op)) {
|
759
|
+
grpc_channel_next_op(elem, op);
|
760
|
+
}
|
761
|
+
}
|
762
|
+
|
763
|
+
static void PostInitChannelElem(grpc_channel_stack*,
|
764
|
+
grpc_channel_element* elem) {
|
765
|
+
static_cast<ChannelFilter*>(elem->channel_data)->PostInit();
|
766
|
+
}
|
767
|
+
|
768
|
+
static void DestroyChannelElem(grpc_channel_element* elem) {
|
769
|
+
static_cast<ChannelFilter*>(elem->channel_data)->~ChannelFilter();
|
770
|
+
}
|
771
|
+
|
772
|
+
static void GetChannelInfo(grpc_channel_element* elem,
|
773
|
+
const grpc_channel_info* info) {
|
774
|
+
if (!static_cast<ChannelFilter*>(elem->channel_data)
|
775
|
+
->GetChannelInfo(info)) {
|
776
|
+
grpc_channel_next_get_info(elem, info);
|
777
|
+
}
|
778
|
+
}
|
779
|
+
};
|
780
|
+
|
781
|
+
template <typename F, uint8_t kFlags>
|
782
|
+
struct ChannelFilterWithFlagsMethods {
|
783
|
+
static absl::Status InitChannelElem(grpc_channel_element* elem,
|
784
|
+
grpc_channel_element_args* args) {
|
785
|
+
GPR_ASSERT(args->is_last == ((kFlags & kFilterIsLast) != 0));
|
786
|
+
auto status = F::Create(ChannelArgs::FromC(args->channel_args),
|
787
|
+
ChannelFilter::Args(args->channel_stack, elem));
|
788
|
+
if (!status.ok()) {
|
789
|
+
static_assert(
|
790
|
+
sizeof(promise_filter_detail::InvalidChannelFilter) <= sizeof(F),
|
791
|
+
"InvalidChannelFilter must fit in F");
|
792
|
+
new (elem->channel_data) promise_filter_detail::InvalidChannelFilter();
|
793
|
+
return absl_status_to_grpc_error(status.status());
|
794
|
+
}
|
795
|
+
new (elem->channel_data) F(std::move(*status));
|
796
|
+
return absl::OkStatus();
|
797
|
+
}
|
798
|
+
};
|
799
|
+
|
476
800
|
} // namespace promise_filter_detail
|
477
801
|
|
478
802
|
// F implements ChannelFilter and :
|
@@ -484,83 +808,36 @@ class CallData<ChannelFilter, FilterEndpoint::kServer> : public ServerCallData {
|
|
484
808
|
template <typename F, FilterEndpoint kEndpoint, uint8_t kFlags = 0>
|
485
809
|
absl::enable_if_t<std::is_base_of<ChannelFilter, F>::value, grpc_channel_filter>
|
486
810
|
MakePromiseBasedFilter(const char* name) {
|
487
|
-
using CallData = promise_filter_detail::CallData<
|
811
|
+
using CallData = promise_filter_detail::CallData<kEndpoint>;
|
488
812
|
|
489
813
|
return grpc_channel_filter{
|
490
814
|
// start_transport_stream_op_batch
|
491
|
-
|
492
|
-
static_cast<CallData*>(elem->call_data)->StartBatch(batch);
|
493
|
-
},
|
815
|
+
promise_filter_detail::BaseCallDataMethods::StartTransportStreamOpBatch,
|
494
816
|
// make_call_promise
|
495
|
-
|
496
|
-
NextPromiseFactory next_promise_factory) {
|
497
|
-
return static_cast<ChannelFilter*>(elem->channel_data)
|
498
|
-
->MakeCallPromise(std::move(call_args),
|
499
|
-
std::move(next_promise_factory));
|
500
|
-
},
|
817
|
+
promise_filter_detail::ChannelFilterMethods::MakeCallPromise,
|
501
818
|
// start_transport_op
|
502
|
-
|
503
|
-
if (!static_cast<ChannelFilter*>(elem->channel_data)
|
504
|
-
->StartTransportOp(op)) {
|
505
|
-
grpc_channel_next_op(elem, op);
|
506
|
-
}
|
507
|
-
},
|
819
|
+
promise_filter_detail::ChannelFilterMethods::StartTransportOp,
|
508
820
|
// sizeof_call_data
|
509
821
|
sizeof(CallData),
|
510
822
|
// init_call_elem
|
511
|
-
|
512
|
-
|
513
|
-
return GRPC_ERROR_NONE;
|
514
|
-
},
|
823
|
+
promise_filter_detail::CallDataFilterWithFlagsMethods<
|
824
|
+
CallData, kFlags>::InitCallElem,
|
515
825
|
// set_pollset_or_pollset_set
|
516
|
-
|
517
|
-
static_cast<CallData*>(elem->call_data)->set_pollent(pollent);
|
518
|
-
},
|
826
|
+
promise_filter_detail::BaseCallDataMethods::SetPollsetOrPollsetSet,
|
519
827
|
// destroy_call_elem
|
520
|
-
|
521
|
-
|
522
|
-
auto* cd = static_cast<CallData*>(elem->call_data);
|
523
|
-
cd->Finalize(final_info);
|
524
|
-
cd->~CallData();
|
525
|
-
if ((kFlags & kFilterIsLast) != 0) {
|
526
|
-
ExecCtx::Run(DEBUG_LOCATION, then_schedule_closure, GRPC_ERROR_NONE);
|
527
|
-
} else {
|
528
|
-
GPR_ASSERT(then_schedule_closure == nullptr);
|
529
|
-
}
|
530
|
-
},
|
828
|
+
promise_filter_detail::CallDataFilterWithFlagsMethods<
|
829
|
+
CallData, kFlags>::DestroyCallElem,
|
531
830
|
// sizeof_channel_data
|
532
831
|
sizeof(F),
|
533
832
|
// init_channel_elem
|
534
|
-
|
535
|
-
|
536
|
-
auto status = F::Create(ChannelArgs::FromC(args->channel_args),
|
537
|
-
ChannelFilter::Args(args->channel_stack, elem));
|
538
|
-
if (!status.ok()) {
|
539
|
-
static_assert(
|
540
|
-
sizeof(promise_filter_detail::InvalidChannelFilter) <= sizeof(F),
|
541
|
-
"InvalidChannelFilter must fit in F");
|
542
|
-
new (elem->channel_data)
|
543
|
-
promise_filter_detail::InvalidChannelFilter();
|
544
|
-
return absl_status_to_grpc_error(status.status());
|
545
|
-
}
|
546
|
-
new (elem->channel_data) F(std::move(*status));
|
547
|
-
return GRPC_ERROR_NONE;
|
548
|
-
},
|
833
|
+
promise_filter_detail::ChannelFilterWithFlagsMethods<
|
834
|
+
F, kFlags>::InitChannelElem,
|
549
835
|
// post_init_channel_elem
|
550
|
-
|
551
|
-
static_cast<ChannelFilter*>(elem->channel_data)->PostInit();
|
552
|
-
},
|
836
|
+
promise_filter_detail::ChannelFilterMethods::PostInitChannelElem,
|
553
837
|
// destroy_channel_elem
|
554
|
-
|
555
|
-
static_cast<ChannelFilter*>(elem->channel_data)->~ChannelFilter();
|
556
|
-
},
|
838
|
+
promise_filter_detail::ChannelFilterMethods::DestroyChannelElem,
|
557
839
|
// get_channel_info
|
558
|
-
|
559
|
-
if (!static_cast<ChannelFilter*>(elem->channel_data)
|
560
|
-
->GetChannelInfo(info)) {
|
561
|
-
grpc_channel_next_get_info(elem, info);
|
562
|
-
}
|
563
|
-
},
|
840
|
+
promise_filter_detail::ChannelFilterMethods::GetChannelInfo,
|
564
841
|
// name
|
565
842
|
name,
|
566
843
|
};
|