grpc 1.47.0-x86_64-linux → 1.49.0.pre1-x86_64-linux
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 +183 -62
- data/include/grpc/compression.h +1 -1
- data/include/grpc/event_engine/event_engine.h +37 -25
- data/include/grpc/event_engine/slice_buffer.h +8 -2
- data/include/grpc/grpc.h +3 -3
- data/include/grpc/impl/codegen/compression_types.h +2 -1
- data/include/grpc/impl/codegen/connectivity_state.h +2 -1
- data/include/grpc/impl/codegen/gpr_types.h +2 -1
- data/include/grpc/impl/codegen/grpc_types.h +5 -9
- data/include/grpc/impl/codegen/port_platform.h +2 -7
- data/src/core/ext/filters/census/grpc_context.cc +3 -0
- data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +20 -8
- data/src/core/ext/filters/channel_idle/channel_idle_filter.h +18 -2
- data/src/core/ext/filters/channel_idle/idle_filter_state.h +2 -0
- data/src/core/ext/filters/client_channel/backup_poller.cc +3 -1
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +2 -2
- data/src/core/ext/filters/client_channel/client_channel.cc +164 -261
- data/src/core/ext/filters/client_channel/client_channel.h +34 -12
- 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 +13 -5
- data/src/core/ext/filters/client_channel/connector.h +5 -6
- data/src/core/ext/filters/client_channel/dynamic_filters.cc +6 -4
- data/src/core/ext/filters/client_channel/dynamic_filters.h +1 -1
- 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/address_filtering.cc +1 -1
- 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/client_load_reporting_filter.cc +2 -2
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +1 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +170 -164
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +13 -4
- 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.cc +0 -1
- 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 +200 -96
- 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 +121 -131
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +153 -116
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +220 -181
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +10 -6
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +110 -119
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +133 -117
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +97 -87
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +114 -131
- 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 +84 -102
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +64 -76
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +172 -103
- data/src/core/ext/filters/client_channel/proxy_mapper.h +13 -14
- data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +18 -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 +7 -9
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +434 -148
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +5 -5
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +179 -103
- 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 +29 -18
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +8 -18
- 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 +16 -18
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +4 -5
- 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 +5 -13
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +181 -175
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +3 -1
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +39 -32
- data/src/core/ext/filters/client_channel/resolver_result_parsing.h +7 -10
- data/src/core/ext/filters/client_channel/retry_filter.cc +35 -43
- data/src/core/ext/filters/client_channel/retry_filter.h +1 -0
- 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 +7 -7
- data/src/core/ext/filters/client_channel/subchannel.cc +101 -138
- data/src/core/ext/filters/client_channel/subchannel.h +14 -30
- 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 +15 -101
- data/src/core/ext/filters/client_channel/subchannel_stream_client.h +5 -9
- data/src/core/ext/filters/deadline/deadline_filter.cc +18 -13
- data/src/core/ext/filters/deadline/deadline_filter.h +8 -2
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +20 -3
- data/src/core/ext/filters/fault_injection/fault_injection_filter.h +9 -4
- data/src/core/ext/filters/fault_injection/service_config_parser.cc +19 -11
- data/src/core/ext/filters/fault_injection/service_config_parser.h +19 -6
- data/src/core/ext/filters/http/client/http_client_filter.cc +17 -7
- data/src/core/ext/filters/http/client/http_client_filter.h +9 -2
- data/src/core/ext/filters/http/client_authority_filter.cc +11 -11
- data/src/core/ext/filters/http/client_authority_filter.h +6 -3
- data/src/core/ext/filters/http/http_filters_plugin.cc +9 -1
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +64 -187
- data/src/core/ext/filters/http/message_compress/message_compress_filter.h +1 -2
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +42 -106
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +1 -0
- data/src/core/ext/filters/http/server/http_server_filter.cc +17 -11
- data/src/core/ext/filters/http/server/http_server_filter.h +7 -2
- data/src/core/ext/filters/message_size/message_size_filter.cc +37 -21
- data/src/core/ext/filters/message_size/message_size_filter.h +13 -3
- data/src/core/ext/filters/rbac/rbac_filter.cc +14 -3
- data/src/core/ext/filters/rbac/rbac_filter.h +8 -0
- data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +25 -10
- data/src/core/ext/filters/rbac/rbac_service_config_parser.h +15 -5
- data/src/core/ext/filters/server_config_selector/server_config_selector.cc +1 -0
- data/src/core/ext/filters/server_config_selector/server_config_selector.h +14 -0
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +23 -5
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.h +1 -0
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +39 -66
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +77 -104
- data/src/core/ext/transport/chttp2/server/chttp2_server.h +4 -6
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +320 -635
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +4 -3
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +207 -262
- data/src/core/ext/transport/chttp2/transport/flow_control.h +177 -289
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +57 -215
- data/src/core/ext/transport/chttp2/transport/frame_data.h +10 -36
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +0 -41
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +7 -12
- 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 +9 -16
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +0 -2
- data/src/core/ext/transport/chttp2/transport/internal.h +11 -112
- data/src/core/ext/transport/chttp2/transport/parsing.cc +51 -38
- data/src/core/ext/transport/chttp2/transport/stream_lists.cc +0 -4
- data/src/core/ext/transport/chttp2/transport/writing.cc +18 -21
- data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -1
- data/src/core/ext/transport/inproc/inproc_transport.cc +124 -154
- data/src/core/ext/transport/inproc/inproc_transport.h +3 -1
- 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.c +52 -0
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h +168 -0
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c +46 -0
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h +98 -0
- 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/certificate_provider_factory.h +6 -1
- data/src/core/ext/xds/certificate_provider_registry.cc +8 -8
- data/src/core/ext/xds/certificate_provider_registry.h +3 -1
- data/src/core/ext/xds/certificate_provider_store.cc +2 -0
- data/src/core/ext/xds/certificate_provider_store.h +9 -0
- data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +9 -0
- data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +8 -0
- data/src/core/ext/xds/upb_utils.h +0 -22
- data/src/core/ext/xds/xds_api.cc +68 -103
- data/src/core/ext/xds/xds_api.h +30 -32
- data/src/core/ext/xds/xds_bootstrap.cc +69 -69
- data/src/core/ext/xds/xds_bootstrap.h +37 -19
- data/src/core/ext/xds/xds_certificate_provider.cc +12 -3
- data/src/core/ext/xds/xds_certificate_provider.h +25 -1
- data/src/core/ext/xds/xds_channel_stack_modifier.cc +15 -4
- data/src/core/ext/xds/xds_channel_stack_modifier.h +13 -1
- data/src/core/ext/xds/xds_client.cc +583 -1193
- data/src/core/ext/xds/xds_client.h +28 -42
- 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_client_stats.cc +3 -4
- data/src/core/ext/xds/xds_client_stats.h +4 -3
- data/src/core/ext/xds/xds_cluster.cc +107 -107
- data/src/core/ext/xds/xds_cluster.h +14 -5
- data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +23 -18
- data/src/core/ext/xds/xds_cluster_specifier_plugin.h +2 -8
- data/src/core/ext/xds/xds_common_types.cc +161 -123
- data/src/core/ext/xds/xds_common_types.h +16 -9
- data/src/core/ext/xds/xds_endpoint.cc +95 -85
- data/src/core/ext/xds/xds_endpoint.h +16 -8
- data/src/core/ext/xds/xds_http_fault_filter.cc +11 -16
- data/src/core/ext/xds/xds_http_fault_filter.h +5 -3
- data/src/core/ext/xds/xds_http_filters.cc +7 -0
- data/src/core/ext/xds/xds_http_filters.h +5 -5
- data/src/core/ext/xds/xds_http_rbac_filter.cc +52 -55
- data/src/core/ext/xds/xds_http_rbac_filter.h +8 -1
- data/src/core/ext/xds/xds_lb_policy_registry.cc +288 -0
- data/src/core/ext/xds/xds_lb_policy_registry.h +72 -0
- data/src/core/ext/xds/xds_listener.cc +355 -307
- data/src/core/ext/xds/xds_listener.h +13 -4
- data/src/core/ext/xds/xds_resource_type.h +16 -5
- data/src/core/ext/xds/xds_resource_type_impl.h +7 -3
- data/src/core/ext/xds/xds_route_config.cc +215 -184
- data/src/core/ext/xds/xds_route_config.h +39 -16
- data/src/core/ext/xds/xds_routing.cc +19 -6
- data/src/core/ext/xds/xds_routing.h +12 -9
- data/src/core/ext/xds/xds_server_config_fetcher.cc +124 -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 +24 -25
- data/src/core/lib/address_utils/parse_address.h +11 -7
- data/src/core/lib/address_utils/sockaddr_utils.cc +8 -7
- data/src/core/lib/address_utils/sockaddr_utils.h +2 -0
- data/src/core/lib/avl/avl.h +47 -25
- data/src/core/lib/backoff/backoff.cc +1 -1
- data/src/core/lib/backoff/backoff.h +1 -1
- data/src/core/lib/channel/call_tracer.h +4 -4
- data/src/core/lib/channel/channel_args.cc +88 -19
- data/src/core/lib/channel/channel_args.h +114 -62
- data/src/core/lib/channel/channel_args_preconditioning.cc +1 -0
- data/src/core/lib/channel/channel_fwd.h +26 -0
- data/src/core/lib/channel/channel_stack.cc +4 -5
- data/src/core/lib/channel/channel_stack.h +1 -11
- data/src/core/lib/channel/channel_stack_builder.cc +3 -3
- data/src/core/lib/channel/channel_stack_builder.h +4 -7
- data/src/core/lib/channel/channel_stack_builder_impl.cc +3 -5
- data/src/core/lib/channel/channel_stack_builder_impl.h +1 -0
- data/src/core/lib/channel/channelz.cc +28 -37
- data/src/core/lib/channel/channelz.h +11 -3
- data/src/core/lib/channel/channelz_registry.cc +4 -5
- data/src/core/lib/channel/connected_channel.cc +1 -0
- data/src/core/lib/channel/connected_channel.h +1 -0
- data/src/core/lib/channel/promise_based_filter.cc +11 -5
- data/src/core/lib/channel/promise_based_filter.h +2 -1
- data/src/core/lib/compression/compression.cc +6 -1
- data/src/core/lib/compression/compression_internal.cc +3 -6
- data/src/core/lib/compression/compression_internal.h +3 -2
- data/src/core/lib/compression/message_compress.cc +3 -1
- data/src/core/lib/compression/message_compress.h +2 -3
- data/src/core/lib/config/core_configuration.h +48 -35
- data/src/core/lib/debug/stats.cc +15 -18
- data/src/core/lib/debug/stats.h +13 -4
- data/src/core/lib/debug/stats_data.cc +2 -1
- data/src/core/lib/debug/stats_data.h +0 -4
- data/src/core/lib/debug/trace.h +13 -12
- data/src/core/lib/event_engine/default_event_engine.cc +71 -0
- data/src/core/lib/event_engine/{event_engine_factory.h → default_event_engine.h} +6 -10
- 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 +98 -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/posix_engine/posix_engine.cc +142 -0
- data/src/core/lib/event_engine/{iomgr_engine.h → posix_engine/posix_engine.h} +35 -32
- data/src/core/lib/event_engine/posix_engine/timer.cc +311 -0
- data/src/core/lib/event_engine/posix_engine/timer.h +193 -0
- data/src/core/lib/event_engine/posix_engine/timer_heap.cc +107 -0
- data/src/core/lib/event_engine/posix_engine/timer_heap.h +56 -0
- data/src/core/lib/event_engine/posix_engine/timer_manager.cc +290 -0
- data/src/core/lib/event_engine/posix_engine/timer_manager.h +120 -0
- data/src/core/lib/event_engine/promise.h +78 -0
- data/src/core/lib/event_engine/socket_notifier.h +55 -0
- data/src/core/lib/event_engine/thread_pool.cc +158 -0
- data/src/core/lib/event_engine/thread_pool.h +81 -0
- 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/time_posix.cc +6 -9
- data/src/core/lib/gpr/time_windows.cc +10 -7
- 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 -68
- 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 +45 -30
- data/src/core/lib/gprpp/table.h +0 -1
- data/src/core/lib/gprpp/time.cc +8 -0
- data/src/core/lib/gprpp/time.h +4 -0
- data/src/core/lib/gprpp/time_averaged_stats.cc +60 -0
- data/src/core/lib/{iomgr → gprpp}/time_averaged_stats.h +29 -22
- data/src/core/lib/{iomgr → gprpp}/work_serializer.cc +34 -18
- data/src/core/lib/{iomgr → gprpp}/work_serializer.h +21 -28
- data/src/core/lib/http/format_request.cc +5 -4
- data/src/core/lib/http/format_request.h +1 -1
- data/src/core/lib/http/httpcli.cc +29 -35
- data/src/core/lib/http/httpcli.h +19 -3
- data/src/core/lib/http/httpcli_security_connector.cc +26 -14
- data/src/core/lib/http/httpcli_ssl_credentials.h +3 -1
- data/src/core/lib/http/parser.cc +6 -7
- data/src/core/lib/http/parser.h +3 -0
- data/src/core/lib/iomgr/call_combiner.cc +2 -28
- data/src/core/lib/iomgr/closure.h +0 -9
- data/src/core/lib/iomgr/combiner.cc +0 -20
- data/src/core/lib/iomgr/endpoint.h +1 -1
- data/src/core/lib/iomgr/endpoint_cfstream.cc +2 -2
- data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -1
- data/src/core/lib/iomgr/error.cc +6 -777
- data/src/core/lib/iomgr/error.h +6 -147
- data/src/core/lib/iomgr/error_cfstream.cc +0 -5
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +57 -18
- data/src/core/lib/iomgr/ev_epoll1_linux.h +1 -1
- data/src/core/lib/iomgr/ev_poll_posix.cc +94 -61
- data/src/core/lib/iomgr/ev_poll_posix.h +2 -2
- data/src/core/lib/iomgr/ev_posix.cc +54 -92
- data/src/core/lib/iomgr/ev_posix.h +5 -3
- 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/fork_posix.cc +1 -1
- data/src/core/lib/iomgr/iomgr.cc +7 -0
- data/src/core/lib/iomgr/iomgr_posix.cc +1 -0
- data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +1 -0
- data/src/core/lib/iomgr/load_file.cc +1 -1
- 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 +39 -9
- data/src/core/lib/iomgr/resolve_address_posix.h +19 -5
- data/src/core/lib/iomgr/resolve_address_windows.cc +41 -11
- 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_client.cc +12 -7
- data/src/core/lib/iomgr/tcp_client.h +24 -13
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +15 -9
- data/src/core/lib/iomgr/tcp_client_posix.cc +143 -25
- data/src/core/lib/iomgr/tcp_client_posix.h +1 -1
- data/src/core/lib/iomgr/tcp_client_windows.cc +14 -10
- data/src/core/lib/iomgr/tcp_posix.cc +207 -33
- data/src/core/lib/iomgr/tcp_server_posix.cc +7 -7
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +12 -12
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +2 -2
- data/src/core/lib/iomgr/tcp_server_windows.cc +7 -7
- data/src/core/lib/iomgr/tcp_windows.cc +5 -5
- data/src/core/lib/iomgr/timer_generic.cc +6 -8
- data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -2
- data/src/core/lib/iomgr/wakeup_fd_pipe.cc +2 -2
- data/src/core/lib/iomgr/wakeup_fd_posix.cc +15 -12
- data/src/core/lib/iomgr/wakeup_fd_posix.h +0 -2
- 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 -31
- 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 +48 -73
- 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 +16 -24
- data/src/core/lib/matchers/matchers.cc +6 -3
- data/src/core/lib/matchers/matchers.h +2 -0
- data/src/core/lib/promise/activity.cc +0 -1
- data/src/core/lib/promise/activity.h +56 -14
- 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/loop.h +1 -0
- data/src/core/lib/promise/map.h +0 -1
- data/src/core/lib/promise/promise.h +1 -0
- data/src/core/lib/promise/seq.h +25 -4
- data/src/core/lib/promise/sleep.cc +43 -42
- data/src/core/lib/promise/sleep.h +31 -28
- data/src/core/lib/promise/try_seq.h +26 -6
- data/src/core/lib/resolver/resolver.cc +0 -42
- data/src/core/lib/resolver/resolver.h +5 -12
- data/src/core/lib/resolver/resolver_factory.h +6 -4
- data/src/core/lib/resolver/resolver_registry.cc +3 -10
- data/src/core/lib/resolver/resolver_registry.h +12 -2
- data/src/core/lib/resolver/server_address.cc +19 -15
- data/src/core/lib/resolver/server_address.h +11 -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 +171 -73
- data/src/core/lib/resource_quota/memory_quota.h +109 -42
- 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/authorization_policy_provider.h +7 -0
- data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +4 -0
- data/src/core/lib/security/authorization/evaluate_args.cc +17 -8
- data/src/core/lib/security/authorization/evaluate_args.h +6 -3
- data/src/core/lib/security/authorization/grpc_authorization_engine.cc +6 -0
- data/src/core/lib/security/authorization/grpc_authorization_engine.h +7 -0
- data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +12 -1
- data/src/core/lib/security/authorization/grpc_server_authz_filter.h +13 -2
- data/src/core/lib/security/authorization/matchers.cc +20 -9
- data/src/core/lib/security/authorization/matchers.h +7 -0
- data/src/core/lib/security/authorization/rbac_policy.cc +4 -0
- data/src/core/lib/security/authorization/rbac_policy.h +7 -0
- data/src/core/lib/security/context/security_context.cc +5 -2
- data/src/core/lib/security/context/security_context.h +14 -2
- data/src/core/lib/security/credentials/alts/alts_credentials.cc +6 -5
- data/src/core/lib/security/credentials/alts/alts_credentials.h +8 -4
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +1 -3
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +1 -4
- data/src/core/lib/security/credentials/call_creds_util.cc +8 -0
- data/src/core/lib/security/credentials/call_creds_util.h +1 -0
- data/src/core/lib/security/credentials/channel_creds_registry.h +6 -1
- data/src/core/lib/security/credentials/channel_creds_registry_init.cc +10 -0
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +5 -9
- data/src/core/lib/security/credentials/composite/composite_credentials.h +17 -5
- data/src/core/lib/security/credentials/credentials.cc +4 -8
- data/src/core/lib/security/credentials/credentials.h +26 -20
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +45 -20
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +10 -0
- data/src/core/lib/security/credentials/external/aws_request_signer.cc +9 -0
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +53 -29
- data/src/core/lib/security/credentials/external/external_account_credentials.h +11 -0
- data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +15 -8
- data/src/core/lib/security/credentials/external/file_external_account_credentials.h +6 -0
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +23 -9
- data/src/core/lib/security/credentials/external/url_external_account_credentials.h +10 -0
- data/src/core/lib/security/credentials/fake/fake_credentials.cc +10 -17
- data/src/core/lib/security/credentials/fake/fake_credentials.h +13 -5
- data/src/core/lib/security/credentials/google_default/credentials_generic.cc +1 -0
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +55 -35
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +10 -3
- data/src/core/lib/security/credentials/iam/iam_credentials.cc +8 -3
- data/src/core/lib/security/credentials/iam/iam_credentials.h +10 -0
- data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +7 -3
- data/src/core/lib/security/credentials/insecure/insecure_credentials.h +7 -3
- data/src/core/lib/security/credentials/jwt/json_token.cc +17 -5
- data/src/core/lib/security/credentials/jwt/json_token.h +2 -2
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +12 -10
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +14 -0
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +37 -14
- data/src/core/lib/security/credentials/jwt/jwt_verifier.h +4 -2
- data/src/core/lib/security/credentials/local/local_credentials.cc +7 -7
- data/src/core/lib/security/credentials/local/local_credentials.h +9 -3
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +41 -29
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +20 -0
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +7 -7
- data/src/core/lib/security/credentials/plugin/plugin_credentials.h +24 -0
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +18 -21
- data/src/core/lib/security/credentials/ssl/ssl_credentials.h +15 -3
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +6 -6
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +9 -3
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +29 -10
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +15 -4
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +9 -2
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +6 -7
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -5
- data/src/core/lib/security/credentials/tls/tls_credentials.cc +19 -26
- data/src/core/lib/security/credentials/tls/tls_credentials.h +7 -4
- data/src/core/lib/security/credentials/tls/tls_utils.cc +2 -0
- data/src/core/lib/security/credentials/tls/tls_utils.h +1 -1
- data/src/core/lib/security/credentials/xds/xds_credentials.cc +21 -31
- data/src/core/lib/security/credentials/xds/xds_credentials.h +16 -2
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +30 -18
- data/src/core/lib/security/security_connector/alts/alts_security_connector.h +6 -3
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +42 -38
- data/src/core/lib/security/security_connector/fake/fake_security_connector.h +3 -3
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +13 -4
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +21 -5
- data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +5 -3
- data/src/core/lib/security/security_connector/{load_system_roots_linux.cc → load_system_roots_supported.cc} +27 -19
- data/src/core/lib/security/security_connector/{load_system_roots_linux.h → load_system_roots_supported.h} +5 -5
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +34 -13
- data/src/core/lib/security/security_connector/local/local_security_connector.h +7 -3
- data/src/core/lib/security/security_connector/security_connector.cc +20 -18
- data/src/core/lib/security/security_connector/security_connector.h +23 -9
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +21 -8
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +4 -2
- data/src/core/lib/security/security_connector/ssl_utils.cc +12 -2
- data/src/core/lib/security/security_connector/ssl_utils.h +10 -7
- data/src/core/lib/security/security_connector/ssl_utils_config.h +1 -1
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +25 -17
- data/src/core/lib/security/security_connector/tls/tls_security_connector.h +27 -7
- data/src/core/lib/security/transport/auth_filters.h +8 -1
- data/src/core/lib/security/transport/client_auth_filter.cc +19 -11
- data/src/core/lib/security/transport/secure_endpoint.cc +63 -13
- data/src/core/lib/security/transport/secure_endpoint.h +4 -3
- data/src/core/lib/security/transport/security_handshaker.cc +70 -49
- data/src/core/lib/security/transport/security_handshaker.h +6 -1
- data/src/core/lib/security/transport/server_auth_filter.cc +26 -4
- data/src/core/lib/security/util/json_util.cc +3 -2
- data/src/core/lib/security/util/json_util.h +0 -2
- data/src/core/lib/service_config/service_config.h +11 -0
- data/src/core/lib/service_config/service_config_call_data.h +2 -1
- data/src/core/lib/service_config/service_config_impl.cc +98 -97
- data/src/core/lib/service_config/service_config_impl.h +12 -16
- data/src/core/lib/service_config/service_config_parser.cc +26 -29
- 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/slice/slice_buffer.cc +30 -1
- data/src/core/lib/slice/slice_buffer.h +37 -6
- data/src/core/lib/slice/slice_string_helpers.cc +0 -20
- data/src/core/lib/slice/slice_string_helpers.h +0 -4
- data/src/core/lib/surface/call.cc +61 -117
- data/src/core/lib/surface/call.h +5 -1
- data/src/core/lib/surface/channel.cc +6 -6
- data/src/core/lib/surface/channel.h +3 -1
- data/src/core/lib/surface/channel_ping.cc +1 -1
- data/src/core/lib/surface/completion_queue.cc +15 -16
- data/src/core/lib/surface/completion_queue.h +2 -4
- data/src/core/lib/surface/init.cc +2 -7
- data/src/core/lib/surface/lame_client.cc +3 -4
- data/src/core/lib/surface/lame_client.h +2 -2
- data/src/core/lib/surface/server.cc +21 -20
- data/src/core/lib/surface/server.h +11 -8
- data/src/core/lib/surface/validate_metadata.cc +5 -15
- 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 +9 -39
- data/src/core/lib/transport/handshaker.cc +10 -12
- 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 +20 -20
- 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 +14 -20
- data/src/core/lib/transport/transport.cc +0 -3
- data/src/core/lib/transport/transport.h +20 -21
- data/src/core/lib/transport/transport_fwd.h +20 -0
- data/src/core/lib/transport/transport_impl.h +1 -0
- data/src/core/lib/transport/transport_op_string.cc +9 -9
- 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 +15 -8
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +1 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +9 -1
- data/src/core/tsi/fake_transport_security.cc +66 -31
- data/src/core/tsi/fake_transport_security.h +6 -0
- 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 +48 -24
- data/src/core/tsi/transport_security.cc +18 -6
- data/src/core/tsi/transport_security.h +2 -1
- data/src/core/tsi/transport_security_grpc.cc +3 -2
- data/src/core/tsi/transport_security_grpc.h +5 -2
- data/src/core/tsi/transport_security_interface.h +17 -5
- data/src/ruby/ext/grpc/ext-export-truffleruby.clang +2 -0
- data/src/ruby/ext/grpc/ext-export-truffleruby.gcc +7 -0
- data/src/ruby/ext/grpc/ext-export.clang +1 -0
- data/src/ruby/ext/grpc/ext-export.gcc +1 -0
- data/src/ruby/ext/grpc/extconf.rb +51 -18
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
- data/src/ruby/ext/grpc/rb_loader.c +6 -2
- data/src/ruby/lib/grpc/2.5/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/2.6/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/2.7/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/3.0/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/3.1/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/errors.rb +1 -1
- data/src/ruby/lib/grpc/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +4 -0
- data/src/ruby/spec/generic/client_stub_spec.rb +23 -23
- data/third_party/abseil-cpp/absl/algorithm/container.h +1 -1
- data/third_party/abseil-cpp/absl/base/attributes.h +49 -22
- data/third_party/abseil-cpp/absl/base/casts.h +61 -68
- data/third_party/abseil-cpp/absl/base/config.h +182 -41
- data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +12 -42
- data/third_party/abseil-cpp/absl/base/internal/cycleclock.h +67 -2
- data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +3 -3
- data/third_party/abseil-cpp/absl/base/internal/endian.h +17 -62
- data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +2 -0
- data/third_party/abseil-cpp/absl/base/internal/invoke.h +54 -0
- data/third_party/abseil-cpp/absl/base/internal/prefetch.h +138 -0
- data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +29 -22
- data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +13 -12
- data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +3 -0
- data/third_party/abseil-cpp/absl/base/internal/spinlock.h +8 -0
- data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +2 -5
- data/third_party/abseil-cpp/absl/base/internal/strerror.cc +88 -0
- data/third_party/abseil-cpp/absl/base/internal/strerror.h +39 -0
- data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +0 -1
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +2 -1
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +6 -7
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +12 -3
- data/third_party/abseil-cpp/absl/base/log_severity.cc +28 -0
- data/third_party/abseil-cpp/absl/base/log_severity.h +51 -0
- data/third_party/abseil-cpp/absl/base/optimization.h +19 -11
- data/third_party/abseil-cpp/absl/base/options.h +1 -1
- data/third_party/abseil-cpp/absl/base/thread_annotations.h +2 -2
- data/third_party/abseil-cpp/absl/container/fixed_array.h +2 -0
- data/third_party/abseil-cpp/absl/container/flat_hash_map.h +11 -4
- data/third_party/abseil-cpp/absl/container/flat_hash_set.h +15 -9
- data/third_party/abseil-cpp/absl/container/inlined_vector.h +20 -9
- data/third_party/abseil-cpp/absl/container/internal/common.h +6 -5
- data/third_party/abseil-cpp/absl/container/internal/container_memory.h +10 -28
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +68 -20
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +29 -11
- data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +59 -38
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +4 -0
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +515 -184
- data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +45 -88
- data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +4 -0
- data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +3 -2
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +8 -3
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +8 -3
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +2 -1
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +8 -3
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +20 -18
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +8 -3
- data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +15 -2
- data/third_party/abseil-cpp/absl/debugging/symbolize.cc +6 -1
- data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +46 -7
- data/third_party/abseil-cpp/absl/functional/any_invocable.h +313 -0
- data/third_party/abseil-cpp/absl/functional/bind_front.h +10 -1
- data/third_party/abseil-cpp/absl/functional/function_ref.h +2 -1
- data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +857 -0
- data/third_party/abseil-cpp/absl/hash/hash.h +82 -8
- data/third_party/abseil-cpp/absl/hash/internal/hash.h +218 -23
- data/third_party/abseil-cpp/absl/numeric/bits.h +2 -1
- data/third_party/abseil-cpp/absl/numeric/int128.cc +4 -2
- data/third_party/abseil-cpp/absl/numeric/int128.h +2 -2
- data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +21 -6
- data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +4 -4
- data/third_party/abseil-cpp/absl/random/distributions.h +3 -3
- data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +3 -0
- data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +2 -1
- data/third_party/abseil-cpp/absl/random/internal/generate_real.h +2 -2
- data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +59 -48
- data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +1 -1
- data/third_party/abseil-cpp/absl/random/internal/randen.h +5 -11
- data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +6 -2
- data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +48 -23
- data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +24 -26
- data/third_party/abseil-cpp/absl/random/internal/traits.h +53 -5
- data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +5 -5
- data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +33 -48
- data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +9 -10
- data/third_party/abseil-cpp/absl/random/poisson_distribution.h +7 -4
- data/third_party/abseil-cpp/absl/random/seed_sequences.h +1 -0
- data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +2 -2
- data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +1 -1
- data/third_party/abseil-cpp/absl/random/zipf_distribution.h +4 -3
- data/third_party/abseil-cpp/absl/status/internal/status_internal.h +17 -0
- data/third_party/abseil-cpp/absl/status/status.cc +174 -2
- data/third_party/abseil-cpp/absl/status/status.h +22 -12
- data/third_party/abseil-cpp/absl/status/statusor.h +9 -3
- data/third_party/abseil-cpp/absl/strings/ascii.h +4 -4
- data/third_party/abseil-cpp/absl/strings/cord.cc +194 -913
- data/third_party/abseil-cpp/absl/strings/cord.h +202 -81
- data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +188 -0
- data/third_party/abseil-cpp/absl/strings/cord_analysis.h +44 -0
- data/third_party/abseil-cpp/absl/strings/cord_buffer.cc +30 -0
- data/third_party/abseil-cpp/absl/strings/cord_buffer.h +572 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_data_edge.h +63 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +20 -32
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +123 -88
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +149 -49
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +44 -59
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +3 -1
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +4 -2
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +3 -2
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +5 -4
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +7 -74
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.cc +54 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.h +102 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +58 -17
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +13 -11
- data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +11 -38
- data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +1 -0
- data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +4 -2
- data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +6 -5
- data/third_party/abseil-cpp/absl/strings/internal/ostringstream.cc +1 -1
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +1 -1
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -1
- data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +38 -7
- data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +7 -2
- data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +4 -5
- data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +5 -2
- data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +2 -1
- data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +4 -2
- data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +9 -6
- data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +10 -2
- data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +9 -9
- data/third_party/abseil-cpp/absl/strings/numbers.cc +8 -8
- data/third_party/abseil-cpp/absl/strings/numbers.h +26 -23
- data/third_party/abseil-cpp/absl/strings/str_cat.h +20 -13
- data/third_party/abseil-cpp/absl/strings/str_join.h +9 -15
- data/third_party/abseil-cpp/absl/strings/str_split.h +1 -2
- data/third_party/abseil-cpp/absl/strings/string_view.cc +2 -13
- data/third_party/abseil-cpp/absl/strings/string_view.h +3 -2
- data/third_party/abseil-cpp/absl/strings/strip.h +8 -6
- data/third_party/abseil-cpp/absl/strings/substitute.h +10 -2
- data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +9 -6
- data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.h +0 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +0 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +1 -6
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +0 -25
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +10 -4
- data/third_party/abseil-cpp/absl/synchronization/mutex.cc +75 -40
- data/third_party/abseil-cpp/absl/synchronization/mutex.h +17 -9
- data/third_party/abseil-cpp/absl/synchronization/notification.h +3 -2
- data/third_party/abseil-cpp/absl/time/duration.cc +5 -4
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +11 -7
- data/third_party/abseil-cpp/absl/time/time.h +16 -12
- data/third_party/abseil-cpp/absl/types/internal/optional.h +8 -0
- data/third_party/abseil-cpp/absl/types/internal/variant.h +3 -3
- data/third_party/abseil-cpp/absl/types/optional.h +17 -14
- data/third_party/abseil-cpp/absl/types/span.h +2 -1
- 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 +113 -37
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +0 -50
- data/src/core/lib/event_engine/event_engine.cc +0 -62
- data/src/core/lib/event_engine/iomgr_engine.cc +0 -206
- 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/promise/detail/switch.h +0 -1455
- data/src/core/lib/slice/slice_split.cc +0 -103
- data/src/core/lib/slice/slice_split.h +0 -36
- data/src/core/lib/transport/byte_stream.cc +0 -165
- data/src/core/lib/transport/byte_stream.h +0 -170
- data/third_party/abseil-cpp/absl/cleanup/cleanup.h +0 -140
- data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +0 -100
- data/third_party/abseil-cpp/absl/container/internal/have_sse.h +0 -50
@@ -19,48 +19,33 @@
|
|
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
|
-
#include
|
24
|
+
#include <algorithm>
|
25
|
+
|
26
|
+
#include "absl/memory/memory.h"
|
27
|
+
#include "absl/strings/match.h"
|
28
|
+
#include "absl/strings/str_cat.h"
|
26
29
|
#include "absl/strings/str_format.h"
|
27
30
|
#include "absl/strings/str_join.h"
|
31
|
+
#include "absl/strings/str_split.h"
|
28
32
|
#include "absl/strings/string_view.h"
|
33
|
+
#include "absl/strings/strip.h"
|
34
|
+
#include "absl/types/optional.h"
|
35
|
+
#include "upb/arena.h"
|
29
36
|
|
30
|
-
#include <grpc/
|
31
|
-
#include <grpc/
|
32
|
-
#include <grpc/support/alloc.h>
|
33
|
-
#include <grpc/support/time.h>
|
37
|
+
#include <grpc/event_engine/event_engine.h>
|
38
|
+
#include <grpc/support/log.h>
|
34
39
|
|
35
|
-
#include "src/core/ext/filters/client_channel/client_channel.h"
|
36
40
|
#include "src/core/ext/xds/xds_api.h"
|
37
41
|
#include "src/core/ext/xds/xds_bootstrap.h"
|
38
|
-
#include "src/core/ext/xds/xds_channel_args.h"
|
39
42
|
#include "src/core/ext/xds/xds_client_stats.h"
|
40
|
-
#include "src/core/ext/xds/xds_cluster.h"
|
41
|
-
#include "src/core/ext/xds/xds_cluster_specifier_plugin.h"
|
42
|
-
#include "src/core/ext/xds/xds_endpoint.h"
|
43
|
-
#include "src/core/ext/xds/xds_http_filters.h"
|
44
|
-
#include "src/core/ext/xds/xds_listener.h"
|
45
|
-
#include "src/core/lib/address_utils/sockaddr_utils.h"
|
46
43
|
#include "src/core/lib/backoff/backoff.h"
|
47
|
-
#include "src/core/lib/
|
48
|
-
#include "src/core/lib/
|
49
|
-
#include "src/core/lib/config/core_configuration.h"
|
50
|
-
#include "src/core/lib/gpr/env.h"
|
51
|
-
#include "src/core/lib/gpr/string.h"
|
52
|
-
#include "src/core/lib/gprpp/memory.h"
|
44
|
+
#include "src/core/lib/event_engine/default_event_engine.h"
|
45
|
+
#include "src/core/lib/gprpp/debug_location.h"
|
53
46
|
#include "src/core/lib/gprpp/orphanable.h"
|
54
47
|
#include "src/core/lib/gprpp/ref_counted_ptr.h"
|
55
48
|
#include "src/core/lib/gprpp/sync.h"
|
56
|
-
#include "src/core/lib/iomgr/sockaddr.h"
|
57
|
-
#include "src/core/lib/iomgr/timer.h"
|
58
|
-
#include "src/core/lib/security/credentials/channel_creds_registry.h"
|
59
|
-
#include "src/core/lib/slice/slice_internal.h"
|
60
|
-
#include "src/core/lib/slice/slice_string_helpers.h"
|
61
|
-
#include "src/core/lib/surface/call.h"
|
62
|
-
#include "src/core/lib/surface/channel.h"
|
63
|
-
#include "src/core/lib/surface/lame_client.h"
|
64
49
|
#include "src/core/lib/uri/uri_parser.h"
|
65
50
|
|
66
51
|
#define GRPC_XDS_INITIAL_CONNECT_BACKOFF_SECONDS 1
|
@@ -71,19 +56,12 @@
|
|
71
56
|
|
72
57
|
namespace grpc_core {
|
73
58
|
|
59
|
+
using ::grpc_event_engine::experimental::EventEngine;
|
60
|
+
using ::grpc_event_engine::experimental::GetDefaultEventEngine;
|
61
|
+
|
74
62
|
TraceFlag grpc_xds_client_trace(false, "xds_client");
|
75
63
|
TraceFlag grpc_xds_client_refcount_trace(false, "xds_client_refcount");
|
76
64
|
|
77
|
-
namespace {
|
78
|
-
|
79
|
-
Mutex* g_mu = nullptr;
|
80
|
-
|
81
|
-
const grpc_channel_args* g_channel_args ABSL_GUARDED_BY(*g_mu) = nullptr;
|
82
|
-
XdsClient* g_xds_client ABSL_GUARDED_BY(*g_mu) = nullptr;
|
83
|
-
char* g_fallback_bootstrap_config ABSL_GUARDED_BY(*g_mu) = nullptr;
|
84
|
-
|
85
|
-
} // namespace
|
86
|
-
|
87
65
|
//
|
88
66
|
// Internal class declarations
|
89
67
|
//
|
@@ -96,9 +74,12 @@ class XdsClient::ChannelState::RetryableCall
|
|
96
74
|
public:
|
97
75
|
explicit RetryableCall(WeakRefCountedPtr<ChannelState> chand);
|
98
76
|
|
99
|
-
|
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;
|
100
81
|
|
101
|
-
void OnCallFinishedLocked();
|
82
|
+
void OnCallFinishedLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
102
83
|
|
103
84
|
T* calld() const { return calld_.get(); }
|
104
85
|
ChannelState* chand() const { return chand_.get(); }
|
@@ -107,9 +88,9 @@ class XdsClient::ChannelState::RetryableCall
|
|
107
88
|
|
108
89
|
private:
|
109
90
|
void StartNewCallLocked();
|
110
|
-
void StartRetryTimerLocked();
|
111
|
-
|
112
|
-
void
|
91
|
+
void StartRetryTimerLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
92
|
+
|
93
|
+
void OnRetryTimer();
|
113
94
|
|
114
95
|
// The wrapped xds call that talks to the xds server. It's instantiated
|
115
96
|
// every time we start a new call. It's null during call retry backoff.
|
@@ -119,9 +100,8 @@ class XdsClient::ChannelState::RetryableCall
|
|
119
100
|
|
120
101
|
// Retry state.
|
121
102
|
BackOff backoff_;
|
122
|
-
|
123
|
-
|
124
|
-
bool retry_timer_callback_pending_ = false;
|
103
|
+
absl::optional<EventEngine::TaskHandle> timer_handle_
|
104
|
+
ABSL_GUARDED_BY(&XdsClient::mu_);
|
125
105
|
|
126
106
|
bool shutting_down_ = false;
|
127
107
|
};
|
@@ -132,7 +112,6 @@ class XdsClient::ChannelState::AdsCallState
|
|
132
112
|
public:
|
133
113
|
// The ctor and dtor should not be used directly.
|
134
114
|
explicit AdsCallState(RefCountedPtr<RetryableCall<AdsCallState>> parent);
|
135
|
-
~AdsCallState() override;
|
136
115
|
|
137
116
|
void Orphan() override;
|
138
117
|
|
@@ -170,8 +149,7 @@ class XdsClient::ChannelState::AdsCallState
|
|
170
149
|
absl::Status ProcessAdsResponseFields(AdsResponseFields fields) override
|
171
150
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
172
151
|
|
173
|
-
void ParseResource(
|
174
|
-
absl::string_view type_url,
|
152
|
+
void ParseResource(upb_Arena* arena, size_t idx, absl::string_view type_url,
|
175
153
|
absl::string_view serialized_resource) override
|
176
154
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
177
155
|
|
@@ -188,12 +166,12 @@ class XdsClient::ChannelState::AdsCallState
|
|
188
166
|
class ResourceTimer : public InternallyRefCounted<ResourceTimer> {
|
189
167
|
public:
|
190
168
|
ResourceTimer(const XdsResourceType* type, const XdsResourceName& name)
|
191
|
-
: type_(type), name_(name) {
|
192
|
-
GRPC_CLOSURE_INIT(&timer_callback_, OnTimer, this,
|
193
|
-
grpc_schedule_on_exec_ctx);
|
194
|
-
}
|
169
|
+
: type_(type), name_(name) {}
|
195
170
|
|
196
|
-
|
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 {
|
197
175
|
MaybeCancelTimer();
|
198
176
|
Unref(DEBUG_LOCATION, "Orphan");
|
199
177
|
}
|
@@ -213,15 +191,16 @@ class XdsClient::ChannelState::AdsCallState
|
|
213
191
|
if (state.resource != nullptr) return;
|
214
192
|
// Start timer.
|
215
193
|
ads_calld_ = std::move(ads_calld);
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
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
|
+
});
|
222
201
|
}
|
223
202
|
|
224
|
-
void MaybeCancelTimer() {
|
203
|
+
void MaybeCancelTimer() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
|
225
204
|
// If the timer hasn't been started yet, make sure we don't start
|
226
205
|
// it later. This can happen if the last watch for an LDS or CDS
|
227
206
|
// resource is cancelled and then restarted, both while an ADS
|
@@ -234,65 +213,72 @@ class XdsClient::ChannelState::AdsCallState
|
|
234
213
|
// For details, see https://github.com/grpc/grpc/issues/29583.
|
235
214
|
// TODO(roth): Find a way to write a test for this case.
|
236
215
|
timer_start_needed_ = false;
|
237
|
-
if (
|
238
|
-
|
239
|
-
|
216
|
+
if (timer_handle_.has_value()) {
|
217
|
+
GetDefaultEventEngine()->Cancel(*timer_handle_);
|
218
|
+
timer_handle_.reset();
|
240
219
|
}
|
241
220
|
}
|
242
221
|
|
243
222
|
private:
|
244
|
-
|
245
|
-
ResourceTimer* self = static_cast<ResourceTimer*>(arg);
|
223
|
+
void OnTimer() {
|
246
224
|
{
|
247
|
-
MutexLock lock(&
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
name_.authority, type_->type_url(), name_.key)
|
268
|
-
.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);
|
269
245
|
}
|
270
|
-
auto& authority_state =
|
271
|
-
ads_calld_->xds_client()->authority_state_map_[name_.authority];
|
272
|
-
ResourceState& state = authority_state.resource_map[type_][name_.key];
|
273
|
-
state.meta.client_status = XdsApi::ResourceMetadata::DOES_NOT_EXIST;
|
274
|
-
ads_calld_->xds_client()->NotifyWatchersOnResourceDoesNotExist(
|
275
|
-
state.watchers);
|
276
246
|
}
|
277
|
-
|
247
|
+
ads_calld_->xds_client()->work_serializer_.DrainQueue();
|
248
|
+
ads_calld_.reset();
|
278
249
|
}
|
279
250
|
|
280
251
|
const XdsResourceType* type_;
|
281
252
|
const XdsResourceName name_;
|
282
253
|
|
283
254
|
RefCountedPtr<AdsCallState> ads_calld_;
|
284
|
-
bool timer_start_needed_ = true;
|
285
|
-
|
286
|
-
|
287
|
-
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_);
|
288
258
|
};
|
289
259
|
|
290
|
-
|
291
|
-
|
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)) {}
|
265
|
+
|
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
|
+
};
|
292
277
|
|
293
|
-
|
278
|
+
struct ResourceTypeState {
|
279
|
+
// Nonce and status for this resource type.
|
294
280
|
std::string nonce;
|
295
|
-
|
281
|
+
absl::Status status;
|
296
282
|
|
297
283
|
// Subscribed resources of this type.
|
298
284
|
std::map<std::string /*authority*/,
|
@@ -303,15 +289,9 @@ class XdsClient::ChannelState::AdsCallState
|
|
303
289
|
void SendMessageLocked(const XdsResourceType* type)
|
304
290
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
305
291
|
|
306
|
-
|
307
|
-
void
|
308
|
-
|
309
|
-
static void OnResponseReceived(void* arg, grpc_error_handle error);
|
310
|
-
bool OnResponseReceivedLocked()
|
311
|
-
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
312
|
-
static void OnStatusReceived(void* arg, grpc_error_handle error);
|
313
|
-
void OnStatusReceivedLocked(grpc_error_handle error)
|
314
|
-
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
292
|
+
void OnRequestSent(bool ok);
|
293
|
+
void OnRecvMessage(absl::string_view payload);
|
294
|
+
void OnStatusReceived(absl::Status status);
|
315
295
|
|
316
296
|
bool IsCurrentCallOnChannel() const;
|
317
297
|
|
@@ -323,28 +303,11 @@ class XdsClient::ChannelState::AdsCallState
|
|
323
303
|
// The owning RetryableCall<>.
|
324
304
|
RefCountedPtr<RetryableCall<AdsCallState>> parent_;
|
325
305
|
|
306
|
+
OrphanablePtr<XdsTransportFactory::XdsTransport::StreamingCall> call_;
|
307
|
+
|
326
308
|
bool sent_initial_message_ = false;
|
327
309
|
bool seen_response_ = false;
|
328
|
-
|
329
|
-
// Always non-NULL.
|
330
|
-
grpc_call* call_;
|
331
|
-
|
332
|
-
// recv_initial_metadata
|
333
|
-
grpc_metadata_array initial_metadata_recv_;
|
334
|
-
|
335
|
-
// send_message
|
336
|
-
grpc_byte_buffer* send_message_payload_ = nullptr;
|
337
|
-
grpc_closure on_request_sent_;
|
338
|
-
|
339
|
-
// recv_message
|
340
|
-
grpc_byte_buffer* recv_message_payload_ = nullptr;
|
341
|
-
grpc_closure on_response_received_;
|
342
|
-
|
343
|
-
// recv_trailing_metadata
|
344
|
-
grpc_metadata_array trailing_metadata_recv_;
|
345
|
-
grpc_status_code status_code_;
|
346
|
-
grpc_slice status_details_;
|
347
|
-
grpc_closure on_status_received_;
|
310
|
+
bool send_message_pending_ ABSL_GUARDED_BY(&XdsClient::mu_) = false;
|
348
311
|
|
349
312
|
// Resource types for which requests need to be sent.
|
350
313
|
std::set<const XdsResourceType*> buffered_requests_;
|
@@ -359,11 +322,11 @@ class XdsClient::ChannelState::LrsCallState
|
|
359
322
|
public:
|
360
323
|
// The ctor and dtor should not be used directly.
|
361
324
|
explicit LrsCallState(RefCountedPtr<RetryableCall<LrsCallState>> parent);
|
362
|
-
~LrsCallState() override;
|
363
325
|
|
364
326
|
void Orphan() override;
|
365
327
|
|
366
|
-
void MaybeStartReportingLocked()
|
328
|
+
void MaybeStartReportingLocked()
|
329
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
367
330
|
|
368
331
|
RetryableCall<LrsCallState>* parent() { return parent_.get(); }
|
369
332
|
ChannelState* chand() const { return parent_->chand(); }
|
@@ -371,30 +334,44 @@ class XdsClient::ChannelState::LrsCallState
|
|
371
334
|
bool seen_response() const { return seen_response_; }
|
372
335
|
|
373
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
|
+
|
374
355
|
// Reports client-side load stats according to a fixed interval.
|
375
356
|
class Reporter : public InternallyRefCounted<Reporter> {
|
376
357
|
public:
|
377
358
|
Reporter(RefCountedPtr<LrsCallState> parent, Duration report_interval)
|
378
359
|
: parent_(std::move(parent)), report_interval_(report_interval) {
|
379
|
-
GRPC_CLOSURE_INIT(&on_next_report_timer_, OnNextReportTimer, this,
|
380
|
-
grpc_schedule_on_exec_ctx);
|
381
|
-
GRPC_CLOSURE_INIT(&on_report_done_, OnReportDone, this,
|
382
|
-
grpc_schedule_on_exec_ctx);
|
383
360
|
ScheduleNextReportLocked();
|
384
361
|
}
|
385
362
|
|
386
|
-
|
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_);
|
387
369
|
|
388
370
|
private:
|
389
371
|
void ScheduleNextReportLocked()
|
390
372
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
391
|
-
|
392
|
-
bool OnNextReportTimerLocked(grpc_error_handle error)
|
393
|
-
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
373
|
+
bool OnNextReportTimer();
|
394
374
|
bool SendReportLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
395
|
-
static void OnReportDone(void* arg, grpc_error_handle error);
|
396
|
-
bool OnReportDoneLocked(grpc_error_handle error)
|
397
|
-
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
398
375
|
|
399
376
|
bool IsCurrentReporterOnCall() const {
|
400
377
|
return this == parent_->reporter_.get();
|
@@ -407,47 +384,23 @@ class XdsClient::ChannelState::LrsCallState
|
|
407
384
|
// The load reporting state.
|
408
385
|
const Duration report_interval_;
|
409
386
|
bool last_report_counters_were_zero_ = false;
|
410
|
-
|
411
|
-
|
412
|
-
grpc_closure on_next_report_timer_;
|
413
|
-
grpc_closure on_report_done_;
|
387
|
+
absl::optional<EventEngine::TaskHandle> timer_handle_
|
388
|
+
ABSL_GUARDED_BY(&XdsClient::mu_);
|
414
389
|
};
|
415
390
|
|
416
|
-
|
417
|
-
void
|
418
|
-
|
419
|
-
static void OnResponseReceived(void* arg, grpc_error_handle error);
|
420
|
-
bool OnResponseReceivedLocked()
|
421
|
-
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
422
|
-
static void OnStatusReceived(void* arg, grpc_error_handle error);
|
423
|
-
void OnStatusReceivedLocked(grpc_error_handle error)
|
424
|
-
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
|
391
|
+
void OnRequestSent(bool ok);
|
392
|
+
void OnRecvMessage(absl::string_view payload);
|
393
|
+
void OnStatusReceived(absl::Status status);
|
425
394
|
|
426
395
|
bool IsCurrentCallOnChannel() const;
|
427
396
|
|
428
397
|
// The owning RetryableCall<>.
|
429
398
|
RefCountedPtr<RetryableCall<LrsCallState>> parent_;
|
430
|
-
bool seen_response_ = false;
|
431
399
|
|
432
|
-
|
433
|
-
grpc_call* call_;
|
400
|
+
OrphanablePtr<XdsTransportFactory::XdsTransport::StreamingCall> call_;
|
434
401
|
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
// send_message
|
439
|
-
grpc_byte_buffer* send_message_payload_ = nullptr;
|
440
|
-
grpc_closure on_initial_request_sent_;
|
441
|
-
|
442
|
-
// recv_message
|
443
|
-
grpc_byte_buffer* recv_message_payload_ = nullptr;
|
444
|
-
grpc_closure on_response_received_;
|
445
|
-
|
446
|
-
// recv_trailing_metadata
|
447
|
-
grpc_metadata_array trailing_metadata_recv_;
|
448
|
-
grpc_status_code status_code_;
|
449
|
-
grpc_slice status_details_;
|
450
|
-
grpc_closure on_status_received_;
|
402
|
+
bool seen_response_ = false;
|
403
|
+
bool send_message_pending_ ABSL_GUARDED_BY(&XdsClient::mu_) = false;
|
451
404
|
|
452
405
|
// Load reporting state.
|
453
406
|
bool send_all_clusters_ = false;
|
@@ -456,58 +409,10 @@ class XdsClient::ChannelState::LrsCallState
|
|
456
409
|
OrphanablePtr<Reporter> reporter_;
|
457
410
|
};
|
458
411
|
|
459
|
-
//
|
460
|
-
// XdsClient::ChannelState::StateWatcher
|
461
|
-
//
|
462
|
-
|
463
|
-
class XdsClient::ChannelState::StateWatcher
|
464
|
-
: public AsyncConnectivityStateWatcherInterface {
|
465
|
-
public:
|
466
|
-
explicit StateWatcher(WeakRefCountedPtr<ChannelState> parent)
|
467
|
-
: parent_(std::move(parent)) {}
|
468
|
-
|
469
|
-
private:
|
470
|
-
void OnConnectivityStateChange(grpc_connectivity_state new_state,
|
471
|
-
const absl::Status& status) override {
|
472
|
-
{
|
473
|
-
MutexLock lock(&parent_->xds_client_->mu_);
|
474
|
-
if (!parent_->shutting_down_ &&
|
475
|
-
new_state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
|
476
|
-
// In TRANSIENT_FAILURE. Notify all watchers of error.
|
477
|
-
gpr_log(GPR_INFO,
|
478
|
-
"[xds_client %p] xds channel for server %s in "
|
479
|
-
"state TRANSIENT_FAILURE: %s",
|
480
|
-
parent_->xds_client(), parent_->server_.server_uri.c_str(),
|
481
|
-
status.ToString().c_str());
|
482
|
-
parent_->xds_client_->NotifyOnErrorLocked(
|
483
|
-
absl::UnavailableError(absl::StrCat(
|
484
|
-
"xds channel in TRANSIENT_FAILURE, connectivity error: ",
|
485
|
-
status.ToString())));
|
486
|
-
}
|
487
|
-
}
|
488
|
-
parent_->xds_client()->work_serializer_.DrainQueue();
|
489
|
-
}
|
490
|
-
|
491
|
-
WeakRefCountedPtr<ChannelState> parent_;
|
492
|
-
};
|
493
|
-
|
494
412
|
//
|
495
413
|
// XdsClient::ChannelState
|
496
414
|
//
|
497
415
|
|
498
|
-
namespace {
|
499
|
-
|
500
|
-
grpc_channel* CreateXdsChannel(grpc_channel_args* args,
|
501
|
-
const XdsBootstrap::XdsServer& server) {
|
502
|
-
RefCountedPtr<grpc_channel_credentials> channel_creds =
|
503
|
-
CoreConfiguration::Get().channel_creds_registry().CreateChannelCreds(
|
504
|
-
server.channel_creds_type, server.channel_creds_config);
|
505
|
-
return grpc_channel_create(server.server_uri.c_str(), channel_creds.get(),
|
506
|
-
args);
|
507
|
-
}
|
508
|
-
|
509
|
-
} // namespace
|
510
|
-
|
511
416
|
XdsClient::ChannelState::ChannelState(WeakRefCountedPtr<XdsClient> xds_client,
|
512
417
|
const XdsBootstrap::XdsServer& server)
|
513
418
|
: DualRefCounted<ChannelState>(
|
@@ -520,9 +425,16 @@ XdsClient::ChannelState::ChannelState(WeakRefCountedPtr<XdsClient> xds_client,
|
|
520
425
|
gpr_log(GPR_INFO, "[xds_client %p] creating channel to %s",
|
521
426
|
xds_client_.get(), server.server_uri.c_str());
|
522
427
|
}
|
523
|
-
|
524
|
-
|
525
|
-
|
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));
|
526
438
|
}
|
527
439
|
|
528
440
|
XdsClient::ChannelState::~ChannelState() {
|
@@ -530,25 +442,26 @@ XdsClient::ChannelState::~ChannelState() {
|
|
530
442
|
gpr_log(GPR_INFO, "[xds_client %p] destroying xds channel %p for server %s",
|
531
443
|
xds_client(), this, server_.server_uri.c_str());
|
532
444
|
}
|
533
|
-
grpc_channel_destroy(channel_);
|
534
445
|
xds_client_.reset(DEBUG_LOCATION, "ChannelState");
|
535
446
|
}
|
536
447
|
|
537
448
|
// This method should only ever be called when holding the lock, but we can't
|
538
449
|
// use a ABSL_EXCLUSIVE_LOCKS_REQUIRED annotation, because Orphan() will be
|
539
|
-
// called from DualRefCounted::Unref, which cannot have a lock annotation for
|
540
|
-
// lock in this subclass.
|
450
|
+
// called from DualRefCounted::Unref, which cannot have a lock annotation for
|
451
|
+
// a lock in this subclass.
|
541
452
|
void XdsClient::ChannelState::Orphan() ABSL_NO_THREAD_SAFETY_ANALYSIS {
|
542
453
|
shutting_down_ = true;
|
543
|
-
|
454
|
+
transport_.reset();
|
544
455
|
// At this time, all strong refs are removed, remove from channel map to
|
545
|
-
// prevent subsequent subscription from trying to use this ChannelState as
|
546
|
-
// is shutting down.
|
456
|
+
// prevent subsequent subscription from trying to use this ChannelState as
|
457
|
+
// it is shutting down.
|
547
458
|
xds_client_->xds_server_channel_map_.erase(server_);
|
548
459
|
ads_calld_.reset();
|
549
460
|
lrs_calld_.reset();
|
550
461
|
}
|
551
462
|
|
463
|
+
void XdsClient::ChannelState::ResetBackoff() { transport_->ResetBackoff(); }
|
464
|
+
|
552
465
|
XdsClient::ChannelState::AdsCallState* XdsClient::ChannelState::ads_calld()
|
553
466
|
const {
|
554
467
|
return ads_calld_->calld();
|
@@ -574,41 +487,6 @@ void XdsClient::ChannelState::StopLrsCallLocked() {
|
|
574
487
|
lrs_calld_.reset();
|
575
488
|
}
|
576
489
|
|
577
|
-
namespace {
|
578
|
-
|
579
|
-
bool IsLameChannel(grpc_channel* channel) {
|
580
|
-
grpc_channel_element* elem =
|
581
|
-
grpc_channel_stack_last_element(grpc_channel_get_channel_stack(channel));
|
582
|
-
return elem->filter == &LameClientFilter::kFilter;
|
583
|
-
}
|
584
|
-
|
585
|
-
} // namespace
|
586
|
-
|
587
|
-
void XdsClient::ChannelState::StartConnectivityWatchLocked() {
|
588
|
-
if (IsLameChannel(channel_)) {
|
589
|
-
xds_client()->NotifyOnErrorLocked(
|
590
|
-
absl::UnavailableError("xds client has a lame channel"));
|
591
|
-
return;
|
592
|
-
}
|
593
|
-
ClientChannel* client_channel =
|
594
|
-
ClientChannel::GetFromChannel(Channel::FromC(channel_));
|
595
|
-
GPR_ASSERT(client_channel != nullptr);
|
596
|
-
watcher_ = new StateWatcher(WeakRef(DEBUG_LOCATION, "ChannelState+watch"));
|
597
|
-
client_channel->AddConnectivityWatcher(
|
598
|
-
GRPC_CHANNEL_IDLE,
|
599
|
-
OrphanablePtr<AsyncConnectivityStateWatcherInterface>(watcher_));
|
600
|
-
}
|
601
|
-
|
602
|
-
void XdsClient::ChannelState::CancelConnectivityWatchLocked() {
|
603
|
-
if (IsLameChannel(channel_)) {
|
604
|
-
return;
|
605
|
-
}
|
606
|
-
ClientChannel* client_channel =
|
607
|
-
ClientChannel::GetFromChannel(Channel::FromC(channel_));
|
608
|
-
GPR_ASSERT(client_channel != nullptr);
|
609
|
-
client_channel->RemoveConnectivityWatcher(watcher_);
|
610
|
-
}
|
611
|
-
|
612
490
|
void XdsClient::ChannelState::SubscribeLocked(const XdsResourceType* type,
|
613
491
|
const XdsResourceName& name) {
|
614
492
|
if (ads_calld_ == nullptr) {
|
@@ -641,6 +519,29 @@ void XdsClient::ChannelState::UnsubscribeLocked(const XdsResourceType* type,
|
|
641
519
|
}
|
642
520
|
}
|
643
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
|
+
|
644
545
|
//
|
645
546
|
// XdsClient::ChannelState::RetryableCall<>
|
646
547
|
//
|
@@ -656,9 +557,6 @@ XdsClient::ChannelState::RetryableCall<T>::RetryableCall(
|
|
656
557
|
.set_jitter(GRPC_XDS_RECONNECT_JITTER)
|
657
558
|
.set_max_backoff(Duration::Seconds(
|
658
559
|
GRPC_XDS_RECONNECT_MAX_BACKOFF_SECONDS))) {
|
659
|
-
// Closure Initialization
|
660
|
-
GRPC_CLOSURE_INIT(&on_retry_timer_, OnRetryTimer, this,
|
661
|
-
grpc_schedule_on_exec_ctx);
|
662
560
|
StartNewCallLocked();
|
663
561
|
}
|
664
562
|
|
@@ -666,7 +564,10 @@ template <typename T>
|
|
666
564
|
void XdsClient::ChannelState::RetryableCall<T>::Orphan() {
|
667
565
|
shutting_down_ = true;
|
668
566
|
calld_.reset();
|
669
|
-
if (
|
567
|
+
if (timer_handle_.has_value()) {
|
568
|
+
GetDefaultEventEngine()->Cancel(*timer_handle_);
|
569
|
+
timer_handle_.reset();
|
570
|
+
}
|
670
571
|
this->Unref(DEBUG_LOCATION, "RetryableCall+orphaned");
|
671
572
|
}
|
672
573
|
|
@@ -682,13 +583,13 @@ void XdsClient::ChannelState::RetryableCall<T>::OnCallFinishedLocked() {
|
|
682
583
|
template <typename T>
|
683
584
|
void XdsClient::ChannelState::RetryableCall<T>::StartNewCallLocked() {
|
684
585
|
if (shutting_down_) return;
|
685
|
-
GPR_ASSERT(chand_->
|
586
|
+
GPR_ASSERT(chand_->transport_ != nullptr);
|
686
587
|
GPR_ASSERT(calld_ == nullptr);
|
687
588
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
688
|
-
gpr_log(
|
689
|
-
|
690
|
-
|
691
|
-
|
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);
|
692
593
|
}
|
693
594
|
calld_ = MakeOrphanable<T>(
|
694
595
|
this->Ref(DEBUG_LOCATION, "RetryableCall+start_new_call"));
|
@@ -698,36 +599,30 @@ template <typename T>
|
|
698
599
|
void XdsClient::ChannelState::RetryableCall<T>::StartRetryTimerLocked() {
|
699
600
|
if (shutting_down_) return;
|
700
601
|
const Timestamp next_attempt_time = backoff_.NextAttemptTime();
|
602
|
+
const Duration timeout =
|
603
|
+
std::max(next_attempt_time - ExecCtx::Get()->Now(), Duration::Zero());
|
701
604
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
702
|
-
Duration timeout =
|
703
|
-
std::max(next_attempt_time - ExecCtx::Get()->Now(), Duration::Zero());
|
704
605
|
gpr_log(GPR_INFO,
|
705
606
|
"[xds_client %p] xds server %s: call attempt failed; "
|
706
607
|
"retry timer will fire in %" PRId64 "ms.",
|
707
608
|
chand()->xds_client(), chand()->server_.server_uri.c_str(),
|
708
609
|
timeout.millis());
|
709
610
|
}
|
710
|
-
|
711
|
-
|
712
|
-
|
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
|
+
});
|
713
618
|
}
|
714
619
|
|
715
620
|
template <typename T>
|
716
|
-
void XdsClient::ChannelState::RetryableCall<T>::OnRetryTimer(
|
717
|
-
|
718
|
-
|
719
|
-
|
720
|
-
|
721
|
-
calld->OnRetryTimerLocked(GRPC_ERROR_REF(error));
|
722
|
-
}
|
723
|
-
calld->Unref(DEBUG_LOCATION, "RetryableCall+retry_timer_done");
|
724
|
-
}
|
725
|
-
|
726
|
-
template <typename T>
|
727
|
-
void XdsClient::ChannelState::RetryableCall<T>::OnRetryTimerLocked(
|
728
|
-
grpc_error_handle error) {
|
729
|
-
retry_timer_callback_pending_ = false;
|
730
|
-
if (!shutting_down_ && error == GRPC_ERROR_NONE) {
|
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;
|
731
626
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
732
627
|
gpr_log(GPR_INFO,
|
733
628
|
"[xds_client %p] xds server %s: retry timer fired (retryable "
|
@@ -736,7 +631,6 @@ void XdsClient::ChannelState::RetryableCall<T>::OnRetryTimerLocked(
|
|
736
631
|
}
|
737
632
|
StartNewCallLocked();
|
738
633
|
}
|
739
|
-
GRPC_ERROR_UNREF(error);
|
740
634
|
}
|
741
635
|
|
742
636
|
//
|
@@ -794,7 +688,7 @@ void UpdateResourceMetadataNacked(const std::string& version,
|
|
794
688
|
} // namespace
|
795
689
|
|
796
690
|
void XdsClient::ChannelState::AdsCallState::AdsResponseParser::ParseResource(
|
797
|
-
|
691
|
+
upb_Arena* arena, size_t idx, absl::string_view type_url,
|
798
692
|
absl::string_view serialized_resource) {
|
799
693
|
// Check the type_url of the resource.
|
800
694
|
bool is_v2 = false;
|
@@ -805,6 +699,9 @@ void XdsClient::ChannelState::AdsCallState::AdsResponseParser::ParseResource(
|
|
805
699
|
return;
|
806
700
|
}
|
807
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};
|
808
705
|
absl::StatusOr<XdsResourceType::DecodeResult> result =
|
809
706
|
result_.type->Decode(context, serialized_resource, is_v2);
|
810
707
|
if (!result.ok()) {
|
@@ -856,6 +753,17 @@ void XdsClient::ChannelState::AdsCallState::AdsResponseParser::ParseResource(
|
|
856
753
|
if (result_.type->AllResourcesRequiredInSotW()) {
|
857
754
|
result_.resources_seen[resource_name->authority].insert(resource_name->key);
|
858
755
|
}
|
756
|
+
// If we previously ignored the resource's deletion, log that we're
|
757
|
+
// now re-adding it.
|
758
|
+
if (resource_state.ignored_deletion) {
|
759
|
+
gpr_log(GPR_INFO,
|
760
|
+
"[xds_client %p] xds server %s: server returned new version of "
|
761
|
+
"resource for which we previously ignored a deletion: type %s "
|
762
|
+
"name %s",
|
763
|
+
xds_client(), ads_call_state_->chand()->server_.server_uri.c_str(),
|
764
|
+
std::string(type_url).c_str(), result->name.c_str());
|
765
|
+
resource_state.ignored_deletion = false;
|
766
|
+
}
|
859
767
|
// Update resource state based on whether the resource is valid.
|
860
768
|
if (!result->resource.ok()) {
|
861
769
|
result_.errors.emplace_back(absl::StrCat(
|
@@ -913,51 +821,30 @@ XdsClient::ChannelState::AdsCallState::AdsCallState(
|
|
913
821
|
? "AdsCallState"
|
914
822
|
: nullptr),
|
915
823
|
parent_(std::move(parent)) {
|
916
|
-
// Init the ADS call. Note that the call will progress every time there's
|
917
|
-
// activity in xds_client()->interested_parties_, which is comprised of
|
918
|
-
// the polling entities from client_channel.
|
919
824
|
GPR_ASSERT(xds_client() != nullptr);
|
920
|
-
//
|
825
|
+
// Init the ADS call.
|
921
826
|
const char* method =
|
922
827
|
chand()->server_.ShouldUseV3()
|
923
828
|
? "/envoy.service.discovery.v3.AggregatedDiscoveryService/"
|
924
829
|
"StreamAggregatedResources"
|
925
830
|
: "/envoy.service.discovery.v2.AggregatedDiscoveryService/"
|
926
831
|
"StreamAggregatedResources";
|
927
|
-
call_ =
|
928
|
-
|
929
|
-
|
930
|
-
|
931
|
-
|
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)));
|
932
837
|
GPR_ASSERT(call_ != nullptr);
|
933
|
-
// Init data associated with the call.
|
934
|
-
grpc_metadata_array_init(&initial_metadata_recv_);
|
935
|
-
grpc_metadata_array_init(&trailing_metadata_recv_);
|
936
838
|
// Start the call.
|
937
839
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
938
840
|
gpr_log(GPR_INFO,
|
939
841
|
"[xds_client %p] xds server %s: starting ADS call "
|
940
842
|
"(calld: %p, call: %p)",
|
941
|
-
xds_client(), chand()->server_.server_uri.c_str(), this,
|
942
|
-
|
943
|
-
|
944
|
-
|
945
|
-
|
946
|
-
memset(ops, 0, sizeof(ops));
|
947
|
-
// Op: send initial metadata.
|
948
|
-
grpc_op* op = ops;
|
949
|
-
op->op = GRPC_OP_SEND_INITIAL_METADATA;
|
950
|
-
op->data.send_initial_metadata.count = 0;
|
951
|
-
op->flags = GRPC_INITIAL_METADATA_WAIT_FOR_READY |
|
952
|
-
GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET;
|
953
|
-
op->reserved = nullptr;
|
954
|
-
op++;
|
955
|
-
call_error = grpc_call_start_batch_and_execute(
|
956
|
-
call_, ops, static_cast<size_t>(op - ops), nullptr);
|
957
|
-
GPR_ASSERT(GRPC_CALL_OK == call_error);
|
958
|
-
// Op: send request message.
|
959
|
-
GRPC_CLOSURE_INIT(&on_request_sent_, OnRequestSent, this,
|
960
|
-
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.
|
961
848
|
for (const auto& a : xds_client()->authority_state_map_) {
|
962
849
|
const std::string& authority = a.first;
|
963
850
|
// Skip authorities that are not using this xDS channel.
|
@@ -970,86 +857,34 @@ XdsClient::ChannelState::AdsCallState::AdsCallState(
|
|
970
857
|
}
|
971
858
|
}
|
972
859
|
}
|
860
|
+
// Send initial message if we added any subscriptions above.
|
973
861
|
for (const auto& p : state_map_) {
|
974
862
|
SendMessageLocked(p.first);
|
975
863
|
}
|
976
|
-
// Op: recv initial metadata.
|
977
|
-
op = ops;
|
978
|
-
op->op = GRPC_OP_RECV_INITIAL_METADATA;
|
979
|
-
op->data.recv_initial_metadata.recv_initial_metadata =
|
980
|
-
&initial_metadata_recv_;
|
981
|
-
op->flags = 0;
|
982
|
-
op->reserved = nullptr;
|
983
|
-
op++;
|
984
|
-
// Op: recv response.
|
985
|
-
op->op = GRPC_OP_RECV_MESSAGE;
|
986
|
-
op->data.recv_message.recv_message = &recv_message_payload_;
|
987
|
-
op->flags = 0;
|
988
|
-
op->reserved = nullptr;
|
989
|
-
op++;
|
990
|
-
Ref(DEBUG_LOCATION, "ADS+OnResponseReceivedLocked").release();
|
991
|
-
GRPC_CLOSURE_INIT(&on_response_received_, OnResponseReceived, this,
|
992
|
-
grpc_schedule_on_exec_ctx);
|
993
|
-
call_error = grpc_call_start_batch_and_execute(
|
994
|
-
call_, ops, static_cast<size_t>(op - ops), &on_response_received_);
|
995
|
-
GPR_ASSERT(GRPC_CALL_OK == call_error);
|
996
|
-
// Op: recv server status.
|
997
|
-
op = ops;
|
998
|
-
op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
|
999
|
-
op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv_;
|
1000
|
-
op->data.recv_status_on_client.status = &status_code_;
|
1001
|
-
op->data.recv_status_on_client.status_details = &status_details_;
|
1002
|
-
op->flags = 0;
|
1003
|
-
op->reserved = nullptr;
|
1004
|
-
op++;
|
1005
|
-
// This callback signals the end of the call, so it relies on the initial
|
1006
|
-
// ref instead of a new ref. When it's invoked, it's the initial ref that is
|
1007
|
-
// unreffed.
|
1008
|
-
GRPC_CLOSURE_INIT(&on_status_received_, OnStatusReceived, this,
|
1009
|
-
grpc_schedule_on_exec_ctx);
|
1010
|
-
call_error = grpc_call_start_batch_and_execute(
|
1011
|
-
call_, ops, static_cast<size_t>(op - ops), &on_status_received_);
|
1012
|
-
GPR_ASSERT(GRPC_CALL_OK == call_error);
|
1013
|
-
}
|
1014
|
-
|
1015
|
-
XdsClient::ChannelState::AdsCallState::~AdsCallState() {
|
1016
|
-
grpc_metadata_array_destroy(&initial_metadata_recv_);
|
1017
|
-
grpc_metadata_array_destroy(&trailing_metadata_recv_);
|
1018
|
-
grpc_byte_buffer_destroy(send_message_payload_);
|
1019
|
-
grpc_byte_buffer_destroy(recv_message_payload_);
|
1020
|
-
grpc_slice_unref_internal(status_details_);
|
1021
|
-
GPR_ASSERT(call_ != nullptr);
|
1022
|
-
grpc_call_unref(call_);
|
1023
864
|
}
|
1024
865
|
|
1025
866
|
void XdsClient::ChannelState::AdsCallState::Orphan() {
|
1026
|
-
GPR_ASSERT(call_ != nullptr);
|
1027
|
-
// If we are here because xds_client wants to cancel the call,
|
1028
|
-
// on_status_received_ will complete the cancellation and clean up. Otherwise,
|
1029
|
-
// we are here because xds_client has to orphan a failed call, then the
|
1030
|
-
// following cancellation will be a no-op.
|
1031
|
-
grpc_call_cancel_internal(call_);
|
1032
867
|
state_map_.clear();
|
1033
|
-
// Note that the initial ref is
|
1034
|
-
//
|
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();
|
1035
872
|
}
|
1036
873
|
|
1037
874
|
void XdsClient::ChannelState::AdsCallState::SendMessageLocked(
|
1038
875
|
const XdsResourceType* type)
|
1039
876
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
|
1040
877
|
// Buffer message sending if an existing message is in flight.
|
1041
|
-
if (
|
878
|
+
if (send_message_pending_) {
|
1042
879
|
buffered_requests_.insert(type);
|
1043
880
|
return;
|
1044
881
|
}
|
1045
882
|
auto& state = state_map_[type];
|
1046
|
-
|
1047
|
-
request_payload_slice = xds_client()->api_.CreateAdsRequest(
|
883
|
+
std::string serialized_message = xds_client()->api_.CreateAdsRequest(
|
1048
884
|
chand()->server_,
|
1049
885
|
chand()->server_.ShouldUseV3() ? type->type_url() : type->v2_type_url(),
|
1050
886
|
chand()->resource_type_version_map_[type], state.nonce,
|
1051
|
-
ResourceNamesForRequest(type),
|
1052
|
-
!sent_initial_message_);
|
887
|
+
ResourceNamesForRequest(type), state.status, !sent_initial_message_);
|
1053
888
|
sent_initial_message_ = true;
|
1054
889
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1055
890
|
gpr_log(GPR_INFO,
|
@@ -1058,32 +893,11 @@ void XdsClient::ChannelState::AdsCallState::SendMessageLocked(
|
|
1058
893
|
xds_client(), chand()->server_.server_uri.c_str(),
|
1059
894
|
std::string(type->type_url()).c_str(),
|
1060
895
|
chand()->resource_type_version_map_[type].c_str(),
|
1061
|
-
state.nonce.c_str(),
|
1062
|
-
}
|
1063
|
-
GRPC_ERROR_UNREF(state.error);
|
1064
|
-
state.error = GRPC_ERROR_NONE;
|
1065
|
-
// Create message payload.
|
1066
|
-
send_message_payload_ =
|
1067
|
-
grpc_raw_byte_buffer_create(&request_payload_slice, 1);
|
1068
|
-
grpc_slice_unref_internal(request_payload_slice);
|
1069
|
-
// Send the message.
|
1070
|
-
grpc_op op;
|
1071
|
-
memset(&op, 0, sizeof(op));
|
1072
|
-
op.op = GRPC_OP_SEND_MESSAGE;
|
1073
|
-
op.data.send_message.send_message = send_message_payload_;
|
1074
|
-
Ref(DEBUG_LOCATION, "ADS+OnRequestSentLocked").release();
|
1075
|
-
GRPC_CLOSURE_INIT(&on_request_sent_, OnRequestSent, this,
|
1076
|
-
grpc_schedule_on_exec_ctx);
|
1077
|
-
grpc_call_error call_error =
|
1078
|
-
grpc_call_start_batch_and_execute(call_, &op, 1, &on_request_sent_);
|
1079
|
-
if (GPR_UNLIKELY(call_error != GRPC_CALL_OK)) {
|
1080
|
-
gpr_log(GPR_ERROR,
|
1081
|
-
"[xds_client %p] xds server %s: error starting ADS send_message "
|
1082
|
-
"batch on calld=%p: call_error=%d",
|
1083
|
-
xds_client(), chand()->server_.server_uri.c_str(), this,
|
1084
|
-
call_error);
|
1085
|
-
GPR_ASSERT(GRPC_CALL_OK == call_error);
|
896
|
+
state.nonce.c_str(), state.status.ToString().c_str());
|
1086
897
|
}
|
898
|
+
state.status = absl::OkStatus();
|
899
|
+
call_->SendMessage(std::move(serialized_message));
|
900
|
+
send_message_pending_ = true;
|
1087
901
|
}
|
1088
902
|
|
1089
903
|
void XdsClient::ChannelState::AdsCallState::SubscribeLocked(
|
@@ -1114,22 +928,10 @@ bool XdsClient::ChannelState::AdsCallState::HasSubscribedResources() const {
|
|
1114
928
|
return false;
|
1115
929
|
}
|
1116
930
|
|
1117
|
-
void XdsClient::ChannelState::AdsCallState::OnRequestSent(
|
1118
|
-
|
1119
|
-
|
1120
|
-
{
|
1121
|
-
MutexLock lock(&ads_calld->xds_client()->mu_);
|
1122
|
-
ads_calld->OnRequestSentLocked(GRPC_ERROR_REF(error));
|
1123
|
-
}
|
1124
|
-
ads_calld->Unref(DEBUG_LOCATION, "ADS+OnRequestSentLocked");
|
1125
|
-
}
|
1126
|
-
|
1127
|
-
void XdsClient::ChannelState::AdsCallState::OnRequestSentLocked(
|
1128
|
-
grpc_error_handle error) {
|
1129
|
-
if (IsCurrentCallOnChannel() && error == GRPC_ERROR_NONE) {
|
1130
|
-
// Clean up the sent message.
|
1131
|
-
grpc_byte_buffer_destroy(send_message_payload_);
|
1132
|
-
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()) {
|
1133
935
|
// Continue to send another pending message if any.
|
1134
936
|
// TODO(roth): The current code to handle buffered messages has the
|
1135
937
|
// advantage of sending only the most recent list of resource names for
|
@@ -1145,170 +947,135 @@ void XdsClient::ChannelState::AdsCallState::OnRequestSentLocked(
|
|
1145
947
|
buffered_requests_.erase(it);
|
1146
948
|
}
|
1147
949
|
}
|
1148
|
-
GRPC_ERROR_UNREF(error);
|
1149
950
|
}
|
1150
951
|
|
1151
|
-
void XdsClient::ChannelState::AdsCallState::
|
1152
|
-
|
1153
|
-
AdsCallState* ads_calld = static_cast<AdsCallState*>(arg);
|
1154
|
-
bool done;
|
952
|
+
void XdsClient::ChannelState::AdsCallState::OnRecvMessage(
|
953
|
+
absl::string_view payload) {
|
1155
954
|
{
|
1156
|
-
MutexLock lock(&
|
1157
|
-
|
1158
|
-
|
1159
|
-
|
1160
|
-
|
1161
|
-
|
1162
|
-
|
1163
|
-
|
1164
|
-
|
1165
|
-
|
1166
|
-
|
1167
|
-
|
1168
|
-
|
1169
|
-
|
1170
|
-
|
1171
|
-
|
1172
|
-
|
1173
|
-
|
1174
|
-
|
1175
|
-
|
1176
|
-
|
1177
|
-
|
1178
|
-
|
1179
|
-
|
1180
|
-
|
1181
|
-
|
1182
|
-
|
1183
|
-
|
1184
|
-
|
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
|
-
// instead.
|
1233
|
-
if (resource_state.resource == nullptr) continue;
|
1234
|
-
resource_state.resource.reset();
|
1235
|
-
xds_client()->NotifyWatchersOnResourceDoesNotExist(
|
1236
|
-
resource_state.watchers);
|
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);
|
1029
|
+
}
|
1030
|
+
}
|
1237
1031
|
}
|
1238
1032
|
}
|
1239
1033
|
}
|
1240
|
-
|
1241
|
-
|
1242
|
-
|
1243
|
-
|
1244
|
-
|
1245
|
-
|
1246
|
-
|
1247
|
-
|
1248
|
-
|
1249
|
-
|
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
|
+
}
|
1250
1044
|
}
|
1045
|
+
// Send ACK or NACK.
|
1046
|
+
SendMessageLocked(result.type);
|
1251
1047
|
}
|
1252
|
-
|
1253
|
-
|
1254
|
-
}
|
1255
|
-
if (xds_client()->shutting_down_) return true;
|
1256
|
-
// Keep listening for updates.
|
1257
|
-
grpc_op op;
|
1258
|
-
memset(&op, 0, sizeof(op));
|
1259
|
-
op.op = GRPC_OP_RECV_MESSAGE;
|
1260
|
-
op.data.recv_message.recv_message = &recv_message_payload_;
|
1261
|
-
op.flags = 0;
|
1262
|
-
op.reserved = nullptr;
|
1263
|
-
GPR_ASSERT(call_ != nullptr);
|
1264
|
-
// Reuse the "ADS+OnResponseReceivedLocked" ref taken in ctor.
|
1265
|
-
const grpc_call_error call_error =
|
1266
|
-
grpc_call_start_batch_and_execute(call_, &op, 1, &on_response_received_);
|
1267
|
-
GPR_ASSERT(GRPC_CALL_OK == call_error);
|
1268
|
-
return false;
|
1048
|
+
}
|
1049
|
+
xds_client()->work_serializer_.DrainQueue();
|
1269
1050
|
}
|
1270
1051
|
|
1271
1052
|
void XdsClient::ChannelState::AdsCallState::OnStatusReceived(
|
1272
|
-
|
1273
|
-
AdsCallState* ads_calld = static_cast<AdsCallState*>(arg);
|
1053
|
+
absl::Status status) {
|
1274
1054
|
{
|
1275
|
-
MutexLock lock(&
|
1276
|
-
|
1277
|
-
|
1278
|
-
|
1279
|
-
|
1280
|
-
|
1281
|
-
|
1282
|
-
|
1283
|
-
|
1284
|
-
|
1285
|
-
|
1286
|
-
|
1287
|
-
|
1288
|
-
|
1289
|
-
|
1290
|
-
|
1291
|
-
|
1292
|
-
grpc_error_std_string(error).c_str());
|
1293
|
-
gpr_free(status_details);
|
1294
|
-
}
|
1295
|
-
// Ignore status from a stale call.
|
1296
|
-
if (IsCurrentCallOnChannel()) {
|
1297
|
-
// Try to restart the call.
|
1298
|
-
parent_->OnCallFinishedLocked();
|
1299
|
-
// Send error to all watchers.
|
1300
|
-
xds_client()->NotifyOnErrorLocked(absl::UnavailableError(absl::StrFormat(
|
1301
|
-
"xDS call failed: xDS server: %s, ADS call status code=%d, "
|
1302
|
-
"details='%s', error='%s'",
|
1303
|
-
chand()->server_.server_uri, status_code_,
|
1304
|
-
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
|
+
}
|
1305
1072
|
}
|
1306
|
-
|
1073
|
+
xds_client()->work_serializer_.DrainQueue();
|
1307
1074
|
}
|
1308
1075
|
|
1309
1076
|
bool XdsClient::ChannelState::AdsCallState::IsCurrentCallOnChannel() const {
|
1310
|
-
// If the retryable ADS call is null (which only happens when the xds
|
1311
|
-
// 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.
|
1312
1079
|
if (chand()->ads_calld_ == nullptr) return false;
|
1313
1080
|
return this == chand()->ads_calld_->calld();
|
1314
1081
|
}
|
@@ -1338,38 +1105,30 @@ XdsClient::ChannelState::AdsCallState::ResourceNamesForRequest(
|
|
1338
1105
|
//
|
1339
1106
|
|
1340
1107
|
void XdsClient::ChannelState::LrsCallState::Reporter::Orphan() {
|
1341
|
-
if (
|
1342
|
-
|
1108
|
+
if (timer_handle_.has_value() &&
|
1109
|
+
GetDefaultEventEngine()->Cancel(*timer_handle_)) {
|
1110
|
+
timer_handle_.reset();
|
1111
|
+
Unref(DEBUG_LOCATION, "Orphan");
|
1343
1112
|
}
|
1344
1113
|
}
|
1345
1114
|
|
1346
1115
|
void XdsClient::ChannelState::LrsCallState::Reporter::
|
1347
1116
|
ScheduleNextReportLocked() {
|
1348
|
-
|
1349
|
-
|
1350
|
-
|
1351
|
-
|
1352
|
-
|
1353
|
-
|
1354
|
-
|
1355
|
-
void* arg, grpc_error_handle error) {
|
1356
|
-
Reporter* self = static_cast<Reporter*>(arg);
|
1357
|
-
bool done;
|
1358
|
-
{
|
1359
|
-
MutexLock lock(&self->xds_client()->mu_);
|
1360
|
-
done = self->OnNextReportTimerLocked(GRPC_ERROR_REF(error));
|
1361
|
-
}
|
1362
|
-
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
|
+
});
|
1363
1124
|
}
|
1364
1125
|
|
1365
|
-
bool XdsClient::ChannelState::LrsCallState::Reporter::
|
1366
|
-
|
1367
|
-
|
1368
|
-
if (
|
1369
|
-
|
1370
|
-
|
1371
|
-
}
|
1372
|
-
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;
|
1373
1132
|
}
|
1374
1133
|
|
1375
1134
|
namespace {
|
@@ -1409,65 +1168,34 @@ bool XdsClient::ChannelState::LrsCallState::Reporter::SendReportLocked() {
|
|
1409
1168
|
ScheduleNextReportLocked();
|
1410
1169
|
return false;
|
1411
1170
|
}
|
1412
|
-
//
|
1413
|
-
|
1171
|
+
// Send a request that contains the snapshot.
|
1172
|
+
std::string serialized_payload =
|
1414
1173
|
xds_client()->api_.CreateLrsRequest(std::move(snapshot));
|
1415
|
-
parent_->
|
1416
|
-
|
1417
|
-
grpc_slice_unref_internal(request_payload_slice);
|
1418
|
-
// Send the report.
|
1419
|
-
grpc_op op;
|
1420
|
-
memset(&op, 0, sizeof(op));
|
1421
|
-
op.op = GRPC_OP_SEND_MESSAGE;
|
1422
|
-
op.data.send_message.send_message = parent_->send_message_payload_;
|
1423
|
-
grpc_call_error call_error = grpc_call_start_batch_and_execute(
|
1424
|
-
parent_->call_, &op, 1, &on_report_done_);
|
1425
|
-
if (GPR_UNLIKELY(call_error != GRPC_CALL_OK)) {
|
1426
|
-
gpr_log(GPR_ERROR,
|
1427
|
-
"[xds_client %p] xds server %s: error starting LRS send_message "
|
1428
|
-
"batch on calld=%p: call_error=%d",
|
1429
|
-
xds_client(), parent_->chand()->server_.server_uri.c_str(), this,
|
1430
|
-
call_error);
|
1431
|
-
GPR_ASSERT(GRPC_CALL_OK == call_error);
|
1432
|
-
}
|
1174
|
+
parent_->call_->SendMessage(std::move(serialized_payload));
|
1175
|
+
parent_->send_message_pending_ = true;
|
1433
1176
|
return false;
|
1434
1177
|
}
|
1435
1178
|
|
1436
|
-
void XdsClient::ChannelState::LrsCallState::Reporter::
|
1437
|
-
|
1438
|
-
|
1439
|
-
|
1440
|
-
|
1441
|
-
|
1442
|
-
|
1443
|
-
|
1444
|
-
if (done) self->Unref(DEBUG_LOCATION, "Reporter+report_done");
|
1445
|
-
}
|
1446
|
-
|
1447
|
-
bool XdsClient::ChannelState::LrsCallState::Reporter::OnReportDoneLocked(
|
1448
|
-
grpc_error_handle error) {
|
1449
|
-
grpc_byte_buffer_destroy(parent_->send_message_payload_);
|
1450
|
-
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;
|
1451
1187
|
// If there are no more registered stats to report, cancel the call.
|
1452
1188
|
auto it =
|
1453
1189
|
xds_client()->xds_load_report_server_map_.find(parent_->chand()->server_);
|
1454
|
-
if (it == xds_client()->xds_load_report_server_map_.end()
|
1455
|
-
|
1456
|
-
it->second.channel_state
|
1457
|
-
|
1458
|
-
return true;
|
1459
|
-
}
|
1460
|
-
if (error != GRPC_ERROR_NONE || !IsCurrentReporterOnCall()) {
|
1461
|
-
GRPC_ERROR_UNREF(error);
|
1462
|
-
// If this reporter is no longer the current one on the call, the reason
|
1463
|
-
// might be that it was orphaned for a new one due to config update.
|
1464
|
-
if (!IsCurrentReporterOnCall()) {
|
1465
|
-
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();
|
1466
1194
|
}
|
1467
|
-
return
|
1195
|
+
return;
|
1468
1196
|
}
|
1197
|
+
// Otherwise, schedule the next load report.
|
1469
1198
|
ScheduleNextReportLocked();
|
1470
|
-
return false;
|
1471
1199
|
}
|
1472
1200
|
|
1473
1201
|
//
|
@@ -1485,124 +1213,46 @@ XdsClient::ChannelState::LrsCallState::LrsCallState(
|
|
1485
1213
|
// activity in xds_client()->interested_parties_, which is comprised of
|
1486
1214
|
// the polling entities from client_channel.
|
1487
1215
|
GPR_ASSERT(xds_client() != nullptr);
|
1488
|
-
const char* method =
|
1489
|
-
|
1490
|
-
|
1491
|
-
|
1492
|
-
|
1493
|
-
|
1494
|
-
|
1495
|
-
|
1496
|
-
|
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)));
|
1497
1226
|
GPR_ASSERT(call_ != nullptr);
|
1498
|
-
// Init the request payload.
|
1499
|
-
grpc_slice request_payload_slice =
|
1500
|
-
xds_client()->api_.CreateLrsInitialRequest(chand()->server_);
|
1501
|
-
send_message_payload_ =
|
1502
|
-
grpc_raw_byte_buffer_create(&request_payload_slice, 1);
|
1503
|
-
grpc_slice_unref_internal(request_payload_slice);
|
1504
|
-
// Init other data associated with the LRS call.
|
1505
|
-
grpc_metadata_array_init(&initial_metadata_recv_);
|
1506
|
-
grpc_metadata_array_init(&trailing_metadata_recv_);
|
1507
1227
|
// Start the call.
|
1508
1228
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1509
|
-
gpr_log(
|
1510
|
-
|
1511
|
-
|
1512
|
-
|
1513
|
-
|
1514
|
-
|
1515
|
-
|
1516
|
-
|
1517
|
-
|
1518
|
-
|
1519
|
-
|
1520
|
-
op->op = GRPC_OP_SEND_INITIAL_METADATA;
|
1521
|
-
op->data.send_initial_metadata.count = 0;
|
1522
|
-
op->flags = GRPC_INITIAL_METADATA_WAIT_FOR_READY |
|
1523
|
-
GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET;
|
1524
|
-
op->reserved = nullptr;
|
1525
|
-
op++;
|
1526
|
-
// Op: send request message.
|
1527
|
-
GPR_ASSERT(send_message_payload_ != nullptr);
|
1528
|
-
op->op = GRPC_OP_SEND_MESSAGE;
|
1529
|
-
op->data.send_message.send_message = send_message_payload_;
|
1530
|
-
op->flags = 0;
|
1531
|
-
op->reserved = nullptr;
|
1532
|
-
op++;
|
1533
|
-
Ref(DEBUG_LOCATION, "LRS+OnInitialRequestSentLocked").release();
|
1534
|
-
GRPC_CLOSURE_INIT(&on_initial_request_sent_, OnInitialRequestSent, this,
|
1535
|
-
grpc_schedule_on_exec_ctx);
|
1536
|
-
call_error = grpc_call_start_batch_and_execute(
|
1537
|
-
call_, ops, static_cast<size_t>(op - ops), &on_initial_request_sent_);
|
1538
|
-
GPR_ASSERT(GRPC_CALL_OK == call_error);
|
1539
|
-
// Op: recv initial metadata.
|
1540
|
-
op = ops;
|
1541
|
-
op->op = GRPC_OP_RECV_INITIAL_METADATA;
|
1542
|
-
op->data.recv_initial_metadata.recv_initial_metadata =
|
1543
|
-
&initial_metadata_recv_;
|
1544
|
-
op->flags = 0;
|
1545
|
-
op->reserved = nullptr;
|
1546
|
-
op++;
|
1547
|
-
// Op: recv response.
|
1548
|
-
op->op = GRPC_OP_RECV_MESSAGE;
|
1549
|
-
op->data.recv_message.recv_message = &recv_message_payload_;
|
1550
|
-
op->flags = 0;
|
1551
|
-
op->reserved = nullptr;
|
1552
|
-
op++;
|
1553
|
-
Ref(DEBUG_LOCATION, "LRS+OnResponseReceivedLocked").release();
|
1554
|
-
GRPC_CLOSURE_INIT(&on_response_received_, OnResponseReceived, this,
|
1555
|
-
grpc_schedule_on_exec_ctx);
|
1556
|
-
call_error = grpc_call_start_batch_and_execute(
|
1557
|
-
call_, ops, static_cast<size_t>(op - ops), &on_response_received_);
|
1558
|
-
GPR_ASSERT(GRPC_CALL_OK == call_error);
|
1559
|
-
// Op: recv server status.
|
1560
|
-
op = ops;
|
1561
|
-
op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
|
1562
|
-
op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv_;
|
1563
|
-
op->data.recv_status_on_client.status = &status_code_;
|
1564
|
-
op->data.recv_status_on_client.status_details = &status_details_;
|
1565
|
-
op->flags = 0;
|
1566
|
-
op->reserved = nullptr;
|
1567
|
-
op++;
|
1568
|
-
// This callback signals the end of the call, so it relies on the initial
|
1569
|
-
// ref instead of a new ref. When it's invoked, it's the initial ref that is
|
1570
|
-
// unreffed.
|
1571
|
-
GRPC_CLOSURE_INIT(&on_status_received_, OnStatusReceived, this,
|
1572
|
-
grpc_schedule_on_exec_ctx);
|
1573
|
-
call_error = grpc_call_start_batch_and_execute(
|
1574
|
-
call_, ops, static_cast<size_t>(op - ops), &on_status_received_);
|
1575
|
-
GPR_ASSERT(GRPC_CALL_OK == call_error);
|
1576
|
-
}
|
1577
|
-
|
1578
|
-
XdsClient::ChannelState::LrsCallState::~LrsCallState() {
|
1579
|
-
grpc_metadata_array_destroy(&initial_metadata_recv_);
|
1580
|
-
grpc_metadata_array_destroy(&trailing_metadata_recv_);
|
1581
|
-
grpc_byte_buffer_destroy(send_message_payload_);
|
1582
|
-
grpc_byte_buffer_destroy(recv_message_payload_);
|
1583
|
-
grpc_slice_unref_internal(status_details_);
|
1584
|
-
GPR_ASSERT(call_ != nullptr);
|
1585
|
-
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;
|
1586
1240
|
}
|
1587
1241
|
|
1588
1242
|
void XdsClient::ChannelState::LrsCallState::Orphan() {
|
1589
1243
|
reporter_.reset();
|
1590
|
-
|
1591
|
-
//
|
1592
|
-
//
|
1593
|
-
|
1594
|
-
// following cancellation will be a no-op.
|
1595
|
-
grpc_call_cancel_internal(call_);
|
1596
|
-
// Note that the initial ref is hold by on_status_received_. So the
|
1597
|
-
// 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();
|
1598
1248
|
}
|
1599
1249
|
|
1600
1250
|
void XdsClient::ChannelState::LrsCallState::MaybeStartReportingLocked() {
|
1601
1251
|
// Don't start again if already started.
|
1602
1252
|
if (reporter_ != nullptr) return;
|
1603
|
-
// Don't start if the previous send_message op (of the initial request or
|
1604
|
-
// last report of the previous reporter) hasn't completed.
|
1605
|
-
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;
|
1606
1256
|
// Don't start if no LRS response has arrived.
|
1607
1257
|
if (!seen_response()) return;
|
1608
1258
|
// Don't start if the ADS call hasn't received any valid response. Note that
|
@@ -1618,166 +1268,105 @@ void XdsClient::ChannelState::LrsCallState::MaybeStartReportingLocked() {
|
|
1618
1268
|
Ref(DEBUG_LOCATION, "LRS+load_report+start"), load_reporting_interval_);
|
1619
1269
|
}
|
1620
1270
|
|
1621
|
-
void XdsClient::ChannelState::LrsCallState::
|
1622
|
-
|
1623
|
-
|
1624
|
-
{
|
1625
|
-
|
1626
|
-
|
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();
|
1627
1278
|
}
|
1628
|
-
lrs_calld->Unref(DEBUG_LOCATION, "LRS+OnInitialRequestSentLocked");
|
1629
|
-
}
|
1630
|
-
|
1631
|
-
void XdsClient::ChannelState::LrsCallState::OnInitialRequestSentLocked() {
|
1632
|
-
// Clear the send_message_payload_.
|
1633
|
-
grpc_byte_buffer_destroy(send_message_payload_);
|
1634
|
-
send_message_payload_ = nullptr;
|
1635
|
-
MaybeStartReportingLocked();
|
1636
1279
|
}
|
1637
1280
|
|
1638
|
-
void XdsClient::ChannelState::LrsCallState::
|
1639
|
-
|
1640
|
-
|
1641
|
-
|
1642
|
-
|
1643
|
-
|
1644
|
-
|
1645
|
-
|
1646
|
-
|
1647
|
-
|
1648
|
-
|
1649
|
-
|
1650
|
-
|
1651
|
-
|
1652
|
-
|
1653
|
-
|
1654
|
-
|
1655
|
-
|
1656
|
-
|
1657
|
-
|
1658
|
-
|
1659
|
-
|
1660
|
-
|
1661
|
-
|
1662
|
-
|
1663
|
-
|
1664
|
-
|
1665
|
-
|
1666
|
-
|
1667
|
-
|
1668
|
-
|
1669
|
-
|
1670
|
-
|
1671
|
-
gpr_log(GPR_ERROR,
|
1672
|
-
"[xds_client %p] xds server %s: LRS response parsing failed: %s",
|
1673
|
-
xds_client(), chand()->server_.server_uri.c_str(),
|
1674
|
-
grpc_error_std_string(parse_error).c_str());
|
1675
|
-
GRPC_ERROR_UNREF(parse_error);
|
1676
|
-
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());
|
1677
1314
|
}
|
1678
|
-
|
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);
|
1679
1320
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1680
|
-
gpr_log(
|
1681
|
-
|
1682
|
-
|
1683
|
-
|
1684
|
-
|
1685
|
-
xds_client(), chand()->server_.server_uri.c_str(),
|
1686
|
-
new_cluster_names.size(), send_all_clusters,
|
1687
|
-
new_load_reporting_interval.millis());
|
1688
|
-
size_t i = 0;
|
1689
|
-
for (const auto& name : new_cluster_names) {
|
1690
|
-
gpr_log(GPR_INFO, "[xds_client %p] cluster_name %" PRIuPTR ": %s",
|
1691
|
-
xds_client(), i++, name.c_str());
|
1692
|
-
}
|
1693
|
-
}
|
1694
|
-
if (new_load_reporting_interval <
|
1695
|
-
Duration::Milliseconds(
|
1696
|
-
GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS)) {
|
1697
|
-
new_load_reporting_interval = Duration::Milliseconds(
|
1698
|
-
GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS);
|
1699
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1700
|
-
gpr_log(GPR_INFO,
|
1701
|
-
"[xds_client %p] xds server %s: increased load_report_interval "
|
1702
|
-
"to minimum value %dms",
|
1703
|
-
xds_client(), chand()->server_.server_uri.c_str(),
|
1704
|
-
GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS);
|
1705
|
-
}
|
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);
|
1706
1326
|
}
|
1707
|
-
|
1708
|
-
|
1709
|
-
|
1710
|
-
|
1711
|
-
|
1712
|
-
|
1713
|
-
|
1714
|
-
|
1715
|
-
|
1716
|
-
|
1717
|
-
}
|
1718
|
-
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());
|
1719
1337
|
}
|
1720
|
-
|
1721
|
-
reporter_.reset();
|
1722
|
-
// Record the new config.
|
1723
|
-
send_all_clusters_ = send_all_clusters;
|
1724
|
-
cluster_names_ = std::move(new_cluster_names);
|
1725
|
-
load_reporting_interval_ = new_load_reporting_interval;
|
1726
|
-
// Try starting sending load report.
|
1727
|
-
MaybeStartReportingLocked();
|
1728
|
-
}();
|
1729
|
-
grpc_slice_unref_internal(response_slice);
|
1730
|
-
if (xds_client()->shutting_down_) return true;
|
1731
|
-
// Keep listening for LRS config updates.
|
1732
|
-
grpc_op op;
|
1733
|
-
memset(&op, 0, sizeof(op));
|
1734
|
-
op.op = GRPC_OP_RECV_MESSAGE;
|
1735
|
-
op.data.recv_message.recv_message = &recv_message_payload_;
|
1736
|
-
op.flags = 0;
|
1737
|
-
op.reserved = nullptr;
|
1738
|
-
GPR_ASSERT(call_ != nullptr);
|
1739
|
-
// Reuse the "OnResponseReceivedLocked" ref taken in ctor.
|
1740
|
-
const grpc_call_error call_error =
|
1741
|
-
grpc_call_start_batch_and_execute(call_, &op, 1, &on_response_received_);
|
1742
|
-
GPR_ASSERT(GRPC_CALL_OK == call_error);
|
1743
|
-
return false;
|
1744
|
-
}
|
1745
|
-
|
1746
|
-
void XdsClient::ChannelState::LrsCallState::OnStatusReceived(
|
1747
|
-
void* arg, grpc_error_handle error) {
|
1748
|
-
LrsCallState* lrs_calld = static_cast<LrsCallState*>(arg);
|
1749
|
-
{
|
1750
|
-
MutexLock lock(&lrs_calld->xds_client()->mu_);
|
1751
|
-
lrs_calld->OnStatusReceivedLocked(GRPC_ERROR_REF(error));
|
1338
|
+
return;
|
1752
1339
|
}
|
1753
|
-
|
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();
|
1754
1348
|
}
|
1755
1349
|
|
1756
|
-
void XdsClient::ChannelState::LrsCallState::
|
1757
|
-
|
1758
|
-
|
1350
|
+
void XdsClient::ChannelState::LrsCallState::OnStatusReceived(
|
1351
|
+
absl::Status status) {
|
1352
|
+
MutexLock lock(&xds_client()->mu_);
|
1759
1353
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1760
|
-
char* status_details = grpc_slice_to_c_string(status_details_);
|
1761
1354
|
gpr_log(GPR_INFO,
|
1762
1355
|
"[xds_client %p] xds server %s: LRS call status received "
|
1763
|
-
"(chand=%p, calld=%p, call=%p): "
|
1764
|
-
"status=%d, details='%s', error='%s'",
|
1356
|
+
"(chand=%p, calld=%p, call=%p): %s",
|
1765
1357
|
xds_client(), chand()->server_.server_uri.c_str(), chand(), this,
|
1766
|
-
call_,
|
1767
|
-
grpc_error_std_string(error).c_str());
|
1768
|
-
gpr_free(status_details);
|
1358
|
+
call_.get(), status.ToString().c_str());
|
1769
1359
|
}
|
1770
1360
|
// Ignore status from a stale call.
|
1771
1361
|
if (IsCurrentCallOnChannel()) {
|
1772
1362
|
// Try to restart the call.
|
1773
1363
|
parent_->OnCallFinishedLocked();
|
1774
1364
|
}
|
1775
|
-
GRPC_ERROR_UNREF(error);
|
1776
1365
|
}
|
1777
1366
|
|
1778
1367
|
bool XdsClient::ChannelState::LrsCallState::IsCurrentCallOnChannel() const {
|
1779
|
-
// If the retryable LRS call is null (which only happens when the xds
|
1780
|
-
// 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.
|
1781
1370
|
if (chand()->lrs_calld_ == nullptr) return false;
|
1782
1371
|
return this == chand()->lrs_calld_->calld();
|
1783
1372
|
}
|
@@ -1786,81 +1375,51 @@ bool XdsClient::ChannelState::LrsCallState::IsCurrentCallOnChannel() const {
|
|
1786
1375
|
// XdsClient
|
1787
1376
|
//
|
1788
1377
|
|
1789
|
-
namespace {
|
1790
|
-
|
1791
|
-
Duration GetRequestTimeout(const grpc_channel_args* args) {
|
1792
|
-
return Duration::Milliseconds(grpc_channel_args_find_integer(
|
1793
|
-
args, GRPC_ARG_XDS_RESOURCE_DOES_NOT_EXIST_TIMEOUT_MS,
|
1794
|
-
{15000, 0, INT_MAX}));
|
1795
|
-
}
|
1796
|
-
|
1797
|
-
grpc_channel_args* ModifyChannelArgs(const grpc_channel_args* args) {
|
1798
|
-
absl::InlinedVector<grpc_arg, 1> args_to_add = {
|
1799
|
-
grpc_channel_arg_integer_create(
|
1800
|
-
const_cast<char*>(GRPC_ARG_KEEPALIVE_TIME_MS),
|
1801
|
-
5 * 60 * GPR_MS_PER_SEC),
|
1802
|
-
};
|
1803
|
-
return grpc_channel_args_copy_and_add(args, args_to_add.data(),
|
1804
|
-
args_to_add.size());
|
1805
|
-
}
|
1806
|
-
|
1807
|
-
} // namespace
|
1808
|
-
|
1809
1378
|
XdsClient::XdsClient(std::unique_ptr<XdsBootstrap> bootstrap,
|
1810
|
-
|
1379
|
+
OrphanablePtr<XdsTransportFactory> transport_factory,
|
1380
|
+
Duration resource_request_timeout)
|
1811
1381
|
: DualRefCounted<XdsClient>(
|
1812
1382
|
GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_refcount_trace) ? "XdsClient"
|
1813
1383
|
: nullptr),
|
1814
1384
|
bootstrap_(std::move(bootstrap)),
|
1815
|
-
|
1816
|
-
request_timeout_(
|
1385
|
+
transport_factory_(std::move(transport_factory)),
|
1386
|
+
request_timeout_(resource_request_timeout),
|
1817
1387
|
xds_federation_enabled_(XdsFederationEnabled()),
|
1818
|
-
|
1819
|
-
certificate_provider_store_(MakeOrphanable<CertificateProviderStore>(
|
1820
|
-
bootstrap_->certificate_providers())),
|
1821
|
-
api_(this, &grpc_xds_client_trace, bootstrap_->node(),
|
1822
|
-
&bootstrap_->certificate_providers(), &symtab_) {
|
1388
|
+
api_(this, &grpc_xds_client_trace, bootstrap_->node(), &symtab_) {
|
1823
1389
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1824
1390
|
gpr_log(GPR_INFO, "[xds_client %p] creating xds client", this);
|
1825
1391
|
}
|
1826
|
-
// Calling grpc_init to ensure gRPC does not shut down until the XdsClient is
|
1827
|
-
// destroyed.
|
1828
|
-
grpc_init();
|
1829
1392
|
}
|
1830
1393
|
|
1831
1394
|
XdsClient::~XdsClient() {
|
1832
1395
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1833
1396
|
gpr_log(GPR_INFO, "[xds_client %p] destroying xds client", this);
|
1834
1397
|
}
|
1835
|
-
grpc_channel_args_destroy(args_);
|
1836
|
-
grpc_pollset_set_destroy(interested_parties_);
|
1837
|
-
// Calling grpc_shutdown to ensure gRPC does not shut down until the XdsClient
|
1838
|
-
// is destroyed.
|
1839
|
-
grpc_shutdown();
|
1840
1398
|
}
|
1841
1399
|
|
1842
1400
|
void XdsClient::Orphan() {
|
1843
1401
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
1844
1402
|
gpr_log(GPR_INFO, "[xds_client %p] shutting down xds client", this);
|
1845
1403
|
}
|
1846
|
-
|
1847
|
-
|
1848
|
-
|
1849
|
-
|
1850
|
-
|
1851
|
-
|
1852
|
-
|
1853
|
-
|
1854
|
-
|
1855
|
-
|
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()");
|
1856
1415
|
}
|
1857
1416
|
}
|
1858
1417
|
|
1859
1418
|
RefCountedPtr<XdsClient::ChannelState> XdsClient::GetOrCreateChannelStateLocked(
|
1860
|
-
const XdsBootstrap::XdsServer& server) {
|
1419
|
+
const XdsBootstrap::XdsServer& server, const char* reason) {
|
1861
1420
|
auto it = xds_server_channel_map_.find(server);
|
1862
1421
|
if (it != xds_server_channel_map_.end()) {
|
1863
|
-
return it->second->Ref(DEBUG_LOCATION,
|
1422
|
+
return it->second->Ref(DEBUG_LOCATION, reason);
|
1864
1423
|
}
|
1865
1424
|
// Channel not found, so create a new one.
|
1866
1425
|
auto channel_state = MakeRefCounted<ChannelState>(
|
@@ -1938,7 +1497,7 @@ void XdsClient::WatchResource(const XdsResourceType* type,
|
|
1938
1497
|
// needed.
|
1939
1498
|
if (authority_state.channel_state == nullptr) {
|
1940
1499
|
authority_state.channel_state =
|
1941
|
-
GetOrCreateChannelStateLocked(*xds_server);
|
1500
|
+
GetOrCreateChannelStateLocked(*xds_server, "start watch");
|
1942
1501
|
}
|
1943
1502
|
authority_state.channel_state->SubscribeLocked(type, *resource_name);
|
1944
1503
|
}
|
@@ -1971,6 +1530,13 @@ void XdsClient::CancelResourceWatch(const XdsResourceType* type,
|
|
1971
1530
|
resource_state.watchers.erase(watcher);
|
1972
1531
|
// Clean up empty map entries, if any.
|
1973
1532
|
if (resource_state.watchers.empty()) {
|
1533
|
+
if (resource_state.ignored_deletion) {
|
1534
|
+
gpr_log(GPR_INFO,
|
1535
|
+
"[xds_client %p] unsubscribing from a resource for which we "
|
1536
|
+
"previously ignored a deletion: type %s name %s",
|
1537
|
+
this, std::string(type->type_url()).c_str(),
|
1538
|
+
std::string(name).c_str());
|
1539
|
+
}
|
1974
1540
|
authority_state.channel_state->UnsubscribeLocked(type, *resource_name,
|
1975
1541
|
delay_unsubscription);
|
1976
1542
|
type_map.erase(resource_it);
|
@@ -2007,7 +1573,8 @@ const XdsResourceType* XdsClient::GetResourceTypeLocked(
|
|
2007
1573
|
absl::StatusOr<XdsClient::XdsResourceName> XdsClient::ParseXdsResourceName(
|
2008
1574
|
absl::string_view name, const XdsResourceType* type) {
|
2009
1575
|
// Old-style names use the empty string for authority.
|
2010
|
-
// 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.
|
2011
1578
|
if (!xds_federation_enabled_ || !absl::StartsWith(name, "xdstp:")) {
|
2012
1579
|
return XdsResourceName{"old:", {std::string(name), {}}};
|
2013
1580
|
}
|
@@ -2052,37 +1619,42 @@ RefCountedPtr<XdsClusterDropStats> XdsClient::AddClusterDropStats(
|
|
2052
1619
|
if (!bootstrap_->XdsServerExists(xds_server)) return nullptr;
|
2053
1620
|
auto key =
|
2054
1621
|
std::make_pair(std::string(cluster_name), std::string(eds_service_name));
|
2055
|
-
MutexLock lock(&mu_);
|
2056
|
-
// We jump through some hoops here to make sure that the const
|
2057
|
-
// XdsBootstrap::XdsServer& and absl::string_views
|
2058
|
-
// stored in the XdsClusterDropStats object point to the
|
2059
|
-
// XdsBootstrap::XdsServer and strings
|
2060
|
-
// in the load_report_map_ key, so that they have the same lifetime.
|
2061
|
-
auto server_it =
|
2062
|
-
xds_load_report_server_map_.emplace(xds_server, LoadReportServer()).first;
|
2063
|
-
if (server_it->second.channel_state == nullptr) {
|
2064
|
-
server_it->second.channel_state = GetOrCreateChannelStateLocked(xds_server);
|
2065
|
-
}
|
2066
|
-
auto load_report_it = server_it->second.load_report_map
|
2067
|
-
.emplace(std::move(key), LoadReportState())
|
2068
|
-
.first;
|
2069
|
-
LoadReportState& load_report_state = load_report_it->second;
|
2070
1622
|
RefCountedPtr<XdsClusterDropStats> cluster_drop_stats;
|
2071
|
-
|
2072
|
-
|
2073
|
-
|
2074
|
-
|
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;
|
2075
1641
|
if (load_report_state.drop_stats != nullptr) {
|
2076
|
-
load_report_state.
|
2077
|
-
|
1642
|
+
cluster_drop_stats = load_report_state.drop_stats->RefIfNonZero();
|
1643
|
+
}
|
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();
|
2078
1654
|
}
|
2079
|
-
|
2080
|
-
Ref(DEBUG_LOCATION, "DropStats"), server_it->first,
|
2081
|
-
load_report_it->first.first /*cluster_name*/,
|
2082
|
-
load_report_it->first.second /*eds_service_name*/);
|
2083
|
-
load_report_state.drop_stats = cluster_drop_stats.get();
|
1655
|
+
server_it->second.channel_state->MaybeStartLrsCall();
|
2084
1656
|
}
|
2085
|
-
|
1657
|
+
work_serializer_.DrainQueue();
|
2086
1658
|
return cluster_drop_stats;
|
2087
1659
|
}
|
2088
1660
|
|
@@ -2113,39 +1685,45 @@ RefCountedPtr<XdsClusterLocalityStats> XdsClient::AddClusterLocalityStats(
|
|
2113
1685
|
if (!bootstrap_->XdsServerExists(xds_server)) return nullptr;
|
2114
1686
|
auto key =
|
2115
1687
|
std::make_pair(std::string(cluster_name), std::string(eds_service_name));
|
2116
|
-
MutexLock lock(&mu_);
|
2117
|
-
// We jump through some hoops here to make sure that the const
|
2118
|
-
// XdsBootstrap::XdsServer& and absl::string_views
|
2119
|
-
// stored in the XdsClusterDropStats object point to the
|
2120
|
-
// XdsBootstrap::XdsServer and strings
|
2121
|
-
// in the load_report_map_ key, so that they have the same lifetime.
|
2122
|
-
auto server_it =
|
2123
|
-
xds_load_report_server_map_.emplace(xds_server, LoadReportServer()).first;
|
2124
|
-
if (server_it->second.channel_state == nullptr) {
|
2125
|
-
server_it->second.channel_state = GetOrCreateChannelStateLocked(xds_server);
|
2126
|
-
}
|
2127
|
-
auto load_report_it = server_it->second.load_report_map
|
2128
|
-
.emplace(std::move(key), LoadReportState())
|
2129
|
-
.first;
|
2130
|
-
LoadReportState& load_report_state = load_report_it->second;
|
2131
|
-
LoadReportState::LocalityState& locality_state =
|
2132
|
-
load_report_state.locality_stats[locality];
|
2133
1688
|
RefCountedPtr<XdsClusterLocalityStats> cluster_locality_stats;
|
2134
|
-
|
2135
|
-
|
2136
|
-
|
2137
|
-
|
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];
|
2138
1709
|
if (locality_state.locality_stats != nullptr) {
|
2139
|
-
locality_state.
|
2140
|
-
locality_state.locality_stats->GetSnapshotAndReset();
|
1710
|
+
cluster_locality_stats = locality_state.locality_stats->RefIfNonZero();
|
2141
1711
|
}
|
2142
|
-
cluster_locality_stats
|
2143
|
-
|
2144
|
-
|
2145
|
-
|
2146
|
-
|
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();
|
1723
|
+
}
|
1724
|
+
server_it->second.channel_state->MaybeStartLrsCall();
|
2147
1725
|
}
|
2148
|
-
|
1726
|
+
work_serializer_.DrainQueue();
|
2149
1727
|
return cluster_locality_stats;
|
2150
1728
|
}
|
2151
1729
|
|
@@ -2176,7 +1754,7 @@ void XdsClient::RemoveClusterLocalityStats(
|
|
2176
1754
|
void XdsClient::ResetBackoff() {
|
2177
1755
|
MutexLock lock(&mu_);
|
2178
1756
|
for (auto& p : xds_server_channel_map_) {
|
2179
|
-
|
1757
|
+
p.second->ResetBackoff();
|
2180
1758
|
}
|
2181
1759
|
}
|
2182
1760
|
|
@@ -2345,192 +1923,4 @@ std::string XdsClient::DumpClientConfigBinary() {
|
|
2345
1923
|
return api_.AssembleClientConfig(resource_type_metadata_map);
|
2346
1924
|
}
|
2347
1925
|
|
2348
|
-
//
|
2349
|
-
// accessors for global state
|
2350
|
-
//
|
2351
|
-
|
2352
|
-
void XdsClientGlobalInit() {
|
2353
|
-
g_mu = new Mutex;
|
2354
|
-
XdsHttpFilterRegistry::Init();
|
2355
|
-
XdsClusterSpecifierPluginRegistry::Init();
|
2356
|
-
}
|
2357
|
-
|
2358
|
-
// TODO(roth): Find a better way to clear the fallback config that does
|
2359
|
-
// not require using ABSL_NO_THREAD_SAFETY_ANALYSIS.
|
2360
|
-
void XdsClientGlobalShutdown() ABSL_NO_THREAD_SAFETY_ANALYSIS {
|
2361
|
-
gpr_free(g_fallback_bootstrap_config);
|
2362
|
-
g_fallback_bootstrap_config = nullptr;
|
2363
|
-
delete g_mu;
|
2364
|
-
g_mu = nullptr;
|
2365
|
-
XdsHttpFilterRegistry::Shutdown();
|
2366
|
-
XdsClusterSpecifierPluginRegistry::Shutdown();
|
2367
|
-
}
|
2368
|
-
|
2369
|
-
namespace {
|
2370
|
-
|
2371
|
-
std::string GetBootstrapContents(const char* fallback_config,
|
2372
|
-
grpc_error_handle* error) {
|
2373
|
-
// First, try GRPC_XDS_BOOTSTRAP env var.
|
2374
|
-
UniquePtr<char> path(gpr_getenv("GRPC_XDS_BOOTSTRAP"));
|
2375
|
-
if (path != nullptr) {
|
2376
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
2377
|
-
gpr_log(GPR_INFO,
|
2378
|
-
"Got bootstrap file location from GRPC_XDS_BOOTSTRAP "
|
2379
|
-
"environment variable: %s",
|
2380
|
-
path.get());
|
2381
|
-
}
|
2382
|
-
grpc_slice contents;
|
2383
|
-
*error =
|
2384
|
-
grpc_load_file(path.get(), /*add_null_terminator=*/true, &contents);
|
2385
|
-
if (*error != GRPC_ERROR_NONE) return "";
|
2386
|
-
std::string contents_str(StringViewFromSlice(contents));
|
2387
|
-
grpc_slice_unref_internal(contents);
|
2388
|
-
return contents_str;
|
2389
|
-
}
|
2390
|
-
// Next, try GRPC_XDS_BOOTSTRAP_CONFIG env var.
|
2391
|
-
UniquePtr<char> env_config(gpr_getenv("GRPC_XDS_BOOTSTRAP_CONFIG"));
|
2392
|
-
if (env_config != nullptr) {
|
2393
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
2394
|
-
gpr_log(GPR_INFO,
|
2395
|
-
"Got bootstrap contents from GRPC_XDS_BOOTSTRAP_CONFIG "
|
2396
|
-
"environment variable");
|
2397
|
-
}
|
2398
|
-
return env_config.get();
|
2399
|
-
}
|
2400
|
-
// Finally, try fallback config.
|
2401
|
-
if (fallback_config != nullptr) {
|
2402
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
2403
|
-
gpr_log(GPR_INFO, "Got bootstrap contents from fallback config");
|
2404
|
-
}
|
2405
|
-
return fallback_config;
|
2406
|
-
}
|
2407
|
-
// No bootstrap config found.
|
2408
|
-
*error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
2409
|
-
"Environment variables GRPC_XDS_BOOTSTRAP or GRPC_XDS_BOOTSTRAP_CONFIG "
|
2410
|
-
"not defined");
|
2411
|
-
return "";
|
2412
|
-
}
|
2413
|
-
|
2414
|
-
} // namespace
|
2415
|
-
|
2416
|
-
RefCountedPtr<XdsClient> XdsClient::GetOrCreate(const grpc_channel_args* args,
|
2417
|
-
grpc_error_handle* error) {
|
2418
|
-
RefCountedPtr<XdsClient> xds_client;
|
2419
|
-
// If getting bootstrap from channel args, create a local XdsClient
|
2420
|
-
// instance for the channel or server instead of using the global instance.
|
2421
|
-
const char* bootstrap_config = grpc_channel_args_find_string(
|
2422
|
-
args, GRPC_ARG_TEST_ONLY_DO_NOT_USE_IN_PROD_XDS_BOOTSTRAP_CONFIG);
|
2423
|
-
if (bootstrap_config != nullptr) {
|
2424
|
-
std::unique_ptr<XdsBootstrap> bootstrap =
|
2425
|
-
XdsBootstrap::Create(bootstrap_config, error);
|
2426
|
-
if (*error == GRPC_ERROR_NONE) {
|
2427
|
-
grpc_channel_args* xds_channel_args =
|
2428
|
-
grpc_channel_args_find_pointer<grpc_channel_args>(
|
2429
|
-
args,
|
2430
|
-
GRPC_ARG_TEST_ONLY_DO_NOT_USE_IN_PROD_XDS_CLIENT_CHANNEL_ARGS);
|
2431
|
-
return MakeRefCounted<XdsClient>(std::move(bootstrap), xds_channel_args);
|
2432
|
-
}
|
2433
|
-
return nullptr;
|
2434
|
-
}
|
2435
|
-
// Otherwise, use the global instance.
|
2436
|
-
{
|
2437
|
-
MutexLock lock(g_mu);
|
2438
|
-
if (g_xds_client != nullptr) {
|
2439
|
-
auto xds_client = g_xds_client->RefIfNonZero();
|
2440
|
-
if (xds_client != nullptr) return xds_client;
|
2441
|
-
}
|
2442
|
-
// Find bootstrap contents.
|
2443
|
-
std::string bootstrap_contents =
|
2444
|
-
GetBootstrapContents(g_fallback_bootstrap_config, error);
|
2445
|
-
if (*error != GRPC_ERROR_NONE) return nullptr;
|
2446
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
|
2447
|
-
gpr_log(GPR_INFO, "xDS bootstrap contents: %s",
|
2448
|
-
bootstrap_contents.c_str());
|
2449
|
-
}
|
2450
|
-
// Parse bootstrap.
|
2451
|
-
std::unique_ptr<XdsBootstrap> bootstrap =
|
2452
|
-
XdsBootstrap::Create(bootstrap_contents, error);
|
2453
|
-
if (*error != GRPC_ERROR_NONE) return nullptr;
|
2454
|
-
// Instantiate XdsClient.
|
2455
|
-
xds_client =
|
2456
|
-
MakeRefCounted<XdsClient>(std::move(bootstrap), g_channel_args);
|
2457
|
-
g_xds_client = xds_client.get();
|
2458
|
-
}
|
2459
|
-
return xds_client;
|
2460
|
-
}
|
2461
|
-
|
2462
|
-
namespace internal {
|
2463
|
-
|
2464
|
-
void SetXdsChannelArgsForTest(grpc_channel_args* args) {
|
2465
|
-
MutexLock lock(g_mu);
|
2466
|
-
g_channel_args = args;
|
2467
|
-
}
|
2468
|
-
|
2469
|
-
void UnsetGlobalXdsClientForTest() {
|
2470
|
-
MutexLock lock(g_mu);
|
2471
|
-
g_xds_client = nullptr;
|
2472
|
-
}
|
2473
|
-
|
2474
|
-
void SetXdsFallbackBootstrapConfig(const char* config) {
|
2475
|
-
MutexLock lock(g_mu);
|
2476
|
-
gpr_free(g_fallback_bootstrap_config);
|
2477
|
-
g_fallback_bootstrap_config = gpr_strdup(config);
|
2478
|
-
}
|
2479
|
-
|
2480
|
-
} // namespace internal
|
2481
|
-
|
2482
|
-
//
|
2483
|
-
// embedding XdsClient in channel args
|
2484
|
-
//
|
2485
|
-
|
2486
|
-
#define GRPC_ARG_XDS_CLIENT "grpc.internal.xds_client"
|
2487
|
-
|
2488
|
-
namespace {
|
2489
|
-
|
2490
|
-
void* XdsClientArgCopy(void* p) {
|
2491
|
-
XdsClient* xds_client = static_cast<XdsClient*>(p);
|
2492
|
-
xds_client->Ref(DEBUG_LOCATION, "channel arg").release();
|
2493
|
-
return p;
|
2494
|
-
}
|
2495
|
-
|
2496
|
-
void XdsClientArgDestroy(void* p) {
|
2497
|
-
XdsClient* xds_client = static_cast<XdsClient*>(p);
|
2498
|
-
xds_client->Unref(DEBUG_LOCATION, "channel arg");
|
2499
|
-
}
|
2500
|
-
|
2501
|
-
int XdsClientArgCmp(void* p, void* q) { return QsortCompare(p, q); }
|
2502
|
-
|
2503
|
-
const grpc_arg_pointer_vtable kXdsClientArgVtable = {
|
2504
|
-
XdsClientArgCopy, XdsClientArgDestroy, XdsClientArgCmp};
|
2505
|
-
|
2506
|
-
} // namespace
|
2507
|
-
|
2508
|
-
grpc_arg XdsClient::MakeChannelArg() const {
|
2509
|
-
return grpc_channel_arg_pointer_create(const_cast<char*>(GRPC_ARG_XDS_CLIENT),
|
2510
|
-
const_cast<XdsClient*>(this),
|
2511
|
-
&kXdsClientArgVtable);
|
2512
|
-
}
|
2513
|
-
|
2514
|
-
RefCountedPtr<XdsClient> XdsClient::GetFromChannelArgs(
|
2515
|
-
const grpc_channel_args& args) {
|
2516
|
-
XdsClient* xds_client =
|
2517
|
-
grpc_channel_args_find_pointer<XdsClient>(&args, GRPC_ARG_XDS_CLIENT);
|
2518
|
-
if (xds_client == nullptr) return nullptr;
|
2519
|
-
return xds_client->Ref(DEBUG_LOCATION, "GetFromChannelArgs");
|
2520
|
-
}
|
2521
|
-
|
2522
1926
|
} // namespace grpc_core
|
2523
|
-
|
2524
|
-
// The returned bytes may contain NULL(0), so we can't use c-string.
|
2525
|
-
grpc_slice grpc_dump_xds_configs() {
|
2526
|
-
grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
|
2527
|
-
grpc_core::ExecCtx exec_ctx;
|
2528
|
-
grpc_error_handle error = GRPC_ERROR_NONE;
|
2529
|
-
auto xds_client = grpc_core::XdsClient::GetOrCreate(nullptr, &error);
|
2530
|
-
if (error != GRPC_ERROR_NONE) {
|
2531
|
-
// If we isn't using xDS, just return an empty string.
|
2532
|
-
GRPC_ERROR_UNREF(error);
|
2533
|
-
return grpc_empty_slice();
|
2534
|
-
}
|
2535
|
-
return grpc_slice_from_cpp_string(xds_client->DumpClientConfigBinary());
|
2536
|
-
}
|