|
@@ -1018,19 +1018,16 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface {
|
|
|
DEBUG_LOCATION);
|
|
|
}
|
|
|
|
|
|
- void OnConnectivityStateChange(
|
|
|
- grpc_connectivity_state new_state,
|
|
|
- RefCountedPtr<ConnectedSubchannel> connected_subchannel) override {
|
|
|
+ void OnConnectivityStateChange() override {
|
|
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
|
|
|
gpr_log(GPR_INFO,
|
|
|
"chand=%p: connectivity change for subchannel wrapper %p "
|
|
|
- "subchannel %p (connected_subchannel=%p state=%s); "
|
|
|
+ "subchannel %p; "
|
|
|
"hopping into work_serializer",
|
|
|
- parent_->chand_, parent_.get(), parent_->subchannel_,
|
|
|
- connected_subchannel.get(), ConnectivityStateName(new_state));
|
|
|
+ parent_->chand_, parent_.get(), parent_->subchannel_);
|
|
|
}
|
|
|
// Will delete itself.
|
|
|
- new Updater(Ref(), new_state, std::move(connected_subchannel));
|
|
|
+ new Updater(Ref());
|
|
|
}
|
|
|
|
|
|
grpc_pollset_set* interested_parties() override {
|
|
@@ -1052,20 +1049,11 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface {
|
|
|
private:
|
|
|
class Updater {
|
|
|
public:
|
|
|
- Updater(RefCountedPtr<WatcherWrapper> parent,
|
|
|
- grpc_connectivity_state new_state,
|
|
|
- RefCountedPtr<ConnectedSubchannel> connected_subchannel)
|
|
|
- : parent_(std::move(parent)),
|
|
|
- state_(new_state),
|
|
|
- connected_subchannel_(std::move(connected_subchannel)) {
|
|
|
- gpr_log(GPR_ERROR, "updater run %p", parent_->mu());
|
|
|
- running_exec_ctx_ = ExecCtx::Get();
|
|
|
+ Updater(RefCountedPtr<WatcherWrapper> parent)
|
|
|
+ : parent_(std::move(parent)) {
|
|
|
parent_->parent_->chand_->work_serializer_->Run(
|
|
|
[this]() { ApplyUpdateInControlPlaneWorkSerializer(); },
|
|
|
DEBUG_LOCATION);
|
|
|
- if (!run_inline_) {
|
|
|
- gpr_mu_unlock(parent_->mu()->get());
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
private:
|
|
@@ -1074,23 +1062,28 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface {
|
|
|
gpr_log(GPR_INFO,
|
|
|
"chand=%p: processing connectivity change in work serializer "
|
|
|
"for subchannel wrapper %p subchannel %p "
|
|
|
- "(connected_subchannel=%p state=%s): watcher=%p",
|
|
|
+ "watcher=%p",
|
|
|
parent_->parent_->chand_, parent_->parent_.get(),
|
|
|
- parent_->parent_->subchannel_, connected_subchannel_.get(),
|
|
|
- ConnectivityStateName(state_), parent_->watcher_.get());
|
|
|
+ parent_->parent_->subchannel_, parent_->watcher_.get());
|
|
|
}
|
|
|
- if (ExecCtx::Get() == running_exec_ctx_) {
|
|
|
- // Running inline
|
|
|
- gpr_mu_unlock(parent_->mu()->get());
|
|
|
- run_inline_ = true;
|
|
|
+ while (true) {
|
|
|
+ grpc_connectivity_state state;
|
|
|
+ RefCountedPtr<ConnectedSubchannel> connected_subchannel;
|
|
|
+ gpr_log(GPR_ERROR, "bout to popping connectivity state change %d",
|
|
|
+ state);
|
|
|
+ if (!parent_->PopConnectivityStateChange(&state,
|
|
|
+ &connected_subchannel)) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ gpr_log(GPR_ERROR, "popping connectivity state change %d", state);
|
|
|
+ // Ignore update if the parent WatcherWrapper has been replaced
|
|
|
+ // since this callback was scheduled.
|
|
|
+ if (parent_->watcher_ == nullptr) continue;
|
|
|
+ parent_->last_seen_state_ = state;
|
|
|
+ parent_->parent_->MaybeUpdateConnectedSubchannel(
|
|
|
+ std::move(connected_subchannel));
|
|
|
+ parent_->watcher_->OnConnectivityStateChange(state);
|
|
|
}
|
|
|
- // Ignore update if the parent WatcherWrapper has been replaced
|
|
|
- // since this callback was scheduled.
|
|
|
- if (parent_->watcher_ == nullptr) return;
|
|
|
- parent_->last_seen_state_ = state_;
|
|
|
- parent_->parent_->MaybeUpdateConnectedSubchannel(
|
|
|
- std::move(connected_subchannel_));
|
|
|
- parent_->watcher_->OnConnectivityStateChange(state_);
|
|
|
delete this;
|
|
|
}
|
|
|
|