grpc 1.48.0 → 1.49.1
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 +104 -41
- data/include/grpc/event_engine/event_engine.h +19 -16
- data/include/grpc/impl/codegen/grpc_types.h +3 -8
- data/include/grpc/impl/codegen/port_platform.h +0 -8
- data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +3 -3
- data/src/core/ext/filters/channel_idle/channel_idle_filter.h +2 -2
- data/src/core/ext/filters/client_channel/client_channel.cc +125 -200
- data/src/core/ext/filters/client_channel/client_channel.h +15 -8
- data/src/core/ext/filters/client_channel/client_channel_factory.cc +0 -29
- data/src/core/ext/filters/client_channel/client_channel_factory.h +2 -10
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
- data/src/core/ext/filters/client_channel/config_selector.h +12 -4
- data/src/core/ext/filters/client_channel/connector.h +4 -5
- data/src/core/ext/filters/client_channel/http_proxy.cc +53 -65
- data/src/core/ext/filters/client_channel/http_proxy.h +12 -9
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +14 -12
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +6 -6
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +102 -131
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +12 -3
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +5 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +1 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +1 -2
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +169 -63
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +25 -1
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +15 -19
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +66 -78
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +44 -44
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +6 -5
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +65 -77
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +15 -14
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +19 -14
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +63 -67
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +40 -49
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +81 -97
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +53 -61
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +171 -102
- data/src/core/ext/filters/client_channel/proxy_mapper.h +13 -14
- data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +19 -16
- data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +8 -7
- data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +4 -8
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +431 -145
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +170 -99
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +20 -7
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +17 -15
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +7 -17
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +11 -0
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +38 -17
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +3 -4
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +5 -6
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +4 -13
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +162 -165
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +37 -30
- data/src/core/ext/filters/client_channel/resolver_result_parsing.h +7 -10
- data/src/core/ext/filters/client_channel/retry_filter.cc +0 -7
- data/src/core/ext/filters/client_channel/retry_service_config.cc +30 -19
- data/src/core/ext/filters/client_channel/retry_service_config.h +6 -9
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +6 -7
- data/src/core/ext/filters/client_channel/subchannel.cc +49 -89
- data/src/core/ext/filters/client_channel/subchannel.h +8 -8
- data/src/core/ext/filters/client_channel/subchannel_interface_internal.h +1 -1
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +6 -76
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +16 -25
- data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +3 -4
- data/src/core/ext/filters/deadline/deadline_filter.cc +6 -6
- data/src/core/ext/filters/deadline/deadline_filter.h +2 -3
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -3
- data/src/core/ext/filters/fault_injection/fault_injection_filter.h +1 -1
- data/src/core/ext/filters/fault_injection/service_config_parser.cc +17 -12
- data/src/core/ext/filters/fault_injection/service_config_parser.h +4 -5
- data/src/core/ext/filters/http/client/http_client_filter.cc +2 -3
- data/src/core/ext/filters/http/client/http_client_filter.h +1 -1
- data/src/core/ext/filters/http/client_authority_filter.cc +1 -2
- data/src/core/ext/filters/http/client_authority_filter.h +1 -1
- data/src/core/ext/filters/http/server/http_server_filter.cc +2 -3
- data/src/core/ext/filters/http/server/http_server_filter.h +1 -1
- data/src/core/ext/filters/message_size/message_size_filter.cc +13 -7
- data/src/core/ext/filters/message_size/message_size_filter.h +3 -6
- data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +16 -12
- data/src/core/ext/filters/rbac/rbac_service_config_parser.h +4 -6
- data/src/core/ext/filters/server_config_selector/server_config_selector.h +5 -0
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +3 -5
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +35 -62
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +62 -89
- data/src/core/ext/transport/chttp2/server/chttp2_server.h +4 -6
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +130 -165
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -2
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +67 -2
- data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -0
- data/src/core/ext/transport/chttp2/transport/hpack_constants.h +7 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +25 -8
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +4 -0
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +0 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +8 -2
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +2 -10
- data/src/core/ext/transport/chttp2/transport/internal.h +2 -1
- data/src/core/ext/transport/inproc/inproc_transport.cc +40 -74
- data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.h +30 -10
- data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.c +4 -4
- data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.h +24 -8
- data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +8 -327
- data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +83 -1723
- data/src/core/ext/upb-generated/envoy/admin/v3/config_dump_shared.upb.c +352 -0
- data/src/core/ext/upb-generated/envoy/admin/v3/config_dump_shared.upb.h +1768 -0
- data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.c +6 -4
- data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.h +33 -4
- data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +7 -3
- data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +14 -14
- data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +90 -30
- data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +21 -19
- data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +124 -34
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +18 -6
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +23 -22
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +153 -48
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.c +11 -11
- data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.h +84 -28
- data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +7 -7
- data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +42 -14
- data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +25 -23
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +156 -48
- data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +7 -7
- data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +42 -14
- data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +12 -12
- data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +78 -26
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +9 -9
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +54 -18
- data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +21 -20
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +117 -44
- data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +18 -6
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +36 -12
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +30 -10
- data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +37 -13
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +170 -15
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +42 -14
- data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +7 -4
- data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +36 -4
- data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +6 -6
- data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +48 -16
- data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +8 -8
- data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +54 -18
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +21 -9
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +100 -14
- data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +7 -22
- data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +36 -77
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +121 -76
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +647 -163
- data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +18 -6
- data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.c +34 -15
- data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.h +161 -22
- data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/trace/v3/opentelemetry.upb.c +46 -0
- data/src/core/ext/upb-generated/envoy/config/trace/v3/opentelemetry.upb.h +98 -0
- data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/config/trace/v3/trace.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/config/trace/v3/trace.upb.h +1 -0
- data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +30 -10
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +18 -6
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +11 -4
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +58 -4
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +35 -27
- data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +177 -52
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +10 -8
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +66 -14
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +18 -6
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +42 -14
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +131 -16
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +632 -12
- data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +30 -10
- data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +4 -4
- data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +24 -8
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.c +4 -4
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.h +24 -8
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +18 -6
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +18 -6
- data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +7 -7
- data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +42 -14
- data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +30 -10
- data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.h +18 -6
- data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +18 -6
- data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_strategy.upb.c +63 -0
- data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_strategy.upb.h +202 -0
- data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.h +6 -2
- data/src/core/ext/upb-generated/google/api/annotations.upb.h +1 -1
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +11 -11
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +66 -22
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +9 -9
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +72 -24
- data/src/core/ext/upb-generated/google/api/http.upb.c +3 -3
- data/src/core/ext/upb-generated/google/api/http.upb.h +18 -6
- data/src/core/ext/upb-generated/google/api/httpbody.upb.c +1 -1
- data/src/core/ext/upb-generated/google/api/httpbody.upb.h +6 -2
- data/src/core/ext/upb-generated/google/protobuf/any.upb.c +1 -1
- data/src/core/ext/upb-generated/google/protobuf/any.upb.h +6 -2
- data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +44 -43
- data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +177 -55
- data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +1 -1
- data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +6 -2
- data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +1 -1
- data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +6 -2
- data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +2 -2
- data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +18 -6
- data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +1 -1
- data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +6 -2
- data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +6 -6
- data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +54 -18
- data/src/core/ext/upb-generated/google/rpc/status.upb.c +1 -1
- data/src/core/ext/upb-generated/google/rpc/status.upb.h +6 -2
- data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.c +2 -2
- data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.h +24 -8
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +6 -2
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +7 -7
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +60 -20
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +1 -1
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +12 -4
- data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +2 -2
- data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +12 -4
- data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +6 -6
- data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +54 -18
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +2 -2
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +12 -4
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c +7 -7
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h +42 -14
- data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +3 -3
- data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +23 -11
- data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +1 -1
- data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +7 -3
- data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +7 -3
- data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +1 -1
- data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +7 -3
- data/src/core/ext/upb-generated/validate/validate.upb.c +22 -22
- data/src/core/ext/upb-generated/validate/validate.upb.h +139 -47
- data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.c +3 -3
- data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.h +23 -11
- data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.h +7 -3
- data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +3 -3
- data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +27 -11
- data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.h +7 -3
- data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +6 -2
- data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +2 -2
- data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +12 -4
- data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +6 -2
- data/src/core/ext/upb-generated/xds/core/v3/extension.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/extension.upb.h +6 -2
- data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +6 -2
- data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +12 -4
- data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +6 -2
- data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +6 -2
- data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.h +6 -2
- data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.c +6 -6
- data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.h +54 -18
- data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.c +2 -2
- data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.h +12 -4
- data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.h +12 -4
- data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +6 -2
- data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +67 -274
- data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.h +0 -85
- data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump_shared.upbdefs.c +256 -0
- data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump_shared.upbdefs.h +115 -0
- data/src/core/ext/upbdefs-generated/envoy/admin/v3/listeners.upbdefs.c +14 -11
- data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +107 -107
- data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +191 -187
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +156 -154
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +186 -183
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +136 -134
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +16 -16
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +162 -139
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +39 -31
- data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +12 -8
- data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +72 -75
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h +0 -5
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +713 -670
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +10 -0
- data/src/core/ext/upbdefs-generated/envoy/config/tap/v3/common.upbdefs.c +150 -139
- data/src/core/ext/upbdefs-generated/envoy/config/tap/v3/common.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opentelemetry.upbdefs.c +47 -0
- data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opentelemetry.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/trace.upbdefs.c +16 -12
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +46 -25
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +477 -466
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +21 -18
- data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +153 -84
- data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +113 -113
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +29 -28
- data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_strategy.upbdefs.c +69 -0
- data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_strategy.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +92 -90
- data/src/core/ext/xds/upb_utils.h +0 -21
- data/src/core/ext/xds/xds_api.cc +53 -86
- data/src/core/ext/xds/xds_api.h +19 -28
- data/src/core/ext/xds/xds_bootstrap.cc +39 -52
- data/src/core/ext/xds/xds_bootstrap.h +28 -8
- data/src/core/ext/xds/xds_certificate_provider.h +9 -0
- data/src/core/ext/xds/xds_channel_stack_modifier.cc +6 -4
- data/src/core/ext/xds/xds_channel_stack_modifier.h +8 -0
- data/src/core/ext/xds/xds_client.cc +555 -1214
- data/src/core/ext/xds/xds_client.h +16 -44
- data/src/core/ext/xds/xds_client_grpc.cc +291 -0
- data/src/core/ext/xds/xds_client_grpc.h +102 -0
- data/src/core/ext/xds/xds_cluster.cc +92 -103
- data/src/core/ext/xds/xds_cluster.h +6 -5
- data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +10 -14
- data/src/core/ext/xds/xds_cluster_specifier_plugin.h +1 -0
- data/src/core/ext/xds/xds_common_types.cc +134 -110
- data/src/core/ext/xds/xds_common_types.h +6 -7
- data/src/core/ext/xds/xds_endpoint.cc +80 -80
- data/src/core/ext/xds/xds_endpoint.h +4 -4
- data/src/core/ext/xds/xds_http_fault_filter.cc +4 -11
- data/src/core/ext/xds/xds_http_fault_filter.h +3 -3
- data/src/core/ext/xds/xds_http_filters.h +3 -3
- data/src/core/ext/xds/xds_http_rbac_filter.cc +39 -58
- data/src/core/ext/xds/xds_http_rbac_filter.h +3 -3
- data/src/core/ext/xds/xds_lb_policy_registry.cc +17 -20
- data/src/core/ext/xds/xds_lb_policy_registry.h +4 -4
- data/src/core/ext/xds/xds_listener.cc +329 -299
- data/src/core/ext/xds/xds_listener.h +4 -4
- data/src/core/ext/xds/xds_resource_type.h +13 -2
- data/src/core/ext/xds/xds_route_config.cc +180 -177
- data/src/core/ext/xds/xds_route_config.h +31 -17
- data/src/core/ext/xds/xds_routing.cc +3 -6
- data/src/core/ext/xds/xds_routing.h +7 -9
- data/src/core/ext/xds/xds_server_config_fetcher.cc +76 -81
- data/src/core/ext/xds/xds_transport.h +86 -0
- data/src/core/ext/xds/xds_transport_grpc.cc +349 -0
- data/src/core/ext/xds/xds_transport_grpc.h +135 -0
- data/src/core/lib/address_utils/parse_address.cc +19 -17
- data/src/core/lib/address_utils/parse_address.h +8 -5
- data/src/core/lib/avl/avl.h +47 -25
- data/src/core/lib/channel/call_tracer.h +1 -1
- data/src/core/lib/channel/channel_args.cc +88 -19
- data/src/core/lib/channel/channel_args.h +113 -62
- data/src/core/lib/channel/channel_stack.cc +0 -1
- data/src/core/lib/channel/channel_stack_builder.cc +3 -3
- data/src/core/lib/channel/channel_stack_builder.h +2 -2
- data/src/core/lib/channel/channel_stack_builder_impl.cc +2 -4
- data/src/core/lib/channel/channelz.cc +27 -37
- data/src/core/lib/channel/channelz.h +9 -0
- data/src/core/lib/channel/promise_based_filter.h +0 -1
- data/src/core/lib/config/core_configuration.h +48 -35
- data/src/core/lib/debug/stats.cc +12 -15
- data/src/core/lib/debug/stats.h +11 -3
- data/src/core/lib/event_engine/{event_engine.cc → default_event_engine.cc} +9 -5
- data/src/core/lib/event_engine/{event_engine_factory.h → default_event_engine.h} +4 -8
- data/src/core/lib/event_engine/default_event_engine_factory.cc +20 -3
- data/src/core/lib/event_engine/default_event_engine_factory.h +33 -0
- data/src/core/lib/event_engine/executor/executor.h +38 -0
- data/src/core/lib/event_engine/executor/threaded_executor.cc +36 -0
- data/src/core/lib/event_engine/executor/threaded_executor.h +44 -0
- data/src/core/lib/event_engine/forkable.cc +101 -0
- data/src/core/lib/event_engine/forkable.h +61 -0
- data/src/core/lib/event_engine/poller.h +54 -0
- data/src/core/lib/event_engine/{iomgr_engine/iomgr_engine.cc → posix_engine/posix_engine.cc} +30 -47
- data/src/core/lib/event_engine/{iomgr_engine/iomgr_engine.h → posix_engine/posix_engine.h} +27 -28
- data/src/core/lib/event_engine/{iomgr_engine → posix_engine}/timer.cc +4 -5
- data/src/core/lib/event_engine/{iomgr_engine → posix_engine}/timer.h +8 -8
- data/src/core/lib/event_engine/{iomgr_engine → posix_engine}/timer_heap.cc +4 -4
- data/src/core/lib/event_engine/{iomgr_engine → posix_engine}/timer_heap.h +5 -5
- data/src/core/lib/event_engine/{iomgr_engine → posix_engine}/timer_manager.cc +46 -10
- data/src/core/lib/event_engine/{iomgr_engine → posix_engine}/timer_manager.h +17 -8
- data/src/core/lib/event_engine/promise.h +11 -2
- data/src/core/lib/event_engine/socket_notifier.h +55 -0
- data/src/core/lib/event_engine/{iomgr_engine/thread_pool.cc → thread_pool.cc} +49 -14
- data/src/core/lib/event_engine/{iomgr_engine/thread_pool.h → thread_pool.h} +21 -10
- data/src/core/lib/event_engine/utils.cc +49 -0
- data/src/core/lib/event_engine/utils.h +40 -0
- data/src/core/lib/event_engine/windows/iocp.cc +149 -0
- data/src/core/lib/event_engine/windows/iocp.h +68 -0
- data/src/core/lib/event_engine/windows/win_socket.cc +196 -0
- data/src/core/lib/event_engine/windows/win_socket.h +120 -0
- data/src/core/lib/event_engine/windows/windows_engine.cc +159 -0
- data/src/core/lib/event_engine/windows/windows_engine.h +120 -0
- data/src/core/lib/gpr/time.cc +11 -9
- data/src/core/lib/gpr/useful.h +29 -0
- data/src/core/lib/gprpp/bitset.h +3 -13
- data/src/core/lib/gprpp/debug_location.h +39 -7
- data/src/core/lib/gprpp/manual_constructor.h +0 -1
- data/src/core/lib/gprpp/no_destruct.h +94 -0
- data/src/core/lib/gprpp/ref_counted_ptr.h +0 -1
- data/src/core/lib/gprpp/status_helper.cc +1 -0
- data/src/core/lib/gprpp/table.h +0 -1
- data/src/core/lib/{event_engine/iomgr_engine → gprpp}/time_averaged_stats.cc +3 -5
- data/src/core/lib/{event_engine/iomgr_engine → gprpp}/time_averaged_stats.h +5 -7
- data/src/core/lib/{iomgr → gprpp}/work_serializer.cc +34 -18
- data/src/core/lib/{iomgr → gprpp}/work_serializer.h +21 -27
- data/src/core/lib/http/httpcli.cc +12 -24
- data/src/core/lib/http/httpcli_security_connector.cc +11 -11
- data/src/core/lib/iomgr/call_combiner.cc +0 -26
- data/src/core/lib/iomgr/closure.h +0 -9
- data/src/core/lib/iomgr/combiner.cc +0 -20
- data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -1
- data/src/core/lib/iomgr/error.cc +0 -773
- data/src/core/lib/iomgr/error.h +0 -145
- data/src/core/lib/iomgr/error_cfstream.cc +0 -5
- data/src/core/lib/iomgr/ev_poll_posix.cc +17 -9
- data/src/core/lib/iomgr/exec_ctx.cc +0 -12
- data/src/core/lib/iomgr/executor.cc +0 -10
- data/src/core/lib/iomgr/executor.h +0 -3
- data/src/core/lib/iomgr/lockfree_event.cc +0 -17
- data/src/core/lib/iomgr/port.h +3 -0
- data/src/core/lib/iomgr/resolve_address.h +29 -6
- data/src/core/lib/iomgr/resolve_address_posix.cc +42 -8
- data/src/core/lib/iomgr/resolve_address_posix.h +19 -5
- data/src/core/lib/iomgr/resolve_address_windows.cc +44 -10
- data/src/core/lib/iomgr/resolve_address_windows.h +19 -5
- data/src/core/lib/iomgr/socket_windows.h +0 -2
- data/src/core/lib/iomgr/tcp_posix.cc +118 -6
- data/src/core/lib/iomgr/timer_generic.cc +6 -8
- data/src/core/lib/json/json.h +19 -22
- data/src/core/lib/json/json_args.h +34 -0
- data/src/core/lib/json/json_object_loader.cc +233 -0
- data/src/core/lib/json/json_object_loader.h +618 -0
- data/src/core/lib/json/json_reader.cc +86 -62
- data/src/core/lib/json/json_util.cc +8 -36
- data/src/core/{ext/filters/client_channel → lib/load_balancing}/lb_policy.cc +3 -44
- data/src/core/{ext/filters/client_channel → lib/load_balancing}/lb_policy.h +15 -24
- data/src/core/lib/load_balancing/lb_policy_factory.h +49 -0
- data/src/core/{ext/filters/client_channel → lib/load_balancing}/lb_policy_registry.cc +49 -72
- data/src/core/{ext/filters/client_channel → lib/load_balancing}/lb_policy_registry.h +27 -27
- data/src/core/{ext/filters/client_channel → lib/load_balancing}/subchannel_interface.h +6 -6
- data/src/core/lib/promise/activity.h +56 -8
- data/src/core/lib/promise/arena_promise.h +84 -81
- data/src/core/lib/promise/context.h +0 -1
- data/src/core/lib/promise/detail/basic_seq.h +43 -23
- data/src/core/lib/promise/detail/promise_factory.h +0 -1
- data/src/core/lib/promise/map.h +0 -1
- data/src/core/lib/promise/seq.h +25 -4
- data/src/core/lib/promise/sleep.cc +38 -42
- data/src/core/lib/promise/sleep.h +27 -24
- data/src/core/lib/promise/try_seq.h +26 -6
- data/src/core/lib/resolver/resolver.cc +0 -47
- data/src/core/lib/resolver/resolver.h +2 -12
- data/src/core/lib/resolver/resolver_factory.h +2 -3
- data/src/core/lib/resolver/resolver_registry.cc +1 -1
- data/src/core/lib/resolver/resolver_registry.h +2 -3
- data/src/core/lib/resolver/server_address.cc +11 -15
- data/src/core/lib/resolver/server_address.h +4 -8
- data/src/core/lib/resource_quota/api.cc +1 -1
- data/src/core/lib/resource_quota/arena.cc +21 -1
- data/src/core/lib/resource_quota/arena.h +24 -2
- data/src/core/lib/resource_quota/memory_quota.cc +157 -17
- data/src/core/lib/resource_quota/memory_quota.h +98 -17
- data/src/core/lib/resource_quota/periodic_update.cc +79 -0
- data/src/core/lib/resource_quota/periodic_update.h +71 -0
- data/src/core/lib/security/authorization/evaluate_args.cc +10 -7
- data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +1 -2
- data/src/core/lib/security/authorization/grpc_server_authz_filter.h +1 -1
- data/src/core/lib/security/authorization/matchers.cc +13 -10
- data/src/core/lib/security/authorization/rbac_policy.cc +0 -1
- data/src/core/lib/security/credentials/alts/alts_credentials.cc +2 -3
- data/src/core/lib/security/credentials/alts/alts_credentials.h +3 -4
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +3 -7
- data/src/core/lib/security/credentials/composite/composite_credentials.h +2 -4
- data/src/core/lib/security/credentials/credentials.h +16 -12
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +18 -11
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +32 -23
- data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +5 -6
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +4 -6
- data/src/core/lib/security/credentials/fake/fake_credentials.cc +3 -12
- data/src/core/lib/security/credentials/fake/fake_credentials.h +0 -4
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +29 -26
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +1 -3
- data/src/core/lib/security/credentials/iam/iam_credentials.cc +0 -1
- data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +3 -3
- data/src/core/lib/security/credentials/insecure/insecure_credentials.h +3 -4
- data/src/core/lib/security/credentials/jwt/json_token.cc +12 -3
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +4 -8
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +11 -13
- data/src/core/lib/security/credentials/local/local_credentials.cc +3 -4
- data/src/core/lib/security/credentials/local/local_credentials.h +3 -4
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +17 -18
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +0 -1
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +13 -21
- data/src/core/lib/security/credentials/ssl/ssl_credentials.h +3 -4
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +6 -0
- data/src/core/lib/security/credentials/tls/tls_credentials.cc +13 -25
- data/src/core/lib/security/credentials/tls/tls_credentials.h +3 -4
- data/src/core/lib/security/credentials/xds/xds_credentials.cc +13 -30
- data/src/core/lib/security/credentials/xds/xds_credentials.h +3 -3
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +10 -18
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +26 -38
- data/src/core/lib/security/security_connector/fake/fake_security_connector.h +2 -2
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +5 -5
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +6 -5
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +13 -11
- data/src/core/lib/security/security_connector/local/local_security_connector.h +2 -2
- data/src/core/lib/security/security_connector/security_connector.h +5 -3
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +5 -4
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +5 -5
- data/src/core/lib/security/security_connector/tls/tls_security_connector.h +5 -5
- data/src/core/lib/security/transport/auth_filters.h +1 -1
- data/src/core/lib/security/transport/client_auth_filter.cc +3 -4
- data/src/core/lib/security/transport/security_handshaker.cc +32 -44
- data/src/core/lib/security/transport/security_handshaker.h +2 -1
- data/src/core/lib/service_config/service_config.h +11 -0
- data/src/core/lib/service_config/service_config_impl.cc +98 -97
- data/src/core/lib/service_config/service_config_impl.h +11 -13
- data/src/core/lib/service_config/service_config_parser.cc +26 -27
- data/src/core/lib/service_config/service_config_parser.h +10 -22
- data/src/core/lib/slice/percent_encoding.cc +4 -13
- data/src/core/lib/slice/slice.cc +10 -4
- data/src/core/lib/surface/call.cc +8 -2
- data/src/core/lib/surface/channel.cc +6 -6
- data/src/core/lib/surface/channel.h +1 -1
- data/src/core/lib/surface/completion_queue.cc +0 -2
- data/src/core/lib/surface/completion_queue.h +0 -3
- data/src/core/lib/surface/init.cc +2 -6
- data/src/core/lib/surface/lame_client.cc +2 -3
- data/src/core/lib/surface/lame_client.h +1 -1
- data/src/core/lib/surface/server.cc +7 -12
- data/src/core/lib/surface/server.h +7 -7
- data/src/core/lib/surface/validate_metadata.cc +4 -14
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/connectivity_state.cc +0 -1
- data/src/core/lib/transport/connectivity_state.h +1 -1
- data/src/core/lib/transport/error_utils.cc +0 -36
- data/src/core/lib/transport/handshaker.cc +7 -9
- data/src/core/lib/transport/handshaker.h +4 -5
- data/src/core/lib/transport/handshaker_factory.h +2 -3
- data/src/core/lib/transport/handshaker_registry.cc +2 -1
- data/src/core/lib/transport/handshaker_registry.h +2 -4
- data/src/core/lib/transport/http_connect_handshaker.cc +16 -16
- data/src/core/lib/transport/metadata_batch.cc +5 -0
- data/src/core/lib/transport/metadata_batch.h +52 -7
- data/src/core/lib/transport/parsed_metadata.h +0 -1
- data/src/core/lib/transport/tcp_connect_handshaker.cc +12 -18
- data/src/core/lib/transport/transport.h +0 -7
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +40 -21
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -1
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +14 -7
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +1 -1
- data/src/core/tsi/fake_transport_security.cc +53 -30
- data/src/core/tsi/local_transport_security.cc +9 -5
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +10 -1
- data/src/core/tsi/ssl_transport_security.cc +47 -23
- data/src/core/tsi/transport_security.cc +18 -6
- data/src/core/tsi/transport_security.h +2 -1
- data/src/core/tsi/transport_security_interface.h +17 -5
- data/src/ruby/ext/grpc/extconf.rb +2 -0
- data/src/ruby/ext/grpc/rb_loader.c +6 -2
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +4 -0
- data/third_party/abseil-cpp/absl/functional/any_invocable.h +313 -0
- data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +857 -0
- data/third_party/upb/third_party/utf8_range/utf8_range.h +1 -1
- data/third_party/upb/upb/arena.c +277 -0
- data/third_party/upb/upb/arena.h +225 -0
- data/third_party/upb/upb/array.c +114 -0
- data/third_party/upb/upb/array.h +83 -0
- data/third_party/upb/upb/collections.h +36 -0
- data/third_party/upb/upb/decode.c +161 -65
- data/third_party/upb/upb/decode.h +1 -0
- data/third_party/upb/upb/decode_fast.c +1 -1
- data/third_party/upb/upb/def.c +10 -2
- data/third_party/upb/upb/def.h +8 -1
- data/third_party/upb/upb/def.hpp +7 -4
- data/third_party/upb/upb/encode.c +29 -20
- data/third_party/upb/upb/encode.h +16 -6
- data/third_party/upb/upb/extension_registry.c +93 -0
- data/third_party/upb/upb/extension_registry.h +84 -0
- data/third_party/upb/upb/{decode_internal.h → internal/decode.h} +5 -5
- data/third_party/upb/upb/internal/table.h +385 -0
- data/third_party/upb/upb/{upb_internal.h → internal/upb.h} +3 -3
- data/third_party/upb/upb/internal/vsnprintf_compat.h +52 -0
- data/third_party/upb/upb/json_decode.c +1512 -0
- data/third_party/upb/upb/json_decode.h +47 -0
- data/third_party/upb/upb/json_encode.c +7 -3
- data/third_party/upb/upb/json_encode.h +6 -3
- data/third_party/upb/upb/map.c +108 -0
- data/third_party/upb/upb/map.h +117 -0
- data/third_party/upb/upb/message_value.h +66 -0
- data/third_party/upb/upb/mini_table.c +1147 -0
- data/third_party/upb/upb/mini_table.h +189 -0
- data/third_party/upb/upb/mini_table.hpp +112 -0
- data/third_party/upb/upb/msg.c +2 -62
- data/third_party/upb/upb/msg.h +2 -45
- data/third_party/upb/upb/msg_internal.h +28 -22
- data/third_party/upb/upb/port_def.inc +2 -1
- data/third_party/upb/upb/port_undef.inc +1 -0
- data/third_party/upb/upb/reflection.c +2 -159
- data/third_party/upb/upb/reflection.h +2 -112
- data/third_party/upb/upb/status.c +86 -0
- data/third_party/upb/upb/status.h +66 -0
- data/third_party/upb/upb/table.c +2 -2
- data/third_party/upb/upb/table_internal.h +3 -352
- data/third_party/upb/upb/text_encode.c +3 -2
- data/third_party/upb/upb/upb.c +4 -290
- data/third_party/upb/upb/upb.h +7 -196
- metadata +88 -36
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +0 -50
- data/src/core/lib/iomgr/error_internal.h +0 -66
- data/src/core/lib/iomgr/executor/mpmcqueue.cc +0 -182
- data/src/core/lib/iomgr/executor/mpmcqueue.h +0 -171
- data/src/core/lib/iomgr/executor/threadpool.cc +0 -136
- data/src/core/lib/iomgr/executor/threadpool.h +0 -150
- data/src/core/lib/iomgr/time_averaged_stats.cc +0 -64
- data/src/core/lib/iomgr/time_averaged_stats.h +0 -72
- data/src/core/lib/promise/detail/switch.h +0 -1455
@@ -19,12 +19,11 @@
|
|
19
19
|
#include "src/core/ext/xds/xds_client.h"
|
20
20
|
|
21
21
|
#include <inttypes.h>
|
22
|
-
#include <limits.h>
|
23
22
|
#include <string.h>
|
24
23
|
|
25
24
|
#include <algorithm>
|
26
25
|
|
27
|
-
#include "absl/
|
26
|
+
#include "absl/memory/memory.h"
|
28
27
|
#include "absl/strings/match.h"
|
29
28
|
#include "absl/strings/str_cat.h"
|
30
29
|
#include "absl/strings/str_format.h"
|
@@ -32,52 +31,21 @@
|
|
32
31
|
#include "absl/strings/str_split.h"
|
33
32
|
#include "absl/strings/string_view.h"
|
34
33
|
#include "absl/strings/strip.h"
|
34
|
+
#include "absl/types/optional.h"
|
35
|
+
#include "upb/arena.h"
|
35
36
|
|
36
|
-
#include <grpc/
|
37
|
-
#include <grpc/byte_buffer_reader.h>
|
38
|
-
#include <grpc/grpc.h>
|
39
|
-
#include <grpc/impl/codegen/connectivity_state.h>
|
40
|
-
#include <grpc/impl/codegen/propagation_bits.h>
|
41
|
-
#include <grpc/slice.h>
|
42
|
-
#include <grpc/status.h>
|
43
|
-
#include <grpc/support/alloc.h>
|
37
|
+
#include <grpc/event_engine/event_engine.h>
|
44
38
|
#include <grpc/support/log.h>
|
45
|
-
#include <grpc/support/string_util.h>
|
46
|
-
#include <grpc/support/time.h>
|
47
39
|
|
48
|
-
#include "src/core/ext/filters/client_channel/client_channel.h"
|
49
|
-
#include "src/core/ext/xds/upb_utils.h"
|
50
40
|
#include "src/core/ext/xds/xds_api.h"
|
51
41
|
#include "src/core/ext/xds/xds_bootstrap.h"
|
52
|
-
#include "src/core/ext/xds/xds_channel_args.h"
|
53
42
|
#include "src/core/ext/xds/xds_client_stats.h"
|
54
|
-
#include "src/core/ext/xds/xds_cluster_specifier_plugin.h"
|
55
|
-
#include "src/core/ext/xds/xds_http_filters.h"
|
56
43
|
#include "src/core/lib/backoff/backoff.h"
|
57
|
-
#include "src/core/lib/
|
58
|
-
#include "src/core/lib/channel/channel_fwd.h"
|
59
|
-
#include "src/core/lib/channel/channel_stack.h"
|
60
|
-
#include "src/core/lib/config/core_configuration.h"
|
61
|
-
#include "src/core/lib/gpr/env.h"
|
62
|
-
#include "src/core/lib/gpr/useful.h"
|
44
|
+
#include "src/core/lib/event_engine/default_event_engine.h"
|
63
45
|
#include "src/core/lib/gprpp/debug_location.h"
|
64
|
-
#include "src/core/lib/gprpp/memory.h"
|
65
46
|
#include "src/core/lib/gprpp/orphanable.h"
|
66
47
|
#include "src/core/lib/gprpp/ref_counted_ptr.h"
|
67
48
|
#include "src/core/lib/gprpp/sync.h"
|
68
|
-
#include "src/core/lib/iomgr/closure.h"
|
69
|
-
#include "src/core/lib/iomgr/load_file.h"
|
70
|
-
#include "src/core/lib/iomgr/pollset_set.h"
|
71
|
-
#include "src/core/lib/iomgr/timer.h"
|
72
|
-
#include "src/core/lib/security/credentials/channel_creds_registry.h"
|
73
|
-
#include "src/core/lib/security/credentials/credentials.h"
|
74
|
-
#include "src/core/lib/slice/slice.h"
|
75
|
-
#include "src/core/lib/slice/slice_internal.h"
|
76
|
-
#include "src/core/lib/slice/slice_refcount.h"
|
77
|
-
#include "src/core/lib/surface/call.h"
|
78
|
-
#include "src/core/lib/surface/channel.h"
|
79
|
-
#include "src/core/lib/surface/lame_client.h"
|
80
|
-
#include "src/core/lib/transport/connectivity_state.h"
|
81
49
|
#include "src/core/lib/uri/uri_parser.h"
|
82
50
|
|
83
51
|
#define GRPC_XDS_INITIAL_CONNECT_BACKOFF_SECONDS 1
|
@@ -88,19 +56,12 @@
|
|
88
56
|
|
89
57
|
namespace grpc_core {
|
90
58
|
|
59
|
+
using ::grpc_event_engine::experimental::EventEngine;
|
60
|
+
using ::grpc_event_engine::experimental::GetDefaultEventEngine;
|
61
|
+
|
91
62
|
TraceFlag grpc_xds_client_trace(false, "xds_client");
|
92
63
|
TraceFlag grpc_xds_client_refcount_trace(false, "xds_client_refcount");
|
93
64
|
|
94
|
-
namespace {
|
95
|
-
|
96
|
-
Mutex* g_mu = nullptr;
|
97
|
-
|
98
|
-
const grpc_channel_args* g_channel_args ABSL_GUARDED_BY(*g_mu) = nullptr;
|
99
|
-
XdsClient* g_xds_client ABSL_GUARDED_BY(*g_mu) = nullptr;
|
100
|
-
char* g_fallback_bootstrap_config ABSL_GUARDED_BY(*g_mu) = nullptr;
|
101
|
-
|
102
|
-
} // namespace
|
103
|
-
|
104
65
|
//
|
105
66
|
// Internal class declarations
|
106
67
|
//
|
@@ -113,9 +74,12 @@ class XdsClient::ChannelState::RetryableCall
|
|
113
74
|
public:
|
114
75
|
explicit RetryableCall(WeakRefCountedPtr<ChannelState> chand);
|
115
76
|
|
116
|
-
|
77
|
+
// Disable thread-safety analysis because this method is called via
|
78
|
+
// OrphanablePtr<>, but there's no way to pass the lock annotation
|
79
|
+
// through there.
|
80
|
+
void Orphan() override ABSL_NO_THREAD_SAFETY_ANALYSIS;
|
117
81
|
|
118
|
-
void OnCallFinishedLocked();
|
82
|
+
void OnCallFinishedLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
119
83
|
|
120
84
|
T* calld() const { return calld_.get(); }
|
121
85
|
ChannelState* chand() const { return chand_.get(); }
|
@@ -124,9 +88,9 @@ class XdsClient::ChannelState::RetryableCall
|
|
124
88
|
|
125
89
|
private:
|
126
90
|
void StartNewCallLocked();
|
127
|
-
void StartRetryTimerLocked();
|
128
|
-
|
129
|
-
void
|
91
|
+
void StartRetryTimerLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
92
|
+
|
93
|
+
void OnRetryTimer();
|
130
94
|
|
131
95
|
// The wrapped xds call that talks to the xds server. It's instantiated
|
132
96
|
// every time we start a new call. It's null during call retry backoff.
|
@@ -136,9 +100,8 @@ class XdsClient::ChannelState::RetryableCall
|
|
136
100
|
|
137
101
|
// Retry state.
|
138
102
|
BackOff backoff_;
|
139
|
-
|
140
|
-
|
141
|
-
bool retry_timer_callback_pending_ = false;
|
103
|
+
absl::optional<EventEngine::TaskHandle> timer_handle_
|
104
|
+
ABSL_GUARDED_BY(&XdsClient::mu_);
|
142
105
|
|
143
106
|
bool shutting_down_ = false;
|
144
107
|
};
|
@@ -149,7 +112,6 @@ class XdsClient::ChannelState::AdsCallState
|
|
149
112
|
public:
|
150
113
|
// The ctor and dtor should not be used directly.
|
151
114
|
explicit AdsCallState(RefCountedPtr<RetryableCall<AdsCallState>> parent);
|
152
|
-
~AdsCallState() override;
|
153
115
|
|
154
116
|
void Orphan() override;
|
155
117
|
|
@@ -187,8 +149,7 @@ class XdsClient::ChannelState::AdsCallState
|
|
187
149
|
absl::Status ProcessAdsResponseFields(AdsResponseFields fields) override
|
188
150
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
189
151
|
|
190
|
-
void ParseResource(
|
191
|
-
absl::string_view type_url,
|
152
|
+
void ParseResource(upb_Arena* arena, size_t idx, absl::string_view type_url,
|
192
153
|
absl::string_view serialized_resource) override
|
193
154
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
194
155
|
|
@@ -205,12 +166,12 @@ class XdsClient::ChannelState::AdsCallState
|
|
205
166
|
class ResourceTimer : public InternallyRefCounted<ResourceTimer> {
|
206
167
|
public:
|
207
168
|
ResourceTimer(const XdsResourceType* type, const XdsResourceName& name)
|
208
|
-
: type_(type), name_(name) {
|
209
|
-
GRPC_CLOSURE_INIT(&timer_callback_, OnTimer, this,
|
210
|
-
grpc_schedule_on_exec_ctx);
|
211
|
-
}
|
169
|
+
: type_(type), name_(name) {}
|
212
170
|
|
213
|
-
|
171
|
+
// Disable thread-safety analysis because this method is called via
|
172
|
+
// OrphanablePtr<>, but there's no way to pass the lock annotation
|
173
|
+
// through there.
|
174
|
+
void Orphan() override ABSL_NO_THREAD_SAFETY_ANALYSIS {
|
214
175
|
MaybeCancelTimer();
|
215
176
|
Unref(DEBUG_LOCATION, "Orphan");
|
216
177
|
}
|
@@ -230,15 +191,16 @@ class XdsClient::ChannelState::AdsCallState
|
|
230
191
|
if (state.resource != nullptr) return;
|
231
192
|
// Start timer.
|
232
193
|
ads_calld_ = std::move(ads_calld);
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
194
|
+
timer_handle_ = GetDefaultEventEngine()->RunAfter(
|
195
|
+
ads_calld_->xds_client()->request_timeout_,
|
196
|
+
[self = Ref(DEBUG_LOCATION, "timer")]() {
|
197
|
+
ApplicationCallbackExecCtx callback_exec_ctx;
|
198
|
+
ExecCtx exec_ctx;
|
199
|
+
self->OnTimer();
|
200
|
+
});
|
239
201
|
}
|
240
202
|
|
241
|
-
void MaybeCancelTimer() {
|
203
|
+
void MaybeCancelTimer() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
|
242
204
|
// If the timer hasn't been started yet, make sure we don't start
|
243
205
|
// it later. This can happen if the last watch for an LDS or CDS
|
244
206
|
// resource is cancelled and then restarted, both while an ADS
|
@@ -251,65 +213,72 @@ class XdsClient::ChannelState::AdsCallState
|
|
251
213
|
// For details, see https://github.com/grpc/grpc/issues/29583.
|
252
214
|
// TODO(roth): Find a way to write a test for this case.
|
253
215
|
timer_start_needed_ = false;
|
254
|
-
if (
|
255
|
-
|
256
|
-
|
216
|
+
if (timer_handle_.has_value()) {
|
217
|
+
GetDefaultEventEngine()->Cancel(*timer_handle_);
|
218
|
+
timer_handle_.reset();
|
257
219
|
}
|
258
220
|
}
|
259
221
|
|
260
222
|
private:
|
261
|
-
|
262
|
-
ResourceTimer* self = static_cast<ResourceTimer*>(arg);
|
223
|
+
void OnTimer() {
|
263
224
|
{
|
264
|
-
MutexLock lock(&
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
name_.authority, type_->type_url(), name_.key)
|
285
|
-
.c_str());
|
225
|
+
MutexLock lock(&ads_calld_->xds_client()->mu_);
|
226
|
+
if (timer_handle_.has_value()) {
|
227
|
+
timer_handle_.reset();
|
228
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
229
|
+
gpr_log(GPR_INFO,
|
230
|
+
"[xds_client %p] xds server %s: timeout obtaining resource "
|
231
|
+
"{type=%s name=%s} from xds server",
|
232
|
+
ads_calld_->xds_client(),
|
233
|
+
ads_calld_->chand()->server_.server_uri.c_str(),
|
234
|
+
std::string(type_->type_url()).c_str(),
|
235
|
+
XdsClient::ConstructFullXdsResourceName(
|
236
|
+
name_.authority, type_->type_url(), name_.key)
|
237
|
+
.c_str());
|
238
|
+
}
|
239
|
+
auto& authority_state =
|
240
|
+
ads_calld_->xds_client()->authority_state_map_[name_.authority];
|
241
|
+
ResourceState& state = authority_state.resource_map[type_][name_.key];
|
242
|
+
state.meta.client_status = XdsApi::ResourceMetadata::DOES_NOT_EXIST;
|
243
|
+
ads_calld_->xds_client()->NotifyWatchersOnResourceDoesNotExist(
|
244
|
+
state.watchers);
|
286
245
|
}
|
287
|
-
auto& authority_state =
|
288
|
-
ads_calld_->xds_client()->authority_state_map_[name_.authority];
|
289
|
-
ResourceState& state = authority_state.resource_map[type_][name_.key];
|
290
|
-
state.meta.client_status = XdsApi::ResourceMetadata::DOES_NOT_EXIST;
|
291
|
-
ads_calld_->xds_client()->NotifyWatchersOnResourceDoesNotExist(
|
292
|
-
state.watchers);
|
293
246
|
}
|
294
|
-
|
247
|
+
ads_calld_->xds_client()->work_serializer_.DrainQueue();
|
248
|
+
ads_calld_.reset();
|
295
249
|
}
|
296
250
|
|
297
251
|
const XdsResourceType* type_;
|
298
252
|
const XdsResourceName name_;
|
299
253
|
|
300
254
|
RefCountedPtr<AdsCallState> ads_calld_;
|
301
|
-
bool timer_start_needed_ = true;
|
302
|
-
|
303
|
-
|
304
|
-
grpc_closure timer_callback_;
|
255
|
+
bool timer_start_needed_ ABSL_GUARDED_BY(&XdsClient::mu_) = true;
|
256
|
+
absl::optional<EventEngine::TaskHandle> timer_handle_
|
257
|
+
ABSL_GUARDED_BY(&XdsClient::mu_);
|
305
258
|
};
|
306
259
|
|
307
|
-
|
308
|
-
|
260
|
+
class StreamEventHandler
|
261
|
+
: public XdsTransportFactory::XdsTransport::StreamingCall::EventHandler {
|
262
|
+
public:
|
263
|
+
explicit StreamEventHandler(RefCountedPtr<AdsCallState> ads_calld)
|
264
|
+
: ads_calld_(std::move(ads_calld)) {}
|
309
265
|
|
310
|
-
|
266
|
+
void OnRequestSent(bool ok) override { ads_calld_->OnRequestSent(ok); }
|
267
|
+
void OnRecvMessage(absl::string_view payload) override {
|
268
|
+
ads_calld_->OnRecvMessage(payload);
|
269
|
+
}
|
270
|
+
void OnStatusReceived(absl::Status status) override {
|
271
|
+
ads_calld_->OnStatusReceived(std::move(status));
|
272
|
+
}
|
273
|
+
|
274
|
+
private:
|
275
|
+
RefCountedPtr<AdsCallState> ads_calld_;
|
276
|
+
};
|
277
|
+
|
278
|
+
struct ResourceTypeState {
|
279
|
+
// Nonce and status for this resource type.
|
311
280
|
std::string nonce;
|
312
|
-
|
281
|
+
absl::Status status;
|
313
282
|
|
314
283
|
// Subscribed resources of this type.
|
315
284
|
std::map<std::string /*authority*/,
|
@@ -320,15 +289,9 @@ class XdsClient::ChannelState::AdsCallState
|
|
320
289
|
void SendMessageLocked(const XdsResourceType* type)
|
321
290
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
322
291
|
|
323
|
-
|
324
|
-
void
|
325
|
-
|
326
|
-
static void OnResponseReceived(void* arg, grpc_error_handle error);
|
327
|
-
bool OnResponseReceivedLocked()
|
328
|
-
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
329
|
-
static void OnStatusReceived(void* arg, grpc_error_handle error);
|
330
|
-
void OnStatusReceivedLocked(grpc_error_handle error)
|
331
|
-
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
292
|
+
void OnRequestSent(bool ok);
|
293
|
+
void OnRecvMessage(absl::string_view payload);
|
294
|
+
void OnStatusReceived(absl::Status status);
|
332
295
|
|
333
296
|
bool IsCurrentCallOnChannel() const;
|
334
297
|
|
@@ -340,28 +303,11 @@ class XdsClient::ChannelState::AdsCallState
|
|
340
303
|
// The owning RetryableCall<>.
|
341
304
|
RefCountedPtr<RetryableCall<AdsCallState>> parent_;
|
342
305
|
|
306
|
+
OrphanablePtr<XdsTransportFactory::XdsTransport::StreamingCall> call_;
|
307
|
+
|
343
308
|
bool sent_initial_message_ = false;
|
344
309
|
bool seen_response_ = false;
|
345
|
-
|
346
|
-
// Always non-NULL.
|
347
|
-
grpc_call* call_;
|
348
|
-
|
349
|
-
// recv_initial_metadata
|
350
|
-
grpc_metadata_array initial_metadata_recv_;
|
351
|
-
|
352
|
-
// send_message
|
353
|
-
grpc_byte_buffer* send_message_payload_ = nullptr;
|
354
|
-
grpc_closure on_request_sent_;
|
355
|
-
|
356
|
-
// recv_message
|
357
|
-
grpc_byte_buffer* recv_message_payload_ = nullptr;
|
358
|
-
grpc_closure on_response_received_;
|
359
|
-
|
360
|
-
// recv_trailing_metadata
|
361
|
-
grpc_metadata_array trailing_metadata_recv_;
|
362
|
-
grpc_status_code status_code_;
|
363
|
-
grpc_slice status_details_;
|
364
|
-
grpc_closure on_status_received_;
|
310
|
+
bool send_message_pending_ ABSL_GUARDED_BY(&XdsClient::mu_) = false;
|
365
311
|
|
366
312
|
// Resource types for which requests need to be sent.
|
367
313
|
std::set<const XdsResourceType*> buffered_requests_;
|
@@ -376,11 +322,11 @@ class XdsClient::ChannelState::LrsCallState
|
|
376
322
|
public:
|
377
323
|
// The ctor and dtor should not be used directly.
|
378
324
|
explicit LrsCallState(RefCountedPtr<RetryableCall<LrsCallState>> parent);
|
379
|
-
~LrsCallState() override;
|
380
325
|
|
381
326
|
void Orphan() override;
|
382
327
|
|
383
|
-
void MaybeStartReportingLocked()
|
328
|
+
void MaybeStartReportingLocked()
|
329
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
384
330
|
|
385
331
|
RetryableCall<LrsCallState>* parent() { return parent_.get(); }
|
386
332
|
ChannelState* chand() const { return parent_->chand(); }
|
@@ -388,30 +334,44 @@ class XdsClient::ChannelState::LrsCallState
|
|
388
334
|
bool seen_response() const { return seen_response_; }
|
389
335
|
|
390
336
|
private:
|
337
|
+
class StreamEventHandler
|
338
|
+
: public XdsTransportFactory::XdsTransport::StreamingCall::EventHandler {
|
339
|
+
public:
|
340
|
+
explicit StreamEventHandler(RefCountedPtr<LrsCallState> lrs_calld)
|
341
|
+
: lrs_calld_(std::move(lrs_calld)) {}
|
342
|
+
|
343
|
+
void OnRequestSent(bool ok) override { lrs_calld_->OnRequestSent(ok); }
|
344
|
+
void OnRecvMessage(absl::string_view payload) override {
|
345
|
+
lrs_calld_->OnRecvMessage(payload);
|
346
|
+
}
|
347
|
+
void OnStatusReceived(absl::Status status) override {
|
348
|
+
lrs_calld_->OnStatusReceived(std::move(status));
|
349
|
+
}
|
350
|
+
|
351
|
+
private:
|
352
|
+
RefCountedPtr<LrsCallState> lrs_calld_;
|
353
|
+
};
|
354
|
+
|
391
355
|
// Reports client-side load stats according to a fixed interval.
|
392
356
|
class Reporter : public InternallyRefCounted<Reporter> {
|
393
357
|
public:
|
394
358
|
Reporter(RefCountedPtr<LrsCallState> parent, Duration report_interval)
|
395
359
|
: parent_(std::move(parent)), report_interval_(report_interval) {
|
396
|
-
GRPC_CLOSURE_INIT(&on_next_report_timer_, OnNextReportTimer, this,
|
397
|
-
grpc_schedule_on_exec_ctx);
|
398
|
-
GRPC_CLOSURE_INIT(&on_report_done_, OnReportDone, this,
|
399
|
-
grpc_schedule_on_exec_ctx);
|
400
360
|
ScheduleNextReportLocked();
|
401
361
|
}
|
402
362
|
|
403
|
-
|
363
|
+
// Disable thread-safety analysis because this method is called via
|
364
|
+
// OrphanablePtr<>, but there's no way to pass the lock annotation
|
365
|
+
// through there.
|
366
|
+
void Orphan() override ABSL_NO_THREAD_SAFETY_ANALYSIS;
|
367
|
+
|
368
|
+
void OnReportDoneLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
404
369
|
|
405
370
|
private:
|
406
371
|
void ScheduleNextReportLocked()
|
407
372
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
408
|
-
|
409
|
-
bool OnNextReportTimerLocked(grpc_error_handle error)
|
410
|
-
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
373
|
+
bool OnNextReportTimer();
|
411
374
|
bool SendReportLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
412
|
-
static void OnReportDone(void* arg, grpc_error_handle error);
|
413
|
-
bool OnReportDoneLocked(grpc_error_handle error)
|
414
|
-
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
415
375
|
|
416
376
|
bool IsCurrentReporterOnCall() const {
|
417
377
|
return this == parent_->reporter_.get();
|
@@ -424,47 +384,23 @@ class XdsClient::ChannelState::LrsCallState
|
|
424
384
|
// The load reporting state.
|
425
385
|
const Duration report_interval_;
|
426
386
|
bool last_report_counters_were_zero_ = false;
|
427
|
-
|
428
|
-
|
429
|
-
grpc_closure on_next_report_timer_;
|
430
|
-
grpc_closure on_report_done_;
|
387
|
+
absl::optional<EventEngine::TaskHandle> timer_handle_
|
388
|
+
ABSL_GUARDED_BY(&XdsClient::mu_);
|
431
389
|
};
|
432
390
|
|
433
|
-
|
434
|
-
void
|
435
|
-
|
436
|
-
static void OnResponseReceived(void* arg, grpc_error_handle error);
|
437
|
-
bool OnResponseReceivedLocked()
|
438
|
-
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
439
|
-
static void OnStatusReceived(void* arg, grpc_error_handle error);
|
440
|
-
void OnStatusReceivedLocked(grpc_error_handle error)
|
441
|
-
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
391
|
+
void OnRequestSent(bool ok);
|
392
|
+
void OnRecvMessage(absl::string_view payload);
|
393
|
+
void OnStatusReceived(absl::Status status);
|
442
394
|
|
443
395
|
bool IsCurrentCallOnChannel() const;
|
444
396
|
|
445
397
|
// The owning RetryableCall<>.
|
446
398
|
RefCountedPtr<RetryableCall<LrsCallState>> parent_;
|
447
|
-
bool seen_response_ = false;
|
448
399
|
|
449
|
-
|
450
|
-
grpc_call* call_;
|
400
|
+
OrphanablePtr<XdsTransportFactory::XdsTransport::StreamingCall> call_;
|
451
401
|
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
// send_message
|
456
|
-
grpc_byte_buffer* send_message_payload_ = nullptr;
|
457
|
-
grpc_closure on_initial_request_sent_;
|
458
|
-
|
459
|
-
// recv_message
|
460
|
-
grpc_byte_buffer* recv_message_payload_ = nullptr;
|
461
|
-
grpc_closure on_response_received_;
|
462
|
-
|
463
|
-
// recv_trailing_metadata
|
464
|
-
grpc_metadata_array trailing_metadata_recv_;
|
465
|
-
grpc_status_code status_code_;
|
466
|
-
grpc_slice status_details_;
|
467
|
-
grpc_closure on_status_received_;
|
402
|
+
bool seen_response_ = false;
|
403
|
+
bool send_message_pending_ ABSL_GUARDED_BY(&XdsClient::mu_) = false;
|
468
404
|
|
469
405
|
// Load reporting state.
|
470
406
|
bool send_all_clusters_ = false;
|
@@ -473,58 +409,10 @@ class XdsClient::ChannelState::LrsCallState
|
|
473
409
|
OrphanablePtr<Reporter> reporter_;
|
474
410
|
};
|
475
411
|
|
476
|
-
//
|
477
|
-
// XdsClient::ChannelState::StateWatcher
|
478
|
-
//
|
479
|
-
|
480
|
-
class XdsClient::ChannelState::StateWatcher
|
481
|
-
: public AsyncConnectivityStateWatcherInterface {
|
482
|
-
public:
|
483
|
-
explicit StateWatcher(WeakRefCountedPtr<ChannelState> parent)
|
484
|
-
: parent_(std::move(parent)) {}
|
485
|
-
|
486
|
-
private:
|
487
|
-
void OnConnectivityStateChange(grpc_connectivity_state new_state,
|
488
|
-
const absl::Status& status) override {
|
489
|
-
{
|
490
|
-
MutexLock lock(&parent_->xds_client_->mu_);
|
491
|
-
if (!parent_->shutting_down_ &&
|
492
|
-
new_state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
|
493
|
-
// In TRANSIENT_FAILURE. Notify all watchers of error.
|
494
|
-
gpr_log(GPR_INFO,
|
495
|
-
"[xds_client %p] xds channel for server %s in "
|
496
|
-
"state TRANSIENT_FAILURE: %s",
|
497
|
-
parent_->xds_client(), parent_->server_.server_uri.c_str(),
|
498
|
-
status.ToString().c_str());
|
499
|
-
parent_->xds_client_->NotifyOnErrorLocked(
|
500
|
-
absl::UnavailableError(absl::StrCat(
|
501
|
-
"xds channel in TRANSIENT_FAILURE, connectivity error: ",
|
502
|
-
status.ToString())));
|
503
|
-
}
|
504
|
-
}
|
505
|
-
parent_->xds_client()->work_serializer_.DrainQueue();
|
506
|
-
}
|
507
|
-
|
508
|
-
WeakRefCountedPtr<ChannelState> parent_;
|
509
|
-
};
|
510
|
-
|
511
412
|
//
|
512
413
|
// XdsClient::ChannelState
|
513
414
|
//
|
514
415
|
|
515
|
-
namespace {
|
516
|
-
|
517
|
-
grpc_channel* CreateXdsChannel(grpc_channel_args* args,
|
518
|
-
const XdsBootstrap::XdsServer& server) {
|
519
|
-
RefCountedPtr<grpc_channel_credentials> channel_creds =
|
520
|
-
CoreConfiguration::Get().channel_creds_registry().CreateChannelCreds(
|
521
|
-
server.channel_creds_type, server.channel_creds_config);
|
522
|
-
return grpc_channel_create(server.server_uri.c_str(), channel_creds.get(),
|
523
|
-
args);
|
524
|
-
}
|
525
|
-
|
526
|
-
} // namespace
|
527
|
-
|
528
416
|
XdsClient::ChannelState::ChannelState(WeakRefCountedPtr<XdsClient> xds_client,
|
529
417
|
const XdsBootstrap::XdsServer& server)
|
530
418
|
: DualRefCounted<ChannelState>(
|
@@ -537,9 +425,16 @@ XdsClient::ChannelState::ChannelState(WeakRefCountedPtr<XdsClient> xds_client,
|
|
537
425
|
gpr_log(GPR_INFO, "[xds_client %p] creating channel to %s",
|
538
426
|
xds_client_.get(), server.server_uri.c_str());
|
539
427
|
}
|
540
|
-
|
541
|
-
|
542
|
-
|
428
|
+
absl::Status status;
|
429
|
+
transport_ = xds_client_->transport_factory_->Create(
|
430
|
+
server,
|
431
|
+
[self = WeakRef(DEBUG_LOCATION, "OnConnectivityFailure")](
|
432
|
+
absl::Status status) {
|
433
|
+
self->OnConnectivityStateChange(std::move(status));
|
434
|
+
},
|
435
|
+
&status);
|
436
|
+
GPR_ASSERT(transport_ != nullptr);
|
437
|
+
if (!status.ok()) OnConnectivityStateChangeLocked(std::move(status));
|
543
438
|
}
|
544
439
|
|
545
440
|
XdsClient::ChannelState::~ChannelState() {
|
@@ -547,25 +442,26 @@ XdsClient::ChannelState::~ChannelState() {
|
|
547
442
|
gpr_log(GPR_INFO, "[xds_client %p] destroying xds channel %p for server %s",
|
548
443
|
xds_client(), this, server_.server_uri.c_str());
|
549
444
|
}
|
550
|
-
grpc_channel_destroy(channel_);
|
551
445
|
xds_client_.reset(DEBUG_LOCATION, "ChannelState");
|
552
446
|
}
|
553
447
|
|
554
448
|
// This method should only ever be called when holding the lock, but we can't
|
555
449
|
// use a ABSL_EXCLUSIVE_LOCKS_REQUIRED annotation, because Orphan() will be
|
556
|
-
// called from DualRefCounted::Unref, which cannot have a lock annotation for
|
557
|
-
// lock in this subclass.
|
450
|
+
// called from DualRefCounted::Unref, which cannot have a lock annotation for
|
451
|
+
// a lock in this subclass.
|
558
452
|
void XdsClient::ChannelState::Orphan() ABSL_NO_THREAD_SAFETY_ANALYSIS {
|
559
453
|
shutting_down_ = true;
|
560
|
-
|
454
|
+
transport_.reset();
|
561
455
|
// At this time, all strong refs are removed, remove from channel map to
|
562
|
-
// prevent subsequent subscription from trying to use this ChannelState as
|
563
|
-
// is shutting down.
|
456
|
+
// prevent subsequent subscription from trying to use this ChannelState as
|
457
|
+
// it is shutting down.
|
564
458
|
xds_client_->xds_server_channel_map_.erase(server_);
|
565
459
|
ads_calld_.reset();
|
566
460
|
lrs_calld_.reset();
|
567
461
|
}
|
568
462
|
|
463
|
+
void XdsClient::ChannelState::ResetBackoff() { transport_->ResetBackoff(); }
|
464
|
+
|
569
465
|
XdsClient::ChannelState::AdsCallState* XdsClient::ChannelState::ads_calld()
|
570
466
|
const {
|
571
467
|
return ads_calld_->calld();
|
@@ -591,41 +487,6 @@ void XdsClient::ChannelState::StopLrsCallLocked() {
|
|
591
487
|
lrs_calld_.reset();
|
592
488
|
}
|
593
489
|
|
594
|
-
namespace {
|
595
|
-
|
596
|
-
bool IsLameChannel(grpc_channel* channel) {
|
597
|
-
grpc_channel_element* elem =
|
598
|
-
grpc_channel_stack_last_element(grpc_channel_get_channel_stack(channel));
|
599
|
-
return elem->filter == &LameClientFilter::kFilter;
|
600
|
-
}
|
601
|
-
|
602
|
-
} // namespace
|
603
|
-
|
604
|
-
void XdsClient::ChannelState::StartConnectivityWatchLocked() {
|
605
|
-
if (IsLameChannel(channel_)) {
|
606
|
-
xds_client()->NotifyOnErrorLocked(
|
607
|
-
absl::UnavailableError("xds client has a lame channel"));
|
608
|
-
return;
|
609
|
-
}
|
610
|
-
ClientChannel* client_channel =
|
611
|
-
ClientChannel::GetFromChannel(Channel::FromC(channel_));
|
612
|
-
GPR_ASSERT(client_channel != nullptr);
|
613
|
-
watcher_ = new StateWatcher(WeakRef(DEBUG_LOCATION, "ChannelState+watch"));
|
614
|
-
client_channel->AddConnectivityWatcher(
|
615
|
-
GRPC_CHANNEL_IDLE,
|
616
|
-
OrphanablePtr<AsyncConnectivityStateWatcherInterface>(watcher_));
|
617
|
-
}
|
618
|
-
|
619
|
-
void XdsClient::ChannelState::CancelConnectivityWatchLocked() {
|
620
|
-
if (IsLameChannel(channel_)) {
|
621
|
-
return;
|
622
|
-
}
|
623
|
-
ClientChannel* client_channel =
|
624
|
-
ClientChannel::GetFromChannel(Channel::FromC(channel_));
|
625
|
-
GPR_ASSERT(client_channel != nullptr);
|
626
|
-
client_channel->RemoveConnectivityWatcher(watcher_);
|
627
|
-
}
|
628
|
-
|
629
490
|
void XdsClient::ChannelState::SubscribeLocked(const XdsResourceType* type,
|
630
491
|
const XdsResourceName& name) {
|
631
492
|
if (ads_calld_ == nullptr) {
|
@@ -658,6 +519,29 @@ void XdsClient::ChannelState::UnsubscribeLocked(const XdsResourceType* type,
|
|
658
519
|
}
|
659
520
|
}
|
660
521
|
|
522
|
+
void XdsClient::ChannelState::OnConnectivityStateChange(absl::Status status) {
|
523
|
+
{
|
524
|
+
MutexLock lock(&xds_client_->mu_);
|
525
|
+
OnConnectivityStateChangeLocked(std::move(status));
|
526
|
+
}
|
527
|
+
xds_client_->work_serializer_.DrainQueue();
|
528
|
+
}
|
529
|
+
|
530
|
+
void XdsClient::ChannelState::OnConnectivityStateChangeLocked(
|
531
|
+
absl::Status status) {
|
532
|
+
if (!shutting_down_) {
|
533
|
+
// Notify all watchers of error.
|
534
|
+
gpr_log(GPR_INFO,
|
535
|
+
"[xds_client %p] xds channel for server %s in "
|
536
|
+
"state TRANSIENT_FAILURE: %s",
|
537
|
+
xds_client(), server_.server_uri.c_str(),
|
538
|
+
status.ToString().c_str());
|
539
|
+
xds_client_->NotifyOnErrorLocked(absl::UnavailableError(
|
540
|
+
absl::StrCat("xds channel in TRANSIENT_FAILURE, connectivity error: ",
|
541
|
+
status.ToString())));
|
542
|
+
}
|
543
|
+
}
|
544
|
+
|
661
545
|
//
|
662
546
|
// XdsClient::ChannelState::RetryableCall<>
|
663
547
|
//
|
@@ -673,9 +557,6 @@ XdsClient::ChannelState::RetryableCall<T>::RetryableCall(
|
|
673
557
|
.set_jitter(GRPC_XDS_RECONNECT_JITTER)
|
674
558
|
.set_max_backoff(Duration::Seconds(
|
675
559
|
GRPC_XDS_RECONNECT_MAX_BACKOFF_SECONDS))) {
|
676
|
-
// Closure Initialization
|
677
|
-
GRPC_CLOSURE_INIT(&on_retry_timer_, OnRetryTimer, this,
|
678
|
-
grpc_schedule_on_exec_ctx);
|
679
560
|
StartNewCallLocked();
|
680
561
|
}
|
681
562
|
|
@@ -683,7 +564,10 @@ template <typename T>
|
|
683
564
|
void XdsClient::ChannelState::RetryableCall<T>::Orphan() {
|
684
565
|
shutting_down_ = true;
|
685
566
|
calld_.reset();
|
686
|
-
if (
|
567
|
+
if (timer_handle_.has_value()) {
|
568
|
+
GetDefaultEventEngine()->Cancel(*timer_handle_);
|
569
|
+
timer_handle_.reset();
|
570
|
+
}
|
687
571
|
this->Unref(DEBUG_LOCATION, "RetryableCall+orphaned");
|
688
572
|
}
|
689
573
|
|
@@ -699,13 +583,13 @@ void XdsClient::ChannelState::RetryableCall<T>::OnCallFinishedLocked() {
|
|
699
583
|
template <typename T>
|
700
584
|
void XdsClient::ChannelState::RetryableCall<T>::StartNewCallLocked() {
|
701
585
|
if (shutting_down_) return;
|
702
|
-
GPR_ASSERT(chand_->
|
586
|
+
GPR_ASSERT(chand_->transport_ != nullptr);
|
703
587
|
GPR_ASSERT(calld_ == nullptr);
|
704
588
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
705
|
-
gpr_log(
|
706
|
-
|
707
|
-
|
708
|
-
|
589
|
+
gpr_log(GPR_INFO,
|
590
|
+
"[xds_client %p] xds server %s: start new call from retryable "
|
591
|
+
"call %p",
|
592
|
+
chand()->xds_client(), chand()->server_.server_uri.c_str(), this);
|
709
593
|
}
|
710
594
|
calld_ = MakeOrphanable<T>(
|
711
595
|
this->Ref(DEBUG_LOCATION, "RetryableCall+start_new_call"));
|
@@ -715,36 +599,30 @@ template <typename T>
|
|
715
599
|
void XdsClient::ChannelState::RetryableCall<T>::StartRetryTimerLocked() {
|
716
600
|
if (shutting_down_) return;
|
717
601
|
const Timestamp next_attempt_time = backoff_.NextAttemptTime();
|
602
|
+
const Duration timeout =
|
603
|
+
std::max(next_attempt_time - ExecCtx::Get()->Now(), Duration::Zero());
|
718
604
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
719
|
-
Duration timeout =
|
720
|
-
std::max(next_attempt_time - ExecCtx::Get()->Now(), Duration::Zero());
|
721
605
|
gpr_log(GPR_INFO,
|
722
606
|
"[xds_client %p] xds server %s: call attempt failed; "
|
723
607
|
"retry timer will fire in %" PRId64 "ms.",
|
724
608
|
chand()->xds_client(), chand()->server_.server_uri.c_str(),
|
725
609
|
timeout.millis());
|
726
610
|
}
|
727
|
-
|
728
|
-
|
729
|
-
|
730
|
-
|
731
|
-
|
732
|
-
|
733
|
-
|
734
|
-
void* arg, grpc_error_handle error) {
|
735
|
-
RetryableCall* calld = static_cast<RetryableCall*>(arg);
|
736
|
-
{
|
737
|
-
MutexLock lock(&calld->chand_->xds_client()->mu_);
|
738
|
-
calld->OnRetryTimerLocked(GRPC_ERROR_REF(error));
|
739
|
-
}
|
740
|
-
calld->Unref(DEBUG_LOCATION, "RetryableCall+retry_timer_done");
|
611
|
+
timer_handle_ = GetDefaultEventEngine()->RunAfter(
|
612
|
+
timeout,
|
613
|
+
[self = this->Ref(DEBUG_LOCATION, "RetryableCall+retry_timer_start")]() {
|
614
|
+
ApplicationCallbackExecCtx callback_exec_ctx;
|
615
|
+
ExecCtx exec_ctx;
|
616
|
+
self->OnRetryTimer();
|
617
|
+
});
|
741
618
|
}
|
742
619
|
|
743
620
|
template <typename T>
|
744
|
-
void XdsClient::ChannelState::RetryableCall<T>::
|
745
|
-
|
746
|
-
|
747
|
-
|
621
|
+
void XdsClient::ChannelState::RetryableCall<T>::OnRetryTimer() {
|
622
|
+
MutexLock lock(&chand_->xds_client()->mu_);
|
623
|
+
if (timer_handle_.has_value()) {
|
624
|
+
timer_handle_.reset();
|
625
|
+
if (shutting_down_) return;
|
748
626
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
749
627
|
gpr_log(GPR_INFO,
|
750
628
|
"[xds_client %p] xds server %s: retry timer fired (retryable "
|
@@ -753,7 +631,6 @@ void XdsClient::ChannelState::RetryableCall<T>::OnRetryTimerLocked(
|
|
753
631
|
}
|
754
632
|
StartNewCallLocked();
|
755
633
|
}
|
756
|
-
GRPC_ERROR_UNREF(error);
|
757
634
|
}
|
758
635
|
|
759
636
|
//
|
@@ -811,7 +688,7 @@ void UpdateResourceMetadataNacked(const std::string& version,
|
|
811
688
|
} // namespace
|
812
689
|
|
813
690
|
void XdsClient::ChannelState::AdsCallState::AdsResponseParser::ParseResource(
|
814
|
-
|
691
|
+
upb_Arena* arena, size_t idx, absl::string_view type_url,
|
815
692
|
absl::string_view serialized_resource) {
|
816
693
|
// Check the type_url of the resource.
|
817
694
|
bool is_v2 = false;
|
@@ -822,6 +699,9 @@ void XdsClient::ChannelState::AdsCallState::AdsResponseParser::ParseResource(
|
|
822
699
|
return;
|
823
700
|
}
|
824
701
|
// Parse the resource.
|
702
|
+
XdsResourceType::DecodeContext context = {
|
703
|
+
xds_client(), ads_call_state_->chand()->server_, &grpc_xds_client_trace,
|
704
|
+
xds_client()->symtab_.ptr(), arena};
|
825
705
|
absl::StatusOr<XdsResourceType::DecodeResult> result =
|
826
706
|
result_.type->Decode(context, serialized_resource, is_v2);
|
827
707
|
if (!result.ok()) {
|
@@ -941,51 +821,30 @@ XdsClient::ChannelState::AdsCallState::AdsCallState(
|
|
941
821
|
? "AdsCallState"
|
942
822
|
: nullptr),
|
943
823
|
parent_(std::move(parent)) {
|
944
|
-
// Init the ADS call. Note that the call will progress every time there's
|
945
|
-
// activity in xds_client()->interested_parties_, which is comprised of
|
946
|
-
// the polling entities from client_channel.
|
947
824
|
GPR_ASSERT(xds_client() != nullptr);
|
948
|
-
//
|
825
|
+
// Init the ADS call.
|
949
826
|
const char* method =
|
950
827
|
chand()->server_.ShouldUseV3()
|
951
828
|
? "/envoy.service.discovery.v3.AggregatedDiscoveryService/"
|
952
829
|
"StreamAggregatedResources"
|
953
830
|
: "/envoy.service.discovery.v2.AggregatedDiscoveryService/"
|
954
831
|
"StreamAggregatedResources";
|
955
|
-
call_ =
|
956
|
-
|
957
|
-
|
958
|
-
|
959
|
-
|
832
|
+
call_ = chand()->transport_->CreateStreamingCall(
|
833
|
+
method, absl::make_unique<StreamEventHandler>(
|
834
|
+
// Passing the initial ref here. This ref will go away when
|
835
|
+
// the StreamEventHandler is destroyed.
|
836
|
+
RefCountedPtr<AdsCallState>(this)));
|
960
837
|
GPR_ASSERT(call_ != nullptr);
|
961
|
-
// Init data associated with the call.
|
962
|
-
grpc_metadata_array_init(&initial_metadata_recv_);
|
963
|
-
grpc_metadata_array_init(&trailing_metadata_recv_);
|
964
838
|
// Start the call.
|
965
839
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
966
840
|
gpr_log(GPR_INFO,
|
967
841
|
"[xds_client %p] xds server %s: starting ADS call "
|
968
842
|
"(calld: %p, call: %p)",
|
969
|
-
xds_client(), chand()->server_.server_uri.c_str(), this,
|
970
|
-
|
971
|
-
|
972
|
-
|
973
|
-
|
974
|
-
memset(ops, 0, sizeof(ops));
|
975
|
-
// Op: send initial metadata.
|
976
|
-
grpc_op* op = ops;
|
977
|
-
op->op = GRPC_OP_SEND_INITIAL_METADATA;
|
978
|
-
op->data.send_initial_metadata.count = 0;
|
979
|
-
op->flags = GRPC_INITIAL_METADATA_WAIT_FOR_READY |
|
980
|
-
GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET;
|
981
|
-
op->reserved = nullptr;
|
982
|
-
op++;
|
983
|
-
call_error = grpc_call_start_batch_and_execute(
|
984
|
-
call_, ops, static_cast<size_t>(op - ops), nullptr);
|
985
|
-
GPR_ASSERT(GRPC_CALL_OK == call_error);
|
986
|
-
// Op: send request message.
|
987
|
-
GRPC_CLOSURE_INIT(&on_request_sent_, OnRequestSent, this,
|
988
|
-
grpc_schedule_on_exec_ctx);
|
843
|
+
xds_client(), chand()->server_.server_uri.c_str(), this,
|
844
|
+
call_.get());
|
845
|
+
}
|
846
|
+
// If this is a reconnect, add any necessary subscriptions from what's
|
847
|
+
// already in the cache.
|
989
848
|
for (const auto& a : xds_client()->authority_state_map_) {
|
990
849
|
const std::string& authority = a.first;
|
991
850
|
// Skip authorities that are not using this xDS channel.
|
@@ -998,86 +857,34 @@ XdsClient::ChannelState::AdsCallState::AdsCallState(
|
|
998
857
|
}
|
999
858
|
}
|
1000
859
|
}
|
860
|
+
// Send initial message if we added any subscriptions above.
|
1001
861
|
for (const auto& p : state_map_) {
|
1002
862
|
SendMessageLocked(p.first);
|
1003
863
|
}
|
1004
|
-
// Op: recv initial metadata.
|
1005
|
-
op = ops;
|
1006
|
-
op->op = GRPC_OP_RECV_INITIAL_METADATA;
|
1007
|
-
op->data.recv_initial_metadata.recv_initial_metadata =
|
1008
|
-
&initial_metadata_recv_;
|
1009
|
-
op->flags = 0;
|
1010
|
-
op->reserved = nullptr;
|
1011
|
-
op++;
|
1012
|
-
// Op: recv response.
|
1013
|
-
op->op = GRPC_OP_RECV_MESSAGE;
|
1014
|
-
op->data.recv_message.recv_message = &recv_message_payload_;
|
1015
|
-
op->flags = 0;
|
1016
|
-
op->reserved = nullptr;
|
1017
|
-
op++;
|
1018
|
-
Ref(DEBUG_LOCATION, "ADS+OnResponseReceivedLocked").release();
|
1019
|
-
GRPC_CLOSURE_INIT(&on_response_received_, OnResponseReceived, this,
|
1020
|
-
grpc_schedule_on_exec_ctx);
|
1021
|
-
call_error = grpc_call_start_batch_and_execute(
|
1022
|
-
call_, ops, static_cast<size_t>(op - ops), &on_response_received_);
|
1023
|
-
GPR_ASSERT(GRPC_CALL_OK == call_error);
|
1024
|
-
// Op: recv server status.
|
1025
|
-
op = ops;
|
1026
|
-
op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
|
1027
|
-
op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv_;
|
1028
|
-
op->data.recv_status_on_client.status = &status_code_;
|
1029
|
-
op->data.recv_status_on_client.status_details = &status_details_;
|
1030
|
-
op->flags = 0;
|
1031
|
-
op->reserved = nullptr;
|
1032
|
-
op++;
|
1033
|
-
// This callback signals the end of the call, so it relies on the initial
|
1034
|
-
// ref instead of a new ref. When it's invoked, it's the initial ref that is
|
1035
|
-
// unreffed.
|
1036
|
-
GRPC_CLOSURE_INIT(&on_status_received_, OnStatusReceived, this,
|
1037
|
-
grpc_schedule_on_exec_ctx);
|
1038
|
-
call_error = grpc_call_start_batch_and_execute(
|
1039
|
-
call_, ops, static_cast<size_t>(op - ops), &on_status_received_);
|
1040
|
-
GPR_ASSERT(GRPC_CALL_OK == call_error);
|
1041
|
-
}
|
1042
|
-
|
1043
|
-
XdsClient::ChannelState::AdsCallState::~AdsCallState() {
|
1044
|
-
grpc_metadata_array_destroy(&initial_metadata_recv_);
|
1045
|
-
grpc_metadata_array_destroy(&trailing_metadata_recv_);
|
1046
|
-
grpc_byte_buffer_destroy(send_message_payload_);
|
1047
|
-
grpc_byte_buffer_destroy(recv_message_payload_);
|
1048
|
-
grpc_slice_unref_internal(status_details_);
|
1049
|
-
GPR_ASSERT(call_ != nullptr);
|
1050
|
-
grpc_call_unref(call_);
|
1051
864
|
}
|
1052
865
|
|
1053
866
|
void XdsClient::ChannelState::AdsCallState::Orphan() {
|
1054
|
-
GPR_ASSERT(call_ != nullptr);
|
1055
|
-
// If we are here because xds_client wants to cancel the call,
|
1056
|
-
// on_status_received_ will complete the cancellation and clean up. Otherwise,
|
1057
|
-
// we are here because xds_client has to orphan a failed call, then the
|
1058
|
-
// following cancellation will be a no-op.
|
1059
|
-
grpc_call_cancel_internal(call_);
|
1060
867
|
state_map_.clear();
|
1061
|
-
// Note that the initial ref is
|
1062
|
-
//
|
868
|
+
// Note that the initial ref is held by the StreamEventHandler, which
|
869
|
+
// will be destroyed when call_ is destroyed, which may not happen
|
870
|
+
// here, since there may be other refs held to call_ by internal callbacks.
|
871
|
+
call_.reset();
|
1063
872
|
}
|
1064
873
|
|
1065
874
|
void XdsClient::ChannelState::AdsCallState::SendMessageLocked(
|
1066
875
|
const XdsResourceType* type)
|
1067
876
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
|
1068
877
|
// Buffer message sending if an existing message is in flight.
|
1069
|
-
if (
|
878
|
+
if (send_message_pending_) {
|
1070
879
|
buffered_requests_.insert(type);
|
1071
880
|
return;
|
1072
881
|
}
|
1073
882
|
auto& state = state_map_[type];
|
1074
|
-
|
1075
|
-
request_payload_slice = xds_client()->api_.CreateAdsRequest(
|
883
|
+
std::string serialized_message = xds_client()->api_.CreateAdsRequest(
|
1076
884
|
chand()->server_,
|
1077
885
|
chand()->server_.ShouldUseV3() ? type->type_url() : type->v2_type_url(),
|
1078
886
|
chand()->resource_type_version_map_[type], state.nonce,
|
1079
|
-
ResourceNamesForRequest(type),
|
1080
|
-
!sent_initial_message_);
|
887
|
+
ResourceNamesForRequest(type), state.status, !sent_initial_message_);
|
1081
888
|
sent_initial_message_ = true;
|
1082
889
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1083
890
|
gpr_log(GPR_INFO,
|
@@ -1086,32 +893,11 @@ void XdsClient::ChannelState::AdsCallState::SendMessageLocked(
|
|
1086
893
|
xds_client(), chand()->server_.server_uri.c_str(),
|
1087
894
|
std::string(type->type_url()).c_str(),
|
1088
895
|
chand()->resource_type_version_map_[type].c_str(),
|
1089
|
-
state.nonce.c_str(),
|
1090
|
-
}
|
1091
|
-
GRPC_ERROR_UNREF(state.error);
|
1092
|
-
state.error = GRPC_ERROR_NONE;
|
1093
|
-
// Create message payload.
|
1094
|
-
send_message_payload_ =
|
1095
|
-
grpc_raw_byte_buffer_create(&request_payload_slice, 1);
|
1096
|
-
grpc_slice_unref_internal(request_payload_slice);
|
1097
|
-
// Send the message.
|
1098
|
-
grpc_op op;
|
1099
|
-
memset(&op, 0, sizeof(op));
|
1100
|
-
op.op = GRPC_OP_SEND_MESSAGE;
|
1101
|
-
op.data.send_message.send_message = send_message_payload_;
|
1102
|
-
Ref(DEBUG_LOCATION, "ADS+OnRequestSentLocked").release();
|
1103
|
-
GRPC_CLOSURE_INIT(&on_request_sent_, OnRequestSent, this,
|
1104
|
-
grpc_schedule_on_exec_ctx);
|
1105
|
-
grpc_call_error call_error =
|
1106
|
-
grpc_call_start_batch_and_execute(call_, &op, 1, &on_request_sent_);
|
1107
|
-
if (GPR_UNLIKELY(call_error != GRPC_CALL_OK)) {
|
1108
|
-
gpr_log(GPR_ERROR,
|
1109
|
-
"[xds_client %p] xds server %s: error starting ADS send_message "
|
1110
|
-
"batch on calld=%p: call_error=%d",
|
1111
|
-
xds_client(), chand()->server_.server_uri.c_str(), this,
|
1112
|
-
call_error);
|
1113
|
-
GPR_ASSERT(GRPC_CALL_OK == call_error);
|
896
|
+
state.nonce.c_str(), state.status.ToString().c_str());
|
1114
897
|
}
|
898
|
+
state.status = absl::OkStatus();
|
899
|
+
call_->SendMessage(std::move(serialized_message));
|
900
|
+
send_message_pending_ = true;
|
1115
901
|
}
|
1116
902
|
|
1117
903
|
void XdsClient::ChannelState::AdsCallState::SubscribeLocked(
|
@@ -1142,22 +928,10 @@ bool XdsClient::ChannelState::AdsCallState::HasSubscribedResources() const {
|
|
1142
928
|
return false;
|
1143
929
|
}
|
1144
930
|
|
1145
|
-
void XdsClient::ChannelState::AdsCallState::OnRequestSent(
|
1146
|
-
|
1147
|
-
|
1148
|
-
{
|
1149
|
-
MutexLock lock(&ads_calld->xds_client()->mu_);
|
1150
|
-
ads_calld->OnRequestSentLocked(GRPC_ERROR_REF(error));
|
1151
|
-
}
|
1152
|
-
ads_calld->Unref(DEBUG_LOCATION, "ADS+OnRequestSentLocked");
|
1153
|
-
}
|
1154
|
-
|
1155
|
-
void XdsClient::ChannelState::AdsCallState::OnRequestSentLocked(
|
1156
|
-
grpc_error_handle error) {
|
1157
|
-
if (IsCurrentCallOnChannel() && GRPC_ERROR_IS_NONE(error)) {
|
1158
|
-
// Clean up the sent message.
|
1159
|
-
grpc_byte_buffer_destroy(send_message_payload_);
|
1160
|
-
send_message_payload_ = nullptr;
|
931
|
+
void XdsClient::ChannelState::AdsCallState::OnRequestSent(bool ok) {
|
932
|
+
MutexLock lock(&xds_client()->mu_);
|
933
|
+
send_message_pending_ = false;
|
934
|
+
if (ok && IsCurrentCallOnChannel()) {
|
1161
935
|
// Continue to send another pending message if any.
|
1162
936
|
// TODO(roth): The current code to handle buffered messages has the
|
1163
937
|
// advantage of sending only the most recent list of resource names for
|
@@ -1173,184 +947,135 @@ void XdsClient::ChannelState::AdsCallState::OnRequestSentLocked(
|
|
1173
947
|
buffered_requests_.erase(it);
|
1174
948
|
}
|
1175
949
|
}
|
1176
|
-
GRPC_ERROR_UNREF(error);
|
1177
950
|
}
|
1178
951
|
|
1179
|
-
void XdsClient::ChannelState::AdsCallState::
|
1180
|
-
|
1181
|
-
AdsCallState* ads_calld = static_cast<AdsCallState*>(arg);
|
1182
|
-
bool done;
|
952
|
+
void XdsClient::ChannelState::AdsCallState::OnRecvMessage(
|
953
|
+
absl::string_view payload) {
|
1183
954
|
{
|
1184
|
-
MutexLock lock(&
|
1185
|
-
|
1186
|
-
|
1187
|
-
|
1188
|
-
|
1189
|
-
|
1190
|
-
|
1191
|
-
|
1192
|
-
|
1193
|
-
|
1194
|
-
|
1195
|
-
|
1196
|
-
|
1197
|
-
|
1198
|
-
|
1199
|
-
|
1200
|
-
|
1201
|
-
|
1202
|
-
|
1203
|
-
|
1204
|
-
|
1205
|
-
|
1206
|
-
|
1207
|
-
|
1208
|
-
|
1209
|
-
|
1210
|
-
|
1211
|
-
|
1212
|
-
|
1213
|
-
|
1214
|
-
|
1215
|
-
|
1216
|
-
|
1217
|
-
|
1218
|
-
|
1219
|
-
|
1220
|
-
|
1221
|
-
|
1222
|
-
|
1223
|
-
|
1224
|
-
|
1225
|
-
|
1226
|
-
|
1227
|
-
|
1228
|
-
|
1229
|
-
|
1230
|
-
|
1231
|
-
|
1232
|
-
|
1233
|
-
|
1234
|
-
|
1235
|
-
|
1236
|
-
|
1237
|
-
|
1238
|
-
|
1239
|
-
|
1240
|
-
|
1241
|
-
|
1242
|
-
|
1243
|
-
|
1244
|
-
|
1245
|
-
|
1246
|
-
|
1247
|
-
|
1248
|
-
|
1249
|
-
|
1250
|
-
|
1251
|
-
|
1252
|
-
|
1253
|
-
|
1254
|
-
|
1255
|
-
|
1256
|
-
|
1257
|
-
|
1258
|
-
// from the response does not necessarily indicate that the resource
|
1259
|
-
// does not exist. For that case, we rely on the request timeout
|
1260
|
-
// instead.
|
1261
|
-
if (resource_state.resource == nullptr) continue;
|
1262
|
-
if (chand()->server_.IgnoreResourceDeletion()) {
|
1263
|
-
if (!resource_state.ignored_deletion) {
|
1264
|
-
gpr_log(GPR_ERROR,
|
1265
|
-
"[xds_client %p] xds server %s: ignoring deletion "
|
1266
|
-
"for resource type %s name %s",
|
1267
|
-
xds_client(), chand()->server_.server_uri.c_str(),
|
1268
|
-
result.type_url.c_str(),
|
1269
|
-
XdsClient::ConstructFullXdsResourceName(
|
1270
|
-
authority, result.type_url.c_str(), resource_key)
|
1271
|
-
.c_str());
|
1272
|
-
resource_state.ignored_deletion = true;
|
955
|
+
MutexLock lock(&xds_client()->mu_);
|
956
|
+
if (!IsCurrentCallOnChannel()) return;
|
957
|
+
// Parse and validate the response.
|
958
|
+
AdsResponseParser parser(this);
|
959
|
+
absl::Status status =
|
960
|
+
xds_client()->api_.ParseAdsResponse(chand()->server_, payload, &parser);
|
961
|
+
if (!status.ok()) {
|
962
|
+
// Ignore unparsable response.
|
963
|
+
gpr_log(GPR_ERROR,
|
964
|
+
"[xds_client %p] xds server %s: error parsing ADS response (%s) "
|
965
|
+
"-- ignoring",
|
966
|
+
xds_client(), chand()->server_.server_uri.c_str(),
|
967
|
+
status.ToString().c_str());
|
968
|
+
} else {
|
969
|
+
seen_response_ = true;
|
970
|
+
AdsResponseParser::Result result = parser.TakeResult();
|
971
|
+
// Update nonce.
|
972
|
+
auto& state = state_map_[result.type];
|
973
|
+
state.nonce = result.nonce;
|
974
|
+
// If we got an error, set state.error so that we'll NACK the update.
|
975
|
+
if (!result.errors.empty()) {
|
976
|
+
state.status = absl::UnavailableError(
|
977
|
+
absl::StrCat("xDS response validation errors: [",
|
978
|
+
absl::StrJoin(result.errors, "; "), "]"));
|
979
|
+
gpr_log(GPR_ERROR,
|
980
|
+
"[xds_client %p] xds server %s: ADS response invalid for "
|
981
|
+
"resource "
|
982
|
+
"type %s version %s, will NACK: nonce=%s status=%s",
|
983
|
+
xds_client(), chand()->server_.server_uri.c_str(),
|
984
|
+
result.type_url.c_str(), result.version.c_str(),
|
985
|
+
state.nonce.c_str(), state.status.ToString().c_str());
|
986
|
+
}
|
987
|
+
// Delete resources not seen in update if needed.
|
988
|
+
if (result.type->AllResourcesRequiredInSotW()) {
|
989
|
+
for (auto& a : xds_client()->authority_state_map_) {
|
990
|
+
const std::string& authority = a.first;
|
991
|
+
AuthorityState& authority_state = a.second;
|
992
|
+
// Skip authorities that are not using this xDS channel.
|
993
|
+
if (authority_state.channel_state != chand()) continue;
|
994
|
+
auto seen_authority_it = result.resources_seen.find(authority);
|
995
|
+
// Find this resource type.
|
996
|
+
auto type_it = authority_state.resource_map.find(result.type);
|
997
|
+
if (type_it == authority_state.resource_map.end()) continue;
|
998
|
+
// Iterate over resource ids.
|
999
|
+
for (auto& r : type_it->second) {
|
1000
|
+
const XdsResourceKey& resource_key = r.first;
|
1001
|
+
ResourceState& resource_state = r.second;
|
1002
|
+
if (seen_authority_it == result.resources_seen.end() ||
|
1003
|
+
seen_authority_it->second.find(resource_key) ==
|
1004
|
+
seen_authority_it->second.end()) {
|
1005
|
+
// If the resource was newly requested but has not yet been
|
1006
|
+
// received, we don't want to generate an error for the
|
1007
|
+
// watchers, because this ADS response may be in reaction to an
|
1008
|
+
// earlier request that did not yet request the new resource, so
|
1009
|
+
// its absence from the response does not necessarily indicate
|
1010
|
+
// that the resource does not exist. For that case, we rely on
|
1011
|
+
// the request timeout instead.
|
1012
|
+
if (resource_state.resource == nullptr) continue;
|
1013
|
+
if (chand()->server_.IgnoreResourceDeletion()) {
|
1014
|
+
if (!resource_state.ignored_deletion) {
|
1015
|
+
gpr_log(GPR_ERROR,
|
1016
|
+
"[xds_client %p] xds server %s: ignoring deletion "
|
1017
|
+
"for resource type %s name %s",
|
1018
|
+
xds_client(), chand()->server_.server_uri.c_str(),
|
1019
|
+
result.type_url.c_str(),
|
1020
|
+
XdsClient::ConstructFullXdsResourceName(
|
1021
|
+
authority, result.type_url.c_str(), resource_key)
|
1022
|
+
.c_str());
|
1023
|
+
resource_state.ignored_deletion = true;
|
1024
|
+
}
|
1025
|
+
} else {
|
1026
|
+
resource_state.resource.reset();
|
1027
|
+
xds_client()->NotifyWatchersOnResourceDoesNotExist(
|
1028
|
+
resource_state.watchers);
|
1273
1029
|
}
|
1274
|
-
} else {
|
1275
|
-
resource_state.resource.reset();
|
1276
|
-
xds_client()->NotifyWatchersOnResourceDoesNotExist(
|
1277
|
-
resource_state.watchers);
|
1278
1030
|
}
|
1279
1031
|
}
|
1280
1032
|
}
|
1281
1033
|
}
|
1282
|
-
|
1283
|
-
|
1284
|
-
|
1285
|
-
|
1286
|
-
|
1287
|
-
|
1288
|
-
|
1289
|
-
|
1290
|
-
|
1291
|
-
|
1034
|
+
// If we had valid resources, update the version.
|
1035
|
+
if (result.have_valid_resources) {
|
1036
|
+
chand()->resource_type_version_map_[result.type] =
|
1037
|
+
std::move(result.version);
|
1038
|
+
// Start load reporting if needed.
|
1039
|
+
auto& lrs_call = chand()->lrs_calld_;
|
1040
|
+
if (lrs_call != nullptr) {
|
1041
|
+
LrsCallState* lrs_calld = lrs_call->calld();
|
1042
|
+
if (lrs_calld != nullptr) lrs_calld->MaybeStartReportingLocked();
|
1043
|
+
}
|
1292
1044
|
}
|
1045
|
+
// Send ACK or NACK.
|
1046
|
+
SendMessageLocked(result.type);
|
1293
1047
|
}
|
1294
|
-
|
1295
|
-
|
1296
|
-
}
|
1297
|
-
if (xds_client()->shutting_down_) return true;
|
1298
|
-
// Keep listening for updates.
|
1299
|
-
grpc_op op;
|
1300
|
-
memset(&op, 0, sizeof(op));
|
1301
|
-
op.op = GRPC_OP_RECV_MESSAGE;
|
1302
|
-
op.data.recv_message.recv_message = &recv_message_payload_;
|
1303
|
-
op.flags = 0;
|
1304
|
-
op.reserved = nullptr;
|
1305
|
-
GPR_ASSERT(call_ != nullptr);
|
1306
|
-
// Reuse the "ADS+OnResponseReceivedLocked" ref taken in ctor.
|
1307
|
-
const grpc_call_error call_error =
|
1308
|
-
grpc_call_start_batch_and_execute(call_, &op, 1, &on_response_received_);
|
1309
|
-
GPR_ASSERT(GRPC_CALL_OK == call_error);
|
1310
|
-
return false;
|
1048
|
+
}
|
1049
|
+
xds_client()->work_serializer_.DrainQueue();
|
1311
1050
|
}
|
1312
1051
|
|
1313
1052
|
void XdsClient::ChannelState::AdsCallState::OnStatusReceived(
|
1314
|
-
|
1315
|
-
AdsCallState* ads_calld = static_cast<AdsCallState*>(arg);
|
1053
|
+
absl::Status status) {
|
1316
1054
|
{
|
1317
|
-
MutexLock lock(&
|
1318
|
-
|
1319
|
-
|
1320
|
-
|
1321
|
-
|
1322
|
-
|
1323
|
-
|
1324
|
-
|
1325
|
-
|
1326
|
-
|
1327
|
-
|
1328
|
-
|
1329
|
-
|
1330
|
-
|
1331
|
-
|
1332
|
-
|
1333
|
-
|
1334
|
-
grpc_error_std_string(error).c_str());
|
1335
|
-
gpr_free(status_details);
|
1336
|
-
}
|
1337
|
-
// Ignore status from a stale call.
|
1338
|
-
if (IsCurrentCallOnChannel()) {
|
1339
|
-
// Try to restart the call.
|
1340
|
-
parent_->OnCallFinishedLocked();
|
1341
|
-
// Send error to all watchers.
|
1342
|
-
xds_client()->NotifyOnErrorLocked(absl::UnavailableError(absl::StrFormat(
|
1343
|
-
"xDS call failed: xDS server: %s, ADS call status code=%d, "
|
1344
|
-
"details='%s', error='%s'",
|
1345
|
-
chand()->server_.server_uri, status_code_,
|
1346
|
-
StringViewFromSlice(status_details_), grpc_error_std_string(error))));
|
1055
|
+
MutexLock lock(&xds_client()->mu_);
|
1056
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1057
|
+
gpr_log(GPR_INFO,
|
1058
|
+
"[xds_client %p] xds server %s: ADS call status received "
|
1059
|
+
"(chand=%p, ads_calld=%p, call=%p): %s",
|
1060
|
+
xds_client(), chand()->server_.server_uri.c_str(), chand(), this,
|
1061
|
+
call_.get(), status.ToString().c_str());
|
1062
|
+
}
|
1063
|
+
// Ignore status from a stale call.
|
1064
|
+
if (IsCurrentCallOnChannel()) {
|
1065
|
+
// Try to restart the call.
|
1066
|
+
parent_->OnCallFinishedLocked();
|
1067
|
+
// Send error to all watchers.
|
1068
|
+
xds_client()->NotifyOnErrorLocked(absl::UnavailableError(absl::StrFormat(
|
1069
|
+
"xDS call failed: xDS server: %s, ADS call status: %s",
|
1070
|
+
chand()->server_.server_uri, status.ToString().c_str())));
|
1071
|
+
}
|
1347
1072
|
}
|
1348
|
-
|
1073
|
+
xds_client()->work_serializer_.DrainQueue();
|
1349
1074
|
}
|
1350
1075
|
|
1351
1076
|
bool XdsClient::ChannelState::AdsCallState::IsCurrentCallOnChannel() const {
|
1352
|
-
// If the retryable ADS call is null (which only happens when the xds
|
1353
|
-
// is shutting down), all the ADS calls are stale.
|
1077
|
+
// If the retryable ADS call is null (which only happens when the xds
|
1078
|
+
// channel is shutting down), all the ADS calls are stale.
|
1354
1079
|
if (chand()->ads_calld_ == nullptr) return false;
|
1355
1080
|
return this == chand()->ads_calld_->calld();
|
1356
1081
|
}
|
@@ -1380,38 +1105,30 @@ XdsClient::ChannelState::AdsCallState::ResourceNamesForRequest(
|
|
1380
1105
|
//
|
1381
1106
|
|
1382
1107
|
void XdsClient::ChannelState::LrsCallState::Reporter::Orphan() {
|
1383
|
-
if (
|
1384
|
-
|
1108
|
+
if (timer_handle_.has_value() &&
|
1109
|
+
GetDefaultEventEngine()->Cancel(*timer_handle_)) {
|
1110
|
+
timer_handle_.reset();
|
1111
|
+
Unref(DEBUG_LOCATION, "Orphan");
|
1385
1112
|
}
|
1386
1113
|
}
|
1387
1114
|
|
1388
1115
|
void XdsClient::ChannelState::LrsCallState::Reporter::
|
1389
1116
|
ScheduleNextReportLocked() {
|
1390
|
-
|
1391
|
-
|
1392
|
-
|
1393
|
-
|
1394
|
-
|
1395
|
-
|
1396
|
-
|
1397
|
-
void* arg, grpc_error_handle error) {
|
1398
|
-
Reporter* self = static_cast<Reporter*>(arg);
|
1399
|
-
bool done;
|
1400
|
-
{
|
1401
|
-
MutexLock lock(&self->xds_client()->mu_);
|
1402
|
-
done = self->OnNextReportTimerLocked(GRPC_ERROR_REF(error));
|
1403
|
-
}
|
1404
|
-
if (done) self->Unref(DEBUG_LOCATION, "Reporter+timer");
|
1117
|
+
timer_handle_ = GetDefaultEventEngine()->RunAfter(report_interval_, [this]() {
|
1118
|
+
ApplicationCallbackExecCtx callback_exec_ctx;
|
1119
|
+
ExecCtx exec_ctx;
|
1120
|
+
if (OnNextReportTimer()) {
|
1121
|
+
Unref(DEBUG_LOCATION, "OnNextReportTimer()");
|
1122
|
+
}
|
1123
|
+
});
|
1405
1124
|
}
|
1406
1125
|
|
1407
|
-
bool XdsClient::ChannelState::LrsCallState::Reporter::
|
1408
|
-
|
1409
|
-
|
1410
|
-
if (!
|
1411
|
-
|
1412
|
-
|
1413
|
-
}
|
1414
|
-
return SendReportLocked();
|
1126
|
+
bool XdsClient::ChannelState::LrsCallState::Reporter::OnNextReportTimer() {
|
1127
|
+
MutexLock lock(&xds_client()->mu_);
|
1128
|
+
timer_handle_.reset();
|
1129
|
+
if (!IsCurrentReporterOnCall()) return true;
|
1130
|
+
SendReportLocked();
|
1131
|
+
return false;
|
1415
1132
|
}
|
1416
1133
|
|
1417
1134
|
namespace {
|
@@ -1451,65 +1168,34 @@ bool XdsClient::ChannelState::LrsCallState::Reporter::SendReportLocked() {
|
|
1451
1168
|
ScheduleNextReportLocked();
|
1452
1169
|
return false;
|
1453
1170
|
}
|
1454
|
-
//
|
1455
|
-
|
1171
|
+
// Send a request that contains the snapshot.
|
1172
|
+
std::string serialized_payload =
|
1456
1173
|
xds_client()->api_.CreateLrsRequest(std::move(snapshot));
|
1457
|
-
parent_->
|
1458
|
-
|
1459
|
-
grpc_slice_unref_internal(request_payload_slice);
|
1460
|
-
// Send the report.
|
1461
|
-
grpc_op op;
|
1462
|
-
memset(&op, 0, sizeof(op));
|
1463
|
-
op.op = GRPC_OP_SEND_MESSAGE;
|
1464
|
-
op.data.send_message.send_message = parent_->send_message_payload_;
|
1465
|
-
grpc_call_error call_error = grpc_call_start_batch_and_execute(
|
1466
|
-
parent_->call_, &op, 1, &on_report_done_);
|
1467
|
-
if (GPR_UNLIKELY(call_error != GRPC_CALL_OK)) {
|
1468
|
-
gpr_log(GPR_ERROR,
|
1469
|
-
"[xds_client %p] xds server %s: error starting LRS send_message "
|
1470
|
-
"batch on calld=%p: call_error=%d",
|
1471
|
-
xds_client(), parent_->chand()->server_.server_uri.c_str(), this,
|
1472
|
-
call_error);
|
1473
|
-
GPR_ASSERT(GRPC_CALL_OK == call_error);
|
1474
|
-
}
|
1174
|
+
parent_->call_->SendMessage(std::move(serialized_payload));
|
1175
|
+
parent_->send_message_pending_ = true;
|
1475
1176
|
return false;
|
1476
1177
|
}
|
1477
1178
|
|
1478
|
-
void XdsClient::ChannelState::LrsCallState::Reporter::
|
1479
|
-
|
1480
|
-
|
1481
|
-
|
1482
|
-
|
1483
|
-
|
1484
|
-
|
1485
|
-
|
1486
|
-
if (done) self->Unref(DEBUG_LOCATION, "Reporter+report_done");
|
1487
|
-
}
|
1488
|
-
|
1489
|
-
bool XdsClient::ChannelState::LrsCallState::Reporter::OnReportDoneLocked(
|
1490
|
-
grpc_error_handle error) {
|
1491
|
-
grpc_byte_buffer_destroy(parent_->send_message_payload_);
|
1492
|
-
parent_->send_message_payload_ = nullptr;
|
1179
|
+
void XdsClient::ChannelState::LrsCallState::Reporter::OnReportDoneLocked() {
|
1180
|
+
// If a reporter starts a send_message op, then the reporting interval
|
1181
|
+
// changes and we destroy that reporter and create a new one, and then
|
1182
|
+
// the send_message op started by the old reporter finishes, this
|
1183
|
+
// method will be called even though it was for a completion started
|
1184
|
+
// by the old reporter. In that case, the timer will be pending, so
|
1185
|
+
// we just ignore the completion and wait for the timer to fire.
|
1186
|
+
if (timer_handle_.has_value()) return;
|
1493
1187
|
// If there are no more registered stats to report, cancel the call.
|
1494
1188
|
auto it =
|
1495
1189
|
xds_client()->xds_load_report_server_map_.find(parent_->chand()->server_);
|
1496
|
-
if (it == xds_client()->xds_load_report_server_map_.end()
|
1497
|
-
|
1498
|
-
it->second.channel_state
|
1499
|
-
|
1500
|
-
return true;
|
1501
|
-
}
|
1502
|
-
if (!GRPC_ERROR_IS_NONE(error) || !IsCurrentReporterOnCall()) {
|
1503
|
-
GRPC_ERROR_UNREF(error);
|
1504
|
-
// If this reporter is no longer the current one on the call, the reason
|
1505
|
-
// might be that it was orphaned for a new one due to config update.
|
1506
|
-
if (!IsCurrentReporterOnCall()) {
|
1507
|
-
parent_->MaybeStartReportingLocked();
|
1190
|
+
if (it == xds_client()->xds_load_report_server_map_.end()) return;
|
1191
|
+
if (it->second.load_report_map.empty()) {
|
1192
|
+
if (it->second.channel_state != nullptr) {
|
1193
|
+
it->second.channel_state->StopLrsCallLocked();
|
1508
1194
|
}
|
1509
|
-
return
|
1195
|
+
return;
|
1510
1196
|
}
|
1197
|
+
// Otherwise, schedule the next load report.
|
1511
1198
|
ScheduleNextReportLocked();
|
1512
|
-
return false;
|
1513
1199
|
}
|
1514
1200
|
|
1515
1201
|
//
|
@@ -1527,124 +1213,46 @@ XdsClient::ChannelState::LrsCallState::LrsCallState(
|
|
1527
1213
|
// activity in xds_client()->interested_parties_, which is comprised of
|
1528
1214
|
// the polling entities from client_channel.
|
1529
1215
|
GPR_ASSERT(xds_client() != nullptr);
|
1530
|
-
const char* method =
|
1531
|
-
|
1532
|
-
|
1533
|
-
|
1534
|
-
|
1535
|
-
|
1536
|
-
|
1537
|
-
|
1538
|
-
|
1216
|
+
const char* method = chand()->server_.ShouldUseV3()
|
1217
|
+
? "/envoy.service.load_stats.v3."
|
1218
|
+
"LoadReportingService/StreamLoadStats"
|
1219
|
+
: "/envoy.service.load_stats.v2."
|
1220
|
+
"LoadReportingService/StreamLoadStats";
|
1221
|
+
call_ = chand()->transport_->CreateStreamingCall(
|
1222
|
+
method, absl::make_unique<StreamEventHandler>(
|
1223
|
+
// Passing the initial ref here. This ref will go away when
|
1224
|
+
// the StreamEventHandler is destroyed.
|
1225
|
+
RefCountedPtr<LrsCallState>(this)));
|
1539
1226
|
GPR_ASSERT(call_ != nullptr);
|
1540
|
-
// Init the request payload.
|
1541
|
-
grpc_slice request_payload_slice =
|
1542
|
-
xds_client()->api_.CreateLrsInitialRequest(chand()->server_);
|
1543
|
-
send_message_payload_ =
|
1544
|
-
grpc_raw_byte_buffer_create(&request_payload_slice, 1);
|
1545
|
-
grpc_slice_unref_internal(request_payload_slice);
|
1546
|
-
// Init other data associated with the LRS call.
|
1547
|
-
grpc_metadata_array_init(&initial_metadata_recv_);
|
1548
|
-
grpc_metadata_array_init(&trailing_metadata_recv_);
|
1549
1227
|
// Start the call.
|
1550
1228
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1551
|
-
gpr_log(
|
1552
|
-
|
1553
|
-
|
1554
|
-
|
1555
|
-
|
1556
|
-
|
1557
|
-
|
1558
|
-
|
1559
|
-
|
1560
|
-
|
1561
|
-
|
1562
|
-
op->op = GRPC_OP_SEND_INITIAL_METADATA;
|
1563
|
-
op->data.send_initial_metadata.count = 0;
|
1564
|
-
op->flags = GRPC_INITIAL_METADATA_WAIT_FOR_READY |
|
1565
|
-
GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET;
|
1566
|
-
op->reserved = nullptr;
|
1567
|
-
op++;
|
1568
|
-
// Op: send request message.
|
1569
|
-
GPR_ASSERT(send_message_payload_ != nullptr);
|
1570
|
-
op->op = GRPC_OP_SEND_MESSAGE;
|
1571
|
-
op->data.send_message.send_message = send_message_payload_;
|
1572
|
-
op->flags = 0;
|
1573
|
-
op->reserved = nullptr;
|
1574
|
-
op++;
|
1575
|
-
Ref(DEBUG_LOCATION, "LRS+OnInitialRequestSentLocked").release();
|
1576
|
-
GRPC_CLOSURE_INIT(&on_initial_request_sent_, OnInitialRequestSent, this,
|
1577
|
-
grpc_schedule_on_exec_ctx);
|
1578
|
-
call_error = grpc_call_start_batch_and_execute(
|
1579
|
-
call_, ops, static_cast<size_t>(op - ops), &on_initial_request_sent_);
|
1580
|
-
GPR_ASSERT(GRPC_CALL_OK == call_error);
|
1581
|
-
// Op: recv initial metadata.
|
1582
|
-
op = ops;
|
1583
|
-
op->op = GRPC_OP_RECV_INITIAL_METADATA;
|
1584
|
-
op->data.recv_initial_metadata.recv_initial_metadata =
|
1585
|
-
&initial_metadata_recv_;
|
1586
|
-
op->flags = 0;
|
1587
|
-
op->reserved = nullptr;
|
1588
|
-
op++;
|
1589
|
-
// Op: recv response.
|
1590
|
-
op->op = GRPC_OP_RECV_MESSAGE;
|
1591
|
-
op->data.recv_message.recv_message = &recv_message_payload_;
|
1592
|
-
op->flags = 0;
|
1593
|
-
op->reserved = nullptr;
|
1594
|
-
op++;
|
1595
|
-
Ref(DEBUG_LOCATION, "LRS+OnResponseReceivedLocked").release();
|
1596
|
-
GRPC_CLOSURE_INIT(&on_response_received_, OnResponseReceived, this,
|
1597
|
-
grpc_schedule_on_exec_ctx);
|
1598
|
-
call_error = grpc_call_start_batch_and_execute(
|
1599
|
-
call_, ops, static_cast<size_t>(op - ops), &on_response_received_);
|
1600
|
-
GPR_ASSERT(GRPC_CALL_OK == call_error);
|
1601
|
-
// Op: recv server status.
|
1602
|
-
op = ops;
|
1603
|
-
op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
|
1604
|
-
op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv_;
|
1605
|
-
op->data.recv_status_on_client.status = &status_code_;
|
1606
|
-
op->data.recv_status_on_client.status_details = &status_details_;
|
1607
|
-
op->flags = 0;
|
1608
|
-
op->reserved = nullptr;
|
1609
|
-
op++;
|
1610
|
-
// This callback signals the end of the call, so it relies on the initial
|
1611
|
-
// ref instead of a new ref. When it's invoked, it's the initial ref that is
|
1612
|
-
// unreffed.
|
1613
|
-
GRPC_CLOSURE_INIT(&on_status_received_, OnStatusReceived, this,
|
1614
|
-
grpc_schedule_on_exec_ctx);
|
1615
|
-
call_error = grpc_call_start_batch_and_execute(
|
1616
|
-
call_, ops, static_cast<size_t>(op - ops), &on_status_received_);
|
1617
|
-
GPR_ASSERT(GRPC_CALL_OK == call_error);
|
1618
|
-
}
|
1619
|
-
|
1620
|
-
XdsClient::ChannelState::LrsCallState::~LrsCallState() {
|
1621
|
-
grpc_metadata_array_destroy(&initial_metadata_recv_);
|
1622
|
-
grpc_metadata_array_destroy(&trailing_metadata_recv_);
|
1623
|
-
grpc_byte_buffer_destroy(send_message_payload_);
|
1624
|
-
grpc_byte_buffer_destroy(recv_message_payload_);
|
1625
|
-
grpc_slice_unref_internal(status_details_);
|
1626
|
-
GPR_ASSERT(call_ != nullptr);
|
1627
|
-
grpc_call_unref(call_);
|
1229
|
+
gpr_log(GPR_INFO,
|
1230
|
+
"[xds_client %p] xds server %s: starting LRS call (calld=%p, "
|
1231
|
+
"call=%p)",
|
1232
|
+
xds_client(), chand()->server_.server_uri.c_str(), this,
|
1233
|
+
call_.get());
|
1234
|
+
}
|
1235
|
+
// Send the initial request.
|
1236
|
+
std::string serialized_payload =
|
1237
|
+
xds_client()->api_.CreateLrsInitialRequest(chand()->server_);
|
1238
|
+
call_->SendMessage(std::move(serialized_payload));
|
1239
|
+
send_message_pending_ = true;
|
1628
1240
|
}
|
1629
1241
|
|
1630
1242
|
void XdsClient::ChannelState::LrsCallState::Orphan() {
|
1631
1243
|
reporter_.reset();
|
1632
|
-
|
1633
|
-
//
|
1634
|
-
//
|
1635
|
-
|
1636
|
-
// following cancellation will be a no-op.
|
1637
|
-
grpc_call_cancel_internal(call_);
|
1638
|
-
// Note that the initial ref is hold by on_status_received_. So the
|
1639
|
-
// corresponding unref happens in on_status_received_ instead of here.
|
1244
|
+
// Note that the initial ref is held by the StreamEventHandler, which
|
1245
|
+
// will be destroyed when call_ is destroyed, which may not happen
|
1246
|
+
// here, since there may be other refs held to call_ by internal callbacks.
|
1247
|
+
call_.reset();
|
1640
1248
|
}
|
1641
1249
|
|
1642
1250
|
void XdsClient::ChannelState::LrsCallState::MaybeStartReportingLocked() {
|
1643
1251
|
// Don't start again if already started.
|
1644
1252
|
if (reporter_ != nullptr) return;
|
1645
|
-
// Don't start if the previous send_message op (of the initial request or
|
1646
|
-
// last report of the previous reporter) hasn't completed.
|
1647
|
-
if (
|
1253
|
+
// Don't start if the previous send_message op (of the initial request or
|
1254
|
+
// the last report of the previous reporter) hasn't completed.
|
1255
|
+
if (call_ != nullptr && send_message_pending_) return;
|
1648
1256
|
// Don't start if no LRS response has arrived.
|
1649
1257
|
if (!seen_response()) return;
|
1650
1258
|
// Don't start if the ADS call hasn't received any valid response. Note that
|
@@ -1660,166 +1268,105 @@ void XdsClient::ChannelState::LrsCallState::MaybeStartReportingLocked() {
|
|
1660
1268
|
Ref(DEBUG_LOCATION, "LRS+load_report+start"), load_reporting_interval_);
|
1661
1269
|
}
|
1662
1270
|
|
1663
|
-
void XdsClient::ChannelState::LrsCallState::
|
1664
|
-
|
1665
|
-
|
1666
|
-
{
|
1667
|
-
|
1668
|
-
|
1271
|
+
void XdsClient::ChannelState::LrsCallState::OnRequestSent(bool /*ok*/) {
|
1272
|
+
MutexLock lock(&xds_client()->mu_);
|
1273
|
+
send_message_pending_ = false;
|
1274
|
+
if (reporter_ != nullptr) {
|
1275
|
+
reporter_->OnReportDoneLocked();
|
1276
|
+
} else {
|
1277
|
+
MaybeStartReportingLocked();
|
1669
1278
|
}
|
1670
|
-
lrs_calld->Unref(DEBUG_LOCATION, "LRS+OnInitialRequestSentLocked");
|
1671
1279
|
}
|
1672
1280
|
|
1673
|
-
void XdsClient::ChannelState::LrsCallState::
|
1674
|
-
|
1675
|
-
|
1676
|
-
|
1677
|
-
|
1678
|
-
|
1679
|
-
|
1680
|
-
|
1681
|
-
|
1682
|
-
|
1683
|
-
|
1684
|
-
|
1685
|
-
|
1686
|
-
|
1687
|
-
|
1688
|
-
|
1689
|
-
|
1690
|
-
|
1691
|
-
|
1692
|
-
|
1693
|
-
if (
|
1694
|
-
|
1695
|
-
|
1696
|
-
|
1697
|
-
|
1698
|
-
|
1699
|
-
|
1700
|
-
|
1701
|
-
|
1702
|
-
|
1703
|
-
|
1704
|
-
|
1705
|
-
|
1706
|
-
bool send_all_clusters = false;
|
1707
|
-
std::set<std::string> new_cluster_names;
|
1708
|
-
Duration new_load_reporting_interval;
|
1709
|
-
grpc_error_handle parse_error = xds_client()->api_.ParseLrsResponse(
|
1710
|
-
response_slice, &send_all_clusters, &new_cluster_names,
|
1711
|
-
&new_load_reporting_interval);
|
1712
|
-
if (!GRPC_ERROR_IS_NONE(parse_error)) {
|
1713
|
-
gpr_log(GPR_ERROR,
|
1714
|
-
"[xds_client %p] xds server %s: LRS response parsing failed: %s",
|
1715
|
-
xds_client(), chand()->server_.server_uri.c_str(),
|
1716
|
-
grpc_error_std_string(parse_error).c_str());
|
1717
|
-
GRPC_ERROR_UNREF(parse_error);
|
1718
|
-
return;
|
1281
|
+
void XdsClient::ChannelState::LrsCallState::OnRecvMessage(
|
1282
|
+
absl::string_view payload) {
|
1283
|
+
MutexLock lock(&xds_client()->mu_);
|
1284
|
+
// If we're no longer the current call, ignore the result.
|
1285
|
+
if (!IsCurrentCallOnChannel()) return;
|
1286
|
+
// Parse the response.
|
1287
|
+
bool send_all_clusters = false;
|
1288
|
+
std::set<std::string> new_cluster_names;
|
1289
|
+
Duration new_load_reporting_interval;
|
1290
|
+
absl::Status status = xds_client()->api_.ParseLrsResponse(
|
1291
|
+
payload, &send_all_clusters, &new_cluster_names,
|
1292
|
+
&new_load_reporting_interval);
|
1293
|
+
if (!status.ok()) {
|
1294
|
+
gpr_log(GPR_ERROR,
|
1295
|
+
"[xds_client %p] xds server %s: LRS response parsing failed: %s",
|
1296
|
+
xds_client(), chand()->server_.server_uri.c_str(),
|
1297
|
+
status.ToString().c_str());
|
1298
|
+
return;
|
1299
|
+
}
|
1300
|
+
seen_response_ = true;
|
1301
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1302
|
+
gpr_log(
|
1303
|
+
GPR_INFO,
|
1304
|
+
"[xds_client %p] xds server %s: LRS response received, %" PRIuPTR
|
1305
|
+
" cluster names, send_all_clusters=%d, load_report_interval=%" PRId64
|
1306
|
+
"ms",
|
1307
|
+
xds_client(), chand()->server_.server_uri.c_str(),
|
1308
|
+
new_cluster_names.size(), send_all_clusters,
|
1309
|
+
new_load_reporting_interval.millis());
|
1310
|
+
size_t i = 0;
|
1311
|
+
for (const auto& name : new_cluster_names) {
|
1312
|
+
gpr_log(GPR_INFO, "[xds_client %p] cluster_name %" PRIuPTR ": %s",
|
1313
|
+
xds_client(), i++, name.c_str());
|
1719
1314
|
}
|
1720
|
-
|
1315
|
+
}
|
1316
|
+
if (new_load_reporting_interval <
|
1317
|
+
Duration::Milliseconds(GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS)) {
|
1318
|
+
new_load_reporting_interval =
|
1319
|
+
Duration::Milliseconds(GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS);
|
1721
1320
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1722
|
-
gpr_log(
|
1723
|
-
|
1724
|
-
|
1725
|
-
|
1726
|
-
|
1727
|
-
xds_client(), chand()->server_.server_uri.c_str(),
|
1728
|
-
new_cluster_names.size(), send_all_clusters,
|
1729
|
-
new_load_reporting_interval.millis());
|
1730
|
-
size_t i = 0;
|
1731
|
-
for (const auto& name : new_cluster_names) {
|
1732
|
-
gpr_log(GPR_INFO, "[xds_client %p] cluster_name %" PRIuPTR ": %s",
|
1733
|
-
xds_client(), i++, name.c_str());
|
1734
|
-
}
|
1735
|
-
}
|
1736
|
-
if (new_load_reporting_interval <
|
1737
|
-
Duration::Milliseconds(
|
1738
|
-
GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS)) {
|
1739
|
-
new_load_reporting_interval = Duration::Milliseconds(
|
1740
|
-
GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS);
|
1741
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1742
|
-
gpr_log(GPR_INFO,
|
1743
|
-
"[xds_client %p] xds server %s: increased load_report_interval "
|
1744
|
-
"to minimum value %dms",
|
1745
|
-
xds_client(), chand()->server_.server_uri.c_str(),
|
1746
|
-
GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS);
|
1747
|
-
}
|
1321
|
+
gpr_log(GPR_INFO,
|
1322
|
+
"[xds_client %p] xds server %s: increased load_report_interval "
|
1323
|
+
"to minimum value %dms",
|
1324
|
+
xds_client(), chand()->server_.server_uri.c_str(),
|
1325
|
+
GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS);
|
1748
1326
|
}
|
1749
|
-
|
1750
|
-
|
1751
|
-
|
1752
|
-
|
1753
|
-
|
1754
|
-
|
1755
|
-
|
1756
|
-
|
1757
|
-
|
1758
|
-
|
1759
|
-
}
|
1760
|
-
return;
|
1327
|
+
}
|
1328
|
+
// Ignore identical update.
|
1329
|
+
if (send_all_clusters == send_all_clusters_ &&
|
1330
|
+
cluster_names_ == new_cluster_names &&
|
1331
|
+
load_reporting_interval_ == new_load_reporting_interval) {
|
1332
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1333
|
+
gpr_log(GPR_INFO,
|
1334
|
+
"[xds_client %p] xds server %s: incoming LRS response identical "
|
1335
|
+
"to current, ignoring.",
|
1336
|
+
xds_client(), chand()->server_.server_uri.c_str());
|
1761
1337
|
}
|
1762
|
-
|
1763
|
-
reporter_.reset();
|
1764
|
-
// Record the new config.
|
1765
|
-
send_all_clusters_ = send_all_clusters;
|
1766
|
-
cluster_names_ = std::move(new_cluster_names);
|
1767
|
-
load_reporting_interval_ = new_load_reporting_interval;
|
1768
|
-
// Try starting sending load report.
|
1769
|
-
MaybeStartReportingLocked();
|
1770
|
-
}();
|
1771
|
-
grpc_slice_unref_internal(response_slice);
|
1772
|
-
if (xds_client()->shutting_down_) return true;
|
1773
|
-
// Keep listening for LRS config updates.
|
1774
|
-
grpc_op op;
|
1775
|
-
memset(&op, 0, sizeof(op));
|
1776
|
-
op.op = GRPC_OP_RECV_MESSAGE;
|
1777
|
-
op.data.recv_message.recv_message = &recv_message_payload_;
|
1778
|
-
op.flags = 0;
|
1779
|
-
op.reserved = nullptr;
|
1780
|
-
GPR_ASSERT(call_ != nullptr);
|
1781
|
-
// Reuse the "OnResponseReceivedLocked" ref taken in ctor.
|
1782
|
-
const grpc_call_error call_error =
|
1783
|
-
grpc_call_start_batch_and_execute(call_, &op, 1, &on_response_received_);
|
1784
|
-
GPR_ASSERT(GRPC_CALL_OK == call_error);
|
1785
|
-
return false;
|
1786
|
-
}
|
1787
|
-
|
1788
|
-
void XdsClient::ChannelState::LrsCallState::OnStatusReceived(
|
1789
|
-
void* arg, grpc_error_handle error) {
|
1790
|
-
LrsCallState* lrs_calld = static_cast<LrsCallState*>(arg);
|
1791
|
-
{
|
1792
|
-
MutexLock lock(&lrs_calld->xds_client()->mu_);
|
1793
|
-
lrs_calld->OnStatusReceivedLocked(GRPC_ERROR_REF(error));
|
1338
|
+
return;
|
1794
1339
|
}
|
1795
|
-
|
1340
|
+
// Stop current load reporting (if any) to adopt the new config.
|
1341
|
+
reporter_.reset();
|
1342
|
+
// Record the new config.
|
1343
|
+
send_all_clusters_ = send_all_clusters;
|
1344
|
+
cluster_names_ = std::move(new_cluster_names);
|
1345
|
+
load_reporting_interval_ = new_load_reporting_interval;
|
1346
|
+
// Try starting sending load report.
|
1347
|
+
MaybeStartReportingLocked();
|
1796
1348
|
}
|
1797
1349
|
|
1798
|
-
void XdsClient::ChannelState::LrsCallState::
|
1799
|
-
|
1800
|
-
|
1350
|
+
void XdsClient::ChannelState::LrsCallState::OnStatusReceived(
|
1351
|
+
absl::Status status) {
|
1352
|
+
MutexLock lock(&xds_client()->mu_);
|
1801
1353
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1802
|
-
char* status_details = grpc_slice_to_c_string(status_details_);
|
1803
1354
|
gpr_log(GPR_INFO,
|
1804
1355
|
"[xds_client %p] xds server %s: LRS call status received "
|
1805
|
-
"(chand=%p, calld=%p, call=%p): "
|
1806
|
-
"status=%d, details='%s', error='%s'",
|
1356
|
+
"(chand=%p, calld=%p, call=%p): %s",
|
1807
1357
|
xds_client(), chand()->server_.server_uri.c_str(), chand(), this,
|
1808
|
-
call_,
|
1809
|
-
grpc_error_std_string(error).c_str());
|
1810
|
-
gpr_free(status_details);
|
1358
|
+
call_.get(), status.ToString().c_str());
|
1811
1359
|
}
|
1812
1360
|
// Ignore status from a stale call.
|
1813
1361
|
if (IsCurrentCallOnChannel()) {
|
1814
1362
|
// Try to restart the call.
|
1815
1363
|
parent_->OnCallFinishedLocked();
|
1816
1364
|
}
|
1817
|
-
GRPC_ERROR_UNREF(error);
|
1818
1365
|
}
|
1819
1366
|
|
1820
1367
|
bool XdsClient::ChannelState::LrsCallState::IsCurrentCallOnChannel() const {
|
1821
|
-
// If the retryable LRS call is null (which only happens when the xds
|
1822
|
-
// is shutting down), all the LRS calls are stale.
|
1368
|
+
// If the retryable LRS call is null (which only happens when the xds
|
1369
|
+
// channel is shutting down), all the LRS calls are stale.
|
1823
1370
|
if (chand()->lrs_calld_ == nullptr) return false;
|
1824
1371
|
return this == chand()->lrs_calld_->calld();
|
1825
1372
|
}
|
@@ -1828,81 +1375,51 @@ bool XdsClient::ChannelState::LrsCallState::IsCurrentCallOnChannel() const {
|
|
1828
1375
|
// XdsClient
|
1829
1376
|
//
|
1830
1377
|
|
1831
|
-
namespace {
|
1832
|
-
|
1833
|
-
Duration GetRequestTimeout(const grpc_channel_args* args) {
|
1834
|
-
return Duration::Milliseconds(grpc_channel_args_find_integer(
|
1835
|
-
args, GRPC_ARG_XDS_RESOURCE_DOES_NOT_EXIST_TIMEOUT_MS,
|
1836
|
-
{15000, 0, INT_MAX}));
|
1837
|
-
}
|
1838
|
-
|
1839
|
-
grpc_channel_args* ModifyChannelArgs(const grpc_channel_args* args) {
|
1840
|
-
absl::InlinedVector<grpc_arg, 1> args_to_add = {
|
1841
|
-
grpc_channel_arg_integer_create(
|
1842
|
-
const_cast<char*>(GRPC_ARG_KEEPALIVE_TIME_MS),
|
1843
|
-
5 * 60 * GPR_MS_PER_SEC),
|
1844
|
-
};
|
1845
|
-
return grpc_channel_args_copy_and_add(args, args_to_add.data(),
|
1846
|
-
args_to_add.size());
|
1847
|
-
}
|
1848
|
-
|
1849
|
-
} // namespace
|
1850
|
-
|
1851
1378
|
XdsClient::XdsClient(std::unique_ptr<XdsBootstrap> bootstrap,
|
1852
|
-
|
1379
|
+
OrphanablePtr<XdsTransportFactory> transport_factory,
|
1380
|
+
Duration resource_request_timeout)
|
1853
1381
|
: DualRefCounted<XdsClient>(
|
1854
1382
|
GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_refcount_trace) ? "XdsClient"
|
1855
1383
|
: nullptr),
|
1856
1384
|
bootstrap_(std::move(bootstrap)),
|
1857
|
-
|
1858
|
-
request_timeout_(
|
1385
|
+
transport_factory_(std::move(transport_factory)),
|
1386
|
+
request_timeout_(resource_request_timeout),
|
1859
1387
|
xds_federation_enabled_(XdsFederationEnabled()),
|
1860
|
-
|
1861
|
-
certificate_provider_store_(MakeOrphanable<CertificateProviderStore>(
|
1862
|
-
bootstrap_->certificate_providers())),
|
1863
|
-
api_(this, &grpc_xds_client_trace, bootstrap_->node(),
|
1864
|
-
&bootstrap_->certificate_providers(), &symtab_) {
|
1388
|
+
api_(this, &grpc_xds_client_trace, bootstrap_->node(), &symtab_) {
|
1865
1389
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1866
1390
|
gpr_log(GPR_INFO, "[xds_client %p] creating xds client", this);
|
1867
1391
|
}
|
1868
|
-
// Calling grpc_init to ensure gRPC does not shut down until the XdsClient is
|
1869
|
-
// destroyed.
|
1870
|
-
grpc_init();
|
1871
1392
|
}
|
1872
1393
|
|
1873
1394
|
XdsClient::~XdsClient() {
|
1874
1395
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1875
1396
|
gpr_log(GPR_INFO, "[xds_client %p] destroying xds client", this);
|
1876
1397
|
}
|
1877
|
-
grpc_channel_args_destroy(args_);
|
1878
|
-
grpc_pollset_set_destroy(interested_parties_);
|
1879
|
-
// Calling grpc_shutdown to ensure gRPC does not shut down until the XdsClient
|
1880
|
-
// is destroyed.
|
1881
|
-
grpc_shutdown();
|
1882
1398
|
}
|
1883
1399
|
|
1884
1400
|
void XdsClient::Orphan() {
|
1885
1401
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1886
1402
|
gpr_log(GPR_INFO, "[xds_client %p] shutting down xds client", this);
|
1887
1403
|
}
|
1888
|
-
|
1889
|
-
|
1890
|
-
|
1891
|
-
|
1892
|
-
|
1893
|
-
|
1894
|
-
|
1895
|
-
|
1896
|
-
|
1897
|
-
|
1404
|
+
MutexLock lock(&mu_);
|
1405
|
+
shutting_down_ = true;
|
1406
|
+
// Clear cache and any remaining watchers that may not have been cancelled.
|
1407
|
+
authority_state_map_.clear();
|
1408
|
+
invalid_watchers_.clear();
|
1409
|
+
// We may still be sending lingering queued load report data, so don't
|
1410
|
+
// just clear the load reporting map, but we do want to clear the refs
|
1411
|
+
// we're holding to the ChannelState objects, to make sure that
|
1412
|
+
// everything shuts down properly.
|
1413
|
+
for (auto& p : xds_load_report_server_map_) {
|
1414
|
+
p.second.channel_state.reset(DEBUG_LOCATION, "XdsClient::Orphan()");
|
1898
1415
|
}
|
1899
1416
|
}
|
1900
1417
|
|
1901
1418
|
RefCountedPtr<XdsClient::ChannelState> XdsClient::GetOrCreateChannelStateLocked(
|
1902
|
-
const XdsBootstrap::XdsServer& server) {
|
1419
|
+
const XdsBootstrap::XdsServer& server, const char* reason) {
|
1903
1420
|
auto it = xds_server_channel_map_.find(server);
|
1904
1421
|
if (it != xds_server_channel_map_.end()) {
|
1905
|
-
return it->second->Ref(DEBUG_LOCATION,
|
1422
|
+
return it->second->Ref(DEBUG_LOCATION, reason);
|
1906
1423
|
}
|
1907
1424
|
// Channel not found, so create a new one.
|
1908
1425
|
auto channel_state = MakeRefCounted<ChannelState>(
|
@@ -1980,7 +1497,7 @@ void XdsClient::WatchResource(const XdsResourceType* type,
|
|
1980
1497
|
// needed.
|
1981
1498
|
if (authority_state.channel_state == nullptr) {
|
1982
1499
|
authority_state.channel_state =
|
1983
|
-
GetOrCreateChannelStateLocked(*xds_server);
|
1500
|
+
GetOrCreateChannelStateLocked(*xds_server, "start watch");
|
1984
1501
|
}
|
1985
1502
|
authority_state.channel_state->SubscribeLocked(type, *resource_name);
|
1986
1503
|
}
|
@@ -2056,7 +1573,8 @@ const XdsResourceType* XdsClient::GetResourceTypeLocked(
|
|
2056
1573
|
absl::StatusOr<XdsClient::XdsResourceName> XdsClient::ParseXdsResourceName(
|
2057
1574
|
absl::string_view name, const XdsResourceType* type) {
|
2058
1575
|
// Old-style names use the empty string for authority.
|
2059
|
-
// authority is prefixed with "old:" to indicate that it's an old-style
|
1576
|
+
// authority is prefixed with "old:" to indicate that it's an old-style
|
1577
|
+
// name.
|
2060
1578
|
if (!xds_federation_enabled_ || !absl::StartsWith(name, "xdstp:")) {
|
2061
1579
|
return XdsResourceName{"old:", {std::string(name), {}}};
|
2062
1580
|
}
|
@@ -2101,37 +1619,42 @@ RefCountedPtr<XdsClusterDropStats> XdsClient::AddClusterDropStats(
|
|
2101
1619
|
if (!bootstrap_->XdsServerExists(xds_server)) return nullptr;
|
2102
1620
|
auto key =
|
2103
1621
|
std::make_pair(std::string(cluster_name), std::string(eds_service_name));
|
2104
|
-
MutexLock lock(&mu_);
|
2105
|
-
// We jump through some hoops here to make sure that the const
|
2106
|
-
// XdsBootstrap::XdsServer& and absl::string_views
|
2107
|
-
// stored in the XdsClusterDropStats object point to the
|
2108
|
-
// XdsBootstrap::XdsServer and strings
|
2109
|
-
// in the load_report_map_ key, so that they have the same lifetime.
|
2110
|
-
auto server_it =
|
2111
|
-
xds_load_report_server_map_.emplace(xds_server, LoadReportServer()).first;
|
2112
|
-
if (server_it->second.channel_state == nullptr) {
|
2113
|
-
server_it->second.channel_state = GetOrCreateChannelStateLocked(xds_server);
|
2114
|
-
}
|
2115
|
-
auto load_report_it = server_it->second.load_report_map
|
2116
|
-
.emplace(std::move(key), LoadReportState())
|
2117
|
-
.first;
|
2118
|
-
LoadReportState& load_report_state = load_report_it->second;
|
2119
1622
|
RefCountedPtr<XdsClusterDropStats> cluster_drop_stats;
|
2120
|
-
|
2121
|
-
|
2122
|
-
|
2123
|
-
|
1623
|
+
{
|
1624
|
+
MutexLock lock(&mu_);
|
1625
|
+
// We jump through some hoops here to make sure that the const
|
1626
|
+
// XdsBootstrap::XdsServer& and absl::string_views
|
1627
|
+
// stored in the XdsClusterDropStats object point to the
|
1628
|
+
// XdsBootstrap::XdsServer and strings
|
1629
|
+
// in the load_report_map_ key, so that they have the same lifetime.
|
1630
|
+
auto server_it =
|
1631
|
+
xds_load_report_server_map_.emplace(xds_server, LoadReportServer())
|
1632
|
+
.first;
|
1633
|
+
if (server_it->second.channel_state == nullptr) {
|
1634
|
+
server_it->second.channel_state = GetOrCreateChannelStateLocked(
|
1635
|
+
xds_server, "load report map (drop stats)");
|
1636
|
+
}
|
1637
|
+
auto load_report_it = server_it->second.load_report_map
|
1638
|
+
.emplace(std::move(key), LoadReportState())
|
1639
|
+
.first;
|
1640
|
+
LoadReportState& load_report_state = load_report_it->second;
|
2124
1641
|
if (load_report_state.drop_stats != nullptr) {
|
2125
|
-
load_report_state.
|
2126
|
-
load_report_state.drop_stats->GetSnapshotAndReset();
|
1642
|
+
cluster_drop_stats = load_report_state.drop_stats->RefIfNonZero();
|
2127
1643
|
}
|
2128
|
-
cluster_drop_stats
|
2129
|
-
|
2130
|
-
|
2131
|
-
|
2132
|
-
|
1644
|
+
if (cluster_drop_stats == nullptr) {
|
1645
|
+
if (load_report_state.drop_stats != nullptr) {
|
1646
|
+
load_report_state.deleted_drop_stats +=
|
1647
|
+
load_report_state.drop_stats->GetSnapshotAndReset();
|
1648
|
+
}
|
1649
|
+
cluster_drop_stats = MakeRefCounted<XdsClusterDropStats>(
|
1650
|
+
Ref(DEBUG_LOCATION, "DropStats"), server_it->first,
|
1651
|
+
load_report_it->first.first /*cluster_name*/,
|
1652
|
+
load_report_it->first.second /*eds_service_name*/);
|
1653
|
+
load_report_state.drop_stats = cluster_drop_stats.get();
|
1654
|
+
}
|
1655
|
+
server_it->second.channel_state->MaybeStartLrsCall();
|
2133
1656
|
}
|
2134
|
-
|
1657
|
+
work_serializer_.DrainQueue();
|
2135
1658
|
return cluster_drop_stats;
|
2136
1659
|
}
|
2137
1660
|
|
@@ -2162,39 +1685,45 @@ RefCountedPtr<XdsClusterLocalityStats> XdsClient::AddClusterLocalityStats(
|
|
2162
1685
|
if (!bootstrap_->XdsServerExists(xds_server)) return nullptr;
|
2163
1686
|
auto key =
|
2164
1687
|
std::make_pair(std::string(cluster_name), std::string(eds_service_name));
|
2165
|
-
MutexLock lock(&mu_);
|
2166
|
-
// We jump through some hoops here to make sure that the const
|
2167
|
-
// XdsBootstrap::XdsServer& and absl::string_views
|
2168
|
-
// stored in the XdsClusterDropStats object point to the
|
2169
|
-
// XdsBootstrap::XdsServer and strings
|
2170
|
-
// in the load_report_map_ key, so that they have the same lifetime.
|
2171
|
-
auto server_it =
|
2172
|
-
xds_load_report_server_map_.emplace(xds_server, LoadReportServer()).first;
|
2173
|
-
if (server_it->second.channel_state == nullptr) {
|
2174
|
-
server_it->second.channel_state = GetOrCreateChannelStateLocked(xds_server);
|
2175
|
-
}
|
2176
|
-
auto load_report_it = server_it->second.load_report_map
|
2177
|
-
.emplace(std::move(key), LoadReportState())
|
2178
|
-
.first;
|
2179
|
-
LoadReportState& load_report_state = load_report_it->second;
|
2180
|
-
LoadReportState::LocalityState& locality_state =
|
2181
|
-
load_report_state.locality_stats[locality];
|
2182
1688
|
RefCountedPtr<XdsClusterLocalityStats> cluster_locality_stats;
|
2183
|
-
|
2184
|
-
|
2185
|
-
|
2186
|
-
|
1689
|
+
{
|
1690
|
+
MutexLock lock(&mu_);
|
1691
|
+
// We jump through some hoops here to make sure that the const
|
1692
|
+
// XdsBootstrap::XdsServer& and absl::string_views
|
1693
|
+
// stored in the XdsClusterDropStats object point to the
|
1694
|
+
// XdsBootstrap::XdsServer and strings
|
1695
|
+
// in the load_report_map_ key, so that they have the same lifetime.
|
1696
|
+
auto server_it =
|
1697
|
+
xds_load_report_server_map_.emplace(xds_server, LoadReportServer())
|
1698
|
+
.first;
|
1699
|
+
if (server_it->second.channel_state == nullptr) {
|
1700
|
+
server_it->second.channel_state = GetOrCreateChannelStateLocked(
|
1701
|
+
xds_server, "load report map (locality stats)");
|
1702
|
+
}
|
1703
|
+
auto load_report_it = server_it->second.load_report_map
|
1704
|
+
.emplace(std::move(key), LoadReportState())
|
1705
|
+
.first;
|
1706
|
+
LoadReportState& load_report_state = load_report_it->second;
|
1707
|
+
LoadReportState::LocalityState& locality_state =
|
1708
|
+
load_report_state.locality_stats[locality];
|
2187
1709
|
if (locality_state.locality_stats != nullptr) {
|
2188
|
-
locality_state.
|
2189
|
-
|
1710
|
+
cluster_locality_stats = locality_state.locality_stats->RefIfNonZero();
|
1711
|
+
}
|
1712
|
+
if (cluster_locality_stats == nullptr) {
|
1713
|
+
if (locality_state.locality_stats != nullptr) {
|
1714
|
+
locality_state.deleted_locality_stats +=
|
1715
|
+
locality_state.locality_stats->GetSnapshotAndReset();
|
1716
|
+
}
|
1717
|
+
cluster_locality_stats = MakeRefCounted<XdsClusterLocalityStats>(
|
1718
|
+
Ref(DEBUG_LOCATION, "LocalityStats"), server_it->first,
|
1719
|
+
load_report_it->first.first /*cluster_name*/,
|
1720
|
+
load_report_it->first.second /*eds_service_name*/,
|
1721
|
+
std::move(locality));
|
1722
|
+
locality_state.locality_stats = cluster_locality_stats.get();
|
2190
1723
|
}
|
2191
|
-
|
2192
|
-
Ref(DEBUG_LOCATION, "LocalityStats"), server_it->first,
|
2193
|
-
load_report_it->first.first /*cluster_name*/,
|
2194
|
-
load_report_it->first.second /*eds_service_name*/, std::move(locality));
|
2195
|
-
locality_state.locality_stats = cluster_locality_stats.get();
|
1724
|
+
server_it->second.channel_state->MaybeStartLrsCall();
|
2196
1725
|
}
|
2197
|
-
|
1726
|
+
work_serializer_.DrainQueue();
|
2198
1727
|
return cluster_locality_stats;
|
2199
1728
|
}
|
2200
1729
|
|
@@ -2225,7 +1754,7 @@ void XdsClient::RemoveClusterLocalityStats(
|
|
2225
1754
|
void XdsClient::ResetBackoff() {
|
2226
1755
|
MutexLock lock(&mu_);
|
2227
1756
|
for (auto& p : xds_server_channel_map_) {
|
2228
|
-
|
1757
|
+
p.second->ResetBackoff();
|
2229
1758
|
}
|
2230
1759
|
}
|
2231
1760
|
|
@@ -2394,192 +1923,4 @@ std::string XdsClient::DumpClientConfigBinary() {
|
|
2394
1923
|
return api_.AssembleClientConfig(resource_type_metadata_map);
|
2395
1924
|
}
|
2396
1925
|
|
2397
|
-
//
|
2398
|
-
// accessors for global state
|
2399
|
-
//
|
2400
|
-
|
2401
|
-
void XdsClientGlobalInit() {
|
2402
|
-
g_mu = new Mutex;
|
2403
|
-
XdsHttpFilterRegistry::Init();
|
2404
|
-
XdsClusterSpecifierPluginRegistry::Init();
|
2405
|
-
}
|
2406
|
-
|
2407
|
-
// TODO(roth): Find a better way to clear the fallback config that does
|
2408
|
-
// not require using ABSL_NO_THREAD_SAFETY_ANALYSIS.
|
2409
|
-
void XdsClientGlobalShutdown() ABSL_NO_THREAD_SAFETY_ANALYSIS {
|
2410
|
-
gpr_free(g_fallback_bootstrap_config);
|
2411
|
-
g_fallback_bootstrap_config = nullptr;
|
2412
|
-
delete g_mu;
|
2413
|
-
g_mu = nullptr;
|
2414
|
-
XdsHttpFilterRegistry::Shutdown();
|
2415
|
-
XdsClusterSpecifierPluginRegistry::Shutdown();
|
2416
|
-
}
|
2417
|
-
|
2418
|
-
namespace {
|
2419
|
-
|
2420
|
-
std::string GetBootstrapContents(const char* fallback_config,
|
2421
|
-
grpc_error_handle* error) {
|
2422
|
-
// First, try GRPC_XDS_BOOTSTRAP env var.
|
2423
|
-
UniquePtr<char> path(gpr_getenv("GRPC_XDS_BOOTSTRAP"));
|
2424
|
-
if (path != nullptr) {
|
2425
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
2426
|
-
gpr_log(GPR_INFO,
|
2427
|
-
"Got bootstrap file location from GRPC_XDS_BOOTSTRAP "
|
2428
|
-
"environment variable: %s",
|
2429
|
-
path.get());
|
2430
|
-
}
|
2431
|
-
grpc_slice contents;
|
2432
|
-
*error =
|
2433
|
-
grpc_load_file(path.get(), /*add_null_terminator=*/true, &contents);
|
2434
|
-
if (!GRPC_ERROR_IS_NONE(*error)) return "";
|
2435
|
-
std::string contents_str(StringViewFromSlice(contents));
|
2436
|
-
grpc_slice_unref_internal(contents);
|
2437
|
-
return contents_str;
|
2438
|
-
}
|
2439
|
-
// Next, try GRPC_XDS_BOOTSTRAP_CONFIG env var.
|
2440
|
-
UniquePtr<char> env_config(gpr_getenv("GRPC_XDS_BOOTSTRAP_CONFIG"));
|
2441
|
-
if (env_config != nullptr) {
|
2442
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
2443
|
-
gpr_log(GPR_INFO,
|
2444
|
-
"Got bootstrap contents from GRPC_XDS_BOOTSTRAP_CONFIG "
|
2445
|
-
"environment variable");
|
2446
|
-
}
|
2447
|
-
return env_config.get();
|
2448
|
-
}
|
2449
|
-
// Finally, try fallback config.
|
2450
|
-
if (fallback_config != nullptr) {
|
2451
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
2452
|
-
gpr_log(GPR_INFO, "Got bootstrap contents from fallback config");
|
2453
|
-
}
|
2454
|
-
return fallback_config;
|
2455
|
-
}
|
2456
|
-
// No bootstrap config found.
|
2457
|
-
*error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
2458
|
-
"Environment variables GRPC_XDS_BOOTSTRAP or GRPC_XDS_BOOTSTRAP_CONFIG "
|
2459
|
-
"not defined");
|
2460
|
-
return "";
|
2461
|
-
}
|
2462
|
-
|
2463
|
-
} // namespace
|
2464
|
-
|
2465
|
-
RefCountedPtr<XdsClient> XdsClient::GetOrCreate(const grpc_channel_args* args,
|
2466
|
-
grpc_error_handle* error) {
|
2467
|
-
RefCountedPtr<XdsClient> xds_client;
|
2468
|
-
// If getting bootstrap from channel args, create a local XdsClient
|
2469
|
-
// instance for the channel or server instead of using the global instance.
|
2470
|
-
const char* bootstrap_config = grpc_channel_args_find_string(
|
2471
|
-
args, GRPC_ARG_TEST_ONLY_DO_NOT_USE_IN_PROD_XDS_BOOTSTRAP_CONFIG);
|
2472
|
-
if (bootstrap_config != nullptr) {
|
2473
|
-
std::unique_ptr<XdsBootstrap> bootstrap =
|
2474
|
-
XdsBootstrap::Create(bootstrap_config, error);
|
2475
|
-
if (GRPC_ERROR_IS_NONE(*error)) {
|
2476
|
-
grpc_channel_args* xds_channel_args =
|
2477
|
-
grpc_channel_args_find_pointer<grpc_channel_args>(
|
2478
|
-
args,
|
2479
|
-
GRPC_ARG_TEST_ONLY_DO_NOT_USE_IN_PROD_XDS_CLIENT_CHANNEL_ARGS);
|
2480
|
-
return MakeRefCounted<XdsClient>(std::move(bootstrap), xds_channel_args);
|
2481
|
-
}
|
2482
|
-
return nullptr;
|
2483
|
-
}
|
2484
|
-
// Otherwise, use the global instance.
|
2485
|
-
{
|
2486
|
-
MutexLock lock(g_mu);
|
2487
|
-
if (g_xds_client != nullptr) {
|
2488
|
-
auto xds_client = g_xds_client->RefIfNonZero();
|
2489
|
-
if (xds_client != nullptr) return xds_client;
|
2490
|
-
}
|
2491
|
-
// Find bootstrap contents.
|
2492
|
-
std::string bootstrap_contents =
|
2493
|
-
GetBootstrapContents(g_fallback_bootstrap_config, error);
|
2494
|
-
if (!GRPC_ERROR_IS_NONE(*error)) return nullptr;
|
2495
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
2496
|
-
gpr_log(GPR_INFO, "xDS bootstrap contents: %s",
|
2497
|
-
bootstrap_contents.c_str());
|
2498
|
-
}
|
2499
|
-
// Parse bootstrap.
|
2500
|
-
std::unique_ptr<XdsBootstrap> bootstrap =
|
2501
|
-
XdsBootstrap::Create(bootstrap_contents, error);
|
2502
|
-
if (!GRPC_ERROR_IS_NONE(*error)) return nullptr;
|
2503
|
-
// Instantiate XdsClient.
|
2504
|
-
xds_client =
|
2505
|
-
MakeRefCounted<XdsClient>(std::move(bootstrap), g_channel_args);
|
2506
|
-
g_xds_client = xds_client.get();
|
2507
|
-
}
|
2508
|
-
return xds_client;
|
2509
|
-
}
|
2510
|
-
|
2511
|
-
namespace internal {
|
2512
|
-
|
2513
|
-
void SetXdsChannelArgsForTest(grpc_channel_args* args) {
|
2514
|
-
MutexLock lock(g_mu);
|
2515
|
-
g_channel_args = args;
|
2516
|
-
}
|
2517
|
-
|
2518
|
-
void UnsetGlobalXdsClientForTest() {
|
2519
|
-
MutexLock lock(g_mu);
|
2520
|
-
g_xds_client = nullptr;
|
2521
|
-
}
|
2522
|
-
|
2523
|
-
void SetXdsFallbackBootstrapConfig(const char* config) {
|
2524
|
-
MutexLock lock(g_mu);
|
2525
|
-
gpr_free(g_fallback_bootstrap_config);
|
2526
|
-
g_fallback_bootstrap_config = gpr_strdup(config);
|
2527
|
-
}
|
2528
|
-
|
2529
|
-
} // namespace internal
|
2530
|
-
|
2531
|
-
//
|
2532
|
-
// embedding XdsClient in channel args
|
2533
|
-
//
|
2534
|
-
|
2535
|
-
#define GRPC_ARG_XDS_CLIENT "grpc.internal.xds_client"
|
2536
|
-
|
2537
|
-
namespace {
|
2538
|
-
|
2539
|
-
void* XdsClientArgCopy(void* p) {
|
2540
|
-
XdsClient* xds_client = static_cast<XdsClient*>(p);
|
2541
|
-
xds_client->Ref(DEBUG_LOCATION, "channel arg").release();
|
2542
|
-
return p;
|
2543
|
-
}
|
2544
|
-
|
2545
|
-
void XdsClientArgDestroy(void* p) {
|
2546
|
-
XdsClient* xds_client = static_cast<XdsClient*>(p);
|
2547
|
-
xds_client->Unref(DEBUG_LOCATION, "channel arg");
|
2548
|
-
}
|
2549
|
-
|
2550
|
-
int XdsClientArgCmp(void* p, void* q) { return QsortCompare(p, q); }
|
2551
|
-
|
2552
|
-
const grpc_arg_pointer_vtable kXdsClientArgVtable = {
|
2553
|
-
XdsClientArgCopy, XdsClientArgDestroy, XdsClientArgCmp};
|
2554
|
-
|
2555
|
-
} // namespace
|
2556
|
-
|
2557
|
-
grpc_arg XdsClient::MakeChannelArg() const {
|
2558
|
-
return grpc_channel_arg_pointer_create(const_cast<char*>(GRPC_ARG_XDS_CLIENT),
|
2559
|
-
const_cast<XdsClient*>(this),
|
2560
|
-
&kXdsClientArgVtable);
|
2561
|
-
}
|
2562
|
-
|
2563
|
-
RefCountedPtr<XdsClient> XdsClient::GetFromChannelArgs(
|
2564
|
-
const grpc_channel_args& args) {
|
2565
|
-
XdsClient* xds_client =
|
2566
|
-
grpc_channel_args_find_pointer<XdsClient>(&args, GRPC_ARG_XDS_CLIENT);
|
2567
|
-
if (xds_client == nullptr) return nullptr;
|
2568
|
-
return xds_client->Ref(DEBUG_LOCATION, "GetFromChannelArgs");
|
2569
|
-
}
|
2570
|
-
|
2571
1926
|
} // namespace grpc_core
|
2572
|
-
|
2573
|
-
// The returned bytes may contain NULL(0), so we can't use c-string.
|
2574
|
-
grpc_slice grpc_dump_xds_configs(void) {
|
2575
|
-
grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
|
2576
|
-
grpc_core::ExecCtx exec_ctx;
|
2577
|
-
grpc_error_handle error = GRPC_ERROR_NONE;
|
2578
|
-
auto xds_client = grpc_core::XdsClient::GetOrCreate(nullptr, &error);
|
2579
|
-
if (!GRPC_ERROR_IS_NONE(error)) {
|
2580
|
-
// If we isn't using xDS, just return an empty string.
|
2581
|
-
GRPC_ERROR_UNREF(error);
|
2582
|
-
return grpc_empty_slice();
|
2583
|
-
}
|
2584
|
-
return grpc_slice_from_cpp_string(xds_client->DumpClientConfigBinary());
|
2585
|
-
}
|