grpc 1.41.0 → 1.42.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of grpc might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Makefile +57 -44
- data/etc/roots.pem +335 -326
- data/include/grpc/event_engine/event_engine.h +82 -42
- data/include/grpc/event_engine/internal/memory_allocator_impl.h +98 -0
- data/include/grpc/event_engine/memory_allocator.h +210 -0
- data/include/grpc/grpc.h +4 -0
- data/include/grpc/grpc_security.h +18 -0
- data/include/grpc/grpc_security_constants.h +1 -0
- data/include/grpc/impl/codegen/port_platform.h +7 -0
- data/src/core/ext/filters/client_channel/backend_metric.cc +18 -19
- data/src/core/ext/filters/client_channel/backup_poller.cc +2 -1
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +71 -89
- data/src/core/ext/filters/client_channel/client_channel.cc +187 -252
- data/src/core/ext/filters/client_channel/client_channel.h +74 -27
- data/src/core/ext/filters/client_channel/client_channel_factory.cc +1 -1
- data/src/core/ext/filters/client_channel/client_channel_factory.h +17 -19
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +8 -14
- data/src/core/ext/filters/client_channel/config_selector.cc +1 -1
- data/src/core/ext/filters/client_channel/config_selector.h +4 -5
- data/src/core/ext/filters/client_channel/connector.h +18 -18
- data/src/core/ext/filters/client_channel/dynamic_filters.cc +1 -1
- data/src/core/ext/filters/client_channel/global_subchannel_pool.h +0 -1
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +12 -11
- data/src/core/ext/filters/client_channel/http_connect_handshaker.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +4 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +6 -15
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +166 -82
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +4 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +2 -4
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +23 -7
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +15 -10
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +2 -3
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +2502 -0
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +6 -1
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +7 -1
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +6 -2
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +5 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -1
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +7 -16
- data/src/core/ext/filters/client_channel/lb_policy.h +11 -1
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -0
- data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +139 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +11 -5
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +3 -3
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +12 -39
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +21 -1
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +6 -2
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +3 -1
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +77 -68
- data/src/core/ext/filters/client_channel/resolver.h +1 -1
- data/src/core/ext/filters/client_channel/resolver_factory.h +2 -0
- data/src/core/ext/filters/client_channel/resolver_registry.cc +6 -8
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver_result_parsing.h +1 -1
- data/src/core/ext/filters/client_channel/retry_filter.cc +48 -86
- data/src/core/ext/filters/client_channel/retry_service_config.h +1 -1
- data/src/core/ext/filters/client_channel/retry_throttle.cc +17 -48
- data/src/core/ext/filters/client_channel/server_address.h +1 -1
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +49 -36
- data/src/core/ext/filters/client_channel/subchannel.cc +85 -143
- data/src/core/ext/filters/client_channel/subchannel.h +29 -49
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +22 -7
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +11 -2
- data/src/core/ext/filters/client_idle/client_idle_filter.cc +27 -210
- data/src/core/ext/filters/client_idle/idle_filter_state.cc +96 -0
- data/src/core/ext/filters/client_idle/idle_filter_state.h +66 -0
- data/src/core/ext/filters/deadline/deadline_filter.cc +23 -26
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +19 -19
- data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -1
- data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
- data/src/core/ext/filters/http/client/http_client_filter.cc +41 -44
- data/src/core/ext/filters/http/client_authority_filter.cc +14 -15
- data/src/core/ext/filters/http/http_filters_plugin.cc +53 -71
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +17 -12
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +1 -1
- data/src/core/ext/filters/http/server/http_server_filter.cc +72 -69
- data/src/core/ext/filters/max_age/max_age_filter.cc +24 -26
- data/src/core/ext/filters/message_size/message_size_filter.cc +19 -16
- data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
- data/src/core/ext/{filters/client_channel → service_config}/service_config.cc +2 -2
- data/src/core/ext/{filters/client_channel → service_config}/service_config.h +4 -4
- data/src/core/ext/service_config/service_config_call_data.h +72 -0
- data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.cc +3 -3
- data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.h +8 -6
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -5
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +19 -24
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +27 -50
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +14 -16
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +59 -58
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +19 -16
- data/src/core/ext/transport/chttp2/transport/flow_control.h +4 -4
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +4 -4
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -1
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +2 -1
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +2 -3
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/hpack_constants.h +1 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +41 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +8 -4
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +1 -1
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +136 -98
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +27 -8
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +12 -25
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +37 -30
- data/src/core/ext/transport/chttp2/transport/internal.h +4 -3
- data/src/core/ext/transport/chttp2/transport/parsing.cc +30 -173
- data/src/core/ext/transport/chttp2/transport/popularity_count.h +1 -1
- data/src/core/ext/transport/chttp2/transport/writing.cc +29 -22
- data/src/core/ext/transport/inproc/inproc_transport.cc +105 -109
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +68 -34
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +139 -1
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +16 -4
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +53 -4
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +3 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +15 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +13 -8
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +23 -0
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +0 -1
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +14 -11
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +17 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +15 -12
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +49 -19
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +55 -0
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +154 -0
- data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +0 -2
- data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +58 -0
- data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +182 -0
- data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +58 -0
- data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +130 -0
- data/src/core/ext/upb-generated/{udpa/type/v1 → xds/type/v3}/typed_struct.upb.c +7 -7
- data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +83 -0
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +310 -286
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +10 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +101 -88
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +59 -56
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +59 -46
- data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +78 -82
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +323 -316
- data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +5 -4
- data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +19 -23
- data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +4 -3
- data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +5 -3
- data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +5 -4
- data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.c +75 -0
- data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.h +50 -0
- data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +13 -12
- data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +25 -24
- data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +16 -15
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +17 -16
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +33 -32
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +19 -18
- data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +45 -0
- data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.h +35 -0
- data/src/core/ext/xds/xds_api.cc +325 -362
- data/src/core/ext/xds/xds_api.h +134 -82
- data/src/core/ext/xds/xds_bootstrap.h +10 -0
- data/src/core/ext/xds/xds_certificate_provider.cc +3 -3
- data/src/core/ext/xds/xds_channel_stack_modifier.cc +113 -0
- data/src/core/ext/xds/xds_channel_stack_modifier.h +52 -0
- data/src/core/ext/xds/xds_client.cc +527 -314
- data/src/core/ext/xds/xds_client.h +42 -37
- data/src/core/ext/xds/xds_client_stats.h +1 -1
- data/src/core/ext/xds/xds_server_config_fetcher.cc +5 -7
- data/src/core/lib/address_utils/parse_address.cc +2 -0
- data/src/core/lib/avl/avl.cc +5 -5
- data/src/core/lib/backoff/backoff.cc +1 -1
- data/src/core/lib/channel/channel_args.cc +24 -6
- data/src/core/lib/channel/channel_args.h +9 -0
- data/src/core/lib/channel/channel_stack_builder.cc +3 -3
- data/src/core/lib/channel/channel_trace.cc +1 -1
- data/src/core/lib/channel/channel_trace.h +1 -1
- data/src/core/lib/channel/channelz.cc +3 -3
- data/src/core/lib/channel/channelz.h +2 -2
- data/src/core/lib/channel/channelz_registry.cc +1 -1
- data/src/core/lib/channel/channelz_registry.h +1 -1
- data/src/core/lib/channel/connected_channel.cc +1 -3
- data/src/core/lib/channel/connected_channel.h +1 -2
- data/src/core/lib/compression/compression.cc +2 -2
- data/src/core/lib/compression/compression_args.cc +6 -4
- data/src/core/lib/compression/compression_internal.cc +2 -2
- data/src/core/lib/compression/compression_internal.h +1 -1
- data/src/core/lib/config/core_configuration.cc +44 -2
- data/src/core/lib/config/core_configuration.h +39 -1
- data/src/core/lib/debug/stats.cc +1 -1
- data/src/core/lib/debug/stats_data.cc +13 -13
- data/src/core/lib/gpr/atm.cc +1 -1
- data/src/core/lib/gpr/cpu_posix.cc +1 -1
- data/src/core/lib/gpr/string.cc +2 -2
- data/src/core/lib/gpr/tls.h +1 -1
- data/src/core/lib/gpr/useful.h +79 -32
- data/src/core/lib/gprpp/arena.h +10 -0
- data/src/core/lib/gprpp/bitset.h +38 -16
- data/src/core/lib/gprpp/chunked_vector.h +211 -0
- data/src/core/lib/gprpp/construct_destruct.h +1 -1
- data/src/core/lib/gprpp/match.h +1 -1
- data/src/core/lib/gprpp/memory.h +6 -0
- data/src/core/lib/gprpp/overload.h +1 -1
- data/src/core/lib/gprpp/status_helper.cc +23 -3
- data/src/core/lib/gprpp/status_helper.h +12 -1
- data/src/core/lib/gprpp/table.h +411 -0
- data/src/core/lib/http/httpcli.cc +200 -182
- data/src/core/lib/http/parser.cc +2 -2
- data/src/core/lib/iomgr/call_combiner.cc +28 -10
- data/src/core/lib/iomgr/combiner.cc +6 -21
- data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -6
- data/src/core/lib/iomgr/error.cc +113 -52
- data/src/core/lib/iomgr/error.h +50 -9
- data/src/core/lib/iomgr/error_cfstream.cc +5 -0
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +3 -2
- data/src/core/lib/iomgr/ev_epollex_linux.cc +7 -7
- data/src/core/lib/iomgr/ev_poll_posix.cc +29 -20
- data/src/core/lib/iomgr/event_engine/closure.cc +41 -18
- data/src/core/lib/iomgr/event_engine/closure.h +10 -1
- data/src/core/lib/iomgr/event_engine/endpoint.cc +3 -3
- data/src/core/lib/iomgr/event_engine/iomgr.cc +1 -1
- data/src/core/lib/iomgr/event_engine/pollset.cc +5 -4
- data/src/core/lib/iomgr/event_engine/resolver.cc +10 -7
- data/src/core/lib/iomgr/event_engine/tcp.cc +9 -8
- data/src/core/lib/iomgr/event_engine/timer.cc +7 -2
- data/src/core/lib/iomgr/exec_ctx.cc +1 -9
- data/src/core/lib/iomgr/executor/mpmcqueue.cc +5 -7
- data/src/core/lib/iomgr/executor/mpmcqueue.h +3 -8
- data/src/core/lib/iomgr/executor.cc +6 -20
- data/src/core/lib/iomgr/iomgr.cc +3 -1
- data/src/core/lib/iomgr/iomgr_internal.cc +4 -9
- data/src/core/lib/iomgr/iomgr_internal.h +3 -2
- data/src/core/lib/iomgr/load_file.cc +2 -2
- data/src/core/lib/iomgr/lockfree_event.cc +18 -0
- data/src/core/lib/iomgr/pollset_custom.cc +1 -1
- data/src/core/lib/iomgr/pollset_custom.h +1 -1
- data/src/core/lib/iomgr/resolve_address_posix.cc +5 -7
- data/src/core/lib/iomgr/resource_quota.cc +13 -11
- data/src/core/lib/iomgr/socket_factory_posix.cc +2 -2
- data/src/core/lib/iomgr/socket_mutator.cc +2 -2
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +1 -2
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +5 -3
- data/src/core/lib/iomgr/tcp_client_custom.cc +1 -1
- data/src/core/lib/iomgr/tcp_client_posix.cc +9 -18
- data/src/core/lib/iomgr/tcp_client_windows.cc +2 -3
- data/src/core/lib/iomgr/tcp_posix.cc +4 -5
- data/src/core/lib/iomgr/tcp_server_custom.cc +2 -1
- data/src/core/lib/iomgr/tcp_server_posix.cc +3 -4
- data/src/core/lib/iomgr/tcp_server_windows.cc +4 -5
- data/src/core/lib/iomgr/tcp_windows.cc +2 -2
- data/src/core/lib/iomgr/timer_generic.cc +13 -13
- data/src/core/lib/iomgr/timer_heap.cc +1 -1
- data/src/core/lib/json/json_util.cc +68 -0
- data/src/core/lib/json/json_util.h +57 -99
- data/src/core/lib/json/json_writer.cc +0 -3
- data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
- data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +1 -1
- data/src/core/lib/security/authorization/evaluate_args.cc +14 -12
- data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +13 -1
- data/src/core/lib/security/context/security_context.cc +4 -2
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +1 -1
- data/src/core/lib/security/credentials/credentials.cc +4 -2
- data/src/core/lib/security/credentials/credentials.h +6 -1
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +47 -11
- data/src/core/lib/security/credentials/external/external_account_credentials.h +1 -0
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +1 -1
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -9
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -2
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +2 -2
- data/src/core/lib/security/security_connector/security_connector.cc +9 -4
- data/src/core/lib/security/security_connector/security_connector.h +1 -1
- data/src/core/lib/security/security_connector/ssl_utils.cc +1 -1
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +1 -0
- data/src/core/lib/security/security_connector/tls/tls_security_connector.h +0 -2
- data/src/core/lib/security/transport/client_auth_filter.cc +5 -5
- data/src/core/lib/security/transport/security_handshaker.cc +73 -43
- data/src/core/lib/security/transport/server_auth_filter.cc +3 -5
- data/src/core/lib/security/transport/tsi_error.cc +3 -5
- data/src/core/lib/slice/slice.cc +0 -16
- data/src/core/lib/slice/slice_api.cc +39 -0
- data/src/core/lib/slice/slice_buffer.cc +5 -5
- data/src/core/lib/slice/slice_intern.cc +8 -13
- data/src/core/lib/slice/slice_internal.h +1 -244
- data/src/core/lib/slice/slice_refcount.cc +17 -0
- data/src/core/lib/slice/slice_refcount.h +121 -0
- data/src/core/lib/slice/slice_refcount_base.h +173 -0
- data/src/core/lib/slice/slice_split.cc +100 -0
- data/src/core/lib/slice/slice_split.h +40 -0
- data/src/core/lib/slice/slice_string_helpers.cc +0 -83
- data/src/core/lib/slice/slice_string_helpers.h +0 -11
- data/src/core/lib/slice/static_slice.cc +529 -0
- data/src/core/lib/slice/static_slice.h +331 -0
- data/src/core/lib/surface/builtins.cc +49 -0
- data/src/core/{ext/filters/workarounds/workaround_cronet_compression_filter.h → lib/surface/builtins.h} +8 -9
- data/src/core/lib/surface/call.cc +103 -120
- data/src/core/lib/surface/call.h +0 -6
- data/src/core/lib/surface/channel.cc +19 -32
- data/src/core/lib/surface/channel.h +0 -9
- data/src/core/lib/surface/channel_init.cc +23 -76
- data/src/core/lib/surface/channel_init.h +52 -44
- data/src/core/lib/surface/completion_queue.cc +6 -5
- data/src/core/lib/surface/init.cc +0 -39
- data/src/core/lib/surface/init_secure.cc +17 -14
- data/src/core/lib/surface/lame_client.cc +18 -11
- data/src/core/lib/surface/lame_client.h +1 -1
- data/src/core/lib/surface/server.cc +25 -17
- data/src/core/lib/surface/server.h +17 -10
- data/src/core/lib/surface/validate_metadata.cc +5 -2
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/bdp_estimator.cc +1 -1
- data/src/core/lib/transport/error_utils.cc +42 -17
- data/src/core/lib/transport/error_utils.h +1 -1
- data/src/core/lib/transport/metadata.cc +31 -10
- data/src/core/lib/transport/metadata.h +2 -1
- data/src/core/lib/transport/metadata_batch.cc +35 -371
- data/src/core/lib/transport/metadata_batch.h +905 -71
- data/src/core/lib/transport/parsed_metadata.h +263 -0
- data/src/core/lib/transport/pid_controller.cc +4 -4
- data/src/core/lib/transport/static_metadata.cc +714 -846
- data/src/core/lib/transport/static_metadata.h +115 -379
- data/src/core/lib/transport/status_metadata.cc +1 -0
- data/src/core/lib/transport/transport.cc +4 -5
- data/src/core/lib/transport/transport_op_string.cc +40 -20
- data/src/core/plugin_registry/grpc_plugin_registry.cc +64 -43
- data/src/core/tsi/alts/crypt/aes_gcm.cc +3 -1
- data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +13 -12
- data/src/core/tsi/alts/frame_protector/frame_handler.cc +10 -11
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -2
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +12 -2
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +2 -2
- data/src/core/tsi/fake_transport_security.cc +15 -7
- data/src/core/tsi/local_transport_security.cc +36 -73
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +16 -50
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +4 -3
- data/src/core/tsi/ssl_transport_security.cc +10 -2
- data/src/core/tsi/transport_security.cc +12 -0
- data/src/core/tsi/transport_security.h +16 -1
- data/src/core/tsi/transport_security_interface.h +26 -0
- data/src/ruby/ext/grpc/extconf.rb +12 -9
- 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/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -2
- data/src/ruby/spec/client_server_spec.rb +1 -1
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +4 -4
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +11 -6
- data/third_party/address_sorting/address_sorting_posix.c +1 -0
- data/third_party/boringssl-with-bazel/err_data.c +278 -272
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +21 -22
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c +0 -2
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c +5 -0
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c +15 -22
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +13 -7
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_print.c +19 -29
- data/third_party/boringssl-with-bazel/src/crypto/{x509 → asn1}/a_strex.c +268 -271
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +106 -153
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +0 -39
- data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/{x509 → asn1}/charmap.h +0 -0
- data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +38 -0
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +8 -8
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +289 -198
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +8 -8
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +9 -13
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +11 -8
- data/third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c +1 -7
- data/third_party/boringssl-with-bazel/src/crypto/bio/connect.c +1 -5
- data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +0 -4
- data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +1 -7
- data/third_party/boringssl-with-bazel/src/crypto/bio/pair.c +1 -6
- data/third_party/boringssl-with-bazel/src/crypto/bio/socket.c +3 -17
- data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +4 -6
- data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c +9 -0
- data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +8 -0
- data/third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c +38 -47
- data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.c +45 -65
- data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c +32 -34
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +21 -3
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd_extra.c +3 -2
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +5 -2
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/sqrt.c +5 -9
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +10 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/des.c +10 -11
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/internal.h +1 -3
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +4 -7
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +4 -7
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_nohw.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +24 -9
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +4 -2
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +35 -35
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +11 -10
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +10 -37
- data/third_party/boringssl-with-bazel/src/crypto/internal.h +39 -0
- data/third_party/boringssl-with-bazel/src/crypto/mem.c +12 -9
- data/third_party/boringssl-with-bazel/src/crypto/pem/pem_all.c +0 -9
- data/third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c +0 -2
- data/third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c +0 -8
- data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c +0 -2
- data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c +0 -4
- data/third_party/boringssl-with-bazel/src/crypto/pkcs7/internal.h +16 -7
- data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +9 -4
- data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +151 -12
- data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c +6 -6
- data/third_party/boringssl-with-bazel/src/crypto/x509/by_file.c +2 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +181 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509/name_print.c +246 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +11 -2
- data/third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c +0 -2
- data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +0 -179
- data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c +4 -2
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +0 -5
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +11 -50
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +2 -4
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +0 -16
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +22 -18
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +11 -8
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +16 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_int.h +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c +4 -3
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c +24 -5
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +17 -8
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c +3 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +6 -6
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c +4 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +5 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ncons.c +112 -55
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pci.c +2 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +0 -2
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +71 -26
- data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +366 -227
- data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +2 -9
- data/third_party/boringssl-with-bazel/src/include/openssl/base.h +10 -4
- data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +3 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/bn.h +3 -3
- data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +9 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +8 -2
- data/third_party/boringssl-with-bazel/src/include/openssl/hkdf.h +4 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/mem.h +9 -3
- data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +0 -20
- data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +12 -5
- data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +5 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/span.h +37 -15
- data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +28 -14
- data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +31 -32
- data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +529 -91
- data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +16 -695
- data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +48 -8
- data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +266 -357
- data/third_party/boringssl-with-bazel/src/ssl/extensions.cc +90 -152
- data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +15 -13
- data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +75 -79
- data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +96 -97
- data/third_party/boringssl-with-bazel/src/ssl/internal.h +63 -43
- data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +2 -2
- data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +2 -2
- data/third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc +6 -12
- data/third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc +14 -17
- data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +14 -27
- data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +203 -203
- data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +30 -41
- data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +47 -33
- data/third_party/re2/re2/compile.cc +91 -109
- data/third_party/re2/re2/dfa.cc +27 -39
- data/third_party/re2/re2/filtered_re2.cc +18 -2
- data/third_party/re2/re2/filtered_re2.h +10 -5
- data/third_party/re2/re2/nfa.cc +1 -1
- data/third_party/re2/re2/parse.cc +42 -23
- data/third_party/re2/re2/perl_groups.cc +34 -34
- data/third_party/re2/re2/prefilter.cc +3 -2
- data/third_party/re2/re2/prog.cc +182 -4
- data/third_party/re2/re2/prog.h +28 -9
- data/third_party/re2/re2/re2.cc +87 -118
- data/third_party/re2/re2/re2.h +156 -141
- data/third_party/re2/re2/regexp.cc +12 -5
- data/third_party/re2/re2/regexp.h +8 -2
- data/third_party/re2/re2/set.cc +31 -9
- data/third_party/re2/re2/set.h +9 -4
- data/third_party/re2/re2/simplify.cc +11 -3
- data/third_party/re2/re2/tostring.cc +1 -1
- data/third_party/re2/re2/walker-inl.h +1 -1
- data/third_party/re2/util/mutex.h +2 -2
- data/third_party/re2/util/pcre.h +3 -3
- metadata +77 -64
- data/include/grpc/event_engine/slice_allocator.h +0 -71
- data/src/core/ext/filters/client_channel/service_config_call_data.h +0 -126
- data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +0 -211
- data/src/core/ext/filters/workarounds/workaround_utils.cc +0 -53
- data/src/core/ext/filters/workarounds/workaround_utils.h +0 -39
- data/src/core/ext/transport/chttp2/client/authority.cc +0 -42
- data/src/core/ext/transport/chttp2/client/authority.h +0 -36
- data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc +0 -67
- data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h +0 -74
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +0 -66
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +0 -58
- data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +0 -58
- data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +0 -130
- data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +0 -83
- data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c +0 -44
- data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h +0 -35
- data/src/core/lib/iomgr/udp_server.cc +0 -747
- data/src/core/lib/iomgr/udp_server.h +0 -103
- data/src/core/lib/transport/authority_override.cc +0 -40
- data/src/core/lib/transport/authority_override.h +0 -37
@@ -33,7 +33,6 @@
|
|
33
33
|
#include <grpc/support/time.h>
|
34
34
|
|
35
35
|
#include "src/core/ext/filters/client_channel/client_channel.h"
|
36
|
-
#include "src/core/ext/filters/client_channel/service_config.h"
|
37
36
|
#include "src/core/ext/xds/xds_api.h"
|
38
37
|
#include "src/core/ext/xds/xds_bootstrap.h"
|
39
38
|
#include "src/core/ext/xds/xds_channel_args.h"
|
@@ -55,8 +54,8 @@
|
|
55
54
|
#include "src/core/lib/slice/slice_string_helpers.h"
|
56
55
|
#include "src/core/lib/surface/call.h"
|
57
56
|
#include "src/core/lib/surface/channel.h"
|
58
|
-
#include "src/core/lib/surface/channel_init.h"
|
59
57
|
#include "src/core/lib/transport/static_metadata.h"
|
58
|
+
#include "src/core/lib/uri/uri_parser.h"
|
60
59
|
|
61
60
|
#define GRPC_XDS_INITIAL_CONNECT_BACKOFF_SECONDS 1
|
62
61
|
#define GRPC_XDS_RECONNECT_BACKOFF_MULTIPLIER 1.6
|
@@ -72,6 +71,7 @@ TraceFlag grpc_xds_client_refcount_trace(false, "xds_client_refcount");
|
|
72
71
|
namespace {
|
73
72
|
|
74
73
|
Mutex* g_mu = nullptr;
|
74
|
+
|
75
75
|
const grpc_channel_args* g_channel_args ABSL_GUARDED_BY(*g_mu) = nullptr;
|
76
76
|
XdsClient* g_xds_client ABSL_GUARDED_BY(*g_mu) = nullptr;
|
77
77
|
char* g_fallback_bootstrap_config ABSL_GUARDED_BY(*g_mu) = nullptr;
|
@@ -88,7 +88,7 @@ template <typename T>
|
|
88
88
|
class XdsClient::ChannelState::RetryableCall
|
89
89
|
: public InternallyRefCounted<RetryableCall<T>> {
|
90
90
|
public:
|
91
|
-
explicit RetryableCall(
|
91
|
+
explicit RetryableCall(WeakRefCountedPtr<ChannelState> chand);
|
92
92
|
|
93
93
|
void Orphan() override;
|
94
94
|
|
@@ -109,7 +109,7 @@ class XdsClient::ChannelState::RetryableCall
|
|
109
109
|
// every time we start a new call. It's null during call retry backoff.
|
110
110
|
OrphanablePtr<T> calld_;
|
111
111
|
// The owning xds channel.
|
112
|
-
|
112
|
+
WeakRefCountedPtr<ChannelState> chand_;
|
113
113
|
|
114
114
|
// Retry state.
|
115
115
|
BackOff backoff_;
|
@@ -135,9 +135,11 @@ class XdsClient::ChannelState::AdsCallState
|
|
135
135
|
XdsClient* xds_client() const { return chand()->xds_client(); }
|
136
136
|
bool seen_response() const { return seen_response_; }
|
137
137
|
|
138
|
-
void SubscribeLocked(const std::string& type_url,
|
138
|
+
void SubscribeLocked(const std::string& type_url,
|
139
|
+
const XdsApi::ResourceName& resource)
|
139
140
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
140
|
-
void UnsubscribeLocked(const std::string& type_url,
|
141
|
+
void UnsubscribeLocked(const std::string& type_url,
|
142
|
+
const XdsApi::ResourceName& resource,
|
141
143
|
bool delay_unsubscription)
|
142
144
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
143
145
|
|
@@ -146,10 +148,11 @@ class XdsClient::ChannelState::AdsCallState
|
|
146
148
|
private:
|
147
149
|
class ResourceState : public InternallyRefCounted<ResourceState> {
|
148
150
|
public:
|
149
|
-
ResourceState(const std::string& type_url,
|
151
|
+
ResourceState(const std::string& type_url,
|
152
|
+
const XdsApi::ResourceName& resource,
|
150
153
|
bool sent_initial_request)
|
151
154
|
: type_url_(type_url),
|
152
|
-
|
155
|
+
resource_(resource),
|
153
156
|
sent_initial_request_(sent_initial_request) {
|
154
157
|
GRPC_CLOSURE_INIT(&timer_callback_, OnTimer, this,
|
155
158
|
grpc_schedule_on_exec_ctx);
|
@@ -197,34 +200,38 @@ class XdsClient::ChannelState::AdsCallState
|
|
197
200
|
grpc_error_handle watcher_error =
|
198
201
|
GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrFormat(
|
199
202
|
"timeout obtaining resource {type=%s name=%s} from xds server",
|
200
|
-
type_url_,
|
203
|
+
type_url_,
|
204
|
+
XdsApi::ConstructFullResourceName(resource_.authority,
|
205
|
+
type_url_, resource_.id)));
|
201
206
|
watcher_error = grpc_error_set_int(
|
202
207
|
watcher_error, GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
|
203
208
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
204
209
|
gpr_log(GPR_INFO, "[xds_client %p] %s", ads_calld_->xds_client(),
|
205
210
|
grpc_error_std_string(watcher_error).c_str());
|
206
211
|
}
|
212
|
+
auto& authority_state =
|
213
|
+
ads_calld_->xds_client()->authority_state_map_[resource_.authority];
|
207
214
|
if (type_url_ == XdsApi::kLdsTypeUrl) {
|
208
|
-
ListenerState& state =
|
215
|
+
ListenerState& state = authority_state.listener_map[resource_.id];
|
209
216
|
state.meta.client_status = XdsApi::ResourceMetadata::DOES_NOT_EXIST;
|
210
217
|
for (const auto& p : state.watchers) {
|
211
218
|
p.first->OnError(GRPC_ERROR_REF(watcher_error));
|
212
219
|
}
|
213
220
|
} else if (type_url_ == XdsApi::kRdsTypeUrl) {
|
214
221
|
RouteConfigState& state =
|
215
|
-
|
222
|
+
authority_state.route_config_map[resource_.id];
|
216
223
|
state.meta.client_status = XdsApi::ResourceMetadata::DOES_NOT_EXIST;
|
217
224
|
for (const auto& p : state.watchers) {
|
218
225
|
p.first->OnError(GRPC_ERROR_REF(watcher_error));
|
219
226
|
}
|
220
227
|
} else if (type_url_ == XdsApi::kCdsTypeUrl) {
|
221
|
-
ClusterState& state =
|
228
|
+
ClusterState& state = authority_state.cluster_map[resource_.id];
|
222
229
|
state.meta.client_status = XdsApi::ResourceMetadata::DOES_NOT_EXIST;
|
223
230
|
for (const auto& p : state.watchers) {
|
224
231
|
p.first->OnError(GRPC_ERROR_REF(watcher_error));
|
225
232
|
}
|
226
233
|
} else if (type_url_ == XdsApi::kEdsTypeUrl) {
|
227
|
-
EndpointState& state =
|
234
|
+
EndpointState& state = authority_state.endpoint_map[resource_.id];
|
228
235
|
state.meta.client_status = XdsApi::ResourceMetadata::DOES_NOT_EXIST;
|
229
236
|
for (const auto& p : state.watchers) {
|
230
237
|
p.first->OnError(GRPC_ERROR_REF(watcher_error));
|
@@ -238,7 +245,7 @@ class XdsClient::ChannelState::AdsCallState
|
|
238
245
|
}
|
239
246
|
|
240
247
|
const std::string type_url_;
|
241
|
-
const
|
248
|
+
const XdsApi::ResourceName resource_;
|
242
249
|
|
243
250
|
RefCountedPtr<AdsCallState> ads_calld_;
|
244
251
|
bool sent_initial_request_;
|
@@ -255,32 +262,41 @@ class XdsClient::ChannelState::AdsCallState
|
|
255
262
|
grpc_error_handle error = GRPC_ERROR_NONE;
|
256
263
|
|
257
264
|
// Subscribed resources of this type.
|
258
|
-
std::map<std::string /*
|
265
|
+
std::map<std::string /*authority*/,
|
266
|
+
std::map<std::string /*name*/, OrphanablePtr<ResourceState>>>
|
259
267
|
subscribed_resources;
|
260
268
|
};
|
261
269
|
|
262
270
|
void SendMessageLocked(const std::string& type_url)
|
263
271
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
264
272
|
|
265
|
-
void AcceptLdsUpdateLocked(
|
266
|
-
|
267
|
-
|
273
|
+
void AcceptLdsUpdateLocked(
|
274
|
+
std::string version, grpc_millis update_time,
|
275
|
+
XdsApi::LdsUpdateMap lds_update_map,
|
276
|
+
const std::set<XdsApi::ResourceName>& resource_names_failed)
|
268
277
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
269
278
|
void AcceptRdsUpdateLocked(std::string version, grpc_millis update_time,
|
270
279
|
XdsApi::RdsUpdateMap rds_update_map)
|
271
280
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
272
|
-
void AcceptCdsUpdateLocked(
|
273
|
-
|
274
|
-
|
281
|
+
void AcceptCdsUpdateLocked(
|
282
|
+
std::string version, grpc_millis update_time,
|
283
|
+
XdsApi::CdsUpdateMap cds_update_map,
|
284
|
+
const std::set<XdsApi::ResourceName>& resource_names_failed)
|
275
285
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
276
286
|
void AcceptEdsUpdateLocked(std::string version, grpc_millis update_time,
|
277
287
|
XdsApi::EdsUpdateMap eds_update_map)
|
278
288
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
279
289
|
|
280
290
|
template <typename StateMap>
|
291
|
+
void RejectAdsUpdateHelperLocked(const std::string& resource_name,
|
292
|
+
grpc_millis update_time,
|
293
|
+
const XdsApi::AdsParseResult& result,
|
294
|
+
const std::string& error_details,
|
295
|
+
StateMap* state_map)
|
296
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
297
|
+
|
281
298
|
void RejectAdsUpdateLocked(grpc_millis update_time,
|
282
|
-
const XdsApi::AdsParseResult& result
|
283
|
-
StateMap* state_map)
|
299
|
+
const XdsApi::AdsParseResult& result)
|
284
300
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
285
301
|
|
286
302
|
static void OnRequestSent(void* arg, grpc_error_handle error);
|
@@ -295,8 +311,9 @@ class XdsClient::ChannelState::AdsCallState
|
|
295
311
|
|
296
312
|
bool IsCurrentCallOnChannel() const;
|
297
313
|
|
298
|
-
std::
|
299
|
-
|
314
|
+
std::map<absl::string_view /*authority*/,
|
315
|
+
std::set<absl::string_view /*name*/>>
|
316
|
+
ResourceNamesForRequest(const std::string& type_url);
|
300
317
|
|
301
318
|
// The owning RetryableCall<>.
|
302
319
|
RefCountedPtr<RetryableCall<AdsCallState>> parent_;
|
@@ -441,7 +458,7 @@ class XdsClient::ChannelState::LrsCallState
|
|
441
458
|
class XdsClient::ChannelState::StateWatcher
|
442
459
|
: public AsyncConnectivityStateWatcherInterface {
|
443
460
|
public:
|
444
|
-
explicit StateWatcher(
|
461
|
+
explicit StateWatcher(WeakRefCountedPtr<ChannelState> parent)
|
445
462
|
: parent_(std::move(parent)) {}
|
446
463
|
|
447
464
|
private:
|
@@ -461,7 +478,7 @@ class XdsClient::ChannelState::StateWatcher
|
|
461
478
|
}
|
462
479
|
}
|
463
480
|
|
464
|
-
|
481
|
+
WeakRefCountedPtr<ChannelState> parent_;
|
465
482
|
};
|
466
483
|
|
467
484
|
//
|
@@ -483,7 +500,7 @@ grpc_channel* CreateXdsChannel(grpc_channel_args* args,
|
|
483
500
|
|
484
501
|
XdsClient::ChannelState::ChannelState(WeakRefCountedPtr<XdsClient> xds_client,
|
485
502
|
const XdsBootstrap::XdsServer& server)
|
486
|
-
:
|
503
|
+
: DualRefCounted<ChannelState>(
|
487
504
|
GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_refcount_trace)
|
488
505
|
? "ChannelState"
|
489
506
|
: nullptr),
|
@@ -507,12 +524,19 @@ XdsClient::ChannelState::~ChannelState() {
|
|
507
524
|
xds_client_.reset(DEBUG_LOCATION, "ChannelState");
|
508
525
|
}
|
509
526
|
|
510
|
-
|
527
|
+
// This method should only ever be called when holding the lock, but we can't
|
528
|
+
// use a ABSL_EXCLUSIVE_LOCKS_REQUIRED annotation, because Orphan() will be
|
529
|
+
// called from DualRefCounted::Unref, which cannot have a lock annotation for a
|
530
|
+
// lock in this subclass.
|
531
|
+
void XdsClient::ChannelState::Orphan() ABSL_NO_THREAD_SAFETY_ANALYSIS {
|
511
532
|
shutting_down_ = true;
|
512
533
|
CancelConnectivityWatchLocked();
|
534
|
+
// At this time, all strong refs are removed, remove from channel map to
|
535
|
+
// prevent subsequent subscription from trying to use this ChannelState as it
|
536
|
+
// is shutting down.
|
537
|
+
xds_client_->xds_server_channel_map_.erase(server_);
|
513
538
|
ads_calld_.reset();
|
514
539
|
lrs_calld_.reset();
|
515
|
-
Unref(DEBUG_LOCATION, "ChannelState+orphaned");
|
516
540
|
}
|
517
541
|
|
518
542
|
XdsClient::ChannelState::AdsCallState* XdsClient::ChannelState::ads_calld()
|
@@ -531,8 +555,8 @@ bool XdsClient::ChannelState::HasActiveAdsCall() const {
|
|
531
555
|
|
532
556
|
void XdsClient::ChannelState::MaybeStartLrsCall() {
|
533
557
|
if (lrs_calld_ != nullptr) return;
|
534
|
-
lrs_calld_.reset(
|
535
|
-
|
558
|
+
lrs_calld_.reset(new RetryableCall<LrsCallState>(
|
559
|
+
WeakRef(DEBUG_LOCATION, "ChannelState+lrs")));
|
536
560
|
}
|
537
561
|
|
538
562
|
void XdsClient::ChannelState::StopLrsCall() { lrs_calld_.reset(); }
|
@@ -540,7 +564,7 @@ void XdsClient::ChannelState::StopLrsCall() { lrs_calld_.reset(); }
|
|
540
564
|
void XdsClient::ChannelState::StartConnectivityWatchLocked() {
|
541
565
|
ClientChannel* client_channel = ClientChannel::GetFromChannel(channel_);
|
542
566
|
GPR_ASSERT(client_channel != nullptr);
|
543
|
-
watcher_ = new StateWatcher(
|
567
|
+
watcher_ = new StateWatcher(WeakRef(DEBUG_LOCATION, "ChannelState+watch"));
|
544
568
|
client_channel->AddConnectivityWatcher(
|
545
569
|
GRPC_CHANNEL_IDLE,
|
546
570
|
OrphanablePtr<AsyncConnectivityStateWatcherInterface>(watcher_));
|
@@ -552,12 +576,12 @@ void XdsClient::ChannelState::CancelConnectivityWatchLocked() {
|
|
552
576
|
client_channel->RemoveConnectivityWatcher(watcher_);
|
553
577
|
}
|
554
578
|
|
555
|
-
void XdsClient::ChannelState::SubscribeLocked(
|
556
|
-
|
579
|
+
void XdsClient::ChannelState::SubscribeLocked(
|
580
|
+
const std::string& type_url, const XdsApi::ResourceName& resource) {
|
557
581
|
if (ads_calld_ == nullptr) {
|
558
582
|
// Start the ADS call if this is the first request.
|
559
583
|
ads_calld_.reset(new RetryableCall<AdsCallState>(
|
560
|
-
|
584
|
+
WeakRef(DEBUG_LOCATION, "ChannelState+ads")));
|
561
585
|
// Note: AdsCallState's ctor will automatically subscribe to all
|
562
586
|
// resources that the XdsClient already has watchers for, so we can
|
563
587
|
// return here.
|
@@ -567,17 +591,19 @@ void XdsClient::ChannelState::SubscribeLocked(const std::string& type_url,
|
|
567
591
|
// because when the call is restarted it will resend all necessary requests.
|
568
592
|
if (ads_calld() == nullptr) return;
|
569
593
|
// Subscribe to this resource if the ADS call is active.
|
570
|
-
ads_calld()->SubscribeLocked(type_url,
|
594
|
+
ads_calld()->SubscribeLocked(type_url, resource);
|
571
595
|
}
|
572
596
|
|
573
|
-
void XdsClient::ChannelState::UnsubscribeLocked(
|
574
|
-
|
575
|
-
|
597
|
+
void XdsClient::ChannelState::UnsubscribeLocked(
|
598
|
+
const std::string& type_url, const XdsApi::ResourceName& resource,
|
599
|
+
bool delay_unsubscription) {
|
576
600
|
if (ads_calld_ != nullptr) {
|
577
601
|
auto* calld = ads_calld_->calld();
|
578
602
|
if (calld != nullptr) {
|
579
|
-
calld->UnsubscribeLocked(type_url,
|
580
|
-
if (!calld->HasSubscribedResources())
|
603
|
+
calld->UnsubscribeLocked(type_url, resource, delay_unsubscription);
|
604
|
+
if (!calld->HasSubscribedResources()) {
|
605
|
+
ads_calld_.reset();
|
606
|
+
}
|
581
607
|
}
|
582
608
|
}
|
583
609
|
}
|
@@ -588,7 +614,7 @@ void XdsClient::ChannelState::UnsubscribeLocked(const std::string& type_url,
|
|
588
614
|
|
589
615
|
template <typename T>
|
590
616
|
XdsClient::ChannelState::RetryableCall<T>::RetryableCall(
|
591
|
-
|
617
|
+
WeakRefCountedPtr<ChannelState> chand)
|
592
618
|
: chand_(std::move(chand)),
|
593
619
|
backoff_(
|
594
620
|
BackOff::Options()
|
@@ -646,7 +672,8 @@ void XdsClient::ChannelState::RetryableCall<T>::StartRetryTimerLocked() {
|
|
646
672
|
if (shutting_down_) return;
|
647
673
|
const grpc_millis next_attempt_time = backoff_.NextAttemptTime();
|
648
674
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
649
|
-
grpc_millis timeout =
|
675
|
+
grpc_millis timeout =
|
676
|
+
std::max(next_attempt_time - ExecCtx::Get()->Now(), grpc_millis(0));
|
650
677
|
gpr_log(GPR_INFO,
|
651
678
|
"[xds_client %p] Failed to connect to xds server (chand: %p) "
|
652
679
|
"retry timer will fire in %" PRId64 "ms.",
|
@@ -737,17 +764,26 @@ XdsClient::ChannelState::AdsCallState::AdsCallState(
|
|
737
764
|
// Op: send request message.
|
738
765
|
GRPC_CLOSURE_INIT(&on_request_sent_, OnRequestSent, this,
|
739
766
|
grpc_schedule_on_exec_ctx);
|
740
|
-
for (const auto&
|
741
|
-
|
742
|
-
|
743
|
-
|
744
|
-
|
745
|
-
|
746
|
-
|
747
|
-
|
748
|
-
|
749
|
-
|
750
|
-
|
767
|
+
for (const auto& a : xds_client()->authority_state_map_) {
|
768
|
+
const std::string& authority = a.first;
|
769
|
+
// Skip authorities that are not using this xDS channel.
|
770
|
+
if (a.second.channel_state != chand()) continue;
|
771
|
+
for (const auto& l : a.second.listener_map) {
|
772
|
+
const std::string& listener_name = l.first;
|
773
|
+
SubscribeLocked(XdsApi::kLdsTypeUrl, {authority, listener_name});
|
774
|
+
}
|
775
|
+
for (const auto& r : a.second.route_config_map) {
|
776
|
+
const std::string& route_config_name = r.first;
|
777
|
+
SubscribeLocked(XdsApi::kRdsTypeUrl, {authority, route_config_name});
|
778
|
+
}
|
779
|
+
for (const auto& c : a.second.cluster_map) {
|
780
|
+
const std::string& cluster_name = c.first;
|
781
|
+
SubscribeLocked(XdsApi::kCdsTypeUrl, {authority, cluster_name});
|
782
|
+
}
|
783
|
+
for (const auto& e : a.second.endpoint_map) {
|
784
|
+
const std::string& endpoint_name = e.first;
|
785
|
+
SubscribeLocked(XdsApi::kEdsTypeUrl, {authority, endpoint_name});
|
786
|
+
}
|
751
787
|
}
|
752
788
|
// Op: recv initial metadata.
|
753
789
|
op = ops;
|
@@ -820,11 +856,12 @@ void XdsClient::ChannelState::AdsCallState::SendMessageLocked(
|
|
820
856
|
}
|
821
857
|
auto& state = state_map_[type_url];
|
822
858
|
grpc_slice request_payload_slice;
|
823
|
-
std::
|
824
|
-
|
859
|
+
std::map<absl::string_view /*authority*/,
|
860
|
+
std::set<absl::string_view /*name*/>>
|
861
|
+
resource_map = ResourceNamesForRequest(type_url);
|
825
862
|
request_payload_slice = xds_client()->api_.CreateAdsRequest(
|
826
|
-
chand()->server_, type_url,
|
827
|
-
|
863
|
+
chand()->server_, type_url, resource_map,
|
864
|
+
chand()->resource_type_version_map_[type_url], state.nonce,
|
828
865
|
GRPC_ERROR_REF(state.error), !sent_initial_message_);
|
829
866
|
if (type_url != XdsApi::kLdsTypeUrl && type_url != XdsApi::kRdsTypeUrl &&
|
830
867
|
type_url != XdsApi::kCdsTypeUrl && type_url != XdsApi::kEdsTypeUrl) {
|
@@ -834,11 +871,10 @@ void XdsClient::ChannelState::AdsCallState::SendMessageLocked(
|
|
834
871
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
835
872
|
gpr_log(GPR_INFO,
|
836
873
|
"[xds_client %p] sending ADS request: type=%s version=%s nonce=%s "
|
837
|
-
"error=%s
|
874
|
+
"error=%s",
|
838
875
|
xds_client(), type_url.c_str(),
|
839
|
-
|
840
|
-
state.nonce.c_str(), grpc_error_std_string(state.error).c_str()
|
841
|
-
absl::StrJoin(resource_names, " ").c_str());
|
876
|
+
chand()->resource_type_version_map_[type_url].c_str(),
|
877
|
+
state.nonce.c_str(), grpc_error_std_string(state.error).c_str());
|
842
878
|
}
|
843
879
|
GRPC_ERROR_UNREF(state.error);
|
844
880
|
state.error = GRPC_ERROR_NONE;
|
@@ -865,19 +901,26 @@ void XdsClient::ChannelState::AdsCallState::SendMessageLocked(
|
|
865
901
|
}
|
866
902
|
|
867
903
|
void XdsClient::ChannelState::AdsCallState::SubscribeLocked(
|
868
|
-
const std::string& type_url, const
|
869
|
-
auto& state = state_map_[type_url]
|
904
|
+
const std::string& type_url, const XdsApi::ResourceName& resource) {
|
905
|
+
auto& state = state_map_[type_url]
|
906
|
+
.subscribed_resources[resource.authority][resource.id];
|
870
907
|
if (state == nullptr) {
|
871
908
|
state = MakeOrphanable<ResourceState>(
|
872
|
-
type_url,
|
909
|
+
type_url, resource,
|
910
|
+
!chand()->resource_type_version_map_[type_url].empty());
|
873
911
|
SendMessageLocked(type_url);
|
874
912
|
}
|
875
913
|
}
|
876
914
|
|
877
915
|
void XdsClient::ChannelState::AdsCallState::UnsubscribeLocked(
|
878
|
-
const std::string& type_url, const
|
916
|
+
const std::string& type_url, const XdsApi::ResourceName& resource,
|
879
917
|
bool delay_unsubscription) {
|
880
|
-
state_map_[type_url]
|
918
|
+
auto& type_state_map = state_map_[type_url];
|
919
|
+
auto& authority_map = type_state_map.subscribed_resources[resource.authority];
|
920
|
+
authority_map.erase(resource.id);
|
921
|
+
if (authority_map.empty()) {
|
922
|
+
type_state_map.subscribed_resources.erase(resource.authority);
|
923
|
+
}
|
881
924
|
if (!delay_unsubscription) SendMessageLocked(type_url);
|
882
925
|
}
|
883
926
|
|
@@ -907,7 +950,7 @@ XdsApi::ResourceMetadata CreateResourceMetadataAcked(
|
|
907
950
|
void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdateLocked(
|
908
951
|
std::string version, grpc_millis update_time,
|
909
952
|
XdsApi::LdsUpdateMap lds_update_map,
|
910
|
-
const std::set<
|
953
|
+
const std::set<XdsApi::ResourceName>& resource_names_failed) {
|
911
954
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
912
955
|
gpr_log(GPR_INFO,
|
913
956
|
"[xds_client %p] LDS update received containing %" PRIuPTR
|
@@ -917,28 +960,38 @@ void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdateLocked(
|
|
917
960
|
auto& lds_state = state_map_[XdsApi::kLdsTypeUrl];
|
918
961
|
std::set<std::string> rds_resource_names_seen;
|
919
962
|
for (auto& p : lds_update_map) {
|
920
|
-
const
|
963
|
+
const XdsApi::ResourceName& resource = p.first;
|
921
964
|
XdsApi::LdsUpdate& lds_update = p.second.resource;
|
922
|
-
auto& state =
|
965
|
+
auto& state =
|
966
|
+
lds_state.subscribed_resources[resource.authority][resource.id];
|
923
967
|
if (state != nullptr) state->Finish();
|
924
968
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
925
969
|
gpr_log(GPR_INFO, "[xds_client %p] LDS resource %s: %s", xds_client(),
|
926
|
-
|
970
|
+
XdsApi::ConstructFullResourceName(
|
971
|
+
resource.authority, XdsApi::kLdsTypeUrl, resource.id)
|
972
|
+
.c_str(),
|
973
|
+
lds_update.ToString().c_str());
|
927
974
|
}
|
928
975
|
// Record the RDS resource names seen.
|
929
976
|
if (!lds_update.http_connection_manager.route_config_name.empty()) {
|
930
977
|
rds_resource_names_seen.insert(
|
931
978
|
lds_update.http_connection_manager.route_config_name);
|
932
979
|
}
|
980
|
+
ListenerState& listener_state =
|
981
|
+
xds_client()
|
982
|
+
->authority_state_map_[resource.authority]
|
983
|
+
.listener_map[resource.id];
|
933
984
|
// Ignore identical update.
|
934
|
-
ListenerState& listener_state = xds_client()->listener_map_[listener_name];
|
935
985
|
if (listener_state.update.has_value() &&
|
936
986
|
*listener_state.update == lds_update) {
|
937
987
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
938
988
|
gpr_log(GPR_INFO,
|
939
989
|
"[xds_client %p] LDS update for %s identical to current, "
|
940
990
|
"ignoring.",
|
941
|
-
xds_client(),
|
991
|
+
xds_client(),
|
992
|
+
XdsApi::ConstructFullResourceName(
|
993
|
+
resource.authority, XdsApi::kLdsTypeUrl, resource.id)
|
994
|
+
.c_str());
|
942
995
|
}
|
943
996
|
continue;
|
944
997
|
}
|
@@ -954,35 +1007,43 @@ void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdateLocked(
|
|
954
1007
|
// For invalid resources in the update, if they are already in the
|
955
1008
|
// cache, pretend that they are present in the update, so that we
|
956
1009
|
// don't incorrectly consider them deleted below.
|
957
|
-
for (const
|
958
|
-
auto
|
959
|
-
|
960
|
-
|
961
|
-
|
962
|
-
|
963
|
-
if (!
|
1010
|
+
for (const auto& resource : resource_names_failed) {
|
1011
|
+
auto& listener_map =
|
1012
|
+
xds_client()->authority_state_map_[resource.authority].listener_map;
|
1013
|
+
auto it = listener_map.find(resource.id);
|
1014
|
+
if (it != listener_map.end()) {
|
1015
|
+
auto& update = it->second.update;
|
1016
|
+
if (!update.has_value()) continue;
|
1017
|
+
lds_update_map[resource];
|
1018
|
+
if (!update->http_connection_manager.route_config_name.empty()) {
|
964
1019
|
rds_resource_names_seen.insert(
|
965
|
-
|
1020
|
+
update->http_connection_manager.route_config_name);
|
966
1021
|
}
|
967
1022
|
}
|
968
1023
|
}
|
969
1024
|
// For any subscribed resource that is not present in the update,
|
970
1025
|
// remove it from the cache and notify watchers that it does not exist.
|
971
|
-
for (const auto&
|
972
|
-
const std::string&
|
973
|
-
|
974
|
-
|
975
|
-
|
976
|
-
|
977
|
-
|
978
|
-
|
979
|
-
|
980
|
-
|
981
|
-
|
982
|
-
|
983
|
-
|
984
|
-
|
985
|
-
|
1026
|
+
for (const auto& a : lds_state.subscribed_resources) {
|
1027
|
+
const std::string& authority_name = a.first;
|
1028
|
+
for (const auto& p : a.second) {
|
1029
|
+
const std::string& listener_name = p.first;
|
1030
|
+
if (lds_update_map.find({authority_name, listener_name}) ==
|
1031
|
+
lds_update_map.end()) {
|
1032
|
+
ListenerState& listener_state =
|
1033
|
+
xds_client()
|
1034
|
+
->authority_state_map_[authority_name]
|
1035
|
+
.listener_map[listener_name];
|
1036
|
+
// If the resource was newly requested but has not yet been received,
|
1037
|
+
// we don't want to generate an error for the watchers, because this LDS
|
1038
|
+
// response may be in reaction to an earlier request that did not yet
|
1039
|
+
// request the new resource, so its absence from the response does not
|
1040
|
+
// necessarily indicate that the resource does not exist.
|
1041
|
+
// For that case, we rely on the request timeout instead.
|
1042
|
+
if (!listener_state.update.has_value()) continue;
|
1043
|
+
listener_state.update.reset();
|
1044
|
+
for (const auto& p : listener_state.watchers) {
|
1045
|
+
p.first->OnResourceDoesNotExist();
|
1046
|
+
}
|
986
1047
|
}
|
987
1048
|
}
|
988
1049
|
}
|
@@ -990,15 +1051,21 @@ void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdateLocked(
|
|
990
1051
|
// resources, remove it from the cache and notify watchers that it
|
991
1052
|
// does not exist.
|
992
1053
|
auto& rds_state = state_map_[XdsApi::kRdsTypeUrl];
|
993
|
-
for (const auto&
|
994
|
-
const std::string&
|
995
|
-
|
996
|
-
|
997
|
-
|
998
|
-
|
999
|
-
|
1000
|
-
|
1001
|
-
|
1054
|
+
for (const auto& a : rds_state.subscribed_resources) {
|
1055
|
+
const std::string& authority_name = a.first;
|
1056
|
+
for (const auto& p : a.second) {
|
1057
|
+
const std::string& listener_name = p.first;
|
1058
|
+
if (rds_resource_names_seen.find(XdsApi::ConstructFullResourceName(
|
1059
|
+
authority_name, XdsApi::kRdsTypeUrl, listener_name)) ==
|
1060
|
+
rds_resource_names_seen.end()) {
|
1061
|
+
RouteConfigState& route_config_state =
|
1062
|
+
xds_client()
|
1063
|
+
->authority_state_map_[authority_name]
|
1064
|
+
.route_config_map[listener_name];
|
1065
|
+
route_config_state.update.reset();
|
1066
|
+
for (const auto& p : route_config_state.watchers) {
|
1067
|
+
p.first->OnResourceDoesNotExist();
|
1068
|
+
}
|
1002
1069
|
}
|
1003
1070
|
}
|
1004
1071
|
}
|
@@ -1015,16 +1082,19 @@ void XdsClient::ChannelState::AdsCallState::AcceptRdsUpdateLocked(
|
|
1015
1082
|
}
|
1016
1083
|
auto& rds_state = state_map_[XdsApi::kRdsTypeUrl];
|
1017
1084
|
for (auto& p : rds_update_map) {
|
1018
|
-
const
|
1085
|
+
const XdsApi::ResourceName& resource = p.first;
|
1019
1086
|
XdsApi::RdsUpdate& rds_update = p.second.resource;
|
1020
|
-
auto& state =
|
1087
|
+
auto& state =
|
1088
|
+
rds_state.subscribed_resources[resource.authority][resource.id];
|
1021
1089
|
if (state != nullptr) state->Finish();
|
1022
1090
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1023
1091
|
gpr_log(GPR_INFO, "[xds_client %p] RDS resource:\n%s", xds_client(),
|
1024
1092
|
rds_update.ToString().c_str());
|
1025
1093
|
}
|
1026
1094
|
RouteConfigState& route_config_state =
|
1027
|
-
xds_client()
|
1095
|
+
xds_client()
|
1096
|
+
->authority_state_map_[resource.authority]
|
1097
|
+
.route_config_map[resource.id];
|
1028
1098
|
// Ignore identical update.
|
1029
1099
|
if (route_config_state.update.has_value() &&
|
1030
1100
|
*route_config_state.update == rds_update) {
|
@@ -1049,7 +1119,7 @@ void XdsClient::ChannelState::AdsCallState::AcceptRdsUpdateLocked(
|
|
1049
1119
|
void XdsClient::ChannelState::AdsCallState::AcceptCdsUpdateLocked(
|
1050
1120
|
std::string version, grpc_millis update_time,
|
1051
1121
|
XdsApi::CdsUpdateMap cds_update_map,
|
1052
|
-
const std::set<
|
1122
|
+
const std::set<XdsApi::ResourceName>& resource_names_failed) {
|
1053
1123
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1054
1124
|
gpr_log(GPR_INFO,
|
1055
1125
|
"[xds_client %p] CDS update received containing %" PRIuPTR
|
@@ -1059,20 +1129,28 @@ void XdsClient::ChannelState::AdsCallState::AcceptCdsUpdateLocked(
|
|
1059
1129
|
auto& cds_state = state_map_[XdsApi::kCdsTypeUrl];
|
1060
1130
|
std::set<std::string> eds_resource_names_seen;
|
1061
1131
|
for (auto& p : cds_update_map) {
|
1062
|
-
const
|
1132
|
+
const XdsApi::ResourceName& resource = p.first;
|
1063
1133
|
XdsApi::CdsUpdate& cds_update = p.second.resource;
|
1064
|
-
auto& state =
|
1134
|
+
auto& state =
|
1135
|
+
cds_state.subscribed_resources[resource.authority][resource.id];
|
1065
1136
|
if (state != nullptr) state->Finish();
|
1066
1137
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1067
1138
|
gpr_log(GPR_INFO, "[xds_client %p] cluster=%s: %s", xds_client(),
|
1068
|
-
|
1139
|
+
XdsApi::ConstructFullResourceName(
|
1140
|
+
resource.authority, XdsApi::kCdsTypeUrl, resource.id)
|
1141
|
+
.c_str(),
|
1142
|
+
cds_update.ToString().c_str());
|
1069
1143
|
}
|
1070
1144
|
// Record the EDS resource names seen.
|
1071
|
-
eds_resource_names_seen.insert(
|
1072
|
-
|
1073
|
-
|
1145
|
+
eds_resource_names_seen.insert(
|
1146
|
+
cds_update.eds_service_name.empty()
|
1147
|
+
? XdsApi::ConstructFullResourceName(
|
1148
|
+
resource.authority, XdsApi::kCdsTypeUrl, resource.id)
|
1149
|
+
: cds_update.eds_service_name);
|
1150
|
+
ClusterState& cluster_state = xds_client()
|
1151
|
+
->authority_state_map_[resource.authority]
|
1152
|
+
.cluster_map[resource.id];
|
1074
1153
|
// Ignore identical update.
|
1075
|
-
ClusterState& cluster_state = xds_client()->cluster_map_[cluster_name];
|
1076
1154
|
if (cluster_state.update.has_value() &&
|
1077
1155
|
*cluster_state.update == cds_update) {
|
1078
1156
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
@@ -1094,33 +1172,43 @@ void XdsClient::ChannelState::AdsCallState::AcceptCdsUpdateLocked(
|
|
1094
1172
|
// For invalid resources in the update, if they are already in the
|
1095
1173
|
// cache, pretend that they are present in the update, so that we
|
1096
1174
|
// don't incorrectly consider them deleted below.
|
1097
|
-
for (const
|
1098
|
-
auto
|
1099
|
-
|
1100
|
-
|
1101
|
-
|
1102
|
-
|
1103
|
-
|
1104
|
-
|
1105
|
-
|
1175
|
+
for (const auto& resource : resource_names_failed) {
|
1176
|
+
auto& cluster_map =
|
1177
|
+
xds_client()->authority_state_map_[resource.authority].cluster_map;
|
1178
|
+
auto it = cluster_map.find(resource.id);
|
1179
|
+
if (it != cluster_map.end()) {
|
1180
|
+
auto& update = it->second.update;
|
1181
|
+
if (!update.has_value()) continue;
|
1182
|
+
cds_update_map[resource];
|
1183
|
+
eds_resource_names_seen.insert(
|
1184
|
+
update->eds_service_name.empty()
|
1185
|
+
? XdsApi::ConstructFullResourceName(
|
1186
|
+
resource.authority, XdsApi::kCdsTypeUrl, resource.id)
|
1187
|
+
: update->eds_service_name);
|
1106
1188
|
}
|
1107
1189
|
}
|
1108
1190
|
// For any subscribed resource that is not present in the update,
|
1109
1191
|
// remove it from the cache and notify watchers that it does not exist.
|
1110
|
-
for (const auto&
|
1111
|
-
const std::string&
|
1112
|
-
|
1113
|
-
|
1114
|
-
|
1115
|
-
|
1116
|
-
|
1117
|
-
|
1118
|
-
|
1119
|
-
|
1120
|
-
|
1121
|
-
|
1122
|
-
|
1123
|
-
|
1192
|
+
for (const auto& a : cds_state.subscribed_resources) {
|
1193
|
+
const std::string& authority = a.first;
|
1194
|
+
for (const auto& p : a.second) {
|
1195
|
+
const std::string& cluster_name = p.first;
|
1196
|
+
if (cds_update_map.find({authority, cluster_name}) ==
|
1197
|
+
cds_update_map.end()) {
|
1198
|
+
ClusterState& cluster_state = xds_client()
|
1199
|
+
->authority_state_map_[authority]
|
1200
|
+
.cluster_map[cluster_name];
|
1201
|
+
// If the resource was newly requested but has not yet been received,
|
1202
|
+
// we don't want to generate an error for the watchers, because this CDS
|
1203
|
+
// response may be in reaction to an earlier request that did not yet
|
1204
|
+
// request the new resource, so its absence from the response does not
|
1205
|
+
// necessarily indicate that the resource does not exist.
|
1206
|
+
// For that case, we rely on the request timeout instead.
|
1207
|
+
if (!cluster_state.update.has_value()) continue;
|
1208
|
+
cluster_state.update.reset();
|
1209
|
+
for (const auto& p : cluster_state.watchers) {
|
1210
|
+
p.first->OnResourceDoesNotExist();
|
1211
|
+
}
|
1124
1212
|
}
|
1125
1213
|
}
|
1126
1214
|
}
|
@@ -1128,15 +1216,20 @@ void XdsClient::ChannelState::AdsCallState::AcceptCdsUpdateLocked(
|
|
1128
1216
|
// resources, remove it from the cache and notify watchers that it
|
1129
1217
|
// does not exist.
|
1130
1218
|
auto& eds_state = state_map_[XdsApi::kEdsTypeUrl];
|
1131
|
-
for (const auto&
|
1132
|
-
const std::string&
|
1133
|
-
|
1134
|
-
|
1135
|
-
|
1136
|
-
|
1137
|
-
|
1138
|
-
|
1139
|
-
|
1219
|
+
for (const auto& a : eds_state.subscribed_resources) {
|
1220
|
+
const std::string& authority = a.first;
|
1221
|
+
for (const auto& p : a.second) {
|
1222
|
+
const std::string& eds_resource_name = p.first;
|
1223
|
+
if (eds_resource_names_seen.find(XdsApi::ConstructFullResourceName(
|
1224
|
+
authority, XdsApi::kEdsTypeUrl, eds_resource_name)) ==
|
1225
|
+
eds_resource_names_seen.end()) {
|
1226
|
+
EndpointState& endpoint_state = xds_client()
|
1227
|
+
->authority_state_map_[authority]
|
1228
|
+
.endpoint_map[eds_resource_name];
|
1229
|
+
endpoint_state.update.reset();
|
1230
|
+
for (const auto& p : endpoint_state.watchers) {
|
1231
|
+
p.first->OnResourceDoesNotExist();
|
1232
|
+
}
|
1140
1233
|
}
|
1141
1234
|
}
|
1142
1235
|
}
|
@@ -1153,16 +1246,22 @@ void XdsClient::ChannelState::AdsCallState::AcceptEdsUpdateLocked(
|
|
1153
1246
|
}
|
1154
1247
|
auto& eds_state = state_map_[XdsApi::kEdsTypeUrl];
|
1155
1248
|
for (auto& p : eds_update_map) {
|
1156
|
-
const
|
1249
|
+
const XdsApi::ResourceName& resource = p.first;
|
1157
1250
|
XdsApi::EdsUpdate& eds_update = p.second.resource;
|
1158
|
-
auto& state =
|
1251
|
+
auto& state =
|
1252
|
+
eds_state.subscribed_resources[resource.authority][resource.id];
|
1159
1253
|
if (state != nullptr) state->Finish();
|
1160
1254
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1161
1255
|
gpr_log(GPR_INFO, "[xds_client %p] EDS resource %s: %s", xds_client(),
|
1162
|
-
|
1256
|
+
XdsApi::ConstructFullResourceName(
|
1257
|
+
resource.authority, XdsApi::kCdsTypeUrl, resource.id)
|
1258
|
+
.c_str(),
|
1259
|
+
eds_update.ToString().c_str());
|
1163
1260
|
}
|
1164
1261
|
EndpointState& endpoint_state =
|
1165
|
-
xds_client()
|
1262
|
+
xds_client()
|
1263
|
+
->authority_state_map_[resource.authority]
|
1264
|
+
.endpoint_map[resource.id];
|
1166
1265
|
// Ignore identical update.
|
1167
1266
|
if (endpoint_state.update.has_value() &&
|
1168
1267
|
*endpoint_state.update == eds_update) {
|
@@ -1200,9 +1299,22 @@ void UpdateResourceMetadataNacked(const std::string& version,
|
|
1200
1299
|
} // namespace
|
1201
1300
|
|
1202
1301
|
template <typename StateMap>
|
1203
|
-
void XdsClient::ChannelState::AdsCallState::
|
1204
|
-
|
1302
|
+
void XdsClient::ChannelState::AdsCallState::RejectAdsUpdateHelperLocked(
|
1303
|
+
const std::string& resource_name, grpc_millis update_time,
|
1304
|
+
const XdsApi::AdsParseResult& result, const std::string& error_details,
|
1205
1305
|
StateMap* state_map) {
|
1306
|
+
auto it = state_map->find(resource_name);
|
1307
|
+
if (it == state_map->end()) return;
|
1308
|
+
auto& state = it->second;
|
1309
|
+
for (const auto& p : state.watchers) {
|
1310
|
+
p.first->OnError(GRPC_ERROR_REF(result.parse_error));
|
1311
|
+
}
|
1312
|
+
UpdateResourceMetadataNacked(result.version, error_details, update_time,
|
1313
|
+
&state.meta);
|
1314
|
+
}
|
1315
|
+
|
1316
|
+
void XdsClient::ChannelState::AdsCallState::RejectAdsUpdateLocked(
|
1317
|
+
grpc_millis update_time, const XdsApi::AdsParseResult& result) {
|
1206
1318
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1207
1319
|
gpr_log(GPR_INFO,
|
1208
1320
|
"[xds_client %p] %s update NACKed containing %" PRIuPTR
|
@@ -1211,17 +1323,26 @@ void XdsClient::ChannelState::AdsCallState::RejectAdsUpdateLocked(
|
|
1211
1323
|
result.resource_names_failed.size());
|
1212
1324
|
}
|
1213
1325
|
std::string details = grpc_error_std_string(result.parse_error);
|
1214
|
-
for (auto&
|
1215
|
-
auto
|
1216
|
-
|
1217
|
-
|
1218
|
-
|
1219
|
-
|
1220
|
-
|
1326
|
+
for (auto& resource : result.resource_names_failed) {
|
1327
|
+
auto authority_it =
|
1328
|
+
xds_client()->authority_state_map_.find(resource.authority);
|
1329
|
+
if (authority_it == xds_client()->authority_state_map_.end()) continue;
|
1330
|
+
AuthorityState& authority_state = authority_it->second;
|
1331
|
+
if (result.type_url == XdsApi::kLdsTypeUrl) {
|
1332
|
+
RejectAdsUpdateHelperLocked(resource.id, update_time, result, details,
|
1333
|
+
&authority_state.listener_map);
|
1334
|
+
} else if (result.type_url == XdsApi::kRdsTypeUrl) {
|
1335
|
+
RejectAdsUpdateHelperLocked(resource.id, update_time, result, details,
|
1336
|
+
&authority_state.route_config_map);
|
1337
|
+
} else if (result.type_url == XdsApi::kCdsTypeUrl) {
|
1338
|
+
RejectAdsUpdateHelperLocked(resource.id, update_time, result, details,
|
1339
|
+
&authority_state.cluster_map);
|
1340
|
+
} else if (result.type_url == XdsApi::kEdsTypeUrl) {
|
1341
|
+
RejectAdsUpdateHelperLocked(resource.id, update_time, result, details,
|
1342
|
+
&authority_state.endpoint_map);
|
1343
|
+
} else {
|
1344
|
+
GPR_ASSERT(0);
|
1221
1345
|
}
|
1222
|
-
// Update resource metadata for CSDS.
|
1223
|
-
UpdateResourceMetadataNacked(result.version, details, update_time,
|
1224
|
-
&state.meta);
|
1225
1346
|
}
|
1226
1347
|
}
|
1227
1348
|
|
@@ -1314,18 +1435,7 @@ bool XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() {
|
|
1314
1435
|
GRPC_STATUS_UNAVAILABLE);
|
1315
1436
|
GRPC_ERROR_UNREF(state.error);
|
1316
1437
|
state.error = result.parse_error;
|
1317
|
-
|
1318
|
-
RejectAdsUpdateLocked(update_time, result,
|
1319
|
-
&xds_client()->listener_map_);
|
1320
|
-
} else if (result.type_url == XdsApi::kRdsTypeUrl) {
|
1321
|
-
RejectAdsUpdateLocked(update_time, result,
|
1322
|
-
&xds_client()->route_config_map_);
|
1323
|
-
} else if (result.type_url == XdsApi::kCdsTypeUrl) {
|
1324
|
-
RejectAdsUpdateLocked(update_time, result, &xds_client()->cluster_map_);
|
1325
|
-
} else if (result.type_url == XdsApi::kEdsTypeUrl) {
|
1326
|
-
RejectAdsUpdateLocked(update_time, result,
|
1327
|
-
&xds_client()->endpoint_map_);
|
1328
|
-
}
|
1438
|
+
RejectAdsUpdateLocked(update_time, result);
|
1329
1439
|
}
|
1330
1440
|
// Process any valid resources.
|
1331
1441
|
bool have_valid_resources = false;
|
@@ -1350,8 +1460,7 @@ bool XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() {
|
|
1350
1460
|
}
|
1351
1461
|
if (have_valid_resources) {
|
1352
1462
|
seen_response_ = true;
|
1353
|
-
|
1354
|
-
std::move(result.version);
|
1463
|
+
chand()->resource_type_version_map_[result.type_url] = result.version;
|
1355
1464
|
// Start load reporting if needed.
|
1356
1465
|
auto& lrs_call = chand()->lrs_calld_;
|
1357
1466
|
if (lrs_call != nullptr) {
|
@@ -1417,19 +1526,23 @@ bool XdsClient::ChannelState::AdsCallState::IsCurrentCallOnChannel() const {
|
|
1417
1526
|
return this == chand()->ads_calld_->calld();
|
1418
1527
|
}
|
1419
1528
|
|
1420
|
-
std::set<absl::string_view
|
1529
|
+
std::map<absl::string_view /*authority*/, std::set<absl::string_view /*name*/>>
|
1421
1530
|
XdsClient::ChannelState::AdsCallState::ResourceNamesForRequest(
|
1422
1531
|
const std::string& type_url) {
|
1423
|
-
std::
|
1532
|
+
std::map<absl::string_view /*authority*/,
|
1533
|
+
std::set<absl::string_view /*name*/>>
|
1534
|
+
resource_map;
|
1424
1535
|
auto it = state_map_.find(type_url);
|
1425
1536
|
if (it != state_map_.end()) {
|
1426
|
-
for (auto&
|
1427
|
-
|
1428
|
-
|
1429
|
-
|
1537
|
+
for (auto& a : it->second.subscribed_resources) {
|
1538
|
+
for (auto& p : a.second) {
|
1539
|
+
resource_map[a.first].insert(p.first);
|
1540
|
+
OrphanablePtr<ResourceState>& state = p.second;
|
1541
|
+
state->Start(Ref(DEBUG_LOCATION, "ResourceState"));
|
1542
|
+
}
|
1430
1543
|
}
|
1431
1544
|
}
|
1432
|
-
return
|
1545
|
+
return resource_map;
|
1433
1546
|
}
|
1434
1547
|
|
1435
1548
|
//
|
@@ -1878,12 +1991,10 @@ grpc_millis GetRequestTimeout(const grpc_channel_args* args) {
|
|
1878
1991
|
}
|
1879
1992
|
|
1880
1993
|
grpc_channel_args* ModifyChannelArgs(const grpc_channel_args* args) {
|
1881
|
-
absl::InlinedVector<grpc_arg,
|
1994
|
+
absl::InlinedVector<grpc_arg, 1> args_to_add = {
|
1882
1995
|
grpc_channel_arg_integer_create(
|
1883
1996
|
const_cast<char*>(GRPC_ARG_KEEPALIVE_TIME_MS),
|
1884
1997
|
5 * 60 * GPR_MS_PER_SEC),
|
1885
|
-
grpc_channel_arg_integer_create(
|
1886
|
-
const_cast<char*>(GRPC_ARG_CHANNELZ_IS_INTERNAL_CHANNEL), 1),
|
1887
1998
|
};
|
1888
1999
|
return grpc_channel_args_copy_and_add(args, args_to_add.data(),
|
1889
2000
|
args_to_add.size());
|
@@ -1907,9 +2018,9 @@ XdsClient::XdsClient(std::unique_ptr<XdsBootstrap> bootstrap,
|
|
1907
2018
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1908
2019
|
gpr_log(GPR_INFO, "[xds_client %p] creating xds client", this);
|
1909
2020
|
}
|
1910
|
-
//
|
1911
|
-
|
1912
|
-
|
2021
|
+
// Calling grpc_init to ensure gRPC does not shut down until the XdsClient is
|
2022
|
+
// destroyed.
|
2023
|
+
grpc_init();
|
1913
2024
|
}
|
1914
2025
|
|
1915
2026
|
XdsClient::~XdsClient() {
|
@@ -1918,26 +2029,9 @@ XdsClient::~XdsClient() {
|
|
1918
2029
|
}
|
1919
2030
|
grpc_channel_args_destroy(args_);
|
1920
2031
|
grpc_pollset_set_destroy(interested_parties_);
|
1921
|
-
|
1922
|
-
|
1923
|
-
|
1924
|
-
channelz::ChannelNode* parent_channelz_node) {
|
1925
|
-
MutexLock lock(&mu_);
|
1926
|
-
channelz::ChannelNode* xds_channelz_node =
|
1927
|
-
grpc_channel_get_channelz_node(chand_->channel());
|
1928
|
-
if (xds_channelz_node != nullptr) {
|
1929
|
-
parent_channelz_node->AddChildChannel(xds_channelz_node->uuid());
|
1930
|
-
}
|
1931
|
-
}
|
1932
|
-
|
1933
|
-
void XdsClient::RemoveChannelzLinkage(
|
1934
|
-
channelz::ChannelNode* parent_channelz_node) {
|
1935
|
-
MutexLock lock(&mu_);
|
1936
|
-
channelz::ChannelNode* xds_channelz_node =
|
1937
|
-
grpc_channel_get_channelz_node(chand_->channel());
|
1938
|
-
if (xds_channelz_node != nullptr) {
|
1939
|
-
parent_channelz_node->RemoveChildChannel(xds_channelz_node->uuid());
|
1940
|
-
}
|
2032
|
+
// Calling grpc_shutdown to ensure gRPC does not shut down until the XdsClient
|
2033
|
+
// is destroyed.
|
2034
|
+
grpc_shutdown();
|
1941
2035
|
}
|
1942
2036
|
|
1943
2037
|
void XdsClient::Orphan() {
|
@@ -1951,28 +2045,56 @@ void XdsClient::Orphan() {
|
|
1951
2045
|
{
|
1952
2046
|
MutexLock lock(&mu_);
|
1953
2047
|
shutting_down_ = true;
|
1954
|
-
// Orphan ChannelState object.
|
1955
|
-
chand_.reset();
|
1956
2048
|
// We do not clear cluster_map_ and endpoint_map_ if the xds client was
|
1957
2049
|
// created by the XdsResolver because the maps contain refs for watchers
|
1958
2050
|
// which in turn hold refs to the loadbalancing policies. At this point, it
|
1959
2051
|
// is possible for ADS calls to be in progress. Unreffing the loadbalancing
|
1960
2052
|
// policies before those calls are done would lead to issues such as
|
1961
2053
|
// https://github.com/grpc/grpc/issues/20928.
|
1962
|
-
|
1963
|
-
|
1964
|
-
|
2054
|
+
for (auto& a : authority_state_map_) {
|
2055
|
+
a.second.channel_state.reset();
|
2056
|
+
if (!a.second.listener_map.empty()) {
|
2057
|
+
a.second.cluster_map.clear();
|
2058
|
+
a.second.endpoint_map.clear();
|
2059
|
+
}
|
1965
2060
|
}
|
2061
|
+
// We clear these invalid resource watchers as cancel never came.
|
2062
|
+
invalid_listener_watchers_.clear();
|
2063
|
+
invalid_route_config_watchers_.clear();
|
2064
|
+
invalid_cluster_watchers_.clear();
|
2065
|
+
invalid_endpoint_watchers_.clear();
|
1966
2066
|
}
|
1967
2067
|
}
|
1968
2068
|
|
2069
|
+
RefCountedPtr<XdsClient::ChannelState> XdsClient::GetOrCreateChannelStateLocked(
|
2070
|
+
const XdsBootstrap::XdsServer& server) {
|
2071
|
+
auto it = xds_server_channel_map_.find(server);
|
2072
|
+
if (it != xds_server_channel_map_.end()) {
|
2073
|
+
return it->second->Ref(DEBUG_LOCATION, "Authority");
|
2074
|
+
}
|
2075
|
+
// Channel not found, so create a new one.
|
2076
|
+
auto channel_state = MakeRefCounted<ChannelState>(
|
2077
|
+
WeakRef(DEBUG_LOCATION, "ChannelState"), server);
|
2078
|
+
xds_server_channel_map_[server] = channel_state.get();
|
2079
|
+
return channel_state;
|
2080
|
+
}
|
2081
|
+
|
1969
2082
|
void XdsClient::WatchListenerData(
|
1970
2083
|
absl::string_view listener_name,
|
1971
2084
|
std::unique_ptr<ListenerWatcherInterface> watcher) {
|
1972
2085
|
std::string listener_name_str = std::string(listener_name);
|
1973
2086
|
MutexLock lock(&mu_);
|
1974
|
-
ListenerState& listener_state = listener_map_[listener_name_str];
|
1975
2087
|
ListenerWatcherInterface* w = watcher.get();
|
2088
|
+
auto resource = XdsApi::ParseResourceName(listener_name, XdsApi::IsLds);
|
2089
|
+
if (!resource.ok()) {
|
2090
|
+
invalid_listener_watchers_[w] = std::move(watcher);
|
2091
|
+
grpc_error_handle error = GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrFormat(
|
2092
|
+
"Unable to parse resource name for listener %s", listener_name));
|
2093
|
+
w->OnError(GRPC_ERROR_REF(error));
|
2094
|
+
return;
|
2095
|
+
}
|
2096
|
+
AuthorityState& authority_state = authority_state_map_[resource->authority];
|
2097
|
+
ListenerState& listener_state = authority_state.listener_map[resource->id];
|
1976
2098
|
listener_state.watchers[w] = std::move(watcher);
|
1977
2099
|
// If we've already received an LDS update, notify the new watcher
|
1978
2100
|
// immediately.
|
@@ -1983,7 +2105,13 @@ void XdsClient::WatchListenerData(
|
|
1983
2105
|
}
|
1984
2106
|
w->OnListenerChanged(*listener_state.update);
|
1985
2107
|
}
|
1986
|
-
|
2108
|
+
// If the authority doesn't yet have a channel, set it, creating it if needed.
|
2109
|
+
if (authority_state.channel_state == nullptr) {
|
2110
|
+
authority_state.channel_state =
|
2111
|
+
GetOrCreateChannelStateLocked(bootstrap_->server());
|
2112
|
+
}
|
2113
|
+
authority_state.channel_state->SubscribeLocked(XdsApi::kLdsTypeUrl,
|
2114
|
+
*resource);
|
1987
2115
|
}
|
1988
2116
|
|
1989
2117
|
void XdsClient::CancelListenerDataWatch(absl::string_view listener_name,
|
@@ -1991,16 +2119,22 @@ void XdsClient::CancelListenerDataWatch(absl::string_view listener_name,
|
|
1991
2119
|
bool delay_unsubscription) {
|
1992
2120
|
MutexLock lock(&mu_);
|
1993
2121
|
if (shutting_down_) return;
|
1994
|
-
|
1995
|
-
|
2122
|
+
auto resource = XdsApi::ParseResourceName(listener_name, XdsApi::IsLds);
|
2123
|
+
if (!resource.ok()) return;
|
2124
|
+
auto& authority_state = authority_state_map_[resource->authority];
|
2125
|
+
ListenerState& listener_state = authority_state.listener_map[resource->id];
|
1996
2126
|
auto it = listener_state.watchers.find(watcher);
|
1997
|
-
if (it
|
1998
|
-
|
1999
|
-
|
2000
|
-
|
2001
|
-
|
2002
|
-
|
2003
|
-
|
2127
|
+
if (it == listener_state.watchers.end()) {
|
2128
|
+
invalid_listener_watchers_.erase(watcher);
|
2129
|
+
return;
|
2130
|
+
}
|
2131
|
+
listener_state.watchers.erase(it);
|
2132
|
+
if (!listener_state.watchers.empty()) return;
|
2133
|
+
authority_state.listener_map.erase(resource->id);
|
2134
|
+
xds_server_channel_map_[bootstrap_->server()]->UnsubscribeLocked(
|
2135
|
+
XdsApi::kLdsTypeUrl, *resource, delay_unsubscription);
|
2136
|
+
if (!authority_state.HasSubscribedResources()) {
|
2137
|
+
authority_state.channel_state.reset();
|
2004
2138
|
}
|
2005
2139
|
}
|
2006
2140
|
|
@@ -2009,9 +2143,19 @@ void XdsClient::WatchRouteConfigData(
|
|
2009
2143
|
std::unique_ptr<RouteConfigWatcherInterface> watcher) {
|
2010
2144
|
std::string route_config_name_str = std::string(route_config_name);
|
2011
2145
|
MutexLock lock(&mu_);
|
2012
|
-
RouteConfigState& route_config_state =
|
2013
|
-
route_config_map_[route_config_name_str];
|
2014
2146
|
RouteConfigWatcherInterface* w = watcher.get();
|
2147
|
+
auto resource = XdsApi::ParseResourceName(route_config_name, XdsApi::IsRds);
|
2148
|
+
if (!resource.ok()) {
|
2149
|
+
invalid_route_config_watchers_[w] = std::move(watcher);
|
2150
|
+
grpc_error_handle error = GRPC_ERROR_CREATE_FROM_CPP_STRING(
|
2151
|
+
absl::StrFormat("Unable to parse resource name for route config %s",
|
2152
|
+
route_config_name));
|
2153
|
+
w->OnError(GRPC_ERROR_REF(error));
|
2154
|
+
return;
|
2155
|
+
}
|
2156
|
+
auto& authority_state = authority_state_map_[resource->authority];
|
2157
|
+
RouteConfigState& route_config_state =
|
2158
|
+
authority_state.route_config_map[resource->id];
|
2015
2159
|
route_config_state.watchers[w] = std::move(watcher);
|
2016
2160
|
// If we've already received an RDS update, notify the new watcher
|
2017
2161
|
// immediately.
|
@@ -2023,7 +2167,13 @@ void XdsClient::WatchRouteConfigData(
|
|
2023
2167
|
}
|
2024
2168
|
w->OnRouteConfigChanged(*route_config_state.update);
|
2025
2169
|
}
|
2026
|
-
|
2170
|
+
// If the authority doesn't yet have a channel, set it, creating it if needed.
|
2171
|
+
if (authority_state.channel_state == nullptr) {
|
2172
|
+
authority_state.channel_state =
|
2173
|
+
GetOrCreateChannelStateLocked(bootstrap_->server());
|
2174
|
+
}
|
2175
|
+
authority_state.channel_state->SubscribeLocked(XdsApi::kRdsTypeUrl,
|
2176
|
+
*resource);
|
2027
2177
|
}
|
2028
2178
|
|
2029
2179
|
void XdsClient::CancelRouteConfigDataWatch(absl::string_view route_config_name,
|
@@ -2031,17 +2181,23 @@ void XdsClient::CancelRouteConfigDataWatch(absl::string_view route_config_name,
|
|
2031
2181
|
bool delay_unsubscription) {
|
2032
2182
|
MutexLock lock(&mu_);
|
2033
2183
|
if (shutting_down_) return;
|
2034
|
-
|
2184
|
+
auto resource = XdsApi::ParseResourceName(route_config_name, XdsApi::IsRds);
|
2185
|
+
if (!resource.ok()) return;
|
2186
|
+
auto& authority_state = authority_state_map_[resource->authority];
|
2035
2187
|
RouteConfigState& route_config_state =
|
2036
|
-
|
2188
|
+
authority_state.route_config_map[resource->id];
|
2037
2189
|
auto it = route_config_state.watchers.find(watcher);
|
2038
|
-
if (it
|
2039
|
-
|
2040
|
-
|
2041
|
-
|
2042
|
-
|
2043
|
-
|
2044
|
-
|
2190
|
+
if (it == route_config_state.watchers.end()) {
|
2191
|
+
invalid_route_config_watchers_.erase(watcher);
|
2192
|
+
return;
|
2193
|
+
}
|
2194
|
+
route_config_state.watchers.erase(it);
|
2195
|
+
if (!route_config_state.watchers.empty()) return;
|
2196
|
+
authority_state.route_config_map.erase(resource->id);
|
2197
|
+
xds_server_channel_map_[bootstrap_->server()]->UnsubscribeLocked(
|
2198
|
+
XdsApi::kRdsTypeUrl, *resource, delay_unsubscription);
|
2199
|
+
if (!authority_state.HasSubscribedResources()) {
|
2200
|
+
authority_state.channel_state.reset();
|
2045
2201
|
}
|
2046
2202
|
}
|
2047
2203
|
|
@@ -2050,8 +2206,17 @@ void XdsClient::WatchClusterData(
|
|
2050
2206
|
std::unique_ptr<ClusterWatcherInterface> watcher) {
|
2051
2207
|
std::string cluster_name_str = std::string(cluster_name);
|
2052
2208
|
MutexLock lock(&mu_);
|
2053
|
-
ClusterState& cluster_state = cluster_map_[cluster_name_str];
|
2054
2209
|
ClusterWatcherInterface* w = watcher.get();
|
2210
|
+
auto resource = XdsApi::ParseResourceName(cluster_name, XdsApi::IsCds);
|
2211
|
+
if (!resource.ok()) {
|
2212
|
+
invalid_cluster_watchers_[w] = std::move(watcher);
|
2213
|
+
grpc_error_handle error = GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrFormat(
|
2214
|
+
"Unable to parse resource name for cluster %s", cluster_name));
|
2215
|
+
w->OnError(GRPC_ERROR_REF(error));
|
2216
|
+
return;
|
2217
|
+
}
|
2218
|
+
auto& authority_state = authority_state_map_[resource->authority];
|
2219
|
+
ClusterState& cluster_state = authority_state.cluster_map[resource->id];
|
2055
2220
|
cluster_state.watchers[w] = std::move(watcher);
|
2056
2221
|
// If we've already received a CDS update, notify the new watcher
|
2057
2222
|
// immediately.
|
@@ -2062,7 +2227,13 @@ void XdsClient::WatchClusterData(
|
|
2062
2227
|
}
|
2063
2228
|
w->OnClusterChanged(cluster_state.update.value());
|
2064
2229
|
}
|
2065
|
-
|
2230
|
+
// If the authority doesn't yet have a channel, set it, creating it if needed.
|
2231
|
+
if (authority_state.channel_state == nullptr) {
|
2232
|
+
authority_state.channel_state =
|
2233
|
+
GetOrCreateChannelStateLocked(bootstrap_->server());
|
2234
|
+
}
|
2235
|
+
authority_state.channel_state->SubscribeLocked(XdsApi::kCdsTypeUrl,
|
2236
|
+
*resource);
|
2066
2237
|
}
|
2067
2238
|
|
2068
2239
|
void XdsClient::CancelClusterDataWatch(absl::string_view cluster_name,
|
@@ -2070,16 +2241,22 @@ void XdsClient::CancelClusterDataWatch(absl::string_view cluster_name,
|
|
2070
2241
|
bool delay_unsubscription) {
|
2071
2242
|
MutexLock lock(&mu_);
|
2072
2243
|
if (shutting_down_) return;
|
2073
|
-
|
2074
|
-
|
2244
|
+
auto resource = XdsApi::ParseResourceName(cluster_name, XdsApi::IsCds);
|
2245
|
+
if (!resource.ok()) return;
|
2246
|
+
auto& authority_state = authority_state_map_[resource->authority];
|
2247
|
+
ClusterState& cluster_state = authority_state.cluster_map[resource->id];
|
2075
2248
|
auto it = cluster_state.watchers.find(watcher);
|
2076
|
-
if (it
|
2077
|
-
|
2078
|
-
|
2079
|
-
|
2080
|
-
|
2081
|
-
|
2082
|
-
|
2249
|
+
if (it == cluster_state.watchers.end()) {
|
2250
|
+
invalid_cluster_watchers_.erase(watcher);
|
2251
|
+
return;
|
2252
|
+
}
|
2253
|
+
cluster_state.watchers.erase(it);
|
2254
|
+
if (!cluster_state.watchers.empty()) return;
|
2255
|
+
authority_state.cluster_map.erase(resource->id);
|
2256
|
+
xds_server_channel_map_[bootstrap_->server()]->UnsubscribeLocked(
|
2257
|
+
XdsApi::kCdsTypeUrl, *resource, delay_unsubscription);
|
2258
|
+
if (!authority_state.HasSubscribedResources()) {
|
2259
|
+
authority_state.channel_state.reset();
|
2083
2260
|
}
|
2084
2261
|
}
|
2085
2262
|
|
@@ -2088,8 +2265,18 @@ void XdsClient::WatchEndpointData(
|
|
2088
2265
|
std::unique_ptr<EndpointWatcherInterface> watcher) {
|
2089
2266
|
std::string eds_service_name_str = std::string(eds_service_name);
|
2090
2267
|
MutexLock lock(&mu_);
|
2091
|
-
EndpointState& endpoint_state = endpoint_map_[eds_service_name_str];
|
2092
2268
|
EndpointWatcherInterface* w = watcher.get();
|
2269
|
+
auto resource = XdsApi::ParseResourceName(eds_service_name, XdsApi::IsEds);
|
2270
|
+
if (!resource.ok()) {
|
2271
|
+
invalid_endpoint_watchers_[w] = std::move(watcher);
|
2272
|
+
grpc_error_handle error = GRPC_ERROR_CREATE_FROM_CPP_STRING(
|
2273
|
+
absl::StrFormat("Unable to parse resource name for endpoint service %s",
|
2274
|
+
eds_service_name));
|
2275
|
+
w->OnError(GRPC_ERROR_REF(error));
|
2276
|
+
return;
|
2277
|
+
}
|
2278
|
+
auto& authority_state = authority_state_map_[resource->authority];
|
2279
|
+
EndpointState& endpoint_state = authority_state.endpoint_map[resource->id];
|
2093
2280
|
endpoint_state.watchers[w] = std::move(watcher);
|
2094
2281
|
// If we've already received an EDS update, notify the new watcher
|
2095
2282
|
// immediately.
|
@@ -2100,7 +2287,13 @@ void XdsClient::WatchEndpointData(
|
|
2100
2287
|
}
|
2101
2288
|
w->OnEndpointChanged(endpoint_state.update.value());
|
2102
2289
|
}
|
2103
|
-
|
2290
|
+
// If the authority doesn't yet have a channel, set it, creating it if needed.
|
2291
|
+
if (authority_state.channel_state == nullptr) {
|
2292
|
+
authority_state.channel_state =
|
2293
|
+
GetOrCreateChannelStateLocked(bootstrap_->server());
|
2294
|
+
}
|
2295
|
+
authority_state.channel_state->SubscribeLocked(XdsApi::kEdsTypeUrl,
|
2296
|
+
*resource);
|
2104
2297
|
}
|
2105
2298
|
|
2106
2299
|
void XdsClient::CancelEndpointDataWatch(absl::string_view eds_service_name,
|
@@ -2108,16 +2301,22 @@ void XdsClient::CancelEndpointDataWatch(absl::string_view eds_service_name,
|
|
2108
2301
|
bool delay_unsubscription) {
|
2109
2302
|
MutexLock lock(&mu_);
|
2110
2303
|
if (shutting_down_) return;
|
2111
|
-
|
2112
|
-
|
2304
|
+
auto resource = XdsApi::ParseResourceName(eds_service_name, XdsApi::IsEds);
|
2305
|
+
if (!resource.ok()) return;
|
2306
|
+
auto& authority_state = authority_state_map_[resource->authority];
|
2307
|
+
EndpointState& endpoint_state = authority_state.endpoint_map[resource->id];
|
2113
2308
|
auto it = endpoint_state.watchers.find(watcher);
|
2114
|
-
if (it
|
2115
|
-
|
2116
|
-
|
2117
|
-
|
2118
|
-
|
2119
|
-
|
2120
|
-
|
2309
|
+
if (it == endpoint_state.watchers.end()) {
|
2310
|
+
invalid_endpoint_watchers_.erase(watcher);
|
2311
|
+
return;
|
2312
|
+
}
|
2313
|
+
endpoint_state.watchers.erase(it);
|
2314
|
+
if (!endpoint_state.watchers.empty()) return;
|
2315
|
+
authority_state.endpoint_map.erase(resource->id);
|
2316
|
+
xds_server_channel_map_[bootstrap_->server()]->UnsubscribeLocked(
|
2317
|
+
XdsApi::kEdsTypeUrl, *resource, delay_unsubscription);
|
2318
|
+
if (!authority_state.HasSubscribedResources()) {
|
2319
|
+
authority_state.channel_state.reset();
|
2121
2320
|
}
|
2122
2321
|
}
|
2123
2322
|
|
@@ -2151,7 +2350,12 @@ RefCountedPtr<XdsClusterDropStats> XdsClient::AddClusterDropStats(
|
|
2151
2350
|
it->first.second /*eds_service_name*/);
|
2152
2351
|
load_report_state.drop_stats = cluster_drop_stats.get();
|
2153
2352
|
}
|
2154
|
-
|
2353
|
+
auto resource = XdsApi::ParseResourceName(cluster_name, XdsApi::IsCds);
|
2354
|
+
GPR_ASSERT(resource.ok());
|
2355
|
+
auto a = authority_state_map_.find(resource->authority);
|
2356
|
+
if (a != authority_state_map_.end()) {
|
2357
|
+
a->second.channel_state->MaybeStartLrsCall();
|
2358
|
+
}
|
2155
2359
|
return cluster_drop_stats;
|
2156
2360
|
}
|
2157
2361
|
|
@@ -2208,7 +2412,12 @@ RefCountedPtr<XdsClusterLocalityStats> XdsClient::AddClusterLocalityStats(
|
|
2208
2412
|
std::move(locality));
|
2209
2413
|
locality_state.locality_stats = cluster_locality_stats.get();
|
2210
2414
|
}
|
2211
|
-
|
2415
|
+
auto resource = XdsApi::ParseResourceName(cluster_name, XdsApi::IsCds);
|
2416
|
+
GPR_ASSERT(resource.ok());
|
2417
|
+
auto a = authority_state_map_.find(resource->authority);
|
2418
|
+
if (a != authority_state_map_.end()) {
|
2419
|
+
a->second.channel_state->MaybeStartLrsCall();
|
2420
|
+
}
|
2212
2421
|
return cluster_locality_stats;
|
2213
2422
|
}
|
2214
2423
|
|
@@ -2238,34 +2447,36 @@ void XdsClient::RemoveClusterLocalityStats(
|
|
2238
2447
|
|
2239
2448
|
void XdsClient::ResetBackoff() {
|
2240
2449
|
MutexLock lock(&mu_);
|
2241
|
-
|
2242
|
-
grpc_channel_reset_connect_backoff(
|
2450
|
+
for (auto& p : xds_server_channel_map_) {
|
2451
|
+
grpc_channel_reset_connect_backoff(p.second->channel());
|
2243
2452
|
}
|
2244
2453
|
}
|
2245
2454
|
|
2246
2455
|
void XdsClient::NotifyOnErrorLocked(grpc_error_handle error) {
|
2247
|
-
for (const auto&
|
2248
|
-
const
|
2249
|
-
|
2250
|
-
p.
|
2456
|
+
for (const auto& a : authority_state_map_) {
|
2457
|
+
for (const auto& p : a.second.listener_map) {
|
2458
|
+
const ListenerState& listener_state = p.second;
|
2459
|
+
for (const auto& p : listener_state.watchers) {
|
2460
|
+
p.first->OnError(GRPC_ERROR_REF(error));
|
2461
|
+
}
|
2251
2462
|
}
|
2252
|
-
|
2253
|
-
|
2254
|
-
|
2255
|
-
|
2256
|
-
|
2463
|
+
for (const auto& p : a.second.route_config_map) {
|
2464
|
+
const RouteConfigState& route_config_state = p.second;
|
2465
|
+
for (const auto& p : route_config_state.watchers) {
|
2466
|
+
p.first->OnError(GRPC_ERROR_REF(error));
|
2467
|
+
}
|
2257
2468
|
}
|
2258
|
-
|
2259
|
-
|
2260
|
-
|
2261
|
-
|
2262
|
-
|
2469
|
+
for (const auto& p : a.second.cluster_map) {
|
2470
|
+
const ClusterState& cluster_state = p.second;
|
2471
|
+
for (const auto& p : cluster_state.watchers) {
|
2472
|
+
p.first->OnError(GRPC_ERROR_REF(error));
|
2473
|
+
}
|
2263
2474
|
}
|
2264
|
-
|
2265
|
-
|
2266
|
-
|
2267
|
-
|
2268
|
-
|
2475
|
+
for (const auto& p : a.second.endpoint_map) {
|
2476
|
+
const EndpointState& endpoint_state = p.second;
|
2477
|
+
for (const auto& p : endpoint_state.watchers) {
|
2478
|
+
p.first->OnError(GRPC_ERROR_REF(error));
|
2479
|
+
}
|
2269
2480
|
}
|
2270
2481
|
}
|
2271
2482
|
GRPC_ERROR_UNREF(error);
|
@@ -2355,34 +2566,36 @@ XdsApi::ClusterLoadReportMap XdsClient::BuildLoadReportSnapshotLocked(
|
|
2355
2566
|
std::string XdsClient::DumpClientConfigBinary() {
|
2356
2567
|
MutexLock lock(&mu_);
|
2357
2568
|
XdsApi::ResourceTypeMetadataMap resource_type_metadata_map;
|
2358
|
-
|
2359
|
-
|
2360
|
-
|
2361
|
-
|
2362
|
-
|
2363
|
-
|
2364
|
-
|
2365
|
-
|
2366
|
-
|
2367
|
-
|
2368
|
-
|
2369
|
-
|
2370
|
-
|
2371
|
-
|
2372
|
-
|
2373
|
-
|
2374
|
-
|
2375
|
-
|
2376
|
-
|
2377
|
-
|
2378
|
-
|
2379
|
-
|
2380
|
-
|
2381
|
-
|
2382
|
-
|
2383
|
-
|
2384
|
-
|
2385
|
-
|
2569
|
+
auto& lds_map = resource_type_metadata_map[XdsApi::kLdsTypeUrl];
|
2570
|
+
auto& rds_map = resource_type_metadata_map[XdsApi::kRdsTypeUrl];
|
2571
|
+
auto& cds_map = resource_type_metadata_map[XdsApi::kCdsTypeUrl];
|
2572
|
+
auto& eds_map = resource_type_metadata_map[XdsApi::kEdsTypeUrl];
|
2573
|
+
for (auto& a : authority_state_map_) {
|
2574
|
+
const std::string& authority = a.first;
|
2575
|
+
// Collect resource metadata from listeners
|
2576
|
+
for (auto& p : a.second.listener_map) {
|
2577
|
+
const std::string& listener_name = p.first;
|
2578
|
+
lds_map[XdsApi::ConstructFullResourceName(
|
2579
|
+
authority, XdsApi::kLdsTypeUrl, listener_name)] = &p.second.meta;
|
2580
|
+
}
|
2581
|
+
// Collect resource metadata from route configs
|
2582
|
+
for (auto& p : a.second.route_config_map) {
|
2583
|
+
const std::string& route_config_name = p.first;
|
2584
|
+
rds_map[XdsApi::ConstructFullResourceName(
|
2585
|
+
authority, XdsApi::kRdsTypeUrl, route_config_name)] = &p.second.meta;
|
2586
|
+
}
|
2587
|
+
// Collect resource metadata from clusters
|
2588
|
+
for (auto& p : a.second.cluster_map) {
|
2589
|
+
const std::string& cluster_name = p.first;
|
2590
|
+
cds_map[XdsApi::ConstructFullResourceName(authority, XdsApi::kCdsTypeUrl,
|
2591
|
+
cluster_name)] = &p.second.meta;
|
2592
|
+
}
|
2593
|
+
// Collect resource metadata from endpoints
|
2594
|
+
for (auto& p : a.second.endpoint_map) {
|
2595
|
+
const std::string& endpoint_name = p.first;
|
2596
|
+
eds_map[XdsApi::ConstructFullResourceName(
|
2597
|
+
authority, XdsApi::kEdsTypeUrl, endpoint_name)] = &p.second.meta;
|
2598
|
+
}
|
2386
2599
|
}
|
2387
2600
|
// Assemble config dump messages
|
2388
2601
|
return api_.AssembleClientConfig(resource_type_metadata_map);
|
@@ -2540,7 +2753,7 @@ void XdsClientArgDestroy(void* p) {
|
|
2540
2753
|
xds_client->Unref(DEBUG_LOCATION, "channel arg");
|
2541
2754
|
}
|
2542
2755
|
|
2543
|
-
int XdsClientArgCmp(void* p, void* q) { return
|
2756
|
+
int XdsClientArgCmp(void* p, void* q) { return QsortCompare(p, q); }
|
2544
2757
|
|
2545
2758
|
const grpc_arg_pointer_vtable kXdsClientArgVtable = {
|
2546
2759
|
XdsClientArgCopy, XdsClientArgDestroy, XdsClientArgCmp};
|