grpc 1.60.0 → 1.61.0
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 +67 -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/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
@@ -47,7 +47,8 @@ namespace grpc_core {
|
|
47
47
|
|
48
48
|
namespace {
|
49
49
|
|
50
|
-
class ServerConfigSelectorFilter final
|
50
|
+
class ServerConfigSelectorFilter final
|
51
|
+
: public ImplementChannelFilter<ServerConfigSelectorFilter> {
|
51
52
|
public:
|
52
53
|
~ServerConfigSelectorFilter() override;
|
53
54
|
|
@@ -60,8 +61,16 @@ class ServerConfigSelectorFilter final : public ChannelFilter {
|
|
60
61
|
static absl::StatusOr<ServerConfigSelectorFilter> Create(
|
61
62
|
const ChannelArgs& args, ChannelFilter::Args);
|
62
63
|
|
63
|
-
|
64
|
-
|
64
|
+
class Call {
|
65
|
+
public:
|
66
|
+
absl::Status OnClientInitialMetadata(ClientMetadata& md,
|
67
|
+
ServerConfigSelectorFilter* filter);
|
68
|
+
static const NoInterceptor OnServerInitialMetadata;
|
69
|
+
static const NoInterceptor OnServerTrailingMetadata;
|
70
|
+
static const NoInterceptor OnClientToServerMessage;
|
71
|
+
static const NoInterceptor OnServerToClientMessage;
|
72
|
+
static const NoInterceptor OnFinalize;
|
73
|
+
};
|
65
74
|
|
66
75
|
absl::StatusOr<RefCountedPtr<ServerConfigSelector>> config_selector() {
|
67
76
|
MutexLock lock(&state_->mu);
|
@@ -130,25 +139,28 @@ ServerConfigSelectorFilter::~ServerConfigSelectorFilter() {
|
|
130
139
|
}
|
131
140
|
}
|
132
141
|
|
133
|
-
|
134
|
-
|
135
|
-
auto sel = config_selector();
|
136
|
-
if (!sel.ok()) return
|
137
|
-
auto call_config =
|
138
|
-
sel.value()->GetCallConfig(call_args.client_initial_metadata.get());
|
142
|
+
absl::Status ServerConfigSelectorFilter::Call::OnClientInitialMetadata(
|
143
|
+
ClientMetadata& md, ServerConfigSelectorFilter* filter) {
|
144
|
+
auto sel = filter->config_selector();
|
145
|
+
if (!sel.ok()) return sel.status();
|
146
|
+
auto call_config = sel.value()->GetCallConfig(&md);
|
139
147
|
if (!call_config.ok()) {
|
140
|
-
|
141
|
-
absl::UnavailableError(StatusToString(call_config.status()))));
|
142
|
-
return std::move(r);
|
148
|
+
return absl::UnavailableError(StatusToString(call_config.status()));
|
143
149
|
}
|
144
150
|
auto* service_config_call_data =
|
145
151
|
GetContext<Arena>()->New<ServiceConfigCallData>(
|
146
152
|
GetContext<Arena>(), GetContext<grpc_call_context_element>());
|
147
153
|
service_config_call_data->SetServiceConfig(
|
148
154
|
std::move(call_config->service_config), call_config->method_configs);
|
149
|
-
return
|
155
|
+
return absl::OkStatus();
|
150
156
|
}
|
151
157
|
|
158
|
+
const NoInterceptor ServerConfigSelectorFilter::Call::OnServerInitialMetadata;
|
159
|
+
const NoInterceptor ServerConfigSelectorFilter::Call::OnServerTrailingMetadata;
|
160
|
+
const NoInterceptor ServerConfigSelectorFilter::Call::OnClientToServerMessage;
|
161
|
+
const NoInterceptor ServerConfigSelectorFilter::Call::OnServerToClientMessage;
|
162
|
+
const NoInterceptor ServerConfigSelectorFilter::Call::OnFinalize;
|
163
|
+
|
152
164
|
} // namespace
|
153
165
|
|
154
166
|
const grpc_channel_filter kServerConfigSelectorFilter =
|
@@ -38,7 +38,7 @@
|
|
38
38
|
|
39
39
|
#include <grpc/support/log.h>
|
40
40
|
|
41
|
-
#include "src/core/ext/filters/client_channel/resolver/xds/
|
41
|
+
#include "src/core/ext/filters/client_channel/resolver/xds/xds_resolver_attributes.h"
|
42
42
|
#include "src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h"
|
43
43
|
#include "src/core/lib/channel/channel_stack.h"
|
44
44
|
#include "src/core/lib/channel/context.h"
|
@@ -58,6 +58,9 @@
|
|
58
58
|
namespace grpc_core {
|
59
59
|
|
60
60
|
TraceFlag grpc_stateful_session_filter_trace(false, "stateful_session_filter");
|
61
|
+
const NoInterceptor StatefulSessionFilter::Call::OnClientToServerMessage;
|
62
|
+
const NoInterceptor StatefulSessionFilter::Call::OnServerToClientMessage;
|
63
|
+
const NoInterceptor StatefulSessionFilter::Call::OnFinalize;
|
61
64
|
|
62
65
|
UniqueTypeName XdsOverrideHostAttribute::TypeName() {
|
63
66
|
static UniqueTypeName::Factory kFactory("xds_override_host");
|
@@ -103,7 +106,7 @@ void MaybeUpdateServerInitialMetadata(
|
|
103
106
|
bool cluster_changed, absl::string_view actual_cluster,
|
104
107
|
absl::string_view cookie_address_list,
|
105
108
|
XdsOverrideHostAttribute* override_host_attribute,
|
106
|
-
ServerMetadata
|
109
|
+
ServerMetadata& server_initial_metadata) {
|
107
110
|
// If cookie doesn't need to change, do nothing.
|
108
111
|
if (cookie_address_list == override_host_attribute->actual_address_list() &&
|
109
112
|
!cluster_changed) {
|
@@ -121,7 +124,7 @@ void MaybeUpdateServerInitialMetadata(
|
|
121
124
|
parts.emplace_back(
|
122
125
|
absl::StrCat("Max-Age=", cookie_config->ttl.as_timespec().tv_sec));
|
123
126
|
}
|
124
|
-
server_initial_metadata
|
127
|
+
server_initial_metadata.Append(
|
125
128
|
"set-cookie", Slice::FromCopiedString(absl::StrJoin(parts, "; ")),
|
126
129
|
[](absl::string_view error, const Slice&) {
|
127
130
|
Crash(absl::StrCat("ERROR ADDING set-cookie METADATA: ", error));
|
@@ -168,12 +171,11 @@ absl::string_view GetClusterToUse(
|
|
168
171
|
return absl::StripPrefix(arena_allocated_cluster, kClusterPrefix);
|
169
172
|
}
|
170
173
|
|
171
|
-
std::string GetCookieValue(const
|
174
|
+
std::string GetCookieValue(const ClientMetadata& client_initial_metadata,
|
172
175
|
absl::string_view cookie_name) {
|
173
176
|
// Check to see if the cookie header is present.
|
174
177
|
std::string buffer;
|
175
|
-
auto header_value =
|
176
|
-
client_initial_metadata->GetStringValue("cookie", &buffer);
|
178
|
+
auto header_value = client_initial_metadata.GetStringValue("cookie", &buffer);
|
177
179
|
if (!header_value.has_value()) return "";
|
178
180
|
// Parse cookie header.
|
179
181
|
std::vector<absl::string_view> values;
|
@@ -193,13 +195,14 @@ std::string GetCookieValue(const ClientMetadataHandle& client_initial_metadata,
|
|
193
195
|
}
|
194
196
|
|
195
197
|
bool IsConfiguredPath(absl::string_view configured_path,
|
196
|
-
const
|
198
|
+
const ClientMetadata& client_initial_metadata) {
|
197
199
|
// No path configured meaning all paths match
|
198
200
|
if (configured_path.empty()) {
|
199
201
|
return true;
|
200
202
|
}
|
201
203
|
// Check to see if the configured path matches the request path.
|
202
|
-
Slice* path_slice =
|
204
|
+
const Slice* path_slice =
|
205
|
+
client_initial_metadata.get_pointer(HttpPathMetadata());
|
203
206
|
GPR_ASSERT(path_slice != nullptr);
|
204
207
|
absl::string_view path = path_slice->as_string_view();
|
205
208
|
// Matching criteria from
|
@@ -218,9 +221,8 @@ bool IsConfiguredPath(absl::string_view configured_path,
|
|
218
221
|
}
|
219
222
|
} // namespace
|
220
223
|
|
221
|
-
|
222
|
-
|
223
|
-
CallArgs call_args, NextPromiseFactory next_promise_factory) {
|
224
|
+
void StatefulSessionFilter::Call::OnClientInitialMetadata(
|
225
|
+
ClientMetadata& md, StatefulSessionFilter* filter) {
|
224
226
|
// Get config.
|
225
227
|
auto* service_config_call_data = static_cast<ServiceConfigCallData*>(
|
226
228
|
GetContext<
|
@@ -229,62 +231,57 @@ ArenaPromise<ServerMetadataHandle> StatefulSessionFilter::MakeCallPromise(
|
|
229
231
|
GPR_ASSERT(service_config_call_data != nullptr);
|
230
232
|
auto* method_params = static_cast<StatefulSessionMethodParsedConfig*>(
|
231
233
|
service_config_call_data->GetMethodParsedConfig(
|
232
|
-
service_config_parser_index_));
|
234
|
+
filter->service_config_parser_index_));
|
233
235
|
GPR_ASSERT(method_params != nullptr);
|
234
|
-
|
235
|
-
GPR_ASSERT(
|
236
|
-
if (!
|
237
|
-
!IsConfiguredPath(
|
238
|
-
|
239
|
-
return next_promise_factory(std::move(call_args));
|
236
|
+
cookie_config_ = method_params->GetConfig(filter->index_);
|
237
|
+
GPR_ASSERT(cookie_config_ != nullptr);
|
238
|
+
if (!cookie_config_->name.has_value() ||
|
239
|
+
!IsConfiguredPath(cookie_config_->path, md)) {
|
240
|
+
return;
|
240
241
|
}
|
241
242
|
// Base64-decode cookie value.
|
242
|
-
std::string cookie_value =
|
243
|
-
GetCookieValue(call_args.client_initial_metadata, *cookie_config->name);
|
243
|
+
std::string cookie_value = GetCookieValue(md, *cookie_config_->name);
|
244
244
|
// Cookie format is "host;cluster"
|
245
245
|
std::pair<absl::string_view, absl::string_view> host_cluster =
|
246
246
|
absl::StrSplit(cookie_value, absl::MaxSplits(';', 1));
|
247
|
-
absl::string_view cookie_address_list;
|
248
247
|
// Allocate the string on the arena, so that it has the right lifetime.
|
249
248
|
if (!host_cluster.first.empty()) {
|
250
|
-
|
249
|
+
cookie_address_list_ = AllocateStringOnArena(host_cluster.first);
|
251
250
|
}
|
252
251
|
// Set override host attribute.
|
253
|
-
|
252
|
+
override_host_attribute_ =
|
254
253
|
GetContext<Arena>()->ManagedNew<XdsOverrideHostAttribute>(
|
255
|
-
|
256
|
-
service_config_call_data->SetCallAttribute(
|
254
|
+
cookie_address_list_);
|
255
|
+
service_config_call_data->SetCallAttribute(override_host_attribute_);
|
257
256
|
// Check if the cluster override is valid, and apply it if necessary.
|
258
257
|
// Note that cluster_name will point to an arena-allocated string
|
259
258
|
// that will still be alive when we see the server initial metadata.
|
260
259
|
// If the cluster name is empty, that means we cannot use a
|
261
260
|
// cluster override (i.e., the route uses a cluster specifier plugin).
|
262
|
-
|
261
|
+
cluster_name_ =
|
263
262
|
GetClusterToUse(host_cluster.second, service_config_call_data);
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
return md;
|
287
|
-
});
|
263
|
+
cluster_changed_ = cluster_name_ != host_cluster.second;
|
264
|
+
perform_filtering_ = true;
|
265
|
+
}
|
266
|
+
|
267
|
+
void StatefulSessionFilter::Call::OnServerInitialMetadata(ServerMetadata& md) {
|
268
|
+
if (!perform_filtering_) return;
|
269
|
+
// Add cookie to server initial metadata if needed.
|
270
|
+
MaybeUpdateServerInitialMetadata(cookie_config_, cluster_changed_,
|
271
|
+
cluster_name_, cookie_address_list_,
|
272
|
+
override_host_attribute_, md);
|
273
|
+
}
|
274
|
+
|
275
|
+
void StatefulSessionFilter::Call::OnServerTrailingMetadata(ServerMetadata& md) {
|
276
|
+
if (!perform_filtering_) return;
|
277
|
+
// If we got a Trailers-Only response, then add the
|
278
|
+
// cookie to the trailing metadata instead of the
|
279
|
+
// initial metadata.
|
280
|
+
if (md.get(GrpcTrailersOnly()).value_or(false)) {
|
281
|
+
MaybeUpdateServerInitialMetadata(cookie_config_, cluster_changed_,
|
282
|
+
cluster_name_, cookie_address_list_,
|
283
|
+
override_host_attribute_, md);
|
284
|
+
}
|
288
285
|
}
|
289
286
|
|
290
287
|
void StatefulSessionFilterRegister(CoreConfiguration::Builder* builder) {
|
@@ -26,6 +26,7 @@
|
|
26
26
|
#include "absl/status/statusor.h"
|
27
27
|
#include "absl/strings/string_view.h"
|
28
28
|
|
29
|
+
#include "src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h"
|
29
30
|
#include "src/core/lib/channel/channel_args.h"
|
30
31
|
#include "src/core/lib/channel/channel_fwd.h"
|
31
32
|
#include "src/core/lib/channel/promise_based_filter.h"
|
@@ -68,16 +69,32 @@ class XdsOverrideHostAttribute
|
|
68
69
|
};
|
69
70
|
|
70
71
|
// A filter to provide cookie-based stateful session affinity.
|
71
|
-
class StatefulSessionFilter
|
72
|
+
class StatefulSessionFilter
|
73
|
+
: public ImplementChannelFilter<StatefulSessionFilter> {
|
72
74
|
public:
|
73
75
|
static const grpc_channel_filter kFilter;
|
74
76
|
|
75
77
|
static absl::StatusOr<StatefulSessionFilter> Create(
|
76
78
|
const ChannelArgs& args, ChannelFilter::Args filter_args);
|
77
79
|
|
78
|
-
|
79
|
-
|
80
|
-
|
80
|
+
class Call {
|
81
|
+
public:
|
82
|
+
void OnClientInitialMetadata(ClientMetadata& md,
|
83
|
+
StatefulSessionFilter* filter);
|
84
|
+
void OnServerInitialMetadata(ServerMetadata& md);
|
85
|
+
void OnServerTrailingMetadata(ServerMetadata& md);
|
86
|
+
static const NoInterceptor OnClientToServerMessage;
|
87
|
+
static const NoInterceptor OnServerToClientMessage;
|
88
|
+
static const NoInterceptor OnFinalize;
|
89
|
+
|
90
|
+
private:
|
91
|
+
const StatefulSessionMethodParsedConfig::CookieConfig* cookie_config_;
|
92
|
+
XdsOverrideHostAttribute* override_host_attribute_;
|
93
|
+
absl::string_view cluster_name_;
|
94
|
+
absl::string_view cookie_address_list_;
|
95
|
+
bool cluster_changed_;
|
96
|
+
bool perform_filtering_ = false;
|
97
|
+
};
|
81
98
|
|
82
99
|
private:
|
83
100
|
explicit StatefulSessionFilter(ChannelFilter::Args filter_args);
|
@@ -25,7 +25,7 @@
|
|
25
25
|
#include "src/core/lib/gpr/useful.h"
|
26
26
|
|
27
27
|
// in order of preference
|
28
|
-
static const char* const supported_versions[] = {"
|
28
|
+
static const char* const supported_versions[] = {"h2"};
|
29
29
|
|
30
30
|
int grpc_chttp2_is_alpn_version_supported(const char* version, size_t size) {
|
31
31
|
size_t i;
|
@@ -177,9 +177,9 @@ void Chttp2Connector::OnHandshakeDone(void* arg, grpc_error_handle error) {
|
|
177
177
|
grpc_chttp2_transport_start_reading(self->result_->transport,
|
178
178
|
args->read_buffer,
|
179
179
|
&self->on_receive_settings_, nullptr);
|
180
|
-
RefCountedPtr<Chttp2Connector> cc = self->Ref();
|
181
180
|
self->timer_handle_ = self->event_engine_->RunAfter(
|
182
|
-
self->args_.deadline - Timestamp::Now(),
|
181
|
+
self->args_.deadline - Timestamp::Now(),
|
182
|
+
[self = self->RefAsSubclass<Chttp2Connector>()] {
|
183
183
|
ApplicationCallbackExecCtx callback_exec_ctx;
|
184
184
|
ExecCtx exec_ctx;
|
185
185
|
self->OnTimeout();
|
@@ -617,8 +617,17 @@ void Chttp2ServerListener::ActiveConnection::Start(
|
|
617
617
|
RefCountedPtr<HandshakingState> handshaking_state_ref;
|
618
618
|
listener_ = std::move(listener);
|
619
619
|
{
|
620
|
-
|
621
|
-
if (shutdown_)
|
620
|
+
ReleasableMutexLock lock(&mu_);
|
621
|
+
if (shutdown_) {
|
622
|
+
lock.Release();
|
623
|
+
// If the Connection is already shutdown at this point, it implies the
|
624
|
+
// owning Chttp2ServerListener and all associated ActiveConnections have
|
625
|
+
// been orphaned. The generated endpoints need to be shutdown here to
|
626
|
+
// ensure the tcp connections are closed appropriately.
|
627
|
+
grpc_endpoint_shutdown(endpoint, absl::OkStatus());
|
628
|
+
grpc_endpoint_destroy(endpoint);
|
629
|
+
return;
|
630
|
+
}
|
622
631
|
// Hold a ref to HandshakingState to allow starting the handshake outside
|
623
632
|
// the critical region.
|
624
633
|
handshaking_state_ref = handshaking_state_->Ref();
|
@@ -79,6 +79,7 @@
|
|
79
79
|
#include "src/core/lib/debug/stats.h"
|
80
80
|
#include "src/core/lib/debug/stats_data.h"
|
81
81
|
#include "src/core/lib/experiments/experiments.h"
|
82
|
+
#include "src/core/lib/gpr/string.h"
|
82
83
|
#include "src/core/lib/gpr/useful.h"
|
83
84
|
#include "src/core/lib/gprpp/bitset.h"
|
84
85
|
#include "src/core/lib/gprpp/crash.h"
|
@@ -162,10 +163,6 @@ static void read_action_locked(grpc_core::RefCountedPtr<grpc_chttp2_transport>,
|
|
162
163
|
static void continue_read_action_locked(
|
163
164
|
grpc_core::RefCountedPtr<grpc_chttp2_transport> t);
|
164
165
|
|
165
|
-
// Set a transport level setting, and push it to our peer
|
166
|
-
static void queue_setting_update(grpc_chttp2_transport* t,
|
167
|
-
grpc_chttp2_setting_id id, uint32_t value);
|
168
|
-
|
169
166
|
static void close_from_api(grpc_chttp2_transport* t, grpc_chttp2_stream* s,
|
170
167
|
grpc_error_handle error, bool tarpit);
|
171
168
|
|
@@ -342,7 +339,7 @@ void ForEachContextListEntryExecute(void* arg, Timestamps* ts,
|
|
342
339
|
}
|
343
340
|
|
344
341
|
HttpAnnotation::HttpAnnotation(
|
345
|
-
Type type,
|
342
|
+
Type type, gpr_timespec time,
|
346
343
|
absl::optional<chttp2::TransportFlowControl::Stats> transport_stats,
|
347
344
|
absl::optional<chttp2::StreamFlowControl::Stats> stream_stats)
|
348
345
|
: CallTracerAnnotationInterface::Annotation(
|
@@ -367,7 +364,7 @@ std::string HttpAnnotation::ToString() const {
|
|
367
364
|
default:
|
368
365
|
absl::StrAppend(&s, "Unknown");
|
369
366
|
}
|
370
|
-
absl::StrAppend(&s, " time: ", time_
|
367
|
+
absl::StrAppend(&s, " time: ", gpr_format_timespec(time_));
|
371
368
|
if (transport_stats_.has_value()) {
|
372
369
|
absl::StrAppend(&s, " transport:[", transport_stats_->ToString(), "]");
|
373
370
|
}
|
@@ -503,10 +500,8 @@ static void read_channel_args(grpc_chttp2_transport* t,
|
|
503
500
|
if (max_requests_per_read.has_value()) {
|
504
501
|
t->max_requests_per_read =
|
505
502
|
grpc_core::Clamp(*max_requests_per_read, 1, 10000);
|
506
|
-
} else if (grpc_core::IsChttp2BatchRequestsEnabled()) {
|
507
|
-
t->max_requests_per_read = 32;
|
508
503
|
} else {
|
509
|
-
t->max_requests_per_read =
|
504
|
+
t->max_requests_per_read = 32;
|
510
505
|
}
|
511
506
|
|
512
507
|
if (channel_args.GetBool(GRPC_ARG_ENABLE_CHANNELZ)
|
@@ -523,8 +518,8 @@ static void read_channel_args(grpc_chttp2_transport* t,
|
|
523
518
|
|
524
519
|
t->ack_pings = channel_args.GetBool("grpc.http2.ack_pings").value_or(true);
|
525
520
|
|
526
|
-
t->allow_tarpit =
|
527
|
-
|
521
|
+
t->allow_tarpit =
|
522
|
+
channel_args.GetBool(GRPC_ARG_HTTP_ALLOW_TARPIT).value_or(true);
|
528
523
|
t->min_tarpit_duration_ms =
|
529
524
|
channel_args
|
530
525
|
.GetDurationFromIntMillis(GRPC_ARG_HTTP_TARPIT_MIN_DURATION_MS)
|
@@ -551,93 +546,54 @@ static void read_channel_args(grpc_chttp2_transport* t,
|
|
551
546
|
t->max_header_list_size_soft_limit = soft_limit;
|
552
547
|
}
|
553
548
|
|
554
|
-
|
555
|
-
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
}
|
562
|
-
|
563
|
-
|
564
|
-
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
|
572
|
-
|
573
|
-
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
|
584
|
-
{true, true}},
|
585
|
-
{GRPC_ARG_HTTP2_ENABLE_TRUE_BINARY,
|
586
|
-
GRPC_CHTTP2_SETTINGS_GRPC_ALLOW_TRUE_BINARY_METADATA,
|
587
|
-
1,
|
588
|
-
0,
|
589
|
-
1,
|
590
|
-
{true, true}},
|
591
|
-
{GRPC_ARG_HTTP2_STREAM_LOOKAHEAD_BYTES,
|
592
|
-
GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE,
|
593
|
-
-1,
|
594
|
-
5,
|
595
|
-
INT32_MAX,
|
596
|
-
{true, true}}};
|
597
|
-
|
598
|
-
for (size_t i = 0; i < GPR_ARRAY_SIZE(settings_map); i++) {
|
599
|
-
const auto& setting = settings_map[i];
|
600
|
-
if (setting.availability[is_client]) {
|
601
|
-
const int value = channel_args.GetInt(setting.channel_arg_name)
|
602
|
-
.value_or(setting.default_value);
|
603
|
-
if (value >= 0) {
|
604
|
-
const int clamped_value =
|
605
|
-
grpc_core::Clamp(value, setting.min, setting.max);
|
606
|
-
queue_setting_update(t, setting.setting_id, clamped_value);
|
607
|
-
if (setting.setting_id == GRPC_CHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS) {
|
608
|
-
t->max_concurrent_streams_policy.SetTarget(clamped_value);
|
609
|
-
}
|
610
|
-
} else if (setting.setting_id ==
|
611
|
-
GRPC_CHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE) {
|
612
|
-
// Set value to 1.25 * soft limit if this is larger than
|
613
|
-
// `DEFAULT_MAX_HEADER_LIST_SIZE` and
|
614
|
-
// `GRPC_ARG_ABSOLUTE_MAX_METADATA_SIZE` is not set.
|
615
|
-
const int soft_limit = channel_args.GetInt(GRPC_ARG_MAX_METADATA_SIZE)
|
616
|
-
.value_or(setting.default_value);
|
617
|
-
const int value = (soft_limit >= 0 && soft_limit < (INT_MAX / 1.25))
|
618
|
-
? static_cast<int>(soft_limit * 1.25)
|
619
|
-
: soft_limit;
|
620
|
-
if (value > DEFAULT_MAX_HEADER_LIST_SIZE) {
|
621
|
-
queue_setting_update(
|
622
|
-
t, setting.setting_id,
|
623
|
-
grpc_core::Clamp(value, setting.min, setting.max));
|
624
|
-
}
|
625
|
-
}
|
626
|
-
} else if (channel_args.Contains(setting.channel_arg_name)) {
|
627
|
-
gpr_log(GPR_DEBUG, "%s is not available on %s",
|
628
|
-
std::string(setting.channel_arg_name).c_str(),
|
629
|
-
is_client ? "clients" : "servers");
|
549
|
+
int value;
|
550
|
+
if (!is_client) {
|
551
|
+
value = channel_args.GetInt(GRPC_ARG_MAX_CONCURRENT_STREAMS).value_or(-1);
|
552
|
+
if (value >= 0) {
|
553
|
+
t->settings.mutable_local().SetMaxConcurrentStreams(value);
|
554
|
+
t->max_concurrent_streams_policy.SetTarget(value);
|
555
|
+
}
|
556
|
+
} else if (channel_args.Contains(GRPC_ARG_MAX_CONCURRENT_STREAMS)) {
|
557
|
+
gpr_log(GPR_DEBUG, "%s is not available on clients",
|
558
|
+
GRPC_ARG_MAX_CONCURRENT_STREAMS);
|
559
|
+
}
|
560
|
+
value =
|
561
|
+
channel_args.GetInt(GRPC_ARG_HTTP2_HPACK_TABLE_SIZE_DECODER).value_or(-1);
|
562
|
+
if (value >= 0) {
|
563
|
+
t->settings.mutable_local().SetHeaderTableSize(value);
|
564
|
+
}
|
565
|
+
value = channel_args.GetInt(GRPC_ARG_ABSOLUTE_MAX_METADATA_SIZE).value_or(-1);
|
566
|
+
if (value >= 0) {
|
567
|
+
t->settings.mutable_local().SetMaxHeaderListSize(value);
|
568
|
+
} else {
|
569
|
+
// Set value to 1.25 * soft limit if this is larger than
|
570
|
+
// `DEFAULT_MAX_HEADER_LIST_SIZE` and
|
571
|
+
// `GRPC_ARG_ABSOLUTE_MAX_METADATA_SIZE` is not set.
|
572
|
+
const int soft_limit =
|
573
|
+
channel_args.GetInt(GRPC_ARG_MAX_METADATA_SIZE).value_or(-1);
|
574
|
+
const int value = (soft_limit >= 0 && soft_limit < (INT_MAX / 1.25))
|
575
|
+
? static_cast<int>(soft_limit * 1.25)
|
576
|
+
: soft_limit;
|
577
|
+
if (value > DEFAULT_MAX_HEADER_LIST_SIZE) {
|
578
|
+
t->settings.mutable_local().SetMaxHeaderListSize(value);
|
630
579
|
}
|
631
580
|
}
|
581
|
+
value = channel_args.GetInt(GRPC_ARG_HTTP2_MAX_FRAME_SIZE).value_or(-1);
|
582
|
+
if (value >= 0) {
|
583
|
+
t->settings.mutable_local().SetMaxFrameSize(value);
|
584
|
+
}
|
585
|
+
value =
|
586
|
+
channel_args.GetInt(GRPC_ARG_HTTP2_STREAM_LOOKAHEAD_BYTES).value_or(-1);
|
587
|
+
if (value >= 0) {
|
588
|
+
t->settings.mutable_local().SetInitialWindowSize(value);
|
589
|
+
}
|
590
|
+
value = channel_args.GetInt(GRPC_ARG_HTTP2_ENABLE_TRUE_BINARY).value_or(-1);
|
591
|
+
if (value >= 0) {
|
592
|
+
t->settings.mutable_local().SetAllowTrueBinaryMetadata(value != 0);
|
593
|
+
}
|
632
594
|
|
633
595
|
if (t->enable_preferred_rx_crypto_frame_advertisement) {
|
634
|
-
|
635
|
-
&grpc_chttp2_settings_parameters
|
636
|
-
[GRPC_CHTTP2_SETTINGS_GRPC_PREFERRED_RECEIVE_CRYPTO_FRAME_SIZE];
|
637
|
-
queue_setting_update(
|
638
|
-
t, GRPC_CHTTP2_SETTINGS_GRPC_PREFERRED_RECEIVE_CRYPTO_FRAME_SIZE,
|
639
|
-
grpc_core::Clamp(INT_MAX, static_cast<int>(sp->min_value),
|
640
|
-
static_cast<int>(sp->max_value)));
|
596
|
+
t->settings.mutable_local().SetPreferredReceiveCryptoMessageSize(INT_MAX);
|
641
597
|
}
|
642
598
|
|
643
599
|
t->ping_on_rst_stream_percent = grpc_core::Clamp(
|
@@ -647,7 +603,7 @@ static void read_channel_args(grpc_chttp2_transport* t,
|
|
647
603
|
|
648
604
|
t->max_concurrent_streams_overload_protection =
|
649
605
|
channel_args.GetBool(GRPC_ARG_MAX_CONCURRENT_STREAMS_OVERLOAD_PROTECTION)
|
650
|
-
.value_or(
|
606
|
+
.value_or(true);
|
651
607
|
}
|
652
608
|
|
653
609
|
static void init_keepalive_pings_if_enabled_locked(
|
@@ -711,33 +667,22 @@ grpc_chttp2_transport::grpc_chttp2_transport(
|
|
711
667
|
grpc_slice_from_copied_string(GRPC_CHTTP2_CLIENT_CONNECT_STRING));
|
712
668
|
}
|
713
669
|
grpc_slice_buffer_init(&qbuf);
|
714
|
-
// copy in initial settings to all setting sets
|
715
|
-
size_t i;
|
716
|
-
int j;
|
717
|
-
for (i = 0; i < GRPC_CHTTP2_NUM_SETTINGS; i++) {
|
718
|
-
for (j = 0; j < GRPC_NUM_SETTING_SETS; j++) {
|
719
|
-
settings[j][i] = grpc_chttp2_settings_parameters[i].default_value;
|
720
|
-
}
|
721
|
-
}
|
722
670
|
grpc_chttp2_goaway_parser_init(&goaway_parser);
|
723
671
|
|
724
672
|
// configure http2 the way we like it
|
725
673
|
if (is_client) {
|
726
|
-
|
727
|
-
|
674
|
+
settings.mutable_local().SetEnablePush(false);
|
675
|
+
settings.mutable_local().SetMaxConcurrentStreams(0);
|
728
676
|
}
|
729
|
-
|
730
|
-
|
731
|
-
queue_setting_update(this,
|
732
|
-
GRPC_CHTTP2_SETTINGS_GRPC_ALLOW_TRUE_BINARY_METADATA, 1);
|
677
|
+
settings.mutable_local().SetMaxHeaderListSize(DEFAULT_MAX_HEADER_LIST_SIZE);
|
678
|
+
settings.mutable_local().SetAllowTrueBinaryMetadata(true);
|
733
679
|
|
734
680
|
read_channel_args(this, channel_args, is_client);
|
735
681
|
|
736
682
|
// Initially allow *UP TO* MAX_CONCURRENT_STREAMS incoming before we start
|
737
683
|
// blanket cancelling them.
|
738
684
|
num_incoming_streams_before_settings_ack =
|
739
|
-
settings
|
740
|
-
[GRPC_CHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS];
|
685
|
+
settings.local().max_concurrent_streams();
|
741
686
|
|
742
687
|
grpc_core::ExecCtx exec_ctx;
|
743
688
|
combiner->Run(
|
@@ -1127,9 +1072,7 @@ static void write_action(grpc_chttp2_transport* t) {
|
|
1127
1072
|
// Choose max_frame_size as the prefered rx crypto frame size indicated by the
|
1128
1073
|
// peer.
|
1129
1074
|
int max_frame_size =
|
1130
|
-
t->settings
|
1131
|
-
[GRPC_PEER_SETTINGS]
|
1132
|
-
[GRPC_CHTTP2_SETTINGS_GRPC_PREFERRED_RECEIVE_CRYPTO_FRAME_SIZE];
|
1075
|
+
t->settings.peer().preferred_receive_crypto_message_size();
|
1133
1076
|
// Note: max frame size is 0 if the remote peer does not support adjusting the
|
1134
1077
|
// sending frame size.
|
1135
1078
|
if (max_frame_size == 0) {
|
@@ -1206,23 +1149,6 @@ static void write_action_end_locked(
|
|
1206
1149
|
grpc_chttp2_end_write(t.get(), error);
|
1207
1150
|
}
|
1208
1151
|
|
1209
|
-
// Dirties an HTTP2 setting to be sent out next time a writing path occurs.
|
1210
|
-
// If the change needs to occur immediately, manually initiate a write.
|
1211
|
-
static void queue_setting_update(grpc_chttp2_transport* t,
|
1212
|
-
grpc_chttp2_setting_id id, uint32_t value) {
|
1213
|
-
const grpc_chttp2_setting_parameters* sp =
|
1214
|
-
&grpc_chttp2_settings_parameters[id];
|
1215
|
-
uint32_t use_value = grpc_core::Clamp(value, sp->min_value, sp->max_value);
|
1216
|
-
if (use_value != value) {
|
1217
|
-
gpr_log(GPR_INFO, "Requested parameter %s clamped from %d to %d", sp->name,
|
1218
|
-
value, use_value);
|
1219
|
-
}
|
1220
|
-
if (use_value != t->settings[GRPC_LOCAL_SETTINGS][id]) {
|
1221
|
-
t->settings[GRPC_LOCAL_SETTINGS][id] = use_value;
|
1222
|
-
t->dirtied_local_settings = true;
|
1223
|
-
}
|
1224
|
-
}
|
1225
|
-
|
1226
1152
|
// Cancel out streams that haven't yet started if we have received a GOAWAY
|
1227
1153
|
static void cancel_unstarted_streams(grpc_chttp2_transport* t,
|
1228
1154
|
grpc_error_handle error, bool tarpit) {
|
@@ -1321,9 +1247,7 @@ static void maybe_start_some_streams(grpc_chttp2_transport* t) {
|
|
1321
1247
|
// start streams where we have free grpc_chttp2_stream ids and free
|
1322
1248
|
// * concurrency
|
1323
1249
|
while (t->next_stream_id <= MAX_CLIENT_STREAM_ID &&
|
1324
|
-
t->stream_map.size() <
|
1325
|
-
t->settings[GRPC_PEER_SETTINGS]
|
1326
|
-
[GRPC_CHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS] &&
|
1250
|
+
t->stream_map.size() < t->settings.peer().max_concurrent_streams() &&
|
1327
1251
|
grpc_chttp2_list_pop_waiting_for_concurrency(t, &s)) {
|
1328
1252
|
// safe since we can't (legally) be parsing this stream yet
|
1329
1253
|
GRPC_CHTTP2_IF_TRACING(gpr_log(
|
@@ -1510,7 +1434,7 @@ static void perform_stream_op_locked(void* stream_op,
|
|
1510
1434
|
if (op->send_initial_metadata) {
|
1511
1435
|
if (s->call_tracer) {
|
1512
1436
|
s->call_tracer->RecordAnnotation(grpc_core::HttpAnnotation(
|
1513
|
-
grpc_core::HttpAnnotation::Type::kStart,
|
1437
|
+
grpc_core::HttpAnnotation::Type::kStart, gpr_now(GPR_CLOCK_REALTIME),
|
1514
1438
|
s->t->flow_control.stats(), s->flow_control.stats()));
|
1515
1439
|
}
|
1516
1440
|
if (t->is_client && t->channelz_socket != nullptr) {
|
@@ -2708,21 +2632,19 @@ void grpc_chttp2_act_on_flowctl_action(
|
|
2708
2632
|
GRPC_CHTTP2_INITIATE_WRITE_TRANSPORT_FLOW_CONTROL, []() {});
|
2709
2633
|
WithUrgency(t, action.send_initial_window_update(),
|
2710
2634
|
GRPC_CHTTP2_INITIATE_WRITE_SEND_SETTINGS, [t, &action]() {
|
2711
|
-
|
2712
|
-
|
2713
|
-
action.initial_window_size());
|
2714
|
-
});
|
2715
|
-
WithUrgency(t, action.send_max_frame_size_update(),
|
2716
|
-
GRPC_CHTTP2_INITIATE_WRITE_SEND_SETTINGS, [t, &action]() {
|
2717
|
-
queue_setting_update(t, GRPC_CHTTP2_SETTINGS_MAX_FRAME_SIZE,
|
2718
|
-
action.max_frame_size());
|
2635
|
+
t->settings.mutable_local().SetInitialWindowSize(
|
2636
|
+
action.initial_window_size());
|
2719
2637
|
});
|
2638
|
+
WithUrgency(
|
2639
|
+
t, action.send_max_frame_size_update(),
|
2640
|
+
GRPC_CHTTP2_INITIATE_WRITE_SEND_SETTINGS, [t, &action]() {
|
2641
|
+
t->settings.mutable_local().SetMaxFrameSize(action.max_frame_size());
|
2642
|
+
});
|
2720
2643
|
if (t->enable_preferred_rx_crypto_frame_advertisement) {
|
2721
2644
|
WithUrgency(
|
2722
2645
|
t, action.preferred_rx_crypto_frame_size_update(),
|
2723
2646
|
GRPC_CHTTP2_INITIATE_WRITE_SEND_SETTINGS, [t, &action]() {
|
2724
|
-
|
2725
|
-
t, GRPC_CHTTP2_SETTINGS_GRPC_PREFERRED_RECEIVE_CRYPTO_FRAME_SIZE,
|
2647
|
+
t->settings.mutable_local().SetPreferredReceiveCryptoMessageSize(
|
2726
2648
|
action.preferred_rx_crypto_frame_size());
|
2727
2649
|
});
|
2728
2650
|
}
|