diff options
author | Juanli Shen <juanlishen@google.com> | 2018-08-09 18:50:53 -0700 |
---|---|---|
committer | Juanli Shen <juanlishen@google.com> | 2018-08-09 21:54:11 -0700 |
commit | 9b72650125cd0f8b21ebd77825388e7dc3a9d191 (patch) | |
tree | 0f26a1ec357fb807255842522678dc188fd0bf43 /src/core/ext/filters/client_channel/lb_policy/subchannel_list.h | |
parent | 4bdb0e398c686fa6af586bb5cd28f32b0f458da4 (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.h | 20 |
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"); |