grpc 1.28.0.pre2 → 1.31.0.pre1
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 +8313 -11862
- data/include/grpc/grpc.h +2 -2
- data/include/grpc/grpc_security.h +30 -9
- data/include/grpc/grpc_security_constants.h +4 -0
- data/include/grpc/impl/codegen/grpc_types.h +23 -23
- data/include/grpc/impl/codegen/port_platform.h +6 -34
- data/include/grpc/module.modulemap +24 -39
- data/src/core/ext/filters/client_channel/backend_metric.cc +18 -12
- data/src/core/ext/filters/client_channel/client_channel.cc +618 -482
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +3 -2
- data/src/core/ext/filters/client_channel/config_selector.cc +62 -0
- data/src/core/ext/filters/client_channel/config_selector.h +93 -0
- data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +24 -2
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +9 -22
- data/src/core/ext/filters/client_channel/health/health_check_client.h +3 -3
- data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +6 -5
- data/src/core/ext/filters/client_channel/http_proxy.cc +23 -14
- data/src/core/ext/filters/client_channel/lb_policy.cc +19 -18
- data/src/core/ext/filters/client_channel/lb_policy.h +44 -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 +297 -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 +311 -497
- 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 +9 -17
- 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 +117 -41
- 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 +1142 -0
- data/src/core/ext/filters/client_channel/lb_policy_registry.cc +10 -7
- 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 +78 -61
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +41 -40
- 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 +22 -24
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +12 -10
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +79 -122
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +199 -163
- 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 +46 -45
- 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 +64 -12
- data/src/core/ext/filters/client_channel/resolver_factory.h +2 -2
- data/src/core/ext/filters/client_channel/resolver_registry.cc +19 -17
- data/src/core/ext/filters/client_channel/resolver_registry.h +8 -8
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +21 -22
- data/src/core/ext/filters/client_channel/resolver_result_parsing.h +19 -16
- data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +73 -217
- data/src/core/ext/filters/client_channel/resolving_lb_policy.h +45 -27
- 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_channel_arg_filter.cc +142 -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 +55 -25
- data/src/core/ext/filters/client_channel/subchannel.h +35 -11
- data/src/core/ext/filters/client_channel/xds/xds_api.cc +1200 -246
- data/src/core/ext/filters/client_channel/xds/xds_api.h +130 -44
- data/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc +90 -29
- data/src/core/ext/filters/client_channel/xds/xds_bootstrap.h +9 -4
- 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 +839 -431
- data/src/core/ext/filters/client_channel/xds/xds_client.h +84 -33
- 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 +40 -28
- data/src/core/ext/filters/http/client/http_client_filter.cc +28 -33
- data/src/core/ext/filters/http/client_authority_filter.cc +4 -4
- data/src/core/ext/filters/http/http_filters_plugin.cc +28 -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 +399 -0
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +31 -0
- data/src/core/ext/filters/message_size/message_size_filter.cc +61 -88
- data/src/core/ext/filters/message_size/message_size_filter.h +10 -4
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +386 -350
- data/src/core/ext/transport/chttp2/server/chttp2_server.h +6 -2
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +1 -1
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +7 -13
- data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +7 -8
- data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +4 -6
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +42 -26
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -0
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +25 -30
- data/src/core/ext/transport/chttp2/transport/flow_control.h +14 -16
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +9 -12
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +4 -6
- data/src/core/ext/transport/chttp2/transport/frame_goaway.h +2 -3
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -6
- data/src/core/ext/transport/chttp2/transport/frame_ping.h +2 -3
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +12 -13
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +2 -3
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +6 -7
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -3
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +9 -12
- 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.cc +25 -29
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +2 -3
- data/src/core/ext/transport/chttp2/transport/hpack_table.cc +13 -17
- 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 +27 -21
- data/src/core/ext/transport/chttp2/transport/parsing.cc +33 -43
- data/src/core/ext/transport/chttp2/transport/stream_map.h +2 -3
- data/src/core/ext/transport/chttp2/transport/writing.cc +24 -22
- data/src/core/ext/transport/inproc/inproc_transport.cc +54 -15
- data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +0 -1
- data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +3 -4
- 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 -876
- 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 +429 -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 +198 -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 +388 -0
- data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.h +1 -2
- data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c +23 -10
- data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h +352 -310
- 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/circuit_breaker.upb.h +42 -34
- 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/filter.upb.h +7 -7
- 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/cluster/outlier_detection.upb.h +79 -61
- 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/address.upb.h +55 -49
- 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 +79 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +48 -27
- data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +258 -214
- 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/config_source.upb.h +51 -45
- 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 +71 -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/grpc_service.upb.h +107 -100
- 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 +157 -122
- 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/http_uri.upb.h +9 -9
- 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 +173 -73
- 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 +88 -0
- data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +2 -1
- data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h +95 -101
- data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.h +1 -2
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c +2 -1
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h +49 -65
- 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.upb.h +0 -1
- 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 +53 -38
- 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/endpoint/load_report.upb.h +70 -62
- data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.h +1 -2
- 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 +95 -63
- 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.upb.h +0 -1
- data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c +3 -2
- data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h +91 -80
- 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/listener/udp_listener_config.upb.h +9 -10
- data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.h +1 -2
- data/src/core/ext/upb-generated/envoy/api/v2/route.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/route.upb.h +36 -31
- 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.upb.h +0 -1
- data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c +68 -46
- data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h +770 -722
- data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h +16 -15
- data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.h +1 -2
- data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c +2 -1
- data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h +95 -88
- 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 +305 -210
- data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h +5 -5
- 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/discovery/v2/ads.upb.h +1 -2
- 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 +22 -16
- data/src/core/ext/upb-generated/envoy/type/http.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/type/http.upb.h +0 -1
- 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 +48 -11
- data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.h +14 -14
- data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h +23 -23
- data/src/core/ext/upb-generated/envoy/type/percent.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/type/percent.upb.h +8 -9
- data/src/core/ext/upb-generated/envoy/type/range.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/type/range.upb.h +15 -16
- data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.h +7 -8
- data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h +36 -35
- data/src/core/ext/upb-generated/gogoproto/gogo.upb.h +0 -1
- data/src/core/ext/upb-generated/google/api/annotations.upb.h +0 -1
- data/src/core/ext/upb-generated/google/api/http.upb.h +29 -28
- data/src/core/ext/upb-generated/google/protobuf/any.upb.h +5 -6
- data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +12 -11
- data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +421 -389
- data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +5 -6
- data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +1 -2
- data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +1 -1
- data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +33 -54
- data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +5 -6
- data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +27 -28
- data/src/core/ext/upb-generated/google/rpc/status.upb.h +8 -8
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +1 -1
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +32 -45
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +4 -4
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +157 -178
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +14 -13
- data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +6 -7
- data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +59 -56
- data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +11 -12
- data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +0 -1
- data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +28 -0
- data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +64 -0
- data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +6 -6
- data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +41 -68
- data/src/core/ext/upb-generated/validate/validate.upb.c +21 -20
- data/src/core/ext/upb-generated/validate/validate.upb.h +569 -562
- 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/channel_trace.cc +2 -6
- data/src/core/lib/channel/channelz.cc +10 -21
- 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/log_linux.cc +6 -8
- data/src/core/lib/gpr/log_posix.cc +6 -8
- data/src/core/lib/gpr/spinlock.h +2 -3
- data/src/core/lib/gpr/string.cc +10 -33
- data/src/core/lib/gpr/string.h +4 -18
- 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/global_config_env.cc +8 -6
- 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/gprpp/sync.h +9 -0
- data/src/core/lib/http/format_request.cc +46 -65
- data/src/core/lib/http/httpcli.cc +15 -13
- data/src/core/lib/http/httpcli.h +2 -3
- data/src/core/lib/http/httpcli_security_connector.cc +10 -10
- 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 +4 -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/endpoint_pair_posix.cc +10 -10
- data/src/core/lib/iomgr/error.cc +6 -9
- data/src/core/lib/iomgr/error.h +0 -1
- data/src/core/lib/iomgr/error_cfstream.cc +9 -8
- 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 +25 -29
- data/src/core/lib/iomgr/ev_epollex_linux.cc +17 -24
- data/src/core/lib/iomgr/ev_poll_posix.cc +9 -8
- data/src/core/lib/iomgr/ev_posix.cc +4 -3
- data/src/core/lib/iomgr/exec_ctx.h +14 -2
- data/src/core/lib/iomgr/iomgr.cc +10 -0
- data/src/core/lib/iomgr/iomgr.h +10 -0
- data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +84 -20
- data/src/core/lib/iomgr/is_epollexclusive_available.cc +14 -0
- 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 +2 -21
- 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 +42 -57
- 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 +16 -25
- data/src/core/lib/iomgr/resource_quota.cc +38 -37
- data/src/core/lib/iomgr/sockaddr_utils.cc +29 -33
- data/src/core/lib/iomgr/sockaddr_utils.h +10 -15
- 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 +102 -81
- data/src/core/lib/iomgr/socket_utils_posix.h +3 -0
- data/src/core/lib/iomgr/socket_windows.cc +4 -5
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +14 -18
- data/src/core/lib/iomgr/tcp_client_custom.cc +6 -9
- data/src/core/lib/iomgr/tcp_client_posix.cc +30 -36
- data/src/core/lib/iomgr/tcp_client_windows.cc +10 -11
- data/src/core/lib/iomgr/tcp_custom.cc +3 -4
- data/src/core/lib/iomgr/tcp_custom.h +1 -1
- data/src/core/lib/iomgr/tcp_server.cc +3 -4
- data/src/core/lib/iomgr/tcp_server.h +7 -5
- data/src/core/lib/iomgr/tcp_server_custom.cc +11 -23
- data/src/core/lib/iomgr/tcp_server_posix.cc +38 -44
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -4
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +7 -8
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +10 -18
- data/src/core/lib/iomgr/tcp_server_windows.cc +16 -16
- 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 +15 -15
- 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 +32 -36
- data/src/core/lib/iomgr/udp_server.h +5 -2
- data/src/core/lib/iomgr/unix_sockets_posix.cc +9 -14
- data/src/core/lib/iomgr/unix_sockets_posix.h +3 -1
- data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +5 -2
- data/src/core/lib/json/json.h +3 -2
- data/src/core/lib/json/json_reader.cc +25 -26
- 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 +13 -62
- data/src/core/lib/security/credentials/fake/fake_credentials.h +4 -0
- data/src/core/lib/security/credentials/google_default/credentials_generic.cc +8 -6
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +15 -17
- 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.cc +7 -4
- 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 +73 -54
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +9 -3
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +19 -6
- data/src/core/lib/security/credentials/plugin/plugin_credentials.h +2 -0
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +20 -0
- data/src/core/lib/security/credentials/ssl/ssl_credentials.h +10 -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 +48 -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 +17 -17
- 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.cc +2 -0
- data/src/core/lib/security/security_connector/security_connector.h +2 -2
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +38 -36
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +8 -5
- data/src/core/lib/security/security_connector/ssl_utils.cc +89 -21
- data/src/core/lib/security/security_connector/ssl_utils.h +18 -12
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +101 -72
- 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 +11 -11
- data/src/core/lib/security/util/json_util.cc +12 -13
- data/src/core/lib/slice/slice.cc +38 -1
- data/src/core/lib/slice/slice_intern.cc +2 -3
- data/src/core/lib/slice/slice_internal.h +15 -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 +42 -44
- 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 +304 -47
- data/src/core/lib/surface/completion_queue.h +8 -0
- 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.cc +2 -0
- data/src/core/lib/surface/init_secure.cc +1 -4
- data/src/core/lib/surface/server.cc +971 -837
- data/src/core/lib/surface/server.h +66 -12
- 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 +9 -2
- data/src/core/lib/transport/transport_op_string.cc +61 -102
- data/src/core/lib/uri/uri_parser.cc +8 -15
- data/src/core/lib/uri/uri_parser.h +2 -3
- data/src/core/plugin_registry/grpc_plugin_registry.cc +24 -4
- data/src/core/tsi/alts/crypt/aes_gcm.cc +0 -2
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +31 -14
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +8 -4
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +34 -2
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +9 -1
- data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +2 -0
- 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 +154 -50
- data/src/core/tsi/ssl_transport_security.h +22 -10
- 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 +8 -3
- data/src/ruby/ext/grpc/extconf.rb +5 -2
- data/src/ruby/ext/grpc/rb_call.c +12 -3
- data/src/ruby/ext/grpc/rb_call.h +4 -0
- data/src/ruby/ext/grpc/rb_call_credentials.c +57 -12
- 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 +5 -5
- 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 +335 -297
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/f_string.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +1 -0
- 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 +385 -0
- data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +56 -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/evp/evp_asn1.c +143 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes_nohw.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/mode_wrappers.c +17 -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 +25 -12
- 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 +434 -161
- 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 +18 -25
- 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 +104 -122
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +740 -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/util.c +3 -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/self_check/self_check.c +62 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +44 -35
- data/third_party/boringssl-with-bazel/src/crypto/mem.c +47 -16
- data/third_party/boringssl-with-bazel/src/crypto/obj/obj_dat.h +15 -1
- data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +7 -0
- data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +36 -5
- 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 +249 -0
- data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +1227 -0
- data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +682 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c +4 -4
- data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +8 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +4 -4
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509.c +0 -67
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +13 -6
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +10 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +57 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +4 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +33 -9
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +25 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +4 -3
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +35 -13
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +0 -154
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +28 -6
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +5 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +74 -35
- data/third_party/boringssl-with-bazel/src/include/openssl/aes.h +16 -4
- data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +22 -22
- data/third_party/boringssl-with-bazel/src/include/openssl/base.h +6 -2
- 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/evp.h +69 -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 +191 -79
- 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 +282 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +791 -715
- 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 +23 -5
- data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +30 -22
- data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +21 -4
- data/third_party/boringssl-with-bazel/src/ssl/internal.h +74 -54
- 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 +34 -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 +44 -5
- data/third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc +6 -0
- data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +5 -5
- data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +51 -26
- 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 +129 -48
- data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +23 -75
- data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +55 -22
- 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
- data/third_party/upb/upb/decode.c +467 -504
- data/third_party/upb/upb/encode.c +163 -121
- data/third_party/upb/upb/msg.c +130 -64
- data/third_party/upb/upb/msg.h +418 -14
- data/third_party/upb/upb/port_def.inc +35 -6
- data/third_party/upb/upb/port_undef.inc +8 -1
- data/third_party/upb/upb/table.c +53 -75
- data/third_party/upb/upb/table.int.h +11 -43
- data/third_party/upb/upb/upb.c +148 -124
- data/third_party/upb/upb/upb.h +65 -147
- data/third_party/upb/upb/upb.hpp +86 -0
- metadata +122 -41
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +0 -1908
- 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
- data/third_party/upb/upb/generated_util.h +0 -105
@@ -28,13 +28,19 @@
|
|
28
28
|
|
29
29
|
#include <set>
|
30
30
|
|
31
|
+
#include "absl/strings/string_view.h"
|
32
|
+
|
31
33
|
#include <grpc/support/alloc.h>
|
32
34
|
#include <grpc/support/log.h>
|
33
35
|
#include <grpc/support/string_util.h>
|
34
36
|
#include <grpc/support/sync.h>
|
35
37
|
|
38
|
+
#include "absl/container/inlined_vector.h"
|
39
|
+
#include "absl/types/optional.h"
|
40
|
+
|
36
41
|
#include "src/core/ext/filters/client_channel/backend_metric.h"
|
37
42
|
#include "src/core/ext/filters/client_channel/backup_poller.h"
|
43
|
+
#include "src/core/ext/filters/client_channel/config_selector.h"
|
38
44
|
#include "src/core/ext/filters/client_channel/global_subchannel_pool.h"
|
39
45
|
#include "src/core/ext/filters/client_channel/http_connect_handshaker.h"
|
40
46
|
#include "src/core/ext/filters/client_channel/lb_policy_registry.h"
|
@@ -45,6 +51,7 @@
|
|
45
51
|
#include "src/core/ext/filters/client_channel/resolving_lb_policy.h"
|
46
52
|
#include "src/core/ext/filters/client_channel/retry_throttle.h"
|
47
53
|
#include "src/core/ext/filters/client_channel/service_config.h"
|
54
|
+
#include "src/core/ext/filters/client_channel/service_config_call_data.h"
|
48
55
|
#include "src/core/ext/filters/client_channel/subchannel.h"
|
49
56
|
#include "src/core/ext/filters/deadline/deadline_filter.h"
|
50
57
|
#include "src/core/lib/backoff/backoff.h"
|
@@ -52,13 +59,12 @@
|
|
52
59
|
#include "src/core/lib/channel/connected_channel.h"
|
53
60
|
#include "src/core/lib/channel/status_util.h"
|
54
61
|
#include "src/core/lib/gpr/string.h"
|
55
|
-
#include "src/core/lib/gprpp/inlined_vector.h"
|
56
62
|
#include "src/core/lib/gprpp/manual_constructor.h"
|
57
63
|
#include "src/core/lib/gprpp/map.h"
|
58
64
|
#include "src/core/lib/gprpp/sync.h"
|
59
|
-
#include "src/core/lib/iomgr/combiner.h"
|
60
65
|
#include "src/core/lib/iomgr/iomgr.h"
|
61
66
|
#include "src/core/lib/iomgr/polling_entity.h"
|
67
|
+
#include "src/core/lib/iomgr/work_serializer.h"
|
62
68
|
#include "src/core/lib/profiling/timers.h"
|
63
69
|
#include "src/core/lib/slice/slice_internal.h"
|
64
70
|
#include "src/core/lib/slice/slice_string_helpers.h"
|
@@ -126,6 +132,7 @@ class ChannelData {
|
|
126
132
|
size_t per_rpc_retry_buffer_size() const {
|
127
133
|
return per_rpc_retry_buffer_size_;
|
128
134
|
}
|
135
|
+
grpc_channel_stack* owning_stack() const { return owning_stack_; }
|
129
136
|
|
130
137
|
// Note: Does NOT return a new ref.
|
131
138
|
grpc_error* disconnect_error() const {
|
@@ -143,12 +150,17 @@ class ChannelData {
|
|
143
150
|
bool received_service_config_data() const {
|
144
151
|
return received_service_config_data_;
|
145
152
|
}
|
153
|
+
grpc_error* resolver_transient_failure_error() const {
|
154
|
+
return resolver_transient_failure_error_;
|
155
|
+
}
|
146
156
|
RefCountedPtr<ServerRetryThrottleData> retry_throttle_data() const {
|
147
157
|
return retry_throttle_data_;
|
148
158
|
}
|
149
159
|
RefCountedPtr<ServiceConfig> service_config() const {
|
150
160
|
return service_config_;
|
151
161
|
}
|
162
|
+
ConfigSelector* config_selector() const { return config_selector_.get(); }
|
163
|
+
WorkSerializer* work_serializer() const { return work_serializer_.get(); }
|
152
164
|
|
153
165
|
RefCountedPtr<ConnectedSubchannel> GetConnectedSubchannelInDataPlane(
|
154
166
|
SubchannelInterface* subchannel) const;
|
@@ -159,21 +171,14 @@ class ChannelData {
|
|
159
171
|
grpc_connectivity_state* state,
|
160
172
|
grpc_closure* on_complete,
|
161
173
|
grpc_closure* watcher_timer_init) {
|
162
|
-
|
163
|
-
|
164
|
-
GPR_ASSERT(external_watchers_[on_complete] == nullptr);
|
165
|
-
external_watchers_[on_complete] = new ExternalConnectivityWatcher(
|
166
|
-
this, pollent, state, on_complete, watcher_timer_init);
|
174
|
+
new ExternalConnectivityWatcher(this, pollent, state, on_complete,
|
175
|
+
watcher_timer_init);
|
167
176
|
}
|
168
177
|
|
169
178
|
void RemoveExternalConnectivityWatcher(grpc_closure* on_complete,
|
170
179
|
bool cancel) {
|
171
|
-
|
172
|
-
|
173
|
-
if (it != external_watchers_.end()) {
|
174
|
-
if (cancel) it->second->Cancel();
|
175
|
-
external_watchers_.erase(it);
|
176
|
-
}
|
180
|
+
ExternalConnectivityWatcher::RemoveWatcherFromExternalWatchersMap(
|
181
|
+
this, on_complete, cancel);
|
177
182
|
}
|
178
183
|
|
179
184
|
int NumExternalConnectivityWatchers() const {
|
@@ -204,13 +209,20 @@ class ChannelData {
|
|
204
209
|
|
205
210
|
~ExternalConnectivityWatcher();
|
206
211
|
|
212
|
+
// Removes the watcher from the external_watchers_ map.
|
213
|
+
static void RemoveWatcherFromExternalWatchersMap(ChannelData* chand,
|
214
|
+
grpc_closure* on_complete,
|
215
|
+
bool cancel);
|
216
|
+
|
207
217
|
void Notify(grpc_connectivity_state state) override;
|
208
218
|
|
209
219
|
void Cancel();
|
210
220
|
|
211
221
|
private:
|
212
|
-
|
213
|
-
|
222
|
+
// Adds the watcher to state_tracker_. Consumes the ref that is passed to it
|
223
|
+
// from Start().
|
224
|
+
void AddWatcherLocked();
|
225
|
+
void RemoveWatcherLocked();
|
214
226
|
|
215
227
|
ChannelData* chand_;
|
216
228
|
grpc_polling_entity pollent_;
|
@@ -218,11 +230,32 @@ class ChannelData {
|
|
218
230
|
grpc_connectivity_state* state_;
|
219
231
|
grpc_closure* on_complete_;
|
220
232
|
grpc_closure* watcher_timer_init_;
|
221
|
-
grpc_closure add_closure_;
|
222
|
-
grpc_closure remove_closure_;
|
223
233
|
Atomic<bool> done_{false};
|
224
234
|
};
|
225
235
|
|
236
|
+
class ChannelConfigHelper
|
237
|
+
: public ResolvingLoadBalancingPolicy::ChannelConfigHelper {
|
238
|
+
public:
|
239
|
+
explicit ChannelConfigHelper(ChannelData* chand) : chand_(chand) {}
|
240
|
+
|
241
|
+
ApplyServiceConfigResult ApplyServiceConfig(
|
242
|
+
const Resolver::Result& result) override;
|
243
|
+
|
244
|
+
void ApplyConfigSelector(
|
245
|
+
bool service_config_changed,
|
246
|
+
RefCountedPtr<ConfigSelector> config_selector) override;
|
247
|
+
|
248
|
+
void ResolverTransientFailure(grpc_error* error) override;
|
249
|
+
|
250
|
+
private:
|
251
|
+
static void ProcessLbPolicy(
|
252
|
+
const Resolver::Result& resolver_result,
|
253
|
+
const internal::ClientChannelGlobalParsedConfig* parsed_service_config,
|
254
|
+
RefCountedPtr<LoadBalancingPolicy::Config>* lb_policy_config);
|
255
|
+
|
256
|
+
ChannelData* chand_;
|
257
|
+
};
|
258
|
+
|
226
259
|
ChannelData(grpc_channel_element_args* args, grpc_error** error);
|
227
260
|
~ChannelData();
|
228
261
|
|
@@ -230,29 +263,19 @@ class ChannelData {
|
|
230
263
|
grpc_connectivity_state state, const char* reason,
|
231
264
|
std::unique_ptr<LoadBalancingPolicy::SubchannelPicker> picker);
|
232
265
|
|
233
|
-
void
|
234
|
-
|
235
|
-
RefCountedPtr<
|
266
|
+
void UpdateServiceConfigInDataPlaneLocked(
|
267
|
+
bool service_config_changed,
|
268
|
+
RefCountedPtr<ConfigSelector> config_selector);
|
236
269
|
|
237
270
|
void CreateResolvingLoadBalancingPolicyLocked();
|
238
271
|
|
239
272
|
void DestroyResolvingLoadBalancingPolicyLocked();
|
240
273
|
|
241
|
-
static bool ProcessResolverResultLocked(
|
242
|
-
void* arg, const Resolver::Result& result,
|
243
|
-
RefCountedPtr<LoadBalancingPolicy::Config>* lb_policy_config,
|
244
|
-
grpc_error** service_config_error, bool* no_valid_service_config);
|
245
|
-
|
246
274
|
grpc_error* DoPingLocked(grpc_transport_op* op);
|
247
275
|
|
248
|
-
|
249
|
-
|
250
|
-
static void TryToConnectLocked(void* arg, grpc_error* error_ignored);
|
276
|
+
void StartTransportOpLocked(grpc_transport_op* op);
|
251
277
|
|
252
|
-
void
|
253
|
-
const Resolver::Result& resolver_result,
|
254
|
-
const internal::ClientChannelGlobalParsedConfig* parsed_service_config,
|
255
|
-
RefCountedPtr<LoadBalancingPolicy::Config>* lb_policy_config);
|
278
|
+
void TryToConnectLocked();
|
256
279
|
|
257
280
|
//
|
258
281
|
// Fields set at construction and never modified.
|
@@ -267,6 +290,7 @@ class ChannelData {
|
|
267
290
|
grpc_core::UniquePtr<char> server_name_;
|
268
291
|
grpc_core::UniquePtr<char> target_uri_;
|
269
292
|
channelz::ChannelNode* channelz_node_;
|
293
|
+
ChannelConfigHelper channel_config_helper_;
|
270
294
|
|
271
295
|
//
|
272
296
|
// Fields used in the data plane. Guarded by data_plane_mu.
|
@@ -275,36 +299,39 @@ class ChannelData {
|
|
275
299
|
std::unique_ptr<LoadBalancingPolicy::SubchannelPicker> picker_;
|
276
300
|
QueuedPick* queued_picks_ = nullptr; // Linked list of queued picks.
|
277
301
|
// Data from service config.
|
302
|
+
grpc_error* resolver_transient_failure_error_ = GRPC_ERROR_NONE;
|
278
303
|
bool received_service_config_data_ = false;
|
279
304
|
RefCountedPtr<ServerRetryThrottleData> retry_throttle_data_;
|
280
305
|
RefCountedPtr<ServiceConfig> service_config_;
|
306
|
+
RefCountedPtr<ConfigSelector> config_selector_;
|
281
307
|
|
282
308
|
//
|
283
|
-
// Fields used in the control plane. Guarded by
|
309
|
+
// Fields used in the control plane. Guarded by work_serializer.
|
284
310
|
//
|
285
|
-
|
311
|
+
std::shared_ptr<WorkSerializer> work_serializer_;
|
286
312
|
grpc_pollset_set* interested_parties_;
|
287
313
|
RefCountedPtr<SubchannelPoolInterface> subchannel_pool_;
|
288
314
|
OrphanablePtr<ResolvingLoadBalancingPolicy> resolving_lb_policy_;
|
289
315
|
ConnectivityStateTracker state_tracker_;
|
290
316
|
grpc_core::UniquePtr<char> health_check_service_name_;
|
291
317
|
RefCountedPtr<ServiceConfig> saved_service_config_;
|
318
|
+
RefCountedPtr<ConfigSelector> saved_config_selector_;
|
292
319
|
bool received_first_resolver_result_ = false;
|
293
320
|
// The number of SubchannelWrapper instances referencing a given Subchannel.
|
294
321
|
std::map<Subchannel*, int> subchannel_refcount_map_;
|
295
322
|
// The set of SubchannelWrappers that currently exist.
|
296
323
|
// No need to hold a ref, since the map is updated in the control-plane
|
297
|
-
//
|
324
|
+
// work_serializer when the SubchannelWrappers are created and destroyed.
|
298
325
|
std::set<SubchannelWrapper*> subchannel_wrappers_;
|
299
326
|
// Pending ConnectedSubchannel updates for each SubchannelWrapper.
|
300
|
-
// Updates are queued here in the control plane
|
301
|
-
// in the data plane mutex when the picker is updated.
|
302
|
-
std::map<RefCountedPtr<SubchannelWrapper>, RefCountedPtr<ConnectedSubchannel
|
303
|
-
RefCountedPtrLess<SubchannelWrapper>>
|
327
|
+
// Updates are queued here in the control plane work_serializer and then
|
328
|
+
// applied in the data plane mutex when the picker is updated.
|
329
|
+
std::map<RefCountedPtr<SubchannelWrapper>, RefCountedPtr<ConnectedSubchannel>>
|
304
330
|
pending_subchannel_updates_;
|
305
331
|
|
306
332
|
//
|
307
|
-
// Fields accessed from both data plane mutex and control plane
|
333
|
+
// Fields accessed from both data plane mutex and control plane
|
334
|
+
// work_serializer.
|
308
335
|
//
|
309
336
|
Atomic<grpc_error*> disconnect_error_;
|
310
337
|
|
@@ -321,7 +348,8 @@ class ChannelData {
|
|
321
348
|
// synchronously via grpc_channel_num_external_connectivity_watchers().
|
322
349
|
//
|
323
350
|
mutable Mutex external_watchers_mu_;
|
324
|
-
std::map<grpc_closure*, ExternalConnectivityWatcher
|
351
|
+
std::map<grpc_closure*, RefCountedPtr<ExternalConnectivityWatcher>>
|
352
|
+
external_watchers_;
|
325
353
|
};
|
326
354
|
|
327
355
|
//
|
@@ -341,9 +369,6 @@ class CallData {
|
|
341
369
|
|
342
370
|
RefCountedPtr<SubchannelCall> subchannel_call() { return subchannel_call_; }
|
343
371
|
|
344
|
-
// Invoked by channel for queued picks once resolver results are available.
|
345
|
-
void MaybeApplyServiceConfigToCallLocked(grpc_call_element* elem);
|
346
|
-
|
347
372
|
// Invoked by channel for queued picks when the picker is updated.
|
348
373
|
static void PickSubchannel(void* arg, grpc_error* error);
|
349
374
|
|
@@ -364,7 +389,7 @@ class CallData {
|
|
364
389
|
Metadata(CallData* calld, grpc_metadata_batch* batch)
|
365
390
|
: calld_(calld), batch_(batch) {}
|
366
391
|
|
367
|
-
void Add(
|
392
|
+
void Add(absl::string_view key, absl::string_view value) override {
|
368
393
|
grpc_linked_mdelem* linked_mdelem = static_cast<grpc_linked_mdelem*>(
|
369
394
|
calld_->arena_->Alloc(sizeof(grpc_linked_mdelem)));
|
370
395
|
linked_mdelem->md = grpc_mdelem_from_slices(
|
@@ -377,7 +402,8 @@ class CallData {
|
|
377
402
|
iterator begin() const override {
|
378
403
|
static_assert(sizeof(grpc_linked_mdelem*) <= sizeof(intptr_t),
|
379
404
|
"iterator size too large");
|
380
|
-
return iterator(
|
405
|
+
return iterator(
|
406
|
+
this, reinterpret_cast<intptr_t>(MaybeSkipEntry(batch_->list.head)));
|
381
407
|
}
|
382
408
|
iterator end() const override {
|
383
409
|
static_assert(sizeof(grpc_linked_mdelem*) <= sizeof(intptr_t),
|
@@ -394,12 +420,20 @@ class CallData {
|
|
394
420
|
}
|
395
421
|
|
396
422
|
private:
|
423
|
+
grpc_linked_mdelem* MaybeSkipEntry(grpc_linked_mdelem* entry) const {
|
424
|
+
if (entry != nullptr && batch_->idx.named.path == entry) {
|
425
|
+
return entry->next;
|
426
|
+
}
|
427
|
+
return entry;
|
428
|
+
}
|
429
|
+
|
397
430
|
intptr_t IteratorHandleNext(intptr_t handle) const override {
|
398
431
|
grpc_linked_mdelem* linked_mdelem =
|
399
432
|
reinterpret_cast<grpc_linked_mdelem*>(handle);
|
400
|
-
return reinterpret_cast<intptr_t>(linked_mdelem->next);
|
433
|
+
return reinterpret_cast<intptr_t>(MaybeSkipEntry(linked_mdelem->next));
|
401
434
|
}
|
402
|
-
|
435
|
+
|
436
|
+
std::pair<absl::string_view, absl::string_view> IteratorHandleGet(
|
403
437
|
intptr_t handle) const override {
|
404
438
|
grpc_linked_mdelem* linked_mdelem =
|
405
439
|
reinterpret_cast<grpc_linked_mdelem*>(handle);
|
@@ -431,6 +465,12 @@ class CallData {
|
|
431
465
|
return calld_->backend_metric_data_;
|
432
466
|
}
|
433
467
|
|
468
|
+
absl::string_view ExperimentalGetCallAttribute(const char* key) override {
|
469
|
+
auto it = calld_->call_attributes_.find(key);
|
470
|
+
if (it == calld_->call_attributes_.end()) return absl::string_view();
|
471
|
+
return it->second;
|
472
|
+
}
|
473
|
+
|
434
474
|
private:
|
435
475
|
CallData* calld_;
|
436
476
|
};
|
@@ -725,13 +765,17 @@ class CallData {
|
|
725
765
|
void CreateSubchannelCall(grpc_call_element* elem);
|
726
766
|
// Invoked when a pick is completed, on both success or failure.
|
727
767
|
static void PickDone(void* arg, grpc_error* error);
|
728
|
-
// Removes the call from the channel's list of queued picks.
|
729
|
-
void
|
730
|
-
// Adds the call to the channel's list of queued picks.
|
731
|
-
void
|
768
|
+
// Removes the call from the channel's list of queued picks if present.
|
769
|
+
void MaybeRemoveCallFromQueuedPicksLocked(grpc_call_element* elem);
|
770
|
+
// Adds the call to the channel's list of queued picks if not already present.
|
771
|
+
void MaybeAddCallToQueuedPicksLocked(grpc_call_element* elem);
|
732
772
|
// Applies service config to the call. Must be invoked once we know
|
733
773
|
// that the resolver has returned results to the channel.
|
734
|
-
|
774
|
+
// If an error is returned, the error indicates the status with which
|
775
|
+
// the call should be failed.
|
776
|
+
grpc_error* ApplyServiceConfigToCallLocked(
|
777
|
+
grpc_call_element* elem, grpc_metadata_batch* initial_metadata);
|
778
|
+
void MaybeInvokeConfigSelectorCommitCallback();
|
735
779
|
|
736
780
|
// State for handling deadlines.
|
737
781
|
// The code in deadline_filter.c requires this to be the first field.
|
@@ -750,8 +794,9 @@ class CallData {
|
|
750
794
|
grpc_call_context_element* call_context_;
|
751
795
|
|
752
796
|
RefCountedPtr<ServerRetryThrottleData> retry_throttle_data_;
|
753
|
-
ServiceConfig::CallData service_config_call_data_;
|
754
797
|
const ClientChannelMethodParsedConfig* method_params_ = nullptr;
|
798
|
+
std::map<const char*, absl::string_view> call_attributes_;
|
799
|
+
std::function<void()> on_call_committed_;
|
755
800
|
|
756
801
|
RefCountedPtr<SubchannelCall> subchannel_call_;
|
757
802
|
|
@@ -820,7 +865,7 @@ class CallData {
|
|
820
865
|
// Note: We inline the cache for the first 3 send_message ops and use
|
821
866
|
// dynamic allocation after that. This number was essentially picked
|
822
867
|
// at random; it could be changed in the future to tune performance.
|
823
|
-
InlinedVector<ByteStreamCache*, 3> send_messages_;
|
868
|
+
absl::InlinedVector<ByteStreamCache*, 3> send_messages_;
|
824
869
|
// send_trailing_metadata
|
825
870
|
bool seen_send_trailing_metadata_ = false;
|
826
871
|
grpc_linked_mdelem* send_trailing_metadata_storage_ = nullptr;
|
@@ -838,7 +883,7 @@ class CallData {
|
|
838
883
|
// Note that no synchronization is needed here, because even if the
|
839
884
|
// underlying subchannel is shared between channels, this wrapper will only
|
840
885
|
// be used within one channel, so it will always be synchronized by the
|
841
|
-
// control plane
|
886
|
+
// control plane work_serializer.
|
842
887
|
class ChannelData::SubchannelWrapper : public SubchannelInterface {
|
843
888
|
public:
|
844
889
|
SubchannelWrapper(ChannelData* chand, Subchannel* subchannel,
|
@@ -907,7 +952,7 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface {
|
|
907
952
|
initial_state,
|
908
953
|
grpc_core::UniquePtr<char>(
|
909
954
|
gpr_strdup(health_check_service_name_.get())),
|
910
|
-
|
955
|
+
RefCountedPtr<Subchannel::ConnectivityStateWatcherInterface>(
|
911
956
|
watcher_wrapper));
|
912
957
|
}
|
913
958
|
|
@@ -957,14 +1002,14 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface {
|
|
957
1002
|
replacement->last_seen_state(),
|
958
1003
|
grpc_core::UniquePtr<char>(
|
959
1004
|
gpr_strdup(health_check_service_name.get())),
|
960
|
-
|
1005
|
+
RefCountedPtr<Subchannel::ConnectivityStateWatcherInterface>(
|
961
1006
|
replacement));
|
962
1007
|
}
|
963
1008
|
// Save the new health check service name.
|
964
1009
|
health_check_service_name_ = std::move(health_check_service_name);
|
965
1010
|
}
|
966
1011
|
|
967
|
-
// Caller must be holding the control-plane
|
1012
|
+
// Caller must be holding the control-plane work_serializer.
|
968
1013
|
ConnectedSubchannel* connected_subchannel() const {
|
969
1014
|
return connected_subchannel_.get();
|
970
1015
|
}
|
@@ -1004,23 +1049,27 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface {
|
|
1004
1049
|
parent_(std::move(parent)),
|
1005
1050
|
last_seen_state_(initial_state) {}
|
1006
1051
|
|
1007
|
-
~WatcherWrapper() {
|
1008
|
-
|
1009
|
-
|
1052
|
+
~WatcherWrapper() {
|
1053
|
+
auto* parent = parent_.release(); // ref owned by lambda
|
1054
|
+
parent->chand_->work_serializer_->Run(
|
1055
|
+
[parent]() { parent->Unref(DEBUG_LOCATION, "WatcherWrapper"); },
|
1056
|
+
DEBUG_LOCATION);
|
1057
|
+
}
|
1010
1058
|
|
1011
|
-
void OnConnectivityStateChange(
|
1012
|
-
grpc_connectivity_state new_state,
|
1013
|
-
RefCountedPtr<ConnectedSubchannel> connected_subchannel) override {
|
1059
|
+
void OnConnectivityStateChange() override {
|
1014
1060
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
|
1015
1061
|
gpr_log(GPR_INFO,
|
1016
1062
|
"chand=%p: connectivity change for subchannel wrapper %p "
|
1017
|
-
"subchannel %p
|
1018
|
-
|
1019
|
-
parent_->chand_, parent_.get(), parent_->subchannel_,
|
1020
|
-
connected_subchannel.get(), ConnectivityStateName(new_state));
|
1063
|
+
"subchannel %p; hopping into work_serializer",
|
1064
|
+
parent_->chand_, parent_.get(), parent_->subchannel_);
|
1021
1065
|
}
|
1022
|
-
//
|
1023
|
-
|
1066
|
+
Ref().release(); // ref owned by lambda
|
1067
|
+
parent_->chand_->work_serializer_->Run(
|
1068
|
+
[this]() {
|
1069
|
+
ApplyUpdateInControlPlaneWorkSerializer();
|
1070
|
+
Unref();
|
1071
|
+
},
|
1072
|
+
DEBUG_LOCATION);
|
1024
1073
|
}
|
1025
1074
|
|
1026
1075
|
grpc_pollset_set* interested_parties() override {
|
@@ -1040,50 +1089,25 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface {
|
|
1040
1089
|
grpc_connectivity_state last_seen_state() const { return last_seen_state_; }
|
1041
1090
|
|
1042
1091
|
private:
|
1043
|
-
|
1044
|
-
|
1045
|
-
|
1046
|
-
|
1047
|
-
|
1048
|
-
|
1049
|
-
|
1050
|
-
|
1051
|
-
parent_->parent_->chand_->combiner_->Run(
|
1052
|
-
GRPC_CLOSURE_INIT(&closure_, ApplyUpdateInControlPlaneCombiner,
|
1053
|
-
this, nullptr),
|
1054
|
-
GRPC_ERROR_NONE);
|
1092
|
+
void ApplyUpdateInControlPlaneWorkSerializer() {
|
1093
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
|
1094
|
+
gpr_log(GPR_INFO,
|
1095
|
+
"chand=%p: processing connectivity change in work serializer "
|
1096
|
+
"for subchannel wrapper %p subchannel %p "
|
1097
|
+
"watcher=%p",
|
1098
|
+
parent_->chand_, parent_.get(), parent_->subchannel_,
|
1099
|
+
watcher_.get());
|
1055
1100
|
}
|
1056
|
-
|
1057
|
-
|
1058
|
-
|
1059
|
-
|
1060
|
-
|
1061
|
-
|
1062
|
-
|
1063
|
-
|
1064
|
-
"for subchannel wrapper %p subchannel %p "
|
1065
|
-
"(connected_subchannel=%p state=%s): watcher=%p",
|
1066
|
-
self->parent_->parent_->chand_, self->parent_->parent_.get(),
|
1067
|
-
self->parent_->parent_->subchannel_,
|
1068
|
-
self->connected_subchannel_.get(),
|
1069
|
-
ConnectivityStateName(self->state_),
|
1070
|
-
self->parent_->watcher_.get());
|
1071
|
-
}
|
1072
|
-
// Ignore update if the parent WatcherWrapper has been replaced
|
1073
|
-
// since this callback was scheduled.
|
1074
|
-
if (self->parent_->watcher_ == nullptr) return;
|
1075
|
-
self->parent_->last_seen_state_ = self->state_;
|
1076
|
-
self->parent_->parent_->MaybeUpdateConnectedSubchannel(
|
1077
|
-
std::move(self->connected_subchannel_));
|
1078
|
-
self->parent_->watcher_->OnConnectivityStateChange(self->state_);
|
1079
|
-
delete self;
|
1101
|
+
ConnectivityStateChange state_change = PopConnectivityStateChange();
|
1102
|
+
// Ignore update if the parent WatcherWrapper has been replaced
|
1103
|
+
// since this callback was scheduled.
|
1104
|
+
if (watcher_ != nullptr) {
|
1105
|
+
last_seen_state_ = state_change.state;
|
1106
|
+
parent_->MaybeUpdateConnectedSubchannel(
|
1107
|
+
std::move(state_change.connected_subchannel));
|
1108
|
+
watcher_->OnConnectivityStateChange(state_change.state);
|
1080
1109
|
}
|
1081
|
-
|
1082
|
-
RefCountedPtr<WatcherWrapper> parent_;
|
1083
|
-
grpc_connectivity_state state_;
|
1084
|
-
RefCountedPtr<ConnectedSubchannel> connected_subchannel_;
|
1085
|
-
grpc_closure closure_;
|
1086
|
-
};
|
1110
|
+
}
|
1087
1111
|
|
1088
1112
|
std::unique_ptr<SubchannelInterface::ConnectivityStateWatcherInterface>
|
1089
1113
|
watcher_;
|
@@ -1122,7 +1146,7 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface {
|
|
1122
1146
|
// CancelConnectivityStateWatch() with its watcher, we know the
|
1123
1147
|
// corresponding WrapperWatcher to cancel on the underlying subchannel.
|
1124
1148
|
std::map<ConnectivityStateWatcherInterface*, WatcherWrapper*> watcher_map_;
|
1125
|
-
// To be accessed only in the control plane
|
1149
|
+
// To be accessed only in the control plane work_serializer.
|
1126
1150
|
RefCountedPtr<ConnectedSubchannel> connected_subchannel_;
|
1127
1151
|
// To be accessed only in the data plane mutex.
|
1128
1152
|
RefCountedPtr<ConnectedSubchannel> connected_subchannel_in_data_plane_;
|
@@ -1145,9 +1169,21 @@ ChannelData::ExternalConnectivityWatcher::ExternalConnectivityWatcher(
|
|
1145
1169
|
grpc_polling_entity_add_to_pollset_set(&pollent_,
|
1146
1170
|
chand_->interested_parties_);
|
1147
1171
|
GRPC_CHANNEL_STACK_REF(chand_->owning_stack_, "ExternalConnectivityWatcher");
|
1148
|
-
|
1149
|
-
|
1150
|
-
|
1172
|
+
{
|
1173
|
+
MutexLock lock(&chand_->external_watchers_mu_);
|
1174
|
+
// Will be deleted when the watch is complete.
|
1175
|
+
GPR_ASSERT(chand->external_watchers_[on_complete] == nullptr);
|
1176
|
+
// Store a ref to the watcher in the external_watchers_ map.
|
1177
|
+
chand->external_watchers_[on_complete] =
|
1178
|
+
Ref(DEBUG_LOCATION, "AddWatcherToExternalWatchersMapLocked");
|
1179
|
+
}
|
1180
|
+
// Pass the ref from creating the object to Start().
|
1181
|
+
chand_->work_serializer_->Run(
|
1182
|
+
[this]() {
|
1183
|
+
// The ref is passed to AddWatcherLocked().
|
1184
|
+
AddWatcherLocked();
|
1185
|
+
},
|
1186
|
+
DEBUG_LOCATION);
|
1151
1187
|
}
|
1152
1188
|
|
1153
1189
|
ChannelData::ExternalConnectivityWatcher::~ExternalConnectivityWatcher() {
|
@@ -1157,6 +1193,24 @@ ChannelData::ExternalConnectivityWatcher::~ExternalConnectivityWatcher() {
|
|
1157
1193
|
"ExternalConnectivityWatcher");
|
1158
1194
|
}
|
1159
1195
|
|
1196
|
+
void ChannelData::ExternalConnectivityWatcher::
|
1197
|
+
RemoveWatcherFromExternalWatchersMap(ChannelData* chand,
|
1198
|
+
grpc_closure* on_complete,
|
1199
|
+
bool cancel) {
|
1200
|
+
RefCountedPtr<ExternalConnectivityWatcher> watcher;
|
1201
|
+
{
|
1202
|
+
MutexLock lock(&chand->external_watchers_mu_);
|
1203
|
+
auto it = chand->external_watchers_.find(on_complete);
|
1204
|
+
if (it != chand->external_watchers_.end()) {
|
1205
|
+
watcher = std::move(it->second);
|
1206
|
+
chand->external_watchers_.erase(it);
|
1207
|
+
}
|
1208
|
+
}
|
1209
|
+
// watcher->Cancel() will hop into the WorkSerializer, so we have to unlock
|
1210
|
+
// the mutex before calling it.
|
1211
|
+
if (watcher != nullptr && cancel) watcher->Cancel();
|
1212
|
+
}
|
1213
|
+
|
1160
1214
|
void ChannelData::ExternalConnectivityWatcher::Notify(
|
1161
1215
|
grpc_connectivity_state state) {
|
1162
1216
|
bool done = false;
|
@@ -1169,13 +1223,12 @@ void ChannelData::ExternalConnectivityWatcher::Notify(
|
|
1169
1223
|
// Report new state to the user.
|
1170
1224
|
*state_ = state;
|
1171
1225
|
ExecCtx::Run(DEBUG_LOCATION, on_complete_, GRPC_ERROR_NONE);
|
1172
|
-
// Hop back into the
|
1226
|
+
// Hop back into the work_serializer to clean up.
|
1173
1227
|
// Not needed in state SHUTDOWN, because the tracker will
|
1174
1228
|
// automatically remove all watchers in that case.
|
1175
1229
|
if (state != GRPC_CHANNEL_SHUTDOWN) {
|
1176
|
-
chand_->
|
1177
|
-
|
1178
|
-
GRPC_ERROR_NONE);
|
1230
|
+
chand_->work_serializer_->Run([this]() { RemoveWatcherLocked(); },
|
1231
|
+
DEBUG_LOCATION);
|
1179
1232
|
}
|
1180
1233
|
}
|
1181
1234
|
|
@@ -1186,28 +1239,20 @@ void ChannelData::ExternalConnectivityWatcher::Cancel() {
|
|
1186
1239
|
return; // Already done.
|
1187
1240
|
}
|
1188
1241
|
ExecCtx::Run(DEBUG_LOCATION, on_complete_, GRPC_ERROR_CANCELLED);
|
1189
|
-
// Hop back into the
|
1190
|
-
chand_->
|
1191
|
-
|
1192
|
-
GRPC_ERROR_NONE);
|
1242
|
+
// Hop back into the work_serializer to clean up.
|
1243
|
+
chand_->work_serializer_->Run([this]() { RemoveWatcherLocked(); },
|
1244
|
+
DEBUG_LOCATION);
|
1193
1245
|
}
|
1194
1246
|
|
1195
|
-
void ChannelData::ExternalConnectivityWatcher::AddWatcherLocked(
|
1196
|
-
|
1197
|
-
|
1198
|
-
|
1199
|
-
|
1200
|
-
// Add new watcher.
|
1201
|
-
self->chand_->state_tracker_.AddWatcher(
|
1202
|
-
self->initial_state_,
|
1203
|
-
OrphanablePtr<ConnectivityStateWatcherInterface>(self));
|
1247
|
+
void ChannelData::ExternalConnectivityWatcher::AddWatcherLocked() {
|
1248
|
+
Closure::Run(DEBUG_LOCATION, watcher_timer_init_, GRPC_ERROR_NONE);
|
1249
|
+
// Add new watcher. Pass the ref of the object from creation to OrphanablePtr.
|
1250
|
+
chand_->state_tracker_.AddWatcher(
|
1251
|
+
initial_state_, OrphanablePtr<ConnectivityStateWatcherInterface>(this));
|
1204
1252
|
}
|
1205
1253
|
|
1206
|
-
void ChannelData::ExternalConnectivityWatcher::RemoveWatcherLocked(
|
1207
|
-
|
1208
|
-
ExternalConnectivityWatcher* self =
|
1209
|
-
static_cast<ExternalConnectivityWatcher*>(arg);
|
1210
|
-
self->chand_->state_tracker_.RemoveWatcher(self);
|
1254
|
+
void ChannelData::ExternalConnectivityWatcher::RemoveWatcherLocked() {
|
1255
|
+
chand_->state_tracker_.RemoveWatcher(this);
|
1211
1256
|
}
|
1212
1257
|
|
1213
1258
|
//
|
@@ -1223,28 +1268,20 @@ class ChannelData::ConnectivityWatcherAdder {
|
|
1223
1268
|
initial_state_(initial_state),
|
1224
1269
|
watcher_(std::move(watcher)) {
|
1225
1270
|
GRPC_CHANNEL_STACK_REF(chand_->owning_stack_, "ConnectivityWatcherAdder");
|
1226
|
-
chand_->
|
1227
|
-
|
1228
|
-
&ConnectivityWatcherAdder::AddWatcherLocked, this,
|
1229
|
-
nullptr),
|
1230
|
-
GRPC_ERROR_NONE);
|
1271
|
+
chand_->work_serializer_->Run([this]() { AddWatcherLocked(); },
|
1272
|
+
DEBUG_LOCATION);
|
1231
1273
|
}
|
1232
1274
|
|
1233
1275
|
private:
|
1234
|
-
|
1235
|
-
|
1236
|
-
|
1237
|
-
|
1238
|
-
std::move(self->watcher_));
|
1239
|
-
GRPC_CHANNEL_STACK_UNREF(self->chand_->owning_stack_,
|
1240
|
-
"ConnectivityWatcherAdder");
|
1241
|
-
delete self;
|
1276
|
+
void AddWatcherLocked() {
|
1277
|
+
chand_->state_tracker_.AddWatcher(initial_state_, std::move(watcher_));
|
1278
|
+
GRPC_CHANNEL_STACK_UNREF(chand_->owning_stack_, "ConnectivityWatcherAdder");
|
1279
|
+
delete this;
|
1242
1280
|
}
|
1243
1281
|
|
1244
1282
|
ChannelData* chand_;
|
1245
1283
|
grpc_connectivity_state initial_state_;
|
1246
1284
|
OrphanablePtr<AsyncConnectivityStateWatcherInterface> watcher_;
|
1247
|
-
grpc_closure closure_;
|
1248
1285
|
};
|
1249
1286
|
|
1250
1287
|
//
|
@@ -1257,26 +1294,20 @@ class ChannelData::ConnectivityWatcherRemover {
|
|
1257
1294
|
AsyncConnectivityStateWatcherInterface* watcher)
|
1258
1295
|
: chand_(chand), watcher_(watcher) {
|
1259
1296
|
GRPC_CHANNEL_STACK_REF(chand_->owning_stack_, "ConnectivityWatcherRemover");
|
1260
|
-
chand_->
|
1261
|
-
|
1262
|
-
&ConnectivityWatcherRemover::RemoveWatcherLocked,
|
1263
|
-
this, nullptr),
|
1264
|
-
GRPC_ERROR_NONE);
|
1297
|
+
chand_->work_serializer_->Run([this]() { RemoveWatcherLocked(); },
|
1298
|
+
DEBUG_LOCATION);
|
1265
1299
|
}
|
1266
1300
|
|
1267
1301
|
private:
|
1268
|
-
|
1269
|
-
|
1270
|
-
|
1271
|
-
self->chand_->state_tracker_.RemoveWatcher(self->watcher_);
|
1272
|
-
GRPC_CHANNEL_STACK_UNREF(self->chand_->owning_stack_,
|
1302
|
+
void RemoveWatcherLocked() {
|
1303
|
+
chand_->state_tracker_.RemoveWatcher(watcher_);
|
1304
|
+
GRPC_CHANNEL_STACK_UNREF(chand_->owning_stack_,
|
1273
1305
|
"ConnectivityWatcherRemover");
|
1274
|
-
delete
|
1306
|
+
delete this;
|
1275
1307
|
}
|
1276
1308
|
|
1277
1309
|
ChannelData* chand_;
|
1278
1310
|
AsyncConnectivityStateWatcherInterface* watcher_;
|
1279
|
-
grpc_closure closure_;
|
1280
1311
|
};
|
1281
1312
|
|
1282
1313
|
//
|
@@ -1340,7 +1371,8 @@ class ChannelData::ClientChannelControlHelper
|
|
1340
1371
|
// No-op -- we should never get this from ResolvingLoadBalancingPolicy.
|
1341
1372
|
void RequestReresolution() override {}
|
1342
1373
|
|
1343
|
-
void AddTraceEvent(TraceSeverity severity,
|
1374
|
+
void AddTraceEvent(TraceSeverity severity,
|
1375
|
+
absl::string_view message) override {
|
1344
1376
|
if (chand_->channelz_node_ != nullptr) {
|
1345
1377
|
chand_->channelz_node_->AddTraceEvent(
|
1346
1378
|
ConvertSeverityEnum(severity),
|
@@ -1359,6 +1391,180 @@ class ChannelData::ClientChannelControlHelper
|
|
1359
1391
|
ChannelData* chand_;
|
1360
1392
|
};
|
1361
1393
|
|
1394
|
+
//
|
1395
|
+
// ChannelData::ChannelConfigHelper
|
1396
|
+
//
|
1397
|
+
|
1398
|
+
// Synchronous callback from ResolvingLoadBalancingPolicy to process a
|
1399
|
+
// resolver result update.
|
1400
|
+
ChannelData::ChannelConfigHelper::ApplyServiceConfigResult
|
1401
|
+
ChannelData::ChannelConfigHelper::ApplyServiceConfig(
|
1402
|
+
const Resolver::Result& result) {
|
1403
|
+
ApplyServiceConfigResult service_config_result;
|
1404
|
+
RefCountedPtr<ServiceConfig> service_config;
|
1405
|
+
// If resolver did not return a service config or returned an invalid service
|
1406
|
+
// config, we need a fallback service config.
|
1407
|
+
if (result.service_config_error != GRPC_ERROR_NONE) {
|
1408
|
+
// If the service config was invalid, then fallback to the saved service
|
1409
|
+
// config. If there is no saved config either, use the default service
|
1410
|
+
// config.
|
1411
|
+
if (chand_->saved_service_config_ != nullptr) {
|
1412
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
|
1413
|
+
gpr_log(GPR_INFO,
|
1414
|
+
"chand=%p: resolver returned invalid service config. "
|
1415
|
+
"Continuing to use previous service config.",
|
1416
|
+
chand_);
|
1417
|
+
}
|
1418
|
+
service_config = chand_->saved_service_config_;
|
1419
|
+
} else if (chand_->default_service_config_ != nullptr) {
|
1420
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
|
1421
|
+
gpr_log(GPR_INFO,
|
1422
|
+
"chand=%p: resolver returned invalid service config. Using "
|
1423
|
+
"default service config provided by client API.",
|
1424
|
+
chand_);
|
1425
|
+
}
|
1426
|
+
service_config = chand_->default_service_config_;
|
1427
|
+
}
|
1428
|
+
} else if (result.service_config == nullptr) {
|
1429
|
+
if (chand_->default_service_config_ != nullptr) {
|
1430
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
|
1431
|
+
gpr_log(GPR_INFO,
|
1432
|
+
"chand=%p: resolver returned no service config. Using default "
|
1433
|
+
"service config provided by client API.",
|
1434
|
+
chand_);
|
1435
|
+
}
|
1436
|
+
service_config = chand_->default_service_config_;
|
1437
|
+
}
|
1438
|
+
} else {
|
1439
|
+
service_config = result.service_config;
|
1440
|
+
}
|
1441
|
+
service_config_result.service_config_error =
|
1442
|
+
GRPC_ERROR_REF(result.service_config_error);
|
1443
|
+
if (service_config == nullptr &&
|
1444
|
+
result.service_config_error != GRPC_ERROR_NONE) {
|
1445
|
+
service_config_result.no_valid_service_config = true;
|
1446
|
+
return service_config_result;
|
1447
|
+
}
|
1448
|
+
// Process service config.
|
1449
|
+
grpc_core::UniquePtr<char> service_config_json;
|
1450
|
+
const internal::ClientChannelGlobalParsedConfig* parsed_service_config =
|
1451
|
+
nullptr;
|
1452
|
+
if (service_config != nullptr) {
|
1453
|
+
parsed_service_config =
|
1454
|
+
static_cast<const internal::ClientChannelGlobalParsedConfig*>(
|
1455
|
+
service_config->GetGlobalParsedConfig(
|
1456
|
+
internal::ClientChannelServiceConfigParser::ParserIndex()));
|
1457
|
+
}
|
1458
|
+
// Check if the config has changed.
|
1459
|
+
service_config_result.service_config_changed =
|
1460
|
+
((service_config == nullptr) !=
|
1461
|
+
(chand_->saved_service_config_ == nullptr)) ||
|
1462
|
+
(service_config != nullptr &&
|
1463
|
+
service_config->json_string() !=
|
1464
|
+
chand_->saved_service_config_->json_string());
|
1465
|
+
if (service_config_result.service_config_changed) {
|
1466
|
+
service_config_json.reset(gpr_strdup(
|
1467
|
+
service_config != nullptr ? service_config->json_string().c_str()
|
1468
|
+
: ""));
|
1469
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
|
1470
|
+
gpr_log(GPR_INFO,
|
1471
|
+
"chand=%p: resolver returned updated service config: \"%s\"",
|
1472
|
+
chand_, service_config_json.get());
|
1473
|
+
}
|
1474
|
+
// Save health check service name.
|
1475
|
+
if (service_config != nullptr) {
|
1476
|
+
chand_->health_check_service_name_.reset(
|
1477
|
+
gpr_strdup(parsed_service_config->health_check_service_name()));
|
1478
|
+
} else {
|
1479
|
+
chand_->health_check_service_name_.reset();
|
1480
|
+
}
|
1481
|
+
// Update health check service name used by existing subchannel wrappers.
|
1482
|
+
for (auto* subchannel_wrapper : chand_->subchannel_wrappers_) {
|
1483
|
+
subchannel_wrapper->UpdateHealthCheckServiceName(
|
1484
|
+
grpc_core::UniquePtr<char>(
|
1485
|
+
gpr_strdup(chand_->health_check_service_name_.get())));
|
1486
|
+
}
|
1487
|
+
// Save service config.
|
1488
|
+
chand_->saved_service_config_ = std::move(service_config);
|
1489
|
+
}
|
1490
|
+
// Find LB policy config.
|
1491
|
+
ProcessLbPolicy(result, parsed_service_config,
|
1492
|
+
&service_config_result.lb_policy_config);
|
1493
|
+
grpc_core::UniquePtr<char> lb_policy_name(
|
1494
|
+
gpr_strdup((service_config_result.lb_policy_config)->name()));
|
1495
|
+
// Swap out the data used by GetChannelInfo().
|
1496
|
+
{
|
1497
|
+
MutexLock lock(&chand_->info_mu_);
|
1498
|
+
chand_->info_lb_policy_name_ = std::move(lb_policy_name);
|
1499
|
+
if (service_config_json != nullptr) {
|
1500
|
+
chand_->info_service_config_json_ = std::move(service_config_json);
|
1501
|
+
}
|
1502
|
+
}
|
1503
|
+
// Return results.
|
1504
|
+
return service_config_result;
|
1505
|
+
}
|
1506
|
+
|
1507
|
+
void ChannelData::ChannelConfigHelper::ApplyConfigSelector(
|
1508
|
+
bool service_config_changed,
|
1509
|
+
RefCountedPtr<ConfigSelector> config_selector) {
|
1510
|
+
chand_->UpdateServiceConfigInDataPlaneLocked(service_config_changed,
|
1511
|
+
std::move(config_selector));
|
1512
|
+
}
|
1513
|
+
|
1514
|
+
void ChannelData::ChannelConfigHelper::ResolverTransientFailure(
|
1515
|
+
grpc_error* error) {
|
1516
|
+
MutexLock lock(&chand_->data_plane_mu_);
|
1517
|
+
GRPC_ERROR_UNREF(chand_->resolver_transient_failure_error_);
|
1518
|
+
chand_->resolver_transient_failure_error_ = error;
|
1519
|
+
}
|
1520
|
+
|
1521
|
+
void ChannelData::ChannelConfigHelper::ProcessLbPolicy(
|
1522
|
+
const Resolver::Result& resolver_result,
|
1523
|
+
const internal::ClientChannelGlobalParsedConfig* parsed_service_config,
|
1524
|
+
RefCountedPtr<LoadBalancingPolicy::Config>* lb_policy_config) {
|
1525
|
+
// Prefer the LB policy config found in the service config.
|
1526
|
+
if (parsed_service_config != nullptr &&
|
1527
|
+
parsed_service_config->parsed_lb_config() != nullptr) {
|
1528
|
+
*lb_policy_config = parsed_service_config->parsed_lb_config();
|
1529
|
+
return;
|
1530
|
+
}
|
1531
|
+
// Try the deprecated LB policy name from the service config.
|
1532
|
+
// If not, try the setting from channel args.
|
1533
|
+
const char* policy_name = nullptr;
|
1534
|
+
if (parsed_service_config != nullptr &&
|
1535
|
+
!parsed_service_config->parsed_deprecated_lb_policy().empty()) {
|
1536
|
+
policy_name = parsed_service_config->parsed_deprecated_lb_policy().c_str();
|
1537
|
+
} else {
|
1538
|
+
const grpc_arg* channel_arg =
|
1539
|
+
grpc_channel_args_find(resolver_result.args, GRPC_ARG_LB_POLICY_NAME);
|
1540
|
+
policy_name = grpc_channel_arg_get_string(channel_arg);
|
1541
|
+
}
|
1542
|
+
// Use pick_first if nothing was specified and we didn't select grpclb
|
1543
|
+
// above.
|
1544
|
+
if (policy_name == nullptr) policy_name = "pick_first";
|
1545
|
+
// Now that we have the policy name, construct an empty config for it.
|
1546
|
+
Json config_json = Json::Array{Json::Object{
|
1547
|
+
{policy_name, Json::Object{}},
|
1548
|
+
}};
|
1549
|
+
grpc_error* parse_error = GRPC_ERROR_NONE;
|
1550
|
+
*lb_policy_config = LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(
|
1551
|
+
config_json, &parse_error);
|
1552
|
+
// The policy name came from one of three places:
|
1553
|
+
// - The deprecated loadBalancingPolicy field in the service config,
|
1554
|
+
// in which case the code in ClientChannelServiceConfigParser
|
1555
|
+
// already verified that the policy does not require a config.
|
1556
|
+
// - One of the hard-coded values here, all of which are known to not
|
1557
|
+
// require a config.
|
1558
|
+
// - A channel arg, in which case the application did something that
|
1559
|
+
// is a misuse of our API.
|
1560
|
+
// In the first two cases, these assertions will always be true. In
|
1561
|
+
// the last case, this is probably fine for now.
|
1562
|
+
// TODO(roth): If the last case becomes a problem, add better error
|
1563
|
+
// handling here.
|
1564
|
+
GPR_ASSERT(*lb_policy_config != nullptr);
|
1565
|
+
GPR_ASSERT(parse_error == GRPC_ERROR_NONE);
|
1566
|
+
}
|
1567
|
+
|
1362
1568
|
//
|
1363
1569
|
// ChannelData implementation
|
1364
1570
|
//
|
@@ -1417,7 +1623,8 @@ ChannelData::ChannelData(grpc_channel_element_args* args, grpc_error** error)
|
|
1417
1623
|
client_channel_factory_(
|
1418
1624
|
ClientChannelFactory::GetFromChannelArgs(args->channel_args)),
|
1419
1625
|
channelz_node_(GetChannelzNode(args->channel_args)),
|
1420
|
-
|
1626
|
+
channel_config_helper_(this),
|
1627
|
+
work_serializer_(std::make_shared<WorkSerializer>()),
|
1421
1628
|
interested_parties_(grpc_pollset_set_create()),
|
1422
1629
|
subchannel_pool_(GetSubchannelPool(args->channel_args)),
|
1423
1630
|
state_tracker_("client_channel", GRPC_CHANNEL_IDLE),
|
@@ -1485,10 +1692,10 @@ ChannelData::~ChannelData() {
|
|
1485
1692
|
}
|
1486
1693
|
DestroyResolvingLoadBalancingPolicyLocked();
|
1487
1694
|
grpc_channel_args_destroy(channel_args_);
|
1695
|
+
GRPC_ERROR_UNREF(resolver_transient_failure_error_);
|
1488
1696
|
// Stop backup polling.
|
1489
1697
|
grpc_client_channel_stop_backup_polling(interested_parties_);
|
1490
1698
|
grpc_pollset_set_destroy(interested_parties_);
|
1491
|
-
GRPC_COMBINER_UNREF(combiner_, "client_channel");
|
1492
1699
|
GRPC_ERROR_UNREF(disconnect_error_.Load(MemoryOrder::RELAXED));
|
1493
1700
|
gpr_mu_destroy(&info_mu_);
|
1494
1701
|
}
|
@@ -1500,6 +1707,7 @@ void ChannelData::UpdateStateAndPickerLocked(
|
|
1500
1707
|
if (picker_ == nullptr) {
|
1501
1708
|
health_check_service_name_.reset();
|
1502
1709
|
saved_service_config_.reset();
|
1710
|
+
saved_config_selector_.reset();
|
1503
1711
|
received_first_resolver_result_ = false;
|
1504
1712
|
}
|
1505
1713
|
// Update connectivity state.
|
@@ -1522,9 +1730,11 @@ void ChannelData::UpdateStateAndPickerLocked(
|
|
1522
1730
|
// - refs to subchannel wrappers in the keys of pending_subchannel_updates_
|
1523
1731
|
// - ref stored in retry_throttle_data_
|
1524
1732
|
// - ref stored in service_config_
|
1733
|
+
// - ref stored in config_selector_
|
1525
1734
|
// - ownership of the existing picker in picker_
|
1526
1735
|
RefCountedPtr<ServerRetryThrottleData> retry_throttle_data_to_unref;
|
1527
1736
|
RefCountedPtr<ServiceConfig> service_config_to_unref;
|
1737
|
+
RefCountedPtr<ConfigSelector> config_selector_to_unref;
|
1528
1738
|
{
|
1529
1739
|
MutexLock lock(&data_plane_mu_);
|
1530
1740
|
// Handle subchannel updates.
|
@@ -1549,6 +1759,7 @@ void ChannelData::UpdateStateAndPickerLocked(
|
|
1549
1759
|
// Note: We save the objects to unref until after the lock is released.
|
1550
1760
|
retry_throttle_data_to_unref = std::move(retry_throttle_data_);
|
1551
1761
|
service_config_to_unref = std::move(service_config_);
|
1762
|
+
config_selector_to_unref = std::move(config_selector_);
|
1552
1763
|
}
|
1553
1764
|
// Re-process queued picks.
|
1554
1765
|
for (QueuedPick* pick = queued_picks_; pick != nullptr; pick = pick->next) {
|
@@ -1565,24 +1776,72 @@ void ChannelData::UpdateStateAndPickerLocked(
|
|
1565
1776
|
pending_subchannel_updates_.clear();
|
1566
1777
|
}
|
1567
1778
|
|
1568
|
-
void ChannelData::
|
1569
|
-
|
1570
|
-
RefCountedPtr<
|
1779
|
+
void ChannelData::UpdateServiceConfigInDataPlaneLocked(
|
1780
|
+
bool service_config_changed,
|
1781
|
+
RefCountedPtr<ConfigSelector> config_selector) {
|
1782
|
+
// Check if ConfigSelector has changed.
|
1783
|
+
const bool config_selector_changed =
|
1784
|
+
saved_config_selector_ != config_selector;
|
1785
|
+
saved_config_selector_ = config_selector;
|
1786
|
+
// We want to set the service config at least once, even if the
|
1787
|
+
// resolver does not return a config, because that ensures that we
|
1788
|
+
// disable retries if they are not enabled in the service config.
|
1789
|
+
// TODO(roth): Consider removing the received_first_resolver_result_ check
|
1790
|
+
// when we implement transparent retries.
|
1791
|
+
if (!service_config_changed && !config_selector_changed &&
|
1792
|
+
received_first_resolver_result_) {
|
1793
|
+
return;
|
1794
|
+
}
|
1795
|
+
received_first_resolver_result_ = true;
|
1796
|
+
// Get retry throttle data from service config.
|
1797
|
+
RefCountedPtr<ServerRetryThrottleData> retry_throttle_data;
|
1798
|
+
if (saved_service_config_ != nullptr) {
|
1799
|
+
const internal::ClientChannelGlobalParsedConfig* parsed_service_config =
|
1800
|
+
static_cast<const internal::ClientChannelGlobalParsedConfig*>(
|
1801
|
+
saved_service_config_->GetGlobalParsedConfig(
|
1802
|
+
internal::ClientChannelServiceConfigParser::ParserIndex()));
|
1803
|
+
if (parsed_service_config != nullptr) {
|
1804
|
+
absl::optional<internal::ClientChannelGlobalParsedConfig::RetryThrottling>
|
1805
|
+
retry_throttle_config = parsed_service_config->retry_throttling();
|
1806
|
+
if (retry_throttle_config.has_value()) {
|
1807
|
+
retry_throttle_data =
|
1808
|
+
internal::ServerRetryThrottleMap::GetDataForServer(
|
1809
|
+
server_name_.get(),
|
1810
|
+
retry_throttle_config.value().max_milli_tokens,
|
1811
|
+
retry_throttle_config.value().milli_token_ratio);
|
1812
|
+
}
|
1813
|
+
}
|
1814
|
+
}
|
1815
|
+
// Create default config selector if not provided by resolver.
|
1816
|
+
if (config_selector == nullptr) {
|
1817
|
+
config_selector =
|
1818
|
+
MakeRefCounted<DefaultConfigSelector>(saved_service_config_);
|
1819
|
+
}
|
1571
1820
|
// Grab data plane lock to update service config.
|
1572
1821
|
//
|
1573
1822
|
// We defer unreffing the old values (and deallocating memory) until
|
1574
1823
|
// after releasing the lock to keep the critical section small.
|
1824
|
+
RefCountedPtr<ServiceConfig> service_config_to_unref = saved_service_config_;
|
1825
|
+
RefCountedPtr<ConfigSelector> config_selector_to_unref =
|
1826
|
+
std::move(config_selector);
|
1575
1827
|
{
|
1576
1828
|
MutexLock lock(&data_plane_mu_);
|
1829
|
+
GRPC_ERROR_UNREF(resolver_transient_failure_error_);
|
1830
|
+
resolver_transient_failure_error_ = GRPC_ERROR_NONE;
|
1577
1831
|
// Update service config.
|
1578
1832
|
received_service_config_data_ = true;
|
1579
1833
|
// Old values will be unreffed after lock is released.
|
1580
1834
|
retry_throttle_data_.swap(retry_throttle_data);
|
1581
|
-
service_config_.swap(
|
1582
|
-
|
1835
|
+
service_config_.swap(service_config_to_unref);
|
1836
|
+
config_selector_.swap(config_selector_to_unref);
|
1837
|
+
// Re-process queued picks.
|
1583
1838
|
for (QueuedPick* pick = queued_picks_; pick != nullptr; pick = pick->next) {
|
1584
|
-
|
1585
|
-
calld
|
1839
|
+
grpc_call_element* elem = pick->elem;
|
1840
|
+
CallData* calld = static_cast<CallData*>(elem->call_data);
|
1841
|
+
grpc_error* error = GRPC_ERROR_NONE;
|
1842
|
+
if (calld->PickSubchannelLocked(elem, &error)) {
|
1843
|
+
calld->AsyncPickDone(elem, error);
|
1844
|
+
}
|
1586
1845
|
}
|
1587
1846
|
}
|
1588
1847
|
// Old values will be unreffed after lock is released when they go out
|
@@ -1592,14 +1851,14 @@ void ChannelData::UpdateServiceConfigLocked(
|
|
1592
1851
|
void ChannelData::CreateResolvingLoadBalancingPolicyLocked() {
|
1593
1852
|
// Instantiate resolving LB policy.
|
1594
1853
|
LoadBalancingPolicy::Args lb_args;
|
1595
|
-
lb_args.
|
1854
|
+
lb_args.work_serializer = work_serializer_;
|
1596
1855
|
lb_args.channel_control_helper =
|
1597
1856
|
absl::make_unique<ClientChannelControlHelper>(this);
|
1598
1857
|
lb_args.args = channel_args_;
|
1599
1858
|
grpc_core::UniquePtr<char> target_uri(gpr_strdup(target_uri_.get()));
|
1600
1859
|
resolving_lb_policy_.reset(new ResolvingLoadBalancingPolicy(
|
1601
1860
|
std::move(lb_args), &grpc_client_channel_routing_trace,
|
1602
|
-
std::move(target_uri),
|
1861
|
+
std::move(target_uri), &channel_config_helper_));
|
1603
1862
|
grpc_pollset_set_add_pollset_set(resolving_lb_policy_->interested_parties(),
|
1604
1863
|
interested_parties_);
|
1605
1864
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
|
@@ -1616,199 +1875,6 @@ void ChannelData::DestroyResolvingLoadBalancingPolicyLocked() {
|
|
1616
1875
|
}
|
1617
1876
|
}
|
1618
1877
|
|
1619
|
-
void ChannelData::ProcessLbPolicy(
|
1620
|
-
const Resolver::Result& resolver_result,
|
1621
|
-
const internal::ClientChannelGlobalParsedConfig* parsed_service_config,
|
1622
|
-
RefCountedPtr<LoadBalancingPolicy::Config>* lb_policy_config) {
|
1623
|
-
// Prefer the LB policy config found in the service config.
|
1624
|
-
if (parsed_service_config != nullptr &&
|
1625
|
-
parsed_service_config->parsed_lb_config() != nullptr) {
|
1626
|
-
*lb_policy_config = parsed_service_config->parsed_lb_config();
|
1627
|
-
return;
|
1628
|
-
}
|
1629
|
-
// Try the deprecated LB policy name from the service config.
|
1630
|
-
// If not, try the setting from channel args.
|
1631
|
-
const char* policy_name = nullptr;
|
1632
|
-
if (parsed_service_config != nullptr &&
|
1633
|
-
parsed_service_config->parsed_deprecated_lb_policy() != nullptr) {
|
1634
|
-
policy_name = parsed_service_config->parsed_deprecated_lb_policy();
|
1635
|
-
} else {
|
1636
|
-
const grpc_arg* channel_arg =
|
1637
|
-
grpc_channel_args_find(resolver_result.args, GRPC_ARG_LB_POLICY_NAME);
|
1638
|
-
policy_name = grpc_channel_arg_get_string(channel_arg);
|
1639
|
-
}
|
1640
|
-
// Special case: If at least one balancer address is present, we use
|
1641
|
-
// the grpclb policy, regardless of what the resolver has returned.
|
1642
|
-
bool found_balancer_address = false;
|
1643
|
-
for (size_t i = 0; i < resolver_result.addresses.size(); ++i) {
|
1644
|
-
const ServerAddress& address = resolver_result.addresses[i];
|
1645
|
-
if (address.IsBalancer()) {
|
1646
|
-
found_balancer_address = true;
|
1647
|
-
break;
|
1648
|
-
}
|
1649
|
-
}
|
1650
|
-
if (found_balancer_address) {
|
1651
|
-
if (policy_name != nullptr && strcmp(policy_name, "grpclb") != 0) {
|
1652
|
-
gpr_log(GPR_INFO,
|
1653
|
-
"resolver requested LB policy %s but provided at least one "
|
1654
|
-
"balancer address -- forcing use of grpclb LB policy",
|
1655
|
-
policy_name);
|
1656
|
-
}
|
1657
|
-
policy_name = "grpclb";
|
1658
|
-
}
|
1659
|
-
// Use pick_first if nothing was specified and we didn't select grpclb
|
1660
|
-
// above.
|
1661
|
-
if (policy_name == nullptr) policy_name = "pick_first";
|
1662
|
-
// Now that we have the policy name, construct an empty config for it.
|
1663
|
-
Json config_json = Json::Array{Json::Object{
|
1664
|
-
{policy_name, Json::Object{}},
|
1665
|
-
}};
|
1666
|
-
grpc_error* parse_error = GRPC_ERROR_NONE;
|
1667
|
-
*lb_policy_config = LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(
|
1668
|
-
config_json, &parse_error);
|
1669
|
-
// The policy name came from one of three places:
|
1670
|
-
// - The deprecated loadBalancingPolicy field in the service config,
|
1671
|
-
// in which case the code in ClientChannelServiceConfigParser
|
1672
|
-
// already verified that the policy does not require a config.
|
1673
|
-
// - One of the hard-coded values here, all of which are known to not
|
1674
|
-
// require a config.
|
1675
|
-
// - A channel arg, in which case the application did something that
|
1676
|
-
// is a misuse of our API.
|
1677
|
-
// In the first two cases, these assertions will always be true. In
|
1678
|
-
// the last case, this is probably fine for now.
|
1679
|
-
// TODO(roth): If the last case becomes a problem, add better error
|
1680
|
-
// handling here.
|
1681
|
-
GPR_ASSERT(*lb_policy_config != nullptr);
|
1682
|
-
GPR_ASSERT(parse_error == GRPC_ERROR_NONE);
|
1683
|
-
}
|
1684
|
-
|
1685
|
-
// Synchronous callback from ResolvingLoadBalancingPolicy to process a
|
1686
|
-
// resolver result update.
|
1687
|
-
bool ChannelData::ProcessResolverResultLocked(
|
1688
|
-
void* arg, const Resolver::Result& result,
|
1689
|
-
RefCountedPtr<LoadBalancingPolicy::Config>* lb_policy_config,
|
1690
|
-
grpc_error** service_config_error, bool* no_valid_service_config) {
|
1691
|
-
ChannelData* chand = static_cast<ChannelData*>(arg);
|
1692
|
-
RefCountedPtr<ServiceConfig> service_config;
|
1693
|
-
// If resolver did not return a service config or returned an invalid service
|
1694
|
-
// config, we need a fallback service config.
|
1695
|
-
if (result.service_config_error != GRPC_ERROR_NONE) {
|
1696
|
-
// If the service config was invalid, then fallback to the saved service
|
1697
|
-
// config. If there is no saved config either, use the default service
|
1698
|
-
// config.
|
1699
|
-
if (chand->saved_service_config_ != nullptr) {
|
1700
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
|
1701
|
-
gpr_log(GPR_INFO,
|
1702
|
-
"chand=%p: resolver returned invalid service config. "
|
1703
|
-
"Continuing to use previous service config.",
|
1704
|
-
chand);
|
1705
|
-
}
|
1706
|
-
service_config = chand->saved_service_config_;
|
1707
|
-
} else if (chand->default_service_config_ != nullptr) {
|
1708
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
|
1709
|
-
gpr_log(GPR_INFO,
|
1710
|
-
"chand=%p: resolver returned invalid service config. Using "
|
1711
|
-
"default service config provided by client API.",
|
1712
|
-
chand);
|
1713
|
-
}
|
1714
|
-
service_config = chand->default_service_config_;
|
1715
|
-
}
|
1716
|
-
} else if (result.service_config == nullptr) {
|
1717
|
-
if (chand->default_service_config_ != nullptr) {
|
1718
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
|
1719
|
-
gpr_log(GPR_INFO,
|
1720
|
-
"chand=%p: resolver returned no service config. Using default "
|
1721
|
-
"service config provided by client API.",
|
1722
|
-
chand);
|
1723
|
-
}
|
1724
|
-
service_config = chand->default_service_config_;
|
1725
|
-
}
|
1726
|
-
} else {
|
1727
|
-
service_config = result.service_config;
|
1728
|
-
}
|
1729
|
-
*service_config_error = GRPC_ERROR_REF(result.service_config_error);
|
1730
|
-
if (service_config == nullptr &&
|
1731
|
-
result.service_config_error != GRPC_ERROR_NONE) {
|
1732
|
-
*no_valid_service_config = true;
|
1733
|
-
return false;
|
1734
|
-
}
|
1735
|
-
// Process service config.
|
1736
|
-
grpc_core::UniquePtr<char> service_config_json;
|
1737
|
-
const internal::ClientChannelGlobalParsedConfig* parsed_service_config =
|
1738
|
-
nullptr;
|
1739
|
-
if (service_config != nullptr) {
|
1740
|
-
parsed_service_config =
|
1741
|
-
static_cast<const internal::ClientChannelGlobalParsedConfig*>(
|
1742
|
-
service_config->GetGlobalParsedConfig(
|
1743
|
-
internal::ClientChannelServiceConfigParser::ParserIndex()));
|
1744
|
-
}
|
1745
|
-
// Check if the config has changed.
|
1746
|
-
const bool service_config_changed =
|
1747
|
-
((service_config == nullptr) !=
|
1748
|
-
(chand->saved_service_config_ == nullptr)) ||
|
1749
|
-
(service_config != nullptr &&
|
1750
|
-
service_config->json_string() !=
|
1751
|
-
chand->saved_service_config_->json_string());
|
1752
|
-
if (service_config_changed) {
|
1753
|
-
service_config_json.reset(gpr_strdup(
|
1754
|
-
service_config != nullptr ? service_config->json_string().c_str()
|
1755
|
-
: ""));
|
1756
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
|
1757
|
-
gpr_log(GPR_INFO,
|
1758
|
-
"chand=%p: resolver returned updated service config: \"%s\"",
|
1759
|
-
chand, service_config_json.get());
|
1760
|
-
}
|
1761
|
-
// Save health check service name.
|
1762
|
-
if (service_config != nullptr) {
|
1763
|
-
chand->health_check_service_name_.reset(
|
1764
|
-
gpr_strdup(parsed_service_config->health_check_service_name()));
|
1765
|
-
} else {
|
1766
|
-
chand->health_check_service_name_.reset();
|
1767
|
-
}
|
1768
|
-
// Update health check service name used by existing subchannel wrappers.
|
1769
|
-
for (auto* subchannel_wrapper : chand->subchannel_wrappers_) {
|
1770
|
-
subchannel_wrapper->UpdateHealthCheckServiceName(
|
1771
|
-
grpc_core::UniquePtr<char>(
|
1772
|
-
gpr_strdup(chand->health_check_service_name_.get())));
|
1773
|
-
}
|
1774
|
-
// Save service config.
|
1775
|
-
chand->saved_service_config_ = std::move(service_config);
|
1776
|
-
}
|
1777
|
-
// We want to set the service config at least once. This should not really be
|
1778
|
-
// needed, but we are doing it as a defensive approach. This can be removed,
|
1779
|
-
// if we feel it is unnecessary.
|
1780
|
-
if (service_config_changed || !chand->received_first_resolver_result_) {
|
1781
|
-
chand->received_first_resolver_result_ = true;
|
1782
|
-
RefCountedPtr<ServerRetryThrottleData> retry_throttle_data;
|
1783
|
-
if (parsed_service_config != nullptr) {
|
1784
|
-
Optional<internal::ClientChannelGlobalParsedConfig::RetryThrottling>
|
1785
|
-
retry_throttle_config = parsed_service_config->retry_throttling();
|
1786
|
-
if (retry_throttle_config.has_value()) {
|
1787
|
-
retry_throttle_data =
|
1788
|
-
internal::ServerRetryThrottleMap::GetDataForServer(
|
1789
|
-
chand->server_name_.get(),
|
1790
|
-
retry_throttle_config.value().max_milli_tokens,
|
1791
|
-
retry_throttle_config.value().milli_token_ratio);
|
1792
|
-
}
|
1793
|
-
}
|
1794
|
-
chand->UpdateServiceConfigLocked(std::move(retry_throttle_data),
|
1795
|
-
chand->saved_service_config_);
|
1796
|
-
}
|
1797
|
-
chand->ProcessLbPolicy(result, parsed_service_config, lb_policy_config);
|
1798
|
-
grpc_core::UniquePtr<char> lb_policy_name(
|
1799
|
-
gpr_strdup((*lb_policy_config)->name()));
|
1800
|
-
// Swap out the data used by GetChannelInfo().
|
1801
|
-
{
|
1802
|
-
MutexLock lock(&chand->info_mu_);
|
1803
|
-
chand->info_lb_policy_name_ = std::move(lb_policy_name);
|
1804
|
-
if (service_config_json != nullptr) {
|
1805
|
-
chand->info_service_config_json_ = std::move(service_config_json);
|
1806
|
-
}
|
1807
|
-
}
|
1808
|
-
// Return results.
|
1809
|
-
return service_config_changed;
|
1810
|
-
}
|
1811
|
-
|
1812
1878
|
grpc_error* ChannelData::DoPingLocked(grpc_transport_op* op) {
|
1813
1879
|
if (state_tracker_.state() != GRPC_CHANNEL_READY) {
|
1814
1880
|
return GRPC_ERROR_CREATE_FROM_STATIC_STRING("channel not connected");
|
@@ -1832,22 +1898,18 @@ grpc_error* ChannelData::DoPingLocked(grpc_transport_op* op) {
|
|
1832
1898
|
return result.error;
|
1833
1899
|
}
|
1834
1900
|
|
1835
|
-
void ChannelData::StartTransportOpLocked(
|
1836
|
-
grpc_transport_op* op = static_cast<grpc_transport_op*>(arg);
|
1837
|
-
grpc_channel_element* elem =
|
1838
|
-
static_cast<grpc_channel_element*>(op->handler_private.extra_arg);
|
1839
|
-
ChannelData* chand = static_cast<ChannelData*>(elem->channel_data);
|
1901
|
+
void ChannelData::StartTransportOpLocked(grpc_transport_op* op) {
|
1840
1902
|
// Connectivity watch.
|
1841
1903
|
if (op->start_connectivity_watch != nullptr) {
|
1842
|
-
|
1843
|
-
|
1904
|
+
state_tracker_.AddWatcher(op->start_connectivity_watch_state,
|
1905
|
+
std::move(op->start_connectivity_watch));
|
1844
1906
|
}
|
1845
1907
|
if (op->stop_connectivity_watch != nullptr) {
|
1846
|
-
|
1908
|
+
state_tracker_.RemoveWatcher(op->stop_connectivity_watch);
|
1847
1909
|
}
|
1848
1910
|
// Ping.
|
1849
1911
|
if (op->send_ping.on_initiate != nullptr || op->send_ping.on_ack != nullptr) {
|
1850
|
-
grpc_error* error =
|
1912
|
+
grpc_error* error = DoPingLocked(op);
|
1851
1913
|
if (error != GRPC_ERROR_NONE) {
|
1852
1914
|
ExecCtx::Run(DEBUG_LOCATION, op->send_ping.on_initiate,
|
1853
1915
|
GRPC_ERROR_REF(error));
|
@@ -1859,40 +1921,39 @@ void ChannelData::StartTransportOpLocked(void* arg, grpc_error* /*ignored*/) {
|
|
1859
1921
|
}
|
1860
1922
|
// Reset backoff.
|
1861
1923
|
if (op->reset_connect_backoff) {
|
1862
|
-
if (
|
1863
|
-
|
1924
|
+
if (resolving_lb_policy_ != nullptr) {
|
1925
|
+
resolving_lb_policy_->ResetBackoffLocked();
|
1864
1926
|
}
|
1865
1927
|
}
|
1866
1928
|
// Disconnect or enter IDLE.
|
1867
1929
|
if (op->disconnect_with_error != GRPC_ERROR_NONE) {
|
1868
1930
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_call_trace)) {
|
1869
|
-
gpr_log(GPR_INFO, "chand=%p: disconnect_with_error: %s",
|
1931
|
+
gpr_log(GPR_INFO, "chand=%p: disconnect_with_error: %s", this,
|
1870
1932
|
grpc_error_string(op->disconnect_with_error));
|
1871
1933
|
}
|
1872
|
-
|
1934
|
+
DestroyResolvingLoadBalancingPolicyLocked();
|
1873
1935
|
intptr_t value;
|
1874
1936
|
if (grpc_error_get_int(op->disconnect_with_error,
|
1875
1937
|
GRPC_ERROR_INT_CHANNEL_CONNECTIVITY_STATE, &value) &&
|
1876
1938
|
static_cast<grpc_connectivity_state>(value) == GRPC_CHANNEL_IDLE) {
|
1877
|
-
if (
|
1939
|
+
if (disconnect_error() == GRPC_ERROR_NONE) {
|
1878
1940
|
// Enter IDLE state.
|
1879
|
-
|
1880
|
-
|
1941
|
+
UpdateStateAndPickerLocked(GRPC_CHANNEL_IDLE, "channel entering IDLE",
|
1942
|
+
nullptr);
|
1881
1943
|
}
|
1882
1944
|
GRPC_ERROR_UNREF(op->disconnect_with_error);
|
1883
1945
|
} else {
|
1884
1946
|
// Disconnect.
|
1885
|
-
GPR_ASSERT(
|
1947
|
+
GPR_ASSERT(disconnect_error_.Load(MemoryOrder::RELAXED) ==
|
1886
1948
|
GRPC_ERROR_NONE);
|
1887
|
-
|
1888
|
-
|
1889
|
-
chand->UpdateStateAndPickerLocked(
|
1949
|
+
disconnect_error_.Store(op->disconnect_with_error, MemoryOrder::RELEASE);
|
1950
|
+
UpdateStateAndPickerLocked(
|
1890
1951
|
GRPC_CHANNEL_SHUTDOWN, "shutdown from API",
|
1891
1952
|
absl::make_unique<LoadBalancingPolicy::TransientFailurePicker>(
|
1892
1953
|
GRPC_ERROR_REF(op->disconnect_with_error)));
|
1893
1954
|
}
|
1894
1955
|
}
|
1895
|
-
GRPC_CHANNEL_STACK_UNREF(
|
1956
|
+
GRPC_CHANNEL_STACK_UNREF(owning_stack_, "start_transport_op");
|
1896
1957
|
ExecCtx::Run(DEBUG_LOCATION, op->on_consumed, GRPC_ERROR_NONE);
|
1897
1958
|
}
|
1898
1959
|
|
@@ -1904,13 +1965,10 @@ void ChannelData::StartTransportOp(grpc_channel_element* elem,
|
|
1904
1965
|
if (op->bind_pollset != nullptr) {
|
1905
1966
|
grpc_pollset_set_add_pollset(chand->interested_parties_, op->bind_pollset);
|
1906
1967
|
}
|
1907
|
-
// Pop into control plane
|
1908
|
-
op->handler_private.extra_arg = elem;
|
1968
|
+
// Pop into control plane work_serializer for remaining ops.
|
1909
1969
|
GRPC_CHANNEL_STACK_REF(chand->owning_stack_, "start_transport_op");
|
1910
|
-
chand->
|
1911
|
-
|
1912
|
-
ChannelData::StartTransportOpLocked, op, nullptr),
|
1913
|
-
GRPC_ERROR_NONE);
|
1970
|
+
chand->work_serializer_->Run(
|
1971
|
+
[chand, op]() { chand->StartTransportOpLocked(op); }, DEBUG_LOCATION);
|
1914
1972
|
}
|
1915
1973
|
|
1916
1974
|
void ChannelData::GetChannelInfo(grpc_channel_element* elem,
|
@@ -1961,14 +2019,13 @@ ChannelData::GetConnectedSubchannelInDataPlane(
|
|
1961
2019
|
return connected_subchannel->Ref();
|
1962
2020
|
}
|
1963
2021
|
|
1964
|
-
void ChannelData::TryToConnectLocked(
|
1965
|
-
|
1966
|
-
|
1967
|
-
chand->resolving_lb_policy_->ExitIdleLocked();
|
2022
|
+
void ChannelData::TryToConnectLocked() {
|
2023
|
+
if (resolving_lb_policy_ != nullptr) {
|
2024
|
+
resolving_lb_policy_->ExitIdleLocked();
|
1968
2025
|
} else {
|
1969
|
-
|
2026
|
+
CreateResolvingLoadBalancingPolicyLocked();
|
1970
2027
|
}
|
1971
|
-
GRPC_CHANNEL_STACK_UNREF(
|
2028
|
+
GRPC_CHANNEL_STACK_UNREF(owning_stack_, "TryToConnect");
|
1972
2029
|
}
|
1973
2030
|
|
1974
2031
|
grpc_connectivity_state ChannelData::CheckConnectivityState(
|
@@ -1976,8 +2033,7 @@ grpc_connectivity_state ChannelData::CheckConnectivityState(
|
|
1976
2033
|
grpc_connectivity_state out = state_tracker_.state();
|
1977
2034
|
if (out == GRPC_CHANNEL_IDLE && try_to_connect) {
|
1978
2035
|
GRPC_CHANNEL_STACK_REF(owning_stack_, "TryToConnect");
|
1979
|
-
|
1980
|
-
GRPC_ERROR_NONE);
|
2036
|
+
work_serializer_->Run([this]() { TryToConnectLocked(); }, DEBUG_LOCATION);
|
1981
2037
|
}
|
1982
2038
|
return out;
|
1983
2039
|
}
|
@@ -2283,10 +2339,32 @@ void CallData::FreeCachedSendOpDataForCompletedBatch(
|
|
2283
2339
|
void CallData::RecvTrailingMetadataReadyForLoadBalancingPolicy(
|
2284
2340
|
void* arg, grpc_error* error) {
|
2285
2341
|
CallData* calld = static_cast<CallData*>(arg);
|
2342
|
+
// Set error if call did not succeed.
|
2343
|
+
grpc_error* error_for_lb = GRPC_ERROR_NONE;
|
2344
|
+
if (error != GRPC_ERROR_NONE) {
|
2345
|
+
error_for_lb = error;
|
2346
|
+
} else {
|
2347
|
+
const auto& fields = calld->recv_trailing_metadata_->idx.named;
|
2348
|
+
GPR_ASSERT(fields.grpc_status != nullptr);
|
2349
|
+
grpc_status_code status =
|
2350
|
+
grpc_get_status_code_from_metadata(fields.grpc_status->md);
|
2351
|
+
std::string msg;
|
2352
|
+
if (status != GRPC_STATUS_OK) {
|
2353
|
+
error_for_lb = grpc_error_set_int(
|
2354
|
+
GRPC_ERROR_CREATE_FROM_STATIC_STRING("call failed"),
|
2355
|
+
GRPC_ERROR_INT_GRPC_STATUS, status);
|
2356
|
+
if (fields.grpc_message != nullptr) {
|
2357
|
+
error_for_lb = grpc_error_set_str(
|
2358
|
+
error_for_lb, GRPC_ERROR_STR_GRPC_MESSAGE,
|
2359
|
+
grpc_slice_ref_internal(GRPC_MDVALUE(fields.grpc_message->md)));
|
2360
|
+
}
|
2361
|
+
}
|
2362
|
+
}
|
2286
2363
|
// Invoke callback to LB policy.
|
2287
2364
|
Metadata trailing_metadata(calld, calld->recv_trailing_metadata_);
|
2288
|
-
calld->lb_recv_trailing_metadata_ready_(
|
2365
|
+
calld->lb_recv_trailing_metadata_ready_(error_for_lb, &trailing_metadata,
|
2289
2366
|
&calld->lb_call_state_);
|
2367
|
+
if (error == GRPC_ERROR_NONE) GRPC_ERROR_UNREF(error_for_lb);
|
2290
2368
|
// Chain to original callback.
|
2291
2369
|
Closure::Run(DEBUG_LOCATION, calld->original_recv_trailing_metadata_ready_,
|
2292
2370
|
GRPC_ERROR_REF(error));
|
@@ -2839,6 +2917,7 @@ void CallData::RecvInitialMetadataReady(void* arg, grpc_error* error) {
|
|
2839
2917
|
}
|
2840
2918
|
// Received valid initial metadata, so commit the call.
|
2841
2919
|
calld->RetryCommit(elem, retry_state);
|
2920
|
+
calld->MaybeInvokeConfigSelectorCommitCallback();
|
2842
2921
|
// Invoke the callback to return the result to the surface.
|
2843
2922
|
// Manually invoking a callback function; it does not take ownership of error.
|
2844
2923
|
calld->InvokeRecvInitialMetadataCallback(batch_data, error);
|
@@ -2925,6 +3004,7 @@ void CallData::RecvMessageReady(void* arg, grpc_error* error) {
|
|
2925
3004
|
}
|
2926
3005
|
// Received a valid message, so commit the call.
|
2927
3006
|
calld->RetryCommit(elem, retry_state);
|
3007
|
+
calld->MaybeInvokeConfigSelectorCommitCallback();
|
2928
3008
|
// Invoke the callback to return the result to the surface.
|
2929
3009
|
// Manually invoking a callback function; it does not take ownership of error.
|
2930
3010
|
calld->InvokeRecvMessageCallback(batch_data, error);
|
@@ -3126,6 +3206,7 @@ void CallData::RecvTrailingMetadataReady(void* arg, grpc_error* error) {
|
|
3126
3206
|
}
|
3127
3207
|
// Not retrying, so commit the call.
|
3128
3208
|
calld->RetryCommit(elem, retry_state);
|
3209
|
+
calld->MaybeInvokeConfigSelectorCommitCallback();
|
3129
3210
|
// Run any necessary closures.
|
3130
3211
|
calld->RunClosuresForCompletedCall(batch_data, GRPC_ERROR_REF(error));
|
3131
3212
|
}
|
@@ -3203,10 +3284,9 @@ void CallData::OnComplete(void* arg, grpc_error* error) {
|
|
3203
3284
|
ChannelData* chand = static_cast<ChannelData*>(elem->channel_data);
|
3204
3285
|
CallData* calld = static_cast<CallData*>(elem->call_data);
|
3205
3286
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_call_trace)) {
|
3206
|
-
char* batch_str = grpc_transport_stream_op_batch_string(&batch_data->batch);
|
3207
3287
|
gpr_log(GPR_INFO, "chand=%p calld=%p: got on_complete, error=%s, batch=%s",
|
3208
|
-
chand, calld, grpc_error_string(error),
|
3209
|
-
|
3288
|
+
chand, calld, grpc_error_string(error),
|
3289
|
+
grpc_transport_stream_op_batch_string(&batch_data->batch).c_str());
|
3210
3290
|
}
|
3211
3291
|
SubchannelCallRetryState* retry_state =
|
3212
3292
|
static_cast<SubchannelCallRetryState*>(
|
@@ -3279,10 +3359,8 @@ void CallData::AddClosureForSubchannelBatch(
|
|
3279
3359
|
GRPC_CLOSURE_INIT(&batch->handler_private.closure, StartBatchInCallCombiner,
|
3280
3360
|
batch, grpc_schedule_on_exec_ctx);
|
3281
3361
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_call_trace)) {
|
3282
|
-
char* batch_str = grpc_transport_stream_op_batch_string(batch);
|
3283
3362
|
gpr_log(GPR_INFO, "chand=%p calld=%p: starting subchannel batch: %s", chand,
|
3284
|
-
this,
|
3285
|
-
gpr_free(batch_str);
|
3363
|
+
this, grpc_transport_stream_op_batch_string(batch).c_str());
|
3286
3364
|
}
|
3287
3365
|
closures->Add(&batch->handler_private.closure, GRPC_ERROR_NONE,
|
3288
3366
|
"start_subchannel_batch");
|
@@ -3751,7 +3829,7 @@ class CallData::QueuedPickCanceller {
|
|
3751
3829
|
}
|
3752
3830
|
if (calld->pick_canceller_ == self && error != GRPC_ERROR_NONE) {
|
3753
3831
|
// Remove pick from list of queued picks.
|
3754
|
-
calld->
|
3832
|
+
calld->MaybeRemoveCallFromQueuedPicksLocked(self->elem_);
|
3755
3833
|
// Fail pending batches on the call.
|
3756
3834
|
calld->PendingBatchesFail(self->elem_, GRPC_ERROR_REF(error),
|
3757
3835
|
YieldCallCombinerIfPendingBatchesFound);
|
@@ -3764,7 +3842,8 @@ class CallData::QueuedPickCanceller {
|
|
3764
3842
|
grpc_closure closure_;
|
3765
3843
|
};
|
3766
3844
|
|
3767
|
-
void CallData::
|
3845
|
+
void CallData::MaybeRemoveCallFromQueuedPicksLocked(grpc_call_element* elem) {
|
3846
|
+
if (!pick_queued_) return;
|
3768
3847
|
auto* chand = static_cast<ChannelData*>(elem->channel_data);
|
3769
3848
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
|
3770
3849
|
gpr_log(GPR_INFO, "chand=%p calld=%p: removing from queued picks list",
|
@@ -3776,7 +3855,8 @@ void CallData::RemoveCallFromQueuedPicksLocked(grpc_call_element* elem) {
|
|
3776
3855
|
pick_canceller_ = nullptr;
|
3777
3856
|
}
|
3778
3857
|
|
3779
|
-
void CallData::
|
3858
|
+
void CallData::MaybeAddCallToQueuedPicksLocked(grpc_call_element* elem) {
|
3859
|
+
if (pick_queued_) return;
|
3780
3860
|
auto* chand = static_cast<ChannelData*>(elem->channel_data);
|
3781
3861
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
|
3782
3862
|
gpr_log(GPR_INFO, "chand=%p calld=%p: adding to queued picks list", chand,
|
@@ -3789,67 +3869,77 @@ void CallData::AddCallToQueuedPicksLocked(grpc_call_element* elem) {
|
|
3789
3869
|
pick_canceller_ = new QueuedPickCanceller(elem);
|
3790
3870
|
}
|
3791
3871
|
|
3792
|
-
|
3872
|
+
grpc_error* CallData::ApplyServiceConfigToCallLocked(
|
3873
|
+
grpc_call_element* elem, grpc_metadata_batch* initial_metadata) {
|
3793
3874
|
ChannelData* chand = static_cast<ChannelData*>(elem->channel_data);
|
3794
3875
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
|
3795
3876
|
gpr_log(GPR_INFO, "chand=%p calld=%p: applying service config to call",
|
3796
3877
|
chand, this);
|
3797
3878
|
}
|
3798
|
-
|
3799
|
-
|
3800
|
-
|
3801
|
-
|
3802
|
-
|
3803
|
-
|
3804
|
-
|
3805
|
-
|
3879
|
+
ConfigSelector* config_selector = chand->config_selector();
|
3880
|
+
auto service_config = chand->service_config();
|
3881
|
+
if (service_config != nullptr) {
|
3882
|
+
// Use the ConfigSelector to determine the config for the call.
|
3883
|
+
ConfigSelector::CallConfig call_config =
|
3884
|
+
config_selector->GetCallConfig({&path_, initial_metadata, arena_});
|
3885
|
+
if (call_config.error != GRPC_ERROR_NONE) return call_config.error;
|
3886
|
+
call_attributes_ = std::move(call_config.call_attributes);
|
3887
|
+
on_call_committed_ = std::move(call_config.on_call_committed);
|
3888
|
+
// Create a ServiceConfigCallData for the call. This stores a ref to the
|
3889
|
+
// ServiceConfig and caches the right set of parsed configs to use for
|
3890
|
+
// the call. The MethodConfig will store itself in the call context,
|
3891
|
+
// so that it can be accessed by filters in the subchannel, and it
|
3892
|
+
// will be cleaned up when the call ends.
|
3893
|
+
auto* service_config_call_data = arena_->New<ServiceConfigCallData>(
|
3894
|
+
std::move(service_config), call_config.method_configs, call_context_);
|
3895
|
+
// Apply our own method params to the call.
|
3806
3896
|
method_params_ = static_cast<ClientChannelMethodParsedConfig*>(
|
3807
|
-
|
3897
|
+
service_config_call_data->GetMethodParsedConfig(
|
3808
3898
|
internal::ClientChannelServiceConfigParser::ParserIndex()));
|
3809
|
-
|
3810
|
-
|
3811
|
-
|
3812
|
-
|
3813
|
-
|
3814
|
-
|
3815
|
-
|
3816
|
-
|
3817
|
-
|
3818
|
-
|
3819
|
-
|
3820
|
-
|
3899
|
+
if (method_params_ != nullptr) {
|
3900
|
+
// If the deadline from the service config is shorter than the one
|
3901
|
+
// from the client API, reset the deadline timer.
|
3902
|
+
if (chand->deadline_checking_enabled() &&
|
3903
|
+
method_params_->timeout() != 0) {
|
3904
|
+
const grpc_millis per_method_deadline =
|
3905
|
+
grpc_cycle_counter_to_millis_round_up(call_start_time_) +
|
3906
|
+
method_params_->timeout();
|
3907
|
+
if (per_method_deadline < deadline_) {
|
3908
|
+
deadline_ = per_method_deadline;
|
3909
|
+
grpc_deadline_state_reset(elem, deadline_);
|
3910
|
+
}
|
3821
3911
|
}
|
3822
|
-
|
3823
|
-
|
3824
|
-
|
3825
|
-
|
3826
|
-
|
3827
|
-
|
3828
|
-
|
3829
|
-
|
3830
|
-
|
3831
|
-
|
3832
|
-
|
3833
|
-
|
3834
|
-
|
3912
|
+
// If the service config set wait_for_ready and the application
|
3913
|
+
// did not explicitly set it, use the value from the service config.
|
3914
|
+
uint32_t* send_initial_metadata_flags =
|
3915
|
+
&pending_batches_[0]
|
3916
|
+
.batch->payload->send_initial_metadata
|
3917
|
+
.send_initial_metadata_flags;
|
3918
|
+
if (method_params_->wait_for_ready().has_value() &&
|
3919
|
+
!(*send_initial_metadata_flags &
|
3920
|
+
GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET)) {
|
3921
|
+
if (method_params_->wait_for_ready().value()) {
|
3922
|
+
*send_initial_metadata_flags |= GRPC_INITIAL_METADATA_WAIT_FOR_READY;
|
3923
|
+
} else {
|
3924
|
+
*send_initial_metadata_flags &= ~GRPC_INITIAL_METADATA_WAIT_FOR_READY;
|
3925
|
+
}
|
3835
3926
|
}
|
3836
3927
|
}
|
3928
|
+
// Set retry throttle data for call.
|
3929
|
+
retry_throttle_data_ = chand->retry_throttle_data();
|
3837
3930
|
}
|
3838
3931
|
// If no retry policy, disable retries.
|
3839
3932
|
// TODO(roth): Remove this when adding support for transparent retries.
|
3840
3933
|
if (method_params_ == nullptr || method_params_->retry_policy() == nullptr) {
|
3841
3934
|
enable_retries_ = false;
|
3842
3935
|
}
|
3936
|
+
return GRPC_ERROR_NONE;
|
3843
3937
|
}
|
3844
3938
|
|
3845
|
-
void CallData::
|
3846
|
-
|
3847
|
-
|
3848
|
-
|
3849
|
-
if (GPR_LIKELY(chand->received_service_config_data() &&
|
3850
|
-
!service_config_applied_)) {
|
3851
|
-
service_config_applied_ = true;
|
3852
|
-
ApplyServiceConfigToCallLocked(elem);
|
3939
|
+
void CallData::MaybeInvokeConfigSelectorCommitCallback() {
|
3940
|
+
if (on_call_committed_ != nullptr) {
|
3941
|
+
on_call_committed_();
|
3942
|
+
on_call_committed_ = nullptr;
|
3853
3943
|
}
|
3854
3944
|
}
|
3855
3945
|
|
@@ -3889,15 +3979,66 @@ bool CallData::PickSubchannelLocked(grpc_call_element* elem,
|
|
3889
3979
|
// The picker being null means that the channel is currently in IDLE state.
|
3890
3980
|
// The incoming call will make the channel exit IDLE.
|
3891
3981
|
if (chand->picker() == nullptr) {
|
3892
|
-
|
3893
|
-
|
3982
|
+
GRPC_CHANNEL_STACK_REF(chand->owning_stack(), "PickSubchannelLocked");
|
3983
|
+
// Bounce into the control plane work serializer to exit IDLE. Since we are
|
3984
|
+
// holding on to the data plane mutex here, we offload it on the ExecCtx so
|
3985
|
+
// that we don't deadlock with ourselves.
|
3986
|
+
ExecCtx::Run(
|
3987
|
+
DEBUG_LOCATION,
|
3988
|
+
GRPC_CLOSURE_CREATE(
|
3989
|
+
[](void* arg, grpc_error* /*error*/) {
|
3990
|
+
auto* chand = static_cast<ChannelData*>(arg);
|
3991
|
+
chand->work_serializer()->Run(
|
3992
|
+
[chand]() {
|
3993
|
+
chand->CheckConnectivityState(/*try_to_connect=*/true);
|
3994
|
+
GRPC_CHANNEL_STACK_UNREF(chand->owning_stack(),
|
3995
|
+
"PickSubchannelLocked");
|
3996
|
+
},
|
3997
|
+
DEBUG_LOCATION);
|
3998
|
+
},
|
3999
|
+
chand, nullptr),
|
4000
|
+
GRPC_ERROR_NONE);
|
3894
4001
|
// Queue the pick, so that it will be attempted once the channel
|
3895
4002
|
// becomes connected.
|
3896
|
-
|
4003
|
+
MaybeAddCallToQueuedPicksLocked(elem);
|
3897
4004
|
return false;
|
3898
4005
|
}
|
3899
|
-
|
3900
|
-
|
4006
|
+
grpc_metadata_batch* initial_metadata_batch =
|
4007
|
+
seen_send_initial_metadata_
|
4008
|
+
? &send_initial_metadata_
|
4009
|
+
: pending_batches_[0]
|
4010
|
+
.batch->payload->send_initial_metadata.send_initial_metadata;
|
4011
|
+
// Grab initial metadata flags so that we can check later if the call has
|
4012
|
+
// wait_for_ready enabled.
|
4013
|
+
const uint32_t send_initial_metadata_flags =
|
4014
|
+
seen_send_initial_metadata_ ? send_initial_metadata_flags_
|
4015
|
+
: pending_batches_[0]
|
4016
|
+
.batch->payload->send_initial_metadata
|
4017
|
+
.send_initial_metadata_flags;
|
4018
|
+
// Avoid picking if we haven't yet received service config data.
|
4019
|
+
if (GPR_UNLIKELY(!chand->received_service_config_data())) {
|
4020
|
+
// If the resolver returned transient failure before returning the
|
4021
|
+
// first service config, fail any non-wait_for_ready calls.
|
4022
|
+
grpc_error* resolver_error = chand->resolver_transient_failure_error();
|
4023
|
+
if (resolver_error != GRPC_ERROR_NONE &&
|
4024
|
+
(send_initial_metadata_flags & GRPC_INITIAL_METADATA_WAIT_FOR_READY) ==
|
4025
|
+
0) {
|
4026
|
+
MaybeRemoveCallFromQueuedPicksLocked(elem);
|
4027
|
+
*error = GRPC_ERROR_REF(resolver_error);
|
4028
|
+
return true;
|
4029
|
+
}
|
4030
|
+
// Either the resolver has not yet returned a result, or it has
|
4031
|
+
// returned transient failure but the call is wait_for_ready. In
|
4032
|
+
// either case, queue the call.
|
4033
|
+
MaybeAddCallToQueuedPicksLocked(elem);
|
4034
|
+
return false;
|
4035
|
+
}
|
4036
|
+
// Apply service config to call if not yet applied.
|
4037
|
+
if (GPR_LIKELY(!service_config_applied_)) {
|
4038
|
+
service_config_applied_ = true;
|
4039
|
+
*error = ApplyServiceConfigToCallLocked(elem, initial_metadata_batch);
|
4040
|
+
if (*error != GRPC_ERROR_NONE) return true;
|
4041
|
+
}
|
3901
4042
|
// If this is a retry, use the send_initial_metadata payload that
|
3902
4043
|
// we've cached; otherwise, use the pending batch. The
|
3903
4044
|
// send_initial_metadata batch will be the first pending batch in the
|
@@ -3909,21 +4050,10 @@ bool CallData::PickSubchannelLocked(grpc_call_element* elem,
|
|
3909
4050
|
// subchannel's copy of the metadata batch (which is copied for each
|
3910
4051
|
// attempt) to the LB policy instead the one from the parent channel.
|
3911
4052
|
LoadBalancingPolicy::PickArgs pick_args;
|
4053
|
+
pick_args.path = StringViewFromSlice(path_);
|
3912
4054
|
pick_args.call_state = &lb_call_state_;
|
3913
|
-
Metadata initial_metadata(
|
3914
|
-
this,
|
3915
|
-
seen_send_initial_metadata_
|
3916
|
-
? &send_initial_metadata_
|
3917
|
-
: pending_batches_[0]
|
3918
|
-
.batch->payload->send_initial_metadata.send_initial_metadata);
|
4055
|
+
Metadata initial_metadata(this, initial_metadata_batch);
|
3919
4056
|
pick_args.initial_metadata = &initial_metadata;
|
3920
|
-
// Grab initial metadata flags so that we can check later if the call has
|
3921
|
-
// wait_for_ready enabled.
|
3922
|
-
const uint32_t send_initial_metadata_flags =
|
3923
|
-
seen_send_initial_metadata_ ? send_initial_metadata_flags_
|
3924
|
-
: pending_batches_[0]
|
3925
|
-
.batch->payload->send_initial_metadata
|
3926
|
-
.send_initial_metadata_flags;
|
3927
4057
|
// Attempt pick.
|
3928
4058
|
auto result = chand->picker()->Pick(pick_args);
|
3929
4059
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
|
@@ -3938,7 +4068,8 @@ bool CallData::PickSubchannelLocked(grpc_call_element* elem,
|
|
3938
4068
|
grpc_error* disconnect_error = chand->disconnect_error();
|
3939
4069
|
if (disconnect_error != GRPC_ERROR_NONE) {
|
3940
4070
|
GRPC_ERROR_UNREF(result.error);
|
3941
|
-
|
4071
|
+
MaybeRemoveCallFromQueuedPicksLocked(elem);
|
4072
|
+
MaybeInvokeConfigSelectorCommitCallback();
|
3942
4073
|
*error = GRPC_ERROR_REF(disconnect_error);
|
3943
4074
|
return true;
|
3944
4075
|
}
|
@@ -3959,8 +4090,9 @@ bool CallData::PickSubchannelLocked(grpc_call_element* elem,
|
|
3959
4090
|
"Failed to pick subchannel", &result.error, 1);
|
3960
4091
|
GRPC_ERROR_UNREF(result.error);
|
3961
4092
|
*error = new_error;
|
4093
|
+
MaybeInvokeConfigSelectorCommitCallback();
|
3962
4094
|
}
|
3963
|
-
|
4095
|
+
MaybeRemoveCallFromQueuedPicksLocked(elem);
|
3964
4096
|
return !retried;
|
3965
4097
|
}
|
3966
4098
|
// If wait_for_ready is true, then queue to retry when we get a new
|
@@ -3969,20 +4101,24 @@ bool CallData::PickSubchannelLocked(grpc_call_element* elem,
|
|
3969
4101
|
}
|
3970
4102
|
// Fallthrough
|
3971
4103
|
case LoadBalancingPolicy::PickResult::PICK_QUEUE:
|
3972
|
-
|
4104
|
+
MaybeAddCallToQueuedPicksLocked(elem);
|
3973
4105
|
return false;
|
3974
4106
|
default: // PICK_COMPLETE
|
3975
|
-
|
4107
|
+
MaybeRemoveCallFromQueuedPicksLocked(elem);
|
3976
4108
|
// Handle drops.
|
3977
4109
|
if (GPR_UNLIKELY(result.subchannel == nullptr)) {
|
3978
|
-
result.error =
|
3979
|
-
|
4110
|
+
result.error = grpc_error_set_int(
|
4111
|
+
GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
4112
|
+
"Call dropped by load balancing policy"),
|
4113
|
+
GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
|
4114
|
+
MaybeInvokeConfigSelectorCommitCallback();
|
3980
4115
|
} else {
|
3981
4116
|
// Grab a ref to the connected subchannel while we're still
|
3982
4117
|
// holding the data plane mutex.
|
3983
4118
|
connected_subchannel_ =
|
3984
4119
|
chand->GetConnectedSubchannelInDataPlane(result.subchannel.get());
|
3985
4120
|
GPR_ASSERT(connected_subchannel_ != nullptr);
|
4121
|
+
if (retry_committed_) MaybeInvokeConfigSelectorCommitCallback();
|
3986
4122
|
}
|
3987
4123
|
lb_recv_trailing_metadata_ready_ = result.recv_trailing_metadata_ready;
|
3988
4124
|
*error = result.error;
|