grpc 1.46.3-x86_64-linux → 1.47.0-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 +49 -97
- data/include/grpc/event_engine/event_engine.h +42 -7
- data/include/grpc/event_engine/memory_allocator.h +0 -15
- data/include/grpc/event_engine/port.h +1 -1
- data/include/grpc/event_engine/slice.h +286 -0
- data/include/grpc/event_engine/slice_buffer.h +112 -0
- data/include/grpc/grpc_security.h +11 -0
- data/include/grpc/impl/codegen/port_platform.h +100 -36
- data/include/grpc/impl/codegen/slice.h +1 -1
- data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +18 -30
- data/src/core/ext/filters/channel_idle/channel_idle_filter.h +4 -1
- data/src/core/ext/filters/client_channel/backend_metric.cc +17 -12
- data/src/core/ext/filters/client_channel/backend_metric.h +19 -9
- data/src/core/ext/filters/client_channel/backup_poller.cc +5 -5
- data/src/core/ext/filters/client_channel/backup_poller.h +2 -4
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +42 -20
- data/src/core/ext/filters/client_channel/client_channel.cc +60 -17
- data/src/core/ext/filters/client_channel/client_channel.h +26 -6
- data/src/core/ext/filters/client_channel/client_channel_channelz.cc +3 -5
- data/src/core/ext/filters/client_channel/client_channel_channelz.h +12 -2
- data/src/core/ext/filters/client_channel/client_channel_factory.cc +5 -0
- data/src/core/ext/filters/client_channel/client_channel_factory.h +8 -0
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +4 -13
- data/src/core/ext/filters/client_channel/config_selector.cc +1 -0
- data/src/core/ext/filters/client_channel/config_selector.h +7 -5
- data/src/core/ext/filters/client_channel/connector.h +8 -2
- data/src/core/ext/filters/client_channel/dynamic_filters.cc +13 -2
- data/src/core/ext/filters/client_channel/dynamic_filters.h +11 -1
- data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +2 -0
- data/src/core/ext/filters/client_channel/global_subchannel_pool.h +3 -0
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +14 -1
- data/src/core/ext/filters/client_channel/health/health_check_client.h +2 -0
- data/src/core/ext/filters/client_channel/http_proxy.cc +10 -2
- data/src/core/ext/filters/client_channel/http_proxy.h +3 -0
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +6 -2
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +1 -0
- data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +49 -0
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +12 -0
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +5 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +9 -3
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +59 -19
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +4 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +6 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +10 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +6 -3
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +408 -0
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +57 -0
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +1038 -0
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +54 -0
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +60 -52
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +102 -60
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +157 -96
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +2 -0
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +45 -10
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +182 -171
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +39 -36
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +30 -5
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +99 -23
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +6 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +30 -4
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +23 -3
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +75 -11
- data/src/core/ext/filters/client_channel/lb_policy.cc +4 -2
- data/src/core/ext/filters/client_channel/lb_policy.h +18 -24
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +2 -0
- data/src/core/ext/filters/client_channel/lb_policy_registry.cc +8 -1
- data/src/core/ext/filters/client_channel/lb_policy_registry.h +6 -1
- data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +4 -0
- data/src/core/ext/filters/client_channel/local_subchannel_pool.h +1 -0
- data/src/core/ext/filters/client_channel/proxy_mapper.h +1 -1
- data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +2 -0
- data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +5 -0
- data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +23 -5
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +134 -43
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +8 -1
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +10 -8
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +26 -9
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +13 -4
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +2 -1
- data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +2 -0
- data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h +2 -1
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +30 -7
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +13 -14
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +5 -2
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +59 -13
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +13 -1
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +8 -1
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +15 -11
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +89 -33
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +5 -11
- data/src/core/ext/filters/client_channel/resolver_result_parsing.h +11 -5
- data/src/core/ext/filters/client_channel/retry_filter.cc +42 -2
- data/src/core/ext/filters/client_channel/retry_service_config.cc +8 -9
- data/src/core/ext/filters/client_channel/retry_service_config.h +10 -1
- data/src/core/ext/filters/client_channel/retry_throttle.cc +1 -8
- data/src/core/ext/filters/client_channel/retry_throttle.h +7 -1
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +22 -5
- data/src/core/ext/filters/client_channel/subchannel.cc +156 -160
- data/src/core/ext/filters/client_channel/subchannel.h +80 -20
- data/src/core/ext/filters/client_channel/subchannel_interface.h +41 -23
- data/src/core/ext/filters/client_channel/subchannel_interface_internal.h +38 -0
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +12 -2
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +6 -3
- data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +16 -2
- data/src/core/ext/filters/client_channel/subchannel_stream_client.h +12 -0
- data/src/core/ext/filters/deadline/deadline_filter.cc +6 -2
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -4
- data/src/core/ext/filters/http/client/http_client_filter.cc +14 -5
- data/src/core/ext/filters/http/client/http_client_filter.h +7 -1
- data/src/core/ext/filters/http/client_authority_filter.cc +5 -10
- data/src/core/ext/filters/http/http_filters_plugin.cc +7 -8
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +1 -0
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +3 -1
- data/src/core/ext/filters/http/server/http_server_filter.cc +80 -247
- data/src/core/ext/filters/http/server/http_server_filter.h +31 -2
- data/src/core/ext/filters/message_size/message_size_filter.cc +20 -26
- data/src/core/ext/filters/message_size/message_size_filter.h +2 -2
- data/src/core/ext/filters/rbac/rbac_filter.cc +1 -0
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +101 -135
- data/src/core/ext/transport/chttp2/client/chttp2_connector.h +9 -7
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +44 -15
- data/src/core/ext/transport/chttp2/server/chttp2_server.h +2 -0
- data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +3 -3
- data/src/core/ext/transport/chttp2/transport/bin_decoder.h +2 -1
- data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +1 -0
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +69 -20
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +5 -0
- data/src/core/ext/transport/chttp2/transport/context_list.cc +4 -0
- data/src/core/ext/transport/chttp2/transport/context_list.h +4 -1
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +6 -2
- data/src/core/ext/transport/chttp2/transport/flow_control.h +6 -2
- data/src/core/ext/transport/chttp2/transport/frame.h +0 -4
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +7 -1
- data/src/core/ext/transport/chttp2/transport/frame_data.h +4 -1
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +3 -0
- data/src/core/ext/transport/chttp2/transport/frame_goaway.h +3 -1
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -0
- data/src/core/ext/transport/chttp2/transport/frame_ping.h +3 -0
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +6 -2
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +3 -0
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +12 -3
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +4 -0
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -1
- data/src/core/ext/transport/chttp2/transport/frame_window_update.h +3 -0
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +14 -12
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +15 -2
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +3 -0
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +3 -0
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +25 -7
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +8 -1
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +55 -37
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +38 -21
- data/src/core/ext/transport/chttp2/transport/http2_settings.h +0 -1
- data/src/core/ext/transport/chttp2/transport/internal.h +24 -3
- data/src/core/ext/transport/chttp2/transport/parsing.cc +27 -6
- data/src/core/ext/transport/chttp2/transport/stream_lists.cc +13 -9
- data/src/core/ext/transport/chttp2/transport/stream_map.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/stream_map.h +1 -0
- data/src/core/ext/transport/chttp2/transport/varint.h +2 -0
- data/src/core/ext/transport/chttp2/transport/writing.cc +38 -2
- data/src/core/ext/transport/inproc/inproc_transport.cc +8 -5
- data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.c +47 -0
- data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.h +109 -0
- data/src/core/ext/xds/certificate_provider_store.cc +4 -2
- data/src/core/ext/xds/certificate_provider_store.h +1 -1
- data/src/core/ext/xds/xds_certificate_provider.cc +4 -1
- data/src/core/ext/xds/xds_certificate_provider.h +1 -1
- data/src/core/ext/xds/xds_channel_stack_modifier.cc +5 -5
- data/src/core/ext/xds/xds_client.cc +46 -22
- data/src/core/ext/xds/xds_cluster.cc +106 -16
- data/src/core/ext/xds/xds_cluster.h +3 -0
- data/src/core/ext/xds/xds_http_fault_filter.cc +3 -3
- data/src/core/ext/xds/xds_listener.cc +19 -9
- data/src/core/ext/xds/xds_server_config_fetcher.cc +2 -1
- data/src/core/lib/address_utils/sockaddr_utils.cc +56 -23
- data/src/core/lib/address_utils/sockaddr_utils.h +7 -4
- data/src/core/lib/avl/avl.h +3 -1
- data/src/core/lib/channel/call_finalization.h +4 -0
- data/src/core/lib/channel/call_tracer.h +8 -2
- data/src/core/lib/channel/channel_args.cc +41 -22
- data/src/core/lib/channel/channel_args.h +33 -3
- data/src/core/lib/channel/channel_args_preconditioning.cc +3 -3
- data/src/core/lib/channel/channel_args_preconditioning.h +3 -2
- data/src/core/lib/channel/channel_stack.cc +41 -3
- data/src/core/lib/channel/channel_stack.h +49 -3
- data/src/core/lib/channel/channel_stack_builder.cc +9 -19
- data/src/core/lib/channel/channel_stack_builder.h +15 -27
- data/src/core/lib/channel/channel_stack_builder_impl.cc +36 -41
- data/src/core/lib/channel/channel_stack_builder_impl.h +3 -6
- data/src/core/lib/channel/channel_trace.cc +8 -13
- data/src/core/lib/channel/channel_trace.h +6 -3
- data/src/core/lib/channel/channelz.cc +8 -13
- data/src/core/lib/channel/channelz.h +13 -4
- data/src/core/lib/channel/channelz_registry.cc +7 -14
- data/src/core/lib/channel/channelz_registry.h +10 -9
- data/src/core/lib/channel/connected_channel.cc +21 -31
- data/src/core/lib/channel/connected_channel.h +1 -0
- data/src/core/lib/channel/promise_based_filter.cc +444 -189
- data/src/core/lib/channel/promise_based_filter.h +160 -27
- data/src/core/lib/channel/status_util.cc +2 -0
- data/src/core/lib/channel/status_util.h +0 -3
- data/src/core/lib/compression/compression_internal.cc +45 -10
- data/src/core/lib/compression/compression_internal.h +1 -1
- data/src/core/lib/config/core_configuration.cc +3 -0
- data/src/core/lib/config/core_configuration.h +2 -1
- data/src/core/lib/event_engine/channel_args_endpoint_config.cc +4 -2
- data/src/core/lib/event_engine/channel_args_endpoint_config.h +3 -2
- data/src/core/lib/event_engine/default_event_engine_factory.cc +8 -2
- data/src/core/lib/event_engine/event_engine.cc +12 -2
- data/src/core/lib/event_engine/event_engine_factory.h +5 -0
- data/src/core/lib/event_engine/handle_containers.h +67 -0
- data/src/core/lib/event_engine/iomgr_engine.cc +206 -0
- data/src/core/lib/event_engine/iomgr_engine.h +118 -0
- data/src/core/lib/event_engine/memory_allocator.cc +12 -4
- data/src/core/lib/event_engine/resolved_address.cc +4 -2
- data/src/core/lib/event_engine/slice.cc +102 -0
- data/src/core/lib/event_engine/slice_buffer.cc +50 -0
- data/src/core/lib/{iomgr/event_engine/pollset.h → event_engine/trace.cc} +3 -10
- data/src/core/lib/{iomgr/endpoint_pair_event_engine.cc → event_engine/trace.h} +12 -14
- data/src/core/lib/gpr/log.cc +5 -0
- data/src/core/lib/gpr/tls.h +3 -5
- data/src/core/lib/gprpp/bitset.h +5 -1
- data/src/core/lib/gprpp/chunked_vector.h +4 -0
- data/src/core/lib/gprpp/construct_destruct.h +1 -0
- data/src/core/lib/gprpp/dual_ref_counted.h +1 -4
- data/src/core/lib/gprpp/examine_stack.h +0 -1
- data/src/core/lib/gprpp/fork.cc +3 -6
- data/src/core/lib/gprpp/global_config.h +2 -4
- data/src/core/lib/gprpp/global_config_env.cc +3 -2
- data/src/core/lib/gprpp/global_config_env.h +3 -1
- data/src/core/lib/gprpp/global_config_generic.h +0 -4
- data/src/core/lib/gprpp/host_port.cc +2 -0
- data/src/core/lib/gprpp/manual_constructor.h +0 -1
- data/src/core/lib/gprpp/match.h +2 -0
- data/src/core/lib/gprpp/memory.h +1 -5
- data/src/core/lib/gprpp/orphanable.h +1 -4
- data/src/core/lib/gprpp/ref_counted.h +1 -3
- data/src/core/lib/gprpp/ref_counted_ptr.h +1 -1
- data/src/core/lib/gprpp/stat.h +0 -2
- data/src/core/lib/gprpp/stat_posix.cc +7 -2
- data/src/core/lib/gprpp/status_helper.cc +8 -4
- data/src/core/lib/gprpp/status_helper.h +4 -0
- data/src/core/lib/gprpp/sync.h +3 -1
- data/src/core/lib/gprpp/table.h +10 -0
- data/src/core/lib/gprpp/thd.h +2 -5
- data/src/core/lib/gprpp/thd_posix.cc +4 -2
- data/src/core/lib/gprpp/thd_windows.cc +2 -0
- data/src/core/lib/gprpp/time.cc +8 -0
- data/src/core/lib/gprpp/time.h +6 -1
- data/src/core/lib/gprpp/time_util.cc +4 -0
- data/src/core/lib/gprpp/time_util.h +1 -1
- data/src/core/lib/gprpp/unique_type_name.h +104 -0
- data/src/core/lib/http/format_request.cc +29 -0
- data/src/core/lib/http/format_request.h +2 -0
- data/src/core/lib/http/httpcli.cc +88 -81
- data/src/core/lib/http/httpcli.h +39 -7
- data/src/core/lib/http/httpcli_security_connector.cc +3 -4
- data/src/core/lib/iomgr/endpoint.cc +4 -4
- data/src/core/lib/iomgr/endpoint.h +6 -4
- data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -4
- data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -1
- data/src/core/lib/iomgr/ev_posix.cc +1 -4
- data/src/core/lib/iomgr/exec_ctx.h +1 -2
- data/src/core/lib/iomgr/internal_errqueue.cc +38 -47
- data/src/core/lib/iomgr/internal_errqueue.h +1 -6
- data/src/core/lib/iomgr/iomgr.cc +0 -1
- data/src/core/{ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_event_engine.cc → lib/iomgr/iomgr_fwd.h} +9 -12
- data/src/core/lib/iomgr/pollset_set.h +1 -2
- data/src/core/lib/iomgr/port.h +25 -6
- data/src/core/lib/iomgr/resolve_address.cc +8 -0
- data/src/core/lib/iomgr/resolve_address.h +21 -14
- data/src/core/lib/iomgr/resolve_address_impl.h +2 -3
- data/src/core/lib/iomgr/resolve_address_posix.cc +8 -14
- data/src/core/lib/iomgr/resolve_address_posix.h +5 -2
- data/src/core/lib/iomgr/resolve_address_windows.cc +7 -14
- data/src/core/lib/iomgr/resolve_address_windows.h +5 -2
- data/src/core/lib/iomgr/sockaddr.h +2 -3
- data/src/core/lib/iomgr/sockaddr_posix.h +2 -0
- data/src/core/lib/iomgr/sockaddr_windows.h +2 -0
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +3 -2
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +10 -2
- data/src/core/lib/iomgr/tcp_client_posix.cc +12 -5
- data/src/core/lib/iomgr/tcp_client_windows.cc +13 -6
- data/src/core/lib/iomgr/tcp_posix.cc +9 -27
- data/src/core/lib/iomgr/tcp_server_posix.cc +26 -12
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +30 -27
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +7 -4
- data/src/core/lib/iomgr/tcp_server_windows.cc +13 -5
- data/src/core/lib/iomgr/tcp_windows.cc +7 -4
- data/src/core/lib/json/json.h +1 -2
- data/src/core/lib/json/json_reader.cc +9 -1
- data/src/core/lib/json/json_util.cc +7 -0
- data/src/core/lib/json/json_util.h +10 -1
- data/src/core/lib/json/json_writer.cc +6 -1
- data/src/core/lib/promise/activity.cc +1 -1
- data/src/core/lib/promise/activity.h +6 -6
- data/src/core/lib/promise/arena_promise.h +11 -1
- data/src/core/lib/promise/call_push_pull.h +4 -0
- data/src/core/lib/promise/context.h +1 -1
- data/src/core/lib/promise/detail/basic_seq.h +2 -2
- data/src/core/lib/promise/detail/promise_factory.h +0 -1
- data/src/core/lib/promise/latch.h +0 -1
- data/src/core/lib/promise/loop.h +1 -0
- data/src/core/lib/promise/race.h +0 -1
- data/src/core/lib/promise/seq.h +0 -2
- data/src/core/lib/promise/sleep.cc +2 -0
- data/src/core/lib/promise/sleep.h +10 -0
- data/src/core/lib/promise/try_seq.h +2 -2
- data/src/core/lib/resolver/resolver_factory.h +1 -2
- data/src/core/lib/resolver/server_address.cc +9 -3
- data/src/core/lib/resolver/server_address.h +4 -4
- data/src/core/lib/resource_quota/api.cc +14 -1
- data/src/core/lib/resource_quota/api.h +4 -1
- data/src/core/lib/resource_quota/arena.cc +0 -6
- data/src/core/lib/resource_quota/arena.h +1 -2
- data/src/core/lib/resource_quota/memory_quota.cc +47 -5
- data/src/core/lib/resource_quota/memory_quota.h +24 -5
- data/src/core/lib/resource_quota/resource_quota.h +8 -0
- data/src/core/lib/resource_quota/thread_quota.cc +2 -0
- data/src/core/lib/resource_quota/thread_quota.h +4 -0
- data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +3 -0
- data/src/core/lib/security/credentials/alts/alts_credentials.cc +8 -2
- data/src/core/lib/security/credentials/alts/alts_credentials.h +2 -2
- data/src/core/lib/security/credentials/call_creds_util.cc +2 -0
- data/src/core/lib/security/credentials/channel_creds_registry.h +1 -0
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +7 -3
- data/src/core/lib/security/credentials/composite/composite_credentials.h +5 -4
- data/src/core/lib/security/credentials/credentials.h +17 -10
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +81 -0
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +8 -0
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +3 -0
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +2 -0
- data/src/core/lib/security/credentials/fake/fake_credentials.cc +13 -3
- data/src/core/lib/security/credentials/fake/fake_credentials.h +2 -2
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +25 -15
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +2 -2
- data/src/core/lib/security/credentials/iam/iam_credentials.cc +4 -1
- data/src/core/lib/security/credentials/iam/iam_credentials.h +2 -2
- data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +8 -2
- data/src/core/lib/security/credentials/insecure/insecure_credentials.h +4 -4
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +3 -2
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -2
- data/src/core/lib/security/credentials/local/local_credentials.cc +8 -2
- data/src/core/lib/security/credentials/local/local_credentials.h +2 -2
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +10 -6
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +4 -4
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +4 -1
- data/src/core/lib/security/credentials/plugin/plugin_credentials.h +1 -1
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +8 -2
- data/src/core/lib/security/credentials/ssl/ssl_credentials.h +4 -4
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +10 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +5 -7
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +26 -1
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +28 -4
- data/src/core/lib/security/credentials/tls/tls_credentials.cc +10 -0
- data/src/core/lib/security/credentials/tls/tls_credentials.h +2 -2
- data/src/core/lib/security/credentials/xds/xds_credentials.cc +12 -3
- data/src/core/lib/security/credentials/xds/xds_credentials.h +5 -5
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +1 -1
- data/src/core/lib/security/security_connector/fake/fake_security_connector.h +1 -1
- data/src/core/lib/security/security_connector/security_connector.cc +1 -1
- data/src/core/lib/security/security_connector/security_connector.h +1 -1
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +1 -1
- data/src/core/lib/security/transport/client_auth_filter.cc +6 -8
- data/src/core/lib/security/transport/secure_endpoint.cc +23 -12
- data/src/core/lib/security/transport/security_handshaker.cc +5 -5
- data/src/core/lib/security/transport/security_handshaker.h +1 -1
- data/src/core/lib/security/transport/server_auth_filter.cc +3 -2
- data/src/core/lib/service_config/service_config.h +4 -8
- data/src/core/lib/service_config/service_config_call_data.h +4 -1
- data/src/core/lib/service_config/service_config_impl.cc +7 -0
- data/src/core/lib/service_config/service_config_impl.h +9 -2
- data/src/core/lib/service_config/service_config_parser.cc +8 -0
- data/src/core/lib/service_config/service_config_parser.h +7 -0
- data/src/core/lib/slice/b64.cc +1 -1
- data/src/core/lib/slice/b64.h +2 -0
- data/src/core/lib/slice/percent_encoding.cc +4 -1
- data/src/core/lib/slice/percent_encoding.h +0 -6
- data/src/core/lib/slice/slice.cc +2 -1
- data/src/core/lib/slice/slice.h +10 -5
- data/src/core/lib/slice/slice_api.cc +1 -1
- data/src/core/lib/slice/slice_buffer.cc +50 -23
- data/src/core/lib/slice/slice_buffer.h +106 -0
- data/src/core/lib/slice/slice_buffer_api.cc +35 -0
- data/src/core/lib/slice/slice_internal.h +4 -3
- data/src/core/lib/slice/slice_refcount.h +2 -3
- data/src/core/lib/slice/slice_refcount_base.h +2 -3
- data/src/core/lib/slice/slice_split.cc +3 -0
- data/src/core/lib/slice/slice_split.h +0 -4
- data/src/core/lib/slice/slice_string_helpers.cc +4 -0
- data/src/core/lib/slice/slice_string_helpers.h +1 -4
- data/src/core/lib/surface/builtins.cc +7 -2
- data/src/core/lib/surface/byte_buffer.cc +7 -1
- data/src/core/lib/surface/byte_buffer_reader.cc +4 -4
- data/src/core/lib/surface/call.cc +41 -26
- data/src/core/lib/surface/call.h +16 -2
- data/src/core/lib/surface/call_details.cc +4 -4
- data/src/core/lib/surface/call_log_batch.cc +7 -1
- data/src/core/lib/surface/call_test_only.h +4 -1
- data/src/core/lib/surface/channel.cc +179 -242
- data/src/core/lib/surface/channel.h +94 -57
- data/src/core/lib/surface/channel_init.h +2 -0
- data/src/core/lib/surface/channel_ping.cc +8 -2
- data/src/core/lib/surface/channel_stack_type.cc +0 -2
- data/src/core/lib/surface/channel_stack_type.h +0 -2
- data/src/core/lib/surface/completion_queue.cc +14 -6
- data/src/core/lib/surface/completion_queue.h +5 -1
- data/src/core/lib/surface/completion_queue_factory.cc +1 -0
- data/src/core/lib/surface/completion_queue_factory.h +1 -3
- data/src/core/lib/surface/event_string.cc +1 -7
- data/src/core/lib/surface/event_string.h +1 -1
- data/src/core/lib/surface/init.cc +17 -45
- data/src/core/lib/surface/init.h +0 -8
- data/src/core/lib/surface/lame_client.cc +64 -110
- data/src/core/lib/surface/lame_client.h +40 -2
- data/src/core/lib/surface/metadata_array.cc +2 -0
- data/src/core/lib/surface/server.cc +69 -56
- data/src/core/lib/surface/server.h +39 -9
- data/src/core/lib/surface/validate_metadata.cc +2 -5
- data/src/core/lib/surface/validate_metadata.h +3 -0
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/bdp_estimator.cc +3 -1
- data/src/core/lib/transport/bdp_estimator.h +2 -3
- data/src/core/lib/transport/byte_stream.cc +4 -3
- data/src/core/lib/transport/byte_stream.h +5 -1
- data/src/core/lib/transport/connectivity_state.cc +6 -4
- data/src/core/lib/transport/connectivity_state.h +2 -3
- data/src/core/lib/transport/error_utils.cc +4 -2
- data/src/core/lib/transport/error_utils.h +5 -1
- data/src/core/lib/{channel → transport}/handshaker.cc +9 -4
- data/src/core/lib/{channel → transport}/handshaker.h +13 -6
- data/src/core/lib/{channel → transport}/handshaker_factory.h +9 -10
- data/src/core/lib/{channel → transport}/handshaker_registry.cc +5 -1
- data/src/core/lib/{channel → transport}/handshaker_registry.h +5 -4
- data/src/core/{ext/filters/client_channel → lib/transport}/http_connect_handshaker.cc +24 -10
- data/src/core/{ext/filters/client_channel → lib/transport}/http_connect_handshaker.h +3 -3
- data/src/core/lib/transport/metadata_batch.cc +287 -0
- data/src/core/lib/transport/metadata_batch.h +133 -264
- data/src/core/lib/transport/parsed_metadata.cc +2 -0
- data/src/core/lib/transport/parsed_metadata.h +10 -3
- data/src/core/lib/transport/status_conversion.cc +2 -0
- data/src/core/lib/transport/status_conversion.h +2 -2
- data/src/core/lib/transport/tcp_connect_handshaker.cc +253 -0
- data/src/core/lib/transport/tcp_connect_handshaker.h +39 -0
- data/src/core/lib/transport/timeout_encoding.cc +2 -6
- data/src/core/lib/transport/timeout_encoding.h +5 -1
- data/src/core/lib/transport/transport.cc +18 -17
- data/src/core/lib/transport/transport.h +28 -2
- data/src/core/lib/transport/transport_impl.h +10 -0
- data/src/core/lib/transport/transport_op_string.cc +9 -10
- data/src/core/lib/uri/uri_parser.cc +11 -3
- data/src/core/lib/uri/uri_parser.h +0 -2
- data/src/core/plugin_registry/grpc_plugin_registry.cc +11 -0
- data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -0
- data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +2 -0
- data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +2 -0
- data/src/ruby/ext/grpc/extconf.rb +2 -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/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/third_party/abseil-cpp/absl/cleanup/cleanup.h +140 -0
- data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +100 -0
- data/third_party/abseil-cpp/absl/container/flat_hash_set.h +504 -0
- metadata +36 -29
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_event_engine.cc +0 -31
- data/src/core/lib/event_engine/sockaddr.cc +0 -40
- data/src/core/lib/event_engine/sockaddr.h +0 -44
- data/src/core/lib/gprpp/capture.h +0 -76
- data/src/core/lib/iomgr/event_engine/closure.cc +0 -77
- data/src/core/lib/iomgr/event_engine/closure.h +0 -42
- data/src/core/lib/iomgr/event_engine/endpoint.cc +0 -172
- data/src/core/lib/iomgr/event_engine/endpoint.h +0 -52
- data/src/core/lib/iomgr/event_engine/iomgr.cc +0 -85
- data/src/core/lib/iomgr/event_engine/pollset.cc +0 -87
- data/src/core/lib/iomgr/event_engine/promise.h +0 -51
- data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +0 -47
- data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +0 -37
- data/src/core/lib/iomgr/event_engine/resolver.cc +0 -133
- data/src/core/lib/iomgr/event_engine/resolver.h +0 -56
- data/src/core/lib/iomgr/event_engine/tcp.cc +0 -296
- data/src/core/lib/iomgr/event_engine/timer.cc +0 -62
@@ -0,0 +1,54 @@
|
|
1
|
+
//
|
2
|
+
// Copyright 2022 gRPC authors.
|
3
|
+
//
|
4
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
// you may not use this file except in compliance with the License.
|
6
|
+
// You may obtain a copy of the License at
|
7
|
+
//
|
8
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
//
|
10
|
+
// Unless required by applicable law or agreed to in writing, software
|
11
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
// See the License for the specific language governing permissions and
|
14
|
+
// limitations under the License.
|
15
|
+
//
|
16
|
+
|
17
|
+
#ifndef GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_OUTLIER_DETECTION_OUTLIER_DETECTION_H
|
18
|
+
#define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_OUTLIER_DETECTION_OUTLIER_DETECTION_H
|
19
|
+
|
20
|
+
#include <grpc/support/port_platform.h>
|
21
|
+
|
22
|
+
#include <stdint.h> // for uint32_t
|
23
|
+
|
24
|
+
#include "absl/types/optional.h"
|
25
|
+
|
26
|
+
#include "src/core/lib/gprpp/time.h"
|
27
|
+
|
28
|
+
namespace grpc_core {
|
29
|
+
|
30
|
+
bool XdsOutlierDetectionEnabled();
|
31
|
+
|
32
|
+
struct OutlierDetectionConfig {
|
33
|
+
Duration interval = Duration::Infinity();
|
34
|
+
Duration base_ejection_time = Duration::Milliseconds(30000);
|
35
|
+
Duration max_ejection_time = Duration::Milliseconds(30000);
|
36
|
+
uint32_t max_ejection_percent = 10;
|
37
|
+
struct SuccessRateEjection {
|
38
|
+
uint32_t stdev_factor = 1900;
|
39
|
+
uint32_t enforcement_percentage = 0;
|
40
|
+
uint32_t minimum_hosts = 5;
|
41
|
+
uint32_t request_volume = 100;
|
42
|
+
};
|
43
|
+
struct FailurePercentageEjection {
|
44
|
+
uint32_t threshold = 85;
|
45
|
+
uint32_t enforcement_percentage = 0;
|
46
|
+
uint32_t minimum_hosts = 5;
|
47
|
+
uint32_t request_volume = 50;
|
48
|
+
};
|
49
|
+
absl::optional<SuccessRateEjection> success_rate_ejection;
|
50
|
+
absl::optional<FailurePercentageEjection> failure_percentage_ejection;
|
51
|
+
};
|
52
|
+
} // namespace grpc_core
|
53
|
+
|
54
|
+
#endif // GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_OUTLIER_DETECTION_OUTLIER_DETECTION_H
|
@@ -16,19 +16,37 @@
|
|
16
16
|
|
17
17
|
#include <grpc/support/port_platform.h>
|
18
18
|
|
19
|
+
#include <inttypes.h>
|
19
20
|
#include <string.h>
|
20
21
|
|
21
|
-
#include <
|
22
|
+
#include <memory>
|
23
|
+
#include <string>
|
24
|
+
#include <utility>
|
22
25
|
|
26
|
+
#include "absl/container/inlined_vector.h"
|
27
|
+
#include "absl/memory/memory.h"
|
28
|
+
#include "absl/status/status.h"
|
29
|
+
#include "absl/status/statusor.h"
|
30
|
+
#include "absl/strings/str_cat.h"
|
31
|
+
|
32
|
+
#include <grpc/impl/codegen/connectivity_state.h>
|
33
|
+
#include <grpc/impl/codegen/grpc_types.h>
|
34
|
+
#include <grpc/support/log.h>
|
35
|
+
|
36
|
+
#include "src/core/ext/filters/client_channel/lb_policy.h"
|
23
37
|
#include "src/core/ext/filters/client_channel/lb_policy/subchannel_list.h"
|
38
|
+
#include "src/core/ext/filters/client_channel/lb_policy_factory.h"
|
24
39
|
#include "src/core/ext/filters/client_channel/lb_policy_registry.h"
|
25
|
-
#include "src/core/ext/filters/client_channel/
|
26
|
-
#include "src/core/lib/address_utils/sockaddr_utils.h"
|
40
|
+
#include "src/core/ext/filters/client_channel/subchannel_interface.h"
|
27
41
|
#include "src/core/lib/channel/channel_args.h"
|
28
|
-
#include "src/core/lib/
|
42
|
+
#include "src/core/lib/debug/trace.h"
|
43
|
+
#include "src/core/lib/gprpp/debug_location.h"
|
44
|
+
#include "src/core/lib/gprpp/orphanable.h"
|
45
|
+
#include "src/core/lib/gprpp/ref_counted_ptr.h"
|
46
|
+
#include "src/core/lib/iomgr/error.h"
|
47
|
+
#include "src/core/lib/json/json.h"
|
29
48
|
#include "src/core/lib/resolver/server_address.h"
|
30
49
|
#include "src/core/lib/transport/connectivity_state.h"
|
31
|
-
#include "src/core/lib/transport/error_utils.h"
|
32
50
|
|
33
51
|
namespace grpc_core {
|
34
52
|
|
@@ -81,11 +99,14 @@ class PickFirst : public LoadBalancingPolicy {
|
|
81
99
|
: public SubchannelList<PickFirstSubchannelList,
|
82
100
|
PickFirstSubchannelData> {
|
83
101
|
public:
|
84
|
-
PickFirstSubchannelList(PickFirst* policy,
|
85
|
-
ServerAddressList addresses,
|
102
|
+
PickFirstSubchannelList(PickFirst* policy, ServerAddressList addresses,
|
86
103
|
const grpc_channel_args& args)
|
87
|
-
: SubchannelList(policy,
|
88
|
-
|
104
|
+
: SubchannelList(policy,
|
105
|
+
(GRPC_TRACE_FLAG_ENABLED(grpc_lb_pick_first_trace)
|
106
|
+
? "PickFirstSubchannelList"
|
107
|
+
: nullptr),
|
108
|
+
std::move(addresses), policy->channel_control_helper(),
|
109
|
+
args) {
|
89
110
|
// Need to maintain a ref to the LB policy as long as we maintain
|
90
111
|
// any references to subchannels, since the subchannels'
|
91
112
|
// pollset_sets will include the LB policy's pollset_set.
|
@@ -185,8 +206,7 @@ void PickFirst::AttemptToConnectUsingLatestUpdateArgsLocked() {
|
|
185
206
|
addresses = *latest_update_args_.addresses;
|
186
207
|
}
|
187
208
|
auto subchannel_list = MakeOrphanable<PickFirstSubchannelList>(
|
188
|
-
this,
|
189
|
-
*latest_update_args_.args);
|
209
|
+
this, std::move(addresses), *latest_update_args_.args);
|
190
210
|
// Empty update or no valid subchannels.
|
191
211
|
if (subchannel_list->num_subchannels() == 0) {
|
192
212
|
// Unsubscribe from all current subchannels.
|
@@ -201,6 +221,10 @@ void PickFirst::AttemptToConnectUsingLatestUpdateArgsLocked() {
|
|
201
221
|
channel_control_helper()->UpdateState(
|
202
222
|
GRPC_CHANNEL_TRANSIENT_FAILURE, status,
|
203
223
|
absl::make_unique<TransientFailurePicker>(status));
|
224
|
+
// If there was a previously pending update (which may or may
|
225
|
+
// not have contained the currently selected subchannel), drop
|
226
|
+
// it, so that it doesn't override what we've done here.
|
227
|
+
latest_pending_subchannel_list_.reset();
|
204
228
|
return;
|
205
229
|
}
|
206
230
|
// If one of the subchannels in the new list is already in state
|
@@ -232,7 +256,7 @@ void PickFirst::AttemptToConnectUsingLatestUpdateArgsLocked() {
|
|
232
256
|
// here, since we've already checked the initial connectivity
|
233
257
|
// state of all subchannels above.
|
234
258
|
subchannel_list_->subchannel(0)->StartConnectivityWatchLocked();
|
235
|
-
subchannel_list_->subchannel(0)->subchannel()->
|
259
|
+
subchannel_list_->subchannel(0)->subchannel()->RequestConnection();
|
236
260
|
} else {
|
237
261
|
// We do have a selected subchannel (which means it's READY), so keep
|
238
262
|
// using it until one of the subchannels in the new list reports READY.
|
@@ -255,7 +279,7 @@ void PickFirst::AttemptToConnectUsingLatestUpdateArgsLocked() {
|
|
255
279
|
->StartConnectivityWatchLocked();
|
256
280
|
latest_pending_subchannel_list_->subchannel(0)
|
257
281
|
->subchannel()
|
258
|
-
->
|
282
|
+
->RequestConnection();
|
259
283
|
}
|
260
284
|
}
|
261
285
|
|
@@ -307,10 +331,13 @@ void PickFirst::PickFirstSubchannelData::ProcessConnectivityChangeLocked(
|
|
307
331
|
"Pick First %p selected subchannel connectivity changed to %s", p,
|
308
332
|
ConnectivityStateName(connectivity_state));
|
309
333
|
}
|
310
|
-
//
|
311
|
-
//
|
312
|
-
|
313
|
-
|
334
|
+
// We might miss a connectivity state update between calling
|
335
|
+
// CheckConnectivityStateLocked() and StartConnectivityWatchLocked().
|
336
|
+
// If the new state is READY, just ignore it; otherwise, regardless of
|
337
|
+
// what state it is, we treat it as a failure of the existing connection.
|
338
|
+
if (connectivity_state == GRPC_CHANNEL_READY) return;
|
339
|
+
// If there is a pending update, switch to the pending update.
|
340
|
+
if (p->latest_pending_subchannel_list_ != nullptr) {
|
314
341
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_pick_first_trace)) {
|
315
342
|
gpr_log(GPR_INFO,
|
316
343
|
"Pick First %p promoting pending subchannel list %p to "
|
@@ -335,38 +362,19 @@ void PickFirst::PickFirstSubchannelData::ProcessConnectivityChangeLocked(
|
|
335
362
|
absl::make_unique<QueuePicker>(
|
336
363
|
p->Ref(DEBUG_LOCATION, "QueuePicker")));
|
337
364
|
}
|
338
|
-
|
339
|
-
if (connectivity_state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
|
340
|
-
// If the selected subchannel goes bad, request a re-resolution. We
|
341
|
-
// also set the channel state to IDLE. The reason is that if the new
|
342
|
-
// state is TRANSIENT_FAILURE due to a GOAWAY reception we don't want
|
343
|
-
// to connect to the re-resolved backends until we leave IDLE state.
|
344
|
-
// TODO(qianchengz): We may want to request re-resolution in
|
345
|
-
// ExitIdleLocked().
|
346
|
-
p->idle_ = true;
|
347
|
-
p->channel_control_helper()->RequestReresolution();
|
348
|
-
p->selected_ = nullptr;
|
349
|
-
p->subchannel_list_.reset();
|
350
|
-
p->channel_control_helper()->UpdateState(
|
351
|
-
GRPC_CHANNEL_IDLE, absl::Status(),
|
352
|
-
absl::make_unique<QueuePicker>(
|
353
|
-
p->Ref(DEBUG_LOCATION, "QueuePicker")));
|
354
|
-
} else {
|
355
|
-
// This is unlikely but can happen when a subchannel has been asked
|
356
|
-
// to reconnect by a different channel and this channel has dropped
|
357
|
-
// some connectivity state notifications.
|
358
|
-
if (connectivity_state == GRPC_CHANNEL_READY) {
|
359
|
-
p->channel_control_helper()->UpdateState(
|
360
|
-
GRPC_CHANNEL_READY, absl::Status(),
|
361
|
-
absl::make_unique<Picker>(subchannel()->Ref()));
|
362
|
-
} else { // CONNECTING
|
363
|
-
p->channel_control_helper()->UpdateState(
|
364
|
-
connectivity_state, absl::Status(),
|
365
|
-
absl::make_unique<QueuePicker>(
|
366
|
-
p->Ref(DEBUG_LOCATION, "QueuePicker")));
|
367
|
-
}
|
368
|
-
}
|
365
|
+
return;
|
369
366
|
}
|
367
|
+
// If the selected subchannel goes bad, request a re-resolution.
|
368
|
+
// TODO(qianchengz): We may want to request re-resolution in
|
369
|
+
// ExitIdleLocked().
|
370
|
+
p->channel_control_helper()->RequestReresolution();
|
371
|
+
// Enter idle.
|
372
|
+
p->idle_ = true;
|
373
|
+
p->selected_ = nullptr;
|
374
|
+
p->subchannel_list_.reset();
|
375
|
+
p->channel_control_helper()->UpdateState(
|
376
|
+
GRPC_CHANNEL_IDLE, absl::Status(),
|
377
|
+
absl::make_unique<QueuePicker>(p->Ref(DEBUG_LOCATION, "QueuePicker")));
|
370
378
|
return;
|
371
379
|
}
|
372
380
|
// If we get here, there are two possible cases:
|
@@ -384,7 +392,8 @@ void PickFirst::PickFirstSubchannelData::ProcessConnectivityChangeLocked(
|
|
384
392
|
ProcessUnselectedReadyLocked();
|
385
393
|
break;
|
386
394
|
}
|
387
|
-
case GRPC_CHANNEL_TRANSIENT_FAILURE:
|
395
|
+
case GRPC_CHANNEL_TRANSIENT_FAILURE:
|
396
|
+
case GRPC_CHANNEL_IDLE: {
|
388
397
|
CancelConnectivityWatchLocked("connection attempt failed");
|
389
398
|
PickFirstSubchannelData* sd = this;
|
390
399
|
size_t next_index =
|
@@ -428,8 +437,7 @@ void PickFirst::PickFirstSubchannelData::ProcessConnectivityChangeLocked(
|
|
428
437
|
sd->CheckConnectivityStateAndStartWatchingLocked();
|
429
438
|
break;
|
430
439
|
}
|
431
|
-
case GRPC_CHANNEL_CONNECTING:
|
432
|
-
case GRPC_CHANNEL_IDLE: {
|
440
|
+
case GRPC_CHANNEL_CONNECTING: {
|
433
441
|
// Only update connectivity state in case 1, and only if we're not
|
434
442
|
// already in TRANSIENT_FAILURE.
|
435
443
|
if (subchannel_list() == p->subchannel_list_.get() &&
|
@@ -499,7 +507,7 @@ void PickFirst::PickFirstSubchannelData::
|
|
499
507
|
if (current_state == GRPC_CHANNEL_READY) {
|
500
508
|
if (p->selected_ != this) ProcessUnselectedReadyLocked();
|
501
509
|
} else {
|
502
|
-
subchannel()->
|
510
|
+
subchannel()->RequestConnection();
|
503
511
|
}
|
504
512
|
}
|
505
513
|
|
@@ -14,27 +14,53 @@
|
|
14
14
|
// limitations under the License.
|
15
15
|
//
|
16
16
|
|
17
|
+
// IWYU pragma: no_include <ext/alloc_traits.h>
|
18
|
+
|
17
19
|
#include <grpc/support/port_platform.h>
|
18
20
|
|
19
21
|
#include <inttypes.h>
|
20
22
|
#include <limits.h>
|
21
|
-
|
23
|
+
#include <stddef.h>
|
24
|
+
|
25
|
+
#include <algorithm>
|
26
|
+
#include <map>
|
27
|
+
#include <memory>
|
28
|
+
#include <string>
|
29
|
+
#include <utility>
|
30
|
+
#include <vector>
|
31
|
+
|
32
|
+
#include "absl/memory/memory.h"
|
33
|
+
#include "absl/status/status.h"
|
34
|
+
#include "absl/status/statusor.h"
|
22
35
|
#include "absl/strings/str_cat.h"
|
23
|
-
#include "absl/strings/
|
36
|
+
#include "absl/strings/string_view.h"
|
24
37
|
|
25
|
-
#include <grpc/
|
38
|
+
#include <grpc/impl/codegen/connectivity_state.h>
|
39
|
+
#include <grpc/impl/codegen/grpc_types.h>
|
40
|
+
#include <grpc/support/log.h>
|
26
41
|
|
27
42
|
#include "src/core/ext/filters/client_channel/lb_policy.h"
|
28
43
|
#include "src/core/ext/filters/client_channel/lb_policy/address_filtering.h"
|
29
44
|
#include "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h"
|
30
45
|
#include "src/core/ext/filters/client_channel/lb_policy_factory.h"
|
31
46
|
#include "src/core/ext/filters/client_channel/lb_policy_registry.h"
|
47
|
+
#include "src/core/ext/filters/client_channel/subchannel_interface.h"
|
32
48
|
#include "src/core/lib/channel/channel_args.h"
|
49
|
+
#include "src/core/lib/debug/trace.h"
|
50
|
+
#include "src/core/lib/gprpp/debug_location.h"
|
33
51
|
#include "src/core/lib/gprpp/orphanable.h"
|
52
|
+
#include "src/core/lib/gprpp/ref_counted.h"
|
34
53
|
#include "src/core/lib/gprpp/ref_counted_ptr.h"
|
54
|
+
#include "src/core/lib/gprpp/time.h"
|
55
|
+
#include "src/core/lib/iomgr/closure.h"
|
56
|
+
#include "src/core/lib/iomgr/error.h"
|
57
|
+
#include "src/core/lib/iomgr/exec_ctx.h"
|
58
|
+
#include "src/core/lib/iomgr/pollset_set.h"
|
35
59
|
#include "src/core/lib/iomgr/timer.h"
|
36
60
|
#include "src/core/lib/iomgr/work_serializer.h"
|
37
|
-
#include "src/core/lib/
|
61
|
+
#include "src/core/lib/json/json.h"
|
62
|
+
#include "src/core/lib/resolver/server_address.h"
|
63
|
+
#include "src/core/lib/transport/connectivity_state.h"
|
38
64
|
|
39
65
|
namespace grpc_core {
|
40
66
|
|
@@ -104,7 +130,7 @@ class PriorityLb : public LoadBalancingPolicy {
|
|
104
130
|
bool ignore_reresolution_requests);
|
105
131
|
void ExitIdleLocked();
|
106
132
|
void ResetBackoffLocked();
|
107
|
-
void
|
133
|
+
void MaybeDeactivateLocked();
|
108
134
|
void MaybeReactivateLocked();
|
109
135
|
|
110
136
|
void Orphan() override;
|
@@ -217,6 +243,8 @@ class PriorityLb : public LoadBalancingPolicy {
|
|
217
243
|
absl::Status connectivity_status_;
|
218
244
|
RefCountedPtr<RefCountedPicker> picker_wrapper_;
|
219
245
|
|
246
|
+
bool seen_ready_or_idle_since_transient_failure_ = true;
|
247
|
+
|
220
248
|
OrphanablePtr<DeactivationTimer> deactivation_timer_;
|
221
249
|
OrphanablePtr<FailoverTimer> failover_timer_;
|
222
250
|
};
|
@@ -225,14 +253,37 @@ class PriorityLb : public LoadBalancingPolicy {
|
|
225
253
|
|
226
254
|
void ShutdownLocked() override;
|
227
255
|
|
228
|
-
// Returns
|
256
|
+
// Returns the priority of the specified child name, or UINT32_MAX if
|
257
|
+
// the child is not in the current priority list.
|
229
258
|
uint32_t GetChildPriorityLocked(const std::string& child_name) const;
|
230
259
|
|
260
|
+
// Called when a child's connectivity state has changed.
|
261
|
+
// May propagate the update to the channel or trigger choosing a new
|
262
|
+
// priority.
|
231
263
|
void HandleChildConnectivityStateChangeLocked(ChildPriority* child);
|
264
|
+
|
265
|
+
// Deletes a child. Called when the child's deactivation timer fires.
|
232
266
|
void DeleteChild(ChildPriority* child);
|
233
267
|
|
234
|
-
|
235
|
-
|
268
|
+
// Iterates through the list of priorities to choose one:
|
269
|
+
// - If the child for a priority doesn't exist, creates it.
|
270
|
+
// - If a child's failover timer is pending, returns without selecting
|
271
|
+
// a priority while we wait for the child to attempt to connect. In
|
272
|
+
// this case, if report_connecting is true, reports CONNECTING state to
|
273
|
+
// the channel.
|
274
|
+
// - If the child is connected, it will be used as the current priority.
|
275
|
+
// - Otherwise, continues on to the next child.
|
276
|
+
// Reports TRANSIENT_FAILURE to the channel if all children are not
|
277
|
+
// connected.
|
278
|
+
//
|
279
|
+
// This method is idempotent; it should yield the same result every
|
280
|
+
// time as a function of the state of the children.
|
281
|
+
void ChoosePriorityLocked(bool report_connecting);
|
282
|
+
|
283
|
+
// Sets the specified priority as the current priority.
|
284
|
+
// Deactivates any children at lower priorities.
|
285
|
+
// Returns the child's picker to the channel.
|
286
|
+
void SetCurrentPriorityLocked(uint32_t priority);
|
236
287
|
|
237
288
|
const Duration child_failover_timeout_;
|
238
289
|
|
@@ -246,6 +297,8 @@ class PriorityLb : public LoadBalancingPolicy {
|
|
246
297
|
|
247
298
|
bool update_in_progress_ = false;
|
248
299
|
|
300
|
+
// All children that currently exist.
|
301
|
+
// Some of these children may be in deactivated state.
|
249
302
|
std::map<std::string, OrphanablePtr<ChildPriority>> children_;
|
250
303
|
// The priority that is being used.
|
251
304
|
uint32_t current_priority_ = UINT32_MAX;
|
@@ -312,7 +365,7 @@ void PriorityLb::UpdateLocked(UpdateArgs args) {
|
|
312
365
|
current_child_from_before_update_ = children_[child_name].get();
|
313
366
|
// Unset current_priority_, since it was an index into the old
|
314
367
|
// config's priority list and may no longer be valid. It will be
|
315
|
-
// reset later by
|
368
|
+
// reset later by ChoosePriorityLocked(), but we unset it here in
|
316
369
|
// case updating any of our children triggers a state update.
|
317
370
|
current_priority_ = UINT32_MAX;
|
318
371
|
}
|
@@ -332,7 +385,7 @@ void PriorityLb::UpdateLocked(UpdateArgs args) {
|
|
332
385
|
auto config_it = config_->children().find(child_name);
|
333
386
|
if (config_it == config_->children().end()) {
|
334
387
|
// Existing child not found in new config. Deactivate it.
|
335
|
-
child->
|
388
|
+
child->MaybeDeactivateLocked();
|
336
389
|
} else {
|
337
390
|
// Existing child found in new config. Update it.
|
338
391
|
child->UpdateLocked(config_it->second.config,
|
@@ -341,7 +394,7 @@ void PriorityLb::UpdateLocked(UpdateArgs args) {
|
|
341
394
|
}
|
342
395
|
update_in_progress_ = false;
|
343
396
|
// Try to get connected.
|
344
|
-
|
397
|
+
ChoosePriorityLocked(/*report_connecting=*/children_.empty());
|
345
398
|
}
|
346
399
|
|
347
400
|
uint32_t PriorityLb::GetChildPriorityLocked(
|
@@ -380,11 +433,11 @@ void PriorityLb::HandleChildConnectivityStateChangeLocked(
|
|
380
433
|
} else {
|
381
434
|
// If it's no longer READY or IDLE, we should stop using it.
|
382
435
|
// We already started trying other priorities as a result of the
|
383
|
-
// update, but calling
|
436
|
+
// update, but calling ChoosePriorityLocked() ensures that we will
|
384
437
|
// properly select between CONNECTING and TRANSIENT_FAILURE as the
|
385
438
|
// new state to report to our parent.
|
386
439
|
current_child_from_before_update_ = nullptr;
|
387
|
-
|
440
|
+
ChoosePriorityLocked(/*report_connecting=*/true);
|
388
441
|
}
|
389
442
|
return;
|
390
443
|
}
|
@@ -396,52 +449,26 @@ void PriorityLb::HandleChildConnectivityStateChangeLocked(
|
|
396
449
|
"priority %u",
|
397
450
|
this, child_priority, child->name().c_str(), current_priority_);
|
398
451
|
}
|
399
|
-
//
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
// If a child reports TRANSIENT_FAILURE, start trying the next priority.
|
404
|
-
// Note that even if this is for a higher-than-current priority, we
|
405
|
-
// may still need to create some children between this priority and
|
406
|
-
// the current one (e.g., if we got an update that inserted new
|
407
|
-
// priorities ahead of the current one).
|
408
|
-
if (child->connectivity_state() == GRPC_CHANNEL_TRANSIENT_FAILURE) {
|
409
|
-
TryNextPriorityLocked(
|
410
|
-
/*report_connecting=*/child_priority == current_priority_);
|
411
|
-
return;
|
412
|
-
}
|
413
|
-
// The update is for a higher-than-current priority (or for any
|
414
|
-
// priority if we don't have any current priority).
|
415
|
-
if (child_priority < current_priority_) {
|
416
|
-
// If the child reports READY or IDLE, switch to that priority.
|
417
|
-
// Otherwise, ignore the update.
|
418
|
-
if (child->connectivity_state() == GRPC_CHANNEL_READY ||
|
419
|
-
child->connectivity_state() == GRPC_CHANNEL_IDLE) {
|
420
|
-
SelectPriorityLocked(child_priority);
|
421
|
-
}
|
422
|
-
return;
|
423
|
-
}
|
424
|
-
// The current priority has returned a new picker, so pass it up to
|
425
|
-
// our parent.
|
426
|
-
channel_control_helper()->UpdateState(child->connectivity_state(),
|
427
|
-
child->connectivity_status(),
|
428
|
-
child->GetPicker());
|
452
|
+
// Unconditionally call ChoosePriorityLocked(). It should do the
|
453
|
+
// right thing based on the state of all children.
|
454
|
+
ChoosePriorityLocked(
|
455
|
+
/*report_connecting=*/child_priority == current_priority_);
|
429
456
|
}
|
430
457
|
|
431
458
|
void PriorityLb::DeleteChild(ChildPriority* child) {
|
432
459
|
// If this was the current child from before the most recent update,
|
433
460
|
// stop using it. We already started trying other priorities as a
|
434
|
-
// result of the update, but calling
|
461
|
+
// result of the update, but calling ChoosePriorityLocked() ensures that
|
435
462
|
// we will properly select between CONNECTING and TRANSIENT_FAILURE as the
|
436
463
|
// new state to report to our parent.
|
437
464
|
if (current_child_from_before_update_ == child) {
|
438
465
|
current_child_from_before_update_ = nullptr;
|
439
|
-
|
466
|
+
ChoosePriorityLocked(/*report_connecting=*/true);
|
440
467
|
}
|
441
468
|
children_.erase(child->name());
|
442
469
|
}
|
443
470
|
|
444
|
-
void PriorityLb::
|
471
|
+
void PriorityLb::ChoosePriorityLocked(bool report_connecting) {
|
445
472
|
current_priority_ = UINT32_MAX;
|
446
473
|
for (uint32_t priority = 0; priority < config_->priorities().size();
|
447
474
|
++priority) {
|
@@ -471,7 +498,7 @@ void PriorityLb::TryNextPriorityLocked(bool report_connecting) {
|
|
471
498
|
// If the child is in state READY or IDLE, switch to it.
|
472
499
|
if (child->connectivity_state() == GRPC_CHANNEL_READY ||
|
473
500
|
child->connectivity_state() == GRPC_CHANNEL_IDLE) {
|
474
|
-
|
501
|
+
SetCurrentPriorityLocked(priority);
|
475
502
|
return;
|
476
503
|
}
|
477
504
|
// Child is not READY or IDLE.
|
@@ -491,6 +518,13 @@ void PriorityLb::TryNextPriorityLocked(bool report_connecting) {
|
|
491
518
|
return;
|
492
519
|
}
|
493
520
|
// Child has been failing for a while. Move on to the next priority.
|
521
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
|
522
|
+
gpr_log(GPR_INFO,
|
523
|
+
"[priority_lb %p] skipping priority %u, child %s: state=%s, "
|
524
|
+
"failover timer not pending",
|
525
|
+
this, priority, child_name.c_str(),
|
526
|
+
ConnectivityStateName(child->connectivity_state()));
|
527
|
+
}
|
494
528
|
}
|
495
529
|
// If there are no more priorities to try, report TRANSIENT_FAILURE.
|
496
530
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
|
@@ -506,7 +540,7 @@ void PriorityLb::TryNextPriorityLocked(bool report_connecting) {
|
|
506
540
|
absl::make_unique<TransientFailurePicker>(status));
|
507
541
|
}
|
508
542
|
|
509
|
-
void PriorityLb::
|
543
|
+
void PriorityLb::SetCurrentPriorityLocked(uint32_t priority) {
|
510
544
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
|
511
545
|
gpr_log(GPR_INFO, "[priority_lb %p] selected priority %u, child %s", this,
|
512
546
|
priority, config_->priorities()[priority].c_str());
|
@@ -517,7 +551,7 @@ void PriorityLb::SelectPriorityLocked(uint32_t priority) {
|
|
517
551
|
for (uint32_t p = priority + 1; p < config_->priorities().size(); ++p) {
|
518
552
|
const std::string& child_name = config_->priorities()[p];
|
519
553
|
auto it = children_.find(child_name);
|
520
|
-
if (it != children_.end()) it->second->
|
554
|
+
if (it != children_.end()) it->second->MaybeDeactivateLocked();
|
521
555
|
}
|
522
556
|
// Update picker.
|
523
557
|
auto& child = children_[config_->priorities()[priority]];
|
@@ -742,9 +776,6 @@ PriorityLb::ChildPriority::CreateChildPolicyLocked(
|
|
742
776
|
}
|
743
777
|
|
744
778
|
void PriorityLb::ChildPriority::ExitIdleLocked() {
|
745
|
-
if (connectivity_state_ == GRPC_CHANNEL_IDLE && failover_timer_ == nullptr) {
|
746
|
-
failover_timer_ = MakeOrphanable<FailoverTimer>(Ref());
|
747
|
-
}
|
748
779
|
child_policy_->ExitIdleLocked();
|
749
780
|
}
|
750
781
|
|
@@ -766,20 +797,31 @@ void PriorityLb::ChildPriority::OnConnectivityStateUpdateLocked(
|
|
766
797
|
connectivity_state_ = state;
|
767
798
|
connectivity_status_ = status;
|
768
799
|
picker_wrapper_ = MakeRefCounted<RefCountedPicker>(std::move(picker));
|
769
|
-
// If
|
770
|
-
|
771
|
-
|
800
|
+
// If we transition to state CONNECTING and we've not seen
|
801
|
+
// TRANSIENT_FAILURE more recently than READY or IDLE, start failover
|
802
|
+
// timer if not already pending.
|
803
|
+
// In any other state, update seen_ready_or_idle_since_transient_failure_
|
804
|
+
// and cancel failover timer.
|
805
|
+
if (state == GRPC_CHANNEL_CONNECTING) {
|
806
|
+
if (seen_ready_or_idle_since_transient_failure_ &&
|
807
|
+
failover_timer_ == nullptr) {
|
808
|
+
failover_timer_ = MakeOrphanable<FailoverTimer>(Ref());
|
809
|
+
}
|
810
|
+
} else if (state == GRPC_CHANNEL_READY || state == GRPC_CHANNEL_IDLE) {
|
811
|
+
seen_ready_or_idle_since_transient_failure_ = true;
|
812
|
+
failover_timer_.reset();
|
813
|
+
} else if (state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
|
814
|
+
seen_ready_or_idle_since_transient_failure_ = false;
|
772
815
|
failover_timer_.reset();
|
773
816
|
}
|
774
817
|
// Notify the parent policy.
|
775
818
|
priority_policy_->HandleChildConnectivityStateChangeLocked(this);
|
776
819
|
}
|
777
820
|
|
778
|
-
void PriorityLb::ChildPriority::
|
779
|
-
|
780
|
-
|
781
|
-
|
782
|
-
deactivation_timer_ = MakeOrphanable<DeactivationTimer>(Ref());
|
821
|
+
void PriorityLb::ChildPriority::MaybeDeactivateLocked() {
|
822
|
+
if (deactivation_timer_ == nullptr) {
|
823
|
+
deactivation_timer_ = MakeOrphanable<DeactivationTimer>(Ref());
|
824
|
+
}
|
783
825
|
}
|
784
826
|
|
785
827
|
void PriorityLb::ChildPriority::MaybeReactivateLocked() {
|