grpc 1.46.3-x86_64-linux → 1.47.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 +49 -97
- data/include/grpc/event_engine/event_engine.h +42 -7
- data/include/grpc/event_engine/memory_allocator.h +0 -15
- data/include/grpc/event_engine/port.h +1 -1
- data/include/grpc/event_engine/slice.h +286 -0
- data/include/grpc/event_engine/slice_buffer.h +112 -0
- data/include/grpc/grpc_security.h +11 -0
- data/include/grpc/impl/codegen/port_platform.h +100 -36
- data/include/grpc/impl/codegen/slice.h +1 -1
- data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +18 -30
- data/src/core/ext/filters/channel_idle/channel_idle_filter.h +4 -1
- data/src/core/ext/filters/client_channel/backend_metric.cc +17 -12
- data/src/core/ext/filters/client_channel/backend_metric.h +19 -9
- data/src/core/ext/filters/client_channel/backup_poller.cc +5 -5
- data/src/core/ext/filters/client_channel/backup_poller.h +2 -4
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +42 -20
- data/src/core/ext/filters/client_channel/client_channel.cc +60 -17
- data/src/core/ext/filters/client_channel/client_channel.h +26 -6
- data/src/core/ext/filters/client_channel/client_channel_channelz.cc +3 -5
- data/src/core/ext/filters/client_channel/client_channel_channelz.h +12 -2
- data/src/core/ext/filters/client_channel/client_channel_factory.cc +5 -0
- data/src/core/ext/filters/client_channel/client_channel_factory.h +8 -0
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +4 -13
- data/src/core/ext/filters/client_channel/config_selector.cc +1 -0
- data/src/core/ext/filters/client_channel/config_selector.h +7 -5
- data/src/core/ext/filters/client_channel/connector.h +8 -2
- data/src/core/ext/filters/client_channel/dynamic_filters.cc +13 -2
- data/src/core/ext/filters/client_channel/dynamic_filters.h +11 -1
- data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +2 -0
- data/src/core/ext/filters/client_channel/global_subchannel_pool.h +3 -0
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +14 -1
- data/src/core/ext/filters/client_channel/health/health_check_client.h +2 -0
- data/src/core/ext/filters/client_channel/http_proxy.cc +10 -2
- data/src/core/ext/filters/client_channel/http_proxy.h +3 -0
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +6 -2
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +1 -0
- data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +49 -0
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +12 -0
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +5 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +9 -3
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +59 -19
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +4 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +6 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +10 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +6 -3
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +408 -0
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +57 -0
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +1038 -0
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +54 -0
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +60 -52
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +102 -60
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +157 -96
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +2 -0
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +45 -10
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +182 -171
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +39 -36
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +30 -5
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +99 -23
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +6 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +30 -4
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +23 -3
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +75 -11
- data/src/core/ext/filters/client_channel/lb_policy.cc +4 -2
- data/src/core/ext/filters/client_channel/lb_policy.h +18 -24
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +2 -0
- data/src/core/ext/filters/client_channel/lb_policy_registry.cc +8 -1
- data/src/core/ext/filters/client_channel/lb_policy_registry.h +6 -1
- data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +4 -0
- data/src/core/ext/filters/client_channel/local_subchannel_pool.h +1 -0
- data/src/core/ext/filters/client_channel/proxy_mapper.h +1 -1
- data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +2 -0
- data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +5 -0
- data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +23 -5
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +134 -43
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +8 -1
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +10 -8
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +26 -9
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +13 -4
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +2 -1
- data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +2 -0
- data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h +2 -1
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +30 -7
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +13 -14
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +5 -2
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +59 -13
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +13 -1
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +8 -1
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +15 -11
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +89 -33
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +5 -11
- data/src/core/ext/filters/client_channel/resolver_result_parsing.h +11 -5
- data/src/core/ext/filters/client_channel/retry_filter.cc +42 -2
- data/src/core/ext/filters/client_channel/retry_service_config.cc +8 -9
- data/src/core/ext/filters/client_channel/retry_service_config.h +10 -1
- data/src/core/ext/filters/client_channel/retry_throttle.cc +1 -8
- data/src/core/ext/filters/client_channel/retry_throttle.h +7 -1
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +22 -5
- data/src/core/ext/filters/client_channel/subchannel.cc +156 -160
- data/src/core/ext/filters/client_channel/subchannel.h +80 -20
- data/src/core/ext/filters/client_channel/subchannel_interface.h +41 -23
- data/src/core/ext/filters/client_channel/subchannel_interface_internal.h +38 -0
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +12 -2
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +6 -3
- data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +16 -2
- data/src/core/ext/filters/client_channel/subchannel_stream_client.h +12 -0
- data/src/core/ext/filters/deadline/deadline_filter.cc +6 -2
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -4
- data/src/core/ext/filters/http/client/http_client_filter.cc +14 -5
- data/src/core/ext/filters/http/client/http_client_filter.h +7 -1
- data/src/core/ext/filters/http/client_authority_filter.cc +5 -10
- data/src/core/ext/filters/http/http_filters_plugin.cc +7 -8
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +1 -0
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +3 -1
- data/src/core/ext/filters/http/server/http_server_filter.cc +80 -247
- data/src/core/ext/filters/http/server/http_server_filter.h +31 -2
- data/src/core/ext/filters/message_size/message_size_filter.cc +20 -26
- data/src/core/ext/filters/message_size/message_size_filter.h +2 -2
- data/src/core/ext/filters/rbac/rbac_filter.cc +1 -0
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +101 -135
- data/src/core/ext/transport/chttp2/client/chttp2_connector.h +9 -7
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +44 -15
- data/src/core/ext/transport/chttp2/server/chttp2_server.h +2 -0
- data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +3 -3
- data/src/core/ext/transport/chttp2/transport/bin_decoder.h +2 -1
- data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +1 -0
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +69 -20
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +5 -0
- data/src/core/ext/transport/chttp2/transport/context_list.cc +4 -0
- data/src/core/ext/transport/chttp2/transport/context_list.h +4 -1
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +6 -2
- data/src/core/ext/transport/chttp2/transport/flow_control.h +6 -2
- data/src/core/ext/transport/chttp2/transport/frame.h +0 -4
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +7 -1
- data/src/core/ext/transport/chttp2/transport/frame_data.h +4 -1
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +3 -0
- data/src/core/ext/transport/chttp2/transport/frame_goaway.h +3 -1
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -0
- data/src/core/ext/transport/chttp2/transport/frame_ping.h +3 -0
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +6 -2
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +3 -0
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +12 -3
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +4 -0
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -1
- data/src/core/ext/transport/chttp2/transport/frame_window_update.h +3 -0
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +14 -12
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +15 -2
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +3 -0
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +3 -0
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +25 -7
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +8 -1
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +55 -37
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +38 -21
- data/src/core/ext/transport/chttp2/transport/http2_settings.h +0 -1
- data/src/core/ext/transport/chttp2/transport/internal.h +24 -3
- data/src/core/ext/transport/chttp2/transport/parsing.cc +27 -6
- data/src/core/ext/transport/chttp2/transport/stream_lists.cc +13 -9
- data/src/core/ext/transport/chttp2/transport/stream_map.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/stream_map.h +1 -0
- data/src/core/ext/transport/chttp2/transport/varint.h +2 -0
- data/src/core/ext/transport/chttp2/transport/writing.cc +38 -2
- data/src/core/ext/transport/inproc/inproc_transport.cc +8 -5
- data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.c +47 -0
- data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.h +109 -0
- data/src/core/ext/xds/certificate_provider_store.cc +4 -2
- data/src/core/ext/xds/certificate_provider_store.h +1 -1
- data/src/core/ext/xds/xds_certificate_provider.cc +4 -1
- data/src/core/ext/xds/xds_certificate_provider.h +1 -1
- data/src/core/ext/xds/xds_channel_stack_modifier.cc +5 -5
- data/src/core/ext/xds/xds_client.cc +46 -22
- data/src/core/ext/xds/xds_cluster.cc +106 -16
- data/src/core/ext/xds/xds_cluster.h +3 -0
- data/src/core/ext/xds/xds_http_fault_filter.cc +3 -3
- data/src/core/ext/xds/xds_listener.cc +19 -9
- data/src/core/ext/xds/xds_server_config_fetcher.cc +2 -1
- data/src/core/lib/address_utils/sockaddr_utils.cc +56 -23
- data/src/core/lib/address_utils/sockaddr_utils.h +7 -4
- data/src/core/lib/avl/avl.h +3 -1
- data/src/core/lib/channel/call_finalization.h +4 -0
- data/src/core/lib/channel/call_tracer.h +8 -2
- data/src/core/lib/channel/channel_args.cc +41 -22
- data/src/core/lib/channel/channel_args.h +33 -3
- data/src/core/lib/channel/channel_args_preconditioning.cc +3 -3
- data/src/core/lib/channel/channel_args_preconditioning.h +3 -2
- data/src/core/lib/channel/channel_stack.cc +41 -3
- data/src/core/lib/channel/channel_stack.h +49 -3
- data/src/core/lib/channel/channel_stack_builder.cc +9 -19
- data/src/core/lib/channel/channel_stack_builder.h +15 -27
- data/src/core/lib/channel/channel_stack_builder_impl.cc +36 -41
- data/src/core/lib/channel/channel_stack_builder_impl.h +3 -6
- data/src/core/lib/channel/channel_trace.cc +8 -13
- data/src/core/lib/channel/channel_trace.h +6 -3
- data/src/core/lib/channel/channelz.cc +8 -13
- data/src/core/lib/channel/channelz.h +13 -4
- data/src/core/lib/channel/channelz_registry.cc +7 -14
- data/src/core/lib/channel/channelz_registry.h +10 -9
- data/src/core/lib/channel/connected_channel.cc +21 -31
- data/src/core/lib/channel/connected_channel.h +1 -0
- data/src/core/lib/channel/promise_based_filter.cc +444 -189
- data/src/core/lib/channel/promise_based_filter.h +160 -27
- data/src/core/lib/channel/status_util.cc +2 -0
- data/src/core/lib/channel/status_util.h +0 -3
- data/src/core/lib/compression/compression_internal.cc +45 -10
- data/src/core/lib/compression/compression_internal.h +1 -1
- data/src/core/lib/config/core_configuration.cc +3 -0
- data/src/core/lib/config/core_configuration.h +2 -1
- data/src/core/lib/event_engine/channel_args_endpoint_config.cc +4 -2
- data/src/core/lib/event_engine/channel_args_endpoint_config.h +3 -2
- data/src/core/lib/event_engine/default_event_engine_factory.cc +8 -2
- data/src/core/lib/event_engine/event_engine.cc +12 -2
- data/src/core/lib/event_engine/event_engine_factory.h +5 -0
- data/src/core/lib/event_engine/handle_containers.h +67 -0
- data/src/core/lib/event_engine/iomgr_engine.cc +206 -0
- data/src/core/lib/event_engine/iomgr_engine.h +118 -0
- data/src/core/lib/event_engine/memory_allocator.cc +12 -4
- data/src/core/lib/event_engine/resolved_address.cc +4 -2
- data/src/core/lib/event_engine/slice.cc +102 -0
- data/src/core/lib/event_engine/slice_buffer.cc +50 -0
- data/src/core/lib/{iomgr/event_engine/pollset.h → event_engine/trace.cc} +3 -10
- data/src/core/lib/{iomgr/endpoint_pair_event_engine.cc → event_engine/trace.h} +12 -14
- data/src/core/lib/gpr/log.cc +5 -0
- data/src/core/lib/gpr/tls.h +3 -5
- data/src/core/lib/gprpp/bitset.h +5 -1
- data/src/core/lib/gprpp/chunked_vector.h +4 -0
- data/src/core/lib/gprpp/construct_destruct.h +1 -0
- data/src/core/lib/gprpp/dual_ref_counted.h +1 -4
- data/src/core/lib/gprpp/examine_stack.h +0 -1
- data/src/core/lib/gprpp/fork.cc +3 -6
- data/src/core/lib/gprpp/global_config.h +2 -4
- data/src/core/lib/gprpp/global_config_env.cc +3 -2
- data/src/core/lib/gprpp/global_config_env.h +3 -1
- data/src/core/lib/gprpp/global_config_generic.h +0 -4
- data/src/core/lib/gprpp/host_port.cc +2 -0
- data/src/core/lib/gprpp/manual_constructor.h +0 -1
- data/src/core/lib/gprpp/match.h +2 -0
- data/src/core/lib/gprpp/memory.h +1 -5
- data/src/core/lib/gprpp/orphanable.h +1 -4
- data/src/core/lib/gprpp/ref_counted.h +1 -3
- data/src/core/lib/gprpp/ref_counted_ptr.h +1 -1
- data/src/core/lib/gprpp/stat.h +0 -2
- data/src/core/lib/gprpp/stat_posix.cc +7 -2
- data/src/core/lib/gprpp/status_helper.cc +8 -4
- data/src/core/lib/gprpp/status_helper.h +4 -0
- data/src/core/lib/gprpp/sync.h +3 -1
- data/src/core/lib/gprpp/table.h +10 -0
- data/src/core/lib/gprpp/thd.h +2 -5
- data/src/core/lib/gprpp/thd_posix.cc +4 -2
- data/src/core/lib/gprpp/thd_windows.cc +2 -0
- data/src/core/lib/gprpp/time.cc +8 -0
- data/src/core/lib/gprpp/time.h +6 -1
- data/src/core/lib/gprpp/time_util.cc +4 -0
- data/src/core/lib/gprpp/time_util.h +1 -1
- data/src/core/lib/gprpp/unique_type_name.h +104 -0
- data/src/core/lib/http/format_request.cc +29 -0
- data/src/core/lib/http/format_request.h +2 -0
- data/src/core/lib/http/httpcli.cc +88 -81
- data/src/core/lib/http/httpcli.h +39 -7
- data/src/core/lib/http/httpcli_security_connector.cc +3 -4
- data/src/core/lib/iomgr/endpoint.cc +4 -4
- data/src/core/lib/iomgr/endpoint.h +6 -4
- data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -4
- data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -1
- data/src/core/lib/iomgr/ev_posix.cc +1 -4
- data/src/core/lib/iomgr/exec_ctx.h +1 -2
- data/src/core/lib/iomgr/internal_errqueue.cc +38 -47
- data/src/core/lib/iomgr/internal_errqueue.h +1 -6
- data/src/core/lib/iomgr/iomgr.cc +0 -1
- data/src/core/{ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_event_engine.cc → lib/iomgr/iomgr_fwd.h} +9 -12
- data/src/core/lib/iomgr/pollset_set.h +1 -2
- data/src/core/lib/iomgr/port.h +25 -6
- data/src/core/lib/iomgr/resolve_address.cc +8 -0
- data/src/core/lib/iomgr/resolve_address.h +21 -14
- data/src/core/lib/iomgr/resolve_address_impl.h +2 -3
- data/src/core/lib/iomgr/resolve_address_posix.cc +8 -14
- data/src/core/lib/iomgr/resolve_address_posix.h +5 -2
- data/src/core/lib/iomgr/resolve_address_windows.cc +7 -14
- data/src/core/lib/iomgr/resolve_address_windows.h +5 -2
- data/src/core/lib/iomgr/sockaddr.h +2 -3
- data/src/core/lib/iomgr/sockaddr_posix.h +2 -0
- data/src/core/lib/iomgr/sockaddr_windows.h +2 -0
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +3 -2
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +10 -2
- data/src/core/lib/iomgr/tcp_client_posix.cc +12 -5
- data/src/core/lib/iomgr/tcp_client_windows.cc +13 -6
- data/src/core/lib/iomgr/tcp_posix.cc +9 -27
- data/src/core/lib/iomgr/tcp_server_posix.cc +26 -12
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +30 -27
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +7 -4
- data/src/core/lib/iomgr/tcp_server_windows.cc +13 -5
- data/src/core/lib/iomgr/tcp_windows.cc +7 -4
- data/src/core/lib/json/json.h +1 -2
- data/src/core/lib/json/json_reader.cc +9 -1
- data/src/core/lib/json/json_util.cc +7 -0
- data/src/core/lib/json/json_util.h +10 -1
- data/src/core/lib/json/json_writer.cc +6 -1
- data/src/core/lib/promise/activity.cc +1 -1
- data/src/core/lib/promise/activity.h +6 -6
- data/src/core/lib/promise/arena_promise.h +11 -1
- data/src/core/lib/promise/call_push_pull.h +4 -0
- data/src/core/lib/promise/context.h +1 -1
- data/src/core/lib/promise/detail/basic_seq.h +2 -2
- data/src/core/lib/promise/detail/promise_factory.h +0 -1
- data/src/core/lib/promise/latch.h +0 -1
- data/src/core/lib/promise/loop.h +1 -0
- data/src/core/lib/promise/race.h +0 -1
- data/src/core/lib/promise/seq.h +0 -2
- data/src/core/lib/promise/sleep.cc +2 -0
- data/src/core/lib/promise/sleep.h +10 -0
- data/src/core/lib/promise/try_seq.h +2 -2
- data/src/core/lib/resolver/resolver_factory.h +1 -2
- data/src/core/lib/resolver/server_address.cc +9 -3
- data/src/core/lib/resolver/server_address.h +4 -4
- data/src/core/lib/resource_quota/api.cc +14 -1
- data/src/core/lib/resource_quota/api.h +4 -1
- data/src/core/lib/resource_quota/arena.cc +0 -6
- data/src/core/lib/resource_quota/arena.h +1 -2
- data/src/core/lib/resource_quota/memory_quota.cc +47 -5
- data/src/core/lib/resource_quota/memory_quota.h +24 -5
- data/src/core/lib/resource_quota/resource_quota.h +8 -0
- data/src/core/lib/resource_quota/thread_quota.cc +2 -0
- data/src/core/lib/resource_quota/thread_quota.h +4 -0
- data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +3 -0
- data/src/core/lib/security/credentials/alts/alts_credentials.cc +8 -2
- data/src/core/lib/security/credentials/alts/alts_credentials.h +2 -2
- data/src/core/lib/security/credentials/call_creds_util.cc +2 -0
- data/src/core/lib/security/credentials/channel_creds_registry.h +1 -0
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +7 -3
- data/src/core/lib/security/credentials/composite/composite_credentials.h +5 -4
- data/src/core/lib/security/credentials/credentials.h +17 -10
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +81 -0
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +8 -0
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +3 -0
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +2 -0
- data/src/core/lib/security/credentials/fake/fake_credentials.cc +13 -3
- data/src/core/lib/security/credentials/fake/fake_credentials.h +2 -2
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +25 -15
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +2 -2
- data/src/core/lib/security/credentials/iam/iam_credentials.cc +4 -1
- data/src/core/lib/security/credentials/iam/iam_credentials.h +2 -2
- data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +8 -2
- data/src/core/lib/security/credentials/insecure/insecure_credentials.h +4 -4
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +3 -2
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -2
- data/src/core/lib/security/credentials/local/local_credentials.cc +8 -2
- data/src/core/lib/security/credentials/local/local_credentials.h +2 -2
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +10 -6
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +4 -4
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +4 -1
- data/src/core/lib/security/credentials/plugin/plugin_credentials.h +1 -1
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +8 -2
- data/src/core/lib/security/credentials/ssl/ssl_credentials.h +4 -4
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +10 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +5 -7
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +26 -1
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +28 -4
- data/src/core/lib/security/credentials/tls/tls_credentials.cc +10 -0
- data/src/core/lib/security/credentials/tls/tls_credentials.h +2 -2
- data/src/core/lib/security/credentials/xds/xds_credentials.cc +12 -3
- data/src/core/lib/security/credentials/xds/xds_credentials.h +5 -5
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +1 -1
- data/src/core/lib/security/security_connector/fake/fake_security_connector.h +1 -1
- data/src/core/lib/security/security_connector/security_connector.cc +1 -1
- data/src/core/lib/security/security_connector/security_connector.h +1 -1
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +1 -1
- data/src/core/lib/security/transport/client_auth_filter.cc +6 -8
- data/src/core/lib/security/transport/secure_endpoint.cc +23 -12
- data/src/core/lib/security/transport/security_handshaker.cc +5 -5
- data/src/core/lib/security/transport/security_handshaker.h +1 -1
- data/src/core/lib/security/transport/server_auth_filter.cc +3 -2
- data/src/core/lib/service_config/service_config.h +4 -8
- data/src/core/lib/service_config/service_config_call_data.h +4 -1
- data/src/core/lib/service_config/service_config_impl.cc +7 -0
- data/src/core/lib/service_config/service_config_impl.h +9 -2
- data/src/core/lib/service_config/service_config_parser.cc +8 -0
- data/src/core/lib/service_config/service_config_parser.h +7 -0
- data/src/core/lib/slice/b64.cc +1 -1
- data/src/core/lib/slice/b64.h +2 -0
- data/src/core/lib/slice/percent_encoding.cc +4 -1
- data/src/core/lib/slice/percent_encoding.h +0 -6
- data/src/core/lib/slice/slice.cc +2 -1
- data/src/core/lib/slice/slice.h +10 -5
- data/src/core/lib/slice/slice_api.cc +1 -1
- data/src/core/lib/slice/slice_buffer.cc +50 -23
- data/src/core/lib/slice/slice_buffer.h +106 -0
- data/src/core/lib/slice/slice_buffer_api.cc +35 -0
- data/src/core/lib/slice/slice_internal.h +4 -3
- data/src/core/lib/slice/slice_refcount.h +2 -3
- data/src/core/lib/slice/slice_refcount_base.h +2 -3
- data/src/core/lib/slice/slice_split.cc +3 -0
- data/src/core/lib/slice/slice_split.h +0 -4
- data/src/core/lib/slice/slice_string_helpers.cc +4 -0
- data/src/core/lib/slice/slice_string_helpers.h +1 -4
- data/src/core/lib/surface/builtins.cc +7 -2
- data/src/core/lib/surface/byte_buffer.cc +7 -1
- data/src/core/lib/surface/byte_buffer_reader.cc +4 -4
- data/src/core/lib/surface/call.cc +41 -26
- data/src/core/lib/surface/call.h +16 -2
- data/src/core/lib/surface/call_details.cc +4 -4
- data/src/core/lib/surface/call_log_batch.cc +7 -1
- data/src/core/lib/surface/call_test_only.h +4 -1
- data/src/core/lib/surface/channel.cc +179 -242
- data/src/core/lib/surface/channel.h +94 -57
- data/src/core/lib/surface/channel_init.h +2 -0
- data/src/core/lib/surface/channel_ping.cc +8 -2
- data/src/core/lib/surface/channel_stack_type.cc +0 -2
- data/src/core/lib/surface/channel_stack_type.h +0 -2
- data/src/core/lib/surface/completion_queue.cc +14 -6
- data/src/core/lib/surface/completion_queue.h +5 -1
- data/src/core/lib/surface/completion_queue_factory.cc +1 -0
- data/src/core/lib/surface/completion_queue_factory.h +1 -3
- data/src/core/lib/surface/event_string.cc +1 -7
- data/src/core/lib/surface/event_string.h +1 -1
- data/src/core/lib/surface/init.cc +17 -45
- data/src/core/lib/surface/init.h +0 -8
- data/src/core/lib/surface/lame_client.cc +64 -110
- data/src/core/lib/surface/lame_client.h +40 -2
- data/src/core/lib/surface/metadata_array.cc +2 -0
- data/src/core/lib/surface/server.cc +69 -56
- data/src/core/lib/surface/server.h +39 -9
- data/src/core/lib/surface/validate_metadata.cc +2 -5
- data/src/core/lib/surface/validate_metadata.h +3 -0
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/bdp_estimator.cc +3 -1
- data/src/core/lib/transport/bdp_estimator.h +2 -3
- data/src/core/lib/transport/byte_stream.cc +4 -3
- data/src/core/lib/transport/byte_stream.h +5 -1
- data/src/core/lib/transport/connectivity_state.cc +6 -4
- data/src/core/lib/transport/connectivity_state.h +2 -3
- data/src/core/lib/transport/error_utils.cc +4 -2
- data/src/core/lib/transport/error_utils.h +5 -1
- data/src/core/lib/{channel → transport}/handshaker.cc +9 -4
- data/src/core/lib/{channel → transport}/handshaker.h +13 -6
- data/src/core/lib/{channel → transport}/handshaker_factory.h +9 -10
- data/src/core/lib/{channel → transport}/handshaker_registry.cc +5 -1
- data/src/core/lib/{channel → transport}/handshaker_registry.h +5 -4
- data/src/core/{ext/filters/client_channel → lib/transport}/http_connect_handshaker.cc +24 -10
- data/src/core/{ext/filters/client_channel → lib/transport}/http_connect_handshaker.h +3 -3
- data/src/core/lib/transport/metadata_batch.cc +287 -0
- data/src/core/lib/transport/metadata_batch.h +133 -264
- data/src/core/lib/transport/parsed_metadata.cc +2 -0
- data/src/core/lib/transport/parsed_metadata.h +10 -3
- data/src/core/lib/transport/status_conversion.cc +2 -0
- data/src/core/lib/transport/status_conversion.h +2 -2
- data/src/core/lib/transport/tcp_connect_handshaker.cc +253 -0
- data/src/core/lib/transport/tcp_connect_handshaker.h +39 -0
- data/src/core/lib/transport/timeout_encoding.cc +2 -6
- data/src/core/lib/transport/timeout_encoding.h +5 -1
- data/src/core/lib/transport/transport.cc +18 -17
- data/src/core/lib/transport/transport.h +28 -2
- data/src/core/lib/transport/transport_impl.h +10 -0
- data/src/core/lib/transport/transport_op_string.cc +9 -10
- data/src/core/lib/uri/uri_parser.cc +11 -3
- data/src/core/lib/uri/uri_parser.h +0 -2
- data/src/core/plugin_registry/grpc_plugin_registry.cc +11 -0
- data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -0
- data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +2 -0
- data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +2 -0
- data/src/ruby/ext/grpc/extconf.rb +2 -2
- data/src/ruby/lib/grpc/2.5/grpc_c.so +0 -0
- 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/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/abseil-cpp/absl/container/flat_hash_set.h +504 -0
- metadata +36 -29
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_event_engine.cc +0 -31
- data/src/core/lib/event_engine/sockaddr.cc +0 -40
- data/src/core/lib/event_engine/sockaddr.h +0 -44
- data/src/core/lib/gprpp/capture.h +0 -76
- data/src/core/lib/iomgr/event_engine/closure.cc +0 -77
- data/src/core/lib/iomgr/event_engine/closure.h +0 -42
- data/src/core/lib/iomgr/event_engine/endpoint.cc +0 -172
- data/src/core/lib/iomgr/event_engine/endpoint.h +0 -52
- data/src/core/lib/iomgr/event_engine/iomgr.cc +0 -85
- data/src/core/lib/iomgr/event_engine/pollset.cc +0 -87
- data/src/core/lib/iomgr/event_engine/promise.h +0 -51
- data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +0 -47
- data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +0 -37
- data/src/core/lib/iomgr/event_engine/resolver.cc +0 -133
- data/src/core/lib/iomgr/event_engine/resolver.h +0 -56
- data/src/core/lib/iomgr/event_engine/tcp.cc +0 -296
- data/src/core/lib/iomgr/event_engine/timer.cc +0 -62
@@ -53,25 +53,46 @@
|
|
53
53
|
|
54
54
|
#include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h"
|
55
55
|
|
56
|
+
// IWYU pragma: no_include <sys/socket.h>
|
57
|
+
|
56
58
|
#include <inttypes.h>
|
57
59
|
#include <limits.h>
|
60
|
+
#include <stdlib.h>
|
58
61
|
#include <string.h>
|
59
62
|
|
63
|
+
#include <algorithm>
|
64
|
+
#include <map>
|
65
|
+
#include <memory>
|
66
|
+
#include <string>
|
67
|
+
#include <utility>
|
68
|
+
#include <vector>
|
69
|
+
|
60
70
|
#include "absl/container/inlined_vector.h"
|
71
|
+
#include "absl/memory/memory.h"
|
72
|
+
#include "absl/status/status.h"
|
73
|
+
#include "absl/status/statusor.h"
|
61
74
|
#include "absl/strings/str_cat.h"
|
62
75
|
#include "absl/strings/str_format.h"
|
63
76
|
#include "absl/strings/str_join.h"
|
77
|
+
#include "absl/strings/string_view.h"
|
64
78
|
#include "absl/strings/strip.h"
|
79
|
+
#include "absl/types/optional.h"
|
80
|
+
#include "absl/types/variant.h"
|
65
81
|
#include "upb/upb.hpp"
|
66
82
|
|
83
|
+
#include <grpc/byte_buffer.h>
|
67
84
|
#include <grpc/byte_buffer_reader.h>
|
68
85
|
#include <grpc/grpc.h>
|
69
|
-
#include <grpc/
|
86
|
+
#include <grpc/impl/codegen/connectivity_state.h>
|
87
|
+
#include <grpc/impl/codegen/grpc_types.h>
|
88
|
+
#include <grpc/impl/codegen/propagation_bits.h>
|
89
|
+
#include <grpc/slice.h>
|
90
|
+
#include <grpc/status.h>
|
70
91
|
#include <grpc/support/alloc.h>
|
71
|
-
#include <grpc/support/
|
72
|
-
#include <grpc/support/time.h>
|
92
|
+
#include <grpc/support/log.h>
|
73
93
|
|
74
94
|
#include "src/core/ext/filters/client_channel/client_channel.h"
|
95
|
+
#include "src/core/ext/filters/client_channel/lb_policy.h"
|
75
96
|
#include "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h"
|
76
97
|
#include "src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h"
|
77
98
|
#include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h"
|
@@ -80,27 +101,44 @@
|
|
80
101
|
#include "src/core/ext/filters/client_channel/lb_policy_factory.h"
|
81
102
|
#include "src/core/ext/filters/client_channel/lb_policy_registry.h"
|
82
103
|
#include "src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h"
|
83
|
-
#include "src/core/
|
104
|
+
#include "src/core/ext/filters/client_channel/subchannel_interface.h"
|
84
105
|
#include "src/core/lib/address_utils/sockaddr_utils.h"
|
85
106
|
#include "src/core/lib/backoff/backoff.h"
|
86
107
|
#include "src/core/lib/channel/channel_args.h"
|
87
|
-
#include "src/core/lib/channel/channel_stack.h"
|
88
108
|
#include "src/core/lib/channel/channel_stack_builder.h"
|
109
|
+
#include "src/core/lib/channel/channelz.h"
|
89
110
|
#include "src/core/lib/config/core_configuration.h"
|
111
|
+
#include "src/core/lib/debug/trace.h"
|
90
112
|
#include "src/core/lib/gpr/string.h"
|
91
|
-
#include "src/core/lib/
|
92
|
-
#include "src/core/lib/gprpp/
|
113
|
+
#include "src/core/lib/gpr/useful.h"
|
114
|
+
#include "src/core/lib/gprpp/debug_location.h"
|
93
115
|
#include "src/core/lib/gprpp/orphanable.h"
|
116
|
+
#include "src/core/lib/gprpp/ref_counted.h"
|
94
117
|
#include "src/core/lib/gprpp/ref_counted_ptr.h"
|
118
|
+
#include "src/core/lib/gprpp/time.h"
|
119
|
+
#include "src/core/lib/iomgr/closure.h"
|
120
|
+
#include "src/core/lib/iomgr/error.h"
|
121
|
+
#include "src/core/lib/iomgr/exec_ctx.h"
|
122
|
+
#include "src/core/lib/iomgr/pollset_set.h"
|
123
|
+
#include "src/core/lib/iomgr/resolved_address.h"
|
95
124
|
#include "src/core/lib/iomgr/sockaddr.h"
|
96
125
|
#include "src/core/lib/iomgr/socket_utils.h"
|
97
126
|
#include "src/core/lib/iomgr/timer.h"
|
127
|
+
#include "src/core/lib/iomgr/work_serializer.h"
|
128
|
+
#include "src/core/lib/json/json.h"
|
129
|
+
#include "src/core/lib/resolver/resolver.h"
|
98
130
|
#include "src/core/lib/resolver/server_address.h"
|
99
131
|
#include "src/core/lib/security/credentials/credentials.h"
|
100
|
-
#include "src/core/lib/slice/
|
132
|
+
#include "src/core/lib/slice/slice.h"
|
133
|
+
#include "src/core/lib/slice/slice_refcount.h"
|
101
134
|
#include "src/core/lib/slice/slice_string_helpers.h"
|
102
135
|
#include "src/core/lib/surface/call.h"
|
103
136
|
#include "src/core/lib/surface/channel.h"
|
137
|
+
#include "src/core/lib/surface/channel_init.h"
|
138
|
+
#include "src/core/lib/surface/channel_stack_type.h"
|
139
|
+
#include "src/core/lib/transport/connectivity_state.h"
|
140
|
+
#include "src/core/lib/transport/metadata_batch.h"
|
141
|
+
#include "src/core/lib/uri/uri_parser.h"
|
104
142
|
|
105
143
|
#define GRPC_GRPCLB_INITIAL_CONNECT_BACKOFF_SECONDS 1
|
106
144
|
#define GRPC_GRPCLB_RECONNECT_BACKOFF_MULTIPLIER 1.6
|
@@ -534,7 +572,8 @@ std::string GrpcLb::Serverlist::AsText() const {
|
|
534
572
|
} else {
|
535
573
|
grpc_resolved_address addr;
|
536
574
|
ParseServer(server, &addr);
|
537
|
-
|
575
|
+
auto addr_str = grpc_sockaddr_to_string(&addr, false);
|
576
|
+
ipport = addr_str.ok() ? *addr_str : addr_str.status().ToString();
|
538
577
|
}
|
539
578
|
entries.push_back(absl::StrFormat(" %" PRIuPTR ": %s token=%s\n", i,
|
540
579
|
ipport, server.load_balance_token));
|
@@ -582,10 +621,12 @@ ServerAddressList GrpcLb::Serverlist::GetServerAddressList(
|
|
582
621
|
server.load_balance_token, GPR_ARRAY_SIZE(server.load_balance_token));
|
583
622
|
std::string lb_token(server.load_balance_token, lb_token_length);
|
584
623
|
if (lb_token.empty()) {
|
624
|
+
auto addr_uri = grpc_sockaddr_to_uri(&addr);
|
585
625
|
gpr_log(GPR_INFO,
|
586
626
|
"Missing LB token for backend address '%s'. The empty token will "
|
587
627
|
"be used instead",
|
588
|
-
|
628
|
+
addr_uri.ok() ? addr_uri->c_str()
|
629
|
+
: addr_uri.status().ToString().c_str());
|
589
630
|
}
|
590
631
|
// Attach attribute to address containing LB token and stats object.
|
591
632
|
std::map<const char*, std::unique_ptr<ServerAddress::AttributeInterface>>
|
@@ -1236,6 +1277,7 @@ void GrpcLb::BalancerCallState::OnBalancerStatusReceivedLocked(
|
|
1236
1277
|
// If the fallback-at-startup checks are pending, go into fallback mode
|
1237
1278
|
// immediately. This short-circuits the timeout for the fallback-at-startup
|
1238
1279
|
// case.
|
1280
|
+
grpclb_policy()->lb_calld_.reset();
|
1239
1281
|
if (grpclb_policy()->fallback_at_startup_checks_pending_) {
|
1240
1282
|
GPR_ASSERT(!seen_serverlist_);
|
1241
1283
|
gpr_log(GPR_INFO,
|
@@ -1251,7 +1293,6 @@ void GrpcLb::BalancerCallState::OnBalancerStatusReceivedLocked(
|
|
1251
1293
|
// This handles the fallback-after-startup case.
|
1252
1294
|
grpclb_policy()->MaybeEnterFallbackModeAfterStartup();
|
1253
1295
|
}
|
1254
|
-
grpclb_policy()->lb_calld_.reset();
|
1255
1296
|
GPR_ASSERT(!grpclb_policy()->shutting_down_);
|
1256
1297
|
grpclb_policy()->channel_control_helper()->RequestReresolution();
|
1257
1298
|
if (seen_initial_response_) {
|
@@ -1481,7 +1522,8 @@ void GrpcLb::UpdateLocked(UpdateArgs args) {
|
|
1481
1522
|
// Start watching the channel's connectivity state. If the channel
|
1482
1523
|
// goes into state TRANSIENT_FAILURE before the timer fires, we go into
|
1483
1524
|
// fallback mode even if the fallback timeout has not elapsed.
|
1484
|
-
ClientChannel* client_channel =
|
1525
|
+
ClientChannel* client_channel =
|
1526
|
+
ClientChannel::GetFromChannel(Channel::FromC(lb_channel_));
|
1485
1527
|
GPR_ASSERT(client_channel != nullptr);
|
1486
1528
|
// Ref held by callback.
|
1487
1529
|
watcher_ = new StateWatcher(Ref(DEBUG_LOCATION, "StateWatcher"));
|
@@ -1542,7 +1584,8 @@ void GrpcLb::UpdateBalancerChannelLocked(const grpc_channel_args& args) {
|
|
1542
1584
|
}
|
1543
1585
|
|
1544
1586
|
void GrpcLb::CancelBalancerChannelConnectivityWatchLocked() {
|
1545
|
-
ClientChannel* client_channel =
|
1587
|
+
ClientChannel* client_channel =
|
1588
|
+
ClientChannel::GetFromChannel(Channel::FromC(lb_channel_));
|
1546
1589
|
GPR_ASSERT(client_channel != nullptr);
|
1547
1590
|
client_channel->RemoveConnectivityWatcher(watcher_);
|
1548
1591
|
}
|
@@ -1867,17 +1910,14 @@ void RegisterGrpcLbLoadReportingFilter(CoreConfiguration::Builder* builder) {
|
|
1867
1910
|
builder->channel_init()->RegisterStage(
|
1868
1911
|
GRPC_CLIENT_SUBCHANNEL, GRPC_CHANNEL_INIT_BUILTIN_PRIORITY,
|
1869
1912
|
[](ChannelStackBuilder* builder) {
|
1870
|
-
|
1871
|
-
|
1872
|
-
grpc_channel_args_find(args, GRPC_ARG_LB_POLICY_NAME);
|
1873
|
-
if (channel_arg != nullptr && channel_arg->type == GRPC_ARG_STRING &&
|
1874
|
-
strcmp(channel_arg->value.string, "grpclb") == 0) {
|
1913
|
+
if (builder->channel_args().GetString(GRPC_ARG_LB_POLICY_NAME) ==
|
1914
|
+
"grpclb") {
|
1875
1915
|
// TODO(roth): When we get around to re-attempting
|
1876
1916
|
// https://github.com/grpc/grpc/pull/16214, we should try to keep
|
1877
1917
|
// this filter at the very top of the subchannel stack, since that
|
1878
1918
|
// will minimize the number of metadata elements that the filter
|
1879
1919
|
// needs to iterate through to find the ClientStats object.
|
1880
|
-
builder->PrependFilter(&grpc_client_load_reporting_filter
|
1920
|
+
builder->PrependFilter(&grpc_client_load_reporting_filter);
|
1881
1921
|
}
|
1882
1922
|
return true;
|
1883
1923
|
});
|
@@ -18,6 +18,10 @@
|
|
18
18
|
|
19
19
|
#include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h"
|
20
20
|
|
21
|
+
#include <stddef.h>
|
22
|
+
|
23
|
+
#include "absl/container/inlined_vector.h"
|
24
|
+
|
21
25
|
#include "src/core/lib/channel/channel_args.h"
|
22
26
|
#include "src/core/lib/gpr/useful.h"
|
23
27
|
|
@@ -20,10 +20,19 @@
|
|
20
20
|
|
21
21
|
#include "src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h"
|
22
22
|
|
23
|
+
#include <string.h>
|
24
|
+
|
25
|
+
#include <algorithm>
|
26
|
+
|
23
27
|
#include "google/protobuf/duration.upb.h"
|
24
28
|
#include "google/protobuf/timestamp.upb.h"
|
25
29
|
|
26
|
-
#include <grpc/
|
30
|
+
#include <grpc/impl/codegen/gpr_types.h>
|
31
|
+
#include <grpc/support/log.h>
|
32
|
+
#include <grpc/support/time.h>
|
33
|
+
|
34
|
+
#include "src/core/lib/gprpp/memory.h"
|
35
|
+
#include "src/proto/grpc/lb/v1/load_balancer.upb.h"
|
27
36
|
|
28
37
|
namespace grpc_core {
|
29
38
|
|
@@ -21,13 +21,16 @@
|
|
21
21
|
|
22
22
|
#include <grpc/support/port_platform.h>
|
23
23
|
|
24
|
+
#include <stdint.h>
|
25
|
+
|
24
26
|
#include <vector>
|
25
27
|
|
26
|
-
#include
|
28
|
+
#include "upb/upb.h"
|
29
|
+
|
30
|
+
#include <grpc/slice.h>
|
27
31
|
|
28
32
|
#include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h"
|
29
|
-
#include "src/core/lib/
|
30
|
-
#include "src/proto/grpc/lb/v1/load_balancer.upb.h"
|
33
|
+
#include "src/core/lib/gprpp/time.h"
|
31
34
|
|
32
35
|
#define GRPC_GRPCLB_SERVICE_NAME_MAX_LENGTH 128
|
33
36
|
#define GRPC_GRPCLB_SERVER_IP_ADDRESS_MAX_SIZE 16
|
@@ -0,0 +1,408 @@
|
|
1
|
+
//
|
2
|
+
// Copyright 2022 gRPC authors.
|
3
|
+
//
|
4
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
// you may not use this file except in compliance with the License.
|
6
|
+
// You may obtain a copy of the License at
|
7
|
+
//
|
8
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
//
|
10
|
+
// Unless required by applicable law or agreed to in writing, software
|
11
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
// See the License for the specific language governing permissions and
|
14
|
+
// limitations under the License.
|
15
|
+
//
|
16
|
+
|
17
|
+
#include <grpc/support/port_platform.h>
|
18
|
+
|
19
|
+
#include "src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h"
|
20
|
+
|
21
|
+
#include <string.h>
|
22
|
+
|
23
|
+
#include <algorithm>
|
24
|
+
#include <set>
|
25
|
+
#include <string>
|
26
|
+
#include <utility>
|
27
|
+
#include <vector>
|
28
|
+
|
29
|
+
#include "absl/base/thread_annotations.h"
|
30
|
+
#include "absl/memory/memory.h"
|
31
|
+
#include "absl/status/status.h"
|
32
|
+
#include "absl/strings/string_view.h"
|
33
|
+
#include "absl/types/optional.h"
|
34
|
+
#include "google/protobuf/duration.upb.h"
|
35
|
+
#include "upb/upb.hpp"
|
36
|
+
#include "xds/service/orca/v3/orca.upb.h"
|
37
|
+
|
38
|
+
#include <grpc/impl/codegen/connectivity_state.h>
|
39
|
+
#include <grpc/impl/codegen/gpr_types.h>
|
40
|
+
#include <grpc/slice.h>
|
41
|
+
#include <grpc/status.h>
|
42
|
+
#include <grpc/support/alloc.h>
|
43
|
+
#include <grpc/support/log.h>
|
44
|
+
|
45
|
+
#include "src/core/ext/filters/client_channel/backend_metric.h"
|
46
|
+
#include "src/core/ext/filters/client_channel/client_channel_channelz.h"
|
47
|
+
#include "src/core/ext/filters/client_channel/subchannel.h"
|
48
|
+
#include "src/core/ext/filters/client_channel/subchannel_interface_internal.h"
|
49
|
+
#include "src/core/ext/filters/client_channel/subchannel_stream_client.h"
|
50
|
+
#include "src/core/lib/channel/channel_trace.h"
|
51
|
+
#include "src/core/lib/debug/trace.h"
|
52
|
+
#include "src/core/lib/gprpp/debug_location.h"
|
53
|
+
#include "src/core/lib/gprpp/memory.h"
|
54
|
+
#include "src/core/lib/gprpp/orphanable.h"
|
55
|
+
#include "src/core/lib/gprpp/ref_counted_ptr.h"
|
56
|
+
#include "src/core/lib/gprpp/sync.h"
|
57
|
+
#include "src/core/lib/gprpp/time.h"
|
58
|
+
#include "src/core/lib/gprpp/unique_type_name.h"
|
59
|
+
#include "src/core/lib/iomgr/closure.h"
|
60
|
+
#include "src/core/lib/iomgr/error.h"
|
61
|
+
#include "src/core/lib/iomgr/exec_ctx.h"
|
62
|
+
#include "src/core/lib/iomgr/iomgr_fwd.h"
|
63
|
+
#include "src/core/lib/iomgr/pollset_set.h"
|
64
|
+
#include "src/core/lib/slice/slice.h"
|
65
|
+
|
66
|
+
namespace grpc_core {
|
67
|
+
|
68
|
+
namespace {
|
69
|
+
|
70
|
+
TraceFlag grpc_orca_client_trace(false, "orca_client");
|
71
|
+
|
72
|
+
class OrcaWatcher;
|
73
|
+
|
74
|
+
// This producer is registered with a subchannel. It creates a
|
75
|
+
// streaming ORCA call and reports the resulting backend metrics to all
|
76
|
+
// registered watchers.
|
77
|
+
class OrcaProducer : public Subchannel::DataProducerInterface {
|
78
|
+
public:
|
79
|
+
explicit OrcaProducer(RefCountedPtr<Subchannel> subchannel);
|
80
|
+
|
81
|
+
void Orphan() override;
|
82
|
+
|
83
|
+
static UniqueTypeName Type() {
|
84
|
+
static UniqueTypeName::Factory kFactory("orca");
|
85
|
+
return kFactory.Create();
|
86
|
+
}
|
87
|
+
|
88
|
+
UniqueTypeName type() const override { return Type(); }
|
89
|
+
|
90
|
+
// Adds and removes watchers.
|
91
|
+
void AddWatcher(OrcaWatcher* watcher);
|
92
|
+
void RemoveWatcher(OrcaWatcher* watcher);
|
93
|
+
|
94
|
+
private:
|
95
|
+
class ConnectivityWatcher;
|
96
|
+
class OrcaStreamEventHandler;
|
97
|
+
|
98
|
+
// Returns the minimum requested reporting interval across all watchers.
|
99
|
+
Duration GetMinIntervalLocked() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(&mu_);
|
100
|
+
|
101
|
+
// Starts a new stream if we have a connected subchannel.
|
102
|
+
// Called whenever the reporting interval changes or the subchannel
|
103
|
+
// transitions to state READY.
|
104
|
+
void MaybeStartStreamLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&mu_);
|
105
|
+
|
106
|
+
// Handles a connectivity state change on the subchannel.
|
107
|
+
void OnConnectivityStateChange(grpc_connectivity_state state);
|
108
|
+
|
109
|
+
// Called to notify watchers of a new backend metric report.
|
110
|
+
void NotifyWatchers(const BackendMetricData& backend_metric_data);
|
111
|
+
|
112
|
+
RefCountedPtr<Subchannel> subchannel_;
|
113
|
+
RefCountedPtr<ConnectedSubchannel> connected_subchannel_;
|
114
|
+
ConnectivityWatcher* connectivity_watcher_;
|
115
|
+
Mutex mu_;
|
116
|
+
std::set<OrcaWatcher*> watchers_ ABSL_GUARDED_BY(mu_);
|
117
|
+
Duration report_interval_ ABSL_GUARDED_BY(mu_) = Duration::Infinity();
|
118
|
+
OrphanablePtr<SubchannelStreamClient> stream_client_ ABSL_GUARDED_BY(mu_);
|
119
|
+
};
|
120
|
+
|
121
|
+
// This watcher is returned to the LB policy and added to the
|
122
|
+
// client channel SubchannelWrapper.
|
123
|
+
class OrcaWatcher : public InternalSubchannelDataWatcherInterface {
|
124
|
+
public:
|
125
|
+
OrcaWatcher(Duration report_interval,
|
126
|
+
std::unique_ptr<OobBackendMetricWatcher> watcher)
|
127
|
+
: report_interval_(report_interval), watcher_(std::move(watcher)) {}
|
128
|
+
~OrcaWatcher() override;
|
129
|
+
|
130
|
+
Duration report_interval() const { return report_interval_; }
|
131
|
+
OobBackendMetricWatcher* watcher() const { return watcher_.get(); }
|
132
|
+
|
133
|
+
// When the client channel sees this wrapper, it will pass it the real
|
134
|
+
// subchannel to use.
|
135
|
+
void SetSubchannel(Subchannel* subchannel) override;
|
136
|
+
|
137
|
+
private:
|
138
|
+
const Duration report_interval_;
|
139
|
+
std::unique_ptr<OobBackendMetricWatcher> watcher_;
|
140
|
+
RefCountedPtr<OrcaProducer> producer_;
|
141
|
+
};
|
142
|
+
|
143
|
+
//
|
144
|
+
// OrcaProducer::ConnectivityWatcher
|
145
|
+
//
|
146
|
+
|
147
|
+
class OrcaProducer::ConnectivityWatcher
|
148
|
+
: public Subchannel::ConnectivityStateWatcherInterface {
|
149
|
+
public:
|
150
|
+
explicit ConnectivityWatcher(WeakRefCountedPtr<OrcaProducer> producer)
|
151
|
+
: producer_(std::move(producer)),
|
152
|
+
interested_parties_(grpc_pollset_set_create()) {}
|
153
|
+
|
154
|
+
~ConnectivityWatcher() override {
|
155
|
+
grpc_pollset_set_destroy(interested_parties_);
|
156
|
+
}
|
157
|
+
|
158
|
+
void OnConnectivityStateChange() override {
|
159
|
+
auto change = PopConnectivityStateChange();
|
160
|
+
producer_->OnConnectivityStateChange(change.state);
|
161
|
+
}
|
162
|
+
|
163
|
+
grpc_pollset_set* interested_parties() override {
|
164
|
+
return interested_parties_;
|
165
|
+
}
|
166
|
+
|
167
|
+
private:
|
168
|
+
WeakRefCountedPtr<OrcaProducer> producer_;
|
169
|
+
grpc_pollset_set* interested_parties_;
|
170
|
+
};
|
171
|
+
|
172
|
+
//
|
173
|
+
// OrcaProducer::OrcaStreamEventHandler
|
174
|
+
//
|
175
|
+
|
176
|
+
class OrcaProducer::OrcaStreamEventHandler
|
177
|
+
: public SubchannelStreamClient::CallEventHandler {
|
178
|
+
public:
|
179
|
+
OrcaStreamEventHandler(WeakRefCountedPtr<OrcaProducer> producer,
|
180
|
+
Duration report_interval)
|
181
|
+
: producer_(std::move(producer)), report_interval_(report_interval) {}
|
182
|
+
|
183
|
+
Slice GetPathLocked() override {
|
184
|
+
return Slice::FromStaticString(
|
185
|
+
"/xds.service.orca.v3.OpenRcaService/StreamCoreMetrics");
|
186
|
+
}
|
187
|
+
|
188
|
+
void OnCallStartLocked(SubchannelStreamClient* /*client*/) override {}
|
189
|
+
|
190
|
+
void OnRetryTimerStartLocked(SubchannelStreamClient* /*client*/) override {}
|
191
|
+
|
192
|
+
grpc_slice EncodeSendMessageLocked() override {
|
193
|
+
upb::Arena arena;
|
194
|
+
xds_service_orca_v3_OrcaLoadReportRequest* request =
|
195
|
+
xds_service_orca_v3_OrcaLoadReportRequest_new(arena.ptr());
|
196
|
+
gpr_timespec timespec = report_interval_.as_timespec();
|
197
|
+
auto* report_interval =
|
198
|
+
xds_service_orca_v3_OrcaLoadReportRequest_mutable_report_interval(
|
199
|
+
request, arena.ptr());
|
200
|
+
google_protobuf_Duration_set_seconds(report_interval, timespec.tv_sec);
|
201
|
+
google_protobuf_Duration_set_nanos(report_interval, timespec.tv_nsec);
|
202
|
+
size_t buf_length;
|
203
|
+
char* buf = xds_service_orca_v3_OrcaLoadReportRequest_serialize(
|
204
|
+
request, arena.ptr(), &buf_length);
|
205
|
+
grpc_slice request_slice = GRPC_SLICE_MALLOC(buf_length);
|
206
|
+
memcpy(GRPC_SLICE_START_PTR(request_slice), buf, buf_length);
|
207
|
+
return request_slice;
|
208
|
+
}
|
209
|
+
|
210
|
+
absl::Status RecvMessageReadyLocked(
|
211
|
+
SubchannelStreamClient* /*client*/,
|
212
|
+
absl::string_view serialized_message) override {
|
213
|
+
auto* allocator = new BackendMetricAllocator(producer_);
|
214
|
+
auto* backend_metric_data =
|
215
|
+
ParseBackendMetricData(serialized_message, allocator);
|
216
|
+
if (backend_metric_data == nullptr) {
|
217
|
+
delete allocator;
|
218
|
+
return absl::InvalidArgumentError("unable to parse Orca response");
|
219
|
+
}
|
220
|
+
allocator->AsyncNotifyWatchersAndDelete();
|
221
|
+
return absl::OkStatus();
|
222
|
+
}
|
223
|
+
|
224
|
+
void RecvTrailingMetadataReadyLocked(SubchannelStreamClient* /*client*/,
|
225
|
+
grpc_status_code status) override {
|
226
|
+
if (status == GRPC_STATUS_UNIMPLEMENTED) {
|
227
|
+
static const char kErrorMessage[] =
|
228
|
+
"Orca stream returned UNIMPLEMENTED; disabling";
|
229
|
+
gpr_log(GPR_ERROR, kErrorMessage);
|
230
|
+
auto* channelz_node = producer_->subchannel_->channelz_node();
|
231
|
+
if (channelz_node != nullptr) {
|
232
|
+
channelz_node->AddTraceEvent(
|
233
|
+
channelz::ChannelTrace::Error,
|
234
|
+
grpc_slice_from_static_string(kErrorMessage));
|
235
|
+
}
|
236
|
+
}
|
237
|
+
}
|
238
|
+
|
239
|
+
private:
|
240
|
+
// This class acts as storage for the parsed backend metric data. It
|
241
|
+
// is injected into ParseBackendMetricData() as an allocator that
|
242
|
+
// returns internal storage. It then also acts as a place to hold
|
243
|
+
// onto the data during an async hop into the ExecCtx before sending
|
244
|
+
// notifications, which avoids lock inversion problems due to
|
245
|
+
// acquiring producer_->mu_ while holding the lock from inside of
|
246
|
+
// SubchannelStreamClient.
|
247
|
+
class BackendMetricAllocator : public BackendMetricAllocatorInterface {
|
248
|
+
public:
|
249
|
+
explicit BackendMetricAllocator(WeakRefCountedPtr<OrcaProducer> producer)
|
250
|
+
: producer_(std::move(producer)) {}
|
251
|
+
|
252
|
+
BackendMetricData* AllocateBackendMetricData() override {
|
253
|
+
return &backend_metric_data_;
|
254
|
+
}
|
255
|
+
|
256
|
+
char* AllocateString(size_t size) override {
|
257
|
+
char* string = static_cast<char*>(gpr_malloc(size));
|
258
|
+
string_storage_.emplace_back(string);
|
259
|
+
return string;
|
260
|
+
}
|
261
|
+
|
262
|
+
// Notifies watchers asynchronously and then deletes the
|
263
|
+
// BackendMetricAllocator object.
|
264
|
+
void AsyncNotifyWatchersAndDelete() {
|
265
|
+
GRPC_CLOSURE_INIT(&closure_, NotifyWatchersInExecCtx, this, nullptr);
|
266
|
+
ExecCtx::Run(DEBUG_LOCATION, &closure_, GRPC_ERROR_NONE);
|
267
|
+
}
|
268
|
+
|
269
|
+
private:
|
270
|
+
static void NotifyWatchersInExecCtx(void* arg,
|
271
|
+
grpc_error_handle /*error*/) {
|
272
|
+
auto* self = static_cast<BackendMetricAllocator*>(arg);
|
273
|
+
self->producer_->NotifyWatchers(self->backend_metric_data_);
|
274
|
+
delete self;
|
275
|
+
}
|
276
|
+
|
277
|
+
WeakRefCountedPtr<OrcaProducer> producer_;
|
278
|
+
BackendMetricData backend_metric_data_;
|
279
|
+
std::vector<UniquePtr<char>> string_storage_;
|
280
|
+
grpc_closure closure_;
|
281
|
+
};
|
282
|
+
|
283
|
+
WeakRefCountedPtr<OrcaProducer> producer_;
|
284
|
+
const Duration report_interval_;
|
285
|
+
};
|
286
|
+
|
287
|
+
//
|
288
|
+
// OrcaProducer
|
289
|
+
//
|
290
|
+
|
291
|
+
OrcaProducer::OrcaProducer(RefCountedPtr<Subchannel> subchannel)
|
292
|
+
: subchannel_(std::move(subchannel)) {
|
293
|
+
subchannel_->AddDataProducer(this);
|
294
|
+
connected_subchannel_ = subchannel_->connected_subchannel();
|
295
|
+
auto connectivity_watcher = MakeRefCounted<ConnectivityWatcher>(WeakRef());
|
296
|
+
connectivity_watcher_ = connectivity_watcher.get();
|
297
|
+
subchannel_->WatchConnectivityState(
|
298
|
+
connected_subchannel_ == nullptr ? GRPC_CHANNEL_IDLE : GRPC_CHANNEL_READY,
|
299
|
+
/*health_check_service_name=*/absl::nullopt,
|
300
|
+
std::move(connectivity_watcher));
|
301
|
+
}
|
302
|
+
|
303
|
+
void OrcaProducer::Orphan() {
|
304
|
+
{
|
305
|
+
MutexLock lock(&mu_);
|
306
|
+
stream_client_.reset();
|
307
|
+
}
|
308
|
+
subchannel_->CancelConnectivityStateWatch(
|
309
|
+
/*health_check_service_name=*/absl::nullopt, connectivity_watcher_);
|
310
|
+
subchannel_->RemoveDataProducer(this);
|
311
|
+
}
|
312
|
+
|
313
|
+
void OrcaProducer::AddWatcher(OrcaWatcher* watcher) {
|
314
|
+
MutexLock lock(&mu_);
|
315
|
+
watchers_.insert(watcher);
|
316
|
+
Duration watcher_interval = watcher->report_interval();
|
317
|
+
if (watcher_interval < report_interval_) {
|
318
|
+
report_interval_ = watcher_interval;
|
319
|
+
stream_client_.reset();
|
320
|
+
MaybeStartStreamLocked();
|
321
|
+
}
|
322
|
+
}
|
323
|
+
|
324
|
+
void OrcaProducer::RemoveWatcher(OrcaWatcher* watcher) {
|
325
|
+
MutexLock lock(&mu_);
|
326
|
+
watchers_.erase(watcher);
|
327
|
+
if (watchers_.empty()) {
|
328
|
+
stream_client_.reset();
|
329
|
+
return;
|
330
|
+
}
|
331
|
+
Duration new_interval = GetMinIntervalLocked();
|
332
|
+
if (new_interval < report_interval_) {
|
333
|
+
report_interval_ = new_interval;
|
334
|
+
stream_client_.reset();
|
335
|
+
MaybeStartStreamLocked();
|
336
|
+
}
|
337
|
+
}
|
338
|
+
|
339
|
+
Duration OrcaProducer::GetMinIntervalLocked() const {
|
340
|
+
Duration duration = Duration::Infinity();
|
341
|
+
for (OrcaWatcher* watcher : watchers_) {
|
342
|
+
Duration watcher_interval = watcher->report_interval();
|
343
|
+
if (watcher_interval < duration) duration = watcher_interval;
|
344
|
+
}
|
345
|
+
return duration;
|
346
|
+
}
|
347
|
+
|
348
|
+
void OrcaProducer::MaybeStartStreamLocked() {
|
349
|
+
if (connected_subchannel_ == nullptr) return;
|
350
|
+
stream_client_ = MakeOrphanable<SubchannelStreamClient>(
|
351
|
+
connected_subchannel_, subchannel_->pollset_set(),
|
352
|
+
absl::make_unique<OrcaStreamEventHandler>(WeakRef(), report_interval_),
|
353
|
+
GRPC_TRACE_FLAG_ENABLED(grpc_orca_client_trace) ? "OrcaClient" : nullptr);
|
354
|
+
}
|
355
|
+
|
356
|
+
void OrcaProducer::NotifyWatchers(
|
357
|
+
const BackendMetricData& backend_metric_data) {
|
358
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_orca_client_trace)) {
|
359
|
+
gpr_log(GPR_INFO, "OrcaProducer %p: reporting backend metrics to watchers",
|
360
|
+
this);
|
361
|
+
}
|
362
|
+
MutexLock lock(&mu_);
|
363
|
+
for (OrcaWatcher* watcher : watchers_) {
|
364
|
+
watcher->watcher()->OnBackendMetricReport(backend_metric_data);
|
365
|
+
}
|
366
|
+
}
|
367
|
+
|
368
|
+
void OrcaProducer::OnConnectivityStateChange(grpc_connectivity_state state) {
|
369
|
+
MutexLock lock(&mu_);
|
370
|
+
if (state == GRPC_CHANNEL_READY) {
|
371
|
+
connected_subchannel_ = subchannel_->connected_subchannel();
|
372
|
+
if (!watchers_.empty()) MaybeStartStreamLocked();
|
373
|
+
} else {
|
374
|
+
connected_subchannel_.reset();
|
375
|
+
stream_client_.reset();
|
376
|
+
}
|
377
|
+
}
|
378
|
+
|
379
|
+
//
|
380
|
+
// OrcaWatcher
|
381
|
+
//
|
382
|
+
|
383
|
+
OrcaWatcher::~OrcaWatcher() {
|
384
|
+
if (producer_ != nullptr) producer_->RemoveWatcher(this);
|
385
|
+
}
|
386
|
+
|
387
|
+
void OrcaWatcher::SetSubchannel(Subchannel* subchannel) {
|
388
|
+
// Check if our producer is already registered with the subchannel.
|
389
|
+
// If not, create a new one, which will register itself with the subchannel.
|
390
|
+
auto* p = static_cast<OrcaProducer*>(
|
391
|
+
subchannel->GetDataProducer(OrcaProducer::Type()));
|
392
|
+
if (p != nullptr) producer_ = p->RefIfNonZero();
|
393
|
+
if (producer_ == nullptr) {
|
394
|
+
producer_ = MakeRefCounted<OrcaProducer>(subchannel->Ref());
|
395
|
+
}
|
396
|
+
// Register ourself with the producer.
|
397
|
+
producer_->AddWatcher(this);
|
398
|
+
}
|
399
|
+
|
400
|
+
} // namespace
|
401
|
+
|
402
|
+
std::unique_ptr<SubchannelInterface::DataWatcherInterface>
|
403
|
+
MakeOobBackendMetricWatcher(Duration report_interval,
|
404
|
+
std::unique_ptr<OobBackendMetricWatcher> watcher) {
|
405
|
+
return absl::make_unique<OrcaWatcher>(report_interval, std::move(watcher));
|
406
|
+
}
|
407
|
+
|
408
|
+
} // namespace grpc_core
|