diff options
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.cc | 56 |
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 = |