grpc 1.26.0 → 1.27.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 (209) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +1654 -1519
  3. data/etc/roots.pem +44 -0
  4. data/include/grpc/grpc_security.h +37 -15
  5. data/include/grpc/grpc_security_constants.h +27 -0
  6. data/include/grpc/impl/codegen/grpc_types.h +14 -0
  7. data/include/grpc/impl/codegen/port_platform.h +1 -1
  8. data/src/core/ext/filters/client_channel/client_channel.cc +0 -20
  9. data/src/core/ext/filters/client_channel/http_proxy.cc +4 -4
  10. data/src/core/ext/filters/client_channel/lb_policy.cc +4 -3
  11. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +191 -201
  12. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +89 -0
  13. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +40 -0
  14. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +3 -2
  15. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +88 -121
  16. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +28 -57
  17. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +0 -7
  18. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +8 -9
  19. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +53 -34
  20. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +18 -5
  21. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +24 -19
  22. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +2 -1
  23. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +4 -2
  24. data/src/core/ext/filters/client_channel/server_address.cc +6 -9
  25. data/src/core/ext/filters/client_channel/server_address.h +3 -10
  26. data/src/core/ext/filters/client_channel/xds/xds_api.cc +394 -150
  27. data/src/core/ext/filters/client_channel/xds/xds_api.h +75 -35
  28. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc +59 -22
  29. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.h +13 -9
  30. data/src/core/ext/filters/client_channel/xds/xds_channel_secure.cc +8 -6
  31. data/src/core/ext/filters/client_channel/xds/xds_client.cc +456 -175
  32. data/src/core/ext/filters/client_channel/xds/xds_client.h +33 -21
  33. data/src/core/ext/filters/client_channel/xds/xds_client_stats.cc +5 -8
  34. data/src/core/ext/filters/client_channel/xds/xds_client_stats.h +18 -24
  35. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +2 -2
  36. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +13 -5
  37. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +34 -0
  38. data/src/core/lib/channel/channelz.h +11 -1
  39. data/src/core/lib/gpr/time_precise.cc +1 -1
  40. data/src/core/lib/gprpp/optional.h +26 -0
  41. data/src/core/lib/gprpp/string_view.h +14 -10
  42. data/src/core/lib/iomgr/executor.cc +1 -1
  43. data/src/core/lib/iomgr/fork_posix.cc +4 -0
  44. data/src/core/lib/iomgr/poller/eventmanager_libuv.cc +87 -0
  45. data/src/core/lib/iomgr/poller/eventmanager_libuv.h +88 -0
  46. data/src/core/lib/iomgr/socket_utils_common_posix.cc +14 -0
  47. data/src/core/lib/iomgr/socket_utils_posix.h +12 -0
  48. data/src/core/lib/iomgr/tcp_custom.h +3 -0
  49. data/src/core/lib/iomgr/tcp_posix.cc +607 -56
  50. data/src/core/lib/iomgr/tcp_server_custom.cc +15 -2
  51. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +8 -0
  52. data/src/core/lib/json/json.h +11 -1
  53. data/src/core/lib/json/json_reader.cc +206 -28
  54. data/src/core/lib/json/json_writer.cc +111 -24
  55. data/src/core/lib/security/credentials/composite/composite_credentials.cc +7 -0
  56. data/src/core/lib/security/credentials/composite/composite_credentials.h +5 -1
  57. data/src/core/lib/security/credentials/credentials.h +10 -1
  58. data/src/core/lib/security/credentials/fake/fake_credentials.h +2 -1
  59. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +1 -1
  60. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -4
  61. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +2 -1
  62. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +20 -0
  63. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +8 -0
  64. data/src/core/lib/security/credentials/tls/{spiffe_credentials.cc → tls_credentials.cc} +23 -24
  65. data/src/core/lib/security/credentials/tls/{spiffe_credentials.h → tls_credentials.h} +9 -9
  66. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +13 -0
  67. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +22 -2
  68. data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +2 -2
  69. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +2 -2
  70. data/src/core/lib/security/security_connector/local/local_security_connector.cc +30 -3
  71. data/src/core/lib/security/security_connector/ssl_utils.cc +45 -3
  72. data/src/core/lib/security/security_connector/ssl_utils.h +12 -0
  73. data/src/core/lib/security/security_connector/tls/{spiffe_security_connector.cc → tls_security_connector.cc} +82 -69
  74. data/src/core/lib/security/security_connector/tls/{spiffe_security_connector.h → tls_security_connector.h} +17 -18
  75. data/src/core/lib/security/transport/client_auth_filter.cc +33 -0
  76. data/src/core/lib/surface/completion_queue.cc +22 -1
  77. data/src/core/lib/surface/version.cc +1 -1
  78. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +11 -1
  79. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +1 -1
  80. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +3 -3
  81. data/src/core/tsi/fake_transport_security.cc +7 -3
  82. data/src/core/tsi/fake_transport_security.h +2 -0
  83. data/src/core/tsi/ssl_transport_security.cc +144 -8
  84. data/src/core/tsi/ssl_transport_security.h +15 -1
  85. data/src/core/tsi/transport_security.cc +13 -0
  86. data/src/core/tsi/transport_security_grpc.cc +2 -2
  87. data/src/core/tsi/transport_security_grpc.h +2 -2
  88. data/src/core/tsi/transport_security_interface.h +12 -0
  89. data/src/ruby/bin/math_pb.rb +5 -5
  90. data/src/ruby/ext/grpc/rb_call_credentials.c +4 -1
  91. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  92. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +4 -1
  93. data/src/ruby/lib/grpc/version.rb +1 -1
  94. data/src/ruby/pb/grpc/health/v1/health_pb.rb +3 -3
  95. data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +1 -1
  96. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +23 -13
  97. data/third_party/abseil-cpp/absl/algorithm/algorithm.h +159 -0
  98. data/third_party/abseil-cpp/absl/base/attributes.h +609 -0
  99. data/third_party/abseil-cpp/absl/base/call_once.h +226 -0
  100. data/third_party/abseil-cpp/absl/base/casts.h +184 -0
  101. data/third_party/abseil-cpp/absl/base/config.h +622 -0
  102. data/third_party/abseil-cpp/absl/base/const_init.h +76 -0
  103. data/third_party/abseil-cpp/absl/base/dynamic_annotations.cc +129 -0
  104. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +389 -0
  105. data/third_party/abseil-cpp/absl/base/internal/atomic_hook.h +179 -0
  106. data/third_party/abseil-cpp/absl/base/internal/bits.h +218 -0
  107. data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +107 -0
  108. data/third_party/abseil-cpp/absl/base/internal/cycleclock.h +94 -0
  109. data/third_party/abseil-cpp/absl/base/internal/endian.h +266 -0
  110. data/third_party/abseil-cpp/absl/base/internal/hide_ptr.h +51 -0
  111. data/third_party/abseil-cpp/absl/base/internal/identity.h +37 -0
  112. data/third_party/abseil-cpp/absl/base/internal/inline_variable.h +107 -0
  113. data/third_party/abseil-cpp/absl/base/internal/invoke.h +187 -0
  114. data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +107 -0
  115. data/third_party/abseil-cpp/absl/base/internal/per_thread_tls.h +52 -0
  116. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +237 -0
  117. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +179 -0
  118. data/third_party/abseil-cpp/absl/base/internal/scheduling_mode.h +58 -0
  119. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +233 -0
  120. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +243 -0
  121. data/third_party/abseil-cpp/absl/base/internal/spinlock_akaros.inc +35 -0
  122. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +67 -0
  123. data/third_party/abseil-cpp/absl/base/internal/spinlock_posix.inc +46 -0
  124. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.cc +81 -0
  125. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +93 -0
  126. data/third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc +37 -0
  127. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +414 -0
  128. data/third_party/abseil-cpp/absl/base/internal/sysinfo.h +66 -0
  129. data/third_party/abseil-cpp/absl/base/internal/thread_annotations.h +271 -0
  130. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +140 -0
  131. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +250 -0
  132. data/third_party/abseil-cpp/absl/base/internal/throw_delegate.cc +108 -0
  133. data/third_party/abseil-cpp/absl/base/internal/throw_delegate.h +75 -0
  134. data/third_party/abseil-cpp/absl/base/internal/tsan_mutex_interface.h +66 -0
  135. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +158 -0
  136. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +103 -0
  137. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +124 -0
  138. data/third_party/abseil-cpp/absl/base/log_severity.cc +27 -0
  139. data/third_party/abseil-cpp/absl/base/log_severity.h +121 -0
  140. data/third_party/abseil-cpp/absl/base/macros.h +220 -0
  141. data/third_party/abseil-cpp/absl/base/optimization.h +181 -0
  142. data/third_party/abseil-cpp/absl/base/options.h +214 -0
  143. data/third_party/abseil-cpp/absl/base/policy_checks.h +111 -0
  144. data/third_party/abseil-cpp/absl/base/port.h +26 -0
  145. data/third_party/abseil-cpp/absl/base/thread_annotations.h +280 -0
  146. data/third_party/abseil-cpp/absl/container/inlined_vector.h +848 -0
  147. data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +265 -0
  148. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +892 -0
  149. data/third_party/abseil-cpp/absl/memory/memory.h +695 -0
  150. data/third_party/abseil-cpp/absl/meta/type_traits.h +759 -0
  151. data/third_party/abseil-cpp/absl/numeric/int128.cc +404 -0
  152. data/third_party/abseil-cpp/absl/numeric/int128.h +1091 -0
  153. data/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +302 -0
  154. data/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +308 -0
  155. data/third_party/abseil-cpp/absl/strings/ascii.cc +200 -0
  156. data/third_party/abseil-cpp/absl/strings/ascii.h +241 -0
  157. data/third_party/abseil-cpp/absl/strings/charconv.cc +985 -0
  158. data/third_party/abseil-cpp/absl/strings/charconv.h +119 -0
  159. data/third_party/abseil-cpp/absl/strings/escaping.cc +949 -0
  160. data/third_party/abseil-cpp/absl/strings/escaping.h +164 -0
  161. data/third_party/abseil-cpp/absl/strings/internal/char_map.h +156 -0
  162. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +359 -0
  163. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.h +421 -0
  164. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +504 -0
  165. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.h +99 -0
  166. data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +180 -0
  167. data/third_party/abseil-cpp/absl/strings/internal/escaping.h +58 -0
  168. data/third_party/abseil-cpp/absl/strings/internal/memutil.cc +112 -0
  169. data/third_party/abseil-cpp/absl/strings/internal/memutil.h +148 -0
  170. data/third_party/abseil-cpp/absl/strings/internal/ostringstream.cc +36 -0
  171. data/third_party/abseil-cpp/absl/strings/internal/ostringstream.h +89 -0
  172. data/third_party/abseil-cpp/absl/strings/internal/resize_uninitialized.h +73 -0
  173. data/third_party/abseil-cpp/absl/strings/internal/stl_type_traits.h +248 -0
  174. data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +314 -0
  175. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +455 -0
  176. data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +53 -0
  177. data/third_party/abseil-cpp/absl/strings/internal/utf8.h +50 -0
  178. data/third_party/abseil-cpp/absl/strings/match.cc +40 -0
  179. data/third_party/abseil-cpp/absl/strings/match.h +90 -0
  180. data/third_party/abseil-cpp/absl/strings/numbers.cc +916 -0
  181. data/third_party/abseil-cpp/absl/strings/numbers.h +263 -0
  182. data/third_party/abseil-cpp/absl/strings/str_cat.cc +246 -0
  183. data/third_party/abseil-cpp/absl/strings/str_cat.h +408 -0
  184. data/third_party/abseil-cpp/absl/strings/str_join.h +293 -0
  185. data/third_party/abseil-cpp/absl/strings/str_replace.cc +82 -0
  186. data/third_party/abseil-cpp/absl/strings/str_replace.h +219 -0
  187. data/third_party/abseil-cpp/absl/strings/str_split.cc +139 -0
  188. data/third_party/abseil-cpp/absl/strings/str_split.h +513 -0
  189. data/third_party/abseil-cpp/absl/strings/string_view.cc +235 -0
  190. data/third_party/abseil-cpp/absl/strings/string_view.h +615 -0
  191. data/third_party/abseil-cpp/absl/strings/strip.h +91 -0
  192. data/third_party/abseil-cpp/absl/strings/substitute.cc +171 -0
  193. data/third_party/abseil-cpp/absl/strings/substitute.h +693 -0
  194. data/third_party/abseil-cpp/absl/types/bad_optional_access.cc +48 -0
  195. data/third_party/abseil-cpp/absl/types/bad_optional_access.h +78 -0
  196. data/third_party/abseil-cpp/absl/types/internal/optional.h +396 -0
  197. data/third_party/abseil-cpp/absl/types/internal/span.h +128 -0
  198. data/third_party/abseil-cpp/absl/types/optional.h +776 -0
  199. data/third_party/abseil-cpp/absl/types/span.h +713 -0
  200. data/third_party/abseil-cpp/absl/utility/utility.h +350 -0
  201. data/third_party/upb/upb/decode.c +4 -0
  202. data/third_party/upb/upb/port.c +0 -1
  203. data/third_party/upb/upb/port_def.inc +1 -3
  204. data/third_party/upb/upb/table.c +2 -1
  205. metadata +147 -43
  206. data/src/core/lib/json/json_common.h +0 -34
  207. data/src/core/lib/json/json_reader.h +0 -146
  208. data/src/core/lib/json/json_string.cc +0 -367
  209. data/src/core/lib/json/json_writer.h +0 -84
@@ -370,13 +370,6 @@ SubchannelList<SubchannelListType, SubchannelDataType>::SubchannelList(
370
370
  GRPC_ARG_SERVICE_CONFIG};
371
371
  // Create a subchannel for each address.
372
372
  for (size_t i = 0; i < addresses.size(); i++) {
373
- // TODO(roth): we should ideally hide this from the LB policy code. In
374
- // principle, if we're dealing with this special case in the client_channel
375
- // code for selecting grpclb, then we should also strip out these addresses
376
- // there if we're not using grpclb.
377
- if (addresses[i].IsBalancer()) {
378
- continue;
379
- }
380
373
  InlinedVector<grpc_arg, 3> args_to_add;
381
374
  const size_t subchannel_address_arg_index = args_to_add.size();
382
375
  args_to_add.emplace_back(
@@ -39,13 +39,13 @@ constexpr char kCds[] = "cds_experimental";
39
39
  // Parsed config for this LB policy.
40
40
  class ParsedCdsConfig : public LoadBalancingPolicy::Config {
41
41
  public:
42
- explicit ParsedCdsConfig(grpc_core::UniquePtr<char> cluster)
42
+ explicit ParsedCdsConfig(std::string cluster)
43
43
  : cluster_(std::move(cluster)) {}
44
- const char* cluster() const { return cluster_.get(); }
44
+ const char* cluster() const { return cluster_.c_str(); }
45
45
  const char* name() const override { return kCds; }
46
46
 
47
47
  private:
48
- grpc_core::UniquePtr<char> cluster_;
48
+ std::string cluster_;
49
49
  };
50
50
 
51
51
  // CDS LB policy.
@@ -119,9 +119,9 @@ void CdsLb::ClusterWatcher::OnClusterChanged(CdsUpdate cluster_data) {
119
119
  }
120
120
  // Construct config for child policy.
121
121
  char* lrs_str = nullptr;
122
- if (cluster_data.lrs_load_reporting_server_name != nullptr) {
122
+ if (cluster_data.lrs_load_reporting_server_name.has_value()) {
123
123
  gpr_asprintf(&lrs_str, " \"lrsLoadReportingServerName\": \"%s\",\n",
124
- cluster_data.lrs_load_reporting_server_name.get());
124
+ cluster_data.lrs_load_reporting_server_name.value().c_str());
125
125
  }
126
126
  char* json_str;
127
127
  gpr_asprintf(&json_str,
@@ -132,9 +132,9 @@ void CdsLb::ClusterWatcher::OnClusterChanged(CdsUpdate cluster_data) {
132
132
  " }\n"
133
133
  "}]",
134
134
  (lrs_str == nullptr ? "" : lrs_str),
135
- (cluster_data.eds_service_name == nullptr
135
+ (cluster_data.eds_service_name.empty()
136
136
  ? parent_->config_->cluster()
137
- : cluster_data.eds_service_name.get()));
137
+ : cluster_data.eds_service_name.c_str()));
138
138
  gpr_free(lrs_str);
139
139
  grpc_core::UniquePtr<char> json_str_deleter(json_str);
140
140
  if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
@@ -342,8 +342,7 @@ class CdsFactory : public LoadBalancingPolicyFactory {
342
342
  "required field 'cluster' not present"));
343
343
  }
344
344
  if (error_list.empty()) {
345
- return MakeRefCounted<ParsedCdsConfig>(
346
- grpc_core::UniquePtr<char>(gpr_strdup(cluster)));
345
+ return MakeRefCounted<ParsedCdsConfig>(cluster);
347
346
  } else {
348
347
  *error = GRPC_ERROR_CREATE_FROM_VECTOR("Cds Parser", &error_list);
349
348
  return nullptr;
@@ -78,8 +78,8 @@ class ParsedXdsConfig : public LoadBalancingPolicy::Config {
78
78
  public:
79
79
  ParsedXdsConfig(RefCountedPtr<LoadBalancingPolicy::Config> child_policy,
80
80
  RefCountedPtr<LoadBalancingPolicy::Config> fallback_policy,
81
- grpc_core::UniquePtr<char> eds_service_name,
82
- grpc_core::UniquePtr<char> lrs_load_reporting_server_name)
81
+ std::string eds_service_name,
82
+ Optional<std::string> lrs_load_reporting_server_name)
83
83
  : child_policy_(std::move(child_policy)),
84
84
  fallback_policy_(std::move(fallback_policy)),
85
85
  eds_service_name_(std::move(eds_service_name)),
@@ -96,17 +96,19 @@ class ParsedXdsConfig : public LoadBalancingPolicy::Config {
96
96
  return fallback_policy_;
97
97
  }
98
98
 
99
- const char* eds_service_name() const { return eds_service_name_.get(); };
99
+ const char* eds_service_name() const {
100
+ return eds_service_name_.empty() ? nullptr : eds_service_name_.c_str();
101
+ };
100
102
 
101
- const char* lrs_load_reporting_server_name() const {
102
- return lrs_load_reporting_server_name_.get();
103
+ const Optional<std::string>& lrs_load_reporting_server_name() const {
104
+ return lrs_load_reporting_server_name_;
103
105
  };
104
106
 
105
107
  private:
106
108
  RefCountedPtr<LoadBalancingPolicy::Config> child_policy_;
107
109
  RefCountedPtr<LoadBalancingPolicy::Config> fallback_policy_;
108
- grpc_core::UniquePtr<char> eds_service_name_;
109
- grpc_core::UniquePtr<char> lrs_load_reporting_server_name_;
110
+ std::string eds_service_name_;
111
+ Optional<std::string> lrs_load_reporting_server_name_;
110
112
  };
111
113
 
112
114
  class XdsLb : public LoadBalancingPolicy {
@@ -160,6 +162,8 @@ class XdsLb : public LoadBalancingPolicy {
160
162
  pickers_(std::move(pickers)),
161
163
  drop_config_(xds_policy_->drop_config_) {}
162
164
 
165
+ ~LocalityPicker() { xds_policy_.reset(DEBUG_LOCATION, "LocalityPicker"); }
166
+
163
167
  PickResult Pick(PickArgs args) override;
164
168
 
165
169
  private:
@@ -285,6 +289,8 @@ class XdsLb : public LoadBalancingPolicy {
285
289
 
286
290
  LocalityMap(RefCountedPtr<XdsLb> xds_policy, uint32_t priority);
287
291
 
292
+ ~LocalityMap() { xds_policy_.reset(DEBUG_LOCATION, "LocalityMap"); }
293
+
288
294
  void UpdateLocked(
289
295
  const XdsPriorityListUpdate::LocalityMap& locality_map_update);
290
296
  void ResetBackoffLocked();
@@ -397,7 +403,7 @@ class XdsLb : public LoadBalancingPolicy {
397
403
  if (config_ != nullptr && config_->eds_service_name() != nullptr) {
398
404
  return config_->eds_service_name();
399
405
  }
400
- return server_name_.get();
406
+ return server_name_.c_str();
401
407
  }
402
408
 
403
409
  XdsClient* xds_client() const {
@@ -406,7 +412,7 @@ class XdsLb : public LoadBalancingPolicy {
406
412
  }
407
413
 
408
414
  // Server name from target URI.
409
- grpc_core::UniquePtr<char> server_name_;
415
+ std::string server_name_;
410
416
 
411
417
  // Current channel args and config from the resolver.
412
418
  const grpc_channel_args* args_ = nullptr;
@@ -495,7 +501,7 @@ LoadBalancingPolicy::PickResult XdsLb::EndpointPickerWrapper::Pick(
495
501
 
496
502
  XdsLb::PickResult XdsLb::LocalityPicker::Pick(PickArgs args) {
497
503
  // Handle drop.
498
- const grpc_core::UniquePtr<char>* drop_category;
504
+ const std::string* drop_category;
499
505
  if (drop_config_->ShouldDrop(&drop_category)) {
500
506
  xds_policy_->client_stats_.AddCallDropped(*drop_category);
501
507
  PickResult result;
@@ -612,6 +618,8 @@ class XdsLb::EndpointWatcher : public XdsClient::EndpointWatcherInterface {
612
618
  explicit EndpointWatcher(RefCountedPtr<XdsLb> xds_policy)
613
619
  : xds_policy_(std::move(xds_policy)) {}
614
620
 
621
+ ~EndpointWatcher() { xds_policy_.reset(DEBUG_LOCATION, "EndpointWatcher"); }
622
+
615
623
  void OnEndpointChanged(EdsUpdate update) override {
616
624
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
617
625
  gpr_log(GPR_INFO, "[xdslb %p] Received EDS update from xds client",
@@ -706,11 +714,10 @@ XdsLb::XdsLb(Args args)
706
714
  GPR_ASSERT(server_uri != nullptr);
707
715
  grpc_uri* uri = grpc_uri_parse(server_uri, true);
708
716
  GPR_ASSERT(uri->path[0] != '\0');
709
- server_name_.reset(
710
- gpr_strdup(uri->path[0] == '/' ? uri->path + 1 : uri->path));
717
+ server_name_ = uri->path[0] == '/' ? uri->path + 1 : uri->path;
711
718
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
712
719
  gpr_log(GPR_INFO, "[xdslb %p] server name from channel: %s", this,
713
- server_name_.get());
720
+ server_name_.c_str());
714
721
  }
715
722
  grpc_uri_destroy(uri);
716
723
  }
@@ -743,9 +750,12 @@ void XdsLb::ShutdownLocked() {
743
750
  // watcher holds a ref to us.
744
751
  xds_client()->CancelEndpointDataWatch(StringView(eds_service_name()),
745
752
  endpoint_watcher_);
746
- if (config_->lrs_load_reporting_server_name() != nullptr) {
753
+ if (config_->lrs_load_reporting_server_name().has_value()) {
754
+ // TODO(roth): We should pass the cluster name (in addition to the
755
+ // eds_service_name) when adding the client stats. To do so, we need to
756
+ // first find a way to plumb the cluster name down into this LB policy.
747
757
  xds_client()->RemoveClientStats(
748
- StringView(config_->lrs_load_reporting_server_name()),
758
+ StringView(config_->lrs_load_reporting_server_name().value().c_str()),
749
759
  StringView(eds_service_name()), &client_stats_);
750
760
  }
751
761
  xds_client_from_channel_.reset();
@@ -820,7 +830,8 @@ void XdsLb::UpdateLocked(UpdateArgs args) {
820
830
  xds_client()->CancelEndpointDataWatch(StringView(old_eds_service_name),
821
831
  endpoint_watcher_);
822
832
  }
823
- auto watcher = MakeUnique<EndpointWatcher>(Ref());
833
+ auto watcher =
834
+ MakeUnique<EndpointWatcher>(Ref(DEBUG_LOCATION, "EndpointWatcher"));
824
835
  endpoint_watcher_ = watcher.get();
825
836
  xds_client()->WatchEndpointData(StringView(eds_service_name()),
826
837
  std::move(watcher));
@@ -831,21 +842,25 @@ void XdsLb::UpdateLocked(UpdateArgs args) {
831
842
  // all of the pickers whenever load reporting is enabled or disabled
832
843
  // here.
833
844
  if (is_initial_update ||
834
- (config_->lrs_load_reporting_server_name() == nullptr) !=
835
- (old_config->lrs_load_reporting_server_name() == nullptr) ||
836
- (config_->lrs_load_reporting_server_name() != nullptr &&
837
- old_config->lrs_load_reporting_server_name() != nullptr &&
838
- strcmp(config_->lrs_load_reporting_server_name(),
839
- old_config->lrs_load_reporting_server_name()) != 0)) {
845
+ (config_->lrs_load_reporting_server_name().has_value()) !=
846
+ (old_config->lrs_load_reporting_server_name().has_value()) ||
847
+ (config_->lrs_load_reporting_server_name().has_value() &&
848
+ old_config->lrs_load_reporting_server_name().has_value() &&
849
+ config_->lrs_load_reporting_server_name().value() !=
850
+ old_config->lrs_load_reporting_server_name().value())) {
840
851
  if (old_config != nullptr &&
841
- old_config->lrs_load_reporting_server_name() != nullptr) {
852
+ old_config->lrs_load_reporting_server_name().has_value()) {
842
853
  xds_client()->RemoveClientStats(
843
- StringView(old_config->lrs_load_reporting_server_name()),
854
+ StringView(
855
+ old_config->lrs_load_reporting_server_name().value().c_str()),
844
856
  StringView(old_eds_service_name), &client_stats_);
845
857
  }
846
- if (config_->lrs_load_reporting_server_name() != nullptr) {
858
+ if (config_->lrs_load_reporting_server_name().has_value()) {
859
+ // TODO(roth): We should pass the cluster name (in addition to the
860
+ // eds_service_name) when adding the client stats. To do so, we need to
861
+ // first find a way to plumb the cluster name down into this LB policy.
847
862
  xds_client()->AddClientStats(
848
- StringView(config_->lrs_load_reporting_server_name()),
863
+ StringView(config_->lrs_load_reporting_server_name().value().c_str()),
849
864
  StringView(eds_service_name()), &client_stats_);
850
865
  }
851
866
  }
@@ -1083,7 +1098,7 @@ void XdsLb::PriorityList::MaybeCreateLocalityMapLocked(uint32_t priority) {
1083
1098
  // Exhausted priorities in the update.
1084
1099
  if (!priority_list_update().Contains(priority)) return;
1085
1100
  auto new_locality_map = new LocalityMap(
1086
- xds_policy_->Ref(DEBUG_LOCATION, "XdsLb+LocalityMap"), priority);
1101
+ xds_policy_->Ref(DEBUG_LOCATION, "LocalityMap"), priority);
1087
1102
  priorities_.emplace_back(OrphanablePtr<LocalityMap>(new_locality_map));
1088
1103
  new_locality_map->UpdateLocked(*priority_list_update().Find(priority));
1089
1104
  }
@@ -1152,7 +1167,6 @@ XdsLb::PriorityList::LocalityMap::LocalityMap(RefCountedPtr<XdsLb> xds_policy,
1152
1167
  gpr_log(GPR_INFO, "[xdslb %p] Creating priority %" PRIu32,
1153
1168
  xds_policy_.get(), priority_);
1154
1169
  }
1155
-
1156
1170
  GRPC_CLOSURE_INIT(&on_failover_timer_, OnFailoverTimer, this,
1157
1171
  grpc_schedule_on_exec_ctx);
1158
1172
  // Start the failover timer.
@@ -1239,9 +1253,10 @@ void XdsLb::PriorityList::LocalityMap::UpdateXdsPickerLocked() {
1239
1253
  picker_list.push_back(std::make_pair(end, locality->picker_wrapper()));
1240
1254
  }
1241
1255
  xds_policy()->channel_control_helper()->UpdateState(
1242
- GRPC_CHANNEL_READY, MakeUnique<LocalityPicker>(
1243
- xds_policy_->Ref(DEBUG_LOCATION, "XdsLb+Picker"),
1244
- std::move(picker_list)));
1256
+ GRPC_CHANNEL_READY,
1257
+ grpc_core::MakeUnique<LocalityPicker>(
1258
+ xds_policy_->Ref(DEBUG_LOCATION, "LocalityPicker"),
1259
+ std::move(picker_list)));
1245
1260
  }
1246
1261
 
1247
1262
  OrphanablePtr<XdsLb::PriorityList::LocalityMap::Locality>
@@ -1869,11 +1884,15 @@ class XdsFactory : public LoadBalancingPolicyFactory {
1869
1884
  }
1870
1885
  }
1871
1886
  if (error_list.empty()) {
1887
+ Optional<std::string> optional_lrs_load_reporting_server_name;
1888
+ if (lrs_load_reporting_server_name != nullptr) {
1889
+ optional_lrs_load_reporting_server_name.set(
1890
+ std::string(lrs_load_reporting_server_name));
1891
+ }
1872
1892
  return MakeRefCounted<ParsedXdsConfig>(
1873
1893
  std::move(child_policy), std::move(fallback_policy),
1874
- grpc_core::UniquePtr<char>(gpr_strdup(eds_service_name)),
1875
- grpc_core::UniquePtr<char>(
1876
- gpr_strdup(lrs_load_reporting_server_name)));
1894
+ eds_service_name == nullptr ? "" : eds_service_name,
1895
+ std::move(optional_lrs_load_reporting_server_name));
1877
1896
  } else {
1878
1897
  *error = GRPC_ERROR_CREATE_FROM_VECTOR("Xds Parser", &error_list);
1879
1898
  return nullptr;
@@ -30,6 +30,7 @@
30
30
  #include <address_sorting/address_sorting.h>
31
31
 
32
32
  #include "src/core/ext/filters/client_channel/http_connect_handshaker.h"
33
+ #include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h"
33
34
  #include "src/core/ext/filters/client_channel/lb_policy_registry.h"
34
35
  #include "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h"
35
36
  #include "src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h"
@@ -107,8 +108,10 @@ class AresDnsResolver : public Resolver {
107
108
  grpc_millis last_resolution_timestamp_ = -1;
108
109
  /// retry backoff state
109
110
  BackOff backoff_;
110
- /// currently resolving addresses
111
+ /// currently resolving backend addresses
111
112
  std::unique_ptr<ServerAddressList> addresses_;
113
+ /// currently resolving balancer addresses
114
+ std::unique_ptr<ServerAddressList> balancer_addresses_;
112
115
  /// currently resolving service config
113
116
  char* service_config_json_ = nullptr;
114
117
  // has shutdown been initiated
@@ -340,9 +343,11 @@ void AresDnsResolver::OnResolvedLocked(void* arg, grpc_error* error) {
340
343
  r->Unref(DEBUG_LOCATION, "OnResolvedLocked() shutdown");
341
344
  return;
342
345
  }
343
- if (r->addresses_ != nullptr) {
346
+ if (r->addresses_ != nullptr || r->balancer_addresses_ != nullptr) {
344
347
  Result result;
345
- result.addresses = std::move(*r->addresses_);
348
+ if (r->addresses_ != nullptr) {
349
+ result.addresses = std::move(*r->addresses_);
350
+ }
346
351
  if (r->service_config_json_ != nullptr) {
347
352
  char* service_config_string = ChooseServiceConfig(
348
353
  r->service_config_json_, &result.service_config_error);
@@ -356,9 +361,16 @@ void AresDnsResolver::OnResolvedLocked(void* arg, grpc_error* error) {
356
361
  }
357
362
  gpr_free(service_config_string);
358
363
  }
359
- result.args = grpc_channel_args_copy(r->channel_args_);
364
+ InlinedVector<grpc_arg, 1> new_args;
365
+ if (r->balancer_addresses_ != nullptr) {
366
+ new_args.push_back(
367
+ CreateGrpclbBalancerAddressesArg(r->balancer_addresses_.get()));
368
+ }
369
+ result.args = grpc_channel_args_copy_and_add(
370
+ r->channel_args_, new_args.data(), new_args.size());
360
371
  r->result_handler()->ReturnResult(std::move(result));
361
372
  r->addresses_.reset();
373
+ r->balancer_addresses_.reset();
362
374
  // Reset backoff state so that we start from the beginning when the
363
375
  // next request gets triggered.
364
376
  r->backoff_.Reset();
@@ -437,7 +449,8 @@ void AresDnsResolver::StartResolvingLocked() {
437
449
  GRPC_CLOSURE_INIT(&on_resolved_, OnResolved, this, grpc_schedule_on_exec_ctx);
438
450
  pending_request_ = grpc_dns_lookup_ares_locked(
439
451
  dns_server_, name_to_resolve_, kDefaultPort, interested_parties_,
440
- &on_resolved_, &addresses_, enable_srv_queries_ /* check_grpclb */,
452
+ &on_resolved_, &addresses_,
453
+ enable_srv_queries_ ? &balancer_addresses_ : nullptr,
441
454
  request_service_config_ ? &service_config_json_ : nullptr,
442
455
  query_timeout_ms_, combiner());
443
456
  last_resolution_timestamp_ = grpc_core::ExecCtx::Get()->Now();
@@ -33,6 +33,7 @@
33
33
  #include <grpc/support/time.h>
34
34
 
35
35
  #include <address_sorting/address_sorting.h>
36
+ #include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h"
36
37
  #include "src/core/ext/filters/client_channel/parse_address.h"
37
38
  #include "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h"
38
39
  #include "src/core/lib/gpr/string.h"
@@ -60,6 +61,8 @@ struct grpc_ares_request {
60
61
  grpc_closure* on_done;
61
62
  /** the pointer to receive the resolved addresses */
62
63
  std::unique_ptr<grpc_core::ServerAddressList>* addresses_out;
64
+ /** the pointer to receive the resolved balancer addresses */
65
+ std::unique_ptr<grpc_core::ServerAddressList>* balancer_addresses_out;
63
66
  /** the pointer to receive the service config in JSON */
64
67
  char** service_config_json_out;
65
68
  /** the evernt driver used by this request */
@@ -184,17 +187,17 @@ static void on_hostbyname_done_locked(void* arg, int status, int /*timeouts*/,
184
187
  GRPC_CARES_TRACE_LOG(
185
188
  "request:%p on_hostbyname_done_locked host=%s ARES_SUCCESS", r,
186
189
  hr->host);
187
- if (*r->addresses_out == nullptr) {
188
- *r->addresses_out = grpc_core::MakeUnique<ServerAddressList>();
190
+ std::unique_ptr<ServerAddressList>* address_list_ptr =
191
+ hr->is_balancer ? r->balancer_addresses_out : r->addresses_out;
192
+ if (*address_list_ptr == nullptr) {
193
+ *address_list_ptr = grpc_core::MakeUnique<ServerAddressList>();
189
194
  }
190
- ServerAddressList& addresses = **r->addresses_out;
195
+ ServerAddressList& addresses = **address_list_ptr;
191
196
  for (size_t i = 0; hostent->h_addr_list[i] != nullptr; ++i) {
192
- grpc_core::InlinedVector<grpc_arg, 2> args_to_add;
197
+ grpc_core::InlinedVector<grpc_arg, 1> args_to_add;
193
198
  if (hr->is_balancer) {
194
- args_to_add.emplace_back(grpc_channel_arg_integer_create(
195
- const_cast<char*>(GRPC_ARG_ADDRESS_IS_BALANCER), 1));
196
- args_to_add.emplace_back(grpc_channel_arg_string_create(
197
- const_cast<char*>(GRPC_ARG_ADDRESS_BALANCER_NAME), hr->host));
199
+ args_to_add.emplace_back(
200
+ grpc_core::CreateGrpclbBalancerNameArg(hr->host));
198
201
  }
199
202
  grpc_channel_args* args = grpc_channel_args_copy_and_add(
200
203
  nullptr, args_to_add.data(), args_to_add.size());
@@ -350,7 +353,7 @@ done:
350
353
  void grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked(
351
354
  grpc_ares_request* r, const char* dns_server, const char* name,
352
355
  const char* default_port, grpc_pollset_set* interested_parties,
353
- bool check_grpclb, int query_timeout_ms, grpc_core::Combiner* combiner) {
356
+ int query_timeout_ms, grpc_core::Combiner* combiner) {
354
357
  grpc_error* error = GRPC_ERROR_NONE;
355
358
  grpc_ares_hostbyname_request* hr = nullptr;
356
359
  ares_channel* channel = nullptr;
@@ -425,7 +428,7 @@ void grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked(
425
428
  /*is_balancer=*/false);
426
429
  ares_gethostbyname(*channel, hr->host, AF_INET, on_hostbyname_done_locked,
427
430
  hr);
428
- if (check_grpclb) {
431
+ if (r->balancer_addresses_out != nullptr) {
429
432
  /* Query the SRV record */
430
433
  grpc_ares_request_ref_locked(r);
431
434
  char* service_name;
@@ -588,7 +591,8 @@ static bool grpc_ares_maybe_resolve_localhost_manually_locked(
588
591
  static grpc_ares_request* grpc_dns_lookup_ares_locked_impl(
589
592
  const char* dns_server, const char* name, const char* default_port,
590
593
  grpc_pollset_set* interested_parties, grpc_closure* on_done,
591
- std::unique_ptr<grpc_core::ServerAddressList>* addrs, bool check_grpclb,
594
+ std::unique_ptr<grpc_core::ServerAddressList>* addrs,
595
+ std::unique_ptr<grpc_core::ServerAddressList>* balancer_addrs,
592
596
  char** service_config_json, int query_timeout_ms,
593
597
  grpc_core::Combiner* combiner) {
594
598
  grpc_ares_request* r =
@@ -596,6 +600,7 @@ static grpc_ares_request* grpc_dns_lookup_ares_locked_impl(
596
600
  r->ev_driver = nullptr;
597
601
  r->on_done = on_done;
598
602
  r->addresses_out = addrs;
603
+ r->balancer_addresses_out = balancer_addrs;
599
604
  r->service_config_json_out = service_config_json;
600
605
  r->error = GRPC_ERROR_NONE;
601
606
  r->pending_queries = 0;
@@ -618,20 +623,21 @@ static grpc_ares_request* grpc_dns_lookup_ares_locked_impl(
618
623
  // as to cut down on lookups over the network, especially in tests:
619
624
  // https://github.com/grpc/proposal/pull/79
620
625
  if (target_matches_localhost(name)) {
621
- check_grpclb = false;
626
+ r->balancer_addresses_out = nullptr;
622
627
  r->service_config_json_out = nullptr;
623
628
  }
624
629
  // Look up name using c-ares lib.
625
630
  grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked(
626
- r, dns_server, name, default_port, interested_parties, check_grpclb,
627
- query_timeout_ms, combiner);
631
+ r, dns_server, name, default_port, interested_parties, query_timeout_ms,
632
+ combiner);
628
633
  return r;
629
634
  }
630
635
 
631
636
  grpc_ares_request* (*grpc_dns_lookup_ares_locked)(
632
637
  const char* dns_server, const char* name, const char* default_port,
633
638
  grpc_pollset_set* interested_parties, grpc_closure* on_done,
634
- std::unique_ptr<grpc_core::ServerAddressList>* addrs, bool check_grpclb,
639
+ std::unique_ptr<grpc_core::ServerAddressList>* addrs,
640
+ std::unique_ptr<grpc_core::ServerAddressList>* balancer_addrs,
635
641
  char** service_config_json, int query_timeout_ms,
636
642
  grpc_core::Combiner* combiner) = grpc_dns_lookup_ares_locked_impl;
637
643
 
@@ -709,7 +715,6 @@ static void on_dns_lookup_done_locked(void* arg, grpc_error* error) {
709
715
  static_cast<grpc_resolved_address*>(gpr_zalloc(
710
716
  sizeof(grpc_resolved_address) * (*resolved_addresses)->naddrs));
711
717
  for (size_t i = 0; i < (*resolved_addresses)->naddrs; ++i) {
712
- GPR_ASSERT(!(*r->addresses)[i].IsBalancer());
713
718
  memcpy(&(*resolved_addresses)->addrs[i], &(*r->addresses)[i].address(),
714
719
  sizeof(grpc_resolved_address));
715
720
  }
@@ -736,9 +741,9 @@ static void grpc_resolve_address_invoke_dns_lookup_ares_locked(
736
741
  grpc_schedule_on_exec_ctx);
737
742
  r->ares_request = grpc_dns_lookup_ares_locked(
738
743
  nullptr /* dns_server */, r->name, r->default_port, r->interested_parties,
739
- &r->on_dns_lookup_done_locked, &r->addresses, false /* check_grpclb */,
740
- nullptr /* service_config_json */, GRPC_DNS_ARES_DEFAULT_QUERY_TIMEOUT_MS,
741
- r->combiner);
744
+ &r->on_dns_lookup_done_locked, &r->addresses,
745
+ nullptr /* balancer_addresses */, nullptr /* service_config_json */,
746
+ GRPC_DNS_ARES_DEFAULT_QUERY_TIMEOUT_MS, r->combiner);
742
747
  }
743
748
 
744
749
  static void grpc_resolve_address_ares_impl(const char* name,