grpc 1.26.0 → 1.28.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 +1699 -1482
- data/etc/roots.pem +44 -0
- data/include/grpc/grpc_security.h +37 -15
- data/include/grpc/grpc_security_constants.h +27 -0
- data/include/grpc/impl/codegen/grpc_types.h +19 -0
- data/include/grpc/impl/codegen/port_platform.h +8 -1
- data/include/grpc/impl/codegen/sync.h +5 -3
- data/include/grpc/impl/codegen/sync_abseil.h +36 -0
- data/include/grpc/module.modulemap +3 -0
- data/{src/core/lib/json/json_common.h → include/grpc/support/sync_abseil.h} +7 -15
- data/src/core/ext/filters/client_channel/client_channel.cc +74 -32
- data/src/core/ext/filters/client_channel/client_channel_channelz.cc +31 -47
- data/src/core/ext/filters/client_channel/client_channel_channelz.h +1 -3
- data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +1 -1
- data/src/core/ext/filters/client_channel/http_proxy.cc +8 -5
- data/src/core/ext/filters/client_channel/lb_policy.cc +4 -3
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +291 -0
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +83 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +224 -367
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +88 -121
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +28 -57
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +18 -21
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +9 -13
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +85 -83
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +623 -767
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +3 -3
- data/src/core/ext/filters/client_channel/lb_policy_registry.cc +43 -75
- data/src/core/ext/filters/client_channel/lb_policy_registry.h +1 -1
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +57 -70
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +3 -3
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +2 -2
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +3 -3
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +31 -7
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +228 -286
- data/src/core/ext/filters/client_channel/resolver_result_parsing.h +2 -2
- data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +37 -176
- data/src/core/ext/filters/client_channel/resolving_lb_policy.h +7 -11
- data/src/core/ext/filters/client_channel/service_config.cc +91 -160
- data/src/core/ext/filters/client_channel/service_config.h +14 -21
- data/src/core/ext/filters/client_channel/xds/xds_api.cc +1426 -229
- data/src/core/ext/filters/client_channel/xds/xds_api.h +214 -115
- data/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc +236 -339
- data/src/core/ext/filters/client_channel/xds/xds_bootstrap.h +32 -45
- data/src/core/ext/filters/client_channel/xds/xds_channel.h +3 -1
- data/src/core/ext/filters/client_channel/xds/xds_channel_secure.cc +14 -9
- data/src/core/ext/filters/client_channel/xds/xds_client.cc +986 -252
- data/src/core/ext/filters/client_channel/xds/xds_client.h +84 -36
- data/src/core/ext/filters/client_channel/xds/xds_client_stats.cc +53 -131
- data/src/core/ext/filters/client_channel/xds/xds_client_stats.h +119 -152
- data/src/core/ext/filters/message_size/message_size_filter.cc +32 -35
- data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +3 -6
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +6 -8
- data/src/core/ext/transport/chttp2/transport/writing.cc +1 -1
- data/src/core/ext/transport/inproc/inproc_transport.cc +22 -42
- data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c +17 -0
- data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +30 -0
- data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +27 -0
- data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +54 -0
- data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c +46 -21
- data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +116 -29
- data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.c +4 -362
- data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.h +14 -1337
- data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c +390 -0
- data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h +1411 -0
- data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c +29 -8
- data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h +60 -0
- data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c +5 -3
- data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +48 -5
- data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +154 -4
- data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c +19 -15
- data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h +46 -32
- data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c +26 -4
- data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h +70 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c +42 -25
- data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +83 -25
- data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c +43 -7
- data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +115 -0
- data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.c +7 -68
- data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.h +14 -201
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c +91 -0
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h +240 -0
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c +1 -71
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h +3 -228
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c +88 -0
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h +258 -0
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.c +30 -0
- data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.h +53 -0
- data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.c +104 -0
- data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.h +383 -0
- data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c +17 -0
- data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.h +33 -0
- data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c +144 -0
- data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h +527 -0
- data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c +42 -0
- data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.h +112 -0
- data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.c +29 -0
- data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.h +53 -0
- data/src/core/ext/upb-generated/envoy/api/v2/route.upb.c +62 -0
- data/src/core/ext/upb-generated/envoy/api/v2/route.upb.h +199 -0
- data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c +17 -0
- data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.h +33 -0
- data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c +793 -0
- data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h +2936 -0
- data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c +58 -0
- data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h +134 -0
- data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.c +27 -0
- data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.h +53 -0
- data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c +227 -0
- data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h +725 -0
- data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c +296 -0
- data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h +1072 -0
- data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c +32 -0
- data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h +65 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c +47 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h +108 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.c +52 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.h +133 -0
- data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c +87 -0
- data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h +258 -0
- data/src/core/ext/upb-generated/envoy/type/range.upb.c +11 -0
- data/src/core/ext/upb-generated/envoy/type/range.upb.h +27 -0
- data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.c +28 -0
- data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.h +62 -0
- data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c +88 -0
- data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h +249 -0
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +30 -27
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +64 -52
- data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +13 -5
- data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +34 -0
- data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +48 -0
- data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +104 -0
- data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c +17 -0
- data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +30 -0
- data/src/core/ext/upb-generated/validate/validate.upb.c +38 -34
- data/src/core/ext/upb-generated/validate/validate.upb.h +129 -99
- data/src/core/lib/channel/channel_trace.cc +32 -41
- data/src/core/lib/channel/channel_trace.h +3 -3
- data/src/core/lib/channel/channelz.cc +158 -248
- data/src/core/lib/channel/channelz.h +17 -10
- data/src/core/lib/channel/channelz_registry.cc +47 -74
- data/src/core/lib/channel/channelz_registry.h +4 -4
- data/src/core/lib/gpr/sync_abseil.cc +114 -0
- data/src/core/lib/gpr/sync_posix.cc +8 -5
- data/src/core/lib/gpr/sync_windows.cc +4 -2
- data/src/core/lib/gpr/time_precise.cc +1 -1
- data/src/core/lib/gprpp/host_port.cc +1 -1
- data/src/core/lib/gprpp/inlined_vector.h +1 -210
- data/src/core/lib/gprpp/memory.h +2 -6
- data/src/core/lib/gprpp/optional.h +6 -21
- data/src/core/lib/gprpp/string_view.h +5 -110
- data/src/core/lib/gprpp/sync.h +9 -0
- data/src/core/lib/iomgr/buffer_list.cc +36 -35
- data/src/core/lib/iomgr/error.h +4 -4
- data/src/core/lib/iomgr/ev_epollex_linux.cc +12 -4
- data/src/core/lib/iomgr/executor.cc +1 -1
- data/src/core/lib/iomgr/fork_posix.cc +4 -0
- data/src/core/lib/iomgr/load_file.cc +1 -0
- data/src/core/lib/iomgr/poller/eventmanager_libuv.cc +87 -0
- data/src/core/lib/iomgr/poller/eventmanager_libuv.h +88 -0
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +14 -0
- data/src/core/lib/iomgr/socket_utils_posix.h +12 -0
- data/src/core/lib/iomgr/tcp_client_posix.cc +17 -17
- data/src/core/lib/iomgr/tcp_client_posix.h +6 -6
- data/src/core/lib/iomgr/tcp_custom.h +3 -0
- data/src/core/lib/iomgr/tcp_posix.cc +608 -56
- data/src/core/lib/iomgr/tcp_server_custom.cc +15 -2
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +8 -0
- data/src/core/lib/iomgr/work_serializer.cc +155 -0
- data/src/core/lib/iomgr/work_serializer.h +65 -0
- data/src/core/lib/json/json.h +208 -68
- data/src/core/lib/json/json_reader.cc +511 -319
- data/src/core/lib/json/json_writer.cc +201 -110
- data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +1 -1
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +7 -0
- data/src/core/lib/security/credentials/composite/composite_credentials.h +5 -1
- data/src/core/lib/security/credentials/credentials.h +10 -1
- data/src/core/lib/security/credentials/fake/fake_credentials.h +2 -1
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +10 -8
- data/src/core/lib/security/credentials/jwt/json_token.cc +26 -56
- data/src/core/lib/security/credentials/jwt/json_token.h +2 -1
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +8 -18
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +149 -159
- data/src/core/lib/security/credentials/jwt/jwt_verifier.h +2 -3
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +38 -35
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -1
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -4
- data/src/core/lib/security/credentials/plugin/plugin_credentials.h +2 -1
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +20 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +9 -0
- data/src/core/lib/security/credentials/tls/{spiffe_credentials.cc → tls_credentials.cc} +23 -24
- data/src/core/lib/security/credentials/tls/{spiffe_credentials.h → tls_credentials.h} +9 -9
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +13 -0
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +22 -2
- data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +2 -2
- data/src/core/lib/security/security_connector/load_system_roots_linux.cc +2 -2
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +31 -6
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +3 -15
- data/src/core/lib/security/security_connector/ssl_utils.cc +48 -4
- data/src/core/lib/security/security_connector/ssl_utils.h +12 -1
- data/src/core/lib/security/security_connector/tls/{spiffe_security_connector.cc → tls_security_connector.cc} +106 -70
- data/src/core/lib/security/security_connector/tls/{spiffe_security_connector.h → tls_security_connector.h} +22 -19
- data/src/core/lib/security/transport/client_auth_filter.cc +33 -0
- data/src/core/lib/security/transport/security_handshaker.cc +2 -2
- data/src/core/lib/security/util/json_util.cc +22 -15
- data/src/core/lib/security/util/json_util.h +2 -2
- data/src/core/lib/surface/completion_queue.cc +22 -1
- data/src/core/lib/surface/version.cc +1 -1
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +12 -2
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +1 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +3 -3
- data/src/core/tsi/fake_transport_security.cc +7 -3
- data/src/core/tsi/fake_transport_security.h +2 -0
- data/src/core/tsi/grpc_shadow_boringssl.h +1333 -1319
- data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -1
- data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +1 -1
- data/src/core/tsi/ssl_transport_security.cc +145 -8
- data/src/core/tsi/ssl_transport_security.h +15 -1
- data/src/core/tsi/transport_security.cc +13 -0
- data/src/core/tsi/transport_security_grpc.cc +2 -2
- data/src/core/tsi/transport_security_grpc.h +2 -2
- data/src/core/tsi/transport_security_interface.h +12 -0
- data/src/ruby/bin/math_pb.rb +5 -5
- data/src/ruby/ext/grpc/rb_call_credentials.c +4 -1
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +4 -1
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/grpc/health/v1/health_pb.rb +3 -3
- data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +1 -1
- data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +23 -13
- data/third_party/abseil-cpp/absl/algorithm/algorithm.h +159 -0
- data/third_party/abseil-cpp/absl/base/attributes.h +621 -0
- data/third_party/abseil-cpp/absl/base/call_once.h +226 -0
- data/third_party/abseil-cpp/absl/base/casts.h +184 -0
- data/third_party/abseil-cpp/absl/base/config.h +671 -0
- data/third_party/abseil-cpp/absl/base/const_init.h +76 -0
- data/third_party/abseil-cpp/absl/base/dynamic_annotations.cc +129 -0
- data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +389 -0
- data/third_party/abseil-cpp/absl/base/internal/atomic_hook.h +200 -0
- data/third_party/abseil-cpp/absl/base/internal/bits.h +218 -0
- data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +107 -0
- data/third_party/abseil-cpp/absl/base/internal/cycleclock.h +94 -0
- data/third_party/abseil-cpp/absl/base/internal/endian.h +266 -0
- data/third_party/abseil-cpp/absl/base/internal/errno_saver.h +43 -0
- data/third_party/abseil-cpp/absl/base/internal/hide_ptr.h +51 -0
- data/third_party/abseil-cpp/absl/base/internal/identity.h +37 -0
- data/third_party/abseil-cpp/absl/base/internal/inline_variable.h +107 -0
- data/third_party/abseil-cpp/absl/base/internal/invoke.h +187 -0
- data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +107 -0
- data/third_party/abseil-cpp/absl/base/internal/per_thread_tls.h +52 -0
- data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +240 -0
- data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +183 -0
- data/third_party/abseil-cpp/absl/base/internal/scheduling_mode.h +58 -0
- data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +233 -0
- data/third_party/abseil-cpp/absl/base/internal/spinlock.h +243 -0
- data/third_party/abseil-cpp/absl/base/internal/spinlock_akaros.inc +35 -0
- data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +66 -0
- data/third_party/abseil-cpp/absl/base/internal/spinlock_posix.inc +46 -0
- data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.cc +81 -0
- data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +93 -0
- data/third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc +37 -0
- data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +416 -0
- data/third_party/abseil-cpp/absl/base/internal/sysinfo.h +66 -0
- data/third_party/abseil-cpp/absl/base/internal/thread_annotations.h +271 -0
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +152 -0
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +259 -0
- data/third_party/abseil-cpp/absl/base/internal/throw_delegate.cc +108 -0
- data/third_party/abseil-cpp/absl/base/internal/throw_delegate.h +75 -0
- data/third_party/abseil-cpp/absl/base/internal/tsan_mutex_interface.h +66 -0
- data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +158 -0
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +140 -0
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +124 -0
- data/third_party/abseil-cpp/absl/base/log_severity.cc +27 -0
- data/third_party/abseil-cpp/absl/base/log_severity.h +121 -0
- data/third_party/abseil-cpp/absl/base/macros.h +220 -0
- data/third_party/abseil-cpp/absl/base/optimization.h +181 -0
- data/third_party/abseil-cpp/absl/base/options.h +211 -0
- data/third_party/abseil-cpp/absl/base/policy_checks.h +111 -0
- data/third_party/abseil-cpp/absl/base/port.h +26 -0
- data/third_party/abseil-cpp/absl/base/thread_annotations.h +280 -0
- data/third_party/abseil-cpp/absl/container/inlined_vector.h +848 -0
- data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +265 -0
- data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +892 -0
- data/third_party/abseil-cpp/absl/memory/memory.h +695 -0
- data/third_party/abseil-cpp/absl/meta/type_traits.h +759 -0
- data/third_party/abseil-cpp/absl/numeric/int128.cc +404 -0
- data/third_party/abseil-cpp/absl/numeric/int128.h +1091 -0
- data/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +302 -0
- data/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +308 -0
- data/third_party/abseil-cpp/absl/strings/ascii.cc +200 -0
- data/third_party/abseil-cpp/absl/strings/ascii.h +242 -0
- data/third_party/abseil-cpp/absl/strings/charconv.cc +984 -0
- data/third_party/abseil-cpp/absl/strings/charconv.h +119 -0
- data/third_party/abseil-cpp/absl/strings/escaping.cc +949 -0
- data/third_party/abseil-cpp/absl/strings/escaping.h +164 -0
- data/third_party/abseil-cpp/absl/strings/internal/char_map.h +156 -0
- data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +359 -0
- data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.h +423 -0
- data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +504 -0
- data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.h +99 -0
- data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +180 -0
- data/third_party/abseil-cpp/absl/strings/internal/escaping.h +58 -0
- data/third_party/abseil-cpp/absl/strings/internal/memutil.cc +112 -0
- data/third_party/abseil-cpp/absl/strings/internal/memutil.h +148 -0
- data/third_party/abseil-cpp/absl/strings/internal/ostringstream.cc +36 -0
- data/third_party/abseil-cpp/absl/strings/internal/ostringstream.h +89 -0
- data/third_party/abseil-cpp/absl/strings/internal/resize_uninitialized.h +73 -0
- data/third_party/abseil-cpp/absl/strings/internal/stl_type_traits.h +248 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +388 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +432 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +245 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +209 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +326 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +51 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +415 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +493 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h +23 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_format/output.cc +72 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +104 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +334 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +333 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +314 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +455 -0
- data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +53 -0
- data/third_party/abseil-cpp/absl/strings/internal/utf8.h +50 -0
- data/third_party/abseil-cpp/absl/strings/match.cc +40 -0
- data/third_party/abseil-cpp/absl/strings/match.h +90 -0
- data/third_party/abseil-cpp/absl/strings/numbers.cc +965 -0
- data/third_party/abseil-cpp/absl/strings/numbers.h +266 -0
- data/third_party/abseil-cpp/absl/strings/str_cat.cc +246 -0
- data/third_party/abseil-cpp/absl/strings/str_cat.h +408 -0
- data/third_party/abseil-cpp/absl/strings/str_format.h +537 -0
- data/third_party/abseil-cpp/absl/strings/str_join.h +293 -0
- data/third_party/abseil-cpp/absl/strings/str_replace.cc +82 -0
- data/third_party/abseil-cpp/absl/strings/str_replace.h +219 -0
- data/third_party/abseil-cpp/absl/strings/str_split.cc +139 -0
- data/third_party/abseil-cpp/absl/strings/str_split.h +513 -0
- data/third_party/abseil-cpp/absl/strings/string_view.cc +235 -0
- data/third_party/abseil-cpp/absl/strings/string_view.h +622 -0
- data/third_party/abseil-cpp/absl/strings/strip.h +91 -0
- data/third_party/abseil-cpp/absl/strings/substitute.cc +171 -0
- data/third_party/abseil-cpp/absl/strings/substitute.h +693 -0
- data/third_party/abseil-cpp/absl/types/bad_optional_access.cc +48 -0
- data/third_party/abseil-cpp/absl/types/bad_optional_access.h +78 -0
- data/third_party/abseil-cpp/absl/types/internal/optional.h +396 -0
- data/third_party/abseil-cpp/absl/types/internal/span.h +128 -0
- data/third_party/abseil-cpp/absl/types/optional.h +776 -0
- data/third_party/abseil-cpp/absl/types/span.h +713 -0
- data/third_party/abseil-cpp/absl/utility/utility.h +350 -0
- data/{src/boringssl → third_party/boringssl-with-bazel}/err_data.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_bitstr.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_bool.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_d2i_fp.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_dup.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_enum.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_gentm.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_i2d_fp.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_int.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_mbstr.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_object.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_octet.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_print.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_strnid.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_time.c +3 -4
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_type.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_utctm.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_utf8.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/asn1_lib.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/asn1_locl.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/asn1_par.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/asn_pack.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/f_enum.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/f_int.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/f_string.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/tasn_dec.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/tasn_enc.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/tasn_fre.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/tasn_new.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/tasn_typ.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/tasn_utl.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/time_support.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/base64/base64.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/bio.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/bio_mem.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/connect.c +3 -4
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/fd.c +0 -1
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/file.c +5 -6
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/hexdump.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/internal.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/pair.c +0 -1
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/printf.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/socket.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/socket_helper.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bn_extra/bn_asn1.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bn_extra/convert.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/buf/buf.c +10 -69
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bytestring/asn1_compat.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bytestring/ber.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bytestring/cbb.c +41 -2
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bytestring/cbs.c +60 -3
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bytestring/internal.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bytestring/unicode.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/chacha/chacha.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/chacha/internal.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/cipher_extra.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/derive_key.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_aesccm.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_aesctrhmac.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_aesgcmsiv.c +8 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_chacha20poly1305.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_null.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_rc2.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_rc4.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_tls.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/internal.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/tls_cbc.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cmac/cmac.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/conf/conf.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/conf/conf_def.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/conf/internal.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cpu-aarch64-fuchsia.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cpu-aarch64-linux.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cpu-arm-linux.c +0 -1
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cpu-arm-linux.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cpu-arm.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cpu-intel.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cpu-ppc64le.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/crypto.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/curve25519/spake25519.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/dh/check.c +3 -3
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/dh/dh.c +1 -2
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/dh/dh_asn1.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/dh/params.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/digest_extra/digest_extra.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/dsa/dsa.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/dsa/dsa_asn1.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/ec_extra/ec_asn1.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/ec_extra/ec_derive.c +2 -3
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/ecdh_extra/ecdh_extra.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/ecdsa_extra/ecdsa_asn1.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/engine/engine.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/err/err.c +6 -6
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/err/internal.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/digestsign.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/evp.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/evp_asn1.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/evp_ctx.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/internal.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_dsa_asn1.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_ec.c +0 -1
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_ec_asn1.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_ed25519.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_ed25519_asn1.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_rsa.c +14 -2
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_rsa_asn1.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_x25519.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_x25519_asn1.c +1 -2
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/pbkdf.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/print.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/scrypt.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/sign.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/ex_data.c +0 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes.c +108 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes_nohw.c +1282 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/aes/internal.h +5 -7
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/aes/key_wrap.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/aes/mode_wrappers.c +0 -2
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bcm.c +2 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/add.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/asm/x86_64-gcc.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/bn.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/bytes.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/cmp.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/ctx.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/div.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/div_extra.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/exponentiation.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/gcd.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/gcd_extra.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/generic.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/internal.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/jacobi.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/montgomery.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/montgomery_inv.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/mul.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/prime.c +11 -12
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/random.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/rsaz_exp.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/rsaz_exp.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/shift.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/sqrt.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/cipher/aead.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/cipher/cipher.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/cipher/e_aes.c +3 -5
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/cipher/e_des.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/cipher/internal.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/delocate.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/des/des.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/des/internal.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/digest/digest.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/digest/digests.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/digest/internal.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/digest/md32_common.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/ec.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/ec_key.c +1 -1
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/ec_montgomery.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/felem.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/internal.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/oct.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/p224-64.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/p256-x86_64-table.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/p256-x86_64.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/p256-x86_64.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/scalar.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/simple.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/simple_mul.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/util.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/wnaf.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ecdh/ecdh.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ecdsa/ecdsa.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/fips_shared_support.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/hmac/hmac.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/is_fips.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/md4/md4.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/md5/internal.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/md5/md5.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/modes/cbc.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/modes/cfb.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/modes/ctr.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/modes/gcm.c +45 -193
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_nohw.c +304 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/modes/internal.h +8 -18
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/modes/ofb.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/modes/polyval.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/rand/ctrdrbg.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/rand/internal.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/rand/rand.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/rand/urandom.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/rsa/blinding.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/rsa/internal.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/rsa/padding.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/rsa/rsa.c +7 -1
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/rsa/rsa_impl.c +60 -51
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/self_check/self_check.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/sha/internal.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/sha/sha1-altivec.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/sha/sha1.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/sha/sha256.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/sha/sha512.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/tls/internal.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/tls/kdf.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/hkdf/hkdf.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/hrss/hrss.c +210 -311
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/hrss/internal.h +0 -1
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/internal.h +21 -1
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/lhash/lhash.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/mem.c +70 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/obj/obj.c +16 -21
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/obj/obj_dat.h +27 -6
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/obj/obj_xref.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pem/pem_all.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pem/pem_info.c +0 -1
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pem/pem_lib.c +7 -7
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pem/pem_oth.c +0 -1
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pem/pem_pk8.c +0 -1
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pem/pem_pkey.c +0 -1
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pem/pem_x509.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pem/pem_xaux.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pkcs7/internal.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pkcs7/pkcs7.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pkcs7/pkcs7_x509.c +1 -1
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pkcs8/internal.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pkcs8/p5_pbev2.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pkcs8/pkcs8.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pkcs8/pkcs8_x509.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/poly1305/internal.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/poly1305/poly1305.c +2 -2
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/poly1305/poly1305_arm.c +21 -20
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/poly1305/poly1305_vec.c +34 -17
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pool/internal.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pool/pool.c +1 -2
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rand_extra/deterministic.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rand_extra/forkunsafe.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rand_extra/fuchsia.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rand_extra/rand_extra.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rand_extra/windows.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rc4/rc4.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/refcount_c11.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/refcount_lock.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rsa_extra/rsa_asn1.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rsa_extra/rsa_print.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/siphash/siphash.c +3 -1
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/stack/stack.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/thread.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/thread_none.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/thread_pthread.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/thread_win.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/a_digest.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/a_sign.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/a_strex.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/a_verify.c +0 -1
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/algorithm.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/asn1_gen.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/by_dir.c +1 -1
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/by_file.c +0 -1
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/charmap.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/i2d_pr.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/internal.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/rsa_pss.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/t_crl.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/t_req.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/t_x509.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/t_x509a.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/vpm_int.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_att.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_cmp.c +0 -1
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_d2.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_def.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_ext.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_lu.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_obj.c +1 -1
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_r2x.c +0 -1
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_req.c +0 -1
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_set.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_trs.c +1 -2
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_txt.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_v3.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_vfy.c +0 -1
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_vpm.c +3 -4
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509cset.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509name.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509rset.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509spki.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_algor.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_all.c +0 -1
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_attrib.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_crl.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_exten.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_info.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_name.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_pkey.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_pubkey.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_req.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_sig.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_spki.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_val.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_x509.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_x509a.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/ext_dat.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/internal.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_cache.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_data.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_int.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_lib.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_map.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_node.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_tree.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_akey.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_akeya.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_alt.c +3 -3
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_bcons.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_bitst.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_conf.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_cpols.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_crld.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_enum.c +2 -2
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_extku.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_genn.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_ia5.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_info.c +4 -5
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_int.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_lib.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_ncons.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_ocsp.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_pci.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_pcia.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_pcons.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_pku.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_pmaps.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_prn.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_purp.c +2 -3
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_skey.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_sxnet.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_utl.c +11 -12
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/aead.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/aes.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/arm_arch.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/asn1.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/asn1_mac.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/asn1t.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/base.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/base64.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/bio.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/blowfish.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/bn.h +32 -20
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/buf.h +9 -9
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/buffer.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/bytestring.h +34 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/cast.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/chacha.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/cipher.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/cmac.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/conf.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/cpu.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/crypto.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/curve25519.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/des.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/dh.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/digest.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/dsa.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/dtls1.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/e_os2.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ec.h +11 -4
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ec_key.h +4 -2
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ecdh.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ecdsa.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/engine.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/err.h +11 -9
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/evp.h +20 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ex_data.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/hkdf.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/hmac.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/hrss.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/is_boringssl.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/lhash.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/md4.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/md5.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/mem.h +17 -2
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/nid.h +9 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/obj.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/obj_mac.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/objects.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/opensslconf.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/opensslv.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ossl_typ.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/pem.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/pkcs12.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/pkcs7.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/pkcs8.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/poly1305.h +5 -7
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/pool.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/rand.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/rc4.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ripemd.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/rsa.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/safestack.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/sha.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/siphash.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/span.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/srtp.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ssl.h +10 -20
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ssl3.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/stack.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/thread.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/tls1.h +0 -3
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/type_check.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/x509.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/x509_vfy.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/x509v3.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/bio_ssl.cc +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/d1_both.cc +0 -1
- data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/d1_lib.cc +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/d1_pkt.cc +0 -1
- data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/d1_srtp.cc +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/dtls_method.cc +0 -1
- data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/dtls_record.cc +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/handoff.cc +126 -29
- data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/handshake.cc +5 -4
- data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/handshake_client.cc +24 -13
- data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/handshake_server.cc +1 -5
- data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/internal.h +32 -26
- data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/s3_both.cc +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/s3_lib.cc +2 -3
- data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/s3_pkt.cc +0 -1
- data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_aead_ctx.cc +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_asn1.cc +1 -2
- data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_buffer.cc +34 -15
- data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_cert.cc +0 -1
- data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_cipher.cc +0 -1
- data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_file.cc +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_key_share.cc +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_lib.cc +13 -14
- data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_privkey.cc +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_session.cc +2 -1
- data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_stat.cc +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_transcript.cc +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_versions.cc +1 -1
- data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_x509.cc +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/t1_enc.cc +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/t1_lib.cc +11 -171
- data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/tls13_both.cc +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/tls13_client.cc +3 -4
- data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/tls13_enc.cc +5 -1
- data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/tls13_server.cc +78 -101
- data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/tls_method.cc +1 -1
- data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/tls_record.cc +7 -2
- data/third_party/{boringssl → boringssl-with-bazel/src}/third_party/fiat/curve25519.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/third_party/fiat/curve25519_32.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/third_party/fiat/curve25519_64.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/third_party/fiat/curve25519_tables.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/third_party/fiat/internal.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/third_party/fiat/p256.c +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/third_party/fiat/p256_32.h +0 -0
- data/third_party/{boringssl → boringssl-with-bazel/src}/third_party/fiat/p256_64.h +0 -0
- data/third_party/upb/upb/decode.c +4 -0
- data/third_party/upb/upb/port.c +0 -1
- data/third_party/upb/upb/port_def.inc +1 -3
- data/third_party/upb/upb/table.c +2 -1
- metadata +680 -505
- data/src/core/lib/iomgr/logical_thread.cc +0 -103
- data/src/core/lib/iomgr/logical_thread.h +0 -52
- data/src/core/lib/json/json.cc +0 -94
- data/src/core/lib/json/json_reader.h +0 -146
- data/src/core/lib/json/json_string.cc +0 -367
- data/src/core/lib/json/json_writer.h +0 -84
- data/third_party/boringssl/crypto/fipsmodule/aes/aes.c +0 -860
@@ -321,13 +321,13 @@ void RoundRobin::RoundRobinSubchannelList::
|
|
321
321
|
*/
|
322
322
|
if (num_ready_ > 0) {
|
323
323
|
/* 1) READY */
|
324
|
-
p->channel_control_helper()->UpdateState(
|
325
|
-
|
324
|
+
p->channel_control_helper()->UpdateState(
|
325
|
+
GRPC_CHANNEL_READY, absl::make_unique<Picker>(p, this));
|
326
326
|
} else if (num_connecting_ > 0) {
|
327
327
|
/* 2) CONNECTING */
|
328
328
|
p->channel_control_helper()->UpdateState(
|
329
329
|
GRPC_CHANNEL_CONNECTING,
|
330
|
-
|
330
|
+
absl::make_unique<QueuePicker>(p->Ref(DEBUG_LOCATION, "QueuePicker")));
|
331
331
|
} else if (num_transient_failure_ == num_subchannels()) {
|
332
332
|
/* 3) TRANSIENT_FAILURE */
|
333
333
|
grpc_error* error =
|
@@ -336,7 +336,7 @@ void RoundRobin::RoundRobinSubchannelList::
|
|
336
336
|
GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
|
337
337
|
p->channel_control_helper()->UpdateState(
|
338
338
|
GRPC_CHANNEL_TRANSIENT_FAILURE,
|
339
|
-
|
339
|
+
absl::make_unique<TransientFailurePicker>(error));
|
340
340
|
}
|
341
341
|
}
|
342
342
|
|
@@ -453,7 +453,7 @@ void RoundRobin::UpdateLocked(UpdateArgs args) {
|
|
453
453
|
GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
|
454
454
|
channel_control_helper()->UpdateState(
|
455
455
|
GRPC_CHANNEL_TRANSIENT_FAILURE,
|
456
|
-
|
456
|
+
absl::make_unique<TransientFailurePicker>(error));
|
457
457
|
subchannel_list_ = std::move(latest_pending_subchannel_list_);
|
458
458
|
} else if (subchannel_list_ == nullptr) {
|
459
459
|
// If there is no current list, immediately promote the new list to
|
@@ -467,7 +467,7 @@ void RoundRobin::UpdateLocked(UpdateArgs args) {
|
|
467
467
|
}
|
468
468
|
}
|
469
469
|
|
470
|
-
class
|
470
|
+
class RoundRobinConfig : public LoadBalancingPolicy::Config {
|
471
471
|
public:
|
472
472
|
const char* name() const override { return kRoundRobin; }
|
473
473
|
};
|
@@ -486,12 +486,8 @@ class RoundRobinFactory : public LoadBalancingPolicyFactory {
|
|
486
486
|
const char* name() const override { return kRoundRobin; }
|
487
487
|
|
488
488
|
RefCountedPtr<LoadBalancingPolicy::Config> ParseLoadBalancingConfig(
|
489
|
-
const
|
490
|
-
|
491
|
-
GPR_DEBUG_ASSERT(strcmp(json->key, name()) == 0);
|
492
|
-
}
|
493
|
-
return RefCountedPtr<LoadBalancingPolicy::Config>(
|
494
|
-
new ParsedRoundRobinConfig());
|
489
|
+
const Json& /*json*/, grpc_error** /*error*/) const override {
|
490
|
+
return MakeRefCounted<RoundRobinConfig>();
|
495
491
|
}
|
496
492
|
};
|
497
493
|
|
@@ -502,7 +498,7 @@ class RoundRobinFactory : public LoadBalancingPolicyFactory {
|
|
502
498
|
void grpc_lb_policy_round_robin_init() {
|
503
499
|
grpc_core::LoadBalancingPolicyRegistry::Builder::
|
504
500
|
RegisterLoadBalancingPolicyFactory(
|
505
|
-
|
501
|
+
absl::make_unique<grpc_core::RoundRobinFactory>());
|
506
502
|
}
|
507
503
|
|
508
504
|
void grpc_lb_policy_round_robin_shutdown() {}
|
@@ -36,16 +36,15 @@ namespace {
|
|
36
36
|
|
37
37
|
constexpr char kCds[] = "cds_experimental";
|
38
38
|
|
39
|
-
//
|
40
|
-
class
|
39
|
+
// Config for this LB policy.
|
40
|
+
class CdsConfig : public LoadBalancingPolicy::Config {
|
41
41
|
public:
|
42
|
-
explicit
|
43
|
-
|
44
|
-
const char* cluster() const { return cluster_.get(); }
|
42
|
+
explicit CdsConfig(std::string cluster) : cluster_(std::move(cluster)) {}
|
43
|
+
const std::string& cluster() const { return cluster_; }
|
45
44
|
const char* name() const override { return kCds; }
|
46
45
|
|
47
46
|
private:
|
48
|
-
|
47
|
+
std::string cluster_;
|
49
48
|
};
|
50
49
|
|
51
50
|
// CDS LB policy.
|
@@ -64,7 +63,7 @@ class CdsLb : public LoadBalancingPolicy {
|
|
64
63
|
public:
|
65
64
|
explicit ClusterWatcher(RefCountedPtr<CdsLb> parent)
|
66
65
|
: parent_(std::move(parent)) {}
|
67
|
-
void OnClusterChanged(CdsUpdate cluster_data) override;
|
66
|
+
void OnClusterChanged(XdsApi::CdsUpdate cluster_data) override;
|
68
67
|
void OnError(grpc_error* error) override;
|
69
68
|
|
70
69
|
private:
|
@@ -90,7 +89,7 @@ class CdsLb : public LoadBalancingPolicy {
|
|
90
89
|
|
91
90
|
void ShutdownLocked() override;
|
92
91
|
|
93
|
-
RefCountedPtr<
|
92
|
+
RefCountedPtr<CdsConfig> config_;
|
94
93
|
|
95
94
|
// Current channel args from the resolver.
|
96
95
|
const grpc_channel_args* args_ = nullptr;
|
@@ -112,47 +111,40 @@ class CdsLb : public LoadBalancingPolicy {
|
|
112
111
|
// CdsLb::ClusterWatcher
|
113
112
|
//
|
114
113
|
|
115
|
-
void CdsLb::ClusterWatcher::OnClusterChanged(CdsUpdate cluster_data) {
|
114
|
+
void CdsLb::ClusterWatcher::OnClusterChanged(XdsApi::CdsUpdate cluster_data) {
|
116
115
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
|
117
|
-
gpr_log(GPR_INFO,
|
118
|
-
|
116
|
+
gpr_log(GPR_INFO,
|
117
|
+
"[cdslb %p] received CDS update from xds client %p: "
|
118
|
+
"eds_service_name=%s lrs_load_reporting_server_name=%s",
|
119
|
+
parent_.get(), parent_->xds_client_.get(),
|
120
|
+
cluster_data.eds_service_name.c_str(),
|
121
|
+
cluster_data.lrs_load_reporting_server_name.has_value()
|
122
|
+
? cluster_data.lrs_load_reporting_server_name.value().c_str()
|
123
|
+
: "(unset)");
|
119
124
|
}
|
120
125
|
// Construct config for child policy.
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
126
|
+
Json::Object child_config = {
|
127
|
+
{"edsServiceName",
|
128
|
+
(cluster_data.eds_service_name.empty() ? parent_->config_->cluster()
|
129
|
+
: cluster_data.eds_service_name)},
|
130
|
+
};
|
131
|
+
if (cluster_data.lrs_load_reporting_server_name.has_value()) {
|
132
|
+
child_config["lrsLoadReportingServerName"] =
|
133
|
+
cluster_data.lrs_load_reporting_server_name.value();
|
125
134
|
}
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
" \"edsServiceName\": \"%s\"\n"
|
132
|
-
" }\n"
|
133
|
-
"}]",
|
134
|
-
(lrs_str == nullptr ? "" : lrs_str),
|
135
|
-
(cluster_data.eds_service_name == nullptr
|
136
|
-
? parent_->config_->cluster()
|
137
|
-
: cluster_data.eds_service_name.get()));
|
138
|
-
gpr_free(lrs_str);
|
139
|
-
grpc_core::UniquePtr<char> json_str_deleter(json_str);
|
135
|
+
Json json = Json::Array{
|
136
|
+
Json::Object{
|
137
|
+
{"xds_experimental", std::move(child_config)},
|
138
|
+
},
|
139
|
+
};
|
140
140
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
|
141
|
+
std::string json_str = json.Dump();
|
141
142
|
gpr_log(GPR_INFO, "[cdslb %p] generated config for child policy: %s",
|
142
|
-
parent_.get(), json_str);
|
143
|
-
}
|
144
|
-
grpc_json* json = grpc_json_parse_string(json_str);
|
145
|
-
if (json == nullptr) {
|
146
|
-
char* msg;
|
147
|
-
gpr_asprintf(&msg, "Could not parse LB config: %s", json_str);
|
148
|
-
OnError(GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg));
|
149
|
-
gpr_free(msg);
|
150
|
-
return;
|
143
|
+
parent_.get(), json_str.c_str());
|
151
144
|
}
|
152
145
|
grpc_error* error = GRPC_ERROR_NONE;
|
153
146
|
RefCountedPtr<LoadBalancingPolicy::Config> config =
|
154
147
|
LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(json, &error);
|
155
|
-
grpc_json_destroy(json);
|
156
148
|
if (error != GRPC_ERROR_NONE) {
|
157
149
|
OnError(error);
|
158
150
|
return;
|
@@ -162,13 +154,22 @@ void CdsLb::ClusterWatcher::OnClusterChanged(CdsUpdate cluster_data) {
|
|
162
154
|
LoadBalancingPolicy::Args args;
|
163
155
|
args.combiner = parent_->combiner();
|
164
156
|
args.args = parent_->args_;
|
165
|
-
args.channel_control_helper =
|
157
|
+
args.channel_control_helper = absl::make_unique<Helper>(parent_->Ref());
|
166
158
|
parent_->child_policy_ =
|
167
159
|
LoadBalancingPolicyRegistry::CreateLoadBalancingPolicy(
|
168
160
|
"xds_experimental", std::move(args));
|
161
|
+
if (parent_->child_policy_ == nullptr) {
|
162
|
+
OnError(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
163
|
+
"failed to create xds_experimental child policy"));
|
164
|
+
return;
|
165
|
+
}
|
169
166
|
grpc_pollset_set_add_pollset_set(
|
170
167
|
parent_->child_policy_->interested_parties(),
|
171
168
|
parent_->interested_parties());
|
169
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
|
170
|
+
gpr_log(GPR_INFO, "[cdslb %p] created child policy xds_experimental (%p)",
|
171
|
+
parent_.get(), parent_->child_policy_.get());
|
172
|
+
}
|
172
173
|
}
|
173
174
|
// Update child policy.
|
174
175
|
UpdateArgs args;
|
@@ -179,14 +180,15 @@ void CdsLb::ClusterWatcher::OnClusterChanged(CdsUpdate cluster_data) {
|
|
179
180
|
|
180
181
|
void CdsLb::ClusterWatcher::OnError(grpc_error* error) {
|
181
182
|
gpr_log(GPR_ERROR, "[cdslb %p] xds error obtaining data for cluster %s: %s",
|
182
|
-
parent_.get(), parent_->config_->cluster()
|
183
|
+
parent_.get(), parent_->config_->cluster().c_str(),
|
184
|
+
grpc_error_string(error));
|
183
185
|
// Go into TRANSIENT_FAILURE if we have not yet created the child
|
184
186
|
// policy (i.e., we have not yet received data from xds). Otherwise,
|
185
187
|
// we keep running with the data we had previously.
|
186
188
|
if (parent_->child_policy_ == nullptr) {
|
187
189
|
parent_->channel_control_helper()->UpdateState(
|
188
190
|
GRPC_CHANNEL_TRANSIENT_FAILURE,
|
189
|
-
|
191
|
+
absl::make_unique<TransientFailurePicker>(error));
|
190
192
|
} else {
|
191
193
|
GRPC_ERROR_UNREF(error);
|
192
194
|
}
|
@@ -233,9 +235,9 @@ void CdsLb::Helper::AddTraceEvent(TraceSeverity severity, StringView message) {
|
|
233
235
|
CdsLb::CdsLb(Args args)
|
234
236
|
: LoadBalancingPolicy(std::move(args)),
|
235
237
|
xds_client_(XdsClient::GetFromChannelArgs(*args.args)) {
|
236
|
-
if (
|
237
|
-
gpr_log(GPR_INFO, "[cdslb %p]
|
238
|
-
xds_client_.get());
|
238
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
|
239
|
+
gpr_log(GPR_INFO, "[cdslb %p] created -- using xds client %p from channel",
|
240
|
+
this, xds_client_.get());
|
239
241
|
}
|
240
242
|
}
|
241
243
|
|
@@ -258,8 +260,12 @@ void CdsLb::ShutdownLocked() {
|
|
258
260
|
}
|
259
261
|
if (xds_client_ != nullptr) {
|
260
262
|
if (cluster_watcher_ != nullptr) {
|
261
|
-
|
262
|
-
|
263
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
|
264
|
+
gpr_log(GPR_INFO, "[cdslb %p] cancelling watch for cluster %s", this,
|
265
|
+
config_->cluster().c_str());
|
266
|
+
}
|
267
|
+
xds_client_->CancelClusterDataWatch(
|
268
|
+
StringView(config_->cluster().c_str()), cluster_watcher_);
|
263
269
|
}
|
264
270
|
xds_client_.reset();
|
265
271
|
}
|
@@ -270,26 +276,35 @@ void CdsLb::ResetBackoffLocked() {
|
|
270
276
|
}
|
271
277
|
|
272
278
|
void CdsLb::UpdateLocked(UpdateArgs args) {
|
273
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
|
274
|
-
gpr_log(GPR_INFO, "[cdslb %p] received update", this);
|
275
|
-
}
|
276
279
|
// Update config.
|
277
280
|
auto old_config = std::move(config_);
|
278
281
|
config_ = std::move(args.config);
|
282
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
|
283
|
+
gpr_log(GPR_INFO, "[cdslb %p] received update: cluster=%s", this,
|
284
|
+
config_->cluster().c_str());
|
285
|
+
}
|
279
286
|
// Update args.
|
280
287
|
grpc_channel_args_destroy(args_);
|
281
288
|
args_ = args.args;
|
282
289
|
args.args = nullptr;
|
283
290
|
// If cluster name changed, cancel watcher and restart.
|
284
|
-
if (old_config == nullptr ||
|
285
|
-
strcmp(old_config->cluster(), config_->cluster()) != 0) {
|
291
|
+
if (old_config == nullptr || old_config->cluster() != config_->cluster()) {
|
286
292
|
if (old_config != nullptr) {
|
287
|
-
|
288
|
-
|
293
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
|
294
|
+
gpr_log(GPR_INFO, "[cdslb %p] cancelling watch for cluster %s", this,
|
295
|
+
old_config->cluster().c_str());
|
296
|
+
}
|
297
|
+
xds_client_->CancelClusterDataWatch(
|
298
|
+
StringView(old_config->cluster().c_str()), cluster_watcher_,
|
299
|
+
/*delay_unsubscription=*/true);
|
300
|
+
}
|
301
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
|
302
|
+
gpr_log(GPR_INFO, "[cdslb %p] starting watch for cluster %s", this,
|
303
|
+
config_->cluster().c_str());
|
289
304
|
}
|
290
|
-
auto watcher =
|
305
|
+
auto watcher = absl::make_unique<ClusterWatcher>(Ref());
|
291
306
|
cluster_watcher_ = watcher.get();
|
292
|
-
xds_client_->WatchClusterData(StringView(config_->cluster()),
|
307
|
+
xds_client_->WatchClusterData(StringView(config_->cluster().c_str()),
|
293
308
|
std::move(watcher));
|
294
309
|
}
|
295
310
|
}
|
@@ -308,9 +323,9 @@ class CdsFactory : public LoadBalancingPolicyFactory {
|
|
308
323
|
const char* name() const override { return kCds; }
|
309
324
|
|
310
325
|
RefCountedPtr<LoadBalancingPolicy::Config> ParseLoadBalancingConfig(
|
311
|
-
const
|
326
|
+
const Json& json, grpc_error** error) const override {
|
312
327
|
GPR_DEBUG_ASSERT(error != nullptr && *error == GRPC_ERROR_NONE);
|
313
|
-
if (json ==
|
328
|
+
if (json.type() == Json::Type::JSON_NULL) {
|
314
329
|
// xds was mentioned as a policy in the deprecated loadBalancingPolicy
|
315
330
|
// field or in the client API.
|
316
331
|
*error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
@@ -318,36 +333,23 @@ class CdsFactory : public LoadBalancingPolicyFactory {
|
|
318
333
|
"Please use loadBalancingConfig field of service config instead.");
|
319
334
|
return nullptr;
|
320
335
|
}
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
field = field->next) {
|
326
|
-
if (field->key == nullptr) continue;
|
327
|
-
if (strcmp(field->key, "cluster") == 0) {
|
328
|
-
if (cluster != nullptr) {
|
329
|
-
error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
330
|
-
"field:cluster error:Duplicate entry"));
|
331
|
-
}
|
332
|
-
if (field->type != GRPC_JSON_STRING) {
|
333
|
-
error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
334
|
-
"field:cluster error:type should be string"));
|
335
|
-
continue;
|
336
|
-
}
|
337
|
-
cluster = field->value;
|
338
|
-
}
|
339
|
-
}
|
340
|
-
if (cluster == nullptr) {
|
336
|
+
std::vector<grpc_error*> error_list;
|
337
|
+
std::string cluster;
|
338
|
+
auto it = json.object_value().find("cluster");
|
339
|
+
if (it == json.object_value().end()) {
|
341
340
|
error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
342
341
|
"required field 'cluster' not present"));
|
343
|
-
}
|
344
|
-
|
345
|
-
|
346
|
-
grpc_core::UniquePtr<char>(gpr_strdup(cluster)));
|
342
|
+
} else if (it->second.type() != Json::Type::STRING) {
|
343
|
+
error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
344
|
+
"field:cluster error:type should be string"));
|
347
345
|
} else {
|
346
|
+
cluster = it->second.string_value();
|
347
|
+
}
|
348
|
+
if (!error_list.empty()) {
|
348
349
|
*error = GRPC_ERROR_CREATE_FROM_VECTOR("Cds Parser", &error_list);
|
349
350
|
return nullptr;
|
350
351
|
}
|
352
|
+
return MakeRefCounted<CdsConfig>(std::move(cluster));
|
351
353
|
}
|
352
354
|
};
|
353
355
|
|
@@ -362,7 +364,7 @@ class CdsFactory : public LoadBalancingPolicyFactory {
|
|
362
364
|
void grpc_lb_policy_cds_init() {
|
363
365
|
grpc_core::LoadBalancingPolicyRegistry::Builder::
|
364
366
|
RegisterLoadBalancingPolicyFactory(
|
365
|
-
|
367
|
+
absl::make_unique<grpc_core::CdsFactory>());
|
366
368
|
}
|
367
369
|
|
368
370
|
void grpc_lb_policy_cds_shutdown() {}
|
@@ -25,6 +25,8 @@
|
|
25
25
|
#include <limits.h>
|
26
26
|
#include <string.h>
|
27
27
|
|
28
|
+
#include "absl/types/optional.h"
|
29
|
+
|
28
30
|
#include <grpc/grpc.h>
|
29
31
|
#include <grpc/support/alloc.h>
|
30
32
|
#include <grpc/support/string_util.h>
|
@@ -32,6 +34,7 @@
|
|
32
34
|
|
33
35
|
#include "src/core/ext/filters/client_channel/client_channel.h"
|
34
36
|
#include "src/core/ext/filters/client_channel/lb_policy.h"
|
37
|
+
#include "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h"
|
35
38
|
#include "src/core/ext/filters/client_channel/lb_policy/xds/xds.h"
|
36
39
|
#include "src/core/ext/filters/client_channel/lb_policy_factory.h"
|
37
40
|
#include "src/core/ext/filters/client_channel/lb_policy_registry.h"
|
@@ -68,18 +71,18 @@
|
|
68
71
|
|
69
72
|
namespace grpc_core {
|
70
73
|
|
71
|
-
TraceFlag grpc_lb_xds_trace(false, "
|
74
|
+
TraceFlag grpc_lb_xds_trace(false, "xds_lb");
|
72
75
|
|
73
76
|
namespace {
|
74
77
|
|
75
78
|
constexpr char kXds[] = "xds_experimental";
|
76
79
|
|
77
|
-
class
|
80
|
+
class XdsConfig : public LoadBalancingPolicy::Config {
|
78
81
|
public:
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
82
|
+
XdsConfig(RefCountedPtr<LoadBalancingPolicy::Config> child_policy,
|
83
|
+
RefCountedPtr<LoadBalancingPolicy::Config> fallback_policy,
|
84
|
+
std::string eds_service_name,
|
85
|
+
absl::optional<std::string> lrs_load_reporting_server_name)
|
83
86
|
: child_policy_(std::move(child_policy)),
|
84
87
|
fallback_policy_(std::move(fallback_policy)),
|
85
88
|
eds_service_name_(std::move(eds_service_name)),
|
@@ -96,17 +99,19 @@ class ParsedXdsConfig : public LoadBalancingPolicy::Config {
|
|
96
99
|
return fallback_policy_;
|
97
100
|
}
|
98
101
|
|
99
|
-
const char* eds_service_name() const {
|
102
|
+
const char* eds_service_name() const {
|
103
|
+
return eds_service_name_.empty() ? nullptr : eds_service_name_.c_str();
|
104
|
+
};
|
100
105
|
|
101
|
-
const
|
102
|
-
return lrs_load_reporting_server_name_
|
106
|
+
const absl::optional<std::string>& lrs_load_reporting_server_name() const {
|
107
|
+
return lrs_load_reporting_server_name_;
|
103
108
|
};
|
104
109
|
|
105
110
|
private:
|
106
111
|
RefCountedPtr<LoadBalancingPolicy::Config> child_policy_;
|
107
112
|
RefCountedPtr<LoadBalancingPolicy::Config> fallback_policy_;
|
108
|
-
|
109
|
-
|
113
|
+
std::string eds_service_name_;
|
114
|
+
absl::optional<std::string> lrs_load_reporting_server_name_;
|
110
115
|
};
|
111
116
|
|
112
117
|
class XdsLb : public LoadBalancingPolicy {
|
@@ -121,31 +126,42 @@ class XdsLb : public LoadBalancingPolicy {
|
|
121
126
|
private:
|
122
127
|
class EndpointWatcher;
|
123
128
|
|
124
|
-
//
|
125
|
-
//
|
126
|
-
//
|
127
|
-
|
128
|
-
|
129
|
-
|
129
|
+
// A simple wrapper to convert the picker returned from a locality's child
|
130
|
+
// policy as a unique_ptr<> to a RefCountedPtr<>. This allows it to be
|
131
|
+
// referenced by both the picker and the locality.
|
132
|
+
class RefCountedEndpointPicker : public RefCounted<RefCountedEndpointPicker> {
|
133
|
+
public:
|
134
|
+
explicit RefCountedEndpointPicker(std::unique_ptr<SubchannelPicker> picker)
|
135
|
+
: picker_(std::move(picker)) {}
|
136
|
+
PickResult Pick(PickArgs args) { return picker_->Pick(std::move(args)); }
|
137
|
+
|
138
|
+
private:
|
139
|
+
std::unique_ptr<SubchannelPicker> picker_;
|
140
|
+
};
|
141
|
+
|
142
|
+
// A picker that wraps the RefCountedEndpointPicker and performs load
|
143
|
+
// reporting for the locality.
|
144
|
+
class LoadReportingPicker : public RefCounted<LoadReportingPicker> {
|
130
145
|
public:
|
131
|
-
|
132
|
-
|
133
|
-
RefCountedPtr<XdsClientStats::LocalityStats> locality_stats)
|
146
|
+
LoadReportingPicker(RefCountedPtr<RefCountedEndpointPicker> picker,
|
147
|
+
RefCountedPtr<XdsClusterLocalityStats> locality_stats)
|
134
148
|
: picker_(std::move(picker)),
|
135
|
-
locality_stats_(std::move(locality_stats)) {
|
136
|
-
locality_stats_->RefByPicker();
|
137
|
-
}
|
138
|
-
~EndpointPickerWrapper() { locality_stats_->UnrefByPicker(); }
|
149
|
+
locality_stats_(std::move(locality_stats)) {}
|
139
150
|
|
140
151
|
PickResult Pick(PickArgs args);
|
141
152
|
|
153
|
+
RefCountedEndpointPicker* picker() const { return picker_.get(); }
|
154
|
+
XdsClusterLocalityStats* locality_stats() const {
|
155
|
+
return locality_stats_.get();
|
156
|
+
}
|
157
|
+
|
142
158
|
private:
|
143
|
-
|
144
|
-
RefCountedPtr<
|
159
|
+
RefCountedPtr<RefCountedEndpointPicker> picker_;
|
160
|
+
RefCountedPtr<XdsClusterLocalityStats> locality_stats_;
|
145
161
|
};
|
146
162
|
|
147
|
-
//
|
148
|
-
// use for each request.
|
163
|
+
// A picker that uses a stateless weighting algorithm to pick the locality
|
164
|
+
// to use for each request.
|
149
165
|
class LocalityPicker : public SubchannelPicker {
|
150
166
|
public:
|
151
167
|
// Maintains a weighted list of pickers from each locality that is in ready
|
@@ -153,12 +169,12 @@ class XdsLb : public LoadBalancingPolicy {
|
|
153
169
|
// proportional to the locality's weight. The start of the range is the
|
154
170
|
// previous value in the vector and is 0 for the first element.
|
155
171
|
using PickerList =
|
156
|
-
InlinedVector<std::pair<uint32_t, RefCountedPtr<
|
172
|
+
InlinedVector<std::pair<uint32_t, RefCountedPtr<LoadReportingPicker>>,
|
157
173
|
1>;
|
158
|
-
LocalityPicker(
|
159
|
-
:
|
160
|
-
|
161
|
-
|
174
|
+
LocalityPicker(XdsLb* xds_policy, PickerList pickers)
|
175
|
+
: drop_stats_(xds_policy->drop_stats_),
|
176
|
+
drop_config_(xds_policy->drop_config_),
|
177
|
+
pickers_(std::move(pickers)) {}
|
162
178
|
|
163
179
|
PickResult Pick(PickArgs args) override;
|
164
180
|
|
@@ -166,9 +182,9 @@ class XdsLb : public LoadBalancingPolicy {
|
|
166
182
|
// Calls the picker of the locality that the key falls within.
|
167
183
|
PickResult PickFromLocality(const uint32_t key, PickArgs args);
|
168
184
|
|
169
|
-
RefCountedPtr<
|
185
|
+
RefCountedPtr<XdsClusterDropStats> drop_stats_;
|
186
|
+
RefCountedPtr<XdsApi::DropConfig> drop_config_;
|
170
187
|
PickerList pickers_;
|
171
|
-
RefCountedPtr<XdsDropConfig> drop_config_;
|
172
188
|
};
|
173
189
|
|
174
190
|
class FallbackHelper : public ChannelControlHelper {
|
@@ -185,219 +201,171 @@ class XdsLb : public LoadBalancingPolicy {
|
|
185
201
|
void RequestReresolution() override;
|
186
202
|
void AddTraceEvent(TraceSeverity severity, StringView message) override;
|
187
203
|
|
188
|
-
void set_child(LoadBalancingPolicy* child) { child_ = child; }
|
189
|
-
|
190
204
|
private:
|
191
|
-
bool CalledByPendingFallback() const;
|
192
|
-
bool CalledByCurrentFallback() const;
|
193
|
-
|
194
205
|
RefCountedPtr<XdsLb> parent_;
|
195
|
-
LoadBalancingPolicy* child_ = nullptr;
|
196
206
|
};
|
197
207
|
|
198
|
-
//
|
199
|
-
|
200
|
-
class PriorityList {
|
208
|
+
// Each LocalityMap holds a ref to the XdsLb.
|
209
|
+
class LocalityMap : public InternallyRefCounted<LocalityMap> {
|
201
210
|
public:
|
202
|
-
// Each
|
203
|
-
class
|
211
|
+
// Each Locality holds a ref to the LocalityMap it is in.
|
212
|
+
class Locality : public InternallyRefCounted<Locality> {
|
204
213
|
public:
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
Locality(RefCountedPtr<LocalityMap> locality_map,
|
209
|
-
RefCountedPtr<XdsLocalityName> name);
|
210
|
-
~Locality();
|
211
|
-
|
212
|
-
void UpdateLocked(uint32_t locality_weight,
|
213
|
-
ServerAddressList serverlist);
|
214
|
-
void ShutdownLocked();
|
215
|
-
void ResetBackoffLocked();
|
216
|
-
void DeactivateLocked();
|
217
|
-
void Orphan() override;
|
218
|
-
|
219
|
-
grpc_connectivity_state connectivity_state() const {
|
220
|
-
return connectivity_state_;
|
221
|
-
}
|
222
|
-
uint32_t weight() const { return weight_; }
|
223
|
-
RefCountedPtr<EndpointPickerWrapper> picker_wrapper() const {
|
224
|
-
return picker_wrapper_;
|
225
|
-
}
|
226
|
-
|
227
|
-
void set_locality_map(RefCountedPtr<LocalityMap> locality_map) {
|
228
|
-
locality_map_ = std::move(locality_map);
|
229
|
-
}
|
214
|
+
Locality(RefCountedPtr<LocalityMap> locality_map,
|
215
|
+
RefCountedPtr<XdsLocalityName> name);
|
216
|
+
~Locality();
|
230
217
|
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
explicit Helper(RefCountedPtr<Locality> locality)
|
235
|
-
: locality_(std::move(locality)) {}
|
236
|
-
|
237
|
-
~Helper() { locality_.reset(DEBUG_LOCATION, "Helper"); }
|
238
|
-
|
239
|
-
RefCountedPtr<SubchannelInterface> CreateSubchannel(
|
240
|
-
const grpc_channel_args& args) override;
|
241
|
-
void UpdateState(grpc_connectivity_state state,
|
242
|
-
std::unique_ptr<SubchannelPicker> picker) override;
|
243
|
-
// This is a no-op, because we get the addresses from the xds
|
244
|
-
// client, which is a watch-based API.
|
245
|
-
void RequestReresolution() override {}
|
246
|
-
void AddTraceEvent(TraceSeverity severity,
|
247
|
-
StringView message) override;
|
248
|
-
void set_child(LoadBalancingPolicy* child) { child_ = child; }
|
249
|
-
|
250
|
-
private:
|
251
|
-
bool CalledByPendingChild() const;
|
252
|
-
bool CalledByCurrentChild() const;
|
253
|
-
|
254
|
-
RefCountedPtr<Locality> locality_;
|
255
|
-
LoadBalancingPolicy* child_ = nullptr;
|
256
|
-
};
|
257
|
-
|
258
|
-
// Methods for dealing with the child policy.
|
259
|
-
OrphanablePtr<LoadBalancingPolicy> CreateChildPolicyLocked(
|
260
|
-
const char* name, const grpc_channel_args* args);
|
261
|
-
grpc_channel_args* CreateChildPolicyArgsLocked(
|
262
|
-
const grpc_channel_args* args);
|
263
|
-
|
264
|
-
static void OnDelayedRemovalTimer(void* arg, grpc_error* error);
|
265
|
-
static void OnDelayedRemovalTimerLocked(void* arg, grpc_error* error);
|
266
|
-
|
267
|
-
XdsLb* xds_policy() const { return locality_map_->xds_policy(); }
|
268
|
-
|
269
|
-
// The owning locality map.
|
270
|
-
RefCountedPtr<LocalityMap> locality_map_;
|
271
|
-
|
272
|
-
RefCountedPtr<XdsLocalityName> name_;
|
273
|
-
OrphanablePtr<LoadBalancingPolicy> child_policy_;
|
274
|
-
OrphanablePtr<LoadBalancingPolicy> pending_child_policy_;
|
275
|
-
RefCountedPtr<EndpointPickerWrapper> picker_wrapper_;
|
276
|
-
grpc_connectivity_state connectivity_state_ = GRPC_CHANNEL_IDLE;
|
277
|
-
uint32_t weight_;
|
278
|
-
|
279
|
-
// States for delayed removal.
|
280
|
-
grpc_timer delayed_removal_timer_;
|
281
|
-
grpc_closure on_delayed_removal_timer_;
|
282
|
-
bool delayed_removal_timer_callback_pending_ = false;
|
283
|
-
bool shutdown_ = false;
|
284
|
-
};
|
285
|
-
|
286
|
-
LocalityMap(RefCountedPtr<XdsLb> xds_policy, uint32_t priority);
|
287
|
-
|
288
|
-
void UpdateLocked(
|
289
|
-
const XdsPriorityListUpdate::LocalityMap& locality_map_update);
|
218
|
+
void UpdateLocked(uint32_t locality_weight, ServerAddressList serverlist,
|
219
|
+
bool update_locality_stats);
|
220
|
+
void ShutdownLocked();
|
290
221
|
void ResetBackoffLocked();
|
291
|
-
void UpdateXdsPickerLocked();
|
292
|
-
OrphanablePtr<Locality> ExtractLocalityLocked(
|
293
|
-
const RefCountedPtr<XdsLocalityName>& name);
|
294
222
|
void DeactivateLocked();
|
295
|
-
// Returns true if this locality map becomes the currently used one (i.e.,
|
296
|
-
// its priority is selected) after reactivation.
|
297
|
-
bool MaybeReactivateLocked();
|
298
|
-
void MaybeCancelFailoverTimerLocked();
|
299
|
-
|
300
223
|
void Orphan() override;
|
301
224
|
|
302
|
-
|
303
|
-
|
225
|
+
uint32_t weight() const { return weight_; }
|
226
|
+
|
304
227
|
grpc_connectivity_state connectivity_state() const {
|
305
228
|
return connectivity_state_;
|
306
229
|
}
|
307
|
-
|
308
|
-
|
230
|
+
|
231
|
+
RefCountedPtr<LoadReportingPicker> GetLoadReportingPicker() {
|
232
|
+
// Recreate load reporting picker if stats object has changed.
|
233
|
+
if (load_reporting_picker_ == nullptr ||
|
234
|
+
load_reporting_picker_->picker() != picker_wrapper_.get() ||
|
235
|
+
load_reporting_picker_->locality_stats() != stats_.get()) {
|
236
|
+
load_reporting_picker_ =
|
237
|
+
MakeRefCounted<LoadReportingPicker>(picker_wrapper_, stats_);
|
238
|
+
}
|
239
|
+
return load_reporting_picker_;
|
240
|
+
}
|
241
|
+
|
242
|
+
void set_locality_map(RefCountedPtr<LocalityMap> locality_map) {
|
243
|
+
locality_map_ = std::move(locality_map);
|
309
244
|
}
|
310
245
|
|
311
246
|
private:
|
312
|
-
|
313
|
-
|
247
|
+
class Helper : public ChannelControlHelper {
|
248
|
+
public:
|
249
|
+
explicit Helper(RefCountedPtr<Locality> locality)
|
250
|
+
: locality_(std::move(locality)) {}
|
251
|
+
|
252
|
+
~Helper() { locality_.reset(DEBUG_LOCATION, "Helper"); }
|
253
|
+
|
254
|
+
RefCountedPtr<SubchannelInterface> CreateSubchannel(
|
255
|
+
const grpc_channel_args& args) override;
|
256
|
+
void UpdateState(grpc_connectivity_state state,
|
257
|
+
std::unique_ptr<SubchannelPicker> picker) override;
|
258
|
+
// This is a no-op, because we get the addresses from the xds
|
259
|
+
// client, which is a watch-based API.
|
260
|
+
void RequestReresolution() override {}
|
261
|
+
void AddTraceEvent(TraceSeverity severity, StringView message) override;
|
262
|
+
|
263
|
+
private:
|
264
|
+
RefCountedPtr<Locality> locality_;
|
265
|
+
};
|
266
|
+
|
267
|
+
// Methods for dealing with the child policy.
|
268
|
+
OrphanablePtr<LoadBalancingPolicy> CreateChildPolicyLocked(
|
269
|
+
const grpc_channel_args* args);
|
270
|
+
grpc_channel_args* CreateChildPolicyArgsLocked(
|
271
|
+
const grpc_channel_args* args);
|
272
|
+
|
273
|
+
void UpdateLocalityStats();
|
274
|
+
|
314
275
|
static void OnDelayedRemovalTimer(void* arg, grpc_error* error);
|
315
|
-
static void OnFailoverTimer(void* arg, grpc_error* error);
|
316
276
|
static void OnDelayedRemovalTimerLocked(void* arg, grpc_error* error);
|
317
|
-
static void OnFailoverTimerLocked(void* arg, grpc_error* error);
|
318
277
|
|
319
|
-
|
320
|
-
return &xds_policy_->priority_list_;
|
321
|
-
}
|
322
|
-
const XdsPriorityListUpdate& priority_list_update() const {
|
323
|
-
return xds_policy_->priority_list_update_;
|
324
|
-
}
|
325
|
-
const XdsPriorityListUpdate::LocalityMap* locality_map_update() const {
|
326
|
-
return xds_policy_->priority_list_update_.Find(priority_);
|
327
|
-
}
|
278
|
+
XdsLb* xds_policy() const { return locality_map_->xds_policy(); }
|
328
279
|
|
329
|
-
|
280
|
+
// The owning locality map.
|
281
|
+
RefCountedPtr<LocalityMap> locality_map_;
|
330
282
|
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
283
|
+
RefCountedPtr<XdsLocalityName> name_;
|
284
|
+
RefCountedPtr<XdsClusterLocalityStats> stats_;
|
285
|
+
OrphanablePtr<LoadBalancingPolicy> child_policy_;
|
286
|
+
RefCountedPtr<RefCountedEndpointPicker> picker_wrapper_;
|
287
|
+
RefCountedPtr<LoadReportingPicker> load_reporting_picker_;
|
335
288
|
grpc_connectivity_state connectivity_state_ = GRPC_CHANNEL_IDLE;
|
289
|
+
uint32_t weight_;
|
336
290
|
|
337
291
|
// States for delayed removal.
|
338
292
|
grpc_timer delayed_removal_timer_;
|
339
293
|
grpc_closure on_delayed_removal_timer_;
|
340
294
|
bool delayed_removal_timer_callback_pending_ = false;
|
341
|
-
|
342
|
-
// States of failover.
|
343
|
-
grpc_timer failover_timer_;
|
344
|
-
grpc_closure on_failover_timer_;
|
345
|
-
bool failover_timer_callback_pending_ = false;
|
295
|
+
bool shutdown_ = false;
|
346
296
|
};
|
347
297
|
|
348
|
-
|
298
|
+
LocalityMap(RefCountedPtr<XdsLb> xds_policy, uint32_t priority);
|
349
299
|
|
350
|
-
|
300
|
+
~LocalityMap() { xds_policy_.reset(DEBUG_LOCATION, "LocalityMap"); }
|
301
|
+
|
302
|
+
void UpdateLocked(
|
303
|
+
const XdsApi::PriorityListUpdate::LocalityMap& priority_update,
|
304
|
+
bool update_locality_stats);
|
351
305
|
void ResetBackoffLocked();
|
352
|
-
void ShutdownLocked();
|
353
306
|
void UpdateXdsPickerLocked();
|
354
|
-
|
355
|
-
|
356
|
-
|
307
|
+
OrphanablePtr<Locality> ExtractLocalityLocked(
|
308
|
+
const RefCountedPtr<XdsLocalityName>& name);
|
309
|
+
void DeactivateLocked();
|
310
|
+
// Returns true if this locality map becomes the currently used one (i.e.,
|
311
|
+
// its priority is selected) after reactivation.
|
312
|
+
bool MaybeReactivateLocked();
|
313
|
+
void MaybeCancelFailoverTimerLocked();
|
314
|
+
|
315
|
+
void Orphan() override;
|
316
|
+
|
317
|
+
XdsLb* xds_policy() const { return xds_policy_.get(); }
|
318
|
+
uint32_t priority() const { return priority_; }
|
319
|
+
grpc_connectivity_state connectivity_state() const {
|
320
|
+
return connectivity_state_;
|
321
|
+
}
|
322
|
+
bool failover_timer_callback_pending() const {
|
323
|
+
return failover_timer_callback_pending_;
|
357
324
|
}
|
358
|
-
uint32_t current_priority() const { return current_priority_; }
|
359
325
|
|
360
326
|
private:
|
361
|
-
void
|
362
|
-
void
|
363
|
-
void
|
364
|
-
void
|
365
|
-
void
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
327
|
+
void OnLocalityStateUpdateLocked();
|
328
|
+
void UpdateConnectivityStateLocked();
|
329
|
+
static void OnDelayedRemovalTimer(void* arg, grpc_error* error);
|
330
|
+
static void OnFailoverTimer(void* arg, grpc_error* error);
|
331
|
+
static void OnDelayedRemovalTimerLocked(void* arg, grpc_error* error);
|
332
|
+
static void OnFailoverTimerLocked(void* arg, grpc_error* error);
|
333
|
+
|
334
|
+
const XdsApi::PriorityListUpdate& priority_list_update() const {
|
335
|
+
return xds_policy_->priority_list_update_;
|
336
|
+
}
|
337
|
+
const XdsApi::PriorityListUpdate::LocalityMap* locality_map_update() const {
|
338
|
+
return xds_policy_->priority_list_update_.Find(priority_);
|
371
339
|
}
|
372
|
-
bool Contains(uint32_t priority) { return priority < priorities_.size(); }
|
373
340
|
|
374
|
-
XdsLb
|
341
|
+
RefCountedPtr<XdsLb> xds_policy_;
|
375
342
|
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
343
|
+
std::map<RefCountedPtr<XdsLocalityName>, OrphanablePtr<Locality>,
|
344
|
+
XdsLocalityName::Less>
|
345
|
+
localities_;
|
346
|
+
const uint32_t priority_;
|
347
|
+
grpc_connectivity_state connectivity_state_ = GRPC_CHANNEL_IDLE;
|
348
|
+
|
349
|
+
// States for delayed removal.
|
350
|
+
grpc_timer delayed_removal_timer_;
|
351
|
+
grpc_closure on_delayed_removal_timer_;
|
352
|
+
bool delayed_removal_timer_callback_pending_ = false;
|
353
|
+
|
354
|
+
// States of failover.
|
355
|
+
grpc_timer failover_timer_;
|
356
|
+
grpc_closure on_failover_timer_;
|
357
|
+
bool failover_timer_callback_pending_ = false;
|
381
358
|
};
|
382
359
|
|
383
360
|
~XdsLb();
|
384
361
|
|
385
362
|
void ShutdownLocked() override;
|
386
363
|
|
387
|
-
// Methods for dealing with fallback state.
|
388
|
-
void MaybeCancelFallbackAtStartupChecks();
|
389
|
-
static void OnFallbackTimer(void* arg, grpc_error* error);
|
390
|
-
static void OnFallbackTimerLocked(void* arg, grpc_error* error);
|
391
|
-
void UpdateFallbackPolicyLocked();
|
392
|
-
OrphanablePtr<LoadBalancingPolicy> CreateFallbackPolicyLocked(
|
393
|
-
const char* name, const grpc_channel_args* args);
|
394
|
-
void MaybeExitFallbackMode();
|
395
|
-
|
396
364
|
const char* eds_service_name() const {
|
397
365
|
if (config_ != nullptr && config_->eds_service_name() != nullptr) {
|
398
366
|
return config_->eds_service_name();
|
399
367
|
}
|
400
|
-
return server_name_.
|
368
|
+
return server_name_.c_str();
|
401
369
|
}
|
402
370
|
|
403
371
|
XdsClient* xds_client() const {
|
@@ -405,12 +373,36 @@ class XdsLb : public LoadBalancingPolicy {
|
|
405
373
|
: xds_client_.get();
|
406
374
|
}
|
407
375
|
|
376
|
+
void UpdatePrioritiesLocked(bool update_locality_stats);
|
377
|
+
void UpdateXdsPickerLocked();
|
378
|
+
void MaybeCreateLocalityMapLocked(uint32_t priority);
|
379
|
+
void FailoverOnConnectionFailureLocked();
|
380
|
+
void FailoverOnDisconnectionLocked(uint32_t failed_priority);
|
381
|
+
void SwitchToHigherPriorityLocked(uint32_t priority);
|
382
|
+
void DeactivatePrioritiesLowerThan(uint32_t priority);
|
383
|
+
OrphanablePtr<LocalityMap::Locality> ExtractLocalityLocked(
|
384
|
+
const RefCountedPtr<XdsLocalityName>& name, uint32_t exclude_priority);
|
385
|
+
// Callers should make sure the priority list is non-empty.
|
386
|
+
uint32_t LowestPriority() const {
|
387
|
+
return static_cast<uint32_t>(priorities_.size()) - 1;
|
388
|
+
}
|
389
|
+
bool Contains(uint32_t priority) { return priority < priorities_.size(); }
|
390
|
+
|
391
|
+
// Methods for dealing with fallback state.
|
392
|
+
void MaybeCancelFallbackAtStartupChecks();
|
393
|
+
static void OnFallbackTimer(void* arg, grpc_error* error);
|
394
|
+
static void OnFallbackTimerLocked(void* arg, grpc_error* error);
|
395
|
+
void UpdateFallbackPolicyLocked();
|
396
|
+
OrphanablePtr<LoadBalancingPolicy> CreateFallbackPolicyLocked(
|
397
|
+
const grpc_channel_args* args);
|
398
|
+
void MaybeExitFallbackMode();
|
399
|
+
|
408
400
|
// Server name from target URI.
|
409
|
-
|
401
|
+
std::string server_name_;
|
410
402
|
|
411
403
|
// Current channel args and config from the resolver.
|
412
404
|
const grpc_channel_args* args_ = nullptr;
|
413
|
-
RefCountedPtr<
|
405
|
+
RefCountedPtr<XdsConfig> config_;
|
414
406
|
|
415
407
|
// Internal state.
|
416
408
|
bool shutting_down_ = false;
|
@@ -444,27 +436,29 @@ class XdsLb : public LoadBalancingPolicy {
|
|
444
436
|
|
445
437
|
// Non-null iff we are in fallback mode.
|
446
438
|
OrphanablePtr<LoadBalancingPolicy> fallback_policy_;
|
447
|
-
OrphanablePtr<LoadBalancingPolicy> pending_fallback_policy_;
|
448
439
|
|
449
440
|
const grpc_millis locality_retention_interval_ms_;
|
450
441
|
const grpc_millis locality_map_failover_timeout_ms_;
|
451
|
-
//
|
452
|
-
|
442
|
+
// The list of locality maps, indexed by priority. P0 is the highest
|
443
|
+
// priority.
|
444
|
+
InlinedVector<OrphanablePtr<LocalityMap>, 2> priorities_;
|
445
|
+
// The priority that is being used.
|
446
|
+
uint32_t current_priority_ = UINT32_MAX;
|
453
447
|
// The update for priority_list_.
|
454
|
-
|
448
|
+
XdsApi::PriorityListUpdate priority_list_update_;
|
455
449
|
|
456
450
|
// The config for dropping calls.
|
457
|
-
RefCountedPtr<
|
451
|
+
RefCountedPtr<XdsApi::DropConfig> drop_config_;
|
458
452
|
|
459
|
-
//
|
460
|
-
|
453
|
+
// Drop stats for client-side load reporting.
|
454
|
+
RefCountedPtr<XdsClusterDropStats> drop_stats_;
|
461
455
|
};
|
462
456
|
|
463
457
|
//
|
464
|
-
// XdsLb::
|
458
|
+
// XdsLb::LoadReportingPicker
|
465
459
|
//
|
466
460
|
|
467
|
-
LoadBalancingPolicy::PickResult XdsLb::
|
461
|
+
LoadBalancingPolicy::PickResult XdsLb::LoadReportingPicker::Pick(
|
468
462
|
LoadBalancingPolicy::PickArgs args) {
|
469
463
|
// Forward the pick to the picker returned from the child policy.
|
470
464
|
PickResult result = picker_->Pick(args);
|
@@ -475,7 +469,7 @@ LoadBalancingPolicy::PickResult XdsLb::EndpointPickerWrapper::Pick(
|
|
475
469
|
// Record a call started.
|
476
470
|
locality_stats_->AddCallStarted();
|
477
471
|
// Intercept the recv_trailing_metadata op to record call completion.
|
478
|
-
|
472
|
+
XdsClusterLocalityStats* locality_stats =
|
479
473
|
locality_stats_->Ref(DEBUG_LOCATION, "LocalityStats+call").release();
|
480
474
|
result.recv_trailing_metadata_ready =
|
481
475
|
// Note: This callback does not run in either the control plane
|
@@ -495,13 +489,23 @@ LoadBalancingPolicy::PickResult XdsLb::EndpointPickerWrapper::Pick(
|
|
495
489
|
|
496
490
|
XdsLb::PickResult XdsLb::LocalityPicker::Pick(PickArgs args) {
|
497
491
|
// Handle drop.
|
498
|
-
const
|
492
|
+
const std::string* drop_category;
|
499
493
|
if (drop_config_->ShouldDrop(&drop_category)) {
|
500
|
-
|
494
|
+
if (drop_stats_ != nullptr) drop_stats_->AddCallDropped(*drop_category);
|
501
495
|
PickResult result;
|
502
496
|
result.type = PickResult::PICK_COMPLETE;
|
503
497
|
return result;
|
504
498
|
}
|
499
|
+
// If we didn't drop, we better have some localities to pick from.
|
500
|
+
if (pickers_.empty()) { // Should never happen.
|
501
|
+
PickResult result;
|
502
|
+
result.type = PickResult::PICK_FAILED;
|
503
|
+
result.error =
|
504
|
+
grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
505
|
+
"xds picker not given any localities"),
|
506
|
+
GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_INTERNAL);
|
507
|
+
return result;
|
508
|
+
}
|
505
509
|
// Generate a random number in [0, total weight).
|
506
510
|
const uint32_t key = rand() % pickers_[pickers_.size() - 1].first;
|
507
511
|
// Forward pick to whichever locality maps to the range in which the
|
@@ -535,71 +539,26 @@ XdsLb::PickResult XdsLb::LocalityPicker::PickFromLocality(const uint32_t key,
|
|
535
539
|
// XdsLb::FallbackHelper
|
536
540
|
//
|
537
541
|
|
538
|
-
bool XdsLb::FallbackHelper::CalledByPendingFallback() const {
|
539
|
-
GPR_ASSERT(child_ != nullptr);
|
540
|
-
return child_ == parent_->pending_fallback_policy_.get();
|
541
|
-
}
|
542
|
-
|
543
|
-
bool XdsLb::FallbackHelper::CalledByCurrentFallback() const {
|
544
|
-
GPR_ASSERT(child_ != nullptr);
|
545
|
-
return child_ == parent_->fallback_policy_.get();
|
546
|
-
}
|
547
|
-
|
548
542
|
RefCountedPtr<SubchannelInterface> XdsLb::FallbackHelper::CreateSubchannel(
|
549
543
|
const grpc_channel_args& args) {
|
550
|
-
if (parent_->shutting_down_
|
551
|
-
(!CalledByPendingFallback() && !CalledByCurrentFallback())) {
|
552
|
-
return nullptr;
|
553
|
-
}
|
544
|
+
if (parent_->shutting_down_) return nullptr;
|
554
545
|
return parent_->channel_control_helper()->CreateSubchannel(args);
|
555
546
|
}
|
556
547
|
|
557
548
|
void XdsLb::FallbackHelper::UpdateState(
|
558
549
|
grpc_connectivity_state state, std::unique_ptr<SubchannelPicker> picker) {
|
559
550
|
if (parent_->shutting_down_) return;
|
560
|
-
// If this request is from the pending fallback policy, ignore it until
|
561
|
-
// it reports READY, at which point we swap it into place.
|
562
|
-
if (CalledByPendingFallback()) {
|
563
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
|
564
|
-
gpr_log(
|
565
|
-
GPR_INFO,
|
566
|
-
"[xdslb %p helper %p] pending fallback policy %p reports state=%s",
|
567
|
-
parent_.get(), this, parent_->pending_fallback_policy_.get(),
|
568
|
-
ConnectivityStateName(state));
|
569
|
-
}
|
570
|
-
if (state != GRPC_CHANNEL_READY) return;
|
571
|
-
grpc_pollset_set_del_pollset_set(
|
572
|
-
parent_->fallback_policy_->interested_parties(),
|
573
|
-
parent_->interested_parties());
|
574
|
-
parent_->fallback_policy_ = std::move(parent_->pending_fallback_policy_);
|
575
|
-
} else if (!CalledByCurrentFallback()) {
|
576
|
-
// This request is from an outdated fallback policy, so ignore it.
|
577
|
-
return;
|
578
|
-
}
|
579
551
|
parent_->channel_control_helper()->UpdateState(state, std::move(picker));
|
580
552
|
}
|
581
553
|
|
582
554
|
void XdsLb::FallbackHelper::RequestReresolution() {
|
583
555
|
if (parent_->shutting_down_) return;
|
584
|
-
const LoadBalancingPolicy* latest_fallback_policy =
|
585
|
-
parent_->pending_fallback_policy_ != nullptr
|
586
|
-
? parent_->pending_fallback_policy_.get()
|
587
|
-
: parent_->fallback_policy_.get();
|
588
|
-
if (child_ != latest_fallback_policy) return;
|
589
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
|
590
|
-
gpr_log(GPR_INFO,
|
591
|
-
"[xdslb %p] Re-resolution requested from the fallback policy (%p).",
|
592
|
-
parent_.get(), child_);
|
593
|
-
}
|
594
556
|
parent_->channel_control_helper()->RequestReresolution();
|
595
557
|
}
|
596
558
|
|
597
559
|
void XdsLb::FallbackHelper::AddTraceEvent(TraceSeverity severity,
|
598
560
|
StringView message) {
|
599
|
-
if (parent_->shutting_down_
|
600
|
-
(!CalledByPendingFallback() && !CalledByCurrentFallback())) {
|
601
|
-
return;
|
602
|
-
}
|
561
|
+
if (parent_->shutting_down_) return;
|
603
562
|
parent_->channel_control_helper()->AddTraceEvent(severity, message);
|
604
563
|
}
|
605
564
|
|
@@ -612,14 +571,16 @@ class XdsLb::EndpointWatcher : public XdsClient::EndpointWatcherInterface {
|
|
612
571
|
explicit EndpointWatcher(RefCountedPtr<XdsLb> xds_policy)
|
613
572
|
: xds_policy_(std::move(xds_policy)) {}
|
614
573
|
|
615
|
-
|
574
|
+
~EndpointWatcher() { xds_policy_.reset(DEBUG_LOCATION, "EndpointWatcher"); }
|
575
|
+
|
576
|
+
void OnEndpointChanged(XdsApi::EdsUpdate update) override {
|
616
577
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
|
617
578
|
gpr_log(GPR_INFO, "[xdslb %p] Received EDS update from xds client",
|
618
579
|
xds_policy_.get());
|
619
580
|
}
|
620
581
|
// If the balancer tells us to drop all the calls, we should exit fallback
|
621
582
|
// mode immediately.
|
622
|
-
if (update.drop_all) xds_policy_->MaybeExitFallbackMode();
|
583
|
+
if (update.drop_config->drop_all()) xds_policy_->MaybeExitFallbackMode();
|
623
584
|
// Update the drop config.
|
624
585
|
const bool drop_config_changed =
|
625
586
|
xds_policy_->drop_config_ == nullptr ||
|
@@ -634,13 +595,13 @@ class XdsLb::EndpointWatcher : public XdsClient::EndpointWatcherInterface {
|
|
634
595
|
xds_policy_.get(), drop_config_changed);
|
635
596
|
}
|
636
597
|
if (drop_config_changed) {
|
637
|
-
xds_policy_->
|
598
|
+
xds_policy_->UpdateXdsPickerLocked();
|
638
599
|
}
|
639
600
|
return;
|
640
601
|
}
|
641
602
|
// Update the priority list.
|
642
603
|
xds_policy_->priority_list_update_ = std::move(update.priority_list_update);
|
643
|
-
xds_policy_->
|
604
|
+
xds_policy_->UpdatePrioritiesLocked(false /*update_locality_stats*/);
|
644
605
|
}
|
645
606
|
|
646
607
|
void OnError(grpc_error* error) override {
|
@@ -670,6 +631,9 @@ class XdsLb::EndpointWatcher : public XdsClient::EndpointWatcherInterface {
|
|
670
631
|
if (strstr(grpc_error_string(error), "xds call failed")) {
|
671
632
|
xds_policy_->channel_control_helper()->RequestReresolution();
|
672
633
|
}
|
634
|
+
} else if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
|
635
|
+
gpr_log(GPR_INFO, "[xdslb %p] xds watcher reported error (ignoring): %s",
|
636
|
+
xds_policy_.get(), grpc_error_string(error));
|
673
637
|
}
|
674
638
|
GRPC_ERROR_UNREF(error);
|
675
639
|
}
|
@@ -693,11 +657,9 @@ XdsLb::XdsLb(Args args)
|
|
693
657
|
{GRPC_XDS_DEFAULT_LOCALITY_RETENTION_INTERVAL_MS, 0, INT_MAX})),
|
694
658
|
locality_map_failover_timeout_ms_(grpc_channel_args_find_integer(
|
695
659
|
args.args, GRPC_ARG_XDS_FAILOVER_TIMEOUT_MS,
|
696
|
-
{GRPC_XDS_DEFAULT_FAILOVER_TIMEOUT_MS, 0, INT_MAX}))
|
697
|
-
|
698
|
-
|
699
|
-
GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
|
700
|
-
gpr_log(GPR_INFO, "[xdslb %p] Using xds client %p from channel", this,
|
660
|
+
{GRPC_XDS_DEFAULT_FAILOVER_TIMEOUT_MS, 0, INT_MAX})) {
|
661
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
|
662
|
+
gpr_log(GPR_INFO, "[xdslb %p] created -- xds client from channel: %p", this,
|
701
663
|
xds_client_from_channel_.get());
|
702
664
|
}
|
703
665
|
// Record server name.
|
@@ -706,11 +668,10 @@ XdsLb::XdsLb(Args args)
|
|
706
668
|
GPR_ASSERT(server_uri != nullptr);
|
707
669
|
grpc_uri* uri = grpc_uri_parse(server_uri, true);
|
708
670
|
GPR_ASSERT(uri->path[0] != '\0');
|
709
|
-
server_name_
|
710
|
-
gpr_strdup(uri->path[0] == '/' ? uri->path + 1 : uri->path));
|
671
|
+
server_name_ = uri->path[0] == '/' ? uri->path + 1 : uri->path;
|
711
672
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
|
712
673
|
gpr_log(GPR_INFO, "[xdslb %p] server name from channel: %s", this,
|
713
|
-
server_name_.
|
674
|
+
server_name_.c_str());
|
714
675
|
}
|
715
676
|
grpc_uri_destroy(uri);
|
716
677
|
}
|
@@ -728,27 +689,26 @@ void XdsLb::ShutdownLocked() {
|
|
728
689
|
}
|
729
690
|
shutting_down_ = true;
|
730
691
|
MaybeCancelFallbackAtStartupChecks();
|
731
|
-
|
692
|
+
priorities_.clear();
|
693
|
+
drop_stats_.reset();
|
732
694
|
if (fallback_policy_ != nullptr) {
|
733
695
|
grpc_pollset_set_del_pollset_set(fallback_policy_->interested_parties(),
|
734
696
|
interested_parties());
|
697
|
+
fallback_policy_.reset();
|
735
698
|
}
|
736
|
-
if
|
737
|
-
|
738
|
-
|
699
|
+
// Cancel the endpoint watch here instead of in our dtor if we are using the
|
700
|
+
// XdsResolver, because the watcher holds a ref to us and we might not be
|
701
|
+
// destroying the Xds client leading to a situation where the Xds lb policy is
|
702
|
+
// never destroyed.
|
703
|
+
if (xds_client_from_channel_ != nullptr) {
|
704
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
|
705
|
+
gpr_log(GPR_INFO, "[xdslb %p] cancelling watch for %s", this,
|
706
|
+
eds_service_name());
|
707
|
+
}
|
708
|
+
xds_client()->CancelEndpointDataWatch(StringView(eds_service_name()),
|
709
|
+
endpoint_watcher_);
|
710
|
+
xds_client_from_channel_.reset();
|
739
711
|
}
|
740
|
-
fallback_policy_.reset();
|
741
|
-
pending_fallback_policy_.reset();
|
742
|
-
// Cancel the endpoint watch here instead of in our dtor, because the
|
743
|
-
// watcher holds a ref to us.
|
744
|
-
xds_client()->CancelEndpointDataWatch(StringView(eds_service_name()),
|
745
|
-
endpoint_watcher_);
|
746
|
-
if (config_->lrs_load_reporting_server_name() != nullptr) {
|
747
|
-
xds_client()->RemoveClientStats(
|
748
|
-
StringView(config_->lrs_load_reporting_server_name()),
|
749
|
-
StringView(eds_service_name()), &client_stats_);
|
750
|
-
}
|
751
|
-
xds_client_from_channel_.reset();
|
752
712
|
xds_client_.reset();
|
753
713
|
}
|
754
714
|
|
@@ -761,13 +721,12 @@ void XdsLb::ResetBackoffLocked() {
|
|
761
721
|
// LB policy, this is done via the resolver, so we don't need to do it
|
762
722
|
// for xds_client_from_channel_ here.
|
763
723
|
if (xds_client_ != nullptr) xds_client_->ResetBackoff();
|
764
|
-
|
724
|
+
for (size_t i = 0; i < priorities_.size(); ++i) {
|
725
|
+
priorities_[i]->ResetBackoffLocked();
|
726
|
+
}
|
765
727
|
if (fallback_policy_ != nullptr) {
|
766
728
|
fallback_policy_->ResetBackoffLocked();
|
767
729
|
}
|
768
|
-
if (pending_fallback_policy_ != nullptr) {
|
769
|
-
pending_fallback_policy_->ResetBackoffLocked();
|
770
|
-
}
|
771
730
|
}
|
772
731
|
|
773
732
|
void XdsLb::UpdateLocked(UpdateArgs args) {
|
@@ -776,7 +735,6 @@ void XdsLb::UpdateLocked(UpdateArgs args) {
|
|
776
735
|
}
|
777
736
|
const bool is_initial_update = args_ == nullptr;
|
778
737
|
// Update config.
|
779
|
-
const char* old_eds_service_name = eds_service_name();
|
780
738
|
auto old_config = std::move(config_);
|
781
739
|
config_ = std::move(args.config);
|
782
740
|
// Update fallback address list.
|
@@ -785,8 +743,6 @@ void XdsLb::UpdateLocked(UpdateArgs args) {
|
|
785
743
|
grpc_channel_args_destroy(args_);
|
786
744
|
args_ = args.args;
|
787
745
|
args.args = nullptr;
|
788
|
-
// Update priority list.
|
789
|
-
priority_list_.UpdateLocked();
|
790
746
|
// Update the existing fallback policy. The fallback policy config and/or the
|
791
747
|
// fallback addresses may be new.
|
792
748
|
if (fallback_policy_ != nullptr) UpdateFallbackPolicyLocked();
|
@@ -813,41 +769,40 @@ void XdsLb::UpdateLocked(UpdateArgs args) {
|
|
813
769
|
fallback_at_startup_checks_pending_ = true;
|
814
770
|
grpc_timer_init(&lb_fallback_timer_, deadline, &lb_on_fallback_);
|
815
771
|
}
|
816
|
-
// Update
|
817
|
-
if (is_initial_update ||
|
818
|
-
|
819
|
-
|
820
|
-
|
821
|
-
|
772
|
+
// Update drop stats for load reporting if needed.
|
773
|
+
if (is_initial_update || config_->lrs_load_reporting_server_name() !=
|
774
|
+
old_config->lrs_load_reporting_server_name()) {
|
775
|
+
drop_stats_.reset();
|
776
|
+
if (config_->lrs_load_reporting_server_name().has_value()) {
|
777
|
+
drop_stats_ = xds_client()->AddClusterDropStats(
|
778
|
+
config_->lrs_load_reporting_server_name().value(),
|
779
|
+
// TODO(roth): We currently hard-code the assumption that
|
780
|
+
// cluster name and EDS service name are the same. Fix this
|
781
|
+
// as part of refectoring this LB policy.
|
782
|
+
eds_service_name(), eds_service_name());
|
822
783
|
}
|
823
|
-
|
784
|
+
}
|
785
|
+
// On the initial update, create the endpoint watcher.
|
786
|
+
if (is_initial_update) {
|
787
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
|
788
|
+
gpr_log(GPR_INFO, "[xdslb %p] starting watch for %s", this,
|
789
|
+
eds_service_name());
|
790
|
+
}
|
791
|
+
auto watcher = absl::make_unique<EndpointWatcher>(
|
792
|
+
Ref(DEBUG_LOCATION, "EndpointWatcher"));
|
824
793
|
endpoint_watcher_ = watcher.get();
|
825
794
|
xds_client()->WatchEndpointData(StringView(eds_service_name()),
|
826
795
|
std::move(watcher));
|
827
|
-
}
|
828
|
-
|
829
|
-
|
830
|
-
|
831
|
-
|
832
|
-
|
833
|
-
|
834
|
-
|
835
|
-
|
836
|
-
|
837
|
-
old_config->lrs_load_reporting_server_name() != nullptr &&
|
838
|
-
strcmp(config_->lrs_load_reporting_server_name(),
|
839
|
-
old_config->lrs_load_reporting_server_name()) != 0)) {
|
840
|
-
if (old_config != nullptr &&
|
841
|
-
old_config->lrs_load_reporting_server_name() != nullptr) {
|
842
|
-
xds_client()->RemoveClientStats(
|
843
|
-
StringView(old_config->lrs_load_reporting_server_name()),
|
844
|
-
StringView(old_eds_service_name), &client_stats_);
|
845
|
-
}
|
846
|
-
if (config_->lrs_load_reporting_server_name() != nullptr) {
|
847
|
-
xds_client()->AddClientStats(
|
848
|
-
StringView(config_->lrs_load_reporting_server_name()),
|
849
|
-
StringView(eds_service_name()), &client_stats_);
|
850
|
-
}
|
796
|
+
} else {
|
797
|
+
// Update priority list.
|
798
|
+
// Note that this comes after updating drop_stats_, since we want that
|
799
|
+
// to be used by any new picker we create here.
|
800
|
+
// No need to do this on the initial update, since there won't be any
|
801
|
+
// priorities to update yet.
|
802
|
+
const bool update_locality_stats =
|
803
|
+
config_->lrs_load_reporting_server_name() !=
|
804
|
+
old_config->lrs_load_reporting_server_name();
|
805
|
+
UpdatePrioritiesLocked(update_locality_stats);
|
851
806
|
}
|
852
807
|
}
|
853
808
|
|
@@ -890,127 +845,37 @@ void XdsLb::OnFallbackTimerLocked(void* arg, grpc_error* error) {
|
|
890
845
|
|
891
846
|
void XdsLb::UpdateFallbackPolicyLocked() {
|
892
847
|
if (shutting_down_) return;
|
893
|
-
//
|
848
|
+
// Create policy if needed.
|
849
|
+
if (fallback_policy_ == nullptr) {
|
850
|
+
fallback_policy_ = CreateFallbackPolicyLocked(args_);
|
851
|
+
GPR_ASSERT(fallback_policy_ != nullptr);
|
852
|
+
}
|
853
|
+
// Perform update.
|
894
854
|
UpdateArgs update_args;
|
895
855
|
update_args.addresses = fallback_backend_addresses_;
|
896
856
|
update_args.config = config_->fallback_policy();
|
897
857
|
update_args.args = grpc_channel_args_copy(args_);
|
898
|
-
// If the child policy name changes, we need to create a new child
|
899
|
-
// policy. When this happens, we leave child_policy_ as-is and store
|
900
|
-
// the new child policy in pending_child_policy_. Once the new child
|
901
|
-
// policy transitions into state READY, we swap it into child_policy_,
|
902
|
-
// replacing the original child policy. So pending_child_policy_ is
|
903
|
-
// non-null only between when we apply an update that changes the child
|
904
|
-
// policy name and when the new child reports state READY.
|
905
|
-
//
|
906
|
-
// Updates can arrive at any point during this transition. We always
|
907
|
-
// apply updates relative to the most recently created child policy,
|
908
|
-
// even if the most recent one is still in pending_child_policy_. This
|
909
|
-
// is true both when applying the updates to an existing child policy
|
910
|
-
// and when determining whether we need to create a new policy.
|
911
|
-
//
|
912
|
-
// As a result of this, there are several cases to consider here:
|
913
|
-
//
|
914
|
-
// 1. We have no existing child policy (i.e., we have started up but
|
915
|
-
// have not yet received a serverlist from the balancer or gone
|
916
|
-
// into fallback mode; in this case, both child_policy_ and
|
917
|
-
// pending_child_policy_ are null). In this case, we create a
|
918
|
-
// new child policy and store it in child_policy_.
|
919
|
-
//
|
920
|
-
// 2. We have an existing child policy and have no pending child policy
|
921
|
-
// from a previous update (i.e., either there has not been a
|
922
|
-
// previous update that changed the policy name, or we have already
|
923
|
-
// finished swapping in the new policy; in this case, child_policy_
|
924
|
-
// is non-null but pending_child_policy_ is null). In this case:
|
925
|
-
// a. If child_policy_->name() equals child_policy_name, then we
|
926
|
-
// update the existing child policy.
|
927
|
-
// b. If child_policy_->name() does not equal child_policy_name,
|
928
|
-
// we create a new policy. The policy will be stored in
|
929
|
-
// pending_child_policy_ and will later be swapped into
|
930
|
-
// child_policy_ by the helper when the new child transitions
|
931
|
-
// into state READY.
|
932
|
-
//
|
933
|
-
// 3. We have an existing child policy and have a pending child policy
|
934
|
-
// from a previous update (i.e., a previous update set
|
935
|
-
// pending_child_policy_ as per case 2b above and that policy has
|
936
|
-
// not yet transitioned into state READY and been swapped into
|
937
|
-
// child_policy_; in this case, both child_policy_ and
|
938
|
-
// pending_child_policy_ are non-null). In this case:
|
939
|
-
// a. If pending_child_policy_->name() equals child_policy_name,
|
940
|
-
// then we update the existing pending child policy.
|
941
|
-
// b. If pending_child_policy->name() does not equal
|
942
|
-
// child_policy_name, then we create a new policy. The new
|
943
|
-
// policy is stored in pending_child_policy_ (replacing the one
|
944
|
-
// that was there before, which will be immediately shut down)
|
945
|
-
// and will later be swapped into child_policy_ by the helper
|
946
|
-
// when the new child transitions into state READY.
|
947
|
-
const char* fallback_policy_name = update_args.config == nullptr
|
948
|
-
? "round_robin"
|
949
|
-
: update_args.config->name();
|
950
|
-
const bool create_policy =
|
951
|
-
// case 1
|
952
|
-
fallback_policy_ == nullptr ||
|
953
|
-
// case 2b
|
954
|
-
(pending_fallback_policy_ == nullptr &&
|
955
|
-
strcmp(fallback_policy_->name(), fallback_policy_name) != 0) ||
|
956
|
-
// case 3b
|
957
|
-
(pending_fallback_policy_ != nullptr &&
|
958
|
-
strcmp(pending_fallback_policy_->name(), fallback_policy_name) != 0);
|
959
|
-
LoadBalancingPolicy* policy_to_update = nullptr;
|
960
|
-
if (create_policy) {
|
961
|
-
// Cases 1, 2b, and 3b: create a new child policy.
|
962
|
-
// If child_policy_ is null, we set it (case 1), else we set
|
963
|
-
// pending_child_policy_ (cases 2b and 3b).
|
964
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
|
965
|
-
gpr_log(GPR_INFO, "[xdslb %p] Creating new %sfallback policy %s", this,
|
966
|
-
fallback_policy_ == nullptr ? "" : "pending ",
|
967
|
-
fallback_policy_name);
|
968
|
-
}
|
969
|
-
auto& lb_policy = fallback_policy_ == nullptr ? fallback_policy_
|
970
|
-
: pending_fallback_policy_;
|
971
|
-
lb_policy =
|
972
|
-
CreateFallbackPolicyLocked(fallback_policy_name, update_args.args);
|
973
|
-
policy_to_update = lb_policy.get();
|
974
|
-
} else {
|
975
|
-
// Cases 2a and 3a: update an existing policy.
|
976
|
-
// If we have a pending child policy, send the update to the pending
|
977
|
-
// policy (case 3a), else send it to the current policy (case 2a).
|
978
|
-
policy_to_update = pending_fallback_policy_ != nullptr
|
979
|
-
? pending_fallback_policy_.get()
|
980
|
-
: fallback_policy_.get();
|
981
|
-
}
|
982
|
-
GPR_ASSERT(policy_to_update != nullptr);
|
983
|
-
// Update the policy.
|
984
858
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
|
985
|
-
gpr_log(
|
986
|
-
|
987
|
-
policy_to_update == pending_fallback_policy_.get() ? "pending " : "",
|
988
|
-
policy_to_update);
|
859
|
+
gpr_log(GPR_INFO, "[xdslb %p] Updating fallback child policy handler %p",
|
860
|
+
this, fallback_policy_.get());
|
989
861
|
}
|
990
|
-
|
862
|
+
fallback_policy_->UpdateLocked(std::move(update_args));
|
991
863
|
}
|
992
864
|
|
993
865
|
OrphanablePtr<LoadBalancingPolicy> XdsLb::CreateFallbackPolicyLocked(
|
994
|
-
const
|
995
|
-
FallbackHelper* helper =
|
996
|
-
new FallbackHelper(Ref(DEBUG_LOCATION, "FallbackHelper"));
|
866
|
+
const grpc_channel_args* args) {
|
997
867
|
LoadBalancingPolicy::Args lb_policy_args;
|
998
868
|
lb_policy_args.combiner = combiner();
|
999
869
|
lb_policy_args.args = args;
|
1000
870
|
lb_policy_args.channel_control_helper =
|
1001
|
-
|
871
|
+
absl::make_unique<FallbackHelper>(Ref(DEBUG_LOCATION, "FallbackHelper"));
|
1002
872
|
OrphanablePtr<LoadBalancingPolicy> lb_policy =
|
1003
|
-
|
1004
|
-
|
1005
|
-
if (GPR_UNLIKELY(lb_policy == nullptr)) {
|
1006
|
-
gpr_log(GPR_ERROR, "[xdslb %p] Failure creating fallback policy %s", this,
|
1007
|
-
name);
|
1008
|
-
return nullptr;
|
1009
|
-
}
|
1010
|
-
helper->set_child(lb_policy.get());
|
873
|
+
MakeOrphanable<ChildPolicyHandler>(std::move(lb_policy_args),
|
874
|
+
&grpc_lb_xds_trace);
|
1011
875
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
|
1012
|
-
gpr_log(GPR_INFO,
|
1013
|
-
|
876
|
+
gpr_log(GPR_INFO,
|
877
|
+
"[xdslb %p] Created new fallback child policy handler (%p)", this,
|
878
|
+
lb_policy.get());
|
1014
879
|
}
|
1015
880
|
// Add the xDS's interested_parties pollset_set to that of the newly created
|
1016
881
|
// child policy. This will make the child policy progress upon activity on xDS
|
@@ -1024,25 +889,25 @@ void XdsLb::MaybeExitFallbackMode() {
|
|
1024
889
|
if (fallback_policy_ == nullptr) return;
|
1025
890
|
gpr_log(GPR_INFO, "[xdslb %p] Exiting fallback mode", this);
|
1026
891
|
fallback_policy_.reset();
|
1027
|
-
pending_fallback_policy_.reset();
|
1028
892
|
}
|
1029
893
|
|
1030
894
|
//
|
1031
|
-
//
|
895
|
+
// priority list-related methods
|
1032
896
|
//
|
1033
897
|
|
1034
|
-
void XdsLb::
|
1035
|
-
const auto& priority_list_update = xds_policy_->priority_list_update_;
|
898
|
+
void XdsLb::UpdatePrioritiesLocked(bool update_locality_stats) {
|
1036
899
|
// 1. Remove from the priority list the priorities that are not in the update.
|
1037
|
-
DeactivatePrioritiesLowerThan(
|
900
|
+
DeactivatePrioritiesLowerThan(priority_list_update_.LowestPriority());
|
1038
901
|
// 2. Update all the existing priorities.
|
1039
902
|
for (uint32_t priority = 0; priority < priorities_.size(); ++priority) {
|
1040
903
|
LocalityMap* locality_map = priorities_[priority].get();
|
1041
|
-
const auto* locality_map_update =
|
904
|
+
const auto* locality_map_update = priority_list_update_.Find(priority);
|
905
|
+
// If we have more current priorities than exist in the update, stop here.
|
906
|
+
if (locality_map_update == nullptr) break;
|
1042
907
|
// Propagate locality_map_update.
|
1043
908
|
// TODO(juanlishen): Find a clean way to skip duplicate update for a
|
1044
909
|
// priority.
|
1045
|
-
locality_map->UpdateLocked(*locality_map_update);
|
910
|
+
locality_map->UpdateLocked(*locality_map_update, update_locality_stats);
|
1046
911
|
}
|
1047
912
|
// 3. Only create a new locality map if all the existing ones have failed.
|
1048
913
|
if (priorities_.empty() ||
|
@@ -1054,54 +919,62 @@ void XdsLb::PriorityList::UpdateLocked() {
|
|
1054
919
|
// to be created.
|
1055
920
|
MaybeCreateLocalityMapLocked(new_priority);
|
1056
921
|
}
|
1057
|
-
|
1058
|
-
|
1059
|
-
|
1060
|
-
|
1061
|
-
priorities_[i]->ResetBackoffLocked();
|
922
|
+
// 4. If we updated locality stats and we already have at least one
|
923
|
+
// priority, update the picker to start using the new stats object(s).
|
924
|
+
if (update_locality_stats && !priorities_.empty()) {
|
925
|
+
UpdateXdsPickerLocked();
|
1062
926
|
}
|
1063
927
|
}
|
1064
928
|
|
1065
|
-
void XdsLb::
|
1066
|
-
|
1067
|
-
void XdsLb::PriorityList::UpdateXdsPickerLocked() {
|
929
|
+
void XdsLb::UpdateXdsPickerLocked() {
|
1068
930
|
// If we are in fallback mode, don't generate an xds picker from localities.
|
1069
|
-
if (
|
1070
|
-
|
1071
|
-
|
1072
|
-
|
1073
|
-
|
1074
|
-
|
1075
|
-
|
1076
|
-
|
931
|
+
if (fallback_policy_ != nullptr) return;
|
932
|
+
// If we're dropping all calls, report READY, even though we won't
|
933
|
+
// have a selected priority.
|
934
|
+
if (drop_config_ != nullptr && drop_config_->drop_all()) {
|
935
|
+
channel_control_helper()->UpdateState(
|
936
|
+
GRPC_CHANNEL_READY,
|
937
|
+
absl::make_unique<LocalityPicker>(this, LocalityPicker::PickerList{}));
|
938
|
+
return;
|
939
|
+
}
|
940
|
+
// If we don't have a selected priority, report TRANSIENT_FAILURE.
|
941
|
+
if (current_priority_ == UINT32_MAX) {
|
942
|
+
if (fallback_policy_ == nullptr) {
|
943
|
+
grpc_error* error = grpc_error_set_int(
|
944
|
+
GRPC_ERROR_CREATE_FROM_STATIC_STRING("no ready locality map"),
|
945
|
+
GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
|
946
|
+
channel_control_helper()->UpdateState(
|
947
|
+
GRPC_CHANNEL_TRANSIENT_FAILURE,
|
948
|
+
absl::make_unique<TransientFailurePicker>(error));
|
949
|
+
}
|
1077
950
|
return;
|
1078
951
|
}
|
1079
952
|
priorities_[current_priority_]->UpdateXdsPickerLocked();
|
1080
953
|
}
|
1081
954
|
|
1082
|
-
void XdsLb::
|
955
|
+
void XdsLb::MaybeCreateLocalityMapLocked(uint32_t priority) {
|
1083
956
|
// Exhausted priorities in the update.
|
1084
|
-
if (!
|
1085
|
-
auto new_locality_map =
|
1086
|
-
|
957
|
+
if (!priority_list_update_.Contains(priority)) return;
|
958
|
+
auto new_locality_map =
|
959
|
+
new LocalityMap(Ref(DEBUG_LOCATION, "LocalityMap"), priority);
|
1087
960
|
priorities_.emplace_back(OrphanablePtr<LocalityMap>(new_locality_map));
|
1088
|
-
new_locality_map->UpdateLocked(*
|
961
|
+
new_locality_map->UpdateLocked(*priority_list_update_.Find(priority),
|
962
|
+
false /*update_locality_stats*/);
|
1089
963
|
}
|
1090
964
|
|
1091
|
-
void XdsLb::
|
965
|
+
void XdsLb::FailoverOnConnectionFailureLocked() {
|
1092
966
|
const uint32_t failed_priority = LowestPriority();
|
1093
967
|
// If we're failing over from the lowest priority, report TRANSIENT_FAILURE.
|
1094
|
-
if (failed_priority ==
|
968
|
+
if (failed_priority == priority_list_update_.LowestPriority()) {
|
1095
969
|
UpdateXdsPickerLocked();
|
1096
970
|
}
|
1097
971
|
MaybeCreateLocalityMapLocked(failed_priority + 1);
|
1098
972
|
}
|
1099
973
|
|
1100
|
-
void XdsLb::
|
1101
|
-
uint32_t failed_priority) {
|
974
|
+
void XdsLb::FailoverOnDisconnectionLocked(uint32_t failed_priority) {
|
1102
975
|
current_priority_ = UINT32_MAX;
|
1103
976
|
for (uint32_t next_priority = failed_priority + 1;
|
1104
|
-
next_priority <=
|
977
|
+
next_priority <= priority_list_update_.LowestPriority();
|
1105
978
|
++next_priority) {
|
1106
979
|
if (!Contains(next_priority)) {
|
1107
980
|
MaybeCreateLocalityMapLocked(next_priority);
|
@@ -1111,17 +984,17 @@ void XdsLb::PriorityList::FailoverOnDisconnectionLocked(
|
|
1111
984
|
}
|
1112
985
|
}
|
1113
986
|
|
1114
|
-
void XdsLb::
|
987
|
+
void XdsLb::SwitchToHigherPriorityLocked(uint32_t priority) {
|
1115
988
|
current_priority_ = priority;
|
1116
989
|
DeactivatePrioritiesLowerThan(current_priority_);
|
1117
990
|
UpdateXdsPickerLocked();
|
1118
991
|
}
|
1119
992
|
|
1120
|
-
void XdsLb::
|
993
|
+
void XdsLb::DeactivatePrioritiesLowerThan(uint32_t priority) {
|
1121
994
|
if (priorities_.empty()) return;
|
1122
995
|
// Deactivate the locality maps from the lowest priority.
|
1123
996
|
for (uint32_t p = LowestPriority(); p > priority; --p) {
|
1124
|
-
if (
|
997
|
+
if (locality_retention_interval_ms_ == 0) {
|
1125
998
|
priorities_.pop_back();
|
1126
999
|
} else {
|
1127
1000
|
priorities_[p]->DeactivateLocked();
|
@@ -1129,30 +1002,37 @@ void XdsLb::PriorityList::DeactivatePrioritiesLowerThan(uint32_t priority) {
|
|
1129
1002
|
}
|
1130
1003
|
}
|
1131
1004
|
|
1132
|
-
OrphanablePtr<XdsLb::
|
1133
|
-
XdsLb::PriorityList::ExtractLocalityLocked(
|
1005
|
+
OrphanablePtr<XdsLb::LocalityMap::Locality> XdsLb::ExtractLocalityLocked(
|
1134
1006
|
const RefCountedPtr<XdsLocalityName>& name, uint32_t exclude_priority) {
|
1135
1007
|
for (uint32_t priority = 0; priority < priorities_.size(); ++priority) {
|
1136
1008
|
if (priority == exclude_priority) continue;
|
1137
1009
|
LocalityMap* locality_map = priorities_[priority].get();
|
1138
1010
|
auto locality = locality_map->ExtractLocalityLocked(name);
|
1139
|
-
if (locality != nullptr)
|
1011
|
+
if (locality != nullptr) {
|
1012
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
|
1013
|
+
gpr_log(GPR_INFO,
|
1014
|
+
"[xdslb %p] moving locality %p %s to new priority (%" PRIu32
|
1015
|
+
" -> %" PRIu32 ")",
|
1016
|
+
this, locality.get(), name->AsHumanReadableString(),
|
1017
|
+
exclude_priority, priority);
|
1018
|
+
}
|
1019
|
+
return locality;
|
1020
|
+
}
|
1140
1021
|
}
|
1141
1022
|
return nullptr;
|
1142
1023
|
}
|
1143
1024
|
|
1144
1025
|
//
|
1145
|
-
// XdsLb::
|
1026
|
+
// XdsLb::LocalityMap
|
1146
1027
|
//
|
1147
1028
|
|
1148
|
-
XdsLb::
|
1149
|
-
|
1029
|
+
XdsLb::LocalityMap::LocalityMap(RefCountedPtr<XdsLb> xds_policy,
|
1030
|
+
uint32_t priority)
|
1150
1031
|
: xds_policy_(std::move(xds_policy)), priority_(priority) {
|
1151
1032
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
|
1152
1033
|
gpr_log(GPR_INFO, "[xdslb %p] Creating priority %" PRIu32,
|
1153
1034
|
xds_policy_.get(), priority_);
|
1154
1035
|
}
|
1155
|
-
|
1156
1036
|
GRPC_CLOSURE_INIT(&on_failover_timer_, OnFailoverTimer, this,
|
1157
1037
|
grpc_schedule_on_exec_ctx);
|
1158
1038
|
// Start the failover timer.
|
@@ -1163,15 +1043,17 @@ XdsLb::PriorityList::LocalityMap::LocalityMap(RefCountedPtr<XdsLb> xds_policy,
|
|
1163
1043
|
&on_failover_timer_);
|
1164
1044
|
failover_timer_callback_pending_ = true;
|
1165
1045
|
// This is the first locality map ever created, report CONNECTING.
|
1166
|
-
if (priority_ == 0) {
|
1046
|
+
if (priority_ == 0 && xds_policy_->fallback_policy_ == nullptr) {
|
1167
1047
|
xds_policy_->channel_control_helper()->UpdateState(
|
1168
|
-
GRPC_CHANNEL_CONNECTING,
|
1169
|
-
|
1048
|
+
GRPC_CHANNEL_CONNECTING,
|
1049
|
+
absl::make_unique<QueuePicker>(
|
1050
|
+
xds_policy_->Ref(DEBUG_LOCATION, "QueuePicker")));
|
1170
1051
|
}
|
1171
1052
|
}
|
1172
1053
|
|
1173
|
-
void XdsLb::
|
1174
|
-
const
|
1054
|
+
void XdsLb::LocalityMap::UpdateLocked(
|
1055
|
+
const XdsApi::PriorityListUpdate::LocalityMap& priority_update,
|
1056
|
+
bool update_locality_stats) {
|
1175
1057
|
if (xds_policy_->shutting_down_) return;
|
1176
1058
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
|
1177
1059
|
gpr_log(GPR_INFO, "[xdslb %p] Start Updating priority %" PRIu32,
|
@@ -1180,11 +1062,11 @@ void XdsLb::PriorityList::LocalityMap::UpdateLocked(
|
|
1180
1062
|
// Maybe reactivate the locality map in case all the active locality maps have
|
1181
1063
|
// failed.
|
1182
1064
|
MaybeReactivateLocked();
|
1183
|
-
// Remove (later) the localities not in
|
1065
|
+
// Remove (later) the localities not in priority_update.
|
1184
1066
|
for (auto iter = localities_.begin(); iter != localities_.end();) {
|
1185
1067
|
const auto& name = iter->first;
|
1186
1068
|
Locality* locality = iter->second.get();
|
1187
|
-
if (
|
1069
|
+
if (priority_update.Contains(name)) {
|
1188
1070
|
++iter;
|
1189
1071
|
continue;
|
1190
1072
|
}
|
@@ -1195,14 +1077,14 @@ void XdsLb::PriorityList::LocalityMap::UpdateLocked(
|
|
1195
1077
|
++iter;
|
1196
1078
|
}
|
1197
1079
|
}
|
1198
|
-
// Add or update the localities in
|
1199
|
-
for (const auto& p :
|
1080
|
+
// Add or update the localities in priority_update.
|
1081
|
+
for (const auto& p : priority_update.localities) {
|
1200
1082
|
const auto& name = p.first;
|
1201
1083
|
const auto& locality_update = p.second;
|
1202
1084
|
OrphanablePtr<Locality>& locality = localities_[name];
|
1203
1085
|
if (locality == nullptr) {
|
1204
1086
|
// Move from another locality map if possible.
|
1205
|
-
locality =
|
1087
|
+
locality = xds_policy_->ExtractLocalityLocked(name, priority_);
|
1206
1088
|
if (locality != nullptr) {
|
1207
1089
|
locality->set_locality_map(
|
1208
1090
|
Ref(DEBUG_LOCATION, "LocalityMap+Locality_move"));
|
@@ -1214,38 +1096,74 @@ void XdsLb::PriorityList::LocalityMap::UpdateLocked(
|
|
1214
1096
|
// Keep a copy of serverlist in the update so that we can compare it
|
1215
1097
|
// with the future ones.
|
1216
1098
|
locality->UpdateLocked(locality_update.lb_weight,
|
1217
|
-
locality_update.serverlist);
|
1099
|
+
locality_update.serverlist, update_locality_stats);
|
1100
|
+
}
|
1101
|
+
// If this is the current priority and we removed all of the READY
|
1102
|
+
// localities, go into state CONNECTING.
|
1103
|
+
// TODO(roth): Ideally, we should model this as a graceful policy
|
1104
|
+
// switch: we should keep using the old localities for a short period
|
1105
|
+
// of time, long enough to give the new localities a chance to get
|
1106
|
+
// connected. As part of refactoring this policy, we should try to
|
1107
|
+
// fix that.
|
1108
|
+
if (priority_ == xds_policy()->current_priority_) {
|
1109
|
+
bool found_ready = false;
|
1110
|
+
for (auto& p : localities_) {
|
1111
|
+
const auto& locality_name = p.first;
|
1112
|
+
Locality* locality = p.second.get();
|
1113
|
+
if (!locality_map_update()->Contains(locality_name)) continue;
|
1114
|
+
if (locality->connectivity_state() == GRPC_CHANNEL_READY) {
|
1115
|
+
found_ready = true;
|
1116
|
+
break;
|
1117
|
+
}
|
1118
|
+
}
|
1119
|
+
if (!found_ready) {
|
1120
|
+
xds_policy_->channel_control_helper()->UpdateState(
|
1121
|
+
GRPC_CHANNEL_CONNECTING,
|
1122
|
+
absl::make_unique<QueuePicker>(
|
1123
|
+
xds_policy_->Ref(DEBUG_LOCATION, "QueuePicker")));
|
1124
|
+
xds_policy_->current_priority_ = UINT32_MAX;
|
1125
|
+
}
|
1218
1126
|
}
|
1219
1127
|
}
|
1220
1128
|
|
1221
|
-
void XdsLb::
|
1129
|
+
void XdsLb::LocalityMap::ResetBackoffLocked() {
|
1222
1130
|
for (auto& p : localities_) p.second->ResetBackoffLocked();
|
1223
1131
|
}
|
1224
1132
|
|
1225
|
-
void XdsLb::
|
1133
|
+
void XdsLb::LocalityMap::UpdateXdsPickerLocked() {
|
1134
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
|
1135
|
+
gpr_log(GPR_INFO, "[xdslb %p] constructing new picker", xds_policy());
|
1136
|
+
}
|
1226
1137
|
// Construct a new xds picker which maintains a map of all locality pickers
|
1227
1138
|
// that are ready. Each locality is represented by a portion of the range
|
1228
1139
|
// proportional to its weight, such that the total range is the sum of the
|
1229
1140
|
// weights of all localities.
|
1230
1141
|
LocalityPicker::PickerList picker_list;
|
1231
1142
|
uint32_t end = 0;
|
1232
|
-
for (
|
1143
|
+
for (auto& p : localities_) {
|
1233
1144
|
const auto& locality_name = p.first;
|
1234
|
-
|
1145
|
+
Locality* locality = p.second.get();
|
1235
1146
|
// Skip the localities that are not in the latest locality map update.
|
1236
|
-
|
1147
|
+
const auto* locality_update = locality_map_update();
|
1148
|
+
if (locality_update == nullptr) continue;
|
1149
|
+
if (!locality_update->Contains(locality_name)) continue;
|
1237
1150
|
if (locality->connectivity_state() != GRPC_CHANNEL_READY) continue;
|
1238
1151
|
end += locality->weight();
|
1239
|
-
picker_list.push_back(
|
1152
|
+
picker_list.push_back(
|
1153
|
+
std::make_pair(end, locality->GetLoadReportingPicker()));
|
1154
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
|
1155
|
+
gpr_log(GPR_INFO, "[xdslb %p] locality=%s weight=%d picker=%p",
|
1156
|
+
xds_policy(), locality_name->AsHumanReadableString(),
|
1157
|
+
locality->weight(), picker_list.back().second.get());
|
1158
|
+
}
|
1240
1159
|
}
|
1241
1160
|
xds_policy()->channel_control_helper()->UpdateState(
|
1242
|
-
GRPC_CHANNEL_READY,
|
1243
|
-
|
1244
|
-
std::move(picker_list)));
|
1161
|
+
GRPC_CHANNEL_READY,
|
1162
|
+
absl::make_unique<LocalityPicker>(xds_policy(), std::move(picker_list)));
|
1245
1163
|
}
|
1246
1164
|
|
1247
|
-
OrphanablePtr<XdsLb::
|
1248
|
-
XdsLb::
|
1165
|
+
OrphanablePtr<XdsLb::LocalityMap::Locality>
|
1166
|
+
XdsLb::LocalityMap::ExtractLocalityLocked(
|
1249
1167
|
const RefCountedPtr<XdsLocalityName>& name) {
|
1250
1168
|
for (auto iter = localities_.begin(); iter != localities_.end(); ++iter) {
|
1251
1169
|
const auto& name_in_map = iter->first;
|
@@ -1258,7 +1176,11 @@ XdsLb::PriorityList::LocalityMap::ExtractLocalityLocked(
|
|
1258
1176
|
return nullptr;
|
1259
1177
|
}
|
1260
1178
|
|
1261
|
-
void XdsLb::
|
1179
|
+
void XdsLb::LocalityMap::DeactivateLocked() {
|
1180
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
|
1181
|
+
gpr_log(GPR_INFO, "[xdslb %p] deactivating priority %" PRIu32, xds_policy(),
|
1182
|
+
priority_);
|
1183
|
+
}
|
1262
1184
|
// If already deactivated, don't do it again.
|
1263
1185
|
if (delayed_removal_timer_callback_pending_) return;
|
1264
1186
|
MaybeCancelFailoverTimerLocked();
|
@@ -1279,24 +1201,28 @@ void XdsLb::PriorityList::LocalityMap::DeactivateLocked() {
|
|
1279
1201
|
delayed_removal_timer_callback_pending_ = true;
|
1280
1202
|
}
|
1281
1203
|
|
1282
|
-
bool XdsLb::
|
1204
|
+
bool XdsLb::LocalityMap::MaybeReactivateLocked() {
|
1283
1205
|
// Don't reactivate a priority that is not higher than the current one.
|
1284
|
-
if (priority_ >=
|
1206
|
+
if (priority_ >= xds_policy_->current_priority_) return false;
|
1285
1207
|
// Reactivate this priority by cancelling deletion timer.
|
1208
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
|
1209
|
+
gpr_log(GPR_INFO, "[xdslb %p] reactivating priority %" PRIu32, xds_policy(),
|
1210
|
+
priority_);
|
1211
|
+
}
|
1286
1212
|
if (delayed_removal_timer_callback_pending_) {
|
1287
1213
|
grpc_timer_cancel(&delayed_removal_timer_);
|
1288
1214
|
}
|
1289
1215
|
// Switch to this higher priority if it's READY.
|
1290
1216
|
if (connectivity_state_ != GRPC_CHANNEL_READY) return false;
|
1291
|
-
|
1217
|
+
xds_policy_->SwitchToHigherPriorityLocked(priority_);
|
1292
1218
|
return true;
|
1293
1219
|
}
|
1294
1220
|
|
1295
|
-
void XdsLb::
|
1221
|
+
void XdsLb::LocalityMap::MaybeCancelFailoverTimerLocked() {
|
1296
1222
|
if (failover_timer_callback_pending_) grpc_timer_cancel(&failover_timer_);
|
1297
1223
|
}
|
1298
1224
|
|
1299
|
-
void XdsLb::
|
1225
|
+
void XdsLb::LocalityMap::Orphan() {
|
1300
1226
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
|
1301
1227
|
gpr_log(GPR_INFO, "[xdslb %p] Priority %" PRIu32 " orphaned.", xds_policy(),
|
1302
1228
|
priority_);
|
@@ -1309,11 +1235,11 @@ void XdsLb::PriorityList::LocalityMap::Orphan() {
|
|
1309
1235
|
Unref(DEBUG_LOCATION, "LocalityMap+Orphan");
|
1310
1236
|
}
|
1311
1237
|
|
1312
|
-
void XdsLb::
|
1238
|
+
void XdsLb::LocalityMap::OnLocalityStateUpdateLocked() {
|
1313
1239
|
UpdateConnectivityStateLocked();
|
1314
1240
|
// Ignore priorities not in priority_list_update.
|
1315
1241
|
if (!priority_list_update().Contains(priority_)) return;
|
1316
|
-
const uint32_t current_priority =
|
1242
|
+
const uint32_t current_priority = xds_policy_->current_priority_;
|
1317
1243
|
// Ignore lower-than-current priorities.
|
1318
1244
|
if (priority_ > current_priority) return;
|
1319
1245
|
// Maybe update fallback state.
|
@@ -1327,13 +1253,13 @@ void XdsLb::PriorityList::LocalityMap::OnLocalityStateUpdateLocked() {
|
|
1327
1253
|
if (connectivity_state_ == GRPC_CHANNEL_READY) {
|
1328
1254
|
MaybeCancelFailoverTimerLocked();
|
1329
1255
|
// If a higher-than-current priority becomes READY, switch to use it.
|
1330
|
-
|
1256
|
+
xds_policy_->SwitchToHigherPriorityLocked(priority_);
|
1331
1257
|
} else if (connectivity_state_ == GRPC_CHANNEL_TRANSIENT_FAILURE) {
|
1332
1258
|
// If a higher-than-current priority becomes TRANSIENT_FAILURE, only
|
1333
1259
|
// handle it if it's the priority that is still in failover timeout.
|
1334
1260
|
if (failover_timer_callback_pending_) {
|
1335
1261
|
MaybeCancelFailoverTimerLocked();
|
1336
|
-
|
1262
|
+
xds_policy_->FailoverOnConnectionFailureLocked();
|
1337
1263
|
}
|
1338
1264
|
}
|
1339
1265
|
return;
|
@@ -1341,7 +1267,7 @@ void XdsLb::PriorityList::LocalityMap::OnLocalityStateUpdateLocked() {
|
|
1341
1267
|
// Update is for current priority.
|
1342
1268
|
if (connectivity_state_ != GRPC_CHANNEL_READY) {
|
1343
1269
|
// Fail over if it's no longer READY.
|
1344
|
-
|
1270
|
+
xds_policy_->FailoverOnDisconnectionLocked(priority_);
|
1345
1271
|
}
|
1346
1272
|
// At this point, one of the following things has happened to the current
|
1347
1273
|
// priority.
|
@@ -1349,10 +1275,10 @@ void XdsLb::PriorityList::LocalityMap::OnLocalityStateUpdateLocked() {
|
|
1349
1275
|
// 2. It changed to a lower priority due to failover.
|
1350
1276
|
// 3. It became invalid because failover didn't yield a READY priority.
|
1351
1277
|
// In any case, update the xds picker.
|
1352
|
-
|
1278
|
+
xds_policy_->UpdateXdsPickerLocked();
|
1353
1279
|
}
|
1354
1280
|
|
1355
|
-
void XdsLb::
|
1281
|
+
void XdsLb::LocalityMap::UpdateConnectivityStateLocked() {
|
1356
1282
|
size_t num_ready = 0;
|
1357
1283
|
size_t num_connecting = 0;
|
1358
1284
|
size_t num_idle = 0;
|
@@ -1400,8 +1326,7 @@ void XdsLb::PriorityList::LocalityMap::UpdateConnectivityStateLocked() {
|
|
1400
1326
|
}
|
1401
1327
|
}
|
1402
1328
|
|
1403
|
-
void XdsLb::
|
1404
|
-
void* arg, grpc_error* error) {
|
1329
|
+
void XdsLb::LocalityMap::OnDelayedRemovalTimer(void* arg, grpc_error* error) {
|
1405
1330
|
LocalityMap* self = static_cast<LocalityMap*>(arg);
|
1406
1331
|
self->xds_policy_->combiner()->Run(
|
1407
1332
|
GRPC_CLOSURE_INIT(&self->on_delayed_removal_timer_,
|
@@ -1409,14 +1334,13 @@ void XdsLb::PriorityList::LocalityMap::OnDelayedRemovalTimer(
|
|
1409
1334
|
GRPC_ERROR_REF(error));
|
1410
1335
|
}
|
1411
1336
|
|
1412
|
-
void XdsLb::
|
1413
|
-
|
1337
|
+
void XdsLb::LocalityMap::OnDelayedRemovalTimerLocked(void* arg,
|
1338
|
+
grpc_error* error) {
|
1414
1339
|
LocalityMap* self = static_cast<LocalityMap*>(arg);
|
1415
1340
|
self->delayed_removal_timer_callback_pending_ = false;
|
1416
1341
|
if (error == GRPC_ERROR_NONE && !self->xds_policy_->shutting_down_) {
|
1417
|
-
auto* priority_list = self->priority_list();
|
1418
1342
|
const bool keep = self->priority_list_update().Contains(self->priority_) &&
|
1419
|
-
self->priority_ <=
|
1343
|
+
self->priority_ <= self->xds_policy_->current_priority_;
|
1420
1344
|
if (!keep) {
|
1421
1345
|
// This check is to make sure we always delete the locality maps from
|
1422
1346
|
// the lowest priority even if the closures of the back-to-back timers
|
@@ -1425,8 +1349,8 @@ void XdsLb::PriorityList::LocalityMap::OnDelayedRemovalTimerLocked(
|
|
1425
1349
|
// deactivated locality maps when out-of-order closures are run.
|
1426
1350
|
// TODO(juanlishen): Check the timer implementation to see if this
|
1427
1351
|
// defense is necessary.
|
1428
|
-
if (self->priority_ ==
|
1429
|
-
|
1352
|
+
if (self->priority_ == self->xds_policy_->LowestPriority()) {
|
1353
|
+
self->xds_policy_->priorities_.pop_back();
|
1430
1354
|
} else {
|
1431
1355
|
gpr_log(GPR_ERROR,
|
1432
1356
|
"[xdslb %p] Priority %" PRIu32
|
@@ -1439,8 +1363,7 @@ void XdsLb::PriorityList::LocalityMap::OnDelayedRemovalTimerLocked(
|
|
1439
1363
|
self->Unref(DEBUG_LOCATION, "LocalityMap+timer");
|
1440
1364
|
}
|
1441
1365
|
|
1442
|
-
void XdsLb::
|
1443
|
-
grpc_error* error) {
|
1366
|
+
void XdsLb::LocalityMap::OnFailoverTimer(void* arg, grpc_error* error) {
|
1444
1367
|
LocalityMap* self = static_cast<LocalityMap*>(arg);
|
1445
1368
|
self->xds_policy_->combiner()->Run(
|
1446
1369
|
GRPC_CLOSURE_INIT(&self->on_failover_timer_, OnFailoverTimerLocked, self,
|
@@ -1448,31 +1371,31 @@ void XdsLb::PriorityList::LocalityMap::OnFailoverTimer(void* arg,
|
|
1448
1371
|
GRPC_ERROR_REF(error));
|
1449
1372
|
}
|
1450
1373
|
|
1451
|
-
void XdsLb::
|
1452
|
-
void* arg, grpc_error* error) {
|
1374
|
+
void XdsLb::LocalityMap::OnFailoverTimerLocked(void* arg, grpc_error* error) {
|
1453
1375
|
LocalityMap* self = static_cast<LocalityMap*>(arg);
|
1454
1376
|
self->failover_timer_callback_pending_ = false;
|
1455
1377
|
if (error == GRPC_ERROR_NONE && !self->xds_policy_->shutting_down_) {
|
1456
|
-
self->
|
1378
|
+
self->xds_policy_->FailoverOnConnectionFailureLocked();
|
1457
1379
|
}
|
1458
1380
|
self->Unref(DEBUG_LOCATION, "LocalityMap+OnFailoverTimerLocked");
|
1459
1381
|
}
|
1460
1382
|
|
1461
1383
|
//
|
1462
|
-
// XdsLb::
|
1384
|
+
// XdsLb::LocalityMap::Locality
|
1463
1385
|
//
|
1464
1386
|
|
1465
|
-
XdsLb::
|
1466
|
-
|
1467
|
-
RefCountedPtr<XdsLocalityName> name)
|
1387
|
+
XdsLb::LocalityMap::Locality::Locality(RefCountedPtr<LocalityMap> locality_map,
|
1388
|
+
RefCountedPtr<XdsLocalityName> name)
|
1468
1389
|
: locality_map_(std::move(locality_map)), name_(std::move(name)) {
|
1469
1390
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
|
1470
1391
|
gpr_log(GPR_INFO, "[xdslb %p] created Locality %p for %s", xds_policy(),
|
1471
1392
|
this, name_->AsHumanReadableString());
|
1472
1393
|
}
|
1394
|
+
// Initialize locality stats if load reporting is enabled.
|
1395
|
+
UpdateLocalityStats();
|
1473
1396
|
}
|
1474
1397
|
|
1475
|
-
XdsLb::
|
1398
|
+
XdsLb::LocalityMap::Locality::~Locality() {
|
1476
1399
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
|
1477
1400
|
gpr_log(GPR_INFO, "[xdslb %p] Locality %p %s: destroying locality",
|
1478
1401
|
xds_policy(), this, name_->AsHumanReadableString());
|
@@ -1480,8 +1403,20 @@ XdsLb::PriorityList::LocalityMap::Locality::~Locality() {
|
|
1480
1403
|
locality_map_.reset(DEBUG_LOCATION, "Locality");
|
1481
1404
|
}
|
1482
1405
|
|
1483
|
-
|
1484
|
-
|
1406
|
+
void XdsLb::LocalityMap::Locality::UpdateLocalityStats() {
|
1407
|
+
stats_.reset();
|
1408
|
+
if (xds_policy()->config_->lrs_load_reporting_server_name().has_value()) {
|
1409
|
+
stats_ = xds_policy()->xds_client()->AddClusterLocalityStats(
|
1410
|
+
xds_policy()->config_->lrs_load_reporting_server_name().value(),
|
1411
|
+
// TODO(roth): We currently hard-code the assumption that
|
1412
|
+
// cluster name and EDS service name are the same. Fix this
|
1413
|
+
// as part of refectoring this LB policy.
|
1414
|
+
xds_policy()->eds_service_name(), xds_policy()->eds_service_name(),
|
1415
|
+
name_);
|
1416
|
+
}
|
1417
|
+
}
|
1418
|
+
|
1419
|
+
grpc_channel_args* XdsLb::LocalityMap::Locality::CreateChildPolicyArgsLocked(
|
1485
1420
|
const grpc_channel_args* args_in) {
|
1486
1421
|
const grpc_arg args_to_add[] = {
|
1487
1422
|
// A channel arg indicating if the target is a backend inferred from a
|
@@ -1499,28 +1434,20 @@ XdsLb::PriorityList::LocalityMap::Locality::CreateChildPolicyArgsLocked(
|
|
1499
1434
|
}
|
1500
1435
|
|
1501
1436
|
OrphanablePtr<LoadBalancingPolicy>
|
1502
|
-
XdsLb::
|
1503
|
-
const
|
1504
|
-
Helper* helper = new Helper(this->Ref(DEBUG_LOCATION, "Helper"));
|
1437
|
+
XdsLb::LocalityMap::Locality::CreateChildPolicyLocked(
|
1438
|
+
const grpc_channel_args* args) {
|
1505
1439
|
LoadBalancingPolicy::Args lb_policy_args;
|
1506
1440
|
lb_policy_args.combiner = xds_policy()->combiner();
|
1507
1441
|
lb_policy_args.args = args;
|
1508
1442
|
lb_policy_args.channel_control_helper =
|
1509
|
-
|
1443
|
+
absl::make_unique<Helper>(this->Ref(DEBUG_LOCATION, "Helper"));
|
1510
1444
|
OrphanablePtr<LoadBalancingPolicy> lb_policy =
|
1511
|
-
|
1512
|
-
|
1513
|
-
if (GPR_UNLIKELY(lb_policy == nullptr)) {
|
1514
|
-
gpr_log(GPR_ERROR,
|
1515
|
-
"[xdslb %p] Locality %p %s: failure creating child policy %s",
|
1516
|
-
xds_policy(), this, name_->AsHumanReadableString(), name);
|
1517
|
-
return nullptr;
|
1518
|
-
}
|
1519
|
-
helper->set_child(lb_policy.get());
|
1445
|
+
MakeOrphanable<ChildPolicyHandler>(std::move(lb_policy_args),
|
1446
|
+
&grpc_lb_xds_trace);
|
1520
1447
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
|
1521
1448
|
gpr_log(GPR_INFO,
|
1522
|
-
"[xdslb %p] Locality %p %s: Created new child policy
|
1523
|
-
xds_policy(), this, name_->AsHumanReadableString(),
|
1449
|
+
"[xdslb %p] Locality %p %s: Created new child policy handler (%p)",
|
1450
|
+
xds_policy(), this, name_->AsHumanReadableString(),
|
1524
1451
|
lb_policy.get());
|
1525
1452
|
}
|
1526
1453
|
// Add the xDS's interested_parties pollset_set to that of the newly created
|
@@ -1531,134 +1458,55 @@ XdsLb::PriorityList::LocalityMap::Locality::CreateChildPolicyLocked(
|
|
1531
1458
|
return lb_policy;
|
1532
1459
|
}
|
1533
1460
|
|
1534
|
-
void XdsLb::
|
1535
|
-
|
1461
|
+
void XdsLb::LocalityMap::Locality::UpdateLocked(uint32_t locality_weight,
|
1462
|
+
ServerAddressList serverlist,
|
1463
|
+
bool update_locality_stats) {
|
1536
1464
|
if (xds_policy()->shutting_down_) return;
|
1537
1465
|
// Update locality weight.
|
1538
1466
|
weight_ = locality_weight;
|
1539
1467
|
if (delayed_removal_timer_callback_pending_) {
|
1468
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
|
1469
|
+
gpr_log(GPR_INFO, "[xdslb %p] Locality %p %s: reactivating", xds_policy(),
|
1470
|
+
this, name_->AsHumanReadableString());
|
1471
|
+
}
|
1540
1472
|
grpc_timer_cancel(&delayed_removal_timer_);
|
1541
1473
|
}
|
1474
|
+
// Update locality stats.
|
1475
|
+
if (update_locality_stats) UpdateLocalityStats();
|
1542
1476
|
// Construct update args.
|
1543
1477
|
UpdateArgs update_args;
|
1544
1478
|
update_args.addresses = std::move(serverlist);
|
1545
1479
|
update_args.config = xds_policy()->config_->child_policy();
|
1546
1480
|
update_args.args = CreateChildPolicyArgsLocked(xds_policy()->args_);
|
1547
|
-
//
|
1548
|
-
|
1549
|
-
|
1550
|
-
|
1551
|
-
|
1552
|
-
// non-null only between when we apply an update that changes the child
|
1553
|
-
// policy name and when the new child reports state READY.
|
1554
|
-
//
|
1555
|
-
// Updates can arrive at any point during this transition. We always
|
1556
|
-
// apply updates relative to the most recently created child policy,
|
1557
|
-
// even if the most recent one is still in pending_child_policy_. This
|
1558
|
-
// is true both when applying the updates to an existing child policy
|
1559
|
-
// and when determining whether we need to create a new policy.
|
1560
|
-
//
|
1561
|
-
// As a result of this, there are several cases to consider here:
|
1562
|
-
//
|
1563
|
-
// 1. We have no existing child policy (i.e., we have started up but
|
1564
|
-
// have not yet received a serverlist from the balancer or gone
|
1565
|
-
// into fallback mode; in this case, both child_policy_ and
|
1566
|
-
// pending_child_policy_ are null). In this case, we create a
|
1567
|
-
// new child policy and store it in child_policy_.
|
1568
|
-
//
|
1569
|
-
// 2. We have an existing child policy and have no pending child policy
|
1570
|
-
// from a previous update (i.e., either there has not been a
|
1571
|
-
// previous update that changed the policy name, or we have already
|
1572
|
-
// finished swapping in the new policy; in this case, child_policy_
|
1573
|
-
// is non-null but pending_child_policy_ is null). In this case:
|
1574
|
-
// a. If child_policy_->name() equals child_policy_name, then we
|
1575
|
-
// update the existing child policy.
|
1576
|
-
// b. If child_policy_->name() does not equal child_policy_name,
|
1577
|
-
// we create a new policy. The policy will be stored in
|
1578
|
-
// pending_child_policy_ and will later be swapped into
|
1579
|
-
// child_policy_ by the helper when the new child transitions
|
1580
|
-
// into state READY.
|
1581
|
-
//
|
1582
|
-
// 3. We have an existing child policy and have a pending child policy
|
1583
|
-
// from a previous update (i.e., a previous update set
|
1584
|
-
// pending_child_policy_ as per case 2b above and that policy has
|
1585
|
-
// not yet transitioned into state READY and been swapped into
|
1586
|
-
// child_policy_; in this case, both child_policy_ and
|
1587
|
-
// pending_child_policy_ are non-null). In this case:
|
1588
|
-
// a. If pending_child_policy_->name() equals child_policy_name,
|
1589
|
-
// then we update the existing pending child policy.
|
1590
|
-
// b. If pending_child_policy->name() does not equal
|
1591
|
-
// child_policy_name, then we create a new policy. The new
|
1592
|
-
// policy is stored in pending_child_policy_ (replacing the one
|
1593
|
-
// that was there before, which will be immediately shut down)
|
1594
|
-
// and will later be swapped into child_policy_ by the helper
|
1595
|
-
// when the new child transitions into state READY.
|
1596
|
-
// TODO(juanlishen): If the child policy is not configured via service config,
|
1597
|
-
// use whatever algorithm is specified by the balancer.
|
1598
|
-
const char* child_policy_name = update_args.config == nullptr
|
1599
|
-
? "round_robin"
|
1600
|
-
: update_args.config->name();
|
1601
|
-
const bool create_policy =
|
1602
|
-
// case 1
|
1603
|
-
child_policy_ == nullptr ||
|
1604
|
-
// case 2b
|
1605
|
-
(pending_child_policy_ == nullptr &&
|
1606
|
-
strcmp(child_policy_->name(), child_policy_name) != 0) ||
|
1607
|
-
// case 3b
|
1608
|
-
(pending_child_policy_ != nullptr &&
|
1609
|
-
strcmp(pending_child_policy_->name(), child_policy_name) != 0);
|
1610
|
-
LoadBalancingPolicy* policy_to_update = nullptr;
|
1611
|
-
if (create_policy) {
|
1612
|
-
// Cases 1, 2b, and 3b: create a new child policy.
|
1613
|
-
// If child_policy_ is null, we set it (case 1), else we set
|
1614
|
-
// pending_child_policy_ (cases 2b and 3b).
|
1615
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
|
1616
|
-
gpr_log(GPR_INFO,
|
1617
|
-
"[xdslb %p] Locality %p %s: Creating new %schild policy %s",
|
1618
|
-
xds_policy(), this, name_->AsHumanReadableString(),
|
1619
|
-
child_policy_ == nullptr ? "" : "pending ", child_policy_name);
|
1620
|
-
}
|
1621
|
-
auto& lb_policy =
|
1622
|
-
child_policy_ == nullptr ? child_policy_ : pending_child_policy_;
|
1623
|
-
lb_policy = CreateChildPolicyLocked(child_policy_name, update_args.args);
|
1624
|
-
policy_to_update = lb_policy.get();
|
1625
|
-
} else {
|
1626
|
-
// Cases 2a and 3a: update an existing policy.
|
1627
|
-
// If we have a pending child policy, send the update to the pending
|
1628
|
-
// policy (case 3a), else send it to the current policy (case 2a).
|
1629
|
-
policy_to_update = pending_child_policy_ != nullptr
|
1630
|
-
? pending_child_policy_.get()
|
1631
|
-
: child_policy_.get();
|
1632
|
-
}
|
1633
|
-
GPR_ASSERT(policy_to_update != nullptr);
|
1481
|
+
// Create child policy if needed.
|
1482
|
+
if (child_policy_ == nullptr) {
|
1483
|
+
child_policy_ = CreateChildPolicyLocked(update_args.args);
|
1484
|
+
GPR_ASSERT(child_policy_ != nullptr);
|
1485
|
+
}
|
1634
1486
|
// Update the policy.
|
1635
1487
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
|
1636
|
-
gpr_log(GPR_INFO,
|
1488
|
+
gpr_log(GPR_INFO,
|
1489
|
+
"[xdslb %p] Locality %p %s: Updating child policy handler %p",
|
1637
1490
|
xds_policy(), this, name_->AsHumanReadableString(),
|
1638
|
-
|
1639
|
-
policy_to_update);
|
1491
|
+
child_policy_.get());
|
1640
1492
|
}
|
1641
|
-
|
1493
|
+
child_policy_->UpdateLocked(std::move(update_args));
|
1642
1494
|
}
|
1643
1495
|
|
1644
|
-
void XdsLb::
|
1496
|
+
void XdsLb::LocalityMap::Locality::ShutdownLocked() {
|
1645
1497
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
|
1646
1498
|
gpr_log(GPR_INFO, "[xdslb %p] Locality %p %s: shutting down locality",
|
1647
1499
|
xds_policy(), this, name_->AsHumanReadableString());
|
1648
1500
|
}
|
1501
|
+
stats_.reset();
|
1649
1502
|
// Remove the child policy's interested_parties pollset_set from the
|
1650
1503
|
// xDS policy.
|
1651
1504
|
grpc_pollset_set_del_pollset_set(child_policy_->interested_parties(),
|
1652
1505
|
xds_policy()->interested_parties());
|
1653
1506
|
child_policy_.reset();
|
1654
|
-
if (pending_child_policy_ != nullptr) {
|
1655
|
-
grpc_pollset_set_del_pollset_set(
|
1656
|
-
pending_child_policy_->interested_parties(),
|
1657
|
-
xds_policy()->interested_parties());
|
1658
|
-
pending_child_policy_.reset();
|
1659
|
-
}
|
1660
1507
|
// Drop our ref to the child's picker, in case it's holding a ref to
|
1661
1508
|
// the child.
|
1509
|
+
load_reporting_picker_.reset();
|
1662
1510
|
picker_wrapper_.reset();
|
1663
1511
|
if (delayed_removal_timer_callback_pending_) {
|
1664
1512
|
grpc_timer_cancel(&delayed_removal_timer_);
|
@@ -1666,21 +1514,22 @@ void XdsLb::PriorityList::LocalityMap::Locality::ShutdownLocked() {
|
|
1666
1514
|
shutdown_ = true;
|
1667
1515
|
}
|
1668
1516
|
|
1669
|
-
void XdsLb::
|
1517
|
+
void XdsLb::LocalityMap::Locality::ResetBackoffLocked() {
|
1670
1518
|
child_policy_->ResetBackoffLocked();
|
1671
|
-
if (pending_child_policy_ != nullptr) {
|
1672
|
-
pending_child_policy_->ResetBackoffLocked();
|
1673
|
-
}
|
1674
1519
|
}
|
1675
1520
|
|
1676
|
-
void XdsLb::
|
1521
|
+
void XdsLb::LocalityMap::Locality::Orphan() {
|
1677
1522
|
ShutdownLocked();
|
1678
1523
|
Unref();
|
1679
1524
|
}
|
1680
1525
|
|
1681
|
-
void XdsLb::
|
1526
|
+
void XdsLb::LocalityMap::Locality::DeactivateLocked() {
|
1682
1527
|
// If already deactivated, don't do that again.
|
1683
1528
|
if (weight_ == 0) return;
|
1529
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
|
1530
|
+
gpr_log(GPR_INFO, "[xdslb %p] Locality %p %s: deactivating", xds_policy(),
|
1531
|
+
this, name_->AsHumanReadableString());
|
1532
|
+
}
|
1684
1533
|
// Set the locality weight to 0 so that future xds picker won't contain this
|
1685
1534
|
// locality.
|
1686
1535
|
weight_ = 0;
|
@@ -1695,8 +1544,8 @@ void XdsLb::PriorityList::LocalityMap::Locality::DeactivateLocked() {
|
|
1695
1544
|
delayed_removal_timer_callback_pending_ = true;
|
1696
1545
|
}
|
1697
1546
|
|
1698
|
-
void XdsLb::
|
1699
|
-
|
1547
|
+
void XdsLb::LocalityMap::Locality::OnDelayedRemovalTimer(void* arg,
|
1548
|
+
grpc_error* error) {
|
1700
1549
|
Locality* self = static_cast<Locality*>(arg);
|
1701
1550
|
self->xds_policy()->combiner()->Run(
|
1702
1551
|
GRPC_CLOSURE_INIT(&self->on_delayed_removal_timer_,
|
@@ -1704,7 +1553,7 @@ void XdsLb::PriorityList::LocalityMap::Locality::OnDelayedRemovalTimer(
|
|
1704
1553
|
GRPC_ERROR_REF(error));
|
1705
1554
|
}
|
1706
1555
|
|
1707
|
-
void XdsLb::
|
1556
|
+
void XdsLb::LocalityMap::Locality::OnDelayedRemovalTimerLocked(
|
1708
1557
|
void* arg, grpc_error* error) {
|
1709
1558
|
Locality* self = static_cast<Locality*>(arg);
|
1710
1559
|
self->delayed_removal_timer_callback_pending_ = false;
|
@@ -1715,74 +1564,37 @@ void XdsLb::PriorityList::LocalityMap::Locality::OnDelayedRemovalTimerLocked(
|
|
1715
1564
|
}
|
1716
1565
|
|
1717
1566
|
//
|
1718
|
-
// XdsLb::Locality::Helper
|
1567
|
+
// XdsLb::LocalityMap::Locality::Helper
|
1719
1568
|
//
|
1720
1569
|
|
1721
|
-
bool XdsLb::PriorityList::LocalityMap::Locality::Helper::CalledByPendingChild()
|
1722
|
-
const {
|
1723
|
-
GPR_ASSERT(child_ != nullptr);
|
1724
|
-
return child_ == locality_->pending_child_policy_.get();
|
1725
|
-
}
|
1726
|
-
|
1727
|
-
bool XdsLb::PriorityList::LocalityMap::Locality::Helper::CalledByCurrentChild()
|
1728
|
-
const {
|
1729
|
-
GPR_ASSERT(child_ != nullptr);
|
1730
|
-
return child_ == locality_->child_policy_.get();
|
1731
|
-
}
|
1732
|
-
|
1733
1570
|
RefCountedPtr<SubchannelInterface>
|
1734
|
-
XdsLb::
|
1571
|
+
XdsLb::LocalityMap::Locality::Helper::CreateSubchannel(
|
1735
1572
|
const grpc_channel_args& args) {
|
1736
|
-
if (locality_->xds_policy()->shutting_down_
|
1737
|
-
(!CalledByPendingChild() && !CalledByCurrentChild())) {
|
1738
|
-
return nullptr;
|
1739
|
-
}
|
1573
|
+
if (locality_->xds_policy()->shutting_down_) return nullptr;
|
1740
1574
|
return locality_->xds_policy()->channel_control_helper()->CreateSubchannel(
|
1741
1575
|
args);
|
1742
1576
|
}
|
1743
1577
|
|
1744
|
-
void XdsLb::
|
1578
|
+
void XdsLb::LocalityMap::Locality::Helper::UpdateState(
|
1745
1579
|
grpc_connectivity_state state, std::unique_ptr<SubchannelPicker> picker) {
|
1746
1580
|
if (locality_->xds_policy()->shutting_down_) return;
|
1747
|
-
|
1748
|
-
|
1749
|
-
|
1750
|
-
|
1751
|
-
|
1752
|
-
"[xdslb %p helper %p] pending child policy %p reports state=%s",
|
1753
|
-
locality_->xds_policy(), this,
|
1754
|
-
locality_->pending_child_policy_.get(),
|
1755
|
-
ConnectivityStateName(state));
|
1756
|
-
}
|
1757
|
-
if (state != GRPC_CHANNEL_READY) return;
|
1758
|
-
grpc_pollset_set_del_pollset_set(
|
1759
|
-
locality_->child_policy_->interested_parties(),
|
1760
|
-
locality_->xds_policy()->interested_parties());
|
1761
|
-
locality_->child_policy_ = std::move(locality_->pending_child_policy_);
|
1762
|
-
} else if (!CalledByCurrentChild()) {
|
1763
|
-
// This request is from an outdated child, so ignore it.
|
1764
|
-
return;
|
1581
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
|
1582
|
+
gpr_log(GPR_INFO,
|
1583
|
+
"[xdslb %p helper %p] child policy handler %p reports state=%s",
|
1584
|
+
locality_->xds_policy(), this, locality_->child_policy_.get(),
|
1585
|
+
ConnectivityStateName(state));
|
1765
1586
|
}
|
1766
|
-
// Cache the
|
1767
|
-
// TODO(roth): If load reporting is not configured, we should ideally
|
1768
|
-
// pass a null LocalityStats ref to the EndpointPickerWrapper and have it
|
1769
|
-
// not collect any stats, since they're not going to be used. This would
|
1770
|
-
// require recreating all of the pickers whenever we get a config update.
|
1771
|
-
locality_->picker_wrapper_ = MakeRefCounted<EndpointPickerWrapper>(
|
1772
|
-
std::move(picker),
|
1773
|
-
locality_->xds_policy()->client_stats_.FindLocalityStats(
|
1774
|
-
locality_->name_));
|
1587
|
+
// Cache the state and picker in the locality.
|
1775
1588
|
locality_->connectivity_state_ = state;
|
1589
|
+
locality_->picker_wrapper_ =
|
1590
|
+
MakeRefCounted<RefCountedEndpointPicker>(std::move(picker));
|
1776
1591
|
// Notify the locality map.
|
1777
1592
|
locality_->locality_map_->OnLocalityStateUpdateLocked();
|
1778
1593
|
}
|
1779
1594
|
|
1780
|
-
void XdsLb::
|
1781
|
-
|
1782
|
-
if (locality_->xds_policy()->shutting_down_
|
1783
|
-
(!CalledByPendingChild() && !CalledByCurrentChild())) {
|
1784
|
-
return;
|
1785
|
-
}
|
1595
|
+
void XdsLb::LocalityMap::Locality::Helper::AddTraceEvent(TraceSeverity severity,
|
1596
|
+
StringView message) {
|
1597
|
+
if (locality_->xds_policy()->shutting_down_) return;
|
1786
1598
|
locality_->xds_policy()->channel_control_helper()->AddTraceEvent(severity,
|
1787
1599
|
message);
|
1788
1600
|
}
|
@@ -1795,15 +1607,15 @@ class XdsFactory : public LoadBalancingPolicyFactory {
|
|
1795
1607
|
public:
|
1796
1608
|
OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(
|
1797
1609
|
LoadBalancingPolicy::Args args) const override {
|
1798
|
-
return MakeOrphanable<
|
1610
|
+
return MakeOrphanable<XdsChildHandler>(std::move(args), &grpc_lb_xds_trace);
|
1799
1611
|
}
|
1800
1612
|
|
1801
1613
|
const char* name() const override { return kXds; }
|
1802
1614
|
|
1803
1615
|
RefCountedPtr<LoadBalancingPolicy::Config> ParseLoadBalancingConfig(
|
1804
|
-
const
|
1616
|
+
const Json& json, grpc_error** error) const override {
|
1805
1617
|
GPR_DEBUG_ASSERT(error != nullptr && *error == GRPC_ERROR_NONE);
|
1806
|
-
if (json ==
|
1618
|
+
if (json.type() == Json::Type::JSON_NULL) {
|
1807
1619
|
// xds was mentioned as a policy in the deprecated loadBalancingPolicy
|
1808
1620
|
// field or in the client API.
|
1809
1621
|
*error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
@@ -1811,74 +1623,118 @@ class XdsFactory : public LoadBalancingPolicyFactory {
|
|
1811
1623
|
"Please use loadBalancingConfig field of service config instead.");
|
1812
1624
|
return nullptr;
|
1813
1625
|
}
|
1814
|
-
|
1815
|
-
|
1816
|
-
|
1817
|
-
|
1626
|
+
std::vector<grpc_error*> error_list;
|
1627
|
+
// Child policy.
|
1628
|
+
Json json_tmp;
|
1629
|
+
const Json* child_policy_json;
|
1630
|
+
auto it = json.object_value().find("childPolicy");
|
1631
|
+
if (it == json.object_value().end()) {
|
1632
|
+
json_tmp = Json::Array{Json::Object{
|
1633
|
+
{"round_robin", Json::Object()},
|
1634
|
+
}};
|
1635
|
+
child_policy_json = &json_tmp;
|
1636
|
+
} else {
|
1637
|
+
child_policy_json = &it->second;
|
1638
|
+
}
|
1639
|
+
grpc_error* parse_error = GRPC_ERROR_NONE;
|
1640
|
+
RefCountedPtr<LoadBalancingPolicy::Config> child_policy =
|
1641
|
+
LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(
|
1642
|
+
*child_policy_json, &parse_error);
|
1643
|
+
if (child_policy == nullptr) {
|
1644
|
+
GPR_DEBUG_ASSERT(parse_error != GRPC_ERROR_NONE);
|
1645
|
+
std::vector<grpc_error*> child_errors;
|
1646
|
+
child_errors.push_back(parse_error);
|
1647
|
+
error_list.push_back(
|
1648
|
+
GRPC_ERROR_CREATE_FROM_VECTOR("field:childPolicy", &child_errors));
|
1649
|
+
}
|
1650
|
+
// Fallback policy.
|
1651
|
+
const Json* fallback_policy_json;
|
1652
|
+
it = json.object_value().find("fallbackPolicy");
|
1653
|
+
if (it == json.object_value().end()) {
|
1654
|
+
json_tmp = Json::Array{Json::Object{
|
1655
|
+
{"round_robin", Json::Object()},
|
1656
|
+
}};
|
1657
|
+
fallback_policy_json = &json_tmp;
|
1658
|
+
} else {
|
1659
|
+
fallback_policy_json = &it->second;
|
1660
|
+
}
|
1661
|
+
RefCountedPtr<LoadBalancingPolicy::Config> fallback_policy =
|
1662
|
+
LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(
|
1663
|
+
*fallback_policy_json, &parse_error);
|
1664
|
+
if (fallback_policy == nullptr) {
|
1665
|
+
GPR_DEBUG_ASSERT(parse_error != GRPC_ERROR_NONE);
|
1666
|
+
std::vector<grpc_error*> child_errors;
|
1667
|
+
child_errors.push_back(parse_error);
|
1668
|
+
error_list.push_back(
|
1669
|
+
GRPC_ERROR_CREATE_FROM_VECTOR("field:fallbackPolicy", &child_errors));
|
1670
|
+
}
|
1671
|
+
// EDS service name.
|
1818
1672
|
const char* eds_service_name = nullptr;
|
1673
|
+
it = json.object_value().find("edsServiceName");
|
1674
|
+
if (it != json.object_value().end()) {
|
1675
|
+
if (it->second.type() != Json::Type::STRING) {
|
1676
|
+
error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
1677
|
+
"field:edsServiceName error:type should be string"));
|
1678
|
+
} else {
|
1679
|
+
eds_service_name = it->second.string_value().c_str();
|
1680
|
+
}
|
1681
|
+
}
|
1682
|
+
// LRS load reporting server name.
|
1819
1683
|
const char* lrs_load_reporting_server_name = nullptr;
|
1820
|
-
|
1821
|
-
|
1822
|
-
if (
|
1823
|
-
|
1824
|
-
|
1825
|
-
|
1826
|
-
|
1827
|
-
}
|
1828
|
-
grpc_error* parse_error = GRPC_ERROR_NONE;
|
1829
|
-
child_policy = LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(
|
1830
|
-
field, &parse_error);
|
1831
|
-
if (child_policy == nullptr) {
|
1832
|
-
GPR_DEBUG_ASSERT(parse_error != GRPC_ERROR_NONE);
|
1833
|
-
error_list.push_back(parse_error);
|
1834
|
-
}
|
1835
|
-
} else if (strcmp(field->key, "fallbackPolicy") == 0) {
|
1836
|
-
if (fallback_policy != nullptr) {
|
1837
|
-
error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
1838
|
-
"field:fallbackPolicy error:Duplicate entry"));
|
1839
|
-
}
|
1840
|
-
grpc_error* parse_error = GRPC_ERROR_NONE;
|
1841
|
-
fallback_policy = LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(
|
1842
|
-
field, &parse_error);
|
1843
|
-
if (fallback_policy == nullptr) {
|
1844
|
-
GPR_DEBUG_ASSERT(parse_error != GRPC_ERROR_NONE);
|
1845
|
-
error_list.push_back(parse_error);
|
1846
|
-
}
|
1847
|
-
} else if (strcmp(field->key, "edsServiceName") == 0) {
|
1848
|
-
if (eds_service_name != nullptr) {
|
1849
|
-
error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
1850
|
-
"field:edsServiceName error:Duplicate entry"));
|
1851
|
-
}
|
1852
|
-
if (field->type != GRPC_JSON_STRING) {
|
1853
|
-
error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
1854
|
-
"field:edsServiceName error:type should be string"));
|
1855
|
-
continue;
|
1856
|
-
}
|
1857
|
-
eds_service_name = field->value;
|
1858
|
-
} else if (strcmp(field->key, "lrsLoadReportingServerName") == 0) {
|
1859
|
-
if (lrs_load_reporting_server_name != nullptr) {
|
1860
|
-
error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
1861
|
-
"field:lrsLoadReportingServerName error:Duplicate entry"));
|
1862
|
-
}
|
1863
|
-
if (field->type != GRPC_JSON_STRING) {
|
1864
|
-
error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
1865
|
-
"field:lrsLoadReportingServerName error:type should be string"));
|
1866
|
-
continue;
|
1867
|
-
}
|
1868
|
-
lrs_load_reporting_server_name = field->value;
|
1684
|
+
it = json.object_value().find("lrsLoadReportingServerName");
|
1685
|
+
if (it != json.object_value().end()) {
|
1686
|
+
if (it->second.type() != Json::Type::STRING) {
|
1687
|
+
error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
1688
|
+
"field:lrsLoadReportingServerName error:type should be string"));
|
1689
|
+
} else {
|
1690
|
+
lrs_load_reporting_server_name = it->second.string_value().c_str();
|
1869
1691
|
}
|
1870
1692
|
}
|
1871
1693
|
if (error_list.empty()) {
|
1872
|
-
|
1694
|
+
absl::optional<std::string> optional_lrs_load_reporting_server_name;
|
1695
|
+
if (lrs_load_reporting_server_name != nullptr) {
|
1696
|
+
optional_lrs_load_reporting_server_name.emplace(
|
1697
|
+
std::string(lrs_load_reporting_server_name));
|
1698
|
+
}
|
1699
|
+
return MakeRefCounted<XdsConfig>(
|
1873
1700
|
std::move(child_policy), std::move(fallback_policy),
|
1874
|
-
|
1875
|
-
|
1876
|
-
gpr_strdup(lrs_load_reporting_server_name)));
|
1701
|
+
eds_service_name == nullptr ? "" : eds_service_name,
|
1702
|
+
std::move(optional_lrs_load_reporting_server_name));
|
1877
1703
|
} else {
|
1878
1704
|
*error = GRPC_ERROR_CREATE_FROM_VECTOR("Xds Parser", &error_list);
|
1879
1705
|
return nullptr;
|
1880
1706
|
}
|
1881
1707
|
}
|
1708
|
+
|
1709
|
+
private:
|
1710
|
+
class XdsChildHandler : public ChildPolicyHandler {
|
1711
|
+
public:
|
1712
|
+
XdsChildHandler(Args args, TraceFlag* tracer)
|
1713
|
+
: ChildPolicyHandler(std::move(args), tracer) {}
|
1714
|
+
|
1715
|
+
bool ConfigChangeRequiresNewPolicyInstance(
|
1716
|
+
LoadBalancingPolicy::Config* old_config,
|
1717
|
+
LoadBalancingPolicy::Config* new_config) const override {
|
1718
|
+
GPR_ASSERT(old_config->name() == kXds);
|
1719
|
+
GPR_ASSERT(new_config->name() == kXds);
|
1720
|
+
XdsConfig* old_xds_config = static_cast<XdsConfig*>(old_config);
|
1721
|
+
XdsConfig* new_xds_config = static_cast<XdsConfig*>(new_config);
|
1722
|
+
const char* old_eds_service_name =
|
1723
|
+
old_xds_config->eds_service_name() == nullptr
|
1724
|
+
? ""
|
1725
|
+
: old_xds_config->eds_service_name();
|
1726
|
+
const char* new_eds_service_name =
|
1727
|
+
new_xds_config->eds_service_name() == nullptr
|
1728
|
+
? ""
|
1729
|
+
: new_xds_config->eds_service_name();
|
1730
|
+
return strcmp(old_eds_service_name, new_eds_service_name) != 0;
|
1731
|
+
}
|
1732
|
+
|
1733
|
+
OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(
|
1734
|
+
const char* name, LoadBalancingPolicy::Args args) const override {
|
1735
|
+
return MakeOrphanable<XdsLb>(std::move(args));
|
1736
|
+
}
|
1737
|
+
};
|
1882
1738
|
};
|
1883
1739
|
|
1884
1740
|
} // namespace
|
@@ -1892,7 +1748,7 @@ class XdsFactory : public LoadBalancingPolicyFactory {
|
|
1892
1748
|
void grpc_lb_policy_xds_init() {
|
1893
1749
|
grpc_core::LoadBalancingPolicyRegistry::Builder::
|
1894
1750
|
RegisterLoadBalancingPolicyFactory(
|
1895
|
-
|
1751
|
+
absl::make_unique<grpc_core::XdsFactory>());
|
1896
1752
|
}
|
1897
1753
|
|
1898
1754
|
void grpc_lb_policy_xds_shutdown() {}
|