dns_resolver_ares.cc
Go to the documentation of this file.
1 //
2 // Copyright 2015 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 
18 
19 #include <stdint.h>
20 #include <stdlib.h>
21 
22 #include <algorithm>
23 #include <functional>
24 #include <map>
25 #include <memory>
26 #include <string>
27 #include <type_traits>
28 #include <utility>
29 #include <vector>
30 
31 #include "absl/base/thread_annotations.h"
32 #include "absl/memory/memory.h"
33 #include "absl/status/status.h"
34 #include "absl/status/statusor.h"
35 #include "absl/strings/string_view.h"
36 #include "absl/strings/strip.h"
37 
40 #include <grpc/support/alloc.h>
41 #include <grpc/support/log.h>
42 
61 
62 #if GRPC_ARES == 1
63 
64 #include <limits.h>
65 #include <stdio.h>
66 #include <string.h>
67 
69 
70 #include "absl/container/flat_hash_set.h"
71 #include "absl/container/inlined_vector.h"
72 #include "absl/strings/str_cat.h"
73 
84 #include "src/core/lib/json/json.h"
89 
90 #define GRPC_DNS_INITIAL_CONNECT_BACKOFF_SECONDS 1
91 #define GRPC_DNS_RECONNECT_BACKOFF_MULTIPLIER 1.6
92 #define GRPC_DNS_RECONNECT_MAX_BACKOFF_SECONDS 120
93 #define GRPC_DNS_RECONNECT_JITTER 0.2
94 
95 namespace grpc_core {
96 
97 namespace {
98 
99 class AresClientChannelDNSResolver : public PollingResolver {
100  public:
101  AresClientChannelDNSResolver(ResolverArgs args,
102  const grpc_channel_args* channel_args);
103 
104  OrphanablePtr<Orphanable> StartRequest() override;
105 
106  private:
107  class AresRequestWrapper : public InternallyRefCounted<AresRequestWrapper> {
108  public:
109  explicit AresRequestWrapper(
110  RefCountedPtr<AresClientChannelDNSResolver> resolver)
111  : resolver_(std::move(resolver)) {
112  Ref(DEBUG_LOCATION, "OnResolved").release();
113  GRPC_CLOSURE_INIT(&on_resolved_, OnResolved, this, nullptr);
115  resolver_->authority().c_str(), resolver_->name_to_resolve().c_str(),
116  kDefaultSecurePort, resolver_->interested_parties(), &on_resolved_,
117  &addresses_,
118  resolver_->enable_srv_queries_ ? &balancer_addresses_ : nullptr,
119  resolver_->request_service_config_ ? &service_config_json_ : nullptr,
120  resolver_->query_timeout_ms_));
121  GRPC_CARES_TRACE_LOG("resolver:%p Started resolving. request_:%p",
122  resolver_.get(), request_.get());
123  }
124 
125  ~AresRequestWrapper() override {
126  gpr_free(service_config_json_);
127  resolver_.reset(DEBUG_LOCATION, "dns-resolving");
128  }
129 
130  void Orphan() override {
132  Unref(DEBUG_LOCATION, "Orphan");
133  }
134 
135  private:
136  static void OnResolved(void* arg, grpc_error_handle error);
137  void OnResolved(grpc_error_handle error);
138 
139  RefCountedPtr<AresClientChannelDNSResolver> resolver_;
140  std::unique_ptr<grpc_ares_request> request_;
141  grpc_closure on_resolved_;
142  // Output fields from ares request.
143  std::unique_ptr<ServerAddressList> addresses_;
144  std::unique_ptr<ServerAddressList> balancer_addresses_;
145  char* service_config_json_ = nullptr;
146  };
147 
148  ~AresClientChannelDNSResolver() override;
149 
151  const bool request_service_config_;
152  // whether or not to enable SRV DNS queries
153  const bool enable_srv_queries_;
154  // timeout in milliseconds for active DNS queries
155  const int query_timeout_ms_;
156 };
157 
158 AresClientChannelDNSResolver::AresClientChannelDNSResolver(
159  ResolverArgs args, const grpc_channel_args* channel_args)
160  : PollingResolver(
161  std::move(args), channel_args,
164  {1000 * 30, 0, INT_MAX})),
165  BackOff::Options()
166  .set_initial_backoff(Duration::Milliseconds(
169  .set_jitter(GRPC_DNS_RECONNECT_JITTER)
170  .set_max_backoff(Duration::Milliseconds(
173  request_service_config_(!grpc_channel_args_find_bool(
174  channel_args, GRPC_ARG_SERVICE_CONFIG_DISABLE_RESOLUTION, true)),
175  enable_srv_queries_(grpc_channel_args_find_bool(
176  channel_args, GRPC_ARG_DNS_ENABLE_SRV_QUERIES, false)),
177  query_timeout_ms_(grpc_channel_args_find_integer(
179  {GRPC_DNS_ARES_DEFAULT_QUERY_TIMEOUT_MS, 0, INT_MAX})) {}
180 
181 AresClientChannelDNSResolver::~AresClientChannelDNSResolver() {
182  GRPC_CARES_TRACE_LOG("resolver:%p destroying AresClientChannelDNSResolver",
183  this);
184 }
185 
186 OrphanablePtr<Orphanable> AresClientChannelDNSResolver::StartRequest() {
187  return MakeOrphanable<AresRequestWrapper>(
188  Ref(DEBUG_LOCATION, "dns-resolving"));
189 }
190 
191 bool ValueInJsonArray(const Json::Array& array, const char* value) {
192  for (const Json& entry : array) {
193  if (entry.type() == Json::Type::STRING && entry.string_value() == value) {
194  return true;
195  }
196  }
197  return false;
198 }
199 
200 std::string ChooseServiceConfig(char* service_config_choice_json,
202  Json json = Json::Parse(service_config_choice_json, error);
203  if (!GRPC_ERROR_IS_NONE(*error)) return "";
204  if (json.type() != Json::Type::ARRAY) {
206  "Service Config Choices, error: should be of type array");
207  return "";
208  }
209  const Json* service_config = nullptr;
210  std::vector<grpc_error_handle> error_list;
211  for (const Json& choice : json.array_value()) {
212  if (choice.type() != Json::Type::OBJECT) {
213  error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
214  "Service Config Choice, error: should be of type object"));
215  continue;
216  }
217  // Check client language, if specified.
218  auto it = choice.object_value().find("clientLanguage");
219  if (it != choice.object_value().end()) {
220  if (it->second.type() != Json::Type::ARRAY) {
221  error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
222  "field:clientLanguage error:should be of type array"));
223  } else if (!ValueInJsonArray(it->second.array_value(), "c++")) {
224  continue;
225  }
226  }
227  // Check client hostname, if specified.
228  it = choice.object_value().find("clientHostname");
229  if (it != choice.object_value().end()) {
230  if (it->second.type() != Json::Type::ARRAY) {
231  error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
232  "field:clientHostname error:should be of type array"));
233  } else {
234  char* hostname = grpc_gethostname();
235  if (hostname == nullptr ||
236  !ValueInJsonArray(it->second.array_value(), hostname)) {
237  continue;
238  }
239  }
240  }
241  // Check percentage, if specified.
242  it = choice.object_value().find("percentage");
243  if (it != choice.object_value().end()) {
244  if (it->second.type() != Json::Type::NUMBER) {
245  error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
246  "field:percentage error:should be of type number"));
247  } else {
248  int random_pct = rand() % 100;
249  int percentage;
250  if (sscanf(it->second.string_value().c_str(), "%d", &percentage) != 1) {
251  error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
252  "field:percentage error:should be of type integer"));
253  } else if (random_pct > percentage || percentage == 0) {
254  continue;
255  }
256  }
257  }
258  // Found service config.
259  it = choice.object_value().find("serviceConfig");
260  if (it == choice.object_value().end()) {
261  error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
262  "field:serviceConfig error:required field missing"));
263  } else if (it->second.type() != Json::Type::OBJECT) {
264  error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
265  "field:serviceConfig error:should be of type object"));
266  } else if (service_config == nullptr) {
267  service_config = &it->second;
268  }
269  }
270  if (!error_list.empty()) {
271  service_config = nullptr;
272  *error = GRPC_ERROR_CREATE_FROM_VECTOR("Service Config Choices Parser",
273  &error_list);
274  }
275  if (service_config == nullptr) return "";
276  return service_config->Dump();
277 }
278 
279 void AresClientChannelDNSResolver::AresRequestWrapper::OnResolved(
280  void* arg, grpc_error_handle error) {
281  auto* self = static_cast<AresRequestWrapper*>(arg);
282  self->OnResolved(error);
283 }
284 
285 void AresClientChannelDNSResolver::AresRequestWrapper::OnResolved(
287  GRPC_CARES_TRACE_LOG("resolver:%p OnResolved()", this);
288  Result result;
290  // TODO(roth): Change logic to be able to report failures for addresses
291  // and service config independently of each other.
292  if (addresses_ != nullptr || balancer_addresses_ != nullptr) {
293  if (addresses_ != nullptr) {
294  result.addresses = std::move(*addresses_);
295  } else {
296  result.addresses = ServerAddressList();
297  }
298  if (service_config_json_ != nullptr) {
299  grpc_error_handle service_config_error = GRPC_ERROR_NONE;
300  std::string service_config_string =
301  ChooseServiceConfig(service_config_json_, &service_config_error);
302  RefCountedPtr<ServiceConfig> service_config;
303  if (GRPC_ERROR_IS_NONE(service_config_error) &&
304  !service_config_string.empty()) {
305  GRPC_CARES_TRACE_LOG("resolver:%p selected service config choice: %s",
306  this, service_config_string.c_str());
307  service_config = ServiceConfigImpl::Create(resolver_->channel_args(),
308  service_config_string,
309  &service_config_error);
310  }
311  if (!GRPC_ERROR_IS_NONE(service_config_error)) {
312  result.service_config = absl::UnavailableError(
313  absl::StrCat("failed to parse service config: ",
314  grpc_error_std_string(service_config_error)));
315  GRPC_ERROR_UNREF(service_config_error);
316  } else {
317  result.service_config = std::move(service_config);
318  }
319  }
320  if (balancer_addresses_ != nullptr) {
321  new_args.push_back(
322  CreateGrpclbBalancerAddressesArg(balancer_addresses_.get()));
323  }
324  } else {
325  GRPC_CARES_TRACE_LOG("resolver:%p dns resolution failed: %s", this,
327  std::string error_message;
330  absl::StrCat("DNS resolution failed for ", resolver_->name_to_resolve(),
331  ": ", error_message));
332  result.addresses = status;
333  result.service_config = status;
334  }
336  resolver_->channel_args(), new_args.data(), new_args.size());
337  resolver_->OnRequestComplete(std::move(result));
338  Unref(DEBUG_LOCATION, "OnResolved");
339 }
340 
341 //
342 // Factory
343 //
344 
345 class AresClientChannelDNSResolverFactory : public ResolverFactory {
346  public:
347  absl::string_view scheme() const override { return "dns"; }
348 
349  bool IsValidUri(const URI& uri) const override {
350  if (absl::StripPrefix(uri.path(), "/").empty()) {
351  gpr_log(GPR_ERROR, "no server name supplied in dns URI");
352  return false;
353  }
354  return true;
355  }
356 
357  OrphanablePtr<Resolver> CreateResolver(ResolverArgs args) const override {
358  const grpc_channel_args* channel_args = args.args;
359  return MakeOrphanable<AresClientChannelDNSResolver>(std::move(args),
360  channel_args);
361  }
362 };
363 
364 class AresDNSResolver : public DNSResolver {
365  public:
366  class AresRequest {
367  public:
368  AresRequest(
370  grpc_pollset_set* interested_parties,
371  std::function<void(absl::StatusOr<std::vector<grpc_resolved_address>>)>
372  on_resolve_address_done,
373  AresDNSResolver* resolver, intptr_t aba_token)
374  : name_(std::string(name)),
375  default_port_(std::string(default_port)),
376  interested_parties_(interested_parties),
377  pollset_set_(grpc_pollset_set_create()),
378  on_resolve_address_done_(std::move(on_resolve_address_done)),
379  completed_(false),
380  resolver_(resolver),
381  aba_token_(aba_token) {
382  GRPC_CARES_TRACE_LOG("AresRequest:%p ctor", this);
383  GRPC_CLOSURE_INIT(&on_dns_lookup_done_, OnDnsLookupDone, this,
384  grpc_schedule_on_exec_ctx);
385  MutexLock lock(&mu_);
386  grpc_pollset_set_add_pollset_set(pollset_set_, interested_parties);
387  ares_request_ = std::unique_ptr<grpc_ares_request>(grpc_dns_lookup_ares(
388  /*dns_server=*/"", name_.c_str(), default_port_.c_str(), pollset_set_,
389  &on_dns_lookup_done_, &addresses_,
390  /*balancer_addresses=*/nullptr, /*service_config_json=*/nullptr,
392  GRPC_CARES_TRACE_LOG("AresRequest:%p Start ares_request_:%p", this,
393  ares_request_.get());
394  }
395 
396  ~AresRequest() {
397  GRPC_CARES_TRACE_LOG("AresRequest:%p dtor ares_request_:%p", this,
398  ares_request_.get());
399  resolver_->UnregisterRequest(task_handle());
400  grpc_pollset_set_destroy(pollset_set_);
401  }
402 
403  bool Cancel() {
404  MutexLock lock(&mu_);
405  GRPC_CARES_TRACE_LOG("AresRequest:%p Cancel ares_request_:%p", this,
406  ares_request_.get());
407  if (completed_) return false;
408  // OnDnsLookupDone will still be run
409  grpc_cancel_ares_request(ares_request_.get());
410  completed_ = true;
412  return true;
413  }
414 
415  TaskHandle task_handle() {
416  return {reinterpret_cast<intptr_t>(this), aba_token_};
417  }
418 
419  private:
420  // Called by ares when lookup has completed or when cancelled. It is always
421  // called exactly once.
422  static void OnDnsLookupDone(void* arg, grpc_error_handle error) {
423  AresRequest* request = static_cast<AresRequest*>(arg);
424  GRPC_CARES_TRACE_LOG("AresRequest:%p OnDnsLookupDone", request);
425  // This request is deleted and unregistered upon any exit.
426  std::unique_ptr<AresRequest> deleter(request);
427  std::vector<grpc_resolved_address> resolved_addresses;
428  {
429  MutexLock lock(&request->mu_);
430  if (request->completed_) return;
431  request->completed_ = true;
432  if (request->addresses_ != nullptr) {
433  resolved_addresses.reserve(request->addresses_->size());
434  for (const auto& server_address : *request->addresses_) {
435  resolved_addresses.push_back(server_address.address());
436  }
437  }
438  }
440  request->interested_parties_);
441  if (!GRPC_ERROR_IS_NONE(error)) {
442  request->on_resolve_address_done_(grpc_error_to_absl_status(error));
443  return;
444  }
445  request->on_resolve_address_done_(std::move(resolved_addresses));
446  }
447 
448  // mutex to synchronize access to this object (but not to the ares_request
449  // object itself).
450  Mutex mu_;
451  // the name to resolve
452  const std::string name_;
453  // the default port to use if name doesn't have one
454  const std::string default_port_;
455  // parties interested in our I/O
457  // locally owned pollset_set, required to support cancellation of requests
458  // while ares still needs a valid pollset_set.
459  grpc_pollset_set* pollset_set_;
460  // user-provided completion callback
461  const std::function<void(
462  absl::StatusOr<std::vector<grpc_resolved_address>>)>
463  on_resolve_address_done_;
464  // currently resolving addresses
465  std::unique_ptr<ServerAddressList> addresses_ ABSL_GUARDED_BY(mu_);
466  // closure to call when the resolve_address_ares request completes
467  // a closure wrapping on_resolve_address_done, which should be invoked
468  // when the grpc_dns_lookup_ares operation is done.
469  grpc_closure on_dns_lookup_done_ ABSL_GUARDED_BY(mu_);
470  // underlying ares_request that the query is performed on
471  std::unique_ptr<grpc_ares_request> ares_request_ ABSL_GUARDED_BY(mu_);
472  bool completed_ ABSL_GUARDED_BY(mu_);
473  // Parent resolver that created this request
474  AresDNSResolver* resolver_;
475  // Unique token to help distinguish this request from others that may later
476  // be created in the same memory location.
477  intptr_t aba_token_;
478  };
479 
480  // gets the singleton instance, possibly creating it first
481  static AresDNSResolver* GetOrCreate() {
482  static AresDNSResolver* instance = new AresDNSResolver();
483  return instance;
484  }
485 
486  TaskHandle ResolveName(
488  grpc_pollset_set* interested_parties,
489  std::function<void(absl::StatusOr<std::vector<grpc_resolved_address>>)>
490  on_done) override {
491  MutexLock lock(&mu_);
492  auto* request = new AresRequest(name, default_port, interested_parties,
493  std::move(on_done), this, aba_token_++);
494  auto handle = request->task_handle();
495  open_requests_.insert(handle);
496  return handle;
497  }
498 
500  absl::string_view name, absl::string_view default_port) override {
501  // TODO(apolcyn): change this to wrap the async version of the c-ares
502  // API with a promise, and remove the reference to the previous resolver.
503  return default_resolver_->ResolveNameBlocking(name, default_port);
504  }
505 
506  bool Cancel(TaskHandle handle) override {
507  MutexLock lock(&mu_);
508  if (!open_requests_.contains(handle)) {
509  // Unknown request, possibly completed already, or an invalid handle.
511  "AresDNSResolver:%p attempt to cancel unknown TaskHandle:%s", this,
512  HandleToString(handle).c_str());
513  return false;
514  }
515  auto* request = reinterpret_cast<AresRequest*>(handle.keys[0]);
516  GRPC_CARES_TRACE_LOG("AresDNSResolver:%p cancel ares_request:%p", this,
517  request);
518  return request->Cancel();
519  }
520 
521  private:
522  // Called exclusively from the AresRequest destructor.
523  void UnregisterRequest(TaskHandle handle) {
524  MutexLock lock(&mu_);
525  open_requests_.erase(handle);
526  }
527 
528  // the previous default DNS resolver, used to delegate blocking DNS calls to
529  DNSResolver* default_resolver_ = GetDNSResolver();
530  Mutex mu_;
533  intptr_t aba_token_ ABSL_GUARDED_BY(mu_) = 0;
534 };
535 
536 bool ShouldUseAres(const char* resolver_env) {
537  return resolver_env == nullptr || strlen(resolver_env) == 0 ||
538  gpr_stricmp(resolver_env, "ares") == 0;
539 }
540 
541 bool UseAresDnsResolver() {
542  static const bool result = []() {
543  UniquePtr<char> resolver = GPR_GLOBAL_CONFIG_GET(grpc_dns_resolver);
544  bool result = ShouldUseAres(resolver.get());
545  if (result) gpr_log(GPR_DEBUG, "Using ares dns resolver");
546  return result;
547  }();
548  return result;
549 }
550 
551 } // namespace
552 
554  if (UseAresDnsResolver()) {
555  builder->resolver_registry()->RegisterResolverFactory(
556  absl::make_unique<AresClientChannelDNSResolverFactory>());
557  }
558 }
559 
560 } // namespace grpc_core
561 
563  if (grpc_core::UseAresDnsResolver()) {
566  if (!GRPC_ERROR_IS_NONE(error)) {
567  GRPC_LOG_IF_ERROR("grpc_ares_init() failed", error);
568  return;
569  }
570  grpc_core::SetDNSResolver(grpc_core::AresDNSResolver::GetOrCreate());
571  }
572 }
573 
575  if (grpc_core::UseAresDnsResolver()) {
578  }
579 }
580 
581 #else /* GRPC_ARES == 1 */
582 
583 namespace grpc_core {
585 } // namespace grpc_core
586 
588 
590 
591 #endif /* GRPC_ARES == 1 */
GRPC_CLOSURE_INIT
#define GRPC_CLOSURE_INIT(closure, cb, cb_arg, scheduler)
Definition: closure.h:115
trace.h
GRPC_ARG_SERVICE_CONFIG_DISABLE_RESOLUTION
#define GRPC_ARG_SERVICE_CONFIG_DISABLE_RESOLUTION
Definition: grpc_types.h:306
_gevent_test_main.result
result
Definition: _gevent_test_main.py:96
global_config_generic.h
grpc_trace_cares_resolver
grpc_core::TraceFlag grpc_trace_cares_resolver
address_sorting.h
grpc_core::kDefaultSecurePort
const char * kDefaultSecurePort
Definition: resolve_address.cc:28
regen-readme.it
it
Definition: regen-readme.py:15
orphanable.h
GRPC_ERROR_NONE
#define GRPC_ERROR_NONE
Definition: error.h:234
log.h
core_configuration.h
backoff.h
MutexLock
#define MutexLock(x)
Definition: bloaty/third_party/re2/util/mutex.h:125
absl::StrCat
std::string StrCat(const AlphaNum &a, const AlphaNum &b)
Definition: abseil-cpp/absl/strings/str_cat.cc:98
GRPC_DNS_ARES_DEFAULT_QUERY_TIMEOUT_MS
#define GRPC_DNS_ARES_DEFAULT_QUERY_TIMEOUT_MS
Definition: grpc_ares_wrapper.h:41
GPR_GLOBAL_CONFIG_GET
#define GPR_GLOBAL_CONFIG_GET(name)
Definition: global_config_generic.h:24
false
#define false
Definition: setup_once.h:323
grpc_ares_cleanup
void grpc_ares_cleanup(void)
grpc_core
Definition: call_metric_recorder.h:31
event_engine.h
grpc_core::CoreConfiguration::Builder
Definition: core_configuration.h:41
grpc_pollset_set
struct grpc_pollset_set grpc_pollset_set
Definition: iomgr_fwd.h:23
string.h
benchmark.request
request
Definition: benchmark.py:77
absl::string_view
Definition: abseil-cpp/absl/strings/string_view.h:167
grpc_pollset_set_create
grpc_pollset_set * grpc_pollset_set_create()
Definition: pollset_set.cc:29
address_sorting_shutdown
void address_sorting_shutdown()
Definition: address_sorting.c:369
gpr_free
GPRAPI void gpr_free(void *ptr)
Definition: alloc.cc:51
GRPC_DNS_RECONNECT_JITTER
#define GRPC_DNS_RECONNECT_JITTER
Definition: dns_resolver.cc:62
resolve_address.h
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
error
grpc_error_handle error
Definition: retry_filter.cc:499
GRPC_CARES_TRACE_LOG
#define GRPC_CARES_TRACE_LOG(format,...)
Definition: grpc_ares_wrapper.h:47
addresses_
absl::StatusOr< HierarchicalAddressMap > addresses_
Definition: priority.cc:287
closure.h
ABSL_GUARDED_BY
#define ABSL_GUARDED_BY(x)
Definition: abseil-cpp/absl/base/thread_annotations.h:62
instance
RefCountedPtr< grpc_tls_certificate_provider > instance
Definition: xds_server_config_fetcher.cc:224
status
absl::Status status
Definition: rls.cc:251
setup.name
name
Definition: setup.py:542
GRPC_LOG_IF_ERROR
#define GRPC_LOG_IF_ERROR(what, error)
Definition: error.h:398
absl::StripPrefix
ABSL_MUST_USE_RESULT absl::string_view StripPrefix(absl::string_view str, absl::string_view prefix)
Definition: abseil-cpp/absl/strings/strip.h:73
resolved_address.h
name_
const std::string name_
Definition: priority.cc:233
GRPC_DNS_INITIAL_CONNECT_BACKOFF_SECONDS
#define GRPC_DNS_INITIAL_CONNECT_BACKOFF_SECONDS
Definition: dns_resolver.cc:59
grpc_pollset_set_del_pollset_set
void grpc_pollset_set_del_pollset_set(grpc_pollset_set *bag, grpc_pollset_set *item)
Definition: pollset_set.cc:52
GRPC_ERROR_STR_DESCRIPTION
@ GRPC_ERROR_STR_DESCRIPTION
top-level textual description of this error
Definition: error.h:106
grpc_channel_args_find_bool
bool grpc_channel_args_find_bool(const grpc_channel_args *args, const char *name, bool default_value)
Definition: channel_args.cc:465
grpc_channel_args
Definition: grpc_types.h:132
server_address
std::string server_address("0.0.0.0:10000")
grpc_resolver_dns_ares_init
void grpc_resolver_dns_ares_init()
Definition: dns_resolver_ares.cc:587
grpc_core::CreateGrpclbBalancerAddressesArg
grpc_arg CreateGrpclbBalancerAddressesArg(const ServerAddressList *address_list)
Definition: grpclb_balancer_addresses.cc:66
mu_
Mutex mu_
Definition: oob_backend_metric.cc:115
GRPC_ERROR_CREATE_FROM_VECTOR
#define GRPC_ERROR_CREATE_FROM_VECTOR(desc, error_list)
Definition: error.h:314
grpc_types.h
memory.h
gethostname.h
GRPC_ARG_DNS_ARES_QUERY_TIMEOUT_MS
#define GRPC_ARG_DNS_ARES_QUERY_TIMEOUT_MS
Definition: grpc_types.h:440
resolver_factory.h
DEBUG_LOCATION
#define DEBUG_LOCATION
Definition: debug_location.h:41
absl::Milliseconds
constexpr Duration Milliseconds(T n)
Definition: third_party/abseil-cpp/absl/time/time.h:415
profile_analyzer.builder
builder
Definition: profile_analyzer.py:159
asyncio_get_stats.args
args
Definition: asyncio_get_stats.py:40
absl::move
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
Definition: abseil-cpp/absl/utility/utility.h:221
grpc_gethostname
char * grpc_gethostname()
array
Definition: undname.c:101
re2::Result
TestInstance::Result Result
Definition: bloaty/third_party/re2/re2/testing/tester.cc:96
gen_stats_data.c_str
def c_str(s, encoding='ascii')
Definition: gen_stats_data.py:38
Json
JSON (JavaScript Object Notation).
Definition: third_party/bloaty/third_party/protobuf/conformance/third_party/jsoncpp/json.h:227
grpc_ares_wrapper.h
gpr_log
GPRAPI void gpr_log(const char *file, int line, gpr_log_severity severity, const char *format,...) GPR_PRINT_FORMAT_CHECK(4
grpc_pollset_set_destroy
void grpc_pollset_set_destroy(grpc_pollset_set *pollset_set)
Definition: pollset_set.cc:33
absl::flat_hash_set
Definition: abseil-cpp/absl/container/flat_hash_set.h:105
absl::InlinedVector::push_back
void push_back(const_reference v)
Definition: abseil-cpp/absl/container/inlined_vector.h:682
pollset_set.h
arg
Definition: cmdline.cc:40
server_address.h
time.h
address_sorting_init
void address_sorting_init()
Definition: address_sorting.c:361
absl::InlinedVector::data
pointer data() noexcept
Definition: abseil-cpp/absl/container/inlined_vector.h:302
intptr_t
_W64 signed int intptr_t
Definition: stdint-msvc2008.h:118
gpr_stricmp
int gpr_stricmp(const char *a, const char *b)
Definition: string.cc:282
absl::flags_internal::Parse
bool Parse(FlagOpFn op, absl::string_view text, void *dst, std::string *error)
Definition: abseil-cpp/absl/flags/internal/flag.h:125
error.h
absl::InlinedVector::size
size_type size() const noexcept
Definition: abseil-cpp/absl/container/inlined_vector.h:270
json.h
GPR_ERROR
#define GPR_ERROR
Definition: include/grpc/impl/codegen/log.h:57
GRPC_DNS_RECONNECT_BACKOFF_MULTIPLIER
#define GRPC_DNS_RECONNECT_BACKOFF_MULTIPLIER
Definition: dns_resolver.cc:60
grpc_resolver_dns_ares_shutdown
void grpc_resolver_dns_ares_shutdown()
Definition: dns_resolver_ares.cc:589
grpc_core::ServerAddressList
std::vector< ServerAddress > ServerAddressList
Definition: server_address.h:120
stdint.h
resolver_registry.h
grpclb_balancer_addresses.h
GRPC_ERROR_CREATE_FROM_STATIC_STRING
#define GRPC_ERROR_CREATE_FROM_STATIC_STRING(desc)
Definition: error.h:291
resolver.h
GRPC_ARG_DNS_ENABLE_SRV_QUERIES
#define GRPC_ARG_DNS_ENABLE_SRV_QUERIES
Definition: grpc_types.h:433
request_
EchoRequest request_
Definition: client_callback_end2end_test.cc:724
value
const char * value
Definition: hpack_parser_table.cc:165
GRPC_DNS_RECONNECT_MAX_BACKOFF_SECONDS
#define GRPC_DNS_RECONNECT_MAX_BACKOFF_SECONDS
Definition: dns_resolver.cc:61
debug_location.h
polling_resolver.h
grpc_core::GetDNSResolver
DNSResolver * GetDNSResolver()
Definition: resolve_address.cc:38
grpc_error_std_string
std::string grpc_error_std_string(grpc_error_handle error)
Definition: error.cc:944
percentage
double percentage
Definition: libuv/docs/code/progress/main.c:10
absl::Status
Definition: third_party/abseil-cpp/absl/status/status.h:424
GRPC_ARG_DNS_MIN_TIME_BETWEEN_RESOLUTIONS_MS
#define GRPC_ARG_DNS_MIN_TIME_BETWEEN_RESOLUTIONS_MS
Definition: grpc_types.h:266
alloc.h
google::protobuf.internal::Mutex
WrappedMutex Mutex
Definition: bloaty/third_party/protobuf/src/google/protobuf/stubs/mutex.h:113
dns_resolver_selection.h
std
Definition: grpcpp/impl/codegen/async_unary_call.h:407
grpc_core::RegisterAresDnsResolver
void RegisterAresDnsResolver(CoreConfiguration::Builder *)
Definition: dns_resolver_ares.cc:584
grpc_pollset_set_add_pollset_set
void grpc_pollset_set_add_pollset_set(grpc_pollset_set *bag, grpc_pollset_set *item)
Definition: pollset_set.cc:47
service_config_impl.h
arg
struct arg arg
grpc_core::SetDNSResolver
void SetDNSResolver(DNSResolver *resolver)
Definition: resolve_address.cc:36
handle_containers.h
grpc_dns_lookup_ares
grpc_ares_request *(* grpc_dns_lookup_ares)(const char *dns_server, const char *name, const char *default_port, grpc_pollset_set *interested_parties, grpc_closure *on_done, std::unique_ptr< grpc_core::ServerAddressList > *addresses, std::unique_ptr< grpc_core::ServerAddressList > *balancer_addresses, char **service_config_json, int query_timeout_ms)
resolver_
OrphanablePtr< Resolver > resolver_
Definition: xds_cluster_resolver.cc:291
absl::UnavailableError
Status UnavailableError(absl::string_view message)
Definition: third_party/abseil-cpp/absl/status/status.cc:375
GRPC_ERROR_UNREF
#define GRPC_ERROR_UNREF(err)
Definition: error.h:262
ref_counted_ptr.h
Builder
struct Builder Builder
Definition: bloaty/third_party/protobuf/ruby/ext/google/protobuf_c/protobuf.h:68
channel_args.h
service_config.h
handle
static csh handle
Definition: test_arm_regression.c:16
GPR_DEBUG
#define GPR_DEBUG
Definition: include/grpc/impl/codegen/log.h:55
absl::string_view::empty
constexpr bool empty() const noexcept
Definition: abseil-cpp/absl/strings/string_view.h:292
Duration
Definition: bloaty/third_party/protobuf/src/google/protobuf/duration.pb.h:69
grpc_ares_init
grpc_error_handle grpc_ares_init(void)
absl::StatusOr
Definition: abseil-cpp/absl/status/statusor.h:187
grpc_error_get_str
bool grpc_error_get_str(grpc_error_handle err, grpc_error_strs which, std::string *s)
Returns false if the specified string is not set.
Definition: error.cc:659
uri_parser.h
iomgr_fwd.h
absl::InlinedVector
Definition: abseil-cpp/absl/container/inlined_vector.h:69
grpc_error
Definition: error_internal.h:42
function
std::function< bool(GrpcTool *, int, const char **, const CliCredentials &, GrpcToolOutputCallback)> function
Definition: grpc_tool.cc:250
grpc_error_to_absl_status
absl::Status grpc_error_to_absl_status(grpc_error_handle error)
Definition: error_utils.cc:156
grpc_channel_args_find_integer
int grpc_channel_args_find_integer(const grpc_channel_args *args, const char *name, const grpc_integer_options options)
Definition: channel_args.cc:425
testing::Ref
internal::RefMatcher< T & > Ref(T &x)
Definition: cares/cares/test/gmock-1.8.0/gmock/gmock.h:8628
grpc_closure
Definition: closure.h:56
grpc_cancel_ares_request
void(* grpc_cancel_ares_request)(grpc_ares_request *request)
sync.h
grpc_channel_args_copy_and_add
grpc_channel_args * grpc_channel_args_copy_and_add(const grpc_channel_args *src, const grpc_arg *to_add, size_t num_to_add)
Definition: channel_args.cc:224
interested_parties_
grpc_pollset_set * interested_parties_
Definition: oob_backend_metric.cc:169
error_utils.h
GRPC_ERROR_IS_NONE
#define GRPC_ERROR_IS_NONE(err)
Definition: error.h:241
port_platform.h


grpc
Author(s):
autogenerated on Fri May 16 2025 02:58:17