dns_resolver.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 <limits.h>
20 
21 #include <algorithm>
22 #include <memory>
23 #include <string>
24 #include <utility>
25 #include <vector>
26 
27 #include "absl/functional/bind_front.h"
28 #include "absl/memory/memory.h"
29 #include "absl/status/status.h"
30 #include "absl/status/statusor.h"
31 #include "absl/strings/str_cat.h"
32 #include "absl/strings/string_view.h"
33 #include "absl/strings/strip.h"
34 
36 #include <grpc/support/log.h>
37 
58 
59 #define GRPC_DNS_INITIAL_CONNECT_BACKOFF_SECONDS 1
60 #define GRPC_DNS_RECONNECT_BACKOFF_MULTIPLIER 1.6
61 #define GRPC_DNS_RECONNECT_MAX_BACKOFF_SECONDS 120
62 #define GRPC_DNS_RECONNECT_JITTER 0.2
63 
64 namespace grpc_core {
65 
66 namespace {
67 
68 TraceFlag grpc_trace_dns_resolver(false, "dns_resolver");
69 
70 class NativeClientChannelDNSResolver : public PollingResolver {
71  public:
72  NativeClientChannelDNSResolver(ResolverArgs args,
73  const grpc_channel_args* channel_args);
74  ~NativeClientChannelDNSResolver() override;
75 
76  OrphanablePtr<Orphanable> StartRequest() override;
77 
78  private:
79  // No-op request class, used so that the PollingResolver code knows
80  // when there is a request in flight, even if the request is not
81  // actually cancellable.
82  class Request : public Orphanable {
83  public:
84  Request() = default;
85 
86  void Orphan() override {}
87  };
88 
89  void OnResolved(
90  absl::StatusOr<std::vector<grpc_resolved_address>> addresses_or);
91 };
92 
93 NativeClientChannelDNSResolver::NativeClientChannelDNSResolver(
94  ResolverArgs args, const grpc_channel_args* channel_args)
95  : PollingResolver(
96  std::move(args), channel_args,
99  {1000 * 30, 0, INT_MAX})),
100  BackOff::Options()
101  .set_initial_backoff(Duration::Milliseconds(
104  .set_jitter(GRPC_DNS_RECONNECT_JITTER)
105  .set_max_backoff(Duration::Milliseconds(
107  &grpc_trace_dns_resolver) {
108  if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_dns_resolver)) {
109  gpr_log(GPR_DEBUG, "[dns_resolver=%p] created", this);
110  }
111 }
112 
113 NativeClientChannelDNSResolver::~NativeClientChannelDNSResolver() {
114  if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_dns_resolver)) {
115  gpr_log(GPR_DEBUG, "[dns_resolver=%p] destroyed", this);
116  }
117 }
118 
119 OrphanablePtr<Orphanable> NativeClientChannelDNSResolver::StartRequest() {
120  Ref(DEBUG_LOCATION, "dns_request").release();
121  auto dns_request_handle = GetDNSResolver()->ResolveName(
122  name_to_resolve(), kDefaultSecurePort, interested_parties(),
123  absl::bind_front(&NativeClientChannelDNSResolver::OnResolved, this));
124  if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_dns_resolver)) {
125  gpr_log(GPR_DEBUG, "[dns_resolver=%p] starting request=%p", this,
126  DNSResolver::HandleToString(dns_request_handle).c_str());
127  }
128  return MakeOrphanable<Request>();
129 }
130 
131 void NativeClientChannelDNSResolver::OnResolved(
132  absl::StatusOr<std::vector<grpc_resolved_address>> addresses_or) {
133  if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_dns_resolver)) {
134  gpr_log(GPR_DEBUG, "[dns_resolver=%p] request complete, status=\"%s\"",
135  this, addresses_or.status().ToString().c_str());
136  }
137  // Convert result from iomgr DNS API into Resolver::Result.
138  Result result;
139  if (addresses_or.ok()) {
140  ServerAddressList addresses;
141  for (auto& addr : *addresses_or) {
142  addresses.emplace_back(addr, nullptr /* args */);
143  }
144  result.addresses = std::move(addresses);
145  } else {
146  result.addresses = absl::UnavailableError(
147  absl::StrCat("DNS resolution failed for ", name_to_resolve(), ": ",
148  addresses_or.status().ToString()));
149  }
150  result.args = grpc_channel_args_copy(channel_args());
151  OnRequestComplete(std::move(result));
152  Unref(DEBUG_LOCATION, "dns_request");
153 }
154 
155 //
156 // Factory
157 //
158 
159 class NativeClientChannelDNSResolverFactory : public ResolverFactory {
160  public:
161  absl::string_view scheme() const override { return "dns"; }
162 
163  bool IsValidUri(const URI& uri) const override {
164  if (GPR_UNLIKELY(!uri.authority().empty())) {
165  gpr_log(GPR_ERROR, "authority based dns uri's not supported");
166  return false;
167  }
168  if (absl::StripPrefix(uri.path(), "/").empty()) {
169  gpr_log(GPR_ERROR, "no server name supplied in dns URI");
170  return false;
171  }
172  return true;
173  }
174 
175  OrphanablePtr<Resolver> CreateResolver(ResolverArgs args) const override {
176  if (!IsValidUri(args.uri)) return nullptr;
177  const grpc_channel_args* channel_args = args.args;
178  return MakeOrphanable<NativeClientChannelDNSResolver>(std::move(args),
179  channel_args);
180  }
181 };
182 
183 } // namespace
184 
186  static const char* const resolver =
187  GPR_GLOBAL_CONFIG_GET(grpc_dns_resolver).release();
188  if (gpr_stricmp(resolver, "native") == 0) {
189  gpr_log(GPR_DEBUG, "Using native dns resolver");
190  builder->resolver_registry()->RegisterResolverFactory(
191  absl::make_unique<NativeClientChannelDNSResolverFactory>());
192  } else {
193  if (!builder->resolver_registry()->HasResolverFactory("dns")) {
194  gpr_log(GPR_DEBUG, "Using native dns resolver");
195  builder->resolver_registry()->RegisterResolverFactory(
196  absl::make_unique<NativeClientChannelDNSResolverFactory>());
197  }
198  }
199 }
200 
201 } // namespace grpc_core
trace.h
_gevent_test_main.result
result
Definition: _gevent_test_main.py:96
global_config_generic.h
grpc_core::kDefaultSecurePort
const char * kDefaultSecurePort
Definition: resolve_address.cc:28
orphanable.h
log.h
core_configuration.h
backoff.h
absl::StrCat
std::string StrCat(const AlphaNum &a, const AlphaNum &b)
Definition: abseil-cpp/absl/strings/str_cat.cc:98
absl::bind_front
constexpr ABSL_NAMESPACE_BEGIN functional_internal::bind_front_t< F, BoundArgs... > bind_front(F &&func, BoundArgs &&... args)
Definition: abseil-cpp/absl/functional/bind_front.h:182
GPR_GLOBAL_CONFIG_GET
#define GPR_GLOBAL_CONFIG_GET(name)
Definition: global_config_generic.h:24
grpc_core
Definition: call_metric_recorder.h:31
grpc_core::CoreConfiguration::Builder
Definition: core_configuration.h:41
string.h
absl::string_view
Definition: abseil-cpp/absl/strings/string_view.h:167
GRPC_DNS_RECONNECT_JITTER
#define GRPC_DNS_RECONNECT_JITTER
Definition: dns_resolver.cc:62
resolve_address.h
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
GRPC_DNS_INITIAL_CONNECT_BACKOFF_SECONDS
#define GRPC_DNS_INITIAL_CONNECT_BACKOFF_SECONDS
Definition: dns_resolver.cc:59
grpc_channel_args
Definition: grpc_types.h:132
GRPC_TRACE_FLAG_ENABLED
#define GRPC_TRACE_FLAG_ENABLED(f)
Definition: debug/trace.h:114
grpc_types.h
memory.h
resolver_factory.h
DEBUG_LOCATION
#define DEBUG_LOCATION
Definition: debug_location.h:41
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
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
gpr_log
GPRAPI void gpr_log(const char *file, int line, gpr_log_severity severity, const char *format,...) GPR_PRINT_FORMAT_CHECK(4
GPR_UNLIKELY
#define GPR_UNLIKELY(x)
Definition: impl/codegen/port_platform.h:770
server_address.h
time.h
grpc_channel_args_copy
grpc_channel_args * grpc_channel_args_copy(const grpc_channel_args *src)
Definition: channel_args.cc:285
gpr_stricmp
int gpr_stricmp(const char *a, const char *b)
Definition: string.cc:282
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_core::ServerAddressList
std::vector< ServerAddress > ServerAddressList
Definition: server_address.h:120
resolver_registry.h
resolver.h
grpc_core::Duration::Milliseconds
static constexpr Duration Milliseconds(int64_t millis)
Definition: src/core/lib/gprpp/time.h:155
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_ARG_DNS_MIN_TIME_BETWEEN_RESOLUTIONS_MS
#define GRPC_ARG_DNS_MIN_TIME_BETWEEN_RESOLUTIONS_MS
Definition: grpc_types.h:266
dns_resolver_selection.h
grpc_core::DNSResolver::ResolveName
virtual TaskHandle ResolveName(absl::string_view name, absl::string_view default_port, grpc_pollset_set *interested_parties, std::function< void(absl::StatusOr< std::vector< grpc_resolved_address >>)> on_done)=0
absl::UnavailableError
Status UnavailableError(absl::string_view message)
Definition: third_party/abseil-cpp/absl/status/status.cc:375
ref_counted_ptr.h
grpc_core::DNSResolver::HandleToString
static std::string HandleToString(TaskHandle handle)
Definition: resolve_address.cc:40
channel_args.h
GPR_DEBUG
#define GPR_DEBUG
Definition: include/grpc/impl/codegen/log.h:55
demo_pb2.Request
Request
Definition: demo_pb2.py:108
absl::string_view::empty
constexpr bool empty() const noexcept
Definition: abseil-cpp/absl/strings/string_view.h:292
grpc_core::RegisterNativeDnsResolver
void RegisterNativeDnsResolver(CoreConfiguration::Builder *builder)
Definition: dns_resolver.cc:185
absl::StatusOr
Definition: abseil-cpp/absl/status/statusor.h:187
uri_parser.h
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
addr
struct sockaddr_in addr
Definition: libuv/docs/code/tcp-echo-server/main.c:10
port_platform.h


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