|
|
@@ -358,8 +358,7 @@ void SubchannelData<SubchannelListType, SubchannelDataType>::
|
|
|
template <typename SubchannelListType, typename SubchannelDataType>
|
|
|
bool SubchannelData<SubchannelListType, SubchannelDataType>::
|
|
|
UpdateConnectedSubchannelLocked() {
|
|
|
-// FIXME: add trace logging
|
|
|
- // If the subchannel is READY, get a ref to the connected subchannel.
|
|
|
+ // If the subchannel is READY, take a ref to the connected subchannel.
|
|
|
if (pending_connectivity_state_unsafe_ == GRPC_CHANNEL_READY) {
|
|
|
connected_subchannel_ =
|
|
|
grpc_subchannel_get_connected_subchannel(subchannel_);
|
|
|
@@ -375,14 +374,20 @@ bool SubchannelData<SubchannelListType, SubchannelDataType>::
|
|
|
// is READY again (e.g., if the subchannel has transitioned back to
|
|
|
// READY before the next watch gets requested).
|
|
|
if (connected_subchannel_ == nullptr) {
|
|
|
+ if (subchannel_list_->tracer()->enabled()) {
|
|
|
+ gpr_log(GPR_INFO,
|
|
|
+ "[%s %p] subchannel list %p index %" PRIuPTR " of %" PRIuPTR
|
|
|
+ " (subchannel %p): state is READY but connected subchannel is "
|
|
|
+ "null; moving to state IDLE",
|
|
|
+ subchannel_list_->tracer()->name(),
|
|
|
+ subchannel_list_->policy(), subchannel_list_, Index(),
|
|
|
+ subchannel_list_->num_subchannels(), subchannel_);
|
|
|
+ }
|
|
|
pending_connectivity_state_unsafe_ = GRPC_CHANNEL_IDLE;
|
|
|
return false;
|
|
|
}
|
|
|
- }
|
|
|
-// FIXME: do this for any other state?
|
|
|
- // If we get TRANSIENT_FAILURE, unref the connected subchannel.
|
|
|
- else if (pending_connectivity_state_unsafe_ ==
|
|
|
- GRPC_CHANNEL_TRANSIENT_FAILURE) {
|
|
|
+ } else {
|
|
|
+ // For any state other than READY, unref the connected subchannel.
|
|
|
connected_subchannel_.reset();
|
|
|
}
|
|
|
return true;
|
|
|
@@ -392,12 +397,25 @@ template <typename SubchannelListType, typename SubchannelDataType>
|
|
|
void SubchannelData<SubchannelListType, SubchannelDataType>::
|
|
|
OnConnectivityChangedLocked(void* arg, grpc_error* error) {
|
|
|
SubchannelData* sd = static_cast<SubchannelData*>(arg);
|
|
|
-// FIXME: add trace logging
|
|
|
- if (sd->subchannel_list()->shutting_down() || error == GRPC_ERROR_CANCELLED) {
|
|
|
+ if (sd->subchannel_list_->tracer()->enabled()) {
|
|
|
+ gpr_log(GPR_INFO,
|
|
|
+ "[%s %p] subchannel list %p index %" PRIuPTR " of %" PRIuPTR
|
|
|
+ " (subchannel %p): connectivity changed: state=%s, error=%s, "
|
|
|
+ "shutting_down=%d",
|
|
|
+ sd->subchannel_list_->tracer()->name(),
|
|
|
+ sd->subchannel_list_->policy(), sd->subchannel_list_, sd->Index(),
|
|
|
+ sd->subchannel_list_->num_subchannels(), sd->subchannel_,
|
|
|
+ grpc_connectivity_state_name(
|
|
|
+ sd->pending_connectivity_state_unsafe_),
|
|
|
+ grpc_error_string(error), sd->subchannel_list_->shutting_down());
|
|
|
+ }
|
|
|
+ // If shutting down, unref subchannel and stop watching.
|
|
|
+ if (sd->subchannel_list_->shutting_down() || error == GRPC_ERROR_CANCELLED) {
|
|
|
sd->UnrefSubchannelLocked("connectivity_shutdown");
|
|
|
sd->StopConnectivityWatchLocked();
|
|
|
return;
|
|
|
}
|
|
|
+ // Get or release ref to connected subchannel.
|
|
|
if (!sd->UpdateConnectedSubchannelLocked()) {
|
|
|
// We don't want to report this connectivity state, so renew the watch.
|
|
|
sd->StartOrRenewConnectivityWatchLocked();
|