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
@@ -16,8 +16,6 @@
|
|
16
16
|
|
17
17
|
#include <grpc/support/port_platform.h>
|
18
18
|
|
19
|
-
#include "src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h"
|
20
|
-
|
21
19
|
#include <stdint.h>
|
22
20
|
#include <string.h>
|
23
21
|
|
@@ -53,6 +51,9 @@
|
|
53
51
|
#include "src/core/ext/filters/client_channel/client_channel_internal.h"
|
54
52
|
#include "src/core/ext/filters/client_channel/config_selector.h"
|
55
53
|
#include "src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h"
|
54
|
+
#include "src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.h"
|
55
|
+
#include "src/core/ext/filters/client_channel/resolver/xds/xds_resolver_attributes.h"
|
56
|
+
#include "src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.h"
|
56
57
|
#include "src/core/ext/xds/xds_bootstrap.h"
|
57
58
|
#include "src/core/ext/xds/xds_bootstrap_grpc.h"
|
58
59
|
#include "src/core/ext/xds/xds_client_grpc.h"
|
@@ -95,8 +96,6 @@
|
|
95
96
|
|
96
97
|
namespace grpc_core {
|
97
98
|
|
98
|
-
TraceFlag grpc_xds_resolver_trace(false, "xds_resolver");
|
99
|
-
|
100
99
|
namespace {
|
101
100
|
|
102
101
|
//
|
@@ -136,79 +135,22 @@ class XdsResolver : public Resolver {
|
|
136
135
|
}
|
137
136
|
|
138
137
|
private:
|
139
|
-
class
|
138
|
+
class XdsWatcher : public XdsDependencyManager::Watcher {
|
140
139
|
public:
|
141
|
-
explicit
|
140
|
+
explicit XdsWatcher(RefCountedPtr<XdsResolver> resolver)
|
142
141
|
: resolver_(std::move(resolver)) {}
|
143
|
-
void OnResourceChanged(
|
144
|
-
std::shared_ptr<const XdsListenerResource> listener) override {
|
145
|
-
RefCountedPtr<ListenerWatcher> self = Ref();
|
146
|
-
resolver_->work_serializer_->Run(
|
147
|
-
[self = std::move(self), listener = std::move(listener)]() mutable {
|
148
|
-
self->resolver_->OnListenerUpdate(std::move(listener));
|
149
|
-
},
|
150
|
-
DEBUG_LOCATION);
|
151
|
-
}
|
152
|
-
void OnError(absl::Status status) override {
|
153
|
-
RefCountedPtr<ListenerWatcher> self = Ref();
|
154
|
-
resolver_->work_serializer_->Run(
|
155
|
-
[self = std::move(self), status = std::move(status)]() mutable {
|
156
|
-
self->resolver_->OnError(self->resolver_->lds_resource_name_,
|
157
|
-
std::move(status));
|
158
|
-
},
|
159
|
-
DEBUG_LOCATION);
|
160
|
-
}
|
161
|
-
void OnResourceDoesNotExist() override {
|
162
|
-
RefCountedPtr<ListenerWatcher> self = Ref();
|
163
|
-
resolver_->work_serializer_->Run(
|
164
|
-
[self = std::move(self)]() {
|
165
|
-
self->resolver_->OnResourceDoesNotExist(
|
166
|
-
absl::StrCat(self->resolver_->lds_resource_name_,
|
167
|
-
": xDS listener resource does not exist"));
|
168
|
-
},
|
169
|
-
DEBUG_LOCATION);
|
170
|
-
}
|
171
|
-
|
172
|
-
private:
|
173
|
-
RefCountedPtr<XdsResolver> resolver_;
|
174
|
-
};
|
175
142
|
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
explicit RouteConfigWatcher(RefCountedPtr<XdsResolver> resolver)
|
180
|
-
: resolver_(std::move(resolver)) {}
|
181
|
-
void OnResourceChanged(
|
182
|
-
std::shared_ptr<const XdsRouteConfigResource> route_config) override {
|
183
|
-
RefCountedPtr<RouteConfigWatcher> self = Ref();
|
184
|
-
resolver_->work_serializer_->Run(
|
185
|
-
[self = std::move(self),
|
186
|
-
route_config = std::move(route_config)]() mutable {
|
187
|
-
if (self != self->resolver_->route_config_watcher_) return;
|
188
|
-
self->resolver_->OnRouteConfigUpdate(std::move(route_config));
|
189
|
-
},
|
190
|
-
DEBUG_LOCATION);
|
143
|
+
void OnUpdate(
|
144
|
+
RefCountedPtr<const XdsDependencyManager::XdsConfig> config) override {
|
145
|
+
resolver_->OnUpdate(std::move(config));
|
191
146
|
}
|
192
|
-
|
193
|
-
|
194
|
-
resolver_->
|
195
|
-
[self = std::move(self), status = std::move(status)]() mutable {
|
196
|
-
if (self != self->resolver_->route_config_watcher_) return;
|
197
|
-
self->resolver_->OnError(self->resolver_->route_config_name_,
|
198
|
-
std::move(status));
|
199
|
-
},
|
200
|
-
DEBUG_LOCATION);
|
147
|
+
|
148
|
+
void OnError(absl::string_view context, absl::Status status) override {
|
149
|
+
resolver_->OnError(context, std::move(status));
|
201
150
|
}
|
202
|
-
|
203
|
-
|
204
|
-
resolver_->
|
205
|
-
[self = std::move(self)]() {
|
206
|
-
if (self != self->resolver_->route_config_watcher_) return;
|
207
|
-
self->resolver_->OnResourceDoesNotExist(absl::StrCat(
|
208
|
-
self->resolver_->route_config_name_,
|
209
|
-
": xDS route configuration resource does not exist"));
|
210
|
-
},
|
211
|
-
DEBUG_LOCATION);
|
151
|
+
|
152
|
+
void OnResourceDoesNotExist(std::string context) override {
|
153
|
+
resolver_->OnResourceDoesNotExist(std::move(context));
|
212
154
|
}
|
213
155
|
|
214
156
|
private:
|
@@ -224,8 +166,12 @@ class XdsResolver : public Resolver {
|
|
224
166
|
class ClusterRef : public DualRefCounted<ClusterRef> {
|
225
167
|
public:
|
226
168
|
ClusterRef(RefCountedPtr<XdsResolver> resolver,
|
227
|
-
|
228
|
-
|
169
|
+
RefCountedPtr<XdsDependencyManager::ClusterSubscription>
|
170
|
+
cluster_subscription,
|
171
|
+
absl::string_view cluster_key)
|
172
|
+
: resolver_(std::move(resolver)),
|
173
|
+
cluster_subscription_(std::move(cluster_subscription)),
|
174
|
+
cluster_key_(cluster_key) {}
|
229
175
|
|
230
176
|
void Orphan() override {
|
231
177
|
XdsResolver* resolver_ptr = resolver_.get();
|
@@ -234,13 +180,16 @@ class XdsResolver : public Resolver {
|
|
234
180
|
resolver->MaybeRemoveUnusedClusters();
|
235
181
|
},
|
236
182
|
DEBUG_LOCATION);
|
183
|
+
cluster_subscription_.reset();
|
237
184
|
}
|
238
185
|
|
239
|
-
const std::string&
|
186
|
+
const std::string& cluster_key() const { return cluster_key_; }
|
240
187
|
|
241
188
|
private:
|
242
189
|
RefCountedPtr<XdsResolver> resolver_;
|
243
|
-
|
190
|
+
RefCountedPtr<XdsDependencyManager::ClusterSubscription>
|
191
|
+
cluster_subscription_;
|
192
|
+
std::string cluster_key_;
|
244
193
|
};
|
245
194
|
|
246
195
|
// A routing data including cluster refs and routes table held by the
|
@@ -277,9 +226,7 @@ class XdsResolver : public Resolver {
|
|
277
226
|
};
|
278
227
|
|
279
228
|
static absl::StatusOr<RefCountedPtr<RouteConfigData>> Create(
|
280
|
-
XdsResolver* resolver,
|
281
|
-
const std::vector<XdsRouteConfigResource::Route>& routes,
|
282
|
-
const Duration& default_max_stream_duration);
|
229
|
+
XdsResolver* resolver, const Duration& default_max_stream_duration);
|
283
230
|
|
284
231
|
bool operator==(const RouteConfigData& other) const {
|
285
232
|
return clusters_ == other.clusters_ && routes_ == other.routes_;
|
@@ -311,9 +258,9 @@ class XdsResolver : public Resolver {
|
|
311
258
|
return sc1->json_string() == sc2->json_string();
|
312
259
|
}
|
313
260
|
|
314
|
-
absl::Status AddRouteEntry(
|
315
|
-
const
|
316
|
-
|
261
|
+
absl::Status AddRouteEntry(XdsResolver* resolver,
|
262
|
+
const XdsRouteConfigResource::Route& route,
|
263
|
+
const Duration& default_max_stream_duration);
|
317
264
|
|
318
265
|
std::map<absl::string_view, RefCountedPtr<ClusterRef>> clusters_;
|
319
266
|
std::vector<RouteEntry> routes_;
|
@@ -365,7 +312,8 @@ class XdsResolver : public Resolver {
|
|
365
312
|
RouteConfigData::RouteEntry* route_;
|
366
313
|
};
|
367
314
|
|
368
|
-
class ClusterSelectionFilter
|
315
|
+
class ClusterSelectionFilter
|
316
|
+
: public ImplementChannelFilter<ClusterSelectionFilter> {
|
369
317
|
public:
|
370
318
|
const static grpc_channel_filter kFilter;
|
371
319
|
|
@@ -375,8 +323,15 @@ class XdsResolver : public Resolver {
|
|
375
323
|
}
|
376
324
|
|
377
325
|
// Construct a promise for one call.
|
378
|
-
|
379
|
-
|
326
|
+
class Call {
|
327
|
+
public:
|
328
|
+
void OnClientInitialMetadata(ClientMetadata& md);
|
329
|
+
static const NoInterceptor OnServerInitialMetadata;
|
330
|
+
static const NoInterceptor OnServerTrailingMetadata;
|
331
|
+
static const NoInterceptor OnClientToServerMessage;
|
332
|
+
static const NoInterceptor OnServerToClientMessage;
|
333
|
+
static const NoInterceptor OnFinalize;
|
334
|
+
};
|
380
335
|
|
381
336
|
private:
|
382
337
|
explicit ClusterSelectionFilter(ChannelFilter::Args filter_args)
|
@@ -386,26 +341,31 @@ class XdsResolver : public Resolver {
|
|
386
341
|
};
|
387
342
|
|
388
343
|
RefCountedPtr<ClusterRef> GetOrCreateClusterRef(
|
389
|
-
absl::string_view cluster_name) {
|
390
|
-
auto it = cluster_ref_map_.find(
|
344
|
+
absl::string_view cluster_key, absl::string_view cluster_name) {
|
345
|
+
auto it = cluster_ref_map_.find(cluster_key);
|
391
346
|
if (it == cluster_ref_map_.end()) {
|
392
|
-
|
393
|
-
|
347
|
+
RefCountedPtr<XdsDependencyManager::ClusterSubscription> subscription;
|
348
|
+
if (!cluster_name.empty()) {
|
349
|
+
// The cluster ref will hold a subscription to ensure that the
|
350
|
+
// XdsDependencyManager stays subscribed to the CDS resource as
|
351
|
+
// long as the cluster ref exists.
|
352
|
+
subscription = dependency_mgr_->GetClusterSubscription(cluster_name);
|
353
|
+
}
|
354
|
+
auto cluster = MakeRefCounted<ClusterRef>(
|
355
|
+
RefAsSubclass<XdsResolver>(), std::move(subscription), cluster_key);
|
356
|
+
cluster_ref_map_.emplace(cluster->cluster_key(), cluster->WeakRef());
|
394
357
|
return cluster;
|
395
358
|
}
|
396
359
|
return it->second->Ref();
|
397
360
|
}
|
398
361
|
|
399
|
-
void
|
400
|
-
void OnRouteConfigUpdate(
|
401
|
-
std::shared_ptr<const XdsRouteConfigResource> rds_update);
|
362
|
+
void OnUpdate(RefCountedPtr<const XdsDependencyManager::XdsConfig> config);
|
402
363
|
void OnError(absl::string_view context, absl::Status status);
|
403
364
|
void OnResourceDoesNotExist(std::string context);
|
404
365
|
|
405
366
|
absl::StatusOr<RefCountedPtr<ServiceConfig>> CreateServiceConfig();
|
406
367
|
void GenerateResult();
|
407
368
|
void MaybeRemoveUnusedClusters();
|
408
|
-
uint64_t channel_id() const { return channel_id_; }
|
409
369
|
|
410
370
|
std::shared_ptr<WorkSerializer> work_serializer_;
|
411
371
|
std::unique_ptr<ResultHandler> result_handler_;
|
@@ -415,20 +375,23 @@ class XdsResolver : public Resolver {
|
|
415
375
|
RefCountedPtr<GrpcXdsClient> xds_client_;
|
416
376
|
std::string lds_resource_name_;
|
417
377
|
std::string data_plane_authority_;
|
418
|
-
uint64_t channel_id_;
|
419
|
-
|
420
|
-
ListenerWatcher* listener_watcher_ = nullptr;
|
421
|
-
std::shared_ptr<const XdsListenerResource> current_listener_;
|
422
|
-
|
423
|
-
std::string route_config_name_;
|
424
|
-
RouteConfigWatcher* route_config_watcher_ = nullptr;
|
425
|
-
std::shared_ptr<const XdsRouteConfigResource> current_route_config_;
|
426
|
-
|
427
|
-
const XdsRouteConfigResource::VirtualHost* current_virtual_host_ = nullptr;
|
378
|
+
const uint64_t channel_id_;
|
428
379
|
|
380
|
+
OrphanablePtr<XdsDependencyManager> dependency_mgr_;
|
381
|
+
RefCountedPtr<const XdsDependencyManager::XdsConfig> current_config_;
|
429
382
|
std::map<absl::string_view, WeakRefCountedPtr<ClusterRef>> cluster_ref_map_;
|
430
383
|
};
|
431
384
|
|
385
|
+
const NoInterceptor
|
386
|
+
XdsResolver::ClusterSelectionFilter::Call::OnServerInitialMetadata;
|
387
|
+
const NoInterceptor
|
388
|
+
XdsResolver::ClusterSelectionFilter::Call::OnServerTrailingMetadata;
|
389
|
+
const NoInterceptor
|
390
|
+
XdsResolver::ClusterSelectionFilter::Call::OnClientToServerMessage;
|
391
|
+
const NoInterceptor
|
392
|
+
XdsResolver::ClusterSelectionFilter::Call::OnServerToClientMessage;
|
393
|
+
const NoInterceptor XdsResolver::ClusterSelectionFilter::Call::OnFinalize;
|
394
|
+
|
432
395
|
//
|
433
396
|
// XdsResolver::RouteConfigData::RouteListIterator
|
434
397
|
//
|
@@ -458,19 +421,17 @@ class XdsResolver::RouteConfigData::RouteListIterator
|
|
458
421
|
|
459
422
|
absl::StatusOr<RefCountedPtr<XdsResolver::RouteConfigData>>
|
460
423
|
XdsResolver::RouteConfigData::Create(
|
461
|
-
XdsResolver* resolver,
|
462
|
-
const std::vector<XdsRouteConfigResource::Route>& routes,
|
463
|
-
const Duration& default_max_stream_duration) {
|
424
|
+
XdsResolver* resolver, const Duration& default_max_stream_duration) {
|
464
425
|
auto data = MakeRefCounted<RouteConfigData>();
|
465
426
|
// Reserve the necessary entries up-front to avoid reallocation as we add
|
466
427
|
// elements. This is necessary because the string_view in the entry's
|
467
428
|
// weighted_cluster_state field points to the memory in the route field, so
|
468
429
|
// moving the entry in a reallocation will cause the string_view to point to
|
469
430
|
// invalid data.
|
470
|
-
data->routes_.reserve(routes.size());
|
471
|
-
for (auto& route : routes) {
|
431
|
+
data->routes_.reserve(resolver->current_config_->virtual_host->routes.size());
|
432
|
+
for (auto& route : resolver->current_config_->virtual_host->routes) {
|
472
433
|
absl::Status status =
|
473
|
-
data->AddRouteEntry(route, default_max_stream_duration
|
434
|
+
data->AddRouteEntry(resolver, route, default_max_stream_duration);
|
474
435
|
if (!status.ok()) {
|
475
436
|
return status;
|
476
437
|
}
|
@@ -543,12 +504,12 @@ XdsResolver::RouteConfigData::CreateMethodConfig(
|
|
543
504
|
}
|
544
505
|
// Handle xDS HTTP filters.
|
545
506
|
const auto& hcm = absl::get<XdsListenerResource::HttpConnectionManager>(
|
546
|
-
resolver->
|
507
|
+
resolver->current_config_->listener->listener);
|
547
508
|
auto result = XdsRouting::GeneratePerHTTPFilterConfigs(
|
548
509
|
static_cast<const GrpcXdsBootstrap&>(resolver->xds_client_->bootstrap())
|
549
510
|
.http_filter_registry(),
|
550
|
-
hcm.http_filters, *resolver->
|
551
|
-
resolver->args_);
|
511
|
+
hcm.http_filters, *resolver->current_config_->virtual_host, route,
|
512
|
+
cluster_weight, resolver->args_);
|
552
513
|
if (!result.ok()) return result.status();
|
553
514
|
for (const auto& p : result->per_filter_configs) {
|
554
515
|
fields.emplace_back(absl::StrCat(" \"", p.first, "\": [\n",
|
@@ -573,19 +534,21 @@ XdsResolver::RouteConfigData::CreateMethodConfig(
|
|
573
534
|
}
|
574
535
|
|
575
536
|
absl::Status XdsResolver::RouteConfigData::AddRouteEntry(
|
576
|
-
const XdsRouteConfigResource::Route& route,
|
577
|
-
const Duration& default_max_stream_duration
|
537
|
+
XdsResolver* resolver, const XdsRouteConfigResource::Route& route,
|
538
|
+
const Duration& default_max_stream_duration) {
|
578
539
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_resolver_trace)) {
|
579
540
|
gpr_log(GPR_INFO, "[xds_resolver %p] XdsConfigSelector %p: route: %s",
|
580
541
|
resolver, this, route.ToString().c_str());
|
581
542
|
}
|
582
543
|
routes_.emplace_back(route);
|
583
544
|
auto* route_entry = &routes_.back();
|
584
|
-
auto maybe_add_cluster = [&](absl::string_view
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
545
|
+
auto maybe_add_cluster = [&](absl::string_view cluster_key,
|
546
|
+
absl::string_view cluster_name) {
|
547
|
+
if (clusters_.find(cluster_key) != clusters_.end()) return;
|
548
|
+
auto cluster_state =
|
549
|
+
resolver->GetOrCreateClusterRef(cluster_key, cluster_name);
|
550
|
+
absl::string_view key = cluster_state->cluster_key();
|
551
|
+
clusters_.emplace(key, std::move(cluster_state));
|
589
552
|
};
|
590
553
|
auto* route_action = absl::get_if<XdsRouteConfigResource::Route::RouteAction>(
|
591
554
|
&route_entry->route.action);
|
@@ -606,8 +569,8 @@ absl::Status XdsResolver::RouteConfigData::AddRouteEntry(
|
|
606
569
|
return result.status();
|
607
570
|
}
|
608
571
|
route_entry->method_config = std::move(*result);
|
609
|
-
maybe_add_cluster(
|
610
|
-
|
572
|
+
maybe_add_cluster(absl::StrCat("cluster:", cluster_name.cluster_name),
|
573
|
+
cluster_name.cluster_name);
|
611
574
|
return absl::OkStatus();
|
612
575
|
},
|
613
576
|
// WeightedClusters
|
@@ -628,7 +591,8 @@ absl::Status XdsResolver::RouteConfigData::AddRouteEntry(
|
|
628
591
|
cluster_weight_state.cluster = weighted_cluster.name;
|
629
592
|
route_entry->weighted_cluster_state.push_back(
|
630
593
|
std::move(cluster_weight_state));
|
631
|
-
maybe_add_cluster(absl::StrCat("cluster:", weighted_cluster.name)
|
594
|
+
maybe_add_cluster(absl::StrCat("cluster:", weighted_cluster.name),
|
595
|
+
weighted_cluster.name);
|
632
596
|
}
|
633
597
|
return absl::OkStatus();
|
634
598
|
},
|
@@ -641,9 +605,11 @@ absl::Status XdsResolver::RouteConfigData::AddRouteEntry(
|
|
641
605
|
return result.status();
|
642
606
|
}
|
643
607
|
route_entry->method_config = std::move(*result);
|
644
|
-
maybe_add_cluster(
|
645
|
-
|
646
|
-
|
608
|
+
maybe_add_cluster(
|
609
|
+
absl::StrCat(
|
610
|
+
"cluster_specifier_plugin:",
|
611
|
+
cluster_specifier_plugin_name.cluster_specifier_plugin_name),
|
612
|
+
/*subscription_name=*/"");
|
647
613
|
return absl::OkStatus();
|
648
614
|
});
|
649
615
|
if (!status.ok()) {
|
@@ -671,7 +637,7 @@ XdsResolver::XdsConfigSelector::XdsConfigSelector(
|
|
671
637
|
static_cast<const GrpcXdsBootstrap&>(resolver_->xds_client_->bootstrap())
|
672
638
|
.http_filter_registry();
|
673
639
|
const auto& hcm = absl::get<XdsListenerResource::HttpConnectionManager>(
|
674
|
-
resolver_->
|
640
|
+
resolver_->current_config_->listener->listener);
|
675
641
|
for (const auto& http_filter : hcm.http_filters) {
|
676
642
|
// Find filter. This is guaranteed to succeed, because it's checked
|
677
643
|
// at config validation time in the XdsApi code.
|
@@ -802,7 +768,7 @@ absl::Status XdsResolver::XdsConfigSelector::GetCallConfig(
|
|
802
768
|
},
|
803
769
|
[&](const XdsRouteConfigResource::Route::RouteAction::HashPolicy::
|
804
770
|
ChannelId&) -> absl::optional<uint64_t> {
|
805
|
-
return resolver_->
|
771
|
+
return resolver_->channel_id_;
|
806
772
|
});
|
807
773
|
if (new_hash.has_value()) {
|
808
774
|
// Rotating the old value prevents duplicate hash rules from cancelling
|
@@ -828,7 +794,7 @@ absl::Status XdsResolver::XdsConfigSelector::GetCallConfig(
|
|
828
794
|
parsed_method_configs);
|
829
795
|
}
|
830
796
|
args.service_config_call_data->SetCallAttribute(
|
831
|
-
args.arena->New<XdsClusterAttribute>(cluster->
|
797
|
+
args.arena->New<XdsClusterAttribute>(cluster->cluster_key()));
|
832
798
|
args.service_config_call_data->SetCallAttribute(
|
833
799
|
args.arena->New<RequestHashAttribute>(*hash));
|
834
800
|
args.service_config_call_data->SetCallAttribute(
|
@@ -887,9 +853,8 @@ const grpc_channel_filter XdsResolver::ClusterSelectionFilter::kFilter =
|
|
887
853
|
kFilterExaminesServerInitialMetadata>(
|
888
854
|
"cluster_selection_filter");
|
889
855
|
|
890
|
-
|
891
|
-
|
892
|
-
CallArgs call_args, NextPromiseFactory next_promise_factory) {
|
856
|
+
void XdsResolver::ClusterSelectionFilter::Call::OnClientInitialMetadata(
|
857
|
+
ClientMetadata&) {
|
893
858
|
auto* service_config_call_data =
|
894
859
|
static_cast<ClientChannelServiceConfigCallData*>(
|
895
860
|
GetContext<grpc_call_context_element>()
|
@@ -908,7 +873,6 @@ XdsResolver::ClusterSelectionFilter::MakeCallPromise(
|
|
908
873
|
[cluster = std::move(cluster)]() mutable { cluster.reset(); });
|
909
874
|
}
|
910
875
|
}
|
911
|
-
return next_promise_factory(std::move(call_args));
|
912
876
|
}
|
913
877
|
|
914
878
|
//
|
@@ -932,6 +896,9 @@ void XdsResolver::StartLocked() {
|
|
932
896
|
return;
|
933
897
|
}
|
934
898
|
xds_client_ = std::move(*xds_client);
|
899
|
+
grpc_pollset_set_add_pollset_set(xds_client_->interested_parties(),
|
900
|
+
interested_parties_);
|
901
|
+
// Determine LDS resource name.
|
935
902
|
std::string resource_name_fragment(absl::StripPrefix(uri_.path(), "/"));
|
936
903
|
if (!uri_.authority().empty()) {
|
937
904
|
// target_uri.authority is set case
|
@@ -977,13 +944,11 @@ void XdsResolver::StartLocked() {
|
|
977
944
|
gpr_log(GPR_INFO, "[xds_resolver %p] Started with lds_resource_name %s.",
|
978
945
|
this, lds_resource_name_.c_str());
|
979
946
|
}
|
980
|
-
|
981
|
-
|
982
|
-
|
983
|
-
|
984
|
-
|
985
|
-
XdsListenerResourceType::StartWatch(xds_client_.get(), lds_resource_name_,
|
986
|
-
std::move(watcher));
|
947
|
+
// Start watch for xDS config.
|
948
|
+
dependency_mgr_ = MakeOrphanable<XdsDependencyManager>(
|
949
|
+
xds_client_, work_serializer_,
|
950
|
+
std::make_unique<XdsWatcher>(RefAsSubclass<XdsResolver>()),
|
951
|
+
data_plane_authority_, lds_resource_name_, args_, interested_parties_);
|
987
952
|
}
|
988
953
|
|
989
954
|
void XdsResolver::ShutdownLocked() {
|
@@ -991,121 +956,20 @@ void XdsResolver::ShutdownLocked() {
|
|
991
956
|
gpr_log(GPR_INFO, "[xds_resolver %p] shutting down", this);
|
992
957
|
}
|
993
958
|
if (xds_client_ != nullptr) {
|
994
|
-
|
995
|
-
|
996
|
-
|
997
|
-
/*delay_unsubscription=*/false);
|
998
|
-
}
|
999
|
-
if (route_config_watcher_ != nullptr) {
|
1000
|
-
XdsRouteConfigResourceType::CancelWatch(
|
1001
|
-
xds_client_.get(), route_config_name_, route_config_watcher_,
|
1002
|
-
/*delay_unsubscription=*/false);
|
1003
|
-
}
|
1004
|
-
grpc_pollset_set_del_pollset_set(
|
1005
|
-
static_cast<GrpcXdsClient*>(xds_client_.get())->interested_parties(),
|
1006
|
-
interested_parties_);
|
959
|
+
dependency_mgr_.reset();
|
960
|
+
grpc_pollset_set_del_pollset_set(xds_client_->interested_parties(),
|
961
|
+
interested_parties_);
|
1007
962
|
xds_client_.reset(DEBUG_LOCATION, "xds resolver");
|
1008
963
|
}
|
1009
964
|
}
|
1010
965
|
|
1011
|
-
void XdsResolver::
|
1012
|
-
|
966
|
+
void XdsResolver::OnUpdate(
|
967
|
+
RefCountedPtr<const XdsDependencyManager::XdsConfig> config) {
|
1013
968
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_resolver_trace)) {
|
1014
|
-
gpr_log(GPR_INFO, "[xds_resolver %p] received updated
|
969
|
+
gpr_log(GPR_INFO, "[xds_resolver %p] received updated xDS config", this);
|
1015
970
|
}
|
1016
971
|
if (xds_client_ == nullptr) return;
|
1017
|
-
|
1018
|
-
&listener->listener);
|
1019
|
-
if (hcm == nullptr) {
|
1020
|
-
return OnError(lds_resource_name_,
|
1021
|
-
absl::UnavailableError("not an API listener"));
|
1022
|
-
}
|
1023
|
-
current_listener_ = std::move(listener);
|
1024
|
-
Match(
|
1025
|
-
hcm->route_config,
|
1026
|
-
// RDS resource name
|
1027
|
-
[&](const std::string& rds_name) {
|
1028
|
-
// If the RDS name changed, update the RDS watcher.
|
1029
|
-
// Note that this will be true on the initial update, because
|
1030
|
-
// route_config_name_ will be empty.
|
1031
|
-
if (route_config_name_ != rds_name) {
|
1032
|
-
// If we already had a watch (i.e., if the previous config had
|
1033
|
-
// a different RDS name), stop the previous watch.
|
1034
|
-
// There will be no previous watch if either (a) this is the
|
1035
|
-
// initial resource update or (b) the previous Listener had an
|
1036
|
-
// inlined RouteConfig.
|
1037
|
-
if (route_config_watcher_ != nullptr) {
|
1038
|
-
XdsRouteConfigResourceType::CancelWatch(
|
1039
|
-
xds_client_.get(), route_config_name_, route_config_watcher_,
|
1040
|
-
/*delay_unsubscription=*/true);
|
1041
|
-
route_config_watcher_ = nullptr;
|
1042
|
-
}
|
1043
|
-
// Start watch for the new RDS resource name.
|
1044
|
-
route_config_name_ = rds_name;
|
1045
|
-
auto watcher = MakeRefCounted<RouteConfigWatcher>(Ref());
|
1046
|
-
route_config_watcher_ = watcher.get();
|
1047
|
-
XdsRouteConfigResourceType::StartWatch(
|
1048
|
-
xds_client_.get(), route_config_name_, std::move(watcher));
|
1049
|
-
} else {
|
1050
|
-
// RDS resource name has not changed, so no watch needs to be
|
1051
|
-
// updated, but we still need to propagate any changes in the
|
1052
|
-
// HCM config (e.g., the list of HTTP filters).
|
1053
|
-
GenerateResult();
|
1054
|
-
}
|
1055
|
-
},
|
1056
|
-
// inlined RouteConfig
|
1057
|
-
[&](const std::shared_ptr<const XdsRouteConfigResource>& route_config) {
|
1058
|
-
// If the previous update specified an RDS resource instead of
|
1059
|
-
// having an inlined RouteConfig, we need to cancel the RDS watch.
|
1060
|
-
if (route_config_watcher_ != nullptr) {
|
1061
|
-
XdsRouteConfigResourceType::CancelWatch(
|
1062
|
-
xds_client_.get(), route_config_name_, route_config_watcher_);
|
1063
|
-
route_config_watcher_ = nullptr;
|
1064
|
-
route_config_name_.clear();
|
1065
|
-
}
|
1066
|
-
OnRouteConfigUpdate(route_config);
|
1067
|
-
});
|
1068
|
-
}
|
1069
|
-
|
1070
|
-
class VirtualHostListIterator : public XdsRouting::VirtualHostListIterator {
|
1071
|
-
public:
|
1072
|
-
explicit VirtualHostListIterator(
|
1073
|
-
const std::vector<XdsRouteConfigResource::VirtualHost>* virtual_hosts)
|
1074
|
-
: virtual_hosts_(virtual_hosts) {}
|
1075
|
-
|
1076
|
-
size_t Size() const override { return virtual_hosts_->size(); }
|
1077
|
-
|
1078
|
-
const std::vector<std::string>& GetDomainsForVirtualHost(
|
1079
|
-
size_t index) const override {
|
1080
|
-
return (*virtual_hosts_)[index].domains;
|
1081
|
-
}
|
1082
|
-
|
1083
|
-
private:
|
1084
|
-
const std::vector<XdsRouteConfigResource::VirtualHost>* virtual_hosts_;
|
1085
|
-
};
|
1086
|
-
|
1087
|
-
void XdsResolver::OnRouteConfigUpdate(
|
1088
|
-
std::shared_ptr<const XdsRouteConfigResource> rds_update) {
|
1089
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_resolver_trace)) {
|
1090
|
-
gpr_log(GPR_INFO, "[xds_resolver %p] received updated route config", this);
|
1091
|
-
}
|
1092
|
-
if (xds_client_ == nullptr) return;
|
1093
|
-
// Find the relevant VirtualHost from the RouteConfiguration.
|
1094
|
-
auto vhost_index = XdsRouting::FindVirtualHostForDomain(
|
1095
|
-
VirtualHostListIterator(&rds_update->virtual_hosts),
|
1096
|
-
data_plane_authority_);
|
1097
|
-
if (!vhost_index.has_value()) {
|
1098
|
-
OnError(
|
1099
|
-
route_config_name_.empty() ? lds_resource_name_ : route_config_name_,
|
1100
|
-
absl::UnavailableError(absl::StrCat("could not find VirtualHost for ",
|
1101
|
-
data_plane_authority_,
|
1102
|
-
" in RouteConfiguration")));
|
1103
|
-
return;
|
1104
|
-
}
|
1105
|
-
// Save the virtual host in the resolver.
|
1106
|
-
current_route_config_ = std::move(rds_update);
|
1107
|
-
current_virtual_host_ = ¤t_route_config_->virtual_hosts[*vhost_index];
|
1108
|
-
// Send a new result to the channel.
|
972
|
+
current_config_ = std::move(config);
|
1109
973
|
GenerateResult();
|
1110
974
|
}
|
1111
975
|
|
@@ -1118,11 +982,8 @@ void XdsResolver::OnError(absl::string_view context, absl::Status status) {
|
|
1118
982
|
Result result;
|
1119
983
|
result.addresses = status;
|
1120
984
|
result.service_config = std::move(status);
|
1121
|
-
|
1122
|
-
|
1123
|
-
RefCountedPtr<GrpcXdsClient> xds_client =
|
1124
|
-
xds_client_->Ref(DEBUG_LOCATION, "xds resolver result");
|
1125
|
-
result.args = args_.SetObject(std::move(xds_client));
|
985
|
+
result.args =
|
986
|
+
args_.SetObject(xds_client_.Ref(DEBUG_LOCATION, "xds resolver result"));
|
1126
987
|
result_handler_->ReportResult(std::move(result));
|
1127
988
|
}
|
1128
989
|
|
@@ -1132,7 +993,7 @@ void XdsResolver::OnResourceDoesNotExist(std::string context) {
|
|
1132
993
|
"update and returning empty service config",
|
1133
994
|
this);
|
1134
995
|
if (xds_client_ == nullptr) return;
|
1135
|
-
|
996
|
+
current_config_.reset();
|
1136
997
|
Result result;
|
1137
998
|
result.addresses.emplace();
|
1138
999
|
result.service_config = ServiceConfigImpl::Create(args_, "{}");
|
@@ -1153,7 +1014,7 @@ XdsResolver::CreateServiceConfig() {
|
|
1153
1014
|
" \"childPolicy\": %s\n"
|
1154
1015
|
" }",
|
1155
1016
|
cluster.first,
|
1156
|
-
|
1017
|
+
current_config_->route_config->cluster_specifier_plugin_map.at(
|
1157
1018
|
std::string(child_name))));
|
1158
1019
|
} else {
|
1159
1020
|
absl::ConsumePrefix(&child_name, "cluster:");
|
@@ -1185,20 +1046,21 @@ XdsResolver::CreateServiceConfig() {
|
|
1185
1046
|
}
|
1186
1047
|
|
1187
1048
|
void XdsResolver::GenerateResult() {
|
1188
|
-
if (
|
1049
|
+
if (xds_client_ == nullptr || current_config_ == nullptr) return;
|
1189
1050
|
// First create XdsConfigSelector, which may add new entries to the cluster
|
1190
|
-
// state map
|
1051
|
+
// state map.
|
1191
1052
|
const auto& hcm = absl::get<XdsListenerResource::HttpConnectionManager>(
|
1192
|
-
|
1193
|
-
auto route_config_data =
|
1194
|
-
this,
|
1053
|
+
current_config_->listener->listener);
|
1054
|
+
auto route_config_data =
|
1055
|
+
RouteConfigData::Create(this, hcm.http_max_stream_duration);
|
1195
1056
|
if (!route_config_data.ok()) {
|
1196
1057
|
OnError("could not create ConfigSelector",
|
1197
1058
|
absl::UnavailableError(route_config_data.status().message()));
|
1198
1059
|
return;
|
1199
1060
|
}
|
1200
|
-
auto config_selector =
|
1201
|
-
|
1061
|
+
auto config_selector = MakeRefCounted<XdsConfigSelector>(
|
1062
|
+
RefAsSubclass<XdsResolver>(), std::move(*route_config_data));
|
1063
|
+
// Now create the service config.
|
1202
1064
|
Result result;
|
1203
1065
|
result.addresses.emplace();
|
1204
1066
|
result.service_config = CreateServiceConfig();
|
@@ -1208,12 +1070,11 @@ void XdsResolver::GenerateResult() {
|
|
1208
1070
|
? std::string((*result.service_config)->json_string()).c_str()
|
1209
1071
|
: result.service_config.status().ToString().c_str());
|
1210
1072
|
}
|
1211
|
-
// Need to explicitly convert to the right RefCountedPtr<> type for
|
1212
|
-
// use with ChannelArgs::SetObject().
|
1213
|
-
RefCountedPtr<GrpcXdsClient> xds_client =
|
1214
|
-
xds_client_->Ref(DEBUG_LOCATION, "xds resolver result");
|
1215
1073
|
result.args =
|
1216
|
-
args_.SetObject(
|
1074
|
+
args_.SetObject(xds_client_.Ref(DEBUG_LOCATION, "xds resolver result"))
|
1075
|
+
.SetObject(config_selector)
|
1076
|
+
.SetObject(current_config_)
|
1077
|
+
.SetObject(dependency_mgr_->Ref());
|
1217
1078
|
result_handler_->ReportResult(std::move(result));
|
1218
1079
|
}
|
1219
1080
|
|
@@ -1228,10 +1089,7 @@ void XdsResolver::MaybeRemoveUnusedClusters() {
|
|
1228
1089
|
it = cluster_ref_map_.erase(it);
|
1229
1090
|
}
|
1230
1091
|
}
|
1231
|
-
if (update_needed
|
1232
|
-
// Send a new result to the channel.
|
1233
|
-
GenerateResult();
|
1234
|
-
}
|
1092
|
+
if (update_needed) GenerateResult();
|
1235
1093
|
}
|
1236
1094
|
|
1237
1095
|
//
|