grpc 1.36.0 → 1.37.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of grpc might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Makefile +65 -37
- data/include/grpc/grpc.h +15 -1
- data/include/grpc/impl/codegen/port_platform.h +2 -0
- data/src/core/ext/filters/client_channel/client_channel.cc +327 -305
- data/src/core/ext/filters/client_channel/client_channel_factory.h +2 -1
- data/src/core/ext/filters/client_channel/config_selector.h +8 -0
- data/src/core/ext/filters/client_channel/dynamic_filters.cc +9 -4
- data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +24 -142
- data/src/core/ext/filters/client_channel/global_subchannel_pool.h +15 -10
- data/src/core/ext/filters/client_channel/lb_policy.cc +3 -0
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +23 -0
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +27 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +7 -22
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +2 -2
- data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +27 -67
- data/src/core/ext/filters/client_channel/local_subchannel_pool.h +10 -9
- data/src/core/ext/filters/client_channel/resolver.cc +3 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +3 -1
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +5 -9
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +18 -3
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +295 -91
- data/src/core/ext/filters/client_channel/server_address.cc +3 -0
- data/src/core/ext/filters/client_channel/subchannel.cc +69 -146
- data/src/core/ext/filters/client_channel/subchannel.h +63 -95
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +16 -2
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +10 -8
- data/src/core/ext/filters/client_idle/client_idle_filter.cc +1 -1
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +495 -0
- data/src/core/ext/filters/fault_injection/fault_injection_filter.h +39 -0
- data/src/core/ext/filters/fault_injection/service_config_parser.cc +189 -0
- data/src/core/ext/filters/fault_injection/service_config_parser.h +85 -0
- data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +1 -1
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +1 -1
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +3 -2
- data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +1 -1
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +3 -2
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +457 -170
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +39 -7
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +12 -1
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +5 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/internal.h +1 -0
- data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +406 -0
- data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +1459 -0
- data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +350 -0
- data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +1348 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +6 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +25 -0
- data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +144 -0
- data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +488 -0
- data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +141 -0
- data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +452 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +15 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +44 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +79 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +268 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +78 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +281 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +41 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +113 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +6 -5
- data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +13 -9
- data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +93 -0
- data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +323 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +36 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +90 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +46 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +124 -0
- data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.c +33 -0
- data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +77 -0
- data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +354 -0
- data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.h +140 -0
- data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +383 -0
- data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.h +115 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +10 -7
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c +141 -0
- data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.h +70 -0
- data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +141 -0
- data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h +70 -0
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +13 -7
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c +102 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.h +55 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +120 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.h +45 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +76 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +21 -20
- data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +130 -0
- data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h +50 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c +56 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c +63 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c +44 -0
- data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h +35 -0
- data/src/core/ext/xds/xds_api.cc +1591 -279
- data/src/core/ext/xds/xds_api.h +279 -39
- data/src/core/ext/xds/xds_bootstrap.cc +21 -5
- data/src/core/ext/xds/xds_bootstrap.h +5 -1
- data/src/core/ext/xds/xds_client.cc +168 -23
- data/src/core/ext/xds/xds_client.h +26 -0
- data/src/core/ext/xds/xds_client_stats.h +2 -2
- data/src/core/ext/xds/xds_http_fault_filter.cc +226 -0
- data/src/core/ext/xds/xds_http_fault_filter.h +63 -0
- data/src/core/ext/xds/xds_http_filters.cc +114 -0
- data/src/core/ext/xds/xds_http_filters.h +130 -0
- data/src/core/ext/xds/xds_server_config_fetcher.cc +391 -126
- data/src/core/lib/channel/channel_stack.cc +12 -0
- data/src/core/lib/channel/channel_stack.h +7 -0
- data/src/core/lib/channel/channelz.cc +92 -4
- data/src/core/lib/channel/channelz.h +30 -1
- data/src/core/lib/channel/channelz_registry.cc +14 -0
- data/src/core/lib/channel/handshaker.cc +0 -39
- data/src/core/lib/channel/handshaker.h +0 -17
- data/src/core/lib/channel/status_util.cc +12 -2
- data/src/core/lib/channel/status_util.h +5 -0
- data/src/core/lib/gpr/sync_abseil.cc +3 -6
- data/src/core/lib/gpr/sync_windows.cc +2 -2
- data/src/core/lib/gprpp/atomic.h +3 -3
- data/src/core/lib/gprpp/dual_ref_counted.h +3 -3
- data/src/core/lib/gprpp/ref_counted_ptr.h +2 -0
- data/src/core/lib/gprpp/thd.h +1 -1
- data/src/core/lib/iomgr/buffer_list.h +1 -1
- data/src/core/lib/iomgr/cfstream_handle.cc +2 -2
- data/src/core/lib/iomgr/error.h +1 -1
- data/src/core/lib/iomgr/ev_apple.cc +1 -1
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +3 -3
- data/src/core/lib/iomgr/ev_posix.cc +3 -3
- data/src/core/lib/iomgr/exec_ctx.cc +6 -2
- data/src/core/lib/iomgr/resource_quota.cc +1 -1
- data/src/core/lib/iomgr/sockaddr_utils.cc +120 -0
- data/src/core/lib/iomgr/sockaddr_utils.h +25 -0
- data/src/core/lib/iomgr/tcp_posix.cc +1 -4
- data/src/core/lib/iomgr/tcp_uv.cc +2 -2
- data/src/core/lib/iomgr/timer_generic.cc +2 -2
- data/src/core/lib/iomgr/timer_manager.cc +1 -1
- data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +1 -1
- data/src/core/lib/{security/authorization → matchers}/matchers.cc +8 -8
- data/src/core/lib/{security/authorization → matchers}/matchers.h +14 -12
- data/src/core/lib/security/security_connector/ssl_utils.cc +6 -4
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +6 -0
- data/src/core/lib/security/transport/security_handshaker.cc +32 -2
- data/src/core/lib/slice/slice_intern.cc +6 -7
- data/src/core/lib/surface/channel.h +3 -3
- data/src/core/lib/surface/completion_queue.cc +1 -1
- data/src/core/lib/surface/lame_client.cc +38 -19
- data/src/core/lib/surface/lame_client.h +4 -3
- data/src/core/lib/surface/server.cc +40 -33
- data/src/core/lib/surface/server.h +74 -15
- data/src/core/lib/surface/version.cc +1 -1
- data/src/core/lib/transport/metadata_batch.cc +27 -0
- data/src/core/lib/transport/metadata_batch.h +14 -0
- data/src/core/plugin_registry/grpc_plugin_registry.cc +6 -0
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -4
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +1 -1
- data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -3
- data/src/core/tsi/fake_transport_security.cc +10 -1
- data/src/ruby/ext/grpc/extconf.rb +9 -1
- data/src/ruby/ext/grpc/rb_channel.c +10 -1
- data/src/ruby/ext/grpc/rb_channel_credentials.c +11 -1
- data/src/ruby/ext/grpc/rb_channel_credentials.h +4 -0
- data/src/ruby/ext/grpc/rb_compression_options.c +1 -1
- data/src/ruby/ext/grpc/rb_enable_cpp.cc +1 -1
- data/src/ruby/ext/grpc/rb_grpc.c +4 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +4 -1
- data/src/ruby/ext/grpc/rb_server.c +13 -1
- data/src/ruby/ext/grpc/rb_server_credentials.c +19 -3
- data/src/ruby/ext/grpc/rb_server_credentials.h +4 -0
- data/src/ruby/ext/grpc/rb_xds_channel_credentials.c +215 -0
- data/src/ruby/ext/grpc/rb_xds_channel_credentials.h +35 -0
- data/src/ruby/ext/grpc/rb_xds_server_credentials.c +169 -0
- data/src/ruby/ext/grpc/rb_xds_server_credentials.h +35 -0
- data/src/ruby/lib/grpc/generic/client_stub.rb +4 -2
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/spec/call_spec.rb +1 -1
- data/src/ruby/spec/channel_credentials_spec.rb +32 -0
- data/src/ruby/spec/channel_spec.rb +17 -6
- data/src/ruby/spec/client_auth_spec.rb +27 -1
- data/src/ruby/spec/errors_spec.rb +1 -1
- data/src/ruby/spec/generic/active_call_spec.rb +2 -2
- data/src/ruby/spec/generic/client_stub_spec.rb +4 -4
- data/src/ruby/spec/generic/rpc_server_spec.rb +1 -1
- data/src/ruby/spec/server_credentials_spec.rb +25 -0
- data/src/ruby/spec/server_spec.rb +22 -0
- data/third_party/boringssl-with-bazel/err_data.c +255 -255
- data/third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c +11 -2
- data/third_party/boringssl-with-bazel/src/crypto/cpu-arm.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +21 -13
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +7 -5
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +0 -28
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c +22 -17
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +3 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +4 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/cpu.h +22 -32
- data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +25 -9
- data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +0 -1
- data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +33 -19
- data/third_party/xxhash/xxhash.h +5443 -0
- metadata +93 -49
- data/src/core/lib/security/authorization/authorization_engine.cc +0 -177
- data/src/core/lib/security/authorization/authorization_engine.h +0 -84
- data/src/core/lib/security/authorization/evaluate_args.cc +0 -148
- data/src/core/lib/security/authorization/evaluate_args.h +0 -59
- data/src/core/lib/security/authorization/mock_cel/activation.h +0 -57
- data/src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h +0 -44
- data/src/core/lib/security/authorization/mock_cel/cel_expression.h +0 -69
- data/src/core/lib/security/authorization/mock_cel/cel_value.h +0 -99
- data/src/core/lib/security/authorization/mock_cel/evaluator_core.h +0 -67
- data/src/core/lib/security/authorization/mock_cel/flat_expr_builder.h +0 -57
- data/third_party/abseil-cpp/absl/container/flat_hash_set.h +0 -504
- data/third_party/upb/upb/json_decode.c +0 -1443
- data/third_party/upb/upb/json_decode.h +0 -23
- data/third_party/upb/upb/json_encode.c +0 -713
- data/third_party/upb/upb/json_encode.h +0 -36
@@ -32,7 +32,8 @@ class ClientChannelFactory {
|
|
32
32
|
virtual ~ClientChannelFactory() = default;
|
33
33
|
|
34
34
|
// Creates a subchannel with the specified args.
|
35
|
-
virtual Subchannel
|
35
|
+
virtual RefCountedPtr<Subchannel> CreateSubchannel(
|
36
|
+
const grpc_channel_args* args) = 0;
|
36
37
|
|
37
38
|
// Returns a channel arg containing the specified factory.
|
38
39
|
static grpc_arg CreateChannelArg(ClientChannelFactory* factory);
|
@@ -82,8 +82,16 @@ class ConfigSelector : public RefCounted<ConfigSelector> {
|
|
82
82
|
return cs1->Equals(cs2);
|
83
83
|
}
|
84
84
|
|
85
|
+
// The channel will call this when the resolver returns a new ConfigSelector
|
86
|
+
// to determine what set of dynamic filters will be configured.
|
85
87
|
virtual std::vector<const grpc_channel_filter*> GetFilters() { return {}; }
|
86
88
|
|
89
|
+
// Modifies channel args to be passed to the dynamic filter stack.
|
90
|
+
// Takes ownership of argument. Caller takes ownership of result.
|
91
|
+
virtual grpc_channel_args* ModifyChannelArgs(grpc_channel_args* args) {
|
92
|
+
return args;
|
93
|
+
}
|
94
|
+
|
87
95
|
virtual CallConfig GetCallConfig(GetCallConfigArgs args) = 0;
|
88
96
|
|
89
97
|
grpc_arg MakeChannelArg() const;
|
@@ -18,6 +18,7 @@
|
|
18
18
|
|
19
19
|
#include "src/core/ext/filters/client_channel/dynamic_filters.h"
|
20
20
|
|
21
|
+
#include "src/core/lib/channel/channel_args.h"
|
21
22
|
#include "src/core/lib/channel/channel_stack.h"
|
22
23
|
#include "src/core/lib/surface/lame_client.h"
|
23
24
|
|
@@ -160,12 +161,16 @@ RefCountedPtr<DynamicFilters> DynamicFilters::Create(
|
|
160
161
|
// Attempt to create channel stack from requested filters.
|
161
162
|
auto p = CreateChannelStack(args, std::move(filters));
|
162
163
|
if (p.second != GRPC_ERROR_NONE) {
|
163
|
-
//
|
164
|
+
// Channel stack creation failed with requested filters.
|
165
|
+
// Create with lame filter instead.
|
164
166
|
grpc_error* error = p.second;
|
165
|
-
|
167
|
+
grpc_arg error_arg = MakeLameClientErrorArg(error);
|
168
|
+
grpc_channel_args* new_args =
|
169
|
+
grpc_channel_args_copy_and_add(args, &error_arg, 1);
|
170
|
+
GRPC_ERROR_UNREF(error);
|
171
|
+
p = CreateChannelStack(new_args, {&grpc_lame_filter});
|
166
172
|
GPR_ASSERT(p.second == GRPC_ERROR_NONE);
|
167
|
-
|
168
|
-
SetLameFilterError(elem, error);
|
173
|
+
grpc_channel_args_destroy(new_args);
|
169
174
|
}
|
170
175
|
return MakeRefCounted<DynamicFilters>(p.first);
|
171
176
|
}
|
@@ -27,16 +27,6 @@ namespace grpc_core {
|
|
27
27
|
#define GRPC_REGISTER_SUBCHANNEL_CALM_DOWN_AFTER_ATTEMPTS 100
|
28
28
|
#define GRPC_REGISTER_SUBCHANNEL_CALM_DOWN_MICROS 10
|
29
29
|
|
30
|
-
GlobalSubchannelPool::GlobalSubchannelPool() {
|
31
|
-
subchannel_map_ = grpc_avl_create(&subchannel_avl_vtable_);
|
32
|
-
gpr_mu_init(&mu_);
|
33
|
-
}
|
34
|
-
|
35
|
-
GlobalSubchannelPool::~GlobalSubchannelPool() {
|
36
|
-
gpr_mu_destroy(&mu_);
|
37
|
-
grpc_avl_unref(subchannel_map_, nullptr);
|
38
|
-
}
|
39
|
-
|
40
30
|
void GlobalSubchannelPool::Init() {
|
41
31
|
instance_ = new RefCountedPtr<GlobalSubchannelPool>(
|
42
32
|
MakeRefCounted<GlobalSubchannelPool>());
|
@@ -57,145 +47,37 @@ RefCountedPtr<GlobalSubchannelPool> GlobalSubchannelPool::instance() {
|
|
57
47
|
return *instance_;
|
58
48
|
}
|
59
49
|
|
60
|
-
Subchannel
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
grpc_avl old_map = grpc_avl_ref(subchannel_map_, nullptr);
|
68
|
-
gpr_mu_unlock(&mu_);
|
69
|
-
// Check to see if a subchannel already exists.
|
70
|
-
c = static_cast<Subchannel*>(grpc_avl_get(old_map, key, nullptr));
|
71
|
-
if (c != nullptr) {
|
72
|
-
// The subchannel already exists. Try to reuse it.
|
73
|
-
c = GRPC_SUBCHANNEL_REF_FROM_WEAK_REF(c, "subchannel_register+reuse");
|
74
|
-
if (c != nullptr) {
|
75
|
-
GRPC_SUBCHANNEL_UNREF(constructed,
|
76
|
-
"subchannel_register+found_existing");
|
77
|
-
// Exit the CAS loop without modifying the shared map.
|
78
|
-
} else {
|
79
|
-
// Reuse of the subchannel failed, so retry CAS loop
|
80
|
-
if (attempt_count >=
|
81
|
-
GRPC_REGISTER_SUBCHANNEL_CALM_DOWN_AFTER_ATTEMPTS) {
|
82
|
-
// GRPC_SUBCHANNEL_REF_FROM_WEAK_REF returning nullptr means that the
|
83
|
-
// subchannel we got is no longer valid and it's going to be removed
|
84
|
-
// from the AVL tree soon. Spinning here excesively here can actually
|
85
|
-
// prevent another thread from removing the subchannel, basically
|
86
|
-
// resulting in a live lock. See b/157516542 for more details.
|
87
|
-
// TODO(jtattermusch): the entire ref-counting mechanism for
|
88
|
-
// subchannels should be overhaulded, but the current workaround
|
89
|
-
// is fine for short-term.
|
90
|
-
// TODO(jtattermusch): gpr does not support thread yield operation,
|
91
|
-
// so a very short wait is the best we can do.
|
92
|
-
gpr_sleep_until(gpr_time_add(
|
93
|
-
gpr_now(GPR_CLOCK_REALTIME),
|
94
|
-
gpr_time_from_micros(GRPC_REGISTER_SUBCHANNEL_CALM_DOWN_MICROS,
|
95
|
-
GPR_TIMESPAN)));
|
96
|
-
}
|
97
|
-
}
|
98
|
-
} else {
|
99
|
-
// There hasn't been such subchannel. Add one.
|
100
|
-
// Note that we should ref the old map first because grpc_avl_add() will
|
101
|
-
// unref it while we still need to access it later.
|
102
|
-
grpc_avl new_map = grpc_avl_add(
|
103
|
-
grpc_avl_ref(old_map, nullptr), new SubchannelKey(*key),
|
104
|
-
GRPC_SUBCHANNEL_WEAK_REF(constructed, "subchannel_register+new"),
|
105
|
-
nullptr);
|
106
|
-
// Try to publish the change to the shared map. It may happen (but
|
107
|
-
// unlikely) that some other thread has changed the shared map, so compare
|
108
|
-
// to make sure it's unchanged before swapping. Retry if it's changed.
|
109
|
-
gpr_mu_lock(&mu_);
|
110
|
-
if (old_map.root == subchannel_map_.root) {
|
111
|
-
GPR_SWAP(grpc_avl, new_map, subchannel_map_);
|
112
|
-
c = constructed;
|
113
|
-
}
|
114
|
-
gpr_mu_unlock(&mu_);
|
115
|
-
grpc_avl_unref(new_map, nullptr);
|
116
|
-
}
|
117
|
-
grpc_avl_unref(old_map, nullptr);
|
118
|
-
}
|
119
|
-
return c;
|
120
|
-
}
|
121
|
-
|
122
|
-
void GlobalSubchannelPool::UnregisterSubchannel(SubchannelKey* key) {
|
123
|
-
bool done = false;
|
124
|
-
// Compare and swap (CAS) loop:
|
125
|
-
while (!done) {
|
126
|
-
// Ref the shared map to have a local copy.
|
127
|
-
gpr_mu_lock(&mu_);
|
128
|
-
grpc_avl old_map = grpc_avl_ref(subchannel_map_, nullptr);
|
129
|
-
gpr_mu_unlock(&mu_);
|
130
|
-
// Remove the subchannel.
|
131
|
-
// Note that we should ref the old map first because grpc_avl_remove() will
|
132
|
-
// unref it while we still need to access it later.
|
133
|
-
grpc_avl new_map =
|
134
|
-
grpc_avl_remove(grpc_avl_ref(old_map, nullptr), key, nullptr);
|
135
|
-
// Try to publish the change to the shared map. It may happen (but
|
136
|
-
// unlikely) that some other thread has changed the shared map, so compare
|
137
|
-
// to make sure it's unchanged before swapping. Retry if it's changed.
|
138
|
-
gpr_mu_lock(&mu_);
|
139
|
-
if (old_map.root == subchannel_map_.root) {
|
140
|
-
GPR_SWAP(grpc_avl, new_map, subchannel_map_);
|
141
|
-
done = true;
|
142
|
-
}
|
143
|
-
gpr_mu_unlock(&mu_);
|
144
|
-
grpc_avl_unref(new_map, nullptr);
|
145
|
-
grpc_avl_unref(old_map, nullptr);
|
50
|
+
RefCountedPtr<Subchannel> GlobalSubchannelPool::RegisterSubchannel(
|
51
|
+
const SubchannelKey& key, RefCountedPtr<Subchannel> constructed) {
|
52
|
+
MutexLock lock(&mu_);
|
53
|
+
auto it = subchannel_map_.find(key);
|
54
|
+
if (it != subchannel_map_.end()) {
|
55
|
+
RefCountedPtr<Subchannel> existing = it->second->RefIfNonZero();
|
56
|
+
if (existing != nullptr) return existing;
|
146
57
|
}
|
147
|
-
|
148
|
-
|
149
|
-
Subchannel* GlobalSubchannelPool::FindSubchannel(SubchannelKey* key) {
|
150
|
-
// Lock, and take a reference to the subchannel map.
|
151
|
-
// We don't need to do the search under a lock as AVL's are immutable.
|
152
|
-
gpr_mu_lock(&mu_);
|
153
|
-
grpc_avl index = grpc_avl_ref(subchannel_map_, nullptr);
|
154
|
-
gpr_mu_unlock(&mu_);
|
155
|
-
Subchannel* c = static_cast<Subchannel*>(grpc_avl_get(index, key, nullptr));
|
156
|
-
if (c != nullptr) c = GRPC_SUBCHANNEL_REF_FROM_WEAK_REF(c, "found_from_pool");
|
157
|
-
grpc_avl_unref(index, nullptr);
|
158
|
-
return c;
|
58
|
+
subchannel_map_[key] = constructed.get();
|
59
|
+
return constructed;
|
159
60
|
}
|
160
61
|
|
161
62
|
RefCountedPtr<GlobalSubchannelPool>* GlobalSubchannelPool::instance_ = nullptr;
|
162
63
|
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
delete key
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
auto* new_key = new SubchannelKey(*key);
|
173
|
-
return static_cast<void*>(new_key);
|
174
|
-
}
|
175
|
-
|
176
|
-
long sck_avl_compare(void* a, void* b, void* /*unused*/) {
|
177
|
-
const SubchannelKey* key_a = static_cast<const SubchannelKey*>(a);
|
178
|
-
const SubchannelKey* key_b = static_cast<const SubchannelKey*>(b);
|
179
|
-
return key_a->Cmp(*key_b);
|
180
|
-
}
|
181
|
-
|
182
|
-
void scv_avl_destroy(void* p, void* /*user_data*/) {
|
183
|
-
GRPC_SUBCHANNEL_WEAK_UNREF((Subchannel*)p, "global_subchannel_pool");
|
64
|
+
void GlobalSubchannelPool::UnregisterSubchannel(const SubchannelKey& key,
|
65
|
+
Subchannel* subchannel) {
|
66
|
+
MutexLock lock(&mu_);
|
67
|
+
auto it = subchannel_map_.find(key);
|
68
|
+
// delete only if key hasn't been re-registered to a different subchannel
|
69
|
+
// between strong-unreffing and unregistration of subchannel.
|
70
|
+
if (it != subchannel_map_.end() && it->second == subchannel) {
|
71
|
+
subchannel_map_.erase(it);
|
72
|
+
}
|
184
73
|
}
|
185
74
|
|
186
|
-
|
187
|
-
|
188
|
-
|
75
|
+
RefCountedPtr<Subchannel> GlobalSubchannelPool::FindSubchannel(
|
76
|
+
const SubchannelKey& key) {
|
77
|
+
MutexLock lock(&mu_);
|
78
|
+
auto it = subchannel_map_.find(key);
|
79
|
+
if (it == subchannel_map_.end()) return nullptr;
|
80
|
+
return it->second->RefIfNonZero();
|
189
81
|
}
|
190
82
|
|
191
|
-
} // namespace
|
192
|
-
|
193
|
-
const grpc_avl_vtable GlobalSubchannelPool::subchannel_avl_vtable_ = {
|
194
|
-
sck_avl_destroy, // destroy_key
|
195
|
-
sck_avl_copy, // copy_key
|
196
|
-
sck_avl_compare, // compare_keys
|
197
|
-
scv_avl_destroy, // destroy_value
|
198
|
-
scv_avl_copy // copy_value
|
199
|
-
};
|
200
|
-
|
201
83
|
} // namespace grpc_core
|
@@ -21,7 +21,10 @@
|
|
21
21
|
|
22
22
|
#include <grpc/support/port_platform.h>
|
23
23
|
|
24
|
+
#include <map>
|
25
|
+
|
24
26
|
#include "src/core/ext/filters/client_channel/subchannel_pool_interface.h"
|
27
|
+
#include "src/core/lib/gprpp/sync.h"
|
25
28
|
|
26
29
|
namespace grpc_core {
|
27
30
|
|
@@ -33,8 +36,8 @@ namespace grpc_core {
|
|
33
36
|
class GlobalSubchannelPool final : public SubchannelPoolInterface {
|
34
37
|
public:
|
35
38
|
// The ctor and dtor are not intended to use directly.
|
36
|
-
GlobalSubchannelPool()
|
37
|
-
~GlobalSubchannelPool() override
|
39
|
+
GlobalSubchannelPool() {}
|
40
|
+
~GlobalSubchannelPool() override {}
|
38
41
|
|
39
42
|
// Should be called exactly once at filter initialization time.
|
40
43
|
static void Init();
|
@@ -45,22 +48,24 @@ class GlobalSubchannelPool final : public SubchannelPoolInterface {
|
|
45
48
|
static RefCountedPtr<GlobalSubchannelPool> instance();
|
46
49
|
|
47
50
|
// Implements interface methods.
|
48
|
-
Subchannel
|
49
|
-
|
50
|
-
|
51
|
-
|
51
|
+
RefCountedPtr<Subchannel> RegisterSubchannel(
|
52
|
+
const SubchannelKey& key, RefCountedPtr<Subchannel> constructed) override
|
53
|
+
ABSL_LOCKS_EXCLUDED(mu_);
|
54
|
+
void UnregisterSubchannel(const SubchannelKey& key,
|
55
|
+
Subchannel* subchannel) override
|
56
|
+
ABSL_LOCKS_EXCLUDED(mu_);
|
57
|
+
RefCountedPtr<Subchannel> FindSubchannel(const SubchannelKey& key) override
|
58
|
+
ABSL_LOCKS_EXCLUDED(mu_);
|
52
59
|
|
53
60
|
private:
|
54
61
|
// The singleton instance. (It's a pointer to RefCountedPtr so that this
|
55
62
|
// non-local static object can be trivially destructible.)
|
56
63
|
static RefCountedPtr<GlobalSubchannelPool>* instance_;
|
57
64
|
|
58
|
-
// The vtable for subchannel operations in an AVL tree.
|
59
|
-
static const grpc_avl_vtable subchannel_avl_vtable_;
|
60
65
|
// A map from subchannel key to subchannel.
|
61
|
-
|
66
|
+
std::map<SubchannelKey, Subchannel*> subchannel_map_ ABSL_GUARDED_BY(mu_);
|
62
67
|
// To protect subchannel_map_.
|
63
|
-
|
68
|
+
Mutex mu_;
|
64
69
|
};
|
65
70
|
|
66
71
|
} // namespace grpc_core
|
@@ -70,6 +70,9 @@ LoadBalancingPolicy::UpdateArgs::UpdateArgs(UpdateArgs&& other) noexcept {
|
|
70
70
|
|
71
71
|
LoadBalancingPolicy::UpdateArgs& LoadBalancingPolicy::UpdateArgs::operator=(
|
72
72
|
const UpdateArgs& other) {
|
73
|
+
if (&other == this) {
|
74
|
+
return *this;
|
75
|
+
}
|
73
76
|
addresses = other.addresses;
|
74
77
|
config = other.config;
|
75
78
|
grpc_channel_args_destroy(args);
|
@@ -0,0 +1,23 @@
|
|
1
|
+
//
|
2
|
+
// Copyright 2018 gRPC authors.
|
3
|
+
//
|
4
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
// you may not use this file except in compliance with the License.
|
6
|
+
// You may obtain a copy of the License at
|
7
|
+
//
|
8
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
//
|
10
|
+
// Unless required by applicable law or agreed to in writing, software
|
11
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
// See the License for the specific language governing permissions and
|
14
|
+
// limitations under the License.
|
15
|
+
//
|
16
|
+
|
17
|
+
#include <grpc/support/port_platform.h>
|
18
|
+
|
19
|
+
namespace grpc_core {
|
20
|
+
|
21
|
+
const char* kRequestRingHashAttribute = "request_ring_hash";
|
22
|
+
|
23
|
+
} // namespace grpc_core
|
@@ -0,0 +1,27 @@
|
|
1
|
+
//
|
2
|
+
// Copyright 2018 gRPC authors.
|
3
|
+
//
|
4
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
// you may not use this file except in compliance with the License.
|
6
|
+
// You may obtain a copy of the License at
|
7
|
+
//
|
8
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
//
|
10
|
+
// Unless required by applicable law or agreed to in writing, software
|
11
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
// See the License for the specific language governing permissions and
|
14
|
+
// limitations under the License.
|
15
|
+
//
|
16
|
+
|
17
|
+
#ifndef GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_RING_HASH_RING_HASH_H
|
18
|
+
#define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_RING_HASH_RING_HASH_H
|
19
|
+
|
20
|
+
#include <grpc/support/port_platform.h>
|
21
|
+
|
22
|
+
namespace grpc_core {
|
23
|
+
extern const char* kRequestRingHashAttribute;
|
24
|
+
|
25
|
+
} // namespace grpc_core
|
26
|
+
|
27
|
+
#endif // GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_RING_HASH_RING_HASH_H
|
@@ -107,17 +107,6 @@ CircuitBreakerCallCounterMap::CallCounter::~CallCounter() {
|
|
107
107
|
|
108
108
|
constexpr char kXdsClusterImpl[] = "xds_cluster_impl_experimental";
|
109
109
|
|
110
|
-
// TODO (donnadionne): Check to see if circuit breaking is enabled, this will be
|
111
|
-
// removed once circuit breaking feature is fully integrated and enabled by
|
112
|
-
// default.
|
113
|
-
bool XdsCircuitBreakingEnabled() {
|
114
|
-
char* value = gpr_getenv("GRPC_XDS_EXPERIMENTAL_CIRCUIT_BREAKING");
|
115
|
-
bool parsed_value;
|
116
|
-
bool parse_succeeded = gpr_parse_bool_value(value, &parsed_value);
|
117
|
-
gpr_free(value);
|
118
|
-
return parse_succeeded && parsed_value;
|
119
|
-
}
|
120
|
-
|
121
110
|
// Config for xDS Cluster Impl LB policy.
|
122
111
|
class XdsClusterImplLbConfig : public LoadBalancingPolicy::Config {
|
123
112
|
public:
|
@@ -208,7 +197,6 @@ class XdsClusterImplLb : public LoadBalancingPolicy {
|
|
208
197
|
|
209
198
|
private:
|
210
199
|
RefCountedPtr<CircuitBreakerCallCounterMap::CallCounter> call_counter_;
|
211
|
-
bool xds_circuit_breaking_enabled_;
|
212
200
|
uint32_t max_concurrent_requests_;
|
213
201
|
RefCountedPtr<XdsApi::EdsUpdate::DropConfig> drop_config_;
|
214
202
|
RefCountedPtr<XdsClusterDropStats> drop_stats_;
|
@@ -277,7 +265,6 @@ class XdsClusterImplLb : public LoadBalancingPolicy {
|
|
277
265
|
XdsClusterImplLb::Picker::Picker(XdsClusterImplLb* xds_cluster_impl_lb,
|
278
266
|
RefCountedPtr<RefCountedPicker> picker)
|
279
267
|
: call_counter_(xds_cluster_impl_lb->call_counter_),
|
280
|
-
xds_circuit_breaking_enabled_(XdsCircuitBreakingEnabled()),
|
281
268
|
max_concurrent_requests_(
|
282
269
|
xds_cluster_impl_lb->config_->max_concurrent_requests()),
|
283
270
|
drop_config_(xds_cluster_impl_lb->config_->drop_config()),
|
@@ -301,15 +288,13 @@ LoadBalancingPolicy::PickResult XdsClusterImplLb::Picker::Pick(
|
|
301
288
|
}
|
302
289
|
// Handle circuit breaking.
|
303
290
|
uint32_t current = call_counter_->Increment();
|
304
|
-
if
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
return result;
|
312
|
-
}
|
291
|
+
// Check and see if we exceeded the max concurrent requests count.
|
292
|
+
if (current >= max_concurrent_requests_) {
|
293
|
+
call_counter_->Decrement();
|
294
|
+
if (drop_stats_ != nullptr) drop_stats_->AddUncategorizedDrops();
|
295
|
+
PickResult result;
|
296
|
+
result.type = PickResult::PICK_COMPLETE;
|
297
|
+
return result;
|
313
298
|
}
|
314
299
|
// If we're not dropping the call, we should always have a child picker.
|
315
300
|
if (picker_ == nullptr) { // Should never happen.
|
@@ -501,7 +501,7 @@ void XdsClusterManagerLb::ClusterChild::ResetBackoffLocked() {
|
|
501
501
|
|
502
502
|
void XdsClusterManagerLb::ClusterChild::DeactivateLocked() {
|
503
503
|
// If already deactivated, don't do that again.
|
504
|
-
if (delayed_removal_timer_callback_pending_
|
504
|
+
if (delayed_removal_timer_callback_pending_) return;
|
505
505
|
// Set the child weight to 0 so that future picker won't contain this child.
|
506
506
|
// Start a timer to delete the child.
|
507
507
|
Ref(DEBUG_LOCATION, "ClusterChild+timer").release();
|
@@ -131,7 +131,7 @@ class XdsClusterResolverLb : public LoadBalancingPolicy {
|
|
131
131
|
virtual bool disable_reresolution() = 0;
|
132
132
|
|
133
133
|
// Caller must ensure that config_ is set before calling.
|
134
|
-
|
134
|
+
absl::string_view GetXdsClusterResolverResourceName() const {
|
135
135
|
if (!parent_->is_xds_uri_) return parent_->server_name_;
|
136
136
|
if (!parent_->config_->discovery_mechanisms()[index_]
|
137
137
|
.eds_service_name.empty()) {
|
@@ -894,7 +894,7 @@ XdsClusterResolverLb::CreateChildPolicyConfigLocked() {
|
|
894
894
|
locality_name_json["zone"] = locality_name->zone();
|
895
895
|
}
|
896
896
|
if (!locality_name->sub_zone().empty()) {
|
897
|
-
locality_name_json["
|
897
|
+
locality_name_json["sub_zone"] = locality_name->sub_zone();
|
898
898
|
}
|
899
899
|
// Add weighted target entry.
|
900
900
|
weighted_targets[locality_name->AsHumanReadableString()] =
|