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"
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
68 TraceFlag grpc_trace_dns_resolver(
false,
"dns_resolver");
70 class NativeClientChannelDNSResolver :
public PollingResolver {
72 NativeClientChannelDNSResolver(ResolverArgs
args,
74 ~NativeClientChannelDNSResolver()
override;
76 OrphanablePtr<Orphanable> StartRequest()
override;
82 class Request :
public Orphanable {
86 void Orphan()
override {}
93 NativeClientChannelDNSResolver::NativeClientChannelDNSResolver(
99 {1000 * 30, 0, INT_MAX})),
107 &grpc_trace_dns_resolver) {
113 NativeClientChannelDNSResolver::~NativeClientChannelDNSResolver() {
119 OrphanablePtr<Orphanable> NativeClientChannelDNSResolver::StartRequest() {
128 return MakeOrphanable<Request>();
131 void NativeClientChannelDNSResolver::OnResolved(
132 absl::StatusOr<std::vector<grpc_resolved_address>> addresses_or) {
135 this, addresses_or.status().ToString().c_str());
139 if (addresses_or.ok()) {
141 for (
auto&
addr : *addresses_or) {
142 addresses.emplace_back(
addr,
nullptr );
147 absl::StrCat(
"DNS resolution failed for ", name_to_resolve(),
": ",
148 addresses_or.status().ToString()));
159 class NativeClientChannelDNSResolverFactory :
public ResolverFactory {
163 bool IsValidUri(
const URI& uri)
const override {
175 OrphanablePtr<Resolver> CreateResolver(ResolverArgs
args)
const override {
176 if (!IsValidUri(
args.uri))
return nullptr;
178 return MakeOrphanable<NativeClientChannelDNSResolver>(
std::move(
args),
186 static const char*
const resolver =
190 builder->resolver_registry()->RegisterResolverFactory(
191 absl::make_unique<NativeClientChannelDNSResolverFactory>());
193 if (!
builder->resolver_registry()->HasResolverFactory(
"dns")) {
195 builder->resolver_registry()->RegisterResolverFactory(
196 absl::make_unique<NativeClientChannelDNSResolverFactory>());