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.

Files changed (221) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +65 -37
  3. data/include/grpc/grpc.h +15 -1
  4. data/include/grpc/impl/codegen/port_platform.h +2 -0
  5. data/src/core/ext/filters/client_channel/client_channel.cc +327 -305
  6. data/src/core/ext/filters/client_channel/client_channel_factory.h +2 -1
  7. data/src/core/ext/filters/client_channel/config_selector.h +8 -0
  8. data/src/core/ext/filters/client_channel/dynamic_filters.cc +9 -4
  9. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +24 -142
  10. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +15 -10
  11. data/src/core/ext/filters/client_channel/lb_policy.cc +3 -0
  12. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +23 -0
  13. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +27 -0
  14. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +7 -22
  15. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +1 -1
  16. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +2 -2
  17. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +27 -67
  18. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +10 -9
  19. data/src/core/ext/filters/client_channel/resolver.cc +3 -0
  20. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
  21. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +3 -1
  22. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +5 -9
  23. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +18 -3
  24. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +295 -91
  25. data/src/core/ext/filters/client_channel/server_address.cc +3 -0
  26. data/src/core/ext/filters/client_channel/subchannel.cc +69 -146
  27. data/src/core/ext/filters/client_channel/subchannel.h +63 -95
  28. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +16 -2
  29. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +10 -8
  30. data/src/core/ext/filters/client_idle/client_idle_filter.cc +1 -1
  31. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +495 -0
  32. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +39 -0
  33. data/src/core/ext/filters/fault_injection/service_config_parser.cc +189 -0
  34. data/src/core/ext/filters/fault_injection/service_config_parser.h +85 -0
  35. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +1 -1
  36. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +1 -1
  37. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +3 -2
  38. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +1 -1
  39. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +3 -2
  40. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +457 -170
  41. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +1 -1
  42. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +39 -7
  43. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +12 -1
  44. data/src/core/ext/transport/chttp2/transport/frame_data.cc +5 -1
  45. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +1 -1
  46. data/src/core/ext/transport/chttp2/transport/internal.h +1 -0
  47. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +406 -0
  48. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +1459 -0
  49. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +350 -0
  50. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +1348 -0
  51. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +6 -0
  52. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +25 -0
  53. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +144 -0
  54. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +488 -0
  55. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +141 -0
  56. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +452 -0
  57. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +15 -0
  58. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +44 -0
  59. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +79 -0
  60. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +268 -0
  61. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +78 -0
  62. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +281 -0
  63. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +41 -0
  64. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +113 -0
  65. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +6 -5
  66. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +13 -9
  67. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +93 -0
  68. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +323 -0
  69. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +36 -0
  70. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +90 -0
  71. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +46 -0
  72. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +124 -0
  73. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.c +33 -0
  74. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +77 -0
  75. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +354 -0
  76. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.h +140 -0
  77. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +383 -0
  78. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.h +115 -0
  79. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +10 -7
  80. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +5 -0
  81. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c +141 -0
  82. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.h +70 -0
  83. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +141 -0
  84. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h +70 -0
  85. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +13 -7
  86. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +5 -0
  87. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c +102 -0
  88. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.h +55 -0
  89. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +120 -0
  90. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.h +45 -0
  91. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +76 -0
  92. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.h +35 -0
  93. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +21 -20
  94. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +130 -0
  95. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h +50 -0
  96. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c +56 -0
  97. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.h +35 -0
  98. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c +63 -0
  99. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.h +40 -0
  100. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c +44 -0
  101. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h +35 -0
  102. data/src/core/ext/xds/xds_api.cc +1591 -279
  103. data/src/core/ext/xds/xds_api.h +279 -39
  104. data/src/core/ext/xds/xds_bootstrap.cc +21 -5
  105. data/src/core/ext/xds/xds_bootstrap.h +5 -1
  106. data/src/core/ext/xds/xds_client.cc +168 -23
  107. data/src/core/ext/xds/xds_client.h +26 -0
  108. data/src/core/ext/xds/xds_client_stats.h +2 -2
  109. data/src/core/ext/xds/xds_http_fault_filter.cc +226 -0
  110. data/src/core/ext/xds/xds_http_fault_filter.h +63 -0
  111. data/src/core/ext/xds/xds_http_filters.cc +114 -0
  112. data/src/core/ext/xds/xds_http_filters.h +130 -0
  113. data/src/core/ext/xds/xds_server_config_fetcher.cc +391 -126
  114. data/src/core/lib/channel/channel_stack.cc +12 -0
  115. data/src/core/lib/channel/channel_stack.h +7 -0
  116. data/src/core/lib/channel/channelz.cc +92 -4
  117. data/src/core/lib/channel/channelz.h +30 -1
  118. data/src/core/lib/channel/channelz_registry.cc +14 -0
  119. data/src/core/lib/channel/handshaker.cc +0 -39
  120. data/src/core/lib/channel/handshaker.h +0 -17
  121. data/src/core/lib/channel/status_util.cc +12 -2
  122. data/src/core/lib/channel/status_util.h +5 -0
  123. data/src/core/lib/gpr/sync_abseil.cc +3 -6
  124. data/src/core/lib/gpr/sync_windows.cc +2 -2
  125. data/src/core/lib/gprpp/atomic.h +3 -3
  126. data/src/core/lib/gprpp/dual_ref_counted.h +3 -3
  127. data/src/core/lib/gprpp/ref_counted_ptr.h +2 -0
  128. data/src/core/lib/gprpp/thd.h +1 -1
  129. data/src/core/lib/iomgr/buffer_list.h +1 -1
  130. data/src/core/lib/iomgr/cfstream_handle.cc +2 -2
  131. data/src/core/lib/iomgr/error.h +1 -1
  132. data/src/core/lib/iomgr/ev_apple.cc +1 -1
  133. data/src/core/lib/iomgr/ev_epoll1_linux.cc +3 -3
  134. data/src/core/lib/iomgr/ev_posix.cc +3 -3
  135. data/src/core/lib/iomgr/exec_ctx.cc +6 -2
  136. data/src/core/lib/iomgr/resource_quota.cc +1 -1
  137. data/src/core/lib/iomgr/sockaddr_utils.cc +120 -0
  138. data/src/core/lib/iomgr/sockaddr_utils.h +25 -0
  139. data/src/core/lib/iomgr/tcp_posix.cc +1 -4
  140. data/src/core/lib/iomgr/tcp_uv.cc +2 -2
  141. data/src/core/lib/iomgr/timer_generic.cc +2 -2
  142. data/src/core/lib/iomgr/timer_manager.cc +1 -1
  143. data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +1 -1
  144. data/src/core/lib/{security/authorization → matchers}/matchers.cc +8 -8
  145. data/src/core/lib/{security/authorization → matchers}/matchers.h +14 -12
  146. data/src/core/lib/security/security_connector/ssl_utils.cc +6 -4
  147. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +6 -0
  148. data/src/core/lib/security/transport/security_handshaker.cc +32 -2
  149. data/src/core/lib/slice/slice_intern.cc +6 -7
  150. data/src/core/lib/surface/channel.h +3 -3
  151. data/src/core/lib/surface/completion_queue.cc +1 -1
  152. data/src/core/lib/surface/lame_client.cc +38 -19
  153. data/src/core/lib/surface/lame_client.h +4 -3
  154. data/src/core/lib/surface/server.cc +40 -33
  155. data/src/core/lib/surface/server.h +74 -15
  156. data/src/core/lib/surface/version.cc +1 -1
  157. data/src/core/lib/transport/metadata_batch.cc +27 -0
  158. data/src/core/lib/transport/metadata_batch.h +14 -0
  159. data/src/core/plugin_registry/grpc_plugin_registry.cc +6 -0
  160. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -4
  161. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +1 -1
  162. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -3
  163. data/src/core/tsi/fake_transport_security.cc +10 -1
  164. data/src/ruby/ext/grpc/extconf.rb +9 -1
  165. data/src/ruby/ext/grpc/rb_channel.c +10 -1
  166. data/src/ruby/ext/grpc/rb_channel_credentials.c +11 -1
  167. data/src/ruby/ext/grpc/rb_channel_credentials.h +4 -0
  168. data/src/ruby/ext/grpc/rb_compression_options.c +1 -1
  169. data/src/ruby/ext/grpc/rb_enable_cpp.cc +1 -1
  170. data/src/ruby/ext/grpc/rb_grpc.c +4 -0
  171. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  172. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +4 -1
  173. data/src/ruby/ext/grpc/rb_server.c +13 -1
  174. data/src/ruby/ext/grpc/rb_server_credentials.c +19 -3
  175. data/src/ruby/ext/grpc/rb_server_credentials.h +4 -0
  176. data/src/ruby/ext/grpc/rb_xds_channel_credentials.c +215 -0
  177. data/src/ruby/ext/grpc/rb_xds_channel_credentials.h +35 -0
  178. data/src/ruby/ext/grpc/rb_xds_server_credentials.c +169 -0
  179. data/src/ruby/ext/grpc/rb_xds_server_credentials.h +35 -0
  180. data/src/ruby/lib/grpc/generic/client_stub.rb +4 -2
  181. data/src/ruby/lib/grpc/version.rb +1 -1
  182. data/src/ruby/spec/call_spec.rb +1 -1
  183. data/src/ruby/spec/channel_credentials_spec.rb +32 -0
  184. data/src/ruby/spec/channel_spec.rb +17 -6
  185. data/src/ruby/spec/client_auth_spec.rb +27 -1
  186. data/src/ruby/spec/errors_spec.rb +1 -1
  187. data/src/ruby/spec/generic/active_call_spec.rb +2 -2
  188. data/src/ruby/spec/generic/client_stub_spec.rb +4 -4
  189. data/src/ruby/spec/generic/rpc_server_spec.rb +1 -1
  190. data/src/ruby/spec/server_credentials_spec.rb +25 -0
  191. data/src/ruby/spec/server_spec.rb +22 -0
  192. data/third_party/boringssl-with-bazel/err_data.c +255 -255
  193. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c +11 -2
  194. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm.c +3 -3
  195. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +21 -13
  196. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +7 -5
  197. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +0 -28
  198. data/third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c +22 -17
  199. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +3 -1
  200. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +4 -0
  201. data/third_party/boringssl-with-bazel/src/include/openssl/cpu.h +22 -32
  202. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +25 -9
  203. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +0 -1
  204. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +33 -19
  205. data/third_party/xxhash/xxhash.h +5443 -0
  206. metadata +93 -49
  207. data/src/core/lib/security/authorization/authorization_engine.cc +0 -177
  208. data/src/core/lib/security/authorization/authorization_engine.h +0 -84
  209. data/src/core/lib/security/authorization/evaluate_args.cc +0 -148
  210. data/src/core/lib/security/authorization/evaluate_args.h +0 -59
  211. data/src/core/lib/security/authorization/mock_cel/activation.h +0 -57
  212. data/src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h +0 -44
  213. data/src/core/lib/security/authorization/mock_cel/cel_expression.h +0 -69
  214. data/src/core/lib/security/authorization/mock_cel/cel_value.h +0 -99
  215. data/src/core/lib/security/authorization/mock_cel/evaluator_core.h +0 -67
  216. data/src/core/lib/security/authorization/mock_cel/flat_expr_builder.h +0 -57
  217. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +0 -504
  218. data/third_party/upb/upb/json_decode.c +0 -1443
  219. data/third_party/upb/upb/json_decode.h +0 -23
  220. data/third_party/upb/upb/json_encode.c +0 -713
  221. 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* CreateSubchannel(const grpc_channel_args* args) = 0;
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
- // Initial pass failed. Create with lame filter.
164
+ // Channel stack creation failed with requested filters.
165
+ // Create with lame filter instead.
164
166
  grpc_error* error = p.second;
165
- p = CreateChannelStack(args, {&grpc_lame_filter});
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
- grpc_channel_element* elem = grpc_channel_stack_element(p.first, 0);
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* GlobalSubchannelPool::RegisterSubchannel(SubchannelKey* key,
61
- Subchannel* constructed) {
62
- Subchannel* c = nullptr;
63
- // Compare and swap (CAS) loop:
64
- for (int attempt_count = 0; c == nullptr; attempt_count++) {
65
- // Ref the shared map to have a local copy.
66
- gpr_mu_lock(&mu_);
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
- namespace {
164
-
165
- void sck_avl_destroy(void* p, void* /*user_data*/) {
166
- SubchannelKey* key = static_cast<SubchannelKey*>(p);
167
- delete key;
168
- }
169
-
170
- void* sck_avl_copy(void* p, void* /*unused*/) {
171
- const SubchannelKey* key = static_cast<const SubchannelKey*>(p);
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
- void* scv_avl_copy(void* p, void* /*unused*/) {
187
- GRPC_SUBCHANNEL_WEAK_REF((Subchannel*)p, "global_subchannel_pool");
188
- return p;
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* RegisterSubchannel(SubchannelKey* key,
49
- Subchannel* constructed) override;
50
- void UnregisterSubchannel(SubchannelKey* key) override;
51
- Subchannel* FindSubchannel(SubchannelKey* key) override;
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
- grpc_avl subchannel_map_;
66
+ std::map<SubchannelKey, Subchannel*> subchannel_map_ ABSL_GUARDED_BY(mu_);
62
67
  // To protect subchannel_map_.
63
- gpr_mu mu_;
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 (xds_circuit_breaking_enabled_) {
305
- // Check and see if we exceeded the max concurrent requests count.
306
- if (current >= max_concurrent_requests_) {
307
- call_counter_->Decrement();
308
- if (drop_stats_ != nullptr) drop_stats_->AddUncategorizedDrops();
309
- PickResult result;
310
- result.type = PickResult::PICK_COMPLETE;
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_ == true) return;
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
- const absl::string_view GetXdsClusterResolverResourceName() const {
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["subzone"] = locality_name->sub_zone();
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()] =