|
|
|
@ -29,8 +29,6 @@ |
|
|
|
|
#include <utility> |
|
|
|
|
|
|
|
|
|
#include "absl/status/statusor.h" |
|
|
|
|
#include "absl/time/clock.h" |
|
|
|
|
#include "absl/time/time.h" |
|
|
|
|
|
|
|
|
|
#include <grpc/slice.h> |
|
|
|
|
#include <grpc/status.h> |
|
|
|
@ -52,7 +50,6 @@ |
|
|
|
|
#include "src/core/lib/config/core_configuration.h" |
|
|
|
|
#include "src/core/lib/debug/stats.h" |
|
|
|
|
#include "src/core/lib/debug/trace.h" |
|
|
|
|
#include "src/core/lib/event_engine/event_engine_factory.h" |
|
|
|
|
#include "src/core/lib/gpr/alloc.h" |
|
|
|
|
#include "src/core/lib/gprpp/debug_location.h" |
|
|
|
|
#include "src/core/lib/gprpp/ref_counted_ptr.h" |
|
|
|
@ -85,7 +82,6 @@ |
|
|
|
|
GPR_ROUND_UP_TO_ALIGNMENT_SIZE(sizeof(SubchannelCall))) |
|
|
|
|
|
|
|
|
|
namespace grpc_core { |
|
|
|
|
using ::grpc_event_engine::experimental::GetDefaultEventEngine; |
|
|
|
|
|
|
|
|
|
TraceFlag grpc_trace_subchannel(false, "subchannel"); |
|
|
|
|
DebugOnlyTraceFlag grpc_trace_subchannel_refcount(false, "subchannel_refcount"); |
|
|
|
@ -652,6 +648,7 @@ Subchannel::Subchannel(SubchannelKey key, |
|
|
|
|
GRPC_STATS_INC_CLIENT_SUBCHANNELS_CREATED(); |
|
|
|
|
GRPC_CLOSURE_INIT(&on_connecting_finished_, OnConnectingFinished, this, |
|
|
|
|
grpc_schedule_on_exec_ctx); |
|
|
|
|
GRPC_CLOSURE_INIT(&on_retry_timer_, OnRetryTimer, this, nullptr); |
|
|
|
|
// Check proxy mapper to determine address to connect to and channel
|
|
|
|
|
// args to use.
|
|
|
|
|
address_for_connect_ = key_.address(); |
|
|
|
@ -788,15 +785,10 @@ void Subchannel::RequestConnection() { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void Subchannel::ResetBackoff() { |
|
|
|
|
// Hold a ref to ensure cancellation and subsequent deletion of the closure
|
|
|
|
|
// does not eliminate the last ref and destroy the Subchannel before the
|
|
|
|
|
// method returns.
|
|
|
|
|
auto self = WeakRef(DEBUG_LOCATION, "ResetBackoff"); |
|
|
|
|
MutexLock lock(&mu_); |
|
|
|
|
backoff_.Reset(); |
|
|
|
|
if (state_ == GRPC_CHANNEL_TRANSIENT_FAILURE && |
|
|
|
|
GetDefaultEventEngine()->Cancel(retry_timer_handle_)) { |
|
|
|
|
OnRetryTimerLocked(); |
|
|
|
|
if (state_ == GRPC_CHANNEL_TRANSIENT_FAILURE) { |
|
|
|
|
grpc_timer_cancel(&retry_timer_); |
|
|
|
|
} else if (state_ == GRPC_CHANNEL_CONNECTING) { |
|
|
|
|
next_attempt_time_ = ExecCtx::Get()->Now(); |
|
|
|
|
} |
|
|
|
@ -881,9 +873,13 @@ void Subchannel::SetConnectivityStateLocked(grpc_connectivity_state state, |
|
|
|
|
health_watcher_map_.NotifyLocked(state, status); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void Subchannel::OnRetryTimer() { |
|
|
|
|
MutexLock lock(&mu_); |
|
|
|
|
OnRetryTimerLocked(); |
|
|
|
|
void Subchannel::OnRetryTimer(void* arg, grpc_error_handle /*error*/) { |
|
|
|
|
WeakRefCountedPtr<Subchannel> c(static_cast<Subchannel*>(arg)); |
|
|
|
|
{ |
|
|
|
|
MutexLock lock(&c->mu_); |
|
|
|
|
c->OnRetryTimerLocked(); |
|
|
|
|
} |
|
|
|
|
c.reset(DEBUG_LOCATION, "RetryTimer"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void Subchannel::OnRetryTimerLocked() { |
|
|
|
@ -943,8 +939,6 @@ void Subchannel::OnConnectingFinishedLocked(grpc_error_handle error) { |
|
|
|
|
if (connecting_result_.transport == nullptr || !PublishTransportLocked()) { |
|
|
|
|
const Duration time_until_next_attempt = |
|
|
|
|
next_attempt_time_ - ExecCtx::Get()->Now(); |
|
|
|
|
auto ee_deadline = |
|
|
|
|
absl::Now() + absl::Milliseconds(time_until_next_attempt.millis()); |
|
|
|
|
gpr_log(GPR_INFO, |
|
|
|
|
"subchannel %p %s: connect failed (%s), backing off for %" PRId64 |
|
|
|
|
" ms", |
|
|
|
@ -952,12 +946,8 @@ void Subchannel::OnConnectingFinishedLocked(grpc_error_handle error) { |
|
|
|
|
time_until_next_attempt.millis()); |
|
|
|
|
SetConnectivityStateLocked(GRPC_CHANNEL_TRANSIENT_FAILURE, |
|
|
|
|
grpc_error_to_absl_status(error)); |
|
|
|
|
retry_timer_handle_ = GetDefaultEventEngine()->RunAt( |
|
|
|
|
ee_deadline, [self = WeakRef(DEBUG_LOCATION, "RetryTimer")] { |
|
|
|
|
ApplicationCallbackExecCtx callback_exec_ctx; |
|
|
|
|
ExecCtx exec_ctx; |
|
|
|
|
self->OnRetryTimer(); |
|
|
|
|
}); |
|
|
|
|
WeakRef(DEBUG_LOCATION, "RetryTimer").release(); // Ref held by callback.
|
|
|
|
|
grpc_timer_init(&retry_timer_, next_attempt_time_, &on_retry_timer_); |
|
|
|
|
} |
|
|
|
|
(void)GRPC_ERROR_UNREF(error); |
|
|
|
|
} |
|
|
|
|