grpc 1.60.2 → 1.61.0.pre2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Makefile +208 -165
- data/include/grpc/event_engine/event_engine.h +59 -12
- data/include/grpc/event_engine/internal/memory_allocator_impl.h +6 -0
- data/include/grpc/event_engine/internal/slice_cast.h +12 -0
- data/include/grpc/event_engine/memory_allocator.h +3 -1
- data/include/grpc/event_engine/slice.h +5 -0
- data/include/grpc/grpc_security.h +22 -1
- data/include/grpc/impl/call.h +29 -0
- data/include/grpc/impl/channel_arg_names.h +12 -1
- data/include/grpc/impl/slice_type.h +1 -1
- data/include/grpc/module.modulemap +1 -0
- data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +54 -7
- data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +20 -6
- data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +10 -13
- data/src/core/ext/filters/channel_idle/channel_idle_filter.h +18 -10
- data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +326 -0
- data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h +143 -0
- data/src/core/ext/filters/client_channel/backend_metric.cc +2 -2
- data/src/core/ext/filters/client_channel/client_channel.cc +32 -6
- data/src/core/ext/filters/client_channel/client_channel_internal.h +2 -0
- data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +54 -21
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +3 -2
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +2 -1
- data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.cc +12 -15
- data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.h +8 -5
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +139 -92
- data/src/core/ext/filters/client_channel/lb_policy/health_check_client.cc +9 -4
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +9 -4
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +10 -11
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +94 -93
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +5 -3
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +12 -15
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +38 -16
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +25 -28
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +10 -10
- data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +37 -35
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +11 -9
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +504 -461
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +232 -122
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -6
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +642 -251
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.h +2 -6
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +7 -8
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +2 -1
- data/src/core/ext/filters/client_channel/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +3 -1
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +2 -2
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +2 -2
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +6 -8
- data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.cc +1031 -0
- data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.h +277 -0
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +128 -270
- data/src/core/ext/filters/client_channel/resolver/xds/{xds_resolver.h → xds_resolver_attributes.h} +5 -4
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.cc +25 -0
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.h +30 -0
- data/src/core/ext/filters/client_channel/retry_filter.cc +1 -0
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +35 -17
- data/src/core/ext/filters/deadline/deadline_filter.cc +12 -0
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +17 -13
- data/src/core/ext/filters/fault_injection/fault_injection_filter.h +13 -4
- data/src/core/ext/filters/http/client/http_client_filter.cc +23 -32
- data/src/core/ext/filters/http/client/http_client_filter.h +10 -5
- data/src/core/ext/filters/http/client_authority_filter.cc +14 -14
- data/src/core/ext/filters/http/client_authority_filter.h +12 -4
- data/src/core/ext/filters/http/http_filters_plugin.cc +42 -20
- data/src/core/ext/filters/http/message_compress/compression_filter.cc +55 -80
- data/src/core/ext/filters/http/message_compress/compression_filter.h +54 -12
- data/src/core/ext/filters/http/message_compress/legacy_compression_filter.cc +325 -0
- data/src/core/ext/filters/http/message_compress/legacy_compression_filter.h +139 -0
- data/src/core/ext/filters/http/server/http_server_filter.cc +41 -41
- data/src/core/ext/filters/http/server/http_server_filter.h +11 -4
- data/src/core/ext/filters/message_size/message_size_filter.cc +56 -76
- data/src/core/ext/filters/message_size/message_size_filter.h +35 -23
- data/src/core/ext/filters/rbac/rbac_filter.cc +15 -11
- data/src/core/ext/filters/rbac/rbac_filter.h +11 -4
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +25 -13
- data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +47 -50
- data/src/core/ext/filters/stateful_session/stateful_session_filter.h +21 -4
- data/src/core/ext/transport/chttp2/alpn/alpn.cc +1 -1
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -2
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +11 -2
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +68 -145
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -3
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +21 -82
- data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -8
- data/src/core/ext/transport/chttp2/transport/frame.cc +506 -0
- data/src/core/ext/transport/chttp2/transport/frame.h +214 -0
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +33 -79
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +4 -7
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +27 -36
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +0 -2
- data/src/core/ext/transport/chttp2/transport/http2_settings.cc +122 -32
- data/src/core/ext/transport/chttp2/transport/http2_settings.h +142 -37
- data/src/core/ext/transport/chttp2/transport/internal.h +1 -22
- data/src/core/ext/transport/chttp2/transport/parsing.cc +23 -37
- data/src/core/ext/transport/chttp2/transport/writing.cc +26 -58
- data/src/core/ext/transport/inproc/inproc_transport.cc +172 -13
- data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb.h +712 -0
- data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.c +151 -0
- data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.h +33 -0
- data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.c +133 -0
- data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.h +50 -0
- data/src/core/ext/xds/certificate_provider_store.cc +2 -1
- data/src/core/ext/xds/certificate_provider_store.h +0 -5
- data/src/core/ext/xds/xds_api.cc +31 -18
- data/src/core/ext/xds/xds_api.h +2 -2
- data/src/core/ext/xds/xds_bootstrap.h +3 -0
- data/src/core/ext/xds/xds_certificate_provider.cc +88 -287
- data/src/core/ext/xds/xds_certificate_provider.h +44 -111
- data/src/core/ext/xds/xds_client.cc +420 -414
- data/src/core/ext/xds/xds_client.h +31 -22
- data/src/core/ext/xds/xds_client_grpc.cc +3 -1
- data/src/core/ext/xds/xds_cluster.cc +104 -11
- data/src/core/ext/xds/xds_cluster.h +9 -1
- data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +9 -5
- data/src/core/ext/xds/xds_common_types.cc +14 -10
- data/src/core/ext/xds/xds_endpoint.cc +9 -4
- data/src/core/ext/xds/xds_endpoint.h +5 -1
- data/src/core/ext/xds/xds_health_status.cc +12 -2
- data/src/core/ext/xds/xds_health_status.h +4 -2
- data/src/core/ext/xds/xds_http_rbac_filter.cc +5 -3
- data/src/core/ext/xds/xds_listener.cc +14 -8
- data/src/core/ext/xds/xds_resource_type_impl.h +6 -4
- data/src/core/ext/xds/xds_route_config.cc +34 -22
- data/src/core/ext/xds/xds_route_config.h +1 -0
- data/src/core/ext/xds/xds_server_config_fetcher.cc +61 -57
- data/src/core/ext/xds/xds_transport.h +3 -0
- data/src/core/ext/xds/xds_transport_grpc.cc +47 -50
- data/src/core/ext/xds/xds_transport_grpc.h +4 -0
- data/src/core/lib/channel/call_tracer.cc +12 -0
- data/src/core/lib/channel/call_tracer.h +17 -3
- data/src/core/lib/channel/channel_args.cc +24 -14
- data/src/core/lib/channel/channel_args.h +74 -13
- data/src/core/lib/channel/channel_stack.cc +27 -0
- data/src/core/lib/channel/channel_stack.h +10 -10
- data/src/core/lib/channel/connected_channel.cc +64 -18
- data/src/core/lib/channel/promise_based_filter.h +1041 -1
- data/src/core/lib/channel/server_call_tracer_filter.cc +43 -35
- data/src/core/lib/compression/compression_internal.cc +0 -3
- data/src/core/lib/event_engine/ares_resolver.cc +35 -14
- data/src/core/lib/event_engine/ares_resolver.h +9 -10
- data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +8 -1
- data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +132 -0
- data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h +61 -0
- data/src/core/lib/event_engine/posix_engine/posix_engine.cc +52 -36
- data/src/core/lib/event_engine/posix_engine/posix_engine.h +4 -9
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +11 -3
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +9 -2
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +7 -0
- data/src/core/lib/event_engine/posix_engine/timer_manager.cc +17 -27
- data/src/core/lib/event_engine/posix_engine/timer_manager.h +0 -3
- data/src/core/lib/event_engine/ref_counted_dns_resolver_interface.h +55 -0
- data/src/core/lib/event_engine/windows/native_windows_dns_resolver.cc +114 -0
- data/src/core/lib/event_engine/windows/native_windows_dns_resolver.h +51 -0
- data/src/core/lib/event_engine/windows/windows_engine.cc +7 -7
- data/src/core/lib/experiments/config.cc +13 -0
- data/src/core/lib/experiments/config.h +3 -0
- data/src/core/lib/experiments/experiments.cc +245 -366
- data/src/core/lib/experiments/experiments.h +50 -156
- data/src/core/lib/gprpp/debug_location.h +13 -0
- data/src/core/lib/gprpp/dual_ref_counted.h +36 -7
- data/src/core/lib/gprpp/orphanable.h +27 -0
- data/src/core/lib/gprpp/ref_counted.h +63 -22
- data/src/core/lib/gprpp/ref_counted_ptr.h +70 -27
- data/src/core/lib/gprpp/ref_counted_string.h +13 -0
- data/src/core/lib/gprpp/status_helper.cc +1 -2
- data/src/core/lib/iomgr/combiner.cc +15 -51
- data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +31 -0
- data/src/core/lib/iomgr/event_engine_shims/endpoint.h +16 -0
- data/src/core/lib/iomgr/tcp_client_posix.cc +4 -3
- data/src/core/lib/load_balancing/lb_policy.h +1 -1
- data/src/core/lib/promise/activity.cc +17 -2
- data/src/core/lib/promise/activity.h +5 -4
- data/src/core/lib/promise/all_ok.h +80 -0
- data/src/core/lib/promise/detail/join_state.h +2077 -0
- data/src/core/lib/promise/detail/promise_factory.h +1 -0
- data/src/core/lib/promise/detail/promise_like.h +8 -1
- data/src/core/lib/promise/detail/seq_state.h +3458 -150
- data/src/core/lib/promise/detail/status.h +42 -5
- data/src/core/lib/promise/for_each.h +13 -1
- data/src/core/lib/promise/if.h +4 -0
- data/src/core/lib/promise/latch.h +6 -3
- data/src/core/lib/promise/party.cc +33 -31
- data/src/core/lib/promise/party.h +142 -6
- data/src/core/lib/promise/poll.h +39 -13
- data/src/core/lib/promise/promise.h +4 -0
- data/src/core/lib/promise/seq.h +107 -7
- data/src/core/lib/promise/status_flag.h +196 -0
- data/src/core/lib/promise/try_join.h +132 -0
- data/src/core/lib/promise/try_seq.h +132 -10
- data/src/core/lib/resolver/endpoint_addresses.cc +0 -1
- data/src/core/lib/resolver/endpoint_addresses.h +48 -0
- data/src/core/lib/resource_quota/arena.h +2 -2
- data/src/core/lib/resource_quota/memory_quota.cc +57 -8
- data/src/core/lib/resource_quota/memory_quota.h +6 -0
- data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +14 -11
- data/src/core/lib/security/authorization/grpc_server_authz_filter.h +14 -5
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +4 -0
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +4 -0
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +28 -20
- data/src/core/lib/security/credentials/external/external_account_credentials.h +4 -0
- data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +4 -0
- data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -0
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +4 -0
- data/src/core/lib/security/credentials/external/url_external_account_credentials.h +4 -0
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -1
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +0 -3
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +12 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.cc +22 -5
- data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.h +1 -5
- data/src/core/lib/security/credentials/tls/tls_credentials.cc +16 -0
- data/src/core/lib/security/credentials/xds/xds_credentials.cc +21 -28
- data/src/core/lib/security/credentials/xds/xds_credentials.h +2 -4
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +4 -3
- data/src/core/lib/security/transport/auth_filters.h +71 -4
- data/src/core/lib/security/transport/client_auth_filter.cc +2 -4
- data/src/core/lib/security/transport/legacy_server_auth_filter.cc +244 -0
- data/src/core/lib/security/transport/server_auth_filter.cc +70 -90
- data/src/core/lib/slice/slice_buffer.h +3 -0
- data/src/core/lib/surface/builtins.cc +1 -1
- data/src/core/lib/surface/call.cc +683 -196
- data/src/core/lib/surface/call.h +26 -13
- data/src/core/lib/surface/call_trace.cc +42 -1
- data/src/core/lib/surface/channel.cc +0 -1
- data/src/core/lib/surface/channel.h +0 -6
- data/src/core/lib/surface/channel_init.h +26 -0
- data/src/core/lib/surface/init.cc +14 -8
- data/src/core/lib/surface/server.cc +256 -237
- data/src/core/lib/surface/server.h +26 -54
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/surface/wait_for_cq_end_op.h +94 -0
- data/src/core/lib/transport/call_final_info.cc +38 -0
- data/src/core/lib/transport/call_final_info.h +54 -0
- data/src/core/lib/transport/connectivity_state.cc +3 -2
- data/src/core/lib/transport/connectivity_state.h +4 -0
- data/src/core/lib/transport/metadata_batch.h +4 -4
- data/src/core/lib/transport/transport.cc +70 -19
- data/src/core/lib/transport/transport.h +395 -25
- data/src/core/plugin_registry/grpc_plugin_registry.cc +3 -0
- data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +0 -3
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
- data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -1
- data/src/core/tsi/ssl_transport_security.cc +65 -43
- data/src/ruby/ext/grpc/rb_channel_args.c +3 -1
- data/src/ruby/ext/grpc/rb_grpc.c +0 -1
- data/src/ruby/ext/grpc/rb_grpc.h +0 -2
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/third_party/upb/upb/reflection/def_pool.h +2 -2
- data/third_party/zlib/adler32.c +5 -27
- data/third_party/zlib/compress.c +5 -16
- data/third_party/zlib/crc32.c +86 -162
- data/third_party/zlib/deflate.c +233 -336
- data/third_party/zlib/deflate.h +8 -8
- data/third_party/zlib/gzguts.h +11 -12
- data/third_party/zlib/infback.c +7 -23
- data/third_party/zlib/inffast.c +1 -4
- data/third_party/zlib/inffast.h +1 -1
- data/third_party/zlib/inflate.c +30 -99
- data/third_party/zlib/inftrees.c +6 -11
- data/third_party/zlib/inftrees.h +3 -3
- data/third_party/zlib/trees.c +224 -302
- data/third_party/zlib/uncompr.c +4 -12
- data/third_party/zlib/zconf.h +6 -2
- data/third_party/zlib/zlib.h +191 -188
- data/third_party/zlib/zutil.c +16 -44
- data/third_party/zlib/zutil.h +10 -10
- metadata +35 -13
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +0 -1173
- data/src/core/lib/event_engine/memory_allocator.cc +0 -74
- data/src/core/lib/transport/pid_controller.cc +0 -51
- data/src/core/lib/transport/pid_controller.h +0 -116
- data/third_party/upb/upb/collections/array.h +0 -17
- data/third_party/upb/upb/collections/map.h +0 -17
- data/third_party/upb/upb/upb.hpp +0 -18
@@ -0,0 +1,326 @@
|
|
1
|
+
// Copyright 2022 gRPC authors.
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
|
15
|
+
// TODO(ctiller): Add a unit test suite for these filters once it's practical to
|
16
|
+
// mock transport operations.
|
17
|
+
|
18
|
+
#include <grpc/support/port_platform.h>
|
19
|
+
|
20
|
+
#include "src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h"
|
21
|
+
|
22
|
+
#include <functional>
|
23
|
+
#include <utility>
|
24
|
+
|
25
|
+
#include "absl/base/thread_annotations.h"
|
26
|
+
#include "absl/meta/type_traits.h"
|
27
|
+
#include "absl/random/random.h"
|
28
|
+
#include "absl/types/optional.h"
|
29
|
+
|
30
|
+
#include <grpc/impl/channel_arg_names.h>
|
31
|
+
#include <grpc/support/log.h>
|
32
|
+
|
33
|
+
#include "src/core/lib/channel/channel_args.h"
|
34
|
+
#include "src/core/lib/channel/promise_based_filter.h"
|
35
|
+
#include "src/core/lib/config/core_configuration.h"
|
36
|
+
#include "src/core/lib/debug/trace.h"
|
37
|
+
#include "src/core/lib/experiments/experiments.h"
|
38
|
+
#include "src/core/lib/gprpp/debug_location.h"
|
39
|
+
#include "src/core/lib/gprpp/no_destruct.h"
|
40
|
+
#include "src/core/lib/gprpp/orphanable.h"
|
41
|
+
#include "src/core/lib/gprpp/per_cpu.h"
|
42
|
+
#include "src/core/lib/gprpp/status_helper.h"
|
43
|
+
#include "src/core/lib/gprpp/sync.h"
|
44
|
+
#include "src/core/lib/iomgr/closure.h"
|
45
|
+
#include "src/core/lib/iomgr/error.h"
|
46
|
+
#include "src/core/lib/iomgr/exec_ctx.h"
|
47
|
+
#include "src/core/lib/promise/exec_ctx_wakeup_scheduler.h"
|
48
|
+
#include "src/core/lib/promise/loop.h"
|
49
|
+
#include "src/core/lib/promise/poll.h"
|
50
|
+
#include "src/core/lib/promise/promise.h"
|
51
|
+
#include "src/core/lib/promise/sleep.h"
|
52
|
+
#include "src/core/lib/promise/try_seq.h"
|
53
|
+
#include "src/core/lib/surface/channel_stack_type.h"
|
54
|
+
#include "src/core/lib/transport/http2_errors.h"
|
55
|
+
#include "src/core/lib/transport/metadata_batch.h"
|
56
|
+
|
57
|
+
namespace grpc_core {
|
58
|
+
|
59
|
+
namespace {
|
60
|
+
|
61
|
+
// TODO(roth): This can go back to being a constant when the experiment
|
62
|
+
// is removed.
|
63
|
+
Duration DefaultIdleTimeout() {
|
64
|
+
if (IsClientIdlenessEnabled()) return Duration::Minutes(30);
|
65
|
+
return Duration::Infinity();
|
66
|
+
}
|
67
|
+
|
68
|
+
// If these settings change, make sure that we are not sending a GOAWAY for
|
69
|
+
// inproc transport, since a GOAWAY to inproc ends up destroying the transport.
|
70
|
+
const auto kDefaultMaxConnectionAge = Duration::Infinity();
|
71
|
+
const auto kDefaultMaxConnectionAgeGrace = Duration::Infinity();
|
72
|
+
const auto kDefaultMaxConnectionIdle = Duration::Infinity();
|
73
|
+
const auto kMaxConnectionAgeJitter = 0.1;
|
74
|
+
|
75
|
+
TraceFlag grpc_trace_client_idle_filter(false, "client_idle_filter");
|
76
|
+
} // namespace
|
77
|
+
|
78
|
+
#define GRPC_IDLE_FILTER_LOG(format, ...) \
|
79
|
+
do { \
|
80
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_client_idle_filter)) { \
|
81
|
+
gpr_log(GPR_INFO, "(client idle filter) " format, ##__VA_ARGS__); \
|
82
|
+
} \
|
83
|
+
} while (0)
|
84
|
+
|
85
|
+
namespace {
|
86
|
+
|
87
|
+
Duration GetClientIdleTimeout(const ChannelArgs& args) {
|
88
|
+
return args.GetDurationFromIntMillis(GRPC_ARG_CLIENT_IDLE_TIMEOUT_MS)
|
89
|
+
.value_or(DefaultIdleTimeout());
|
90
|
+
}
|
91
|
+
|
92
|
+
} // namespace
|
93
|
+
|
94
|
+
struct LegacyMaxAgeFilter::Config {
|
95
|
+
Duration max_connection_age;
|
96
|
+
Duration max_connection_idle;
|
97
|
+
Duration max_connection_age_grace;
|
98
|
+
|
99
|
+
bool enable() const {
|
100
|
+
return max_connection_age != Duration::Infinity() ||
|
101
|
+
max_connection_idle != Duration::Infinity();
|
102
|
+
}
|
103
|
+
|
104
|
+
// A random jitter of +/-10% will be added to MAX_CONNECTION_AGE and
|
105
|
+
// MAX_CONNECTION_IDLE to spread out reconnection storms.
|
106
|
+
static Config FromChannelArgs(const ChannelArgs& args) {
|
107
|
+
const Duration args_max_age =
|
108
|
+
args.GetDurationFromIntMillis(GRPC_ARG_MAX_CONNECTION_AGE_MS)
|
109
|
+
.value_or(kDefaultMaxConnectionAge);
|
110
|
+
const Duration args_max_idle =
|
111
|
+
args.GetDurationFromIntMillis(GRPC_ARG_MAX_CONNECTION_IDLE_MS)
|
112
|
+
.value_or(kDefaultMaxConnectionIdle);
|
113
|
+
const Duration args_max_age_grace =
|
114
|
+
args.GetDurationFromIntMillis(GRPC_ARG_MAX_CONNECTION_AGE_GRACE_MS)
|
115
|
+
.value_or(kDefaultMaxConnectionAgeGrace);
|
116
|
+
// generate a random number between 1 - kMaxConnectionAgeJitter and
|
117
|
+
// 1 + kMaxConnectionAgeJitter
|
118
|
+
struct BitGen {
|
119
|
+
Mutex mu;
|
120
|
+
absl::BitGen bit_gen ABSL_GUARDED_BY(mu);
|
121
|
+
double MakeUniformDouble(double min, double max) {
|
122
|
+
MutexLock lock(&mu);
|
123
|
+
return absl::Uniform(bit_gen, min, max);
|
124
|
+
}
|
125
|
+
};
|
126
|
+
static NoDestruct<PerCpu<BitGen>> bit_gen(PerCpuOptions().SetMaxShards(8));
|
127
|
+
const double multiplier = bit_gen->this_cpu().MakeUniformDouble(
|
128
|
+
1.0 - kMaxConnectionAgeJitter, 1.0 + kMaxConnectionAgeJitter);
|
129
|
+
// GRPC_MILLIS_INF_FUTURE - 0.5 converts the value to float, so that result
|
130
|
+
// will not be cast to int implicitly before the comparison.
|
131
|
+
return Config{args_max_age * multiplier, args_max_idle * multiplier,
|
132
|
+
args_max_age_grace};
|
133
|
+
}
|
134
|
+
};
|
135
|
+
|
136
|
+
absl::StatusOr<LegacyClientIdleFilter> LegacyClientIdleFilter::Create(
|
137
|
+
const ChannelArgs& args, ChannelFilter::Args filter_args) {
|
138
|
+
LegacyClientIdleFilter filter(filter_args.channel_stack(),
|
139
|
+
GetClientIdleTimeout(args));
|
140
|
+
return absl::StatusOr<LegacyClientIdleFilter>(std::move(filter));
|
141
|
+
}
|
142
|
+
|
143
|
+
absl::StatusOr<LegacyMaxAgeFilter> LegacyMaxAgeFilter::Create(
|
144
|
+
const ChannelArgs& args, ChannelFilter::Args filter_args) {
|
145
|
+
LegacyMaxAgeFilter filter(filter_args.channel_stack(),
|
146
|
+
Config::FromChannelArgs(args));
|
147
|
+
return absl::StatusOr<LegacyMaxAgeFilter>(std::move(filter));
|
148
|
+
}
|
149
|
+
|
150
|
+
void LegacyMaxAgeFilter::Shutdown() {
|
151
|
+
max_age_activity_.Reset();
|
152
|
+
LegacyChannelIdleFilter::Shutdown();
|
153
|
+
}
|
154
|
+
|
155
|
+
void LegacyMaxAgeFilter::PostInit() {
|
156
|
+
struct StartupClosure {
|
157
|
+
RefCountedPtr<grpc_channel_stack> channel_stack;
|
158
|
+
LegacyMaxAgeFilter* filter;
|
159
|
+
grpc_closure closure;
|
160
|
+
};
|
161
|
+
auto run_startup = [](void* p, grpc_error_handle) {
|
162
|
+
auto* startup = static_cast<StartupClosure*>(p);
|
163
|
+
// Trigger idle timer
|
164
|
+
startup->filter->IncreaseCallCount();
|
165
|
+
startup->filter->DecreaseCallCount();
|
166
|
+
grpc_transport_op* op = grpc_make_transport_op(nullptr);
|
167
|
+
op->start_connectivity_watch.reset(
|
168
|
+
new ConnectivityWatcher(startup->filter));
|
169
|
+
op->start_connectivity_watch_state = GRPC_CHANNEL_IDLE;
|
170
|
+
grpc_channel_next_op(
|
171
|
+
grpc_channel_stack_element(startup->channel_stack.get(), 0), op);
|
172
|
+
delete startup;
|
173
|
+
};
|
174
|
+
auto* startup =
|
175
|
+
new StartupClosure{this->channel_stack()->Ref(), this, grpc_closure{}};
|
176
|
+
GRPC_CLOSURE_INIT(&startup->closure, run_startup, startup, nullptr);
|
177
|
+
ExecCtx::Run(DEBUG_LOCATION, &startup->closure, absl::OkStatus());
|
178
|
+
|
179
|
+
auto channel_stack = this->channel_stack()->Ref();
|
180
|
+
|
181
|
+
// Start the max age timer
|
182
|
+
if (max_connection_age_ != Duration::Infinity()) {
|
183
|
+
max_age_activity_.Set(MakeActivity(
|
184
|
+
TrySeq(
|
185
|
+
// First sleep until the max connection age
|
186
|
+
Sleep(Timestamp::Now() + max_connection_age_),
|
187
|
+
// Then send a goaway.
|
188
|
+
[this] {
|
189
|
+
GRPC_CHANNEL_STACK_REF(this->channel_stack(),
|
190
|
+
"max_age send_goaway");
|
191
|
+
// Jump out of the activity to send the goaway.
|
192
|
+
auto fn = [](void* arg, grpc_error_handle) {
|
193
|
+
auto* channel_stack = static_cast<grpc_channel_stack*>(arg);
|
194
|
+
grpc_transport_op* op = grpc_make_transport_op(nullptr);
|
195
|
+
op->goaway_error = grpc_error_set_int(
|
196
|
+
GRPC_ERROR_CREATE("max_age"),
|
197
|
+
StatusIntProperty::kHttp2Error, GRPC_HTTP2_NO_ERROR);
|
198
|
+
grpc_channel_element* elem =
|
199
|
+
grpc_channel_stack_element(channel_stack, 0);
|
200
|
+
elem->filter->start_transport_op(elem, op);
|
201
|
+
GRPC_CHANNEL_STACK_UNREF(channel_stack, "max_age send_goaway");
|
202
|
+
};
|
203
|
+
ExecCtx::Run(
|
204
|
+
DEBUG_LOCATION,
|
205
|
+
GRPC_CLOSURE_CREATE(fn, this->channel_stack(), nullptr),
|
206
|
+
absl::OkStatus());
|
207
|
+
return Immediate(absl::OkStatus());
|
208
|
+
},
|
209
|
+
// Sleep for the grace period
|
210
|
+
[this] {
|
211
|
+
return Sleep(Timestamp::Now() + max_connection_age_grace_);
|
212
|
+
}),
|
213
|
+
ExecCtxWakeupScheduler(),
|
214
|
+
[channel_stack, this](absl::Status status) {
|
215
|
+
// OnDone -- close the connection if the promise completed
|
216
|
+
// successfully.
|
217
|
+
// (if it did not, it was cancelled)
|
218
|
+
if (status.ok()) CloseChannel();
|
219
|
+
},
|
220
|
+
channel_stack->EventEngine()));
|
221
|
+
}
|
222
|
+
}
|
223
|
+
|
224
|
+
// Construct a promise for one call.
|
225
|
+
ArenaPromise<ServerMetadataHandle> LegacyChannelIdleFilter::MakeCallPromise(
|
226
|
+
CallArgs call_args, NextPromiseFactory next_promise_factory) {
|
227
|
+
using Decrementer =
|
228
|
+
std::unique_ptr<LegacyChannelIdleFilter, CallCountDecreaser>;
|
229
|
+
IncreaseCallCount();
|
230
|
+
return ArenaPromise<ServerMetadataHandle>(
|
231
|
+
[decrementer = Decrementer(this),
|
232
|
+
next = next_promise_factory(std::move(call_args))]() mutable
|
233
|
+
-> Poll<ServerMetadataHandle> { return next(); });
|
234
|
+
}
|
235
|
+
|
236
|
+
bool LegacyChannelIdleFilter::StartTransportOp(grpc_transport_op* op) {
|
237
|
+
// Catch the disconnect_with_error transport op.
|
238
|
+
if (!op->disconnect_with_error.ok()) Shutdown();
|
239
|
+
// Pass the op to the next filter.
|
240
|
+
return false;
|
241
|
+
}
|
242
|
+
|
243
|
+
void LegacyChannelIdleFilter::Shutdown() {
|
244
|
+
// IncreaseCallCount() introduces a phony call and prevent the timer from
|
245
|
+
// being reset by other threads.
|
246
|
+
IncreaseCallCount();
|
247
|
+
activity_.Reset();
|
248
|
+
}
|
249
|
+
|
250
|
+
void LegacyChannelIdleFilter::IncreaseCallCount() {
|
251
|
+
idle_filter_state_->IncreaseCallCount();
|
252
|
+
}
|
253
|
+
|
254
|
+
void LegacyChannelIdleFilter::DecreaseCallCount() {
|
255
|
+
if (idle_filter_state_->DecreaseCallCount()) {
|
256
|
+
// If there are no more calls in progress, start the idle timer.
|
257
|
+
StartIdleTimer();
|
258
|
+
}
|
259
|
+
}
|
260
|
+
|
261
|
+
void LegacyChannelIdleFilter::StartIdleTimer() {
|
262
|
+
GRPC_IDLE_FILTER_LOG("timer has started");
|
263
|
+
auto idle_filter_state = idle_filter_state_;
|
264
|
+
// Hold a ref to the channel stack for the timer callback.
|
265
|
+
auto channel_stack = channel_stack_->Ref();
|
266
|
+
auto timeout = client_idle_timeout_;
|
267
|
+
auto promise = Loop([timeout, idle_filter_state]() {
|
268
|
+
return TrySeq(Sleep(Timestamp::Now() + timeout),
|
269
|
+
[idle_filter_state]() -> Poll<LoopCtl<absl::Status>> {
|
270
|
+
if (idle_filter_state->CheckTimer()) {
|
271
|
+
return Continue{};
|
272
|
+
} else {
|
273
|
+
return absl::OkStatus();
|
274
|
+
}
|
275
|
+
});
|
276
|
+
});
|
277
|
+
activity_.Set(MakeActivity(
|
278
|
+
std::move(promise), ExecCtxWakeupScheduler{},
|
279
|
+
[channel_stack, this](absl::Status status) {
|
280
|
+
if (status.ok()) CloseChannel();
|
281
|
+
},
|
282
|
+
channel_stack->EventEngine()));
|
283
|
+
}
|
284
|
+
|
285
|
+
void LegacyChannelIdleFilter::CloseChannel() {
|
286
|
+
auto* op = grpc_make_transport_op(nullptr);
|
287
|
+
op->disconnect_with_error = grpc_error_set_int(
|
288
|
+
GRPC_ERROR_CREATE("enter idle"),
|
289
|
+
StatusIntProperty::ChannelConnectivityState, GRPC_CHANNEL_IDLE);
|
290
|
+
// Pass the transport op down to the channel stack.
|
291
|
+
auto* elem = grpc_channel_stack_element(channel_stack_, 0);
|
292
|
+
elem->filter->start_transport_op(elem, op);
|
293
|
+
}
|
294
|
+
|
295
|
+
const grpc_channel_filter LegacyClientIdleFilter::kFilter =
|
296
|
+
MakePromiseBasedFilter<LegacyClientIdleFilter, FilterEndpoint::kClient>(
|
297
|
+
"client_idle");
|
298
|
+
const grpc_channel_filter LegacyMaxAgeFilter::kFilter =
|
299
|
+
MakePromiseBasedFilter<LegacyMaxAgeFilter, FilterEndpoint::kServer>(
|
300
|
+
"max_age");
|
301
|
+
|
302
|
+
void RegisterLegacyChannelIdleFilters(CoreConfiguration::Builder* builder) {
|
303
|
+
if (IsV3ChannelIdleFiltersEnabled()) return;
|
304
|
+
builder->channel_init()
|
305
|
+
->RegisterFilter<LegacyClientIdleFilter>(GRPC_CLIENT_CHANNEL)
|
306
|
+
.ExcludeFromMinimalStack()
|
307
|
+
.If([](const ChannelArgs& channel_args) {
|
308
|
+
return GetClientIdleTimeout(channel_args) != Duration::Infinity();
|
309
|
+
});
|
310
|
+
builder->channel_init()
|
311
|
+
->RegisterFilter<LegacyMaxAgeFilter>(GRPC_SERVER_CHANNEL)
|
312
|
+
.ExcludeFromMinimalStack()
|
313
|
+
.If([](const ChannelArgs& channel_args) {
|
314
|
+
return LegacyMaxAgeFilter::Config::FromChannelArgs(channel_args)
|
315
|
+
.enable();
|
316
|
+
});
|
317
|
+
}
|
318
|
+
|
319
|
+
LegacyMaxAgeFilter::LegacyMaxAgeFilter(grpc_channel_stack* channel_stack,
|
320
|
+
const Config& max_age_config)
|
321
|
+
: LegacyChannelIdleFilter(channel_stack,
|
322
|
+
max_age_config.max_connection_idle),
|
323
|
+
max_connection_age_(max_age_config.max_connection_age),
|
324
|
+
max_connection_age_grace_(max_age_config.max_connection_age_grace) {}
|
325
|
+
|
326
|
+
} // namespace grpc_core
|
@@ -0,0 +1,143 @@
|
|
1
|
+
// Copyright 2022 gRPC authors.
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
|
15
|
+
#ifndef GRPC_SRC_CORE_EXT_FILTERS_CHANNEL_IDLE_LEGACY_CHANNEL_IDLE_FILTER_H
|
16
|
+
#define GRPC_SRC_CORE_EXT_FILTERS_CHANNEL_IDLE_LEGACY_CHANNEL_IDLE_FILTER_H
|
17
|
+
|
18
|
+
#include <grpc/support/port_platform.h>
|
19
|
+
|
20
|
+
#include <memory>
|
21
|
+
|
22
|
+
#include "absl/status/status.h"
|
23
|
+
#include "absl/status/statusor.h"
|
24
|
+
|
25
|
+
#include <grpc/impl/connectivity_state.h>
|
26
|
+
|
27
|
+
#include "src/core/ext/filters/channel_idle/idle_filter_state.h"
|
28
|
+
#include "src/core/lib/channel/channel_args.h"
|
29
|
+
#include "src/core/lib/channel/channel_fwd.h"
|
30
|
+
#include "src/core/lib/channel/channel_stack.h"
|
31
|
+
#include "src/core/lib/channel/promise_based_filter.h"
|
32
|
+
#include "src/core/lib/gprpp/orphanable.h"
|
33
|
+
#include "src/core/lib/gprpp/ref_counted_ptr.h"
|
34
|
+
#include "src/core/lib/gprpp/single_set_ptr.h"
|
35
|
+
#include "src/core/lib/gprpp/time.h"
|
36
|
+
#include "src/core/lib/promise/activity.h"
|
37
|
+
#include "src/core/lib/promise/arena_promise.h"
|
38
|
+
#include "src/core/lib/transport/connectivity_state.h"
|
39
|
+
#include "src/core/lib/transport/transport.h"
|
40
|
+
|
41
|
+
namespace grpc_core {
|
42
|
+
|
43
|
+
class LegacyChannelIdleFilter : public ChannelFilter {
|
44
|
+
public:
|
45
|
+
~LegacyChannelIdleFilter() override = default;
|
46
|
+
|
47
|
+
LegacyChannelIdleFilter(const LegacyChannelIdleFilter&) = delete;
|
48
|
+
LegacyChannelIdleFilter& operator=(const LegacyChannelIdleFilter&) = delete;
|
49
|
+
LegacyChannelIdleFilter(LegacyChannelIdleFilter&&) = default;
|
50
|
+
LegacyChannelIdleFilter& operator=(LegacyChannelIdleFilter&&) = default;
|
51
|
+
|
52
|
+
// Construct a promise for one call.
|
53
|
+
ArenaPromise<ServerMetadataHandle> MakeCallPromise(
|
54
|
+
CallArgs call_args, NextPromiseFactory next_promise_factory) override;
|
55
|
+
|
56
|
+
bool StartTransportOp(grpc_transport_op* op) override;
|
57
|
+
|
58
|
+
protected:
|
59
|
+
using SingleSetActivityPtr =
|
60
|
+
SingleSetPtr<Activity, typename ActivityPtr::deleter_type>;
|
61
|
+
|
62
|
+
LegacyChannelIdleFilter(grpc_channel_stack* channel_stack,
|
63
|
+
Duration client_idle_timeout)
|
64
|
+
: channel_stack_(channel_stack),
|
65
|
+
client_idle_timeout_(client_idle_timeout) {}
|
66
|
+
|
67
|
+
grpc_channel_stack* channel_stack() { return channel_stack_; };
|
68
|
+
|
69
|
+
virtual void Shutdown();
|
70
|
+
void CloseChannel();
|
71
|
+
|
72
|
+
void IncreaseCallCount();
|
73
|
+
void DecreaseCallCount();
|
74
|
+
|
75
|
+
private:
|
76
|
+
void StartIdleTimer();
|
77
|
+
|
78
|
+
struct CallCountDecreaser {
|
79
|
+
void operator()(LegacyChannelIdleFilter* filter) const {
|
80
|
+
filter->DecreaseCallCount();
|
81
|
+
}
|
82
|
+
};
|
83
|
+
|
84
|
+
// The channel stack to which we take refs for pending callbacks.
|
85
|
+
grpc_channel_stack* channel_stack_;
|
86
|
+
Duration client_idle_timeout_;
|
87
|
+
std::shared_ptr<IdleFilterState> idle_filter_state_{
|
88
|
+
std::make_shared<IdleFilterState>(false)};
|
89
|
+
|
90
|
+
SingleSetActivityPtr activity_;
|
91
|
+
};
|
92
|
+
|
93
|
+
class LegacyClientIdleFilter final : public LegacyChannelIdleFilter {
|
94
|
+
public:
|
95
|
+
static const grpc_channel_filter kFilter;
|
96
|
+
|
97
|
+
static absl::StatusOr<LegacyClientIdleFilter> Create(
|
98
|
+
const ChannelArgs& args, ChannelFilter::Args filter_args);
|
99
|
+
|
100
|
+
private:
|
101
|
+
using LegacyChannelIdleFilter::LegacyChannelIdleFilter;
|
102
|
+
};
|
103
|
+
|
104
|
+
class LegacyMaxAgeFilter final : public LegacyChannelIdleFilter {
|
105
|
+
public:
|
106
|
+
static const grpc_channel_filter kFilter;
|
107
|
+
struct Config;
|
108
|
+
|
109
|
+
static absl::StatusOr<LegacyMaxAgeFilter> Create(
|
110
|
+
const ChannelArgs& args, ChannelFilter::Args filter_args);
|
111
|
+
|
112
|
+
void PostInit() override;
|
113
|
+
|
114
|
+
private:
|
115
|
+
class ConnectivityWatcher : public AsyncConnectivityStateWatcherInterface {
|
116
|
+
public:
|
117
|
+
explicit ConnectivityWatcher(LegacyMaxAgeFilter* filter)
|
118
|
+
: channel_stack_(filter->channel_stack()->Ref()), filter_(filter) {}
|
119
|
+
~ConnectivityWatcher() override = default;
|
120
|
+
|
121
|
+
void OnConnectivityStateChange(grpc_connectivity_state new_state,
|
122
|
+
const absl::Status&) override {
|
123
|
+
if (new_state == GRPC_CHANNEL_SHUTDOWN) filter_->Shutdown();
|
124
|
+
}
|
125
|
+
|
126
|
+
private:
|
127
|
+
RefCountedPtr<grpc_channel_stack> channel_stack_;
|
128
|
+
LegacyMaxAgeFilter* filter_;
|
129
|
+
};
|
130
|
+
|
131
|
+
LegacyMaxAgeFilter(grpc_channel_stack* channel_stack,
|
132
|
+
const Config& max_age_config);
|
133
|
+
|
134
|
+
void Shutdown() override;
|
135
|
+
|
136
|
+
SingleSetActivityPtr max_age_activity_;
|
137
|
+
Duration max_connection_age_;
|
138
|
+
Duration max_connection_age_grace_;
|
139
|
+
};
|
140
|
+
|
141
|
+
} // namespace grpc_core
|
142
|
+
|
143
|
+
#endif // GRPC_SRC_CORE_EXT_FILTERS_CHANNEL_IDLE_LEGACY_CHANNEL_IDLE_FILTER_H
|
@@ -24,8 +24,8 @@
|
|
24
24
|
|
25
25
|
#include "absl/strings/string_view.h"
|
26
26
|
#include "upb/base/string_view.h"
|
27
|
-
#include "upb/
|
28
|
-
#include "upb/
|
27
|
+
#include "upb/mem/arena.hpp"
|
28
|
+
#include "upb/message/map.h"
|
29
29
|
#include "xds/data/orca/v3/orca_load_report.upb.h"
|
30
30
|
|
31
31
|
namespace grpc_core {
|
@@ -315,6 +315,14 @@ class ClientChannel::PromiseBasedCallData : public ClientChannel::CallData {
|
|
315
315
|
public:
|
316
316
|
explicit PromiseBasedCallData(ClientChannel* chand) : chand_(chand) {}
|
317
317
|
|
318
|
+
~PromiseBasedCallData() override {
|
319
|
+
if (was_queued_ && client_initial_metadata_ != nullptr) {
|
320
|
+
MutexLock lock(&chand_->resolution_mu_);
|
321
|
+
RemoveCallFromResolverQueuedCallsLocked();
|
322
|
+
chand_->resolver_queued_calls_.erase(this);
|
323
|
+
}
|
324
|
+
}
|
325
|
+
|
318
326
|
ArenaPromise<absl::StatusOr<CallArgs>> MakeNameResolutionPromise(
|
319
327
|
CallArgs call_args) {
|
320
328
|
pollent_ = NowOrNever(call_args.polling_entity->WaitAndCopy()).value();
|
@@ -399,6 +407,7 @@ class ClientChannel::PromiseBasedCallData : public ClientChannel::CallData {
|
|
399
407
|
const grpc_channel_filter ClientChannel::kFilterVtableWithPromises = {
|
400
408
|
ClientChannel::FilterBasedCallData::StartTransportStreamOpBatch,
|
401
409
|
ClientChannel::MakeCallPromise,
|
410
|
+
/* init_call: */ nullptr,
|
402
411
|
ClientChannel::StartTransportOp,
|
403
412
|
sizeof(ClientChannel::FilterBasedCallData),
|
404
413
|
ClientChannel::FilterBasedCallData::Init,
|
@@ -415,6 +424,7 @@ const grpc_channel_filter ClientChannel::kFilterVtableWithPromises = {
|
|
415
424
|
const grpc_channel_filter ClientChannel::kFilterVtableWithoutPromises = {
|
416
425
|
ClientChannel::FilterBasedCallData::StartTransportStreamOpBatch,
|
417
426
|
nullptr,
|
427
|
+
/* init_call: */ nullptr,
|
418
428
|
ClientChannel::StartTransportOp,
|
419
429
|
sizeof(ClientChannel::FilterBasedCallData),
|
420
430
|
ClientChannel::FilterBasedCallData::Init,
|
@@ -562,6 +572,7 @@ class DynamicTerminationFilter::CallData {
|
|
562
572
|
const grpc_channel_filter DynamicTerminationFilter::kFilterVtable = {
|
563
573
|
DynamicTerminationFilter::CallData::StartTransportStreamOpBatch,
|
564
574
|
DynamicTerminationFilter::MakeCallPromise,
|
575
|
+
/* init_call: */ nullptr,
|
565
576
|
DynamicTerminationFilter::StartTransportOp,
|
566
577
|
sizeof(DynamicTerminationFilter::CallData),
|
567
578
|
DynamicTerminationFilter::CallData::Init,
|
@@ -703,8 +714,9 @@ class ClientChannel::SubchannelWrapper : public SubchannelInterface {
|
|
703
714
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(*chand_->work_serializer_) {
|
704
715
|
auto& watcher_wrapper = watcher_map_[watcher.get()];
|
705
716
|
GPR_ASSERT(watcher_wrapper == nullptr);
|
706
|
-
watcher_wrapper = new WatcherWrapper(
|
707
|
-
|
717
|
+
watcher_wrapper = new WatcherWrapper(
|
718
|
+
std::move(watcher),
|
719
|
+
RefAsSubclass<SubchannelWrapper>(DEBUG_LOCATION, "WatcherWrapper"));
|
708
720
|
subchannel_->WatchConnectivityState(
|
709
721
|
RefCountedPtr<Subchannel::ConnectivityStateWatcherInterface>(
|
710
722
|
watcher_wrapper));
|
@@ -908,7 +920,8 @@ ClientChannel::ExternalConnectivityWatcher::ExternalConnectivityWatcher(
|
|
908
920
|
GPR_ASSERT(chand->external_watchers_[on_complete] == nullptr);
|
909
921
|
// Store a ref to the watcher in the external_watchers_ map.
|
910
922
|
chand->external_watchers_[on_complete] =
|
911
|
-
|
923
|
+
RefAsSubclass<ExternalConnectivityWatcher>(
|
924
|
+
DEBUG_LOCATION, "AddWatcherToExternalWatchersMapLocked");
|
912
925
|
}
|
913
926
|
// Pass the ref from creating the object to Start().
|
914
927
|
chand_->work_serializer_->Run(
|
@@ -1599,7 +1612,12 @@ absl::Status ClientChannel::CreateOrUpdateLbPolicyLocked(
|
|
1599
1612
|
Resolver::Result result) {
|
1600
1613
|
// Construct update.
|
1601
1614
|
LoadBalancingPolicy::UpdateArgs update_args;
|
1602
|
-
|
1615
|
+
if (!result.addresses.ok()) {
|
1616
|
+
update_args.addresses = result.addresses.status();
|
1617
|
+
} else {
|
1618
|
+
update_args.addresses = std::make_shared<EndpointAddressesListIterator>(
|
1619
|
+
std::move(*result.addresses));
|
1620
|
+
}
|
1603
1621
|
update_args.config = std::move(lb_policy_config);
|
1604
1622
|
update_args.resolution_note = std::move(result.resolution_note);
|
1605
1623
|
// Remove the config selector from channel args so that we're not holding
|
@@ -2585,6 +2603,8 @@ class ClientChannel::LoadBalancedCall::LbCallState
|
|
2585
2603
|
ServiceConfigCallData::CallAttributeInterface* GetCallAttribute(
|
2586
2604
|
UniqueTypeName type) const override;
|
2587
2605
|
|
2606
|
+
ClientCallTracer::CallAttemptTracer* GetCallAttemptTracer() const override;
|
2607
|
+
|
2588
2608
|
private:
|
2589
2609
|
LoadBalancedCall* lb_call_;
|
2590
2610
|
};
|
@@ -2676,6 +2696,11 @@ ClientChannel::LoadBalancedCall::LbCallState::GetCallAttribute(
|
|
2676
2696
|
return service_config_call_data->GetCallAttribute(type);
|
2677
2697
|
}
|
2678
2698
|
|
2699
|
+
ClientCallTracer::CallAttemptTracer*
|
2700
|
+
ClientChannel::LoadBalancedCall::LbCallState::GetCallAttemptTracer() const {
|
2701
|
+
return lb_call_->call_attempt_tracer();
|
2702
|
+
}
|
2703
|
+
|
2679
2704
|
//
|
2680
2705
|
// ClientChannel::LoadBalancedCall::BackendMetricAccessor
|
2681
2706
|
//
|
@@ -3405,7 +3430,8 @@ void ClientChannel::FilterBasedLoadBalancedCall::TryPick(bool was_queued) {
|
|
3405
3430
|
|
3406
3431
|
void ClientChannel::FilterBasedLoadBalancedCall::OnAddToQueueLocked() {
|
3407
3432
|
// Register call combiner cancellation callback.
|
3408
|
-
lb_call_canceller_ =
|
3433
|
+
lb_call_canceller_ =
|
3434
|
+
new LbQueuedCallCanceller(RefAsSubclass<FilterBasedLoadBalancedCall>());
|
3409
3435
|
}
|
3410
3436
|
|
3411
3437
|
void ClientChannel::FilterBasedLoadBalancedCall::RetryPickLocked() {
|
@@ -3494,7 +3520,7 @@ ClientChannel::PromiseBasedLoadBalancedCall::MakeCallPromise(
|
|
3494
3520
|
}
|
3495
3521
|
// Extract peer name from server initial metadata.
|
3496
3522
|
call_args.server_initial_metadata->InterceptAndMap(
|
3497
|
-
[self =
|
3523
|
+
[self = lb_call->RefAsSubclass<PromiseBasedLoadBalancedCall>()](
|
3498
3524
|
ServerMetadataHandle metadata) {
|
3499
3525
|
if (self->call_attempt_tracer() != nullptr) {
|
3500
3526
|
self->call_attempt_tracer()->RecordReceivedInitialMetadata(
|
@@ -25,6 +25,7 @@
|
|
25
25
|
|
26
26
|
#include <grpc/support/log.h>
|
27
27
|
|
28
|
+
#include "src/core/lib/channel/call_tracer.h"
|
28
29
|
#include "src/core/lib/channel/context.h"
|
29
30
|
#include "src/core/lib/gprpp/unique_type_name.h"
|
30
31
|
#include "src/core/lib/load_balancing/lb_policy.h"
|
@@ -49,6 +50,7 @@ class ClientChannelLbCallState : public LoadBalancingPolicy::CallState {
|
|
49
50
|
public:
|
50
51
|
virtual ServiceConfigCallData::CallAttributeInterface* GetCallAttribute(
|
51
52
|
UniqueTypeName type) const = 0;
|
53
|
+
virtual ClientCallTracer::CallAttemptTracer* GetCallAttemptTracer() const = 0;
|
52
54
|
};
|
53
55
|
|
54
56
|
// Internal type for ServiceConfigCallData. Handles call commits.
|
@@ -28,7 +28,7 @@ namespace grpc_core {
|
|
28
28
|
|
29
29
|
RefCountedPtr<GlobalSubchannelPool> GlobalSubchannelPool::instance() {
|
30
30
|
static GlobalSubchannelPool* p = new GlobalSubchannelPool();
|
31
|
-
return p->
|
31
|
+
return p->RefAsSubclass<GlobalSubchannelPool>();
|
32
32
|
}
|
33
33
|
|
34
34
|
RefCountedPtr<Subchannel> GlobalSubchannelPool::RegisterSubchannel(
|