aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h
diff options
context:
space:
mode:
authorGravatar Juanli Shen <juanlishen@google.com>2018-08-09 18:50:53 -0700
committerGravatar Juanli Shen <juanlishen@google.com>2018-08-09 21:54:11 -0700
commit9b72650125cd0f8b21ebd77825388e7dc3a9d191 (patch)
tree0f26a1ec357fb807255842522678dc188fd0bf43 /src/core/ext/filters/client_channel/lb_policy/subchannel_list.h
parent4bdb0e398c686fa6af586bb5cd28f32b0f458da4 (diff)
PF: Check connectivity state before watching
Diffstat (limited to 'src/core/ext/filters/client_channel/lb_policy/subchannel_list.h')
-rw-r--r--src/core/ext/filters/client_channel/lb_policy/subchannel_list.h20
1 files changed, 16 insertions, 4 deletions
diff --git a/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h b/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h
index 0fa2f04e73..0a75fc10c0 100644
--- a/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h
+++ b/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h
@@ -115,7 +115,7 @@ class SubchannelData {
// Starts watching the connectivity state of the subchannel.
// ProcessConnectivityChangeLocked() will be called when the
// connectivity state changes.
- void StartConnectivityWatchLocked();
+ virtual void StartConnectivityWatchLocked();
// Renews watching the connectivity state of the subchannel.
void RenewConnectivityWatchLocked();
@@ -154,6 +154,10 @@ class SubchannelData {
grpc_connectivity_state connectivity_state,
grpc_error* error) GRPC_ABSTRACT;
+ // Returns the connectivity state. Must be called only while there is no
+ // connectivity notification pending.
+ grpc_connectivity_state connectivity_state() const;
+
private:
// Updates connected_subchannel_ based on pending_connectivity_state_unsafe_.
// Returns true if the connectivity state should be reported.
@@ -317,6 +321,13 @@ void SubchannelData<SubchannelListType,
}
template <typename SubchannelListType, typename SubchannelDataType>
+grpc_connectivity_state SubchannelData<
+ SubchannelListType, SubchannelDataType>::connectivity_state() const {
+ GPR_ASSERT(!connectivity_notification_pending_);
+ return pending_connectivity_state_unsafe_;
+}
+
+template <typename SubchannelListType, typename SubchannelDataType>
void SubchannelData<SubchannelListType,
SubchannelDataType>::StartConnectivityWatchLocked() {
if (subchannel_list_->tracer()->enabled()) {
@@ -350,7 +361,8 @@ void SubchannelData<SubchannelListType,
subchannel_,
grpc_connectivity_state_name(pending_connectivity_state_unsafe_));
}
- GPR_ASSERT(connectivity_notification_pending_);
+ GPR_ASSERT(!connectivity_notification_pending_);
+ connectivity_notification_pending_ = true;
grpc_subchannel_notify_on_state_change(
subchannel_, subchannel_list_->policy()->interested_parties(),
&pending_connectivity_state_unsafe_, &connectivity_changed_closure_);
@@ -367,8 +379,7 @@ void SubchannelData<SubchannelListType,
subchannel_list_, Index(), subchannel_list_->num_subchannels(),
subchannel_);
}
- GPR_ASSERT(connectivity_notification_pending_);
- connectivity_notification_pending_ = false;
+ GPR_ASSERT(!connectivity_notification_pending_);
subchannel_list()->Unref(DEBUG_LOCATION, "connectivity_watch");
}
@@ -442,6 +453,7 @@ void SubchannelData<SubchannelListType, SubchannelDataType>::
grpc_connectivity_state_name(sd->pending_connectivity_state_unsafe_),
grpc_error_string(error), sd->subchannel_list_->shutting_down());
}
+ sd->connectivity_notification_pending_ = false;
// If shutting down, unref subchannel and stop watching.
if (sd->subchannel_list_->shutting_down() || error == GRPC_ERROR_CANCELLED) {
sd->UnrefSubchannelLocked("connectivity_shutdown");