grpc 1.60.2 → 1.61.0.pre2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Makefile +208 -165
- data/include/grpc/event_engine/event_engine.h +59 -12
- data/include/grpc/event_engine/internal/memory_allocator_impl.h +6 -0
- data/include/grpc/event_engine/internal/slice_cast.h +12 -0
- data/include/grpc/event_engine/memory_allocator.h +3 -1
- data/include/grpc/event_engine/slice.h +5 -0
- data/include/grpc/grpc_security.h +22 -1
- data/include/grpc/impl/call.h +29 -0
- data/include/grpc/impl/channel_arg_names.h +12 -1
- data/include/grpc/impl/slice_type.h +1 -1
- data/include/grpc/module.modulemap +1 -0
- data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +54 -7
- data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +20 -6
- data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +10 -13
- data/src/core/ext/filters/channel_idle/channel_idle_filter.h +18 -10
- data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +326 -0
- data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h +143 -0
- data/src/core/ext/filters/client_channel/backend_metric.cc +2 -2
- data/src/core/ext/filters/client_channel/client_channel.cc +32 -6
- data/src/core/ext/filters/client_channel/client_channel_internal.h +2 -0
- data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +54 -21
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +3 -2
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +2 -1
- data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.cc +12 -15
- data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.h +8 -5
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +139 -92
- data/src/core/ext/filters/client_channel/lb_policy/health_check_client.cc +9 -4
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +9 -4
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +10 -11
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +94 -93
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +5 -3
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +12 -15
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +38 -16
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +25 -28
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +10 -10
- data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +37 -35
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +11 -9
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +504 -461
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +232 -122
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -6
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +642 -251
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.h +2 -6
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +7 -8
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +2 -1
- data/src/core/ext/filters/client_channel/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +3 -1
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +2 -2
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +2 -2
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +6 -8
- data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.cc +1031 -0
- data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.h +277 -0
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +128 -270
- data/src/core/ext/filters/client_channel/resolver/xds/{xds_resolver.h → xds_resolver_attributes.h} +5 -4
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.cc +25 -0
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.h +30 -0
- data/src/core/ext/filters/client_channel/retry_filter.cc +1 -0
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +35 -17
- data/src/core/ext/filters/deadline/deadline_filter.cc +12 -0
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +17 -13
- data/src/core/ext/filters/fault_injection/fault_injection_filter.h +13 -4
- data/src/core/ext/filters/http/client/http_client_filter.cc +23 -32
- data/src/core/ext/filters/http/client/http_client_filter.h +10 -5
- data/src/core/ext/filters/http/client_authority_filter.cc +14 -14
- data/src/core/ext/filters/http/client_authority_filter.h +12 -4
- data/src/core/ext/filters/http/http_filters_plugin.cc +42 -20
- data/src/core/ext/filters/http/message_compress/compression_filter.cc +55 -80
- data/src/core/ext/filters/http/message_compress/compression_filter.h +54 -12
- data/src/core/ext/filters/http/message_compress/legacy_compression_filter.cc +325 -0
- data/src/core/ext/filters/http/message_compress/legacy_compression_filter.h +139 -0
- data/src/core/ext/filters/http/server/http_server_filter.cc +41 -41
- data/src/core/ext/filters/http/server/http_server_filter.h +11 -4
- data/src/core/ext/filters/message_size/message_size_filter.cc +56 -76
- data/src/core/ext/filters/message_size/message_size_filter.h +35 -23
- data/src/core/ext/filters/rbac/rbac_filter.cc +15 -11
- data/src/core/ext/filters/rbac/rbac_filter.h +11 -4
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +25 -13
- data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +47 -50
- data/src/core/ext/filters/stateful_session/stateful_session_filter.h +21 -4
- data/src/core/ext/transport/chttp2/alpn/alpn.cc +1 -1
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -2
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +11 -2
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +68 -145
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -3
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +21 -82
- data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -8
- data/src/core/ext/transport/chttp2/transport/frame.cc +506 -0
- data/src/core/ext/transport/chttp2/transport/frame.h +214 -0
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +33 -79
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +4 -7
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +27 -36
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +0 -2
- data/src/core/ext/transport/chttp2/transport/http2_settings.cc +122 -32
- data/src/core/ext/transport/chttp2/transport/http2_settings.h +142 -37
- data/src/core/ext/transport/chttp2/transport/internal.h +1 -22
- data/src/core/ext/transport/chttp2/transport/parsing.cc +23 -37
- data/src/core/ext/transport/chttp2/transport/writing.cc +26 -58
- data/src/core/ext/transport/inproc/inproc_transport.cc +172 -13
- data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb.h +712 -0
- data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.c +151 -0
- data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.h +33 -0
- data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.c +133 -0
- data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.h +50 -0
- data/src/core/ext/xds/certificate_provider_store.cc +2 -1
- data/src/core/ext/xds/certificate_provider_store.h +0 -5
- data/src/core/ext/xds/xds_api.cc +31 -18
- data/src/core/ext/xds/xds_api.h +2 -2
- data/src/core/ext/xds/xds_bootstrap.h +3 -0
- data/src/core/ext/xds/xds_certificate_provider.cc +88 -287
- data/src/core/ext/xds/xds_certificate_provider.h +44 -111
- data/src/core/ext/xds/xds_client.cc +420 -414
- data/src/core/ext/xds/xds_client.h +31 -22
- data/src/core/ext/xds/xds_client_grpc.cc +3 -1
- data/src/core/ext/xds/xds_cluster.cc +104 -11
- data/src/core/ext/xds/xds_cluster.h +9 -1
- data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +9 -5
- data/src/core/ext/xds/xds_common_types.cc +14 -10
- data/src/core/ext/xds/xds_endpoint.cc +9 -4
- data/src/core/ext/xds/xds_endpoint.h +5 -1
- data/src/core/ext/xds/xds_health_status.cc +12 -2
- data/src/core/ext/xds/xds_health_status.h +4 -2
- data/src/core/ext/xds/xds_http_rbac_filter.cc +5 -3
- data/src/core/ext/xds/xds_listener.cc +14 -8
- data/src/core/ext/xds/xds_resource_type_impl.h +6 -4
- data/src/core/ext/xds/xds_route_config.cc +34 -22
- data/src/core/ext/xds/xds_route_config.h +1 -0
- data/src/core/ext/xds/xds_server_config_fetcher.cc +61 -57
- data/src/core/ext/xds/xds_transport.h +3 -0
- data/src/core/ext/xds/xds_transport_grpc.cc +47 -50
- data/src/core/ext/xds/xds_transport_grpc.h +4 -0
- data/src/core/lib/channel/call_tracer.cc +12 -0
- data/src/core/lib/channel/call_tracer.h +17 -3
- data/src/core/lib/channel/channel_args.cc +24 -14
- data/src/core/lib/channel/channel_args.h +74 -13
- data/src/core/lib/channel/channel_stack.cc +27 -0
- data/src/core/lib/channel/channel_stack.h +10 -10
- data/src/core/lib/channel/connected_channel.cc +64 -18
- data/src/core/lib/channel/promise_based_filter.h +1041 -1
- data/src/core/lib/channel/server_call_tracer_filter.cc +43 -35
- data/src/core/lib/compression/compression_internal.cc +0 -3
- data/src/core/lib/event_engine/ares_resolver.cc +35 -14
- data/src/core/lib/event_engine/ares_resolver.h +9 -10
- data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +8 -1
- data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +132 -0
- data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h +61 -0
- data/src/core/lib/event_engine/posix_engine/posix_engine.cc +52 -36
- data/src/core/lib/event_engine/posix_engine/posix_engine.h +4 -9
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +11 -3
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +9 -2
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +7 -0
- data/src/core/lib/event_engine/posix_engine/timer_manager.cc +17 -27
- data/src/core/lib/event_engine/posix_engine/timer_manager.h +0 -3
- data/src/core/lib/event_engine/ref_counted_dns_resolver_interface.h +55 -0
- data/src/core/lib/event_engine/windows/native_windows_dns_resolver.cc +114 -0
- data/src/core/lib/event_engine/windows/native_windows_dns_resolver.h +51 -0
- data/src/core/lib/event_engine/windows/windows_engine.cc +7 -7
- data/src/core/lib/experiments/config.cc +13 -0
- data/src/core/lib/experiments/config.h +3 -0
- data/src/core/lib/experiments/experiments.cc +245 -366
- data/src/core/lib/experiments/experiments.h +50 -156
- data/src/core/lib/gprpp/debug_location.h +13 -0
- data/src/core/lib/gprpp/dual_ref_counted.h +36 -7
- data/src/core/lib/gprpp/orphanable.h +27 -0
- data/src/core/lib/gprpp/ref_counted.h +63 -22
- data/src/core/lib/gprpp/ref_counted_ptr.h +70 -27
- data/src/core/lib/gprpp/ref_counted_string.h +13 -0
- data/src/core/lib/gprpp/status_helper.cc +1 -2
- data/src/core/lib/iomgr/combiner.cc +15 -51
- data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +31 -0
- data/src/core/lib/iomgr/event_engine_shims/endpoint.h +16 -0
- data/src/core/lib/iomgr/tcp_client_posix.cc +4 -3
- data/src/core/lib/load_balancing/lb_policy.h +1 -1
- data/src/core/lib/promise/activity.cc +17 -2
- data/src/core/lib/promise/activity.h +5 -4
- data/src/core/lib/promise/all_ok.h +80 -0
- data/src/core/lib/promise/detail/join_state.h +2077 -0
- data/src/core/lib/promise/detail/promise_factory.h +1 -0
- data/src/core/lib/promise/detail/promise_like.h +8 -1
- data/src/core/lib/promise/detail/seq_state.h +3458 -150
- data/src/core/lib/promise/detail/status.h +42 -5
- data/src/core/lib/promise/for_each.h +13 -1
- data/src/core/lib/promise/if.h +4 -0
- data/src/core/lib/promise/latch.h +6 -3
- data/src/core/lib/promise/party.cc +33 -31
- data/src/core/lib/promise/party.h +142 -6
- data/src/core/lib/promise/poll.h +39 -13
- data/src/core/lib/promise/promise.h +4 -0
- data/src/core/lib/promise/seq.h +107 -7
- data/src/core/lib/promise/status_flag.h +196 -0
- data/src/core/lib/promise/try_join.h +132 -0
- data/src/core/lib/promise/try_seq.h +132 -10
- data/src/core/lib/resolver/endpoint_addresses.cc +0 -1
- data/src/core/lib/resolver/endpoint_addresses.h +48 -0
- data/src/core/lib/resource_quota/arena.h +2 -2
- data/src/core/lib/resource_quota/memory_quota.cc +57 -8
- data/src/core/lib/resource_quota/memory_quota.h +6 -0
- data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +14 -11
- data/src/core/lib/security/authorization/grpc_server_authz_filter.h +14 -5
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +4 -0
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +4 -0
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +28 -20
- data/src/core/lib/security/credentials/external/external_account_credentials.h +4 -0
- data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +4 -0
- data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -0
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +4 -0
- data/src/core/lib/security/credentials/external/url_external_account_credentials.h +4 -0
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -1
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +0 -3
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +12 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.cc +22 -5
- data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.h +1 -5
- data/src/core/lib/security/credentials/tls/tls_credentials.cc +16 -0
- data/src/core/lib/security/credentials/xds/xds_credentials.cc +21 -28
- data/src/core/lib/security/credentials/xds/xds_credentials.h +2 -4
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +4 -3
- data/src/core/lib/security/transport/auth_filters.h +71 -4
- data/src/core/lib/security/transport/client_auth_filter.cc +2 -4
- data/src/core/lib/security/transport/legacy_server_auth_filter.cc +244 -0
- data/src/core/lib/security/transport/server_auth_filter.cc +70 -90
- data/src/core/lib/slice/slice_buffer.h +3 -0
- data/src/core/lib/surface/builtins.cc +1 -1
- data/src/core/lib/surface/call.cc +683 -196
- data/src/core/lib/surface/call.h +26 -13
- data/src/core/lib/surface/call_trace.cc +42 -1
- data/src/core/lib/surface/channel.cc +0 -1
- data/src/core/lib/surface/channel.h +0 -6
- data/src/core/lib/surface/channel_init.h +26 -0
- data/src/core/lib/surface/init.cc +14 -8
- data/src/core/lib/surface/server.cc +256 -237
- data/src/core/lib/surface/server.h +26 -54
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/surface/wait_for_cq_end_op.h +94 -0
- data/src/core/lib/transport/call_final_info.cc +38 -0
- data/src/core/lib/transport/call_final_info.h +54 -0
- data/src/core/lib/transport/connectivity_state.cc +3 -2
- data/src/core/lib/transport/connectivity_state.h +4 -0
- data/src/core/lib/transport/metadata_batch.h +4 -4
- data/src/core/lib/transport/transport.cc +70 -19
- data/src/core/lib/transport/transport.h +395 -25
- data/src/core/plugin_registry/grpc_plugin_registry.cc +3 -0
- data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +0 -3
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
- data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -1
- data/src/core/tsi/ssl_transport_security.cc +65 -43
- data/src/ruby/ext/grpc/rb_channel_args.c +3 -1
- data/src/ruby/ext/grpc/rb_grpc.c +0 -1
- data/src/ruby/ext/grpc/rb_grpc.h +0 -2
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/third_party/upb/upb/reflection/def_pool.h +2 -2
- data/third_party/zlib/adler32.c +5 -27
- data/third_party/zlib/compress.c +5 -16
- data/third_party/zlib/crc32.c +86 -162
- data/third_party/zlib/deflate.c +233 -336
- data/third_party/zlib/deflate.h +8 -8
- data/third_party/zlib/gzguts.h +11 -12
- data/third_party/zlib/infback.c +7 -23
- data/third_party/zlib/inffast.c +1 -4
- data/third_party/zlib/inffast.h +1 -1
- data/third_party/zlib/inflate.c +30 -99
- data/third_party/zlib/inftrees.c +6 -11
- data/third_party/zlib/inftrees.h +3 -3
- data/third_party/zlib/trees.c +224 -302
- data/third_party/zlib/uncompr.c +4 -12
- data/third_party/zlib/zconf.h +6 -2
- data/third_party/zlib/zlib.h +191 -188
- data/third_party/zlib/zutil.c +16 -44
- data/third_party/zlib/zutil.h +10 -10
- metadata +35 -13
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +0 -1173
- data/src/core/lib/event_engine/memory_allocator.cc +0 -74
- data/src/core/lib/transport/pid_controller.cc +0 -51
- data/src/core/lib/transport/pid_controller.h +0 -116
- data/third_party/upb/upb/collections/array.h +0 -17
- data/third_party/upb/upb/collections/map.h +0 -17
- data/third_party/upb/upb/upb.hpp +0 -18
@@ -55,9 +55,13 @@
|
|
55
55
|
#include "src/core/lib/promise/context.h"
|
56
56
|
#include "src/core/lib/promise/detail/status.h"
|
57
57
|
#include "src/core/lib/promise/latch.h"
|
58
|
+
#include "src/core/lib/promise/party.h"
|
58
59
|
#include "src/core/lib/promise/pipe.h"
|
60
|
+
#include "src/core/lib/promise/race.h"
|
61
|
+
#include "src/core/lib/promise/status_flag.h"
|
59
62
|
#include "src/core/lib/resource_quota/arena.h"
|
60
63
|
#include "src/core/lib/slice/slice_buffer.h"
|
64
|
+
#include "src/core/lib/transport/call_final_info.h"
|
61
65
|
#include "src/core/lib/transport/connectivity_state.h"
|
62
66
|
#include "src/core/lib/transport/metadata_batch.h"
|
63
67
|
#include "src/core/lib/transport/transport_fwd.h"
|
@@ -147,6 +151,17 @@ struct StatusCastImpl<ServerMetadataHandle, absl::Status&> {
|
|
147
151
|
}
|
148
152
|
};
|
149
153
|
|
154
|
+
// Anything that can be first cast to absl::Status can then be cast to
|
155
|
+
// ServerMetadataHandle.
|
156
|
+
template <typename T>
|
157
|
+
struct StatusCastImpl<
|
158
|
+
ServerMetadataHandle, T,
|
159
|
+
absl::void_t<decltype(StatusCast<absl::Status>(std::declval<T>()))>> {
|
160
|
+
static ServerMetadataHandle Cast(const T& m) {
|
161
|
+
return ServerMetadataFromStatus(StatusCast<absl::Status>(m));
|
162
|
+
}
|
163
|
+
};
|
164
|
+
|
150
165
|
// Move only type that tracks call startup.
|
151
166
|
// Allows observation of when client_initial_metadata has been processed by the
|
152
167
|
// end of the local call stack.
|
@@ -228,6 +243,367 @@ struct CallArgs {
|
|
228
243
|
using NextPromiseFactory =
|
229
244
|
std::function<ArenaPromise<ServerMetadataHandle>(CallArgs)>;
|
230
245
|
|
246
|
+
// The common middle part of a call - a reference is held by each of
|
247
|
+
// CallInitiator and CallHandler - which provide interfaces that are appropriate
|
248
|
+
// for each side of a call.
|
249
|
+
// The spine will ultimately host the pipes, filters, and context for one part
|
250
|
+
// of a call: ie top-half client channel, sub channel call, server call.
|
251
|
+
// TODO(ctiller): eventually drop this when we don't need to reference into
|
252
|
+
// legacy promise calls anymore
|
253
|
+
class CallSpineInterface {
|
254
|
+
public:
|
255
|
+
virtual ~CallSpineInterface() = default;
|
256
|
+
virtual Pipe<ClientMetadataHandle>& client_initial_metadata() = 0;
|
257
|
+
virtual Pipe<ServerMetadataHandle>& server_initial_metadata() = 0;
|
258
|
+
virtual Pipe<MessageHandle>& client_to_server_messages() = 0;
|
259
|
+
virtual Pipe<MessageHandle>& server_to_client_messages() = 0;
|
260
|
+
virtual Pipe<ServerMetadataHandle>& server_trailing_metadata() = 0;
|
261
|
+
virtual Latch<ServerMetadataHandle>& cancel_latch() = 0;
|
262
|
+
// Add a callback to be called when server trailing metadata is received.
|
263
|
+
void OnDone(absl::AnyInvocable<void()> fn) {
|
264
|
+
if (on_done_ == nullptr) {
|
265
|
+
on_done_ = std::move(fn);
|
266
|
+
return;
|
267
|
+
}
|
268
|
+
on_done_ = [first = std::move(fn), next = std::move(on_done_)]() mutable {
|
269
|
+
first();
|
270
|
+
next();
|
271
|
+
};
|
272
|
+
}
|
273
|
+
void CallOnDone() {
|
274
|
+
if (on_done_ != nullptr) std::exchange(on_done_, nullptr)();
|
275
|
+
}
|
276
|
+
virtual Party& party() = 0;
|
277
|
+
virtual void IncrementRefCount() = 0;
|
278
|
+
virtual void Unref() = 0;
|
279
|
+
|
280
|
+
// Cancel the call with the given metadata.
|
281
|
+
// Regarding the `MUST_USE_RESULT absl::nullopt_t`:
|
282
|
+
// Most cancellation calls right now happen in pipe interceptors;
|
283
|
+
// there `nullopt` indicates terminate processing of this pipe and close with
|
284
|
+
// error.
|
285
|
+
// It's convenient then to have the Cancel operation (setting the latch to
|
286
|
+
// terminate the call) be the last thing that occurs in a pipe interceptor,
|
287
|
+
// and this construction supports that (and has helped the author not write
|
288
|
+
// some bugs).
|
289
|
+
GRPC_MUST_USE_RESULT absl::nullopt_t Cancel(ServerMetadataHandle metadata) {
|
290
|
+
GPR_DEBUG_ASSERT(Activity::current() == &party());
|
291
|
+
auto& c = cancel_latch();
|
292
|
+
if (c.is_set()) return absl::nullopt;
|
293
|
+
c.Set(std::move(metadata));
|
294
|
+
CallOnDone();
|
295
|
+
client_initial_metadata().sender.CloseWithError();
|
296
|
+
server_initial_metadata().sender.CloseWithError();
|
297
|
+
client_to_server_messages().sender.CloseWithError();
|
298
|
+
server_to_client_messages().sender.CloseWithError();
|
299
|
+
return absl::nullopt;
|
300
|
+
}
|
301
|
+
|
302
|
+
auto WaitForCancel() {
|
303
|
+
GPR_DEBUG_ASSERT(Activity::current() == &party());
|
304
|
+
return cancel_latch().Wait();
|
305
|
+
}
|
306
|
+
|
307
|
+
// Wrap a promise so that if it returns failure it automatically cancels
|
308
|
+
// the rest of the call.
|
309
|
+
// The resulting (returned) promise will resolve to Empty.
|
310
|
+
template <typename Promise>
|
311
|
+
auto CancelIfFails(Promise promise) {
|
312
|
+
GPR_DEBUG_ASSERT(Activity::current() == &party());
|
313
|
+
using P = promise_detail::PromiseLike<Promise>;
|
314
|
+
using ResultType = typename P::Result;
|
315
|
+
return Map(std::move(promise), [this](ResultType r) {
|
316
|
+
if (!IsStatusOk(r)) {
|
317
|
+
std::ignore = Cancel(StatusCast<ServerMetadataHandle>(r));
|
318
|
+
}
|
319
|
+
return r;
|
320
|
+
});
|
321
|
+
}
|
322
|
+
|
323
|
+
// Spawn a promise that returns Empty{} and save some boilerplate handling
|
324
|
+
// that detail.
|
325
|
+
template <typename PromiseFactory>
|
326
|
+
void SpawnInfallible(absl::string_view name, PromiseFactory promise_factory) {
|
327
|
+
party().Spawn(name, std::move(promise_factory), [](Empty) {});
|
328
|
+
}
|
329
|
+
|
330
|
+
// Spawn a promise that returns some status-like type; if the status
|
331
|
+
// represents failure automatically cancel the rest of the call.
|
332
|
+
template <typename PromiseFactory>
|
333
|
+
void SpawnGuarded(absl::string_view name, PromiseFactory promise_factory) {
|
334
|
+
using FactoryType =
|
335
|
+
promise_detail::OncePromiseFactory<void, PromiseFactory>;
|
336
|
+
using PromiseType = typename FactoryType::Promise;
|
337
|
+
using ResultType = typename PromiseType::Result;
|
338
|
+
static_assert(
|
339
|
+
std::is_same<bool,
|
340
|
+
decltype(IsStatusOk(std::declval<ResultType>()))>::value,
|
341
|
+
"SpawnGuarded promise must return a status-like object");
|
342
|
+
party().Spawn(name, std::move(promise_factory), [this](ResultType r) {
|
343
|
+
if (!IsStatusOk(r)) {
|
344
|
+
std::ignore = Cancel(StatusCast<ServerMetadataHandle>(std::move(r)));
|
345
|
+
}
|
346
|
+
});
|
347
|
+
}
|
348
|
+
|
349
|
+
private:
|
350
|
+
absl::AnyInvocable<void()> on_done_{nullptr};
|
351
|
+
};
|
352
|
+
|
353
|
+
class CallSpine final : public CallSpineInterface, public Party {
|
354
|
+
public:
|
355
|
+
static RefCountedPtr<CallSpine> Create(
|
356
|
+
grpc_event_engine::experimental::EventEngine* event_engine,
|
357
|
+
Arena* arena) {
|
358
|
+
return RefCountedPtr<CallSpine>(arena->New<CallSpine>(event_engine, arena));
|
359
|
+
}
|
360
|
+
|
361
|
+
Pipe<ClientMetadataHandle>& client_initial_metadata() override {
|
362
|
+
return client_initial_metadata_;
|
363
|
+
}
|
364
|
+
Pipe<ServerMetadataHandle>& server_initial_metadata() override {
|
365
|
+
return server_initial_metadata_;
|
366
|
+
}
|
367
|
+
Pipe<MessageHandle>& client_to_server_messages() override {
|
368
|
+
return client_to_server_messages_;
|
369
|
+
}
|
370
|
+
Pipe<MessageHandle>& server_to_client_messages() override {
|
371
|
+
return server_to_client_messages_;
|
372
|
+
}
|
373
|
+
Pipe<ServerMetadataHandle>& server_trailing_metadata() override {
|
374
|
+
return server_trailing_metadata_;
|
375
|
+
}
|
376
|
+
Latch<ServerMetadataHandle>& cancel_latch() override { return cancel_latch_; }
|
377
|
+
Party& party() override { return *this; }
|
378
|
+
void IncrementRefCount() override { Party::IncrementRefCount(); }
|
379
|
+
void Unref() override { Party::Unref(); }
|
380
|
+
|
381
|
+
private:
|
382
|
+
friend class Arena;
|
383
|
+
CallSpine(grpc_event_engine::experimental::EventEngine* event_engine,
|
384
|
+
Arena* arena)
|
385
|
+
: Party(arena, 1), event_engine_(event_engine) {}
|
386
|
+
|
387
|
+
class ScopedContext : public ScopedActivity,
|
388
|
+
public promise_detail::Context<Arena> {
|
389
|
+
public:
|
390
|
+
explicit ScopedContext(CallSpine* spine)
|
391
|
+
: ScopedActivity(&spine->party()), Context<Arena>(spine->arena()) {}
|
392
|
+
};
|
393
|
+
|
394
|
+
bool RunParty() override {
|
395
|
+
ScopedContext context(this);
|
396
|
+
return Party::RunParty();
|
397
|
+
}
|
398
|
+
|
399
|
+
void PartyOver() override {
|
400
|
+
Arena* a = arena();
|
401
|
+
{
|
402
|
+
ScopedContext context(this);
|
403
|
+
CancelRemainingParticipants();
|
404
|
+
a->DestroyManagedNewObjects();
|
405
|
+
}
|
406
|
+
this->~CallSpine();
|
407
|
+
a->Destroy();
|
408
|
+
}
|
409
|
+
|
410
|
+
grpc_event_engine::experimental::EventEngine* event_engine() const override {
|
411
|
+
return event_engine_;
|
412
|
+
}
|
413
|
+
|
414
|
+
// Initial metadata from client to server
|
415
|
+
Pipe<ClientMetadataHandle> client_initial_metadata_{arena()};
|
416
|
+
// Initial metadata from server to client
|
417
|
+
Pipe<ServerMetadataHandle> server_initial_metadata_{arena()};
|
418
|
+
// Messages travelling from the application to the transport.
|
419
|
+
Pipe<MessageHandle> client_to_server_messages_{arena()};
|
420
|
+
// Messages travelling from the transport to the application.
|
421
|
+
Pipe<MessageHandle> server_to_client_messages_{arena()};
|
422
|
+
// Trailing metadata from server to client
|
423
|
+
Pipe<ServerMetadataHandle> server_trailing_metadata_{arena()};
|
424
|
+
// Latch that can be set to terminate the call
|
425
|
+
Latch<ServerMetadataHandle> cancel_latch_;
|
426
|
+
// Event engine associated with this call
|
427
|
+
grpc_event_engine::experimental::EventEngine* const event_engine_;
|
428
|
+
};
|
429
|
+
|
430
|
+
class CallInitiator {
|
431
|
+
public:
|
432
|
+
explicit CallInitiator(RefCountedPtr<CallSpineInterface> spine)
|
433
|
+
: spine_(std::move(spine)) {}
|
434
|
+
|
435
|
+
auto PushClientInitialMetadata(ClientMetadataHandle md) {
|
436
|
+
GPR_DEBUG_ASSERT(Activity::current() == &spine_->party());
|
437
|
+
return Map(spine_->client_initial_metadata().sender.Push(std::move(md)),
|
438
|
+
[](bool ok) { return StatusFlag(ok); });
|
439
|
+
}
|
440
|
+
|
441
|
+
auto PullServerInitialMetadata() {
|
442
|
+
GPR_DEBUG_ASSERT(Activity::current() == &spine_->party());
|
443
|
+
return Map(spine_->server_initial_metadata().receiver.Next(),
|
444
|
+
[](NextResult<ClientMetadataHandle> md)
|
445
|
+
-> ValueOrFailure<ClientMetadataHandle> {
|
446
|
+
if (!md.has_value()) return Failure{};
|
447
|
+
return std::move(*md);
|
448
|
+
});
|
449
|
+
}
|
450
|
+
|
451
|
+
auto PullServerTrailingMetadata() {
|
452
|
+
GPR_DEBUG_ASSERT(Activity::current() == &spine_->party());
|
453
|
+
return Race(spine_->WaitForCancel(),
|
454
|
+
Map(spine_->server_trailing_metadata().receiver.Next(),
|
455
|
+
[spine = spine_](NextResult<ServerMetadataHandle> md)
|
456
|
+
-> ServerMetadataHandle {
|
457
|
+
GPR_ASSERT(md.has_value());
|
458
|
+
return std::move(*md);
|
459
|
+
}));
|
460
|
+
}
|
461
|
+
|
462
|
+
auto PullMessage() {
|
463
|
+
GPR_DEBUG_ASSERT(Activity::current() == &spine_->party());
|
464
|
+
return spine_->server_to_client_messages().receiver.Next();
|
465
|
+
}
|
466
|
+
|
467
|
+
auto PushMessage(MessageHandle message) {
|
468
|
+
GPR_DEBUG_ASSERT(Activity::current() == &spine_->party());
|
469
|
+
return Map(
|
470
|
+
spine_->client_to_server_messages().sender.Push(std::move(message)),
|
471
|
+
[](bool r) { return StatusFlag(r); });
|
472
|
+
}
|
473
|
+
|
474
|
+
void FinishSends() {
|
475
|
+
GPR_DEBUG_ASSERT(Activity::current() == &spine_->party());
|
476
|
+
spine_->client_to_server_messages().sender.Close();
|
477
|
+
}
|
478
|
+
|
479
|
+
template <typename Promise>
|
480
|
+
auto CancelIfFails(Promise promise) {
|
481
|
+
return spine_->CancelIfFails(std::move(promise));
|
482
|
+
}
|
483
|
+
|
484
|
+
void Cancel() {
|
485
|
+
GPR_DEBUG_ASSERT(Activity::current() == &spine_->party());
|
486
|
+
std::ignore =
|
487
|
+
spine_->Cancel(ServerMetadataFromStatus(absl::CancelledError()));
|
488
|
+
}
|
489
|
+
|
490
|
+
template <typename PromiseFactory>
|
491
|
+
void SpawnGuarded(absl::string_view name, PromiseFactory promise_factory) {
|
492
|
+
spine_->SpawnGuarded(name, std::move(promise_factory));
|
493
|
+
}
|
494
|
+
|
495
|
+
template <typename PromiseFactory>
|
496
|
+
void SpawnInfallible(absl::string_view name, PromiseFactory promise_factory) {
|
497
|
+
spine_->SpawnInfallible(name, std::move(promise_factory));
|
498
|
+
}
|
499
|
+
|
500
|
+
template <typename PromiseFactory>
|
501
|
+
auto SpawnWaitable(absl::string_view name, PromiseFactory promise_factory) {
|
502
|
+
return spine_->party().SpawnWaitable(name, std::move(promise_factory));
|
503
|
+
}
|
504
|
+
|
505
|
+
Arena* arena() { return spine_->party().arena(); }
|
506
|
+
|
507
|
+
private:
|
508
|
+
RefCountedPtr<CallSpineInterface> spine_;
|
509
|
+
};
|
510
|
+
|
511
|
+
class CallHandler {
|
512
|
+
public:
|
513
|
+
explicit CallHandler(RefCountedPtr<CallSpineInterface> spine)
|
514
|
+
: spine_(std::move(spine)) {}
|
515
|
+
|
516
|
+
auto PullClientInitialMetadata() {
|
517
|
+
GPR_DEBUG_ASSERT(Activity::current() == &spine_->party());
|
518
|
+
return Map(spine_->client_initial_metadata().receiver.Next(),
|
519
|
+
[](NextResult<ClientMetadataHandle> md)
|
520
|
+
-> ValueOrFailure<ClientMetadataHandle> {
|
521
|
+
if (!md.has_value()) return Failure{};
|
522
|
+
return std::move(*md);
|
523
|
+
});
|
524
|
+
}
|
525
|
+
|
526
|
+
auto PushServerInitialMetadata(ServerMetadataHandle md) {
|
527
|
+
GPR_DEBUG_ASSERT(Activity::current() == &spine_->party());
|
528
|
+
return Map(spine_->server_initial_metadata().sender.Push(std::move(md)),
|
529
|
+
[](bool ok) { return StatusFlag(ok); });
|
530
|
+
}
|
531
|
+
|
532
|
+
auto PushServerTrailingMetadata(ServerMetadataHandle md) {
|
533
|
+
GPR_DEBUG_ASSERT(Activity::current() == &spine_->party());
|
534
|
+
spine_->server_to_client_messages().sender.Close();
|
535
|
+
spine_->CallOnDone();
|
536
|
+
return Map(spine_->server_trailing_metadata().sender.Push(std::move(md)),
|
537
|
+
[](bool ok) { return StatusFlag(ok); });
|
538
|
+
}
|
539
|
+
|
540
|
+
auto PullMessage() {
|
541
|
+
GPR_DEBUG_ASSERT(Activity::current() == &spine_->party());
|
542
|
+
return spine_->client_to_server_messages().receiver.Next();
|
543
|
+
}
|
544
|
+
|
545
|
+
auto PushMessage(MessageHandle message) {
|
546
|
+
GPR_DEBUG_ASSERT(Activity::current() == &spine_->party());
|
547
|
+
return Map(
|
548
|
+
spine_->server_to_client_messages().sender.Push(std::move(message)),
|
549
|
+
[](bool ok) { return StatusFlag(ok); });
|
550
|
+
}
|
551
|
+
|
552
|
+
void Cancel(ServerMetadataHandle status) {
|
553
|
+
GPR_DEBUG_ASSERT(Activity::current() == &spine_->party());
|
554
|
+
std::ignore = spine_->Cancel(std::move(status));
|
555
|
+
}
|
556
|
+
|
557
|
+
void OnDone(absl::AnyInvocable<void()> fn) { spine_->OnDone(std::move(fn)); }
|
558
|
+
|
559
|
+
template <typename Promise>
|
560
|
+
auto CancelIfFails(Promise promise) {
|
561
|
+
return spine_->CancelIfFails(std::move(promise));
|
562
|
+
}
|
563
|
+
|
564
|
+
template <typename PromiseFactory>
|
565
|
+
void SpawnGuarded(absl::string_view name, PromiseFactory promise_factory) {
|
566
|
+
spine_->SpawnGuarded(name, std::move(promise_factory));
|
567
|
+
}
|
568
|
+
|
569
|
+
template <typename PromiseFactory>
|
570
|
+
void SpawnInfallible(absl::string_view name, PromiseFactory promise_factory) {
|
571
|
+
spine_->SpawnInfallible(name, std::move(promise_factory));
|
572
|
+
}
|
573
|
+
|
574
|
+
template <typename PromiseFactory>
|
575
|
+
auto SpawnWaitable(absl::string_view name, PromiseFactory promise_factory) {
|
576
|
+
return spine_->party().SpawnWaitable(name, std::move(promise_factory));
|
577
|
+
}
|
578
|
+
|
579
|
+
Arena* arena() { return spine_->party().arena(); }
|
580
|
+
|
581
|
+
private:
|
582
|
+
RefCountedPtr<CallSpineInterface> spine_;
|
583
|
+
};
|
584
|
+
|
585
|
+
struct CallInitiatorAndHandler {
|
586
|
+
CallInitiator initiator;
|
587
|
+
CallHandler handler;
|
588
|
+
};
|
589
|
+
|
590
|
+
CallInitiatorAndHandler MakeCall(
|
591
|
+
grpc_event_engine::experimental::EventEngine* event_engine, Arena* arena);
|
592
|
+
|
593
|
+
template <typename CallHalf>
|
594
|
+
auto OutgoingMessages(CallHalf h) {
|
595
|
+
struct Wrapper {
|
596
|
+
CallHalf h;
|
597
|
+
auto Next() { return h.PullMessage(); }
|
598
|
+
};
|
599
|
+
return Wrapper{std::move(h)};
|
600
|
+
}
|
601
|
+
|
602
|
+
// Forward a call from `call_handler` to `call_initiator` (with initial metadata
|
603
|
+
// `client_initial_metadata`)
|
604
|
+
void ForwardCall(CallHandler call_handler, CallInitiator call_initiator,
|
605
|
+
ClientMetadataHandle client_initial_metadata);
|
606
|
+
|
231
607
|
} // namespace grpc_core
|
232
608
|
|
233
609
|
// forward declarations
|
@@ -304,24 +680,6 @@ inline void grpc_stream_unref(grpc_stream_refcount* refcount) {
|
|
304
680
|
grpc_slice grpc_slice_from_stream_owned_buffer(grpc_stream_refcount* refcount,
|
305
681
|
void* buffer, size_t length);
|
306
682
|
|
307
|
-
struct grpc_transport_one_way_stats {
|
308
|
-
uint64_t framing_bytes = 0;
|
309
|
-
uint64_t data_bytes = 0;
|
310
|
-
uint64_t header_bytes = 0;
|
311
|
-
};
|
312
|
-
|
313
|
-
struct grpc_transport_stream_stats {
|
314
|
-
grpc_transport_one_way_stats incoming;
|
315
|
-
grpc_transport_one_way_stats outgoing;
|
316
|
-
gpr_timespec latency = gpr_inf_future(GPR_TIMESPAN);
|
317
|
-
};
|
318
|
-
|
319
|
-
void grpc_transport_move_one_way_stats(grpc_transport_one_way_stats* from,
|
320
|
-
grpc_transport_one_way_stats* to);
|
321
|
-
|
322
|
-
void grpc_transport_move_stats(grpc_transport_stream_stats* from,
|
323
|
-
grpc_transport_stream_stats* to);
|
324
|
-
|
325
683
|
// This struct (which is present in both grpc_transport_stream_op_batch
|
326
684
|
// and grpc_transport_op_batch) is a convenience to allow filters or
|
327
685
|
// transports to schedule a closure related to a particular batch without
|
@@ -633,9 +991,7 @@ class FilterStackTransport {
|
|
633
991
|
|
634
992
|
class ClientTransport {
|
635
993
|
public:
|
636
|
-
|
637
|
-
virtual ArenaPromise<ServerMetadataHandle> MakeCallPromise(
|
638
|
-
CallArgs call_args) = 0;
|
994
|
+
virtual void StartCall(CallHandler call_handler) = 0;
|
639
995
|
|
640
996
|
protected:
|
641
997
|
~ClientTransport() = default;
|
@@ -643,10 +999,24 @@ class ClientTransport {
|
|
643
999
|
|
644
1000
|
class ServerTransport {
|
645
1001
|
public:
|
646
|
-
//
|
647
|
-
|
648
|
-
|
649
|
-
|
1002
|
+
// Acceptor helps transports create calls.
|
1003
|
+
class Acceptor {
|
1004
|
+
public:
|
1005
|
+
// Returns an arena that can be used to allocate memory for initial metadata
|
1006
|
+
// parsing, and later passed to CreateCall() as the underlying arena for
|
1007
|
+
// that call.
|
1008
|
+
virtual Arena* CreateArena() = 0;
|
1009
|
+
// Create a call at the server (or fail)
|
1010
|
+
// arena must have been previously allocated by CreateArena()
|
1011
|
+
virtual absl::StatusOr<CallInitiator> CreateCall(
|
1012
|
+
ClientMetadata& client_initial_metadata, Arena* arena) = 0;
|
1013
|
+
|
1014
|
+
protected:
|
1015
|
+
~Acceptor() = default;
|
1016
|
+
};
|
1017
|
+
|
1018
|
+
// Called once slightly after transport setup to register the accept function.
|
1019
|
+
virtual void SetAcceptor(Acceptor* acceptor) = 0;
|
650
1020
|
|
651
1021
|
protected:
|
652
1022
|
~ServerTransport() = default;
|
@@ -40,6 +40,8 @@ extern void SecurityRegisterHandshakerFactories(
|
|
40
40
|
CoreConfiguration::Builder* builder);
|
41
41
|
extern void RegisterClientAuthorityFilter(CoreConfiguration::Builder* builder);
|
42
42
|
extern void RegisterChannelIdleFilters(CoreConfiguration::Builder* builder);
|
43
|
+
extern void RegisterLegacyChannelIdleFilters(
|
44
|
+
CoreConfiguration::Builder* builder);
|
43
45
|
extern void RegisterDeadlineFilter(CoreConfiguration::Builder* builder);
|
44
46
|
extern void RegisterGrpcLbPolicy(CoreConfiguration::Builder* builder);
|
45
47
|
extern void RegisterHttpFilters(CoreConfiguration::Builder* builder);
|
@@ -89,6 +91,7 @@ void BuildCoreConfiguration(CoreConfiguration::Builder* builder) {
|
|
89
91
|
SecurityRegisterHandshakerFactories(builder);
|
90
92
|
RegisterClientAuthorityFilter(builder);
|
91
93
|
RegisterChannelIdleFilters(builder);
|
94
|
+
RegisterLegacyChannelIdleFilters(builder);
|
92
95
|
RegisterConnectedChannel(builder);
|
93
96
|
RegisterGrpcLbPolicy(builder);
|
94
97
|
RegisterHttpFilters(builder);
|
@@ -34,8 +34,6 @@ extern void RegisterXdsClusterManagerLbPolicy(
|
|
34
34
|
CoreConfiguration::Builder* builder);
|
35
35
|
extern void RegisterXdsClusterImplLbPolicy(CoreConfiguration::Builder* builder);
|
36
36
|
extern void RegisterCdsLbPolicy(CoreConfiguration::Builder* builder);
|
37
|
-
extern void RegisterXdsClusterResolverLbPolicy(
|
38
|
-
CoreConfiguration::Builder* builder);
|
39
37
|
extern void RegisterXdsOverrideHostLbPolicy(
|
40
38
|
CoreConfiguration::Builder* builder);
|
41
39
|
extern void RegisterXdsWrrLocalityLbPolicy(CoreConfiguration::Builder* builder);
|
@@ -58,7 +56,6 @@ void RegisterExtraFilters(CoreConfiguration::Builder* builder) {
|
|
58
56
|
RegisterXdsClusterManagerLbPolicy(builder);
|
59
57
|
RegisterXdsClusterImplLbPolicy(builder);
|
60
58
|
RegisterCdsLbPolicy(builder);
|
61
|
-
RegisterXdsClusterResolverLbPolicy(builder);
|
62
59
|
RegisterXdsOverrideHostLbPolicy(builder);
|
63
60
|
RegisterXdsWrrLocalityLbPolicy(builder);
|
64
61
|
RegisterRingHashLbPolicy(builder);
|