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
@@ -1,1173 +0,0 @@
|
|
1
|
-
//
|
2
|
-
// Copyright 2018 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 <inttypes.h>
|
20
|
-
#include <stddef.h>
|
21
|
-
|
22
|
-
#include <algorithm>
|
23
|
-
#include <map>
|
24
|
-
#include <memory>
|
25
|
-
#include <set>
|
26
|
-
#include <string>
|
27
|
-
#include <type_traits>
|
28
|
-
#include <utility>
|
29
|
-
#include <vector>
|
30
|
-
|
31
|
-
#include "absl/status/status.h"
|
32
|
-
#include "absl/status/statusor.h"
|
33
|
-
#include "absl/strings/str_cat.h"
|
34
|
-
#include "absl/strings/str_join.h"
|
35
|
-
#include "absl/strings/string_view.h"
|
36
|
-
#include "absl/types/optional.h"
|
37
|
-
|
38
|
-
#include <grpc/impl/channel_arg_names.h>
|
39
|
-
#include <grpc/impl/connectivity_state.h>
|
40
|
-
#include <grpc/support/json.h>
|
41
|
-
#include <grpc/support/log.h>
|
42
|
-
|
43
|
-
#include "src/core/ext/filters/client_channel/lb_policy/address_filtering.h"
|
44
|
-
#include "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h"
|
45
|
-
#include "src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h"
|
46
|
-
#include "src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h"
|
47
|
-
#include "src/core/ext/xds/xds_bootstrap.h"
|
48
|
-
#include "src/core/ext/xds/xds_bootstrap_grpc.h"
|
49
|
-
#include "src/core/ext/xds/xds_client.h"
|
50
|
-
#include "src/core/ext/xds/xds_client_grpc.h"
|
51
|
-
#include "src/core/ext/xds/xds_client_stats.h"
|
52
|
-
#include "src/core/ext/xds/xds_endpoint.h"
|
53
|
-
#include "src/core/lib/channel/channel_args.h"
|
54
|
-
#include "src/core/lib/config/core_configuration.h"
|
55
|
-
#include "src/core/lib/debug/trace.h"
|
56
|
-
#include "src/core/lib/gprpp/debug_location.h"
|
57
|
-
#include "src/core/lib/gprpp/no_destruct.h"
|
58
|
-
#include "src/core/lib/gprpp/orphanable.h"
|
59
|
-
#include "src/core/lib/gprpp/ref_counted_ptr.h"
|
60
|
-
#include "src/core/lib/gprpp/ref_counted_string.h"
|
61
|
-
#include "src/core/lib/gprpp/validation_errors.h"
|
62
|
-
#include "src/core/lib/gprpp/work_serializer.h"
|
63
|
-
#include "src/core/lib/iomgr/pollset_set.h"
|
64
|
-
#include "src/core/lib/json/json.h"
|
65
|
-
#include "src/core/lib/json/json_args.h"
|
66
|
-
#include "src/core/lib/json/json_object_loader.h"
|
67
|
-
#include "src/core/lib/json/json_writer.h"
|
68
|
-
#include "src/core/lib/load_balancing/delegating_helper.h"
|
69
|
-
#include "src/core/lib/load_balancing/lb_policy.h"
|
70
|
-
#include "src/core/lib/load_balancing/lb_policy_factory.h"
|
71
|
-
#include "src/core/lib/load_balancing/lb_policy_registry.h"
|
72
|
-
#include "src/core/lib/resolver/endpoint_addresses.h"
|
73
|
-
#include "src/core/lib/resolver/resolver.h"
|
74
|
-
#include "src/core/lib/resolver/resolver_registry.h"
|
75
|
-
|
76
|
-
#define GRPC_EDS_DEFAULT_FALLBACK_TIMEOUT 10000
|
77
|
-
|
78
|
-
namespace grpc_core {
|
79
|
-
|
80
|
-
TraceFlag grpc_lb_xds_cluster_resolver_trace(false, "xds_cluster_resolver_lb");
|
81
|
-
|
82
|
-
namespace {
|
83
|
-
|
84
|
-
constexpr absl::string_view kXdsClusterResolver =
|
85
|
-
"xds_cluster_resolver_experimental";
|
86
|
-
|
87
|
-
// Config for EDS LB policy.
|
88
|
-
class XdsClusterResolverLbConfig : public LoadBalancingPolicy::Config {
|
89
|
-
public:
|
90
|
-
struct DiscoveryMechanism {
|
91
|
-
std::string cluster_name;
|
92
|
-
absl::optional<GrpcXdsBootstrap::GrpcXdsServer> lrs_load_reporting_server;
|
93
|
-
uint32_t max_concurrent_requests;
|
94
|
-
enum DiscoveryMechanismType {
|
95
|
-
EDS,
|
96
|
-
LOGICAL_DNS,
|
97
|
-
};
|
98
|
-
DiscoveryMechanismType type;
|
99
|
-
std::string eds_service_name;
|
100
|
-
std::string dns_hostname;
|
101
|
-
|
102
|
-
Json::Array override_host_statuses;
|
103
|
-
|
104
|
-
// This is type Json::Object instead of OutlierDetectionConfig, because we
|
105
|
-
// don't actually need to validate the contents of the outlier detection
|
106
|
-
// config here. In this case, the JSON is generated by the CDS policy
|
107
|
-
// instead of coming from service config, so it's not actually any better
|
108
|
-
// to catch the problem here than it is to catch it in the
|
109
|
-
// outlier_detection policy itself, so here we just act as a pass-through.
|
110
|
-
absl::optional<Json::Object> outlier_detection_lb_config;
|
111
|
-
|
112
|
-
bool operator==(const DiscoveryMechanism& other) const {
|
113
|
-
return (cluster_name == other.cluster_name &&
|
114
|
-
lrs_load_reporting_server == other.lrs_load_reporting_server &&
|
115
|
-
max_concurrent_requests == other.max_concurrent_requests &&
|
116
|
-
type == other.type &&
|
117
|
-
eds_service_name == other.eds_service_name &&
|
118
|
-
dns_hostname == other.dns_hostname &&
|
119
|
-
override_host_statuses == other.override_host_statuses &&
|
120
|
-
outlier_detection_lb_config == other.outlier_detection_lb_config);
|
121
|
-
}
|
122
|
-
|
123
|
-
static const JsonLoaderInterface* JsonLoader(const JsonArgs&);
|
124
|
-
void JsonPostLoad(const Json& json, const JsonArgs& args,
|
125
|
-
ValidationErrors* errors);
|
126
|
-
};
|
127
|
-
|
128
|
-
XdsClusterResolverLbConfig() = default;
|
129
|
-
|
130
|
-
XdsClusterResolverLbConfig(const XdsClusterResolverLbConfig&) = delete;
|
131
|
-
XdsClusterResolverLbConfig& operator=(const XdsClusterResolverLbConfig&) =
|
132
|
-
delete;
|
133
|
-
|
134
|
-
XdsClusterResolverLbConfig(XdsClusterResolverLbConfig&& other) = delete;
|
135
|
-
XdsClusterResolverLbConfig& operator=(XdsClusterResolverLbConfig&& other) =
|
136
|
-
delete;
|
137
|
-
|
138
|
-
absl::string_view name() const override { return kXdsClusterResolver; }
|
139
|
-
|
140
|
-
const std::vector<DiscoveryMechanism>& discovery_mechanisms() const {
|
141
|
-
return discovery_mechanisms_;
|
142
|
-
}
|
143
|
-
|
144
|
-
const Json& xds_lb_policy() const { return xds_lb_policy_; }
|
145
|
-
|
146
|
-
static const JsonLoaderInterface* JsonLoader(const JsonArgs&);
|
147
|
-
void JsonPostLoad(const Json& json, const JsonArgs& args,
|
148
|
-
ValidationErrors* errors);
|
149
|
-
|
150
|
-
private:
|
151
|
-
std::vector<DiscoveryMechanism> discovery_mechanisms_;
|
152
|
-
Json xds_lb_policy_;
|
153
|
-
};
|
154
|
-
|
155
|
-
// Xds Cluster Resolver LB policy.
|
156
|
-
class XdsClusterResolverLb : public LoadBalancingPolicy {
|
157
|
-
public:
|
158
|
-
XdsClusterResolverLb(RefCountedPtr<XdsClient> xds_client, Args args);
|
159
|
-
|
160
|
-
absl::string_view name() const override { return kXdsClusterResolver; }
|
161
|
-
|
162
|
-
absl::Status UpdateLocked(UpdateArgs args) override;
|
163
|
-
void ResetBackoffLocked() override;
|
164
|
-
void ExitIdleLocked() override;
|
165
|
-
|
166
|
-
private:
|
167
|
-
// Discovery Mechanism Base class
|
168
|
-
//
|
169
|
-
// Implemented by EDS and LOGICAL_DNS.
|
170
|
-
//
|
171
|
-
// Implementations are responsible for calling the LB policy's
|
172
|
-
// OnEndpointChanged(), OnError(), and OnResourceDoesNotExist()
|
173
|
-
// methods when the corresponding events occur.
|
174
|
-
//
|
175
|
-
// Must implement Orphan() method to cancel the watchers.
|
176
|
-
class DiscoveryMechanism : public InternallyRefCounted<DiscoveryMechanism> {
|
177
|
-
public:
|
178
|
-
DiscoveryMechanism(
|
179
|
-
RefCountedPtr<XdsClusterResolverLb> xds_cluster_resolver_lb,
|
180
|
-
size_t index)
|
181
|
-
: parent_(std::move(xds_cluster_resolver_lb)), index_(index) {}
|
182
|
-
|
183
|
-
XdsClusterResolverLb* parent() const { return parent_.get(); }
|
184
|
-
size_t index() const { return index_; }
|
185
|
-
|
186
|
-
virtual void Start() = 0;
|
187
|
-
virtual Json::Array override_child_policy() = 0;
|
188
|
-
virtual bool disable_reresolution() = 0;
|
189
|
-
|
190
|
-
private:
|
191
|
-
RefCountedPtr<XdsClusterResolverLb> parent_;
|
192
|
-
// Stores its own index in the vector of DiscoveryMechanism.
|
193
|
-
size_t index_;
|
194
|
-
};
|
195
|
-
|
196
|
-
class EdsDiscoveryMechanism : public DiscoveryMechanism {
|
197
|
-
public:
|
198
|
-
EdsDiscoveryMechanism(
|
199
|
-
RefCountedPtr<XdsClusterResolverLb> xds_cluster_resolver_lb,
|
200
|
-
size_t index)
|
201
|
-
: DiscoveryMechanism(std::move(xds_cluster_resolver_lb), index) {}
|
202
|
-
void Start() override;
|
203
|
-
void Orphan() override;
|
204
|
-
Json::Array override_child_policy() override { return Json::Array{}; }
|
205
|
-
bool disable_reresolution() override { return true; }
|
206
|
-
|
207
|
-
private:
|
208
|
-
class EndpointWatcher : public XdsEndpointResourceType::WatcherInterface {
|
209
|
-
public:
|
210
|
-
explicit EndpointWatcher(
|
211
|
-
RefCountedPtr<EdsDiscoveryMechanism> discovery_mechanism)
|
212
|
-
: discovery_mechanism_(std::move(discovery_mechanism)) {}
|
213
|
-
~EndpointWatcher() override {
|
214
|
-
discovery_mechanism_.reset(DEBUG_LOCATION, "EndpointWatcher");
|
215
|
-
}
|
216
|
-
void OnResourceChanged(
|
217
|
-
std::shared_ptr<const XdsEndpointResource> update) override {
|
218
|
-
RefCountedPtr<EndpointWatcher> self = Ref();
|
219
|
-
discovery_mechanism_->parent()->work_serializer()->Run(
|
220
|
-
[self = std::move(self), update = std::move(update)]() mutable {
|
221
|
-
self->OnResourceChangedHelper(std::move(update));
|
222
|
-
},
|
223
|
-
DEBUG_LOCATION);
|
224
|
-
}
|
225
|
-
void OnError(absl::Status status) override {
|
226
|
-
RefCountedPtr<EndpointWatcher> self = Ref();
|
227
|
-
discovery_mechanism_->parent()->work_serializer()->Run(
|
228
|
-
[self = std::move(self), status = std::move(status)]() mutable {
|
229
|
-
self->OnErrorHelper(std::move(status));
|
230
|
-
},
|
231
|
-
DEBUG_LOCATION);
|
232
|
-
}
|
233
|
-
void OnResourceDoesNotExist() override {
|
234
|
-
RefCountedPtr<EndpointWatcher> self = Ref();
|
235
|
-
discovery_mechanism_->parent()->work_serializer()->Run(
|
236
|
-
[self = std::move(self)]() {
|
237
|
-
self->OnResourceDoesNotExistHelper();
|
238
|
-
},
|
239
|
-
DEBUG_LOCATION);
|
240
|
-
}
|
241
|
-
|
242
|
-
private:
|
243
|
-
// Code accessing protected methods of `DiscoveryMechanism` need to be
|
244
|
-
// in methods of this class rather than in lambdas to work around an MSVC
|
245
|
-
// bug.
|
246
|
-
void OnResourceChangedHelper(
|
247
|
-
std::shared_ptr<const XdsEndpointResource> update) {
|
248
|
-
std::string resolution_note;
|
249
|
-
if (update->priorities.empty()) {
|
250
|
-
resolution_note = absl::StrCat(
|
251
|
-
"EDS resource ", discovery_mechanism_->GetEdsResourceName(),
|
252
|
-
" contains no localities");
|
253
|
-
} else {
|
254
|
-
std::set<std::string> empty_localities;
|
255
|
-
for (const auto& priority : update->priorities) {
|
256
|
-
for (const auto& p : priority.localities) {
|
257
|
-
if (p.second.endpoints.empty()) {
|
258
|
-
empty_localities.insert(p.first->AsHumanReadableString());
|
259
|
-
}
|
260
|
-
}
|
261
|
-
}
|
262
|
-
if (!empty_localities.empty()) {
|
263
|
-
resolution_note = absl::StrCat(
|
264
|
-
"EDS resource ", discovery_mechanism_->GetEdsResourceName(),
|
265
|
-
" contains empty localities: [",
|
266
|
-
absl::StrJoin(empty_localities, "; "), "]");
|
267
|
-
}
|
268
|
-
}
|
269
|
-
discovery_mechanism_->parent()->OnEndpointChanged(
|
270
|
-
discovery_mechanism_->index(), std::move(update),
|
271
|
-
std::move(resolution_note));
|
272
|
-
}
|
273
|
-
void OnErrorHelper(absl::Status status) {
|
274
|
-
discovery_mechanism_->parent()->OnError(
|
275
|
-
discovery_mechanism_->index(),
|
276
|
-
absl::StrCat("EDS watcher error for resource ",
|
277
|
-
discovery_mechanism_->GetEdsResourceName(), " (",
|
278
|
-
status.ToString(), ")"));
|
279
|
-
}
|
280
|
-
void OnResourceDoesNotExistHelper() {
|
281
|
-
discovery_mechanism_->parent()->OnResourceDoesNotExist(
|
282
|
-
discovery_mechanism_->index(),
|
283
|
-
absl::StrCat("EDS resource ",
|
284
|
-
discovery_mechanism_->GetEdsResourceName(),
|
285
|
-
" does not exist"));
|
286
|
-
}
|
287
|
-
RefCountedPtr<EdsDiscoveryMechanism> discovery_mechanism_;
|
288
|
-
};
|
289
|
-
|
290
|
-
// This is necessary only because of a bug in msvc where nested class
|
291
|
-
// cannot access protected member in base class.
|
292
|
-
friend class EndpointWatcher;
|
293
|
-
|
294
|
-
absl::string_view GetEdsResourceName() const {
|
295
|
-
auto& config = parent()->config_->discovery_mechanisms()[index()];
|
296
|
-
if (!config.eds_service_name.empty()) return config.eds_service_name;
|
297
|
-
return config.cluster_name;
|
298
|
-
}
|
299
|
-
|
300
|
-
// Note that this is not owned, so this pointer must never be dereferenced.
|
301
|
-
EndpointWatcher* watcher_ = nullptr;
|
302
|
-
};
|
303
|
-
|
304
|
-
class LogicalDNSDiscoveryMechanism : public DiscoveryMechanism {
|
305
|
-
public:
|
306
|
-
LogicalDNSDiscoveryMechanism(
|
307
|
-
RefCountedPtr<XdsClusterResolverLb> xds_cluster_resolver_lb,
|
308
|
-
size_t index)
|
309
|
-
: DiscoveryMechanism(std::move(xds_cluster_resolver_lb), index) {}
|
310
|
-
void Start() override;
|
311
|
-
void Orphan() override;
|
312
|
-
Json::Array override_child_policy() override {
|
313
|
-
return {
|
314
|
-
Json::FromObject({
|
315
|
-
{"pick_first", Json::FromObject({})},
|
316
|
-
}),
|
317
|
-
};
|
318
|
-
}
|
319
|
-
bool disable_reresolution() override { return false; };
|
320
|
-
|
321
|
-
private:
|
322
|
-
class ResolverResultHandler : public Resolver::ResultHandler {
|
323
|
-
public:
|
324
|
-
explicit ResolverResultHandler(
|
325
|
-
RefCountedPtr<LogicalDNSDiscoveryMechanism> discovery_mechanism)
|
326
|
-
: discovery_mechanism_(std::move(discovery_mechanism)) {}
|
327
|
-
|
328
|
-
~ResolverResultHandler() override {}
|
329
|
-
|
330
|
-
void ReportResult(Resolver::Result result) override;
|
331
|
-
|
332
|
-
private:
|
333
|
-
RefCountedPtr<LogicalDNSDiscoveryMechanism> discovery_mechanism_;
|
334
|
-
};
|
335
|
-
|
336
|
-
// This is necessary only because of a bug in msvc where nested class cannot
|
337
|
-
// access protected member in base class.
|
338
|
-
friend class ResolverResultHandler;
|
339
|
-
|
340
|
-
absl::string_view GetDnsHostname() const {
|
341
|
-
auto& config = parent()->config_->discovery_mechanisms()[index()];
|
342
|
-
return config.dns_hostname;
|
343
|
-
}
|
344
|
-
|
345
|
-
OrphanablePtr<Resolver> resolver_;
|
346
|
-
};
|
347
|
-
|
348
|
-
struct DiscoveryMechanismEntry {
|
349
|
-
OrphanablePtr<DiscoveryMechanism> discovery_mechanism;
|
350
|
-
// Most recent update reported by the discovery mechanism.
|
351
|
-
std::shared_ptr<const XdsEndpointResource> latest_update;
|
352
|
-
// Last resolution note reported by the discovery mechanism, if any.
|
353
|
-
std::string resolution_note;
|
354
|
-
// State used to retain child policy names for priority policy.
|
355
|
-
std::vector<size_t /*child_number*/> priority_child_numbers;
|
356
|
-
size_t next_available_child_number = 0;
|
357
|
-
|
358
|
-
const XdsClusterResolverLbConfig::DiscoveryMechanism& config() const;
|
359
|
-
|
360
|
-
// Returns the child policy name for a given priority.
|
361
|
-
std::string GetChildPolicyName(size_t priority) const;
|
362
|
-
};
|
363
|
-
|
364
|
-
class Helper : public ParentOwningDelegatingChannelControlHelper<
|
365
|
-
XdsClusterResolverLb> {
|
366
|
-
public:
|
367
|
-
explicit Helper(
|
368
|
-
RefCountedPtr<XdsClusterResolverLb> xds_cluster_resolver_policy)
|
369
|
-
: ParentOwningDelegatingChannelControlHelper(
|
370
|
-
std::move(xds_cluster_resolver_policy)) {}
|
371
|
-
|
372
|
-
// This is a no-op, because we get the addresses from the xds
|
373
|
-
// client, which is a watch-based API.
|
374
|
-
// TODO(roth): Don't we need to propagate this for LOGICAL_DNS clusters?
|
375
|
-
void RequestReresolution() override {}
|
376
|
-
};
|
377
|
-
|
378
|
-
~XdsClusterResolverLb() override;
|
379
|
-
|
380
|
-
void ShutdownLocked() override;
|
381
|
-
|
382
|
-
void OnEndpointChanged(size_t index,
|
383
|
-
std::shared_ptr<const XdsEndpointResource> update,
|
384
|
-
std::string resolution_note);
|
385
|
-
void OnError(size_t index, std::string resolution_note);
|
386
|
-
void OnResourceDoesNotExist(size_t index, std::string resolution_note);
|
387
|
-
|
388
|
-
void MaybeDestroyChildPolicyLocked();
|
389
|
-
|
390
|
-
absl::Status UpdateChildPolicyLocked();
|
391
|
-
OrphanablePtr<LoadBalancingPolicy> CreateChildPolicyLocked(
|
392
|
-
const ChannelArgs& args);
|
393
|
-
EndpointAddressesList CreateChildPolicyAddressesLocked();
|
394
|
-
std::string CreateChildPolicyResolutionNoteLocked();
|
395
|
-
RefCountedPtr<Config> CreateChildPolicyConfigLocked();
|
396
|
-
ChannelArgs CreateChildPolicyArgsLocked(const ChannelArgs& args_in);
|
397
|
-
|
398
|
-
// The xds client and endpoint watcher.
|
399
|
-
RefCountedPtr<XdsClient> xds_client_;
|
400
|
-
|
401
|
-
// Current channel args and config from the resolver.
|
402
|
-
ChannelArgs args_;
|
403
|
-
RefCountedPtr<XdsClusterResolverLbConfig> config_;
|
404
|
-
|
405
|
-
// Internal state.
|
406
|
-
bool shutting_down_ = false;
|
407
|
-
|
408
|
-
// Vector of discovery mechansism entries in priority order.
|
409
|
-
std::vector<DiscoveryMechanismEntry> discovery_mechanisms_;
|
410
|
-
|
411
|
-
OrphanablePtr<LoadBalancingPolicy> child_policy_;
|
412
|
-
};
|
413
|
-
|
414
|
-
//
|
415
|
-
// XdsClusterResolverLb::EdsDiscoveryMechanism
|
416
|
-
//
|
417
|
-
|
418
|
-
void XdsClusterResolverLb::EdsDiscoveryMechanism::Start() {
|
419
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
|
420
|
-
gpr_log(GPR_INFO,
|
421
|
-
"[xds_cluster_resolver_lb %p] eds discovery mechanism %" PRIuPTR
|
422
|
-
":%p starting xds watch for %s",
|
423
|
-
parent(), index(), this, std::string(GetEdsResourceName()).c_str());
|
424
|
-
}
|
425
|
-
auto watcher = MakeRefCounted<EndpointWatcher>(
|
426
|
-
Ref(DEBUG_LOCATION, "EdsDiscoveryMechanism"));
|
427
|
-
watcher_ = watcher.get();
|
428
|
-
XdsEndpointResourceType::StartWatch(parent()->xds_client_.get(),
|
429
|
-
GetEdsResourceName(), std::move(watcher));
|
430
|
-
}
|
431
|
-
|
432
|
-
void XdsClusterResolverLb::EdsDiscoveryMechanism::Orphan() {
|
433
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
|
434
|
-
gpr_log(GPR_INFO,
|
435
|
-
"[xds_cluster_resolver_lb %p] eds discovery mechanism %" PRIuPTR
|
436
|
-
":%p cancelling xds watch for %s",
|
437
|
-
parent(), index(), this, std::string(GetEdsResourceName()).c_str());
|
438
|
-
}
|
439
|
-
XdsEndpointResourceType::CancelWatch(parent()->xds_client_.get(),
|
440
|
-
GetEdsResourceName(), watcher_);
|
441
|
-
Unref();
|
442
|
-
}
|
443
|
-
|
444
|
-
//
|
445
|
-
// XdsClusterResolverLb::LogicalDNSDiscoveryMechanism
|
446
|
-
//
|
447
|
-
|
448
|
-
void XdsClusterResolverLb::LogicalDNSDiscoveryMechanism::Start() {
|
449
|
-
std::string target;
|
450
|
-
ChannelArgs args = parent()->args_;
|
451
|
-
auto* fake_resolver_response_generator =
|
452
|
-
args.GetPointer<FakeResolverResponseGenerator>(
|
453
|
-
GRPC_ARG_XDS_LOGICAL_DNS_CLUSTER_FAKE_RESOLVER_RESPONSE_GENERATOR);
|
454
|
-
if (fake_resolver_response_generator != nullptr) {
|
455
|
-
target = absl::StrCat("fake:", GetDnsHostname());
|
456
|
-
args = args.SetObject(fake_resolver_response_generator->Ref());
|
457
|
-
} else {
|
458
|
-
target = absl::StrCat("dns:", GetDnsHostname());
|
459
|
-
}
|
460
|
-
resolver_ = CoreConfiguration::Get().resolver_registry().CreateResolver(
|
461
|
-
target.c_str(), args, parent()->interested_parties(),
|
462
|
-
parent()->work_serializer(),
|
463
|
-
std::make_unique<ResolverResultHandler>(
|
464
|
-
Ref(DEBUG_LOCATION, "LogicalDNSDiscoveryMechanism")));
|
465
|
-
if (resolver_ == nullptr) {
|
466
|
-
parent()->OnResourceDoesNotExist(
|
467
|
-
index(),
|
468
|
-
absl::StrCat("error creating DNS resolver for ", GetDnsHostname()));
|
469
|
-
return;
|
470
|
-
}
|
471
|
-
resolver_->StartLocked();
|
472
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
|
473
|
-
gpr_log(GPR_INFO,
|
474
|
-
"[xds_cluster_resolver_lb %p] logical DNS discovery mechanism "
|
475
|
-
"%" PRIuPTR ":%p starting dns resolver %p",
|
476
|
-
parent(), index(), this, resolver_.get());
|
477
|
-
}
|
478
|
-
}
|
479
|
-
|
480
|
-
void XdsClusterResolverLb::LogicalDNSDiscoveryMechanism::Orphan() {
|
481
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
|
482
|
-
gpr_log(
|
483
|
-
GPR_INFO,
|
484
|
-
"[xds_cluster_resolver_lb %p] logical DNS discovery mechanism %" PRIuPTR
|
485
|
-
":%p shutting down dns resolver %p",
|
486
|
-
parent(), index(), this, resolver_.get());
|
487
|
-
}
|
488
|
-
resolver_.reset();
|
489
|
-
Unref();
|
490
|
-
}
|
491
|
-
|
492
|
-
//
|
493
|
-
// XdsClusterResolverLb::LogicalDNSDiscoveryMechanism::ResolverResultHandler
|
494
|
-
//
|
495
|
-
|
496
|
-
void XdsClusterResolverLb::LogicalDNSDiscoveryMechanism::ResolverResultHandler::
|
497
|
-
ReportResult(Resolver::Result result) {
|
498
|
-
XdsClusterResolverLb* lb_policy = discovery_mechanism_->parent();
|
499
|
-
size_t index = discovery_mechanism_->index();
|
500
|
-
if (!result.addresses.ok()) {
|
501
|
-
if (result.resolution_note.empty()) {
|
502
|
-
result.resolution_note = absl::StrCat(
|
503
|
-
"DNS resolution failed for ", discovery_mechanism_->GetDnsHostname(),
|
504
|
-
" (", result.addresses.status().ToString(), ")");
|
505
|
-
}
|
506
|
-
lb_policy->OnError(index, result.resolution_note);
|
507
|
-
return;
|
508
|
-
}
|
509
|
-
// Convert resolver result to EDS update.
|
510
|
-
auto update = std::make_shared<XdsEndpointResource>();
|
511
|
-
XdsEndpointResource::Priority::Locality locality;
|
512
|
-
locality.name = MakeRefCounted<XdsLocalityName>("", "", "");
|
513
|
-
locality.lb_weight = 1;
|
514
|
-
locality.endpoints = std::move(*result.addresses);
|
515
|
-
XdsEndpointResource::Priority priority;
|
516
|
-
priority.localities.emplace(locality.name.get(), std::move(locality));
|
517
|
-
update->priorities.emplace_back(std::move(priority));
|
518
|
-
lb_policy->OnEndpointChanged(index, std::move(update),
|
519
|
-
std::move(result.resolution_note));
|
520
|
-
}
|
521
|
-
|
522
|
-
//
|
523
|
-
// XdsClusterResolverLb::DiscoveryMechanismEntry
|
524
|
-
//
|
525
|
-
|
526
|
-
const XdsClusterResolverLbConfig::DiscoveryMechanism&
|
527
|
-
XdsClusterResolverLb::DiscoveryMechanismEntry::config() const {
|
528
|
-
return discovery_mechanism->parent()
|
529
|
-
->config_->discovery_mechanisms()[discovery_mechanism->index()];
|
530
|
-
}
|
531
|
-
|
532
|
-
std::string XdsClusterResolverLb::DiscoveryMechanismEntry::GetChildPolicyName(
|
533
|
-
size_t priority) const {
|
534
|
-
return absl::StrCat("{cluster=", config().cluster_name,
|
535
|
-
", child_number=", priority_child_numbers[priority], "}");
|
536
|
-
}
|
537
|
-
|
538
|
-
//
|
539
|
-
// XdsClusterResolverLb public methods
|
540
|
-
//
|
541
|
-
|
542
|
-
XdsClusterResolverLb::XdsClusterResolverLb(RefCountedPtr<XdsClient> xds_client,
|
543
|
-
Args args)
|
544
|
-
: LoadBalancingPolicy(std::move(args)), xds_client_(std::move(xds_client)) {
|
545
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
|
546
|
-
gpr_log(GPR_INFO, "[xds_cluster_resolver_lb %p] created -- xds_client=%p",
|
547
|
-
this, xds_client_.get());
|
548
|
-
}
|
549
|
-
}
|
550
|
-
|
551
|
-
XdsClusterResolverLb::~XdsClusterResolverLb() {
|
552
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
|
553
|
-
gpr_log(GPR_INFO,
|
554
|
-
"[xds_cluster_resolver_lb %p] destroying xds_cluster_resolver LB "
|
555
|
-
"policy",
|
556
|
-
this);
|
557
|
-
}
|
558
|
-
}
|
559
|
-
|
560
|
-
void XdsClusterResolverLb::ShutdownLocked() {
|
561
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
|
562
|
-
gpr_log(GPR_INFO, "[xds_cluster_resolver_lb %p] shutting down", this);
|
563
|
-
}
|
564
|
-
shutting_down_ = true;
|
565
|
-
MaybeDestroyChildPolicyLocked();
|
566
|
-
discovery_mechanisms_.clear();
|
567
|
-
xds_client_.reset(DEBUG_LOCATION, "XdsClusterResolverLb");
|
568
|
-
args_ = ChannelArgs();
|
569
|
-
}
|
570
|
-
|
571
|
-
void XdsClusterResolverLb::MaybeDestroyChildPolicyLocked() {
|
572
|
-
if (child_policy_ != nullptr) {
|
573
|
-
grpc_pollset_set_del_pollset_set(child_policy_->interested_parties(),
|
574
|
-
interested_parties());
|
575
|
-
child_policy_.reset();
|
576
|
-
}
|
577
|
-
}
|
578
|
-
|
579
|
-
absl::Status XdsClusterResolverLb::UpdateLocked(UpdateArgs args) {
|
580
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
|
581
|
-
gpr_log(GPR_INFO, "[xds_cluster_resolver_lb %p] Received update", this);
|
582
|
-
}
|
583
|
-
const bool is_initial_update = args_ == ChannelArgs();
|
584
|
-
// Update config.
|
585
|
-
auto old_config = std::move(config_);
|
586
|
-
config_ = std::move(args.config);
|
587
|
-
// Update args.
|
588
|
-
args_ = std::move(args.args);
|
589
|
-
// Update child policy if needed.
|
590
|
-
absl::Status status;
|
591
|
-
if (child_policy_ != nullptr) status = UpdateChildPolicyLocked();
|
592
|
-
// Create endpoint watcher if needed.
|
593
|
-
if (is_initial_update) {
|
594
|
-
for (const auto& config : config_->discovery_mechanisms()) {
|
595
|
-
DiscoveryMechanismEntry entry;
|
596
|
-
if (config.type == XdsClusterResolverLbConfig::DiscoveryMechanism::
|
597
|
-
DiscoveryMechanismType::EDS) {
|
598
|
-
entry.discovery_mechanism = MakeOrphanable<EdsDiscoveryMechanism>(
|
599
|
-
Ref(DEBUG_LOCATION, "EdsDiscoveryMechanism"),
|
600
|
-
discovery_mechanisms_.size());
|
601
|
-
} else if (config.type == XdsClusterResolverLbConfig::DiscoveryMechanism::
|
602
|
-
DiscoveryMechanismType::LOGICAL_DNS) {
|
603
|
-
entry.discovery_mechanism =
|
604
|
-
MakeOrphanable<LogicalDNSDiscoveryMechanism>(
|
605
|
-
Ref(DEBUG_LOCATION, "LogicalDNSDiscoveryMechanism"),
|
606
|
-
discovery_mechanisms_.size());
|
607
|
-
} else {
|
608
|
-
GPR_ASSERT(0);
|
609
|
-
}
|
610
|
-
discovery_mechanisms_.push_back(std::move(entry));
|
611
|
-
}
|
612
|
-
// Call start() on all discovery mechanisms after creation.
|
613
|
-
for (const auto& discovery_mechanism : discovery_mechanisms_) {
|
614
|
-
discovery_mechanism.discovery_mechanism->Start();
|
615
|
-
}
|
616
|
-
}
|
617
|
-
return status;
|
618
|
-
}
|
619
|
-
|
620
|
-
void XdsClusterResolverLb::ResetBackoffLocked() {
|
621
|
-
if (child_policy_ != nullptr) {
|
622
|
-
child_policy_->ResetBackoffLocked();
|
623
|
-
}
|
624
|
-
}
|
625
|
-
|
626
|
-
void XdsClusterResolverLb::ExitIdleLocked() {
|
627
|
-
if (child_policy_ != nullptr) child_policy_->ExitIdleLocked();
|
628
|
-
}
|
629
|
-
|
630
|
-
// We need at least one priority for each discovery mechanism, just so that we
|
631
|
-
// have a child in which to create the xds_cluster_impl policy. This ensures
|
632
|
-
// that we properly handle the case of a discovery mechanism dropping 100% of
|
633
|
-
// calls, the OnError() case, and the OnResourceDoesNotExist() case.
|
634
|
-
const XdsEndpointResource::PriorityList& GetUpdatePriorityList(
|
635
|
-
const XdsEndpointResource& update) {
|
636
|
-
static const NoDestruct<XdsEndpointResource::PriorityList>
|
637
|
-
kPriorityListWithEmptyPriority(1);
|
638
|
-
if (update.priorities.empty()) return *kPriorityListWithEmptyPriority;
|
639
|
-
return update.priorities;
|
640
|
-
}
|
641
|
-
|
642
|
-
void XdsClusterResolverLb::OnEndpointChanged(
|
643
|
-
size_t index, std::shared_ptr<const XdsEndpointResource> update,
|
644
|
-
std::string resolution_note) {
|
645
|
-
if (shutting_down_) return;
|
646
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
|
647
|
-
gpr_log(GPR_INFO,
|
648
|
-
"[xds_cluster_resolver_lb %p] Received update from xds client"
|
649
|
-
" for discovery mechanism %" PRIuPTR " (resolution_note=\"%s\")",
|
650
|
-
this, index, resolution_note.c_str());
|
651
|
-
}
|
652
|
-
DiscoveryMechanismEntry& discovery_entry = discovery_mechanisms_[index];
|
653
|
-
const XdsEndpointResource::PriorityList& priority_list =
|
654
|
-
GetUpdatePriorityList(*update);
|
655
|
-
// Update priority_child_numbers, reusing old child numbers in an
|
656
|
-
// intelligent way to avoid unnecessary churn.
|
657
|
-
// First, build some maps from locality to child number and the reverse
|
658
|
-
// from the old data in the entry's update and priority_child_numbers.
|
659
|
-
std::map<XdsLocalityName*, size_t /*child_number*/, XdsLocalityName::Less>
|
660
|
-
locality_child_map;
|
661
|
-
std::map<size_t, std::set<XdsLocalityName*, XdsLocalityName::Less>>
|
662
|
-
child_locality_map;
|
663
|
-
if (discovery_entry.latest_update != nullptr) {
|
664
|
-
const auto& prev_priority_list =
|
665
|
-
GetUpdatePriorityList(*discovery_entry.latest_update);
|
666
|
-
for (size_t priority = 0; priority < prev_priority_list.size();
|
667
|
-
++priority) {
|
668
|
-
size_t child_number = discovery_entry.priority_child_numbers[priority];
|
669
|
-
const auto& localities = prev_priority_list[priority].localities;
|
670
|
-
for (const auto& p : localities) {
|
671
|
-
XdsLocalityName* locality_name = p.first;
|
672
|
-
locality_child_map[locality_name] = child_number;
|
673
|
-
child_locality_map[child_number].insert(locality_name);
|
674
|
-
}
|
675
|
-
}
|
676
|
-
}
|
677
|
-
// Construct new list of children.
|
678
|
-
std::vector<size_t> priority_child_numbers;
|
679
|
-
for (size_t priority = 0; priority < priority_list.size(); ++priority) {
|
680
|
-
const auto& localities = priority_list[priority].localities;
|
681
|
-
absl::optional<size_t> child_number;
|
682
|
-
// If one of the localities in this priority already existed, reuse its
|
683
|
-
// child number.
|
684
|
-
for (const auto& p : localities) {
|
685
|
-
XdsLocalityName* locality_name = p.first;
|
686
|
-
if (!child_number.has_value()) {
|
687
|
-
auto it = locality_child_map.find(locality_name);
|
688
|
-
if (it != locality_child_map.end()) {
|
689
|
-
child_number = it->second;
|
690
|
-
locality_child_map.erase(it);
|
691
|
-
// Remove localities that *used* to be in this child number, so
|
692
|
-
// that we don't incorrectly reuse this child number for a
|
693
|
-
// subsequent priority.
|
694
|
-
for (XdsLocalityName* old_locality :
|
695
|
-
child_locality_map[*child_number]) {
|
696
|
-
locality_child_map.erase(old_locality);
|
697
|
-
}
|
698
|
-
}
|
699
|
-
} else {
|
700
|
-
// Remove all localities that are now in this child number, so
|
701
|
-
// that we don't accidentally reuse this child number for a
|
702
|
-
// subsequent priority.
|
703
|
-
locality_child_map.erase(locality_name);
|
704
|
-
}
|
705
|
-
}
|
706
|
-
// If we didn't find an existing child number, assign a new one.
|
707
|
-
if (!child_number.has_value()) {
|
708
|
-
for (child_number = discovery_entry.next_available_child_number;
|
709
|
-
child_locality_map.find(*child_number) != child_locality_map.end();
|
710
|
-
++(*child_number)) {
|
711
|
-
}
|
712
|
-
discovery_entry.next_available_child_number = *child_number + 1;
|
713
|
-
// Add entry so we know that the child number is in use.
|
714
|
-
// (Don't need to add the list of localities, since we won't use them.)
|
715
|
-
child_locality_map[*child_number];
|
716
|
-
}
|
717
|
-
priority_child_numbers.push_back(*child_number);
|
718
|
-
}
|
719
|
-
// Save update.
|
720
|
-
discovery_entry.latest_update = std::move(update);
|
721
|
-
discovery_entry.resolution_note = std::move(resolution_note);
|
722
|
-
discovery_entry.priority_child_numbers = std::move(priority_child_numbers);
|
723
|
-
// If any discovery mechanism has not received its first update,
|
724
|
-
// wait until that happens before creating the child policy.
|
725
|
-
// TODO(roth): If this becomes problematic in the future (e.g., a
|
726
|
-
// secondary discovery mechanism delaying us from starting up at all),
|
727
|
-
// we can consider some sort of optimization whereby we can create the
|
728
|
-
// priority policy with only a subset of its children. But we need to
|
729
|
-
// make sure not to get into a situation where the priority policy
|
730
|
-
// will put the channel into TRANSIENT_FAILURE instead of CONNECTING
|
731
|
-
// while we're still waiting for the other discovery mechanism(s).
|
732
|
-
for (DiscoveryMechanismEntry& mechanism : discovery_mechanisms_) {
|
733
|
-
if (mechanism.latest_update == nullptr) return;
|
734
|
-
}
|
735
|
-
// Update child policy.
|
736
|
-
// TODO(roth): If the child policy reports an error with the update,
|
737
|
-
// we need to propagate that error back to the resolver somehow.
|
738
|
-
(void)UpdateChildPolicyLocked();
|
739
|
-
}
|
740
|
-
|
741
|
-
void XdsClusterResolverLb::OnError(size_t index, std::string resolution_note) {
|
742
|
-
gpr_log(GPR_ERROR,
|
743
|
-
"[xds_cluster_resolver_lb %p] discovery mechanism %" PRIuPTR
|
744
|
-
" reported error: %s",
|
745
|
-
this, index, resolution_note.c_str());
|
746
|
-
if (shutting_down_) return;
|
747
|
-
if (discovery_mechanisms_[index].latest_update == nullptr) {
|
748
|
-
// Call OnEndpointChanged() with an empty update just like
|
749
|
-
// OnResourceDoesNotExist().
|
750
|
-
OnEndpointChanged(index, std::make_shared<XdsEndpointResource>(),
|
751
|
-
std::move(resolution_note));
|
752
|
-
}
|
753
|
-
}
|
754
|
-
|
755
|
-
void XdsClusterResolverLb::OnResourceDoesNotExist(size_t index,
|
756
|
-
std::string resolution_note) {
|
757
|
-
gpr_log(GPR_ERROR,
|
758
|
-
"[xds_cluster_resolver_lb %p] discovery mechanism %" PRIuPTR
|
759
|
-
" resource does not exist: %s",
|
760
|
-
this, index, resolution_note.c_str());
|
761
|
-
if (shutting_down_) return;
|
762
|
-
// Call OnEndpointChanged() with an empty update.
|
763
|
-
OnEndpointChanged(index, std::make_shared<XdsEndpointResource>(),
|
764
|
-
std::move(resolution_note));
|
765
|
-
}
|
766
|
-
|
767
|
-
//
|
768
|
-
// child policy-related methods
|
769
|
-
//
|
770
|
-
|
771
|
-
EndpointAddressesList XdsClusterResolverLb::CreateChildPolicyAddressesLocked() {
|
772
|
-
EndpointAddressesList addresses;
|
773
|
-
for (const auto& discovery_entry : discovery_mechanisms_) {
|
774
|
-
const auto& priority_list =
|
775
|
-
GetUpdatePriorityList(*discovery_entry.latest_update);
|
776
|
-
for (size_t priority = 0; priority < priority_list.size(); ++priority) {
|
777
|
-
const auto& priority_entry = priority_list[priority];
|
778
|
-
std::string priority_child_name =
|
779
|
-
discovery_entry.GetChildPolicyName(priority);
|
780
|
-
for (const auto& p : priority_entry.localities) {
|
781
|
-
const auto& locality_name = p.first;
|
782
|
-
const auto& locality = p.second;
|
783
|
-
std::vector<RefCountedStringValue> hierarchical_path = {
|
784
|
-
RefCountedStringValue(priority_child_name),
|
785
|
-
RefCountedStringValue(locality_name->AsHumanReadableString())};
|
786
|
-
auto hierarchical_path_attr =
|
787
|
-
MakeRefCounted<HierarchicalPathArg>(std::move(hierarchical_path));
|
788
|
-
for (const auto& endpoint : locality.endpoints) {
|
789
|
-
uint32_t endpoint_weight =
|
790
|
-
locality.lb_weight *
|
791
|
-
endpoint.args().GetInt(GRPC_ARG_ADDRESS_WEIGHT).value_or(1);
|
792
|
-
addresses.emplace_back(
|
793
|
-
endpoint.addresses(),
|
794
|
-
endpoint.args()
|
795
|
-
.SetObject(hierarchical_path_attr)
|
796
|
-
.Set(GRPC_ARG_ADDRESS_WEIGHT, endpoint_weight)
|
797
|
-
.SetObject(locality_name->Ref())
|
798
|
-
.Set(GRPC_ARG_XDS_LOCALITY_WEIGHT, locality.lb_weight));
|
799
|
-
}
|
800
|
-
}
|
801
|
-
}
|
802
|
-
}
|
803
|
-
return addresses;
|
804
|
-
}
|
805
|
-
|
806
|
-
std::string XdsClusterResolverLb::CreateChildPolicyResolutionNoteLocked() {
|
807
|
-
std::vector<absl::string_view> resolution_notes;
|
808
|
-
for (const auto& discovery_entry : discovery_mechanisms_) {
|
809
|
-
if (!discovery_entry.resolution_note.empty()) {
|
810
|
-
resolution_notes.push_back(discovery_entry.resolution_note);
|
811
|
-
}
|
812
|
-
}
|
813
|
-
return absl::StrJoin(resolution_notes, "; ");
|
814
|
-
}
|
815
|
-
|
816
|
-
RefCountedPtr<LoadBalancingPolicy::Config>
|
817
|
-
XdsClusterResolverLb::CreateChildPolicyConfigLocked() {
|
818
|
-
Json::Object priority_children;
|
819
|
-
Json::Array priority_priorities;
|
820
|
-
for (const auto& discovery_entry : discovery_mechanisms_) {
|
821
|
-
const auto& priority_list =
|
822
|
-
GetUpdatePriorityList(*discovery_entry.latest_update);
|
823
|
-
const auto& discovery_config = discovery_entry.config();
|
824
|
-
for (size_t priority = 0; priority < priority_list.size(); ++priority) {
|
825
|
-
// Determine what xDS LB policy to use.
|
826
|
-
Json child_policy;
|
827
|
-
if (!discovery_entry.discovery_mechanism->override_child_policy()
|
828
|
-
.empty()) {
|
829
|
-
child_policy = Json::FromArray(
|
830
|
-
discovery_entry.discovery_mechanism->override_child_policy());
|
831
|
-
} else {
|
832
|
-
child_policy = config_->xds_lb_policy();
|
833
|
-
}
|
834
|
-
// Wrap the xDS LB policy in the xds_override_host policy.
|
835
|
-
Json::Object xds_override_host_lb_config = {
|
836
|
-
{"childPolicy", std::move(child_policy)},
|
837
|
-
};
|
838
|
-
if (!discovery_config.override_host_statuses.empty()) {
|
839
|
-
xds_override_host_lb_config["overrideHostStatus"] =
|
840
|
-
Json::FromArray(discovery_config.override_host_statuses);
|
841
|
-
}
|
842
|
-
Json::Array xds_override_host_config = {Json::FromObject({
|
843
|
-
{"xds_override_host_experimental",
|
844
|
-
Json::FromObject(std::move(xds_override_host_lb_config))},
|
845
|
-
})};
|
846
|
-
// Wrap it in the xds_cluster_impl policy.
|
847
|
-
Json::Array drop_categories;
|
848
|
-
if (discovery_entry.latest_update->drop_config != nullptr) {
|
849
|
-
for (const auto& category :
|
850
|
-
discovery_entry.latest_update->drop_config->drop_category_list()) {
|
851
|
-
drop_categories.push_back(Json::FromObject({
|
852
|
-
{"category", Json::FromString(category.name)},
|
853
|
-
{"requests_per_million",
|
854
|
-
Json::FromNumber(category.parts_per_million)},
|
855
|
-
}));
|
856
|
-
}
|
857
|
-
}
|
858
|
-
Json::Object xds_cluster_impl_config = {
|
859
|
-
{"clusterName", Json::FromString(discovery_config.cluster_name)},
|
860
|
-
{"childPolicy", Json::FromArray(std::move(xds_override_host_config))},
|
861
|
-
{"dropCategories", Json::FromArray(std::move(drop_categories))},
|
862
|
-
{"maxConcurrentRequests",
|
863
|
-
Json::FromNumber(discovery_config.max_concurrent_requests)},
|
864
|
-
};
|
865
|
-
if (!discovery_config.eds_service_name.empty()) {
|
866
|
-
xds_cluster_impl_config["edsServiceName"] =
|
867
|
-
Json::FromString(discovery_config.eds_service_name);
|
868
|
-
}
|
869
|
-
if (discovery_config.lrs_load_reporting_server.has_value()) {
|
870
|
-
xds_cluster_impl_config["lrsLoadReportingServer"] =
|
871
|
-
discovery_config.lrs_load_reporting_server->ToJson();
|
872
|
-
}
|
873
|
-
// Wrap it in the outlier_detection policy.
|
874
|
-
Json::Object outlier_detection_config;
|
875
|
-
if (discovery_entry.config().outlier_detection_lb_config.has_value()) {
|
876
|
-
outlier_detection_config =
|
877
|
-
discovery_entry.config().outlier_detection_lb_config.value();
|
878
|
-
}
|
879
|
-
outlier_detection_config["childPolicy"] =
|
880
|
-
Json::FromArray({Json::FromObject({
|
881
|
-
{"xds_cluster_impl_experimental",
|
882
|
-
Json::FromObject(std::move(xds_cluster_impl_config))},
|
883
|
-
})});
|
884
|
-
Json locality_picking_policy = Json::FromArray({Json::FromObject({
|
885
|
-
{"outlier_detection_experimental",
|
886
|
-
Json::FromObject(std::move(outlier_detection_config))},
|
887
|
-
})});
|
888
|
-
// Add priority entry, with the appropriate child name.
|
889
|
-
std::string child_name = discovery_entry.GetChildPolicyName(priority);
|
890
|
-
priority_priorities.emplace_back(Json::FromString(child_name));
|
891
|
-
Json::Object child_config = {
|
892
|
-
{"config", std::move(locality_picking_policy)},
|
893
|
-
};
|
894
|
-
if (discovery_entry.discovery_mechanism->disable_reresolution()) {
|
895
|
-
child_config["ignore_reresolution_requests"] = Json::FromBool(true);
|
896
|
-
}
|
897
|
-
priority_children[child_name] = Json::FromObject(std::move(child_config));
|
898
|
-
}
|
899
|
-
}
|
900
|
-
Json json = Json::FromArray({Json::FromObject({
|
901
|
-
{"priority_experimental",
|
902
|
-
Json::FromObject({
|
903
|
-
{"children", Json::FromObject(std::move(priority_children))},
|
904
|
-
{"priorities", Json::FromArray(std::move(priority_priorities))},
|
905
|
-
})},
|
906
|
-
})});
|
907
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
|
908
|
-
gpr_log(
|
909
|
-
GPR_INFO,
|
910
|
-
"[xds_cluster_resolver_lb %p] generated config for child policy: %s",
|
911
|
-
this, JsonDump(json, /*indent=*/1).c_str());
|
912
|
-
}
|
913
|
-
auto config =
|
914
|
-
CoreConfiguration::Get().lb_policy_registry().ParseLoadBalancingConfig(
|
915
|
-
json);
|
916
|
-
if (!config.ok()) {
|
917
|
-
// This should never happen, but if it does, we basically have no
|
918
|
-
// way to fix it, so we put the channel in TRANSIENT_FAILURE.
|
919
|
-
gpr_log(GPR_ERROR,
|
920
|
-
"[xds_cluster_resolver_lb %p] error parsing generated child policy "
|
921
|
-
"config -- "
|
922
|
-
"will put channel in TRANSIENT_FAILURE: %s",
|
923
|
-
this, config.status().ToString().c_str());
|
924
|
-
absl::Status status = absl::InternalError(
|
925
|
-
"xds_cluster_resolver LB policy: error parsing generated child policy "
|
926
|
-
"config");
|
927
|
-
channel_control_helper()->UpdateState(
|
928
|
-
GRPC_CHANNEL_TRANSIENT_FAILURE, status,
|
929
|
-
MakeRefCounted<TransientFailurePicker>(status));
|
930
|
-
return nullptr;
|
931
|
-
}
|
932
|
-
return std::move(*config);
|
933
|
-
}
|
934
|
-
|
935
|
-
absl::Status XdsClusterResolverLb::UpdateChildPolicyLocked() {
|
936
|
-
if (shutting_down_) return absl::OkStatus();
|
937
|
-
UpdateArgs update_args;
|
938
|
-
update_args.config = CreateChildPolicyConfigLocked();
|
939
|
-
if (update_args.config == nullptr) return absl::OkStatus();
|
940
|
-
update_args.addresses = CreateChildPolicyAddressesLocked();
|
941
|
-
update_args.resolution_note = CreateChildPolicyResolutionNoteLocked();
|
942
|
-
update_args.args = CreateChildPolicyArgsLocked(args_);
|
943
|
-
if (child_policy_ == nullptr) {
|
944
|
-
child_policy_ = CreateChildPolicyLocked(update_args.args);
|
945
|
-
}
|
946
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
|
947
|
-
gpr_log(GPR_INFO, "[xds_cluster_resolver_lb %p] Updating child policy %p",
|
948
|
-
this, child_policy_.get());
|
949
|
-
}
|
950
|
-
return child_policy_->UpdateLocked(std::move(update_args));
|
951
|
-
}
|
952
|
-
|
953
|
-
ChannelArgs XdsClusterResolverLb::CreateChildPolicyArgsLocked(
|
954
|
-
const ChannelArgs& args) {
|
955
|
-
// Inhibit client-side health checking, since the balancer does this
|
956
|
-
// for us.
|
957
|
-
return args.Set(GRPC_ARG_INHIBIT_HEALTH_CHECKING, 1);
|
958
|
-
}
|
959
|
-
|
960
|
-
OrphanablePtr<LoadBalancingPolicy>
|
961
|
-
XdsClusterResolverLb::CreateChildPolicyLocked(const ChannelArgs& args) {
|
962
|
-
LoadBalancingPolicy::Args lb_policy_args;
|
963
|
-
lb_policy_args.work_serializer = work_serializer();
|
964
|
-
lb_policy_args.args = args;
|
965
|
-
lb_policy_args.channel_control_helper =
|
966
|
-
std::make_unique<Helper>(Ref(DEBUG_LOCATION, "Helper"));
|
967
|
-
OrphanablePtr<LoadBalancingPolicy> lb_policy =
|
968
|
-
CoreConfiguration::Get().lb_policy_registry().CreateLoadBalancingPolicy(
|
969
|
-
"priority_experimental", std::move(lb_policy_args));
|
970
|
-
if (GPR_UNLIKELY(lb_policy == nullptr)) {
|
971
|
-
gpr_log(GPR_ERROR,
|
972
|
-
"[xds_cluster_resolver_lb %p] failure creating child policy", this);
|
973
|
-
return nullptr;
|
974
|
-
}
|
975
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_cluster_resolver_trace)) {
|
976
|
-
gpr_log(GPR_INFO,
|
977
|
-
"[xds_cluster_resolver_lb %p]: Created new child policy %p", this,
|
978
|
-
lb_policy.get());
|
979
|
-
}
|
980
|
-
// Add our interested_parties pollset_set to that of the newly created
|
981
|
-
// child policy. This will make the child policy progress upon activity on
|
982
|
-
// this policy, which in turn is tied to the application's call.
|
983
|
-
grpc_pollset_set_add_pollset_set(lb_policy->interested_parties(),
|
984
|
-
interested_parties());
|
985
|
-
return lb_policy;
|
986
|
-
}
|
987
|
-
|
988
|
-
//
|
989
|
-
// factory
|
990
|
-
//
|
991
|
-
|
992
|
-
const JsonLoaderInterface*
|
993
|
-
XdsClusterResolverLbConfig::DiscoveryMechanism::JsonLoader(const JsonArgs&) {
|
994
|
-
static const auto* loader =
|
995
|
-
JsonObjectLoader<DiscoveryMechanism>()
|
996
|
-
// Note: Several fields requires custom processing,
|
997
|
-
// so they are handled in JsonPostLoad() instead.
|
998
|
-
.Field("clusterName", &DiscoveryMechanism::cluster_name)
|
999
|
-
.OptionalField("lrsLoadReportingServer",
|
1000
|
-
&DiscoveryMechanism::lrs_load_reporting_server)
|
1001
|
-
.OptionalField("max_concurrent_requests",
|
1002
|
-
&DiscoveryMechanism::max_concurrent_requests)
|
1003
|
-
.OptionalField("outlierDetection",
|
1004
|
-
&DiscoveryMechanism::outlier_detection_lb_config)
|
1005
|
-
.OptionalField("overrideHostStatus",
|
1006
|
-
&DiscoveryMechanism::override_host_statuses)
|
1007
|
-
.Finish();
|
1008
|
-
return loader;
|
1009
|
-
}
|
1010
|
-
|
1011
|
-
void XdsClusterResolverLbConfig::DiscoveryMechanism::JsonPostLoad(
|
1012
|
-
const Json& json, const JsonArgs& args, ValidationErrors* errors) {
|
1013
|
-
// Parse "type".
|
1014
|
-
{
|
1015
|
-
auto type_field =
|
1016
|
-
LoadJsonObjectField<std::string>(json.object(), args, "type", errors);
|
1017
|
-
if (type_field.has_value()) {
|
1018
|
-
if (*type_field == "EDS") {
|
1019
|
-
type = DiscoveryMechanismType::EDS;
|
1020
|
-
} else if (*type_field == "LOGICAL_DNS") {
|
1021
|
-
type = DiscoveryMechanismType::LOGICAL_DNS;
|
1022
|
-
} else {
|
1023
|
-
ValidationErrors::ScopedField field(errors, ".type");
|
1024
|
-
errors->AddError(absl::StrCat("unknown type \"", *type_field, "\""));
|
1025
|
-
}
|
1026
|
-
}
|
1027
|
-
}
|
1028
|
-
// Parse "edsServiceName" if type is EDS.
|
1029
|
-
if (type == DiscoveryMechanismType::EDS) {
|
1030
|
-
auto value = LoadJsonObjectField<std::string>(json.object(), args,
|
1031
|
-
"edsServiceName", errors,
|
1032
|
-
/*required=*/false);
|
1033
|
-
if (value.has_value()) eds_service_name = std::move(*value);
|
1034
|
-
}
|
1035
|
-
// Parse "dnsHostname" if type is LOGICAL_DNS.
|
1036
|
-
if (type == DiscoveryMechanismType::LOGICAL_DNS) {
|
1037
|
-
auto value = LoadJsonObjectField<std::string>(json.object(), args,
|
1038
|
-
"dnsHostname", errors);
|
1039
|
-
if (value.has_value()) dns_hostname = std::move(*value);
|
1040
|
-
}
|
1041
|
-
}
|
1042
|
-
|
1043
|
-
const JsonLoaderInterface* XdsClusterResolverLbConfig::JsonLoader(
|
1044
|
-
const JsonArgs&) {
|
1045
|
-
static const auto* loader =
|
1046
|
-
JsonObjectLoader<XdsClusterResolverLbConfig>()
|
1047
|
-
// Note: The "xdsLbPolicy" field requires custom processing,
|
1048
|
-
// so it's handled in JsonPostLoad() instead.
|
1049
|
-
.Field("discoveryMechanisms",
|
1050
|
-
&XdsClusterResolverLbConfig::discovery_mechanisms_)
|
1051
|
-
.Finish();
|
1052
|
-
return loader;
|
1053
|
-
}
|
1054
|
-
|
1055
|
-
void XdsClusterResolverLbConfig::JsonPostLoad(const Json& json, const JsonArgs&,
|
1056
|
-
ValidationErrors* errors) {
|
1057
|
-
// Validate discoveryMechanisms.
|
1058
|
-
{
|
1059
|
-
ValidationErrors::ScopedField field(errors, ".discoveryMechanisms");
|
1060
|
-
if (!errors->FieldHasErrors() && discovery_mechanisms_.empty()) {
|
1061
|
-
errors->AddError("must be non-empty");
|
1062
|
-
}
|
1063
|
-
}
|
1064
|
-
// Parse "xdsLbPolicy".
|
1065
|
-
{
|
1066
|
-
ValidationErrors::ScopedField field(errors, ".xdsLbPolicy");
|
1067
|
-
auto it = json.object().find("xdsLbPolicy");
|
1068
|
-
if (it == json.object().end()) {
|
1069
|
-
errors->AddError("field not present");
|
1070
|
-
} else {
|
1071
|
-
auto lb_config = CoreConfiguration::Get()
|
1072
|
-
.lb_policy_registry()
|
1073
|
-
.ParseLoadBalancingConfig(it->second);
|
1074
|
-
if (!lb_config.ok()) errors->AddError(lb_config.status().message());
|
1075
|
-
xds_lb_policy_ = it->second;
|
1076
|
-
}
|
1077
|
-
}
|
1078
|
-
}
|
1079
|
-
|
1080
|
-
class XdsClusterResolverLbFactory : public LoadBalancingPolicyFactory {
|
1081
|
-
public:
|
1082
|
-
OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(
|
1083
|
-
LoadBalancingPolicy::Args args) const override {
|
1084
|
-
auto xds_client = args.args.GetObjectRef<GrpcXdsClient>(
|
1085
|
-
DEBUG_LOCATION, "XdsClusterResolverLbFactory");
|
1086
|
-
if (xds_client == nullptr) {
|
1087
|
-
gpr_log(GPR_ERROR,
|
1088
|
-
"XdsClient not present in channel args -- cannot instantiate "
|
1089
|
-
"xds_cluster_resolver LB policy");
|
1090
|
-
return nullptr;
|
1091
|
-
}
|
1092
|
-
return MakeOrphanable<XdsClusterResolverChildHandler>(std::move(xds_client),
|
1093
|
-
std::move(args));
|
1094
|
-
}
|
1095
|
-
|
1096
|
-
absl::string_view name() const override { return kXdsClusterResolver; }
|
1097
|
-
|
1098
|
-
absl::StatusOr<RefCountedPtr<LoadBalancingPolicy::Config>>
|
1099
|
-
ParseLoadBalancingConfig(const Json& json) const override {
|
1100
|
-
return LoadFromJson<RefCountedPtr<XdsClusterResolverLbConfig>>(
|
1101
|
-
json, JsonArgs(),
|
1102
|
-
"errors validating xds_cluster_resolver LB policy config");
|
1103
|
-
}
|
1104
|
-
|
1105
|
-
private:
|
1106
|
-
class XdsClusterResolverChildHandler : public ChildPolicyHandler {
|
1107
|
-
public:
|
1108
|
-
XdsClusterResolverChildHandler(RefCountedPtr<XdsClient> xds_client,
|
1109
|
-
Args args)
|
1110
|
-
: ChildPolicyHandler(std::move(args),
|
1111
|
-
&grpc_lb_xds_cluster_resolver_trace),
|
1112
|
-
xds_client_(std::move(xds_client)) {}
|
1113
|
-
|
1114
|
-
~XdsClusterResolverChildHandler() override {
|
1115
|
-
xds_client_.reset(DEBUG_LOCATION, "XdsClusterResolverChildHandler");
|
1116
|
-
}
|
1117
|
-
|
1118
|
-
bool ConfigChangeRequiresNewPolicyInstance(
|
1119
|
-
LoadBalancingPolicy::Config* old_config,
|
1120
|
-
LoadBalancingPolicy::Config* new_config) const override {
|
1121
|
-
GPR_ASSERT(old_config->name() == kXdsClusterResolver);
|
1122
|
-
GPR_ASSERT(new_config->name() == kXdsClusterResolver);
|
1123
|
-
XdsClusterResolverLbConfig* old_xds_cluster_resolver_config =
|
1124
|
-
static_cast<XdsClusterResolverLbConfig*>(old_config);
|
1125
|
-
XdsClusterResolverLbConfig* new_xds_cluster_resolver_config =
|
1126
|
-
static_cast<XdsClusterResolverLbConfig*>(new_config);
|
1127
|
-
if (old_xds_cluster_resolver_config->discovery_mechanisms().size() !=
|
1128
|
-
new_xds_cluster_resolver_config->discovery_mechanisms().size()) {
|
1129
|
-
return true;
|
1130
|
-
}
|
1131
|
-
for (size_t i = 0;
|
1132
|
-
i < old_xds_cluster_resolver_config->discovery_mechanisms().size();
|
1133
|
-
++i) {
|
1134
|
-
auto& old_discovery_mechanism =
|
1135
|
-
old_xds_cluster_resolver_config->discovery_mechanisms()[i];
|
1136
|
-
auto& new_discovery_mechanism =
|
1137
|
-
new_xds_cluster_resolver_config->discovery_mechanisms()[i];
|
1138
|
-
if (old_discovery_mechanism.type != new_discovery_mechanism.type ||
|
1139
|
-
old_discovery_mechanism.cluster_name !=
|
1140
|
-
new_discovery_mechanism.cluster_name ||
|
1141
|
-
old_discovery_mechanism.eds_service_name !=
|
1142
|
-
new_discovery_mechanism.eds_service_name ||
|
1143
|
-
old_discovery_mechanism.dns_hostname !=
|
1144
|
-
new_discovery_mechanism.dns_hostname ||
|
1145
|
-
!(old_discovery_mechanism.lrs_load_reporting_server ==
|
1146
|
-
new_discovery_mechanism.lrs_load_reporting_server)) {
|
1147
|
-
return true;
|
1148
|
-
}
|
1149
|
-
}
|
1150
|
-
return false;
|
1151
|
-
}
|
1152
|
-
|
1153
|
-
OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(
|
1154
|
-
absl::string_view /*name*/,
|
1155
|
-
LoadBalancingPolicy::Args args) const override {
|
1156
|
-
return MakeOrphanable<XdsClusterResolverLb>(
|
1157
|
-
xds_client_->Ref(DEBUG_LOCATION, "XdsClusterResolverLb"),
|
1158
|
-
std::move(args));
|
1159
|
-
}
|
1160
|
-
|
1161
|
-
private:
|
1162
|
-
RefCountedPtr<XdsClient> xds_client_;
|
1163
|
-
};
|
1164
|
-
};
|
1165
|
-
|
1166
|
-
} // namespace
|
1167
|
-
|
1168
|
-
void RegisterXdsClusterResolverLbPolicy(CoreConfiguration::Builder* builder) {
|
1169
|
-
builder->lb_policy_registry()->RegisterLoadBalancingPolicyFactory(
|
1170
|
-
std::make_unique<XdsClusterResolverLbFactory>());
|
1171
|
-
}
|
1172
|
-
|
1173
|
-
} // namespace grpc_core
|