summaryrefslogtreecommitdiff
path: root/grpc/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc
diff options
context:
space:
mode:
Diffstat (limited to 'grpc/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc')
-rw-r--r--grpc/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc56
1 files changed, 33 insertions, 23 deletions
diff --git a/grpc/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc b/grpc/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc
index 3e072aa3..3265e29c 100644
--- a/grpc/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc
+++ b/grpc/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc
@@ -68,15 +68,17 @@ class NativeDnsResolver : public Resolver {
void MaybeStartResolvingLocked();
void StartResolvingLocked();
- static void OnNextResolution(void* arg, grpc_error* error);
- void OnNextResolutionLocked(grpc_error* error);
- static void OnResolved(void* arg, grpc_error* error);
- void OnResolvedLocked(grpc_error* error);
+ static void OnNextResolution(void* arg, grpc_error_handle error);
+ void OnNextResolutionLocked(grpc_error_handle error);
+ static void OnResolved(void* arg, grpc_error_handle error);
+ void OnResolvedLocked(grpc_error_handle error);
/// name to resolve
std::string name_to_resolve_;
/// channel args
grpc_channel_args* channel_args_ = nullptr;
+ std::shared_ptr<WorkSerializer> work_serializer_;
+ std::unique_ptr<ResultHandler> result_handler_;
/// pollset_set to drive the name resolution process
grpc_pollset_set* interested_parties_ = nullptr;
/// are we shutting down?
@@ -99,7 +101,14 @@ class NativeDnsResolver : public Resolver {
};
NativeDnsResolver::NativeDnsResolver(ResolverArgs args)
- : Resolver(std::move(args.work_serializer), std::move(args.result_handler)),
+ : name_to_resolve_(absl::StripPrefix(args.uri.path(), "/")),
+ channel_args_(grpc_channel_args_copy(args.args)),
+ work_serializer_(std::move(args.work_serializer)),
+ result_handler_(std::move(args.result_handler)),
+ interested_parties_(grpc_pollset_set_create()),
+ min_time_between_resolutions_(grpc_channel_args_find_integer(
+ channel_args_, GRPC_ARG_DNS_MIN_TIME_BETWEEN_RESOLUTIONS_MS,
+ {1000 * 30, 0, INT_MAX})),
backoff_(
BackOff::Options()
.set_initial_backoff(GRPC_DNS_INITIAL_CONNECT_BACKOFF_SECONDS *
@@ -107,13 +116,6 @@ NativeDnsResolver::NativeDnsResolver(ResolverArgs args)
.set_multiplier(GRPC_DNS_RECONNECT_BACKOFF_MULTIPLIER)
.set_jitter(GRPC_DNS_RECONNECT_JITTER)
.set_max_backoff(GRPC_DNS_RECONNECT_MAX_BACKOFF_SECONDS * 1000)) {
- name_to_resolve_ = std::string(absl::StripPrefix(args.uri.path(), "/"));
- channel_args_ = grpc_channel_args_copy(args.args);
- const grpc_arg* arg = grpc_channel_args_find(
- args.args, GRPC_ARG_DNS_MIN_TIME_BETWEEN_RESOLUTIONS_MS);
- min_time_between_resolutions_ =
- grpc_channel_arg_get_integer(arg, {1000 * 30, 0, INT_MAX});
- interested_parties_ = grpc_pollset_set_create();
if (args.pollset_set != nullptr) {
grpc_pollset_set_add_pollset_set(interested_parties_, args.pollset_set);
}
@@ -146,14 +148,14 @@ void NativeDnsResolver::ShutdownLocked() {
}
}
-void NativeDnsResolver::OnNextResolution(void* arg, grpc_error* error) {
+void NativeDnsResolver::OnNextResolution(void* arg, grpc_error_handle error) {
NativeDnsResolver* r = static_cast<NativeDnsResolver*>(arg);
GRPC_ERROR_REF(error); // ref owned by lambda
- r->work_serializer()->Run([r, error]() { r->OnNextResolutionLocked(error); },
- DEBUG_LOCATION);
+ r->work_serializer_->Run([r, error]() { r->OnNextResolutionLocked(error); },
+ DEBUG_LOCATION);
}
-void NativeDnsResolver::OnNextResolutionLocked(grpc_error* error) {
+void NativeDnsResolver::OnNextResolutionLocked(grpc_error_handle error) {
have_next_resolution_timer_ = false;
if (error == GRPC_ERROR_NONE && !resolving_) {
StartResolvingLocked();
@@ -162,14 +164,14 @@ void NativeDnsResolver::OnNextResolutionLocked(grpc_error* error) {
GRPC_ERROR_UNREF(error);
}
-void NativeDnsResolver::OnResolved(void* arg, grpc_error* error) {
+void NativeDnsResolver::OnResolved(void* arg, grpc_error_handle error) {
NativeDnsResolver* r = static_cast<NativeDnsResolver*>(arg);
GRPC_ERROR_REF(error); // owned by lambda
- r->work_serializer()->Run([r, error]() { r->OnResolvedLocked(error); },
- DEBUG_LOCATION);
+ r->work_serializer_->Run([r, error]() { r->OnResolvedLocked(error); },
+ DEBUG_LOCATION);
}
-void NativeDnsResolver::OnResolvedLocked(grpc_error* error) {
+void NativeDnsResolver::OnResolvedLocked(grpc_error_handle error) {
GPR_ASSERT(resolving_);
resolving_ = false;
if (shutdown_) {
@@ -186,21 +188,25 @@ void NativeDnsResolver::OnResolvedLocked(grpc_error* error) {
}
grpc_resolved_addresses_destroy(addresses_);
result.args = grpc_channel_args_copy(channel_args_);
- result_handler()->ReturnResult(std::move(result));
+ result_handler_->ReturnResult(std::move(result));
// Reset backoff state so that we start from the beginning when the
// next request gets triggered.
backoff_.Reset();
} else {
gpr_log(GPR_INFO, "dns resolution failed (will retry): %s",
- grpc_error_string(error));
+ grpc_error_std_string(error).c_str());
// Return transient error.
std::string error_message =
absl::StrCat("DNS resolution failed for service: ", name_to_resolve_);
- result_handler()->ReturnError(grpc_error_set_int(
+ result_handler_->ReturnError(grpc_error_set_int(
GRPC_ERROR_CREATE_REFERENCING_FROM_COPIED_STRING(error_message.c_str(),
&error, 1),
GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE));
// Set up for retry.
+ // InvalidateNow to avoid getting stuck re-initializing this timer
+ // in a loop while draining the currently-held WorkSerializer.
+ // Also see https://github.com/grpc/grpc/issues/26079.
+ ExecCtx::Get()->InvalidateNow();
grpc_millis next_try = backoff_.NextAttemptTime();
grpc_millis timeout = next_try - ExecCtx::Get()->Now();
GPR_ASSERT(!have_next_resolution_timer_);
@@ -227,6 +233,10 @@ void NativeDnsResolver::MaybeStartResolvingLocked() {
// can start the next resolution.
if (have_next_resolution_timer_) return;
if (last_resolution_timestamp_ >= 0) {
+ // InvalidateNow to avoid getting stuck re-initializing this timer
+ // in a loop while draining the currently-held WorkSerializer.
+ // Also see https://github.com/grpc/grpc/issues/26079.
+ ExecCtx::Get()->InvalidateNow();
const grpc_millis earliest_next_resolution =
last_resolution_timestamp_ + min_time_between_resolutions_;
const grpc_millis ms_until_next_resolution =