grpc 1.28.0 → 1.30.2
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 +7694 -11190
- data/include/grpc/grpc.h +2 -2
- data/include/grpc/grpc_security.h +30 -9
- data/include/grpc/grpc_security_constants.h +1 -0
- data/include/grpc/impl/codegen/grpc_types.h +19 -21
- data/include/grpc/impl/codegen/port_platform.h +6 -2
- data/include/grpc/module.modulemap +24 -39
- data/src/core/ext/filters/client_channel/backend_metric.cc +7 -4
- data/src/core/ext/filters/client_channel/client_channel.cc +212 -241
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +3 -2
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +7 -22
- data/src/core/ext/filters/client_channel/health/health_check_client.h +3 -3
- data/src/core/ext/filters/client_channel/http_proxy.cc +17 -10
- data/src/core/ext/filters/client_channel/lb_policy.cc +19 -18
- data/src/core/ext/filters/client_channel/lb_policy.h +42 -33
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +83 -0
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +99 -0
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +10 -4
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +240 -301
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +89 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +40 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +11 -9
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +3 -2
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +871 -0
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +5 -11
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +734 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +84 -37
- data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +938 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc +528 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +1 -2
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +834 -0
- data/src/core/ext/filters/client_channel/lb_policy_registry.cc +6 -2
- data/src/core/ext/filters/client_channel/local_subchannel_pool.h +2 -1
- data/src/core/ext/filters/client_channel/parse_address.cc +22 -21
- data/src/core/ext/filters/client_channel/resolver.cc +5 -8
- data/src/core/ext/filters/client_channel/resolver.h +12 -14
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +73 -59
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +35 -35
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +8 -7
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +16 -20
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +4 -4
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +72 -117
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +184 -133
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +5 -3
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +7 -4
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +40 -43
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +93 -102
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +0 -4
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +2 -2
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +32 -5
- data/src/core/ext/filters/client_channel/resolver_factory.h +2 -2
- data/src/core/ext/filters/client_channel/resolver_registry.cc +6 -3
- data/src/core/ext/filters/client_channel/resolver_registry.h +8 -8
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +16 -16
- data/src/core/ext/filters/client_channel/resolver_result_parsing.h +19 -16
- data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +20 -31
- data/src/core/ext/filters/client_channel/resolving_lb_policy.h +4 -3
- data/src/core/ext/filters/client_channel/server_address.cc +6 -9
- data/src/core/ext/filters/client_channel/server_address.h +6 -12
- data/src/core/ext/filters/client_channel/service_config.cc +104 -144
- data/src/core/ext/filters/client_channel/service_config.h +28 -98
- data/src/core/ext/filters/client_channel/service_config_call_data.h +68 -0
- data/src/core/ext/filters/client_channel/service_config_parser.cc +87 -0
- data/src/core/ext/filters/client_channel/service_config_parser.h +89 -0
- data/src/core/ext/filters/client_channel/subchannel.cc +54 -24
- data/src/core/ext/filters/client_channel/subchannel.h +35 -11
- data/src/core/ext/filters/client_channel/xds/xds_api.cc +348 -221
- data/src/core/ext/filters/client_channel/xds/xds_api.h +37 -37
- data/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc +44 -49
- data/src/core/ext/filters/client_channel/xds/xds_bootstrap.h +4 -3
- data/src/core/ext/filters/client_channel/xds/xds_channel_secure.cc +4 -2
- data/src/core/ext/filters/client_channel/xds/xds_client.cc +532 -339
- data/src/core/ext/filters/client_channel/xds/xds_client.h +57 -22
- data/src/core/ext/filters/client_channel/xds/xds_client_stats.cc +11 -12
- data/src/core/ext/filters/client_channel/xds/xds_client_stats.h +31 -19
- data/src/core/ext/filters/http/client/http_client_filter.cc +23 -28
- data/src/core/ext/filters/http/client_authority_filter.cc +4 -4
- data/src/core/ext/filters/http/http_filters_plugin.cc +27 -12
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +258 -221
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +358 -0
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +29 -0
- data/src/core/ext/filters/message_size/message_size_filter.cc +7 -10
- data/src/core/ext/filters/message_size/message_size_filter.h +4 -4
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +4 -4
- data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +4 -6
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +23 -22
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -0
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +3 -3
- data/src/core/ext/transport/chttp2/transport/frame_goaway.h +2 -3
- data/src/core/ext/transport/chttp2/transport/frame_ping.h +2 -3
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +2 -3
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -3
- data/src/core/ext/transport/chttp2/transport/frame_window_update.h +2 -3
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +29 -16
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +2 -3
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +2 -3
- data/src/core/ext/transport/chttp2/transport/hpack_table.h +2 -2
- data/src/core/ext/transport/chttp2/transport/http2_settings.h +4 -5
- data/src/core/ext/transport/chttp2/transport/huffsyms.h +2 -3
- data/src/core/ext/transport/chttp2/transport/internal.h +14 -21
- data/src/core/ext/transport/chttp2/transport/stream_map.h +2 -3
- data/src/core/ext/transport/chttp2/transport/writing.cc +15 -8
- data/src/core/ext/transport/inproc/inproc_transport.cc +19 -0
- data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c +4 -229
- data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +5 -875
- data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c +114 -0
- data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h +418 -0
- data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c +72 -0
- data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h +197 -0
- data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c +105 -0
- data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h +378 -0
- data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c +21 -8
- data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h +43 -7
- data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c +1 -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 +2 -1
- data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c +35 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h +78 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +47 -26
- data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +115 -65
- data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c +34 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h +72 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c +2 -1
- data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c +24 -20
- data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +28 -13
- 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 +38 -18
- data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +88 -6
- data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c +34 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h +89 -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 +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c +9 -6
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h +12 -4
- 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 +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.c +15 -10
- data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.h +16 -0
- data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c +2 -1
- data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/route.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c +63 -41
- data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h +173 -77
- data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c +48 -28
- data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h +90 -30
- data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c +51 -0
- data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h +125 -0
- data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c +4 -2
- data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h +4 -0
- data/src/core/ext/upb-generated/envoy/type/http.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c +16 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h +36 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/type/percent.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/type/range.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c +1 -0
- data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +9 -8
- data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +30 -24
- data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +28 -0
- data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +65 -0
- data/src/core/ext/upb-generated/validate/validate.upb.c +21 -20
- data/src/core/ext/upb-generated/validate/validate.upb.h +69 -63
- data/src/core/lib/channel/channel_args.cc +15 -14
- data/src/core/lib/channel/channel_args.h +3 -1
- data/src/core/lib/channel/channel_stack.h +20 -13
- data/src/core/lib/channel/channelz.cc +5 -6
- data/src/core/lib/channel/channelz.h +3 -2
- data/src/core/lib/channel/channelz_registry.cc +5 -3
- data/src/core/lib/channel/connected_channel.cc +7 -5
- data/src/core/lib/channel/context.h +1 -1
- data/src/core/lib/channel/handshaker.cc +11 -13
- data/src/core/lib/channel/handshaker.h +4 -2
- data/src/core/lib/channel/handshaker_registry.cc +5 -17
- data/src/core/lib/channel/status_util.cc +2 -3
- data/src/core/lib/compression/message_compress.cc +5 -1
- data/src/core/lib/debug/stats.cc +21 -27
- data/src/core/lib/debug/stats.h +3 -1
- data/src/core/lib/gpr/spinlock.h +2 -3
- data/src/core/lib/gpr/string.cc +2 -26
- data/src/core/lib/gpr/string.h +0 -16
- data/src/core/lib/gpr/sync_abseil.cc +2 -0
- data/src/core/lib/gpr/time.cc +4 -0
- data/src/core/lib/gpr/time_posix.cc +1 -1
- data/src/core/lib/gprpp/atomic.h +6 -6
- data/src/core/lib/gprpp/fork.cc +1 -1
- data/src/core/lib/gprpp/host_port.cc +29 -35
- data/src/core/lib/gprpp/host_port.h +14 -17
- data/src/core/lib/gprpp/map.h +5 -11
- data/src/core/lib/gprpp/ref_counted_ptr.h +5 -0
- data/src/core/lib/http/format_request.cc +46 -65
- data/src/core/lib/http/httpcli.cc +2 -3
- data/src/core/lib/http/httpcli.h +2 -3
- data/src/core/lib/http/httpcli_security_connector.cc +5 -5
- data/src/core/lib/http/parser.h +2 -3
- data/src/core/lib/iomgr/buffer_list.h +22 -21
- data/src/core/lib/iomgr/call_combiner.h +3 -2
- data/src/core/lib/iomgr/cfstream_handle.cc +3 -2
- data/src/core/lib/iomgr/closure.h +2 -3
- data/src/core/lib/iomgr/dualstack_socket_posix.cc +47 -0
- data/src/core/lib/iomgr/endpoint_cfstream.cc +2 -3
- data/src/core/lib/iomgr/endpoint_pair.h +2 -3
- data/src/core/lib/iomgr/error.cc +6 -9
- data/src/core/lib/iomgr/error.h +0 -1
- data/src/core/lib/iomgr/ev_apple.cc +356 -0
- data/src/core/lib/iomgr/ev_apple.h +43 -0
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +20 -23
- data/src/core/lib/iomgr/ev_epollex_linux.cc +2 -3
- data/src/core/lib/iomgr/ev_poll_posix.cc +3 -3
- data/src/core/lib/iomgr/ev_posix.cc +2 -3
- data/src/core/lib/iomgr/exec_ctx.h +14 -2
- data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +84 -20
- data/src/core/lib/iomgr/pollset_set_custom.cc +10 -10
- data/src/core/lib/{gprpp/optional.h → iomgr/pollset_uv.h} +11 -12
- data/src/core/lib/iomgr/port.h +1 -0
- data/src/core/lib/iomgr/python_util.h +46 -0
- data/src/core/lib/iomgr/resolve_address.h +4 -6
- data/src/core/lib/iomgr/resolve_address_custom.cc +29 -39
- data/src/core/lib/iomgr/resolve_address_custom.h +4 -2
- data/src/core/lib/iomgr/resolve_address_posix.cc +10 -11
- data/src/core/lib/iomgr/resolve_address_windows.cc +8 -17
- data/src/core/lib/iomgr/resource_quota.cc +4 -6
- data/src/core/lib/iomgr/sockaddr_utils.cc +23 -29
- data/src/core/lib/iomgr/sockaddr_utils.h +9 -14
- data/src/core/lib/iomgr/socket_factory_posix.h +2 -3
- data/src/core/lib/iomgr/socket_mutator.h +2 -3
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +7 -26
- data/src/core/lib/iomgr/socket_utils_posix.h +3 -0
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +5 -7
- data/src/core/lib/iomgr/tcp_client_posix.cc +8 -5
- data/src/core/lib/iomgr/tcp_client_windows.cc +2 -3
- data/src/core/lib/iomgr/tcp_custom.cc +2 -3
- data/src/core/lib/iomgr/tcp_server_custom.cc +5 -9
- data/src/core/lib/iomgr/tcp_server_posix.cc +5 -4
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +5 -4
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +8 -11
- data/src/core/lib/iomgr/tcp_uv.cc +3 -2
- data/src/core/lib/iomgr/time_averaged_stats.h +2 -3
- data/src/core/lib/iomgr/timer_generic.cc +2 -3
- data/src/core/lib/{gprpp/inlined_vector.h → iomgr/timer_generic.h} +19 -17
- data/src/core/lib/iomgr/timer_heap.h +2 -3
- data/src/core/lib/iomgr/udp_server.cc +9 -14
- data/src/core/lib/json/json.h +3 -2
- data/src/core/lib/json/json_reader.cc +5 -5
- data/src/core/lib/json/json_writer.cc +13 -12
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +12 -0
- data/src/core/lib/security/credentials/composite/composite_credentials.h +6 -3
- data/src/core/lib/security/credentials/credentials.cc +0 -84
- data/src/core/lib/security/credentials/credentials.h +8 -59
- data/src/core/lib/security/credentials/fake/fake_credentials.h +4 -0
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +3 -8
- data/src/core/lib/security/credentials/iam/iam_credentials.cc +8 -6
- data/src/core/lib/security/credentials/iam/iam_credentials.h +4 -0
- data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
- data/src/core/lib/security/credentials/jwt/json_token.h +2 -5
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +12 -0
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +8 -15
- data/src/core/lib/security/credentials/jwt/jwt_verifier.h +2 -3
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +55 -27
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +9 -3
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +13 -0
- data/src/core/lib/security/credentials/plugin/plugin_credentials.h +2 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +23 -13
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +38 -11
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +21 -6
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +7 -7
- data/src/core/lib/security/security_connector/load_system_roots_linux.cc +3 -2
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +1 -1
- data/src/core/lib/security/security_connector/security_connector.h +1 -1
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +20 -25
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +4 -6
- data/src/core/lib/security/security_connector/ssl_utils.cc +59 -12
- data/src/core/lib/security/security_connector/ssl_utils.h +12 -10
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +77 -51
- data/src/core/lib/security/security_connector/tls/tls_security_connector.h +27 -5
- data/src/core/lib/security/transport/auth_filters.h +0 -5
- data/src/core/lib/security/transport/client_auth_filter.cc +1 -2
- data/src/core/lib/slice/slice_intern.cc +2 -3
- data/src/core/lib/slice/slice_internal.h +14 -0
- data/src/core/lib/slice/slice_utils.h +9 -0
- data/src/core/lib/surface/byte_buffer_reader.cc +2 -47
- data/src/core/lib/surface/call.cc +2 -3
- data/src/core/lib/surface/call_log_batch.cc +50 -58
- data/src/core/lib/surface/channel.cc +53 -31
- data/src/core/lib/surface/channel.h +35 -4
- data/src/core/lib/surface/channel_ping.cc +2 -3
- data/src/core/lib/surface/completion_queue.cc +33 -33
- data/src/core/lib/surface/event_string.cc +18 -25
- data/src/core/lib/surface/event_string.h +3 -1
- data/src/core/lib/surface/init_secure.cc +1 -4
- data/src/core/lib/surface/server.cc +570 -369
- data/src/core/lib/surface/server.h +32 -0
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/byte_stream.h +7 -2
- data/src/core/lib/transport/connectivity_state.cc +7 -6
- data/src/core/lib/transport/connectivity_state.h +5 -3
- data/src/core/lib/transport/metadata.cc +3 -3
- data/src/core/lib/transport/metadata_batch.h +2 -3
- data/src/core/lib/transport/static_metadata.h +1 -1
- data/src/core/lib/transport/status_conversion.cc +6 -14
- data/src/core/lib/transport/transport.cc +2 -3
- data/src/core/lib/transport/transport.h +3 -2
- data/src/core/lib/transport/transport_op_string.cc +61 -102
- data/src/core/lib/uri/uri_parser.h +2 -3
- data/src/core/plugin_registry/grpc_plugin_registry.cc +20 -4
- data/src/core/tsi/alts/crypt/aes_gcm.cc +0 -2
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +8 -1
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +8 -4
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +32 -2
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +9 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +2 -3
- data/src/core/tsi/fake_transport_security.cc +10 -15
- data/src/core/tsi/ssl/session_cache/ssl_session.h +0 -2
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +0 -2
- data/src/core/tsi/ssl_transport_security.cc +52 -39
- data/src/core/tsi/ssl_transport_security.h +8 -8
- data/src/core/tsi/ssl_types.h +0 -2
- data/src/core/tsi/transport_security.h +6 -9
- data/src/core/tsi/transport_security_grpc.h +2 -3
- data/src/core/tsi/transport_security_interface.h +3 -3
- data/src/ruby/ext/grpc/rb_call.c +9 -1
- data/src/ruby/ext/grpc/rb_call_credentials.c +3 -2
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
- data/src/ruby/lib/grpc/errors.rb +103 -42
- data/src/ruby/lib/grpc/generic/active_call.rb +2 -3
- data/src/ruby/lib/grpc/generic/interceptors.rb +4 -4
- data/src/ruby/lib/grpc/generic/rpc_server.rb +9 -10
- data/src/ruby/lib/grpc/generic/service.rb +5 -4
- data/src/ruby/lib/grpc/structs.rb +1 -1
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/generate_proto_ruby.sh +5 -3
- data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +11 -0
- data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +16 -0
- data/src/ruby/spec/debug_message_spec.rb +134 -0
- data/src/ruby/spec/generic/service_spec.rb +2 -0
- data/src/ruby/spec/pb/codegen/grpc/testing/package_options_import2.proto +23 -0
- data/src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto +7 -0
- data/src/ruby/spec/pb/codegen/package_option_spec.rb +7 -1
- data/src/ruby/spec/support/services.rb +10 -4
- data/src/ruby/spec/testdata/ca.pem +18 -13
- data/src/ruby/spec/testdata/client.key +26 -14
- data/src/ruby/spec/testdata/client.pem +18 -12
- data/src/ruby/spec/testdata/server1.key +26 -14
- data/src/ruby/spec/testdata/server1.pem +20 -14
- data/third_party/abseil-cpp/absl/time/civil_time.cc +175 -0
- data/third_party/abseil-cpp/absl/time/civil_time.h +538 -0
- data/third_party/abseil-cpp/absl/time/clock.cc +569 -0
- data/third_party/abseil-cpp/absl/time/clock.h +74 -0
- data/third_party/abseil-cpp/absl/time/duration.cc +922 -0
- data/third_party/abseil-cpp/absl/time/format.cc +153 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time.h +332 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +622 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +384 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/zone_info_source.h +102 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/civil_time_detail.cc +94 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +140 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.h +52 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +922 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.cc +45 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +76 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc +121 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h +93 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +958 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h +138 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +308 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.h +55 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +187 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.cc +159 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.h +132 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +122 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +115 -0
- data/third_party/abseil-cpp/absl/time/internal/get_current_time_chrono.inc +31 -0
- data/third_party/abseil-cpp/absl/time/internal/get_current_time_posix.inc +24 -0
- data/third_party/abseil-cpp/absl/time/time.cc +499 -0
- data/third_party/abseil-cpp/absl/time/time.h +1584 -0
- data/third_party/boringssl-with-bazel/err_data.c +329 -297
- data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c +7 -5
- data/third_party/boringssl-with-bazel/src/crypto/cpu-intel.c +13 -4
- data/third_party/boringssl-with-bazel/src/crypto/crypto.c +11 -0
- data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/curve25519.c +18 -26
- data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/curve25519_tables.h +13 -21
- data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/internal.h +14 -22
- data/third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/dh/dh.c +15 -0
- data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +10 -0
- data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +425 -0
- data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +78 -0
- data/third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/err/err.c +33 -32
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes_nohw.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +2 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/exponentiation.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +14 -11
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery.c +8 -8
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/mul.c +30 -154
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c +16 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +289 -117
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +13 -27
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_montgomery.c +96 -55
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/felem.c +25 -7
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +432 -160
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/oct.c +63 -71
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +5 -14
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64-table.h +9481 -9485
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64.c +80 -99
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +736 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256_table.h +297 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/scalar.c +90 -11
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.c +125 -148
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +189 -3
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.c +61 -18
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdh/ecdh.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +20 -5
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.c +137 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.h +49 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/getrandom_fillin.h +64 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +41 -5
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +32 -17
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +24 -114
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/blinding.c +4 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +51 -38
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +15 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +44 -35
- data/third_party/boringssl-with-bazel/src/crypto/mem.c +29 -12
- data/third_party/boringssl-with-bazel/src/crypto/obj/obj_dat.h +15 -1
- data/third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c +6 -10
- data/third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c +16 -0
- data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +4 -0
- data/third_party/boringssl-with-bazel/src/crypto/thread_win.c +4 -0
- data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +278 -0
- data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +1474 -0
- data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +720 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +16 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +5 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +4 -3
- data/third_party/boringssl-with-bazel/src/include/openssl/base.h +5 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +9 -4
- data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +20 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +1 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +16 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +6 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/err.h +2 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/nid.h +5 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +3 -17
- data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +31 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/sha.h +26 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +172 -77
- data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +1 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +291 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +5 -3
- data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +1 -0
- data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +0 -4
- data/third_party/boringssl-with-bazel/src/ssl/d1_lib.cc +3 -3
- data/third_party/boringssl-with-bazel/src/ssl/dtls_method.cc +13 -4
- data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +146 -57
- data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +14 -3
- data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +28 -20
- data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +12 -4
- data/third_party/boringssl-with-bazel/src/ssl/internal.h +64 -47
- data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +10 -10
- data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +2 -2
- data/third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc +21 -21
- data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +29 -0
- data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +4 -0
- data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +6 -1
- data/third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc +13 -2
- data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +64 -5
- data/third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc +6 -0
- data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +6 -2
- data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +47 -53
- data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +1 -1
- data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +98 -27
- data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +23 -75
- data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +50 -20
- data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +63 -25
- data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_32.h +245 -175
- data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64.h +135 -75
- data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_32.h +1593 -1672
- data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_64.h +512 -503
- metadata +115 -39
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +0 -1754
- data/src/core/lib/gprpp/string_view.h +0 -60
- data/src/core/tsi/grpc_shadow_boringssl.h +0 -3311
- data/third_party/boringssl-with-bazel/src/third_party/fiat/p256.c +0 -1063
@@ -160,7 +160,7 @@ class RoundRobin : public LoadBalancingPolicy {
|
|
160
160
|
RoundRobin* parent_;
|
161
161
|
|
162
162
|
size_t last_picked_index_;
|
163
|
-
InlinedVector<RefCountedPtr<SubchannelInterface>, 10> subchannels_;
|
163
|
+
absl::InlinedVector<RefCountedPtr<SubchannelInterface>, 10> subchannels_;
|
164
164
|
};
|
165
165
|
|
166
166
|
void ShutdownLocked() override;
|
@@ -25,6 +25,8 @@
|
|
25
25
|
|
26
26
|
#include <grpc/support/alloc.h>
|
27
27
|
|
28
|
+
#include "absl/container/inlined_vector.h"
|
29
|
+
|
28
30
|
#include "src/core/ext/filters/client_channel/lb_policy_registry.h"
|
29
31
|
#include "src/core/ext/filters/client_channel/server_address.h"
|
30
32
|
// TODO(roth): Should not need the include of subchannel.h here, since
|
@@ -33,7 +35,6 @@
|
|
33
35
|
#include "src/core/ext/filters/client_channel/subchannel_interface.h"
|
34
36
|
#include "src/core/lib/channel/channel_args.h"
|
35
37
|
#include "src/core/lib/debug/trace.h"
|
36
|
-
#include "src/core/lib/gprpp/inlined_vector.h"
|
37
38
|
#include "src/core/lib/gprpp/orphanable.h"
|
38
39
|
#include "src/core/lib/gprpp/ref_counted.h"
|
39
40
|
#include "src/core/lib/gprpp/ref_counted_ptr.h"
|
@@ -62,7 +63,7 @@ class MySubchannelList
|
|
62
63
|
};
|
63
64
|
|
64
65
|
*/
|
65
|
-
// All methods will be called from within the client_channel
|
66
|
+
// All methods will be called from within the client_channel work serializer.
|
66
67
|
|
67
68
|
namespace grpc_core {
|
68
69
|
|
@@ -172,7 +173,7 @@ class SubchannelData {
|
|
172
173
|
template <typename SubchannelListType, typename SubchannelDataType>
|
173
174
|
class SubchannelList : public InternallyRefCounted<SubchannelListType> {
|
174
175
|
public:
|
175
|
-
typedef InlinedVector<SubchannelDataType, 10> SubchannelVector;
|
176
|
+
typedef absl::InlinedVector<SubchannelDataType, 10> SubchannelVector;
|
176
177
|
|
177
178
|
// The number of subchannels in the list.
|
178
179
|
size_t num_subchannels() const { return subchannels_.size(); }
|
@@ -370,14 +371,7 @@ SubchannelList
|
|
370
371
|
GRPC_ARG_SERVICE_CONFIG};
|
371
372
|
// Create a subchannel for each address.
|
372
373
|
for (size_t i = 0; i < addresses.size(); i++) {
|
373
|
-
|
374
|
-
// principle, if we're dealing with this special case in the client_channel
|
375
|
-
// code for selecting grpclb, then we should also strip out these addresses
|
376
|
-
// there if we're not using grpclb.
|
377
|
-
if (addresses[i].IsBalancer()) {
|
378
|
-
continue;
|
379
|
-
}
|
380
|
-
InlinedVector<grpc_arg, 3> args_to_add;
|
374
|
+
absl::InlinedVector<grpc_arg, 3> args_to_add;
|
381
375
|
const size_t subchannel_address_arg_index = args_to_add.size();
|
382
376
|
args_to_add.emplace_back(
|
383
377
|
Subchannel::CreateSubchannelAddressArg(&addresses[i].address()));
|
@@ -0,0 +1,734 @@
|
|
1
|
+
//
|
2
|
+
// Copyright 2018 gRPC authors.
|
3
|
+
//
|
4
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
// you may not use this file except in compliance with the License.
|
6
|
+
// You may obtain a copy of the License at
|
7
|
+
//
|
8
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
//
|
10
|
+
// Unless required by applicable law or agreed to in writing, software
|
11
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
// See the License for the specific language governing permissions and
|
14
|
+
// limitations under the License.
|
15
|
+
//
|
16
|
+
|
17
|
+
#include <grpc/support/port_platform.h>
|
18
|
+
|
19
|
+
#include <inttypes.h>
|
20
|
+
#include <limits.h>
|
21
|
+
#include <string.h>
|
22
|
+
|
23
|
+
#include "absl/container/inlined_vector.h"
|
24
|
+
#include "absl/strings/str_cat.h"
|
25
|
+
|
26
|
+
#include <grpc/grpc.h>
|
27
|
+
|
28
|
+
#include "src/core/ext/filters/client_channel/lb_policy.h"
|
29
|
+
#include "src/core/ext/filters/client_channel/lb_policy/address_filtering.h"
|
30
|
+
#include "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h"
|
31
|
+
#include "src/core/ext/filters/client_channel/lb_policy_factory.h"
|
32
|
+
#include "src/core/ext/filters/client_channel/lb_policy_registry.h"
|
33
|
+
#include "src/core/lib/channel/channel_args.h"
|
34
|
+
#include "src/core/lib/gpr/string.h"
|
35
|
+
#include "src/core/lib/gprpp/orphanable.h"
|
36
|
+
#include "src/core/lib/gprpp/ref_counted_ptr.h"
|
37
|
+
#include "src/core/lib/iomgr/timer.h"
|
38
|
+
#include "src/core/lib/iomgr/work_serializer.h"
|
39
|
+
|
40
|
+
namespace grpc_core {
|
41
|
+
|
42
|
+
TraceFlag grpc_lb_weighted_target_trace(false, "weighted_target_lb");
|
43
|
+
|
44
|
+
namespace {
|
45
|
+
|
46
|
+
constexpr char kWeightedTarget[] = "weighted_target_experimental";
|
47
|
+
|
48
|
+
// How long we keep a child around for after it has been removed from
|
49
|
+
// the config.
|
50
|
+
constexpr int kChildRetentionIntervalMs = 15 * 60 * 1000;
|
51
|
+
|
52
|
+
// Config for weighted_target LB policy.
|
53
|
+
class WeightedTargetLbConfig : public LoadBalancingPolicy::Config {
|
54
|
+
public:
|
55
|
+
struct ChildConfig {
|
56
|
+
uint32_t weight;
|
57
|
+
RefCountedPtr<LoadBalancingPolicy::Config> config;
|
58
|
+
};
|
59
|
+
|
60
|
+
using TargetMap = std::map<std::string, ChildConfig>;
|
61
|
+
|
62
|
+
explicit WeightedTargetLbConfig(TargetMap target_map)
|
63
|
+
: target_map_(std::move(target_map)) {}
|
64
|
+
|
65
|
+
const char* name() const override { return kWeightedTarget; }
|
66
|
+
|
67
|
+
const TargetMap& target_map() const { return target_map_; }
|
68
|
+
|
69
|
+
private:
|
70
|
+
TargetMap target_map_;
|
71
|
+
};
|
72
|
+
|
73
|
+
// weighted_target LB policy.
|
74
|
+
class WeightedTargetLb : public LoadBalancingPolicy {
|
75
|
+
public:
|
76
|
+
explicit WeightedTargetLb(Args args);
|
77
|
+
|
78
|
+
const char* name() const override { return kWeightedTarget; }
|
79
|
+
|
80
|
+
void UpdateLocked(UpdateArgs args) override;
|
81
|
+
void ResetBackoffLocked() override;
|
82
|
+
|
83
|
+
private:
|
84
|
+
// A simple wrapper for ref-counting a picker from the child policy.
|
85
|
+
class ChildPickerWrapper : public RefCounted<ChildPickerWrapper> {
|
86
|
+
public:
|
87
|
+
explicit ChildPickerWrapper(std::unique_ptr<SubchannelPicker> picker)
|
88
|
+
: picker_(std::move(picker)) {}
|
89
|
+
PickResult Pick(PickArgs args) { return picker_->Pick(args); }
|
90
|
+
|
91
|
+
private:
|
92
|
+
std::unique_ptr<SubchannelPicker> picker_;
|
93
|
+
};
|
94
|
+
|
95
|
+
// Picks a child using stateless WRR and then delegates to that
|
96
|
+
// child's picker.
|
97
|
+
class WeightedPicker : public SubchannelPicker {
|
98
|
+
public:
|
99
|
+
// Maintains a weighted list of pickers from each child that is in
|
100
|
+
// ready state. The first element in the pair represents the end of a
|
101
|
+
// range proportional to the child's weight. The start of the range
|
102
|
+
// is the previous value in the vector and is 0 for the first element.
|
103
|
+
using PickerList = absl::InlinedVector<
|
104
|
+
std::pair<uint32_t, RefCountedPtr<ChildPickerWrapper>>, 1>;
|
105
|
+
|
106
|
+
explicit WeightedPicker(PickerList pickers)
|
107
|
+
: pickers_(std::move(pickers)) {}
|
108
|
+
|
109
|
+
PickResult Pick(PickArgs args) override;
|
110
|
+
|
111
|
+
private:
|
112
|
+
PickerList pickers_;
|
113
|
+
};
|
114
|
+
|
115
|
+
// Each WeightedChild holds a ref to its parent WeightedTargetLb.
|
116
|
+
class WeightedChild : public InternallyRefCounted<WeightedChild> {
|
117
|
+
public:
|
118
|
+
WeightedChild(RefCountedPtr<WeightedTargetLb> weighted_target_policy,
|
119
|
+
const std::string& name);
|
120
|
+
~WeightedChild();
|
121
|
+
|
122
|
+
void Orphan() override;
|
123
|
+
|
124
|
+
void UpdateLocked(const WeightedTargetLbConfig::ChildConfig& config,
|
125
|
+
ServerAddressList addresses,
|
126
|
+
const grpc_channel_args* args);
|
127
|
+
void ResetBackoffLocked();
|
128
|
+
void DeactivateLocked();
|
129
|
+
|
130
|
+
uint32_t weight() const { return weight_; }
|
131
|
+
grpc_connectivity_state connectivity_state() const {
|
132
|
+
return connectivity_state_;
|
133
|
+
}
|
134
|
+
RefCountedPtr<ChildPickerWrapper> picker_wrapper() const {
|
135
|
+
return picker_wrapper_;
|
136
|
+
}
|
137
|
+
|
138
|
+
private:
|
139
|
+
class Helper : public ChannelControlHelper {
|
140
|
+
public:
|
141
|
+
explicit Helper(RefCountedPtr<WeightedChild> weighted_child)
|
142
|
+
: weighted_child_(std::move(weighted_child)) {}
|
143
|
+
|
144
|
+
~Helper() { weighted_child_.reset(DEBUG_LOCATION, "Helper"); }
|
145
|
+
|
146
|
+
RefCountedPtr<SubchannelInterface> CreateSubchannel(
|
147
|
+
const grpc_channel_args& args) override;
|
148
|
+
void UpdateState(grpc_connectivity_state state,
|
149
|
+
std::unique_ptr<SubchannelPicker> picker) override;
|
150
|
+
void RequestReresolution() override;
|
151
|
+
void AddTraceEvent(TraceSeverity severity,
|
152
|
+
absl::string_view message) override;
|
153
|
+
|
154
|
+
private:
|
155
|
+
RefCountedPtr<WeightedChild> weighted_child_;
|
156
|
+
};
|
157
|
+
|
158
|
+
// Methods for dealing with the child policy.
|
159
|
+
OrphanablePtr<LoadBalancingPolicy> CreateChildPolicyLocked(
|
160
|
+
const grpc_channel_args* args);
|
161
|
+
|
162
|
+
void OnConnectivityStateUpdateLocked(
|
163
|
+
grpc_connectivity_state state,
|
164
|
+
std::unique_ptr<SubchannelPicker> picker);
|
165
|
+
|
166
|
+
static void OnDelayedRemovalTimer(void* arg, grpc_error* error);
|
167
|
+
void OnDelayedRemovalTimerLocked(grpc_error* error);
|
168
|
+
|
169
|
+
// The owning LB policy.
|
170
|
+
RefCountedPtr<WeightedTargetLb> weighted_target_policy_;
|
171
|
+
|
172
|
+
const std::string& name_;
|
173
|
+
|
174
|
+
uint32_t weight_;
|
175
|
+
|
176
|
+
OrphanablePtr<LoadBalancingPolicy> child_policy_;
|
177
|
+
|
178
|
+
RefCountedPtr<ChildPickerWrapper> picker_wrapper_;
|
179
|
+
grpc_connectivity_state connectivity_state_ = GRPC_CHANNEL_CONNECTING;
|
180
|
+
bool seen_failure_since_ready_ = false;
|
181
|
+
|
182
|
+
// States for delayed removal.
|
183
|
+
grpc_timer delayed_removal_timer_;
|
184
|
+
grpc_closure on_delayed_removal_timer_;
|
185
|
+
bool delayed_removal_timer_callback_pending_ = false;
|
186
|
+
bool shutdown_ = false;
|
187
|
+
};
|
188
|
+
|
189
|
+
~WeightedTargetLb();
|
190
|
+
|
191
|
+
void ShutdownLocked() override;
|
192
|
+
|
193
|
+
void UpdateStateLocked();
|
194
|
+
|
195
|
+
// Current config from the resolver.
|
196
|
+
RefCountedPtr<WeightedTargetLbConfig> config_;
|
197
|
+
|
198
|
+
// Internal state.
|
199
|
+
bool shutting_down_ = false;
|
200
|
+
|
201
|
+
// Children.
|
202
|
+
std::map<std::string, OrphanablePtr<WeightedChild>> targets_;
|
203
|
+
};
|
204
|
+
|
205
|
+
//
|
206
|
+
// WeightedTargetLb::WeightedPicker
|
207
|
+
//
|
208
|
+
|
209
|
+
WeightedTargetLb::PickResult WeightedTargetLb::WeightedPicker::Pick(
|
210
|
+
PickArgs args) {
|
211
|
+
// Generate a random number in [0, total weight).
|
212
|
+
const uint32_t key = rand() % pickers_[pickers_.size() - 1].first;
|
213
|
+
// Find the index in pickers_ corresponding to key.
|
214
|
+
size_t mid = 0;
|
215
|
+
size_t start_index = 0;
|
216
|
+
size_t end_index = pickers_.size() - 1;
|
217
|
+
size_t index = 0;
|
218
|
+
while (end_index > start_index) {
|
219
|
+
mid = (start_index + end_index) / 2;
|
220
|
+
if (pickers_[mid].first > key) {
|
221
|
+
end_index = mid;
|
222
|
+
} else if (pickers_[mid].first < key) {
|
223
|
+
start_index = mid + 1;
|
224
|
+
} else {
|
225
|
+
index = mid + 1;
|
226
|
+
break;
|
227
|
+
}
|
228
|
+
}
|
229
|
+
if (index == 0) index = start_index;
|
230
|
+
GPR_ASSERT(pickers_[index].first > key);
|
231
|
+
// Delegate to the child picker.
|
232
|
+
return pickers_[index].second->Pick(args);
|
233
|
+
}
|
234
|
+
|
235
|
+
//
|
236
|
+
// WeightedTargetLb
|
237
|
+
//
|
238
|
+
|
239
|
+
WeightedTargetLb::WeightedTargetLb(Args args)
|
240
|
+
: LoadBalancingPolicy(std::move(args)) {
|
241
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) {
|
242
|
+
gpr_log(GPR_INFO, "[weighted_target_lb %p] created", this);
|
243
|
+
}
|
244
|
+
}
|
245
|
+
|
246
|
+
WeightedTargetLb::~WeightedTargetLb() {
|
247
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) {
|
248
|
+
gpr_log(GPR_INFO,
|
249
|
+
"[weighted_target_lb %p] destroying weighted_target LB policy",
|
250
|
+
this);
|
251
|
+
}
|
252
|
+
}
|
253
|
+
|
254
|
+
void WeightedTargetLb::ShutdownLocked() {
|
255
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) {
|
256
|
+
gpr_log(GPR_INFO, "[weighted_target_lb %p] shutting down", this);
|
257
|
+
}
|
258
|
+
shutting_down_ = true;
|
259
|
+
targets_.clear();
|
260
|
+
}
|
261
|
+
|
262
|
+
void WeightedTargetLb::ResetBackoffLocked() {
|
263
|
+
for (auto& p : targets_) p.second->ResetBackoffLocked();
|
264
|
+
}
|
265
|
+
|
266
|
+
void WeightedTargetLb::UpdateLocked(UpdateArgs args) {
|
267
|
+
if (shutting_down_) return;
|
268
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) {
|
269
|
+
gpr_log(GPR_INFO, "[weighted_target_lb %p] Received update", this);
|
270
|
+
}
|
271
|
+
// Update config.
|
272
|
+
config_ = std::move(args.config);
|
273
|
+
// Deactivate the targets not in the new config.
|
274
|
+
for (const auto& p : targets_) {
|
275
|
+
const std::string& name = p.first;
|
276
|
+
WeightedChild* child = p.second.get();
|
277
|
+
if (config_->target_map().find(name) == config_->target_map().end()) {
|
278
|
+
child->DeactivateLocked();
|
279
|
+
}
|
280
|
+
}
|
281
|
+
// Create any children that don't already exist.
|
282
|
+
// Note that we add all children before updating any of them, because
|
283
|
+
// an update may trigger a child to immediately update its
|
284
|
+
// connectivity state (e.g., reporting TRANSIENT_FAILURE immediately when
|
285
|
+
// receiving an empty address list), and we don't want to return an
|
286
|
+
// overall state with incomplete data.
|
287
|
+
for (const auto& p : config_->target_map()) {
|
288
|
+
const std::string& name = p.first;
|
289
|
+
auto it = targets_.find(name);
|
290
|
+
if (it == targets_.end()) {
|
291
|
+
it = targets_.emplace(std::make_pair(name, nullptr)).first;
|
292
|
+
it->second = MakeOrphanable<WeightedChild>(
|
293
|
+
Ref(DEBUG_LOCATION, "WeightedChild"), it->first);
|
294
|
+
}
|
295
|
+
}
|
296
|
+
// Update all children.
|
297
|
+
HierarchicalAddressMap address_map =
|
298
|
+
MakeHierarchicalAddressMap(args.addresses);
|
299
|
+
for (const auto& p : config_->target_map()) {
|
300
|
+
const std::string& name = p.first;
|
301
|
+
const WeightedTargetLbConfig::ChildConfig& config = p.second;
|
302
|
+
targets_[name]->UpdateLocked(config, std::move(address_map[name]),
|
303
|
+
args.args);
|
304
|
+
}
|
305
|
+
UpdateStateLocked();
|
306
|
+
}
|
307
|
+
|
308
|
+
void WeightedTargetLb::UpdateStateLocked() {
|
309
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) {
|
310
|
+
gpr_log(GPR_INFO,
|
311
|
+
"[weighted_target_lb %p] scanning children to determine "
|
312
|
+
"connectivity state",
|
313
|
+
this);
|
314
|
+
}
|
315
|
+
// Construct a new picker which maintains a map of all child pickers
|
316
|
+
// that are ready. Each child is represented by a portion of the range
|
317
|
+
// proportional to its weight, such that the total range is the sum of the
|
318
|
+
// weights of all children.
|
319
|
+
WeightedPicker::PickerList picker_list;
|
320
|
+
uint32_t end = 0;
|
321
|
+
// Also count the number of children in each state, to determine the
|
322
|
+
// overall state.
|
323
|
+
size_t num_connecting = 0;
|
324
|
+
size_t num_idle = 0;
|
325
|
+
size_t num_transient_failures = 0;
|
326
|
+
for (const auto& p : targets_) {
|
327
|
+
const std::string& child_name = p.first;
|
328
|
+
const WeightedChild* child = p.second.get();
|
329
|
+
// Skip the targets that are not in the latest update.
|
330
|
+
if (config_->target_map().find(child_name) == config_->target_map().end()) {
|
331
|
+
continue;
|
332
|
+
}
|
333
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) {
|
334
|
+
gpr_log(GPR_INFO,
|
335
|
+
"[weighted_target_lb %p] child=%s state=%s weight=%d picker=%p",
|
336
|
+
this, child_name.c_str(),
|
337
|
+
ConnectivityStateName(child->connectivity_state()),
|
338
|
+
child->weight(), child->picker_wrapper().get());
|
339
|
+
}
|
340
|
+
switch (child->connectivity_state()) {
|
341
|
+
case GRPC_CHANNEL_READY: {
|
342
|
+
end += child->weight();
|
343
|
+
picker_list.push_back(std::make_pair(end, child->picker_wrapper()));
|
344
|
+
break;
|
345
|
+
}
|
346
|
+
case GRPC_CHANNEL_CONNECTING: {
|
347
|
+
++num_connecting;
|
348
|
+
break;
|
349
|
+
}
|
350
|
+
case GRPC_CHANNEL_IDLE: {
|
351
|
+
++num_idle;
|
352
|
+
break;
|
353
|
+
}
|
354
|
+
case GRPC_CHANNEL_TRANSIENT_FAILURE: {
|
355
|
+
++num_transient_failures;
|
356
|
+
break;
|
357
|
+
}
|
358
|
+
default:
|
359
|
+
GPR_UNREACHABLE_CODE(return );
|
360
|
+
}
|
361
|
+
}
|
362
|
+
// Determine aggregated connectivity state.
|
363
|
+
grpc_connectivity_state connectivity_state;
|
364
|
+
if (!picker_list.empty()) {
|
365
|
+
connectivity_state = GRPC_CHANNEL_READY;
|
366
|
+
} else if (num_connecting > 0) {
|
367
|
+
connectivity_state = GRPC_CHANNEL_CONNECTING;
|
368
|
+
} else if (num_idle > 0) {
|
369
|
+
connectivity_state = GRPC_CHANNEL_IDLE;
|
370
|
+
} else {
|
371
|
+
connectivity_state = GRPC_CHANNEL_TRANSIENT_FAILURE;
|
372
|
+
}
|
373
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) {
|
374
|
+
gpr_log(GPR_INFO, "[weighted_target_lb %p] connectivity changed to %s",
|
375
|
+
this, ConnectivityStateName(connectivity_state));
|
376
|
+
}
|
377
|
+
std::unique_ptr<SubchannelPicker> picker;
|
378
|
+
switch (connectivity_state) {
|
379
|
+
case GRPC_CHANNEL_READY:
|
380
|
+
picker = absl::make_unique<WeightedPicker>(std::move(picker_list));
|
381
|
+
break;
|
382
|
+
case GRPC_CHANNEL_CONNECTING:
|
383
|
+
case GRPC_CHANNEL_IDLE:
|
384
|
+
picker =
|
385
|
+
absl::make_unique<QueuePicker>(Ref(DEBUG_LOCATION, "QueuePicker"));
|
386
|
+
break;
|
387
|
+
default:
|
388
|
+
picker = absl::make_unique<TransientFailurePicker>(
|
389
|
+
GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
390
|
+
"weighted_target: all children report state TRANSIENT_FAILURE"));
|
391
|
+
}
|
392
|
+
channel_control_helper()->UpdateState(connectivity_state, std::move(picker));
|
393
|
+
}
|
394
|
+
|
395
|
+
//
|
396
|
+
// WeightedTargetLb::WeightedChild
|
397
|
+
//
|
398
|
+
|
399
|
+
WeightedTargetLb::WeightedChild::WeightedChild(
|
400
|
+
RefCountedPtr<WeightedTargetLb> weighted_target_policy,
|
401
|
+
const std::string& name)
|
402
|
+
: weighted_target_policy_(std::move(weighted_target_policy)), name_(name) {
|
403
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) {
|
404
|
+
gpr_log(GPR_INFO, "[weighted_target_lb %p] created WeightedChild %p for %s",
|
405
|
+
weighted_target_policy_.get(), this, name_.c_str());
|
406
|
+
}
|
407
|
+
GRPC_CLOSURE_INIT(&on_delayed_removal_timer_, OnDelayedRemovalTimer, this,
|
408
|
+
grpc_schedule_on_exec_ctx);
|
409
|
+
}
|
410
|
+
|
411
|
+
WeightedTargetLb::WeightedChild::~WeightedChild() {
|
412
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) {
|
413
|
+
gpr_log(GPR_INFO,
|
414
|
+
"[weighted_target_lb %p] WeightedChild %p %s: destroying child",
|
415
|
+
weighted_target_policy_.get(), this, name_.c_str());
|
416
|
+
}
|
417
|
+
weighted_target_policy_.reset(DEBUG_LOCATION, "WeightedChild");
|
418
|
+
}
|
419
|
+
|
420
|
+
void WeightedTargetLb::WeightedChild::Orphan() {
|
421
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) {
|
422
|
+
gpr_log(GPR_INFO,
|
423
|
+
"[weighted_target_lb %p] WeightedChild %p %s: shutting down child",
|
424
|
+
weighted_target_policy_.get(), this, name_.c_str());
|
425
|
+
}
|
426
|
+
// Remove the child policy's interested_parties pollset_set from the
|
427
|
+
// xDS policy.
|
428
|
+
grpc_pollset_set_del_pollset_set(
|
429
|
+
child_policy_->interested_parties(),
|
430
|
+
weighted_target_policy_->interested_parties());
|
431
|
+
child_policy_.reset();
|
432
|
+
// Drop our ref to the child's picker, in case it's holding a ref to
|
433
|
+
// the child.
|
434
|
+
picker_wrapper_.reset();
|
435
|
+
if (delayed_removal_timer_callback_pending_) {
|
436
|
+
delayed_removal_timer_callback_pending_ = false;
|
437
|
+
grpc_timer_cancel(&delayed_removal_timer_);
|
438
|
+
}
|
439
|
+
shutdown_ = true;
|
440
|
+
Unref();
|
441
|
+
}
|
442
|
+
|
443
|
+
OrphanablePtr<LoadBalancingPolicy>
|
444
|
+
WeightedTargetLb::WeightedChild::CreateChildPolicyLocked(
|
445
|
+
const grpc_channel_args* args) {
|
446
|
+
LoadBalancingPolicy::Args lb_policy_args;
|
447
|
+
lb_policy_args.work_serializer = weighted_target_policy_->work_serializer();
|
448
|
+
lb_policy_args.args = args;
|
449
|
+
lb_policy_args.channel_control_helper =
|
450
|
+
absl::make_unique<Helper>(this->Ref(DEBUG_LOCATION, "Helper"));
|
451
|
+
OrphanablePtr<LoadBalancingPolicy> lb_policy =
|
452
|
+
MakeOrphanable<ChildPolicyHandler>(std::move(lb_policy_args),
|
453
|
+
&grpc_lb_weighted_target_trace);
|
454
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) {
|
455
|
+
gpr_log(GPR_INFO,
|
456
|
+
"[weighted_target_lb %p] WeightedChild %p %s: Created new child "
|
457
|
+
"policy handler %p",
|
458
|
+
weighted_target_policy_.get(), this, name_.c_str(),
|
459
|
+
lb_policy.get());
|
460
|
+
}
|
461
|
+
// Add the xDS's interested_parties pollset_set to that of the newly created
|
462
|
+
// child policy. This will make the child policy progress upon activity on
|
463
|
+
// xDS LB, which in turn is tied to the application's call.
|
464
|
+
grpc_pollset_set_add_pollset_set(
|
465
|
+
lb_policy->interested_parties(),
|
466
|
+
weighted_target_policy_->interested_parties());
|
467
|
+
return lb_policy;
|
468
|
+
}
|
469
|
+
|
470
|
+
void WeightedTargetLb::WeightedChild::UpdateLocked(
|
471
|
+
const WeightedTargetLbConfig::ChildConfig& config,
|
472
|
+
ServerAddressList addresses, const grpc_channel_args* args) {
|
473
|
+
if (weighted_target_policy_->shutting_down_) return;
|
474
|
+
// Update child weight.
|
475
|
+
weight_ = config.weight;
|
476
|
+
// Reactivate if needed.
|
477
|
+
if (delayed_removal_timer_callback_pending_) {
|
478
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) {
|
479
|
+
gpr_log(GPR_INFO,
|
480
|
+
"[weighted_target_lb %p] WeightedChild %p %s: reactivating",
|
481
|
+
weighted_target_policy_.get(), this, name_.c_str());
|
482
|
+
}
|
483
|
+
delayed_removal_timer_callback_pending_ = false;
|
484
|
+
grpc_timer_cancel(&delayed_removal_timer_);
|
485
|
+
}
|
486
|
+
// Create child policy if needed.
|
487
|
+
if (child_policy_ == nullptr) {
|
488
|
+
child_policy_ = CreateChildPolicyLocked(args);
|
489
|
+
}
|
490
|
+
// Construct update args.
|
491
|
+
UpdateArgs update_args;
|
492
|
+
update_args.config = config.config;
|
493
|
+
update_args.addresses = std::move(addresses);
|
494
|
+
update_args.args = grpc_channel_args_copy(args);
|
495
|
+
// Update the policy.
|
496
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) {
|
497
|
+
gpr_log(GPR_INFO,
|
498
|
+
"[weighted_target_lb %p] WeightedChild %p %s: Updating child "
|
499
|
+
"policy handler %p",
|
500
|
+
weighted_target_policy_.get(), this, name_.c_str(),
|
501
|
+
child_policy_.get());
|
502
|
+
}
|
503
|
+
child_policy_->UpdateLocked(std::move(update_args));
|
504
|
+
}
|
505
|
+
|
506
|
+
void WeightedTargetLb::WeightedChild::ResetBackoffLocked() {
|
507
|
+
child_policy_->ResetBackoffLocked();
|
508
|
+
}
|
509
|
+
|
510
|
+
void WeightedTargetLb::WeightedChild::OnConnectivityStateUpdateLocked(
|
511
|
+
grpc_connectivity_state state, std::unique_ptr<SubchannelPicker> picker) {
|
512
|
+
// Cache the picker in the WeightedChild.
|
513
|
+
picker_wrapper_ = MakeRefCounted<ChildPickerWrapper>(std::move(picker));
|
514
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) {
|
515
|
+
gpr_log(GPR_INFO,
|
516
|
+
"[weighted_target_lb %p] WeightedChild %p %s: connectivity "
|
517
|
+
"state update: state=%s picker_wrapper=%p",
|
518
|
+
weighted_target_policy_.get(), this, name_.c_str(),
|
519
|
+
ConnectivityStateName(state), picker_wrapper_.get());
|
520
|
+
}
|
521
|
+
// If the child reports IDLE, immediately tell it to exit idle.
|
522
|
+
if (state == GRPC_CHANNEL_IDLE) child_policy_->ExitIdleLocked();
|
523
|
+
// Decide what state to report for aggregation purposes.
|
524
|
+
// If we haven't seen a failure since the last time we were in state
|
525
|
+
// READY, then we report the state change as-is. However, once we do see
|
526
|
+
// a failure, we report TRANSIENT_FAILURE and ignore any subsequent state
|
527
|
+
// changes until we go back into state READY.
|
528
|
+
if (!seen_failure_since_ready_) {
|
529
|
+
if (state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
|
530
|
+
seen_failure_since_ready_ = true;
|
531
|
+
}
|
532
|
+
} else {
|
533
|
+
if (state != GRPC_CHANNEL_READY) return;
|
534
|
+
seen_failure_since_ready_ = false;
|
535
|
+
}
|
536
|
+
connectivity_state_ = state;
|
537
|
+
// Notify the LB policy.
|
538
|
+
weighted_target_policy_->UpdateStateLocked();
|
539
|
+
}
|
540
|
+
|
541
|
+
void WeightedTargetLb::WeightedChild::DeactivateLocked() {
|
542
|
+
// If already deactivated, don't do that again.
|
543
|
+
if (weight_ == 0) return;
|
544
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) {
|
545
|
+
gpr_log(GPR_INFO,
|
546
|
+
"[weighted_target_lb %p] WeightedChild %p %s: deactivating",
|
547
|
+
weighted_target_policy_.get(), this, name_.c_str());
|
548
|
+
}
|
549
|
+
// Set the child weight to 0 so that future picker won't contain this child.
|
550
|
+
weight_ = 0;
|
551
|
+
// Start a timer to delete the child.
|
552
|
+
Ref(DEBUG_LOCATION, "WeightedChild+timer").release();
|
553
|
+
delayed_removal_timer_callback_pending_ = true;
|
554
|
+
grpc_timer_init(&delayed_removal_timer_,
|
555
|
+
ExecCtx::Get()->Now() + kChildRetentionIntervalMs,
|
556
|
+
&on_delayed_removal_timer_);
|
557
|
+
}
|
558
|
+
|
559
|
+
void WeightedTargetLb::WeightedChild::OnDelayedRemovalTimer(void* arg,
|
560
|
+
grpc_error* error) {
|
561
|
+
WeightedChild* self = static_cast<WeightedChild*>(arg);
|
562
|
+
GRPC_ERROR_REF(error); // ref owned by lambda
|
563
|
+
self->weighted_target_policy_->work_serializer()->Run(
|
564
|
+
[self, error]() { self->OnDelayedRemovalTimerLocked(error); },
|
565
|
+
DEBUG_LOCATION);
|
566
|
+
}
|
567
|
+
|
568
|
+
void WeightedTargetLb::WeightedChild::OnDelayedRemovalTimerLocked(
|
569
|
+
grpc_error* error) {
|
570
|
+
if (error == GRPC_ERROR_NONE && delayed_removal_timer_callback_pending_ &&
|
571
|
+
!shutdown_ && weight_ == 0) {
|
572
|
+
delayed_removal_timer_callback_pending_ = false;
|
573
|
+
weighted_target_policy_->targets_.erase(name_);
|
574
|
+
}
|
575
|
+
Unref(DEBUG_LOCATION, "WeightedChild+timer");
|
576
|
+
GRPC_ERROR_UNREF(error);
|
577
|
+
}
|
578
|
+
|
579
|
+
//
|
580
|
+
// WeightedTargetLb::WeightedChild::Helper
|
581
|
+
//
|
582
|
+
|
583
|
+
RefCountedPtr<SubchannelInterface>
|
584
|
+
WeightedTargetLb::WeightedChild::Helper::CreateSubchannel(
|
585
|
+
const grpc_channel_args& args) {
|
586
|
+
if (weighted_child_->weighted_target_policy_->shutting_down_) return nullptr;
|
587
|
+
return weighted_child_->weighted_target_policy_->channel_control_helper()
|
588
|
+
->CreateSubchannel(args);
|
589
|
+
}
|
590
|
+
|
591
|
+
void WeightedTargetLb::WeightedChild::Helper::UpdateState(
|
592
|
+
grpc_connectivity_state state, std::unique_ptr<SubchannelPicker> picker) {
|
593
|
+
if (weighted_child_->weighted_target_policy_->shutting_down_) return;
|
594
|
+
weighted_child_->OnConnectivityStateUpdateLocked(state, std::move(picker));
|
595
|
+
}
|
596
|
+
|
597
|
+
void WeightedTargetLb::WeightedChild::Helper::RequestReresolution() {
|
598
|
+
if (weighted_child_->weighted_target_policy_->shutting_down_) return;
|
599
|
+
weighted_child_->weighted_target_policy_->channel_control_helper()
|
600
|
+
->RequestReresolution();
|
601
|
+
}
|
602
|
+
|
603
|
+
void WeightedTargetLb::WeightedChild::Helper::AddTraceEvent(
|
604
|
+
TraceSeverity severity, absl::string_view message) {
|
605
|
+
if (weighted_child_->weighted_target_policy_->shutting_down_) return;
|
606
|
+
weighted_child_->weighted_target_policy_->channel_control_helper()
|
607
|
+
->AddTraceEvent(severity, message);
|
608
|
+
}
|
609
|
+
|
610
|
+
//
|
611
|
+
// factory
|
612
|
+
//
|
613
|
+
|
614
|
+
class WeightedTargetLbFactory : public LoadBalancingPolicyFactory {
|
615
|
+
public:
|
616
|
+
OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(
|
617
|
+
LoadBalancingPolicy::Args args) const override {
|
618
|
+
return MakeOrphanable<WeightedTargetLb>(std::move(args));
|
619
|
+
}
|
620
|
+
|
621
|
+
const char* name() const override { return kWeightedTarget; }
|
622
|
+
|
623
|
+
RefCountedPtr<LoadBalancingPolicy::Config> ParseLoadBalancingConfig(
|
624
|
+
const Json& json, grpc_error** error) const override {
|
625
|
+
GPR_DEBUG_ASSERT(error != nullptr && *error == GRPC_ERROR_NONE);
|
626
|
+
if (json.type() == Json::Type::JSON_NULL) {
|
627
|
+
// weighted_target was mentioned as a policy in the deprecated
|
628
|
+
// loadBalancingPolicy field or in the client API.
|
629
|
+
*error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
630
|
+
"field:loadBalancingPolicy error:weighted_target policy requires "
|
631
|
+
"configuration. Please use loadBalancingConfig field of service "
|
632
|
+
"config instead.");
|
633
|
+
return nullptr;
|
634
|
+
}
|
635
|
+
std::vector<grpc_error*> error_list;
|
636
|
+
// Weight map.
|
637
|
+
WeightedTargetLbConfig::TargetMap target_map;
|
638
|
+
auto it = json.object_value().find("targets");
|
639
|
+
if (it == json.object_value().end()) {
|
640
|
+
error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
641
|
+
"field:targets error:required field not present"));
|
642
|
+
} else if (it->second.type() != Json::Type::OBJECT) {
|
643
|
+
error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
644
|
+
"field:targets error:type should be object"));
|
645
|
+
} else {
|
646
|
+
for (const auto& p : it->second.object_value()) {
|
647
|
+
WeightedTargetLbConfig::ChildConfig child_config;
|
648
|
+
std::vector<grpc_error*> child_errors =
|
649
|
+
ParseChildConfig(p.second, &child_config);
|
650
|
+
if (!child_errors.empty()) {
|
651
|
+
// Can't use GRPC_ERROR_CREATE_FROM_VECTOR() here, because the error
|
652
|
+
// string is not static in this case.
|
653
|
+
grpc_error* error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
654
|
+
absl::StrCat("field:targets key:", p.first).c_str());
|
655
|
+
for (grpc_error* child_error : child_errors) {
|
656
|
+
error = grpc_error_add_child(error, child_error);
|
657
|
+
}
|
658
|
+
error_list.push_back(error);
|
659
|
+
} else {
|
660
|
+
target_map[p.first] = std::move(child_config);
|
661
|
+
}
|
662
|
+
}
|
663
|
+
}
|
664
|
+
if (!error_list.empty()) {
|
665
|
+
*error = GRPC_ERROR_CREATE_FROM_VECTOR(
|
666
|
+
"weighted_target_experimental LB policy config", &error_list);
|
667
|
+
return nullptr;
|
668
|
+
}
|
669
|
+
return MakeRefCounted<WeightedTargetLbConfig>(std::move(target_map));
|
670
|
+
}
|
671
|
+
|
672
|
+
private:
|
673
|
+
static std::vector<grpc_error*> ParseChildConfig(
|
674
|
+
const Json& json, WeightedTargetLbConfig::ChildConfig* child_config) {
|
675
|
+
std::vector<grpc_error*> error_list;
|
676
|
+
if (json.type() != Json::Type::OBJECT) {
|
677
|
+
error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
678
|
+
"value should be of type object"));
|
679
|
+
return error_list;
|
680
|
+
}
|
681
|
+
// Weight.
|
682
|
+
auto it = json.object_value().find("weight");
|
683
|
+
if (it == json.object_value().end()) {
|
684
|
+
error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
685
|
+
"required field \"weight\" not specified"));
|
686
|
+
} else if (it->second.type() != Json::Type::NUMBER) {
|
687
|
+
error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
688
|
+
"field:weight error:must be of type number"));
|
689
|
+
} else {
|
690
|
+
int weight = gpr_parse_nonnegative_int(it->second.string_value().c_str());
|
691
|
+
if (weight == -1) {
|
692
|
+
error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
693
|
+
"field:weight error:unparseable value"));
|
694
|
+
} else if (weight == 0) {
|
695
|
+
error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
696
|
+
"field:weight error:value must be greater than zero"));
|
697
|
+
} else {
|
698
|
+
child_config->weight = weight;
|
699
|
+
}
|
700
|
+
}
|
701
|
+
// Child policy.
|
702
|
+
it = json.object_value().find("childPolicy");
|
703
|
+
if (it != json.object_value().end()) {
|
704
|
+
grpc_error* parse_error = GRPC_ERROR_NONE;
|
705
|
+
child_config->config =
|
706
|
+
LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(it->second,
|
707
|
+
&parse_error);
|
708
|
+
if (child_config->config == nullptr) {
|
709
|
+
GPR_DEBUG_ASSERT(parse_error != GRPC_ERROR_NONE);
|
710
|
+
std::vector<grpc_error*> child_errors;
|
711
|
+
child_errors.push_back(parse_error);
|
712
|
+
error_list.push_back(
|
713
|
+
GRPC_ERROR_CREATE_FROM_VECTOR("field:childPolicy", &child_errors));
|
714
|
+
}
|
715
|
+
}
|
716
|
+
return error_list;
|
717
|
+
}
|
718
|
+
};
|
719
|
+
|
720
|
+
} // namespace
|
721
|
+
|
722
|
+
} // namespace grpc_core
|
723
|
+
|
724
|
+
//
|
725
|
+
// Plugin registration
|
726
|
+
//
|
727
|
+
|
728
|
+
void grpc_lb_policy_weighted_target_init() {
|
729
|
+
grpc_core::LoadBalancingPolicyRegistry::Builder::
|
730
|
+
RegisterLoadBalancingPolicyFactory(
|
731
|
+
absl::make_unique<grpc_core::WeightedTargetLbFactory>());
|
732
|
+
}
|
733
|
+
|
734
|
+
void grpc_lb_policy_weighted_target_shutdown() {}
|