19 #ifndef GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_SUBCHANNEL_LIST_H
20 #define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_SUBCHANNEL_LIST_H
28 #include "absl/container/inlined_vector.h"
71 template <
typename SubchannelListType,
typename SubchannelDataType>
77 template <
typename SubchannelListType,
typename SubchannelDataType>
82 return static_cast<SubchannelListType*
>(subchannel_list_);
87 return static_cast<size_t>(
static_cast<const SubchannelDataType*
>(
this) -
88 subchannel_list_->subchannel(0));
100 connectivity_state_ = subchannel_->CheckConnectivityState();
101 return connectivity_state_;
142 : subchannel_data_(subchannel_data),
145 ~Watcher()
override {
152 return subchannel_list_->policy()->interested_parties();
161 void UnrefSubchannelLocked(
const char* reason);
175 template <
typename SubchannelListType,
typename SubchannelDataType>
184 SubchannelDataType*
subchannel(
size_t index) {
return &subchannels_[index]; }
213 friend class SubchannelData<SubchannelListType, SubchannelDataType>;
215 void ShutdownLocked();
228 bool shutting_down_ =
false;
239 template <
typename SubchannelListType,
typename SubchannelDataType>
244 "[%s %p] subchannel list %p index %" PRIuPTR
" of %" PRIuPTR
245 " (subchannel %p): connectivity changed: state=%s, "
246 "shutting_down=%d, pending_watcher=%p",
247 subchannel_list_->tracer()->name(), subchannel_list_->policy(),
248 subchannel_list_.get(), subchannel_data_->Index(),
249 subchannel_list_->num_subchannels(),
250 subchannel_data_->subchannel_.get(),
252 subchannel_data_->pending_watcher_);
254 if (!subchannel_list_->shutting_down() &&
255 subchannel_data_->pending_watcher_ !=
nullptr) {
256 subchannel_data_->connectivity_state_ = new_state;
258 subchannel_data_->ProcessConnectivityChangeLocked(new_state);
266 template <
typename SubchannelListType,
typename SubchannelDataType>
271 : subchannel_list_(subchannel_list),
277 template <
typename SubchannelListType,
typename SubchannelDataType>
282 template <
typename SubchannelListType,
typename SubchannelDataType>
285 if (subchannel_ !=
nullptr) {
288 "[%s %p] subchannel list %p index %" PRIuPTR
" of %" PRIuPTR
289 " (subchannel %p): unreffing subchannel (%s)",
290 subchannel_list_->tracer()->name(), subchannel_list_->policy(),
291 subchannel_list_, Index(), subchannel_list_->num_subchannels(),
292 subchannel_.get(), reason);
298 template <
typename SubchannelListType,
typename SubchannelDataType>
299 void SubchannelData<SubchannelListType,
300 SubchannelDataType>::ResetBackoffLocked() {
301 if (subchannel_ !=
nullptr) {
302 subchannel_->ResetBackoff();
306 template <
typename SubchannelListType,
typename SubchannelDataType>
308 SubchannelDataType>::StartConnectivityWatchLocked() {
311 "[%s %p] subchannel list %p index %" PRIuPTR
" of %" PRIuPTR
312 " (subchannel %p): starting watch (from %s)",
313 subchannel_list_->tracer()->name(), subchannel_list_->policy(),
314 subchannel_list_, Index(), subchannel_list_->num_subchannels(),
319 new Watcher(
this, subchannel_list()->Ref(
DEBUG_LOCATION,
"Watcher"));
320 subchannel_->WatchConnectivityState(
322 std::unique_ptr<SubchannelInterface::ConnectivityStateWatcherInterface>(
326 template <
typename SubchannelListType,
typename SubchannelDataType>
331 "[%s %p] subchannel list %p index %" PRIuPTR
" of %" PRIuPTR
332 " (subchannel %p): canceling connectivity watch (%s)",
333 subchannel_list_->tracer()->name(), subchannel_list_->policy(),
334 subchannel_list_, Index(), subchannel_list_->num_subchannels(),
335 subchannel_.get(), reason);
337 if (pending_watcher_ !=
nullptr) {
338 subchannel_->CancelConnectivityStateWatch(pending_watcher_);
339 pending_watcher_ =
nullptr;
343 template <
typename SubchannelListType,
typename SubchannelDataType>
345 if (pending_watcher_ !=
nullptr) CancelConnectivityWatchLocked(
"shutdown");
346 UnrefSubchannelLocked(
"shutdown");
353 template <
typename SubchannelListType,
typename SubchannelDataType>
364 "[%s %p] Creating subchannel list %p for %" PRIuPTR
" subchannels",
365 tracer_->
name(),
policy,
this, addresses.size());
367 subchannels_.reserve(addresses.size());
376 "[%s %p] could not create subchannel for address %s, "
378 tracer_->
name(), policy_, address.ToString().c_str());
384 "[%s %p] subchannel list %p index %" PRIuPTR
385 ": Created subchannel %p for address %s",
386 tracer_->
name(), policy_,
this, subchannels_.size(),
387 subchannel.get(), address.ToString().c_str());
389 subchannels_.emplace_back(
this, std::move(address), std::move(
subchannel));
393 template <
typename SubchannelListType,
typename SubchannelDataType>
396 gpr_log(
GPR_INFO,
"[%s %p] Destroying subchannel_list %p", tracer_->name(),
401 template <
typename SubchannelListType,
typename SubchannelDataType>
405 tracer_->name(), policy_,
this);
408 shutting_down_ =
true;
409 for (
size_t i = 0; i < subchannels_.size(); i++) {
410 SubchannelDataType* sd = &subchannels_[i];
411 sd->ShutdownLocked();
415 template <
typename SubchannelListType,
typename SubchannelDataType>
416 void SubchannelList<SubchannelListType,
417 SubchannelDataType>::ResetBackoffLocked() {
418 for (
size_t i = 0; i < subchannels_.size(); i++) {
419 SubchannelDataType* sd = &subchannels_[i];
420 sd->ResetBackoffLocked();
Definition: orphanable.h:76
void Unref()
Definition: orphanable.h:103
A proxy object implemented by the client channel and used by the LB policy to communicate with the ch...
Definition: lb_policy.h:274
virtual RefCountedPtr< SubchannelInterface > CreateSubchannel(ServerAddress address, const grpc_channel_args &args)=0
Creates a new subchannel with the specified channel args.
Interface for load balancing policies.
Definition: lb_policy.h:82
Definition: ref_counted_ptr.h:35
Definition: server_address.h:43
Definition: subchannel_list.h:78
SubchannelInterface * subchannel() const
Definition: subchannel_list.h:92
virtual ~SubchannelData()
Definition: subchannel_list.h:278
virtual void ProcessConnectivityChangeLocked(grpc_connectivity_state connectivity_state)=0
void ShutdownLocked()
Definition: subchannel_list.h:344
SubchannelListType * subchannel_list() const
Definition: subchannel_list.h:81
size_t Index() const
Definition: subchannel_list.h:86
SubchannelData(SubchannelList< SubchannelListType, SubchannelDataType > *subchannel_list, const ServerAddress &address, RefCountedPtr< SubchannelInterface > subchannel)
Definition: subchannel_list.h:267
grpc_connectivity_state CheckConnectivityStateLocked()
Definition: subchannel_list.h:98
void ResetBackoffLocked()
Definition: subchannel_list.h:300
void CancelConnectivityWatchLocked(const char *reason)
Definition: subchannel_list.h:328
void StartConnectivityWatchLocked()
Definition: subchannel_list.h:308
Definition: subchannel_interface.h:35
Definition: subchannel_interface.h:33
Definition: subchannel_list.h:176
bool shutting_down() const
Definition: subchannel_list.h:187
absl::InlinedVector< SubchannelDataType, 10 > SubchannelVector
Definition: subchannel_list.h:178
void ResetBackoffLocked()
Definition: subchannel_list.h:417
SubchannelDataType * subchannel(size_t index)
Definition: subchannel_list.h:184
TraceFlag * tracer() const
Definition: subchannel_list.h:191
LoadBalancingPolicy * policy() const
Definition: subchannel_list.h:190
virtual ~SubchannelList()
Definition: subchannel_list.h:394
size_t num_subchannels() const
Definition: subchannel_list.h:181
SubchannelList(LoadBalancingPolicy *policy, TraceFlag *tracer, ServerAddressList addresses, LoadBalancingPolicy::ChannelControlHelper *helper, const grpc_channel_args &args)
Definition: subchannel_list.h:354
void Orphan() override
Definition: subchannel_list.h:198
const char * name() const
Definition: trace.h:68
#define DEBUG_LOCATION
Definition: debug_location.h:41
#define GPR_ASSERT(x)
abort() the process if x is zero, having written a line to the log.
Definition: log.h:92
GPRAPI void gpr_log(const char *file, int line, gpr_log_severity severity, const char *format,...) GPR_PRINT_FORMAT_CHECK(4
Log a message.
#define GPR_INFO
Definition: log.h:54
grpc_connectivity_state
Connectivity state of a channel.
Definition: connectivity_state.h:27
@ GRPC_CHANNEL_IDLE
channel is idle
Definition: connectivity_state.h:29
Round Robin Policy.
Definition: backend_metric.cc:26
absl::InlinedVector< ServerAddress, 1 > ServerAddressList
Definition: server_address.h:111
const char * ConnectivityStateName(grpc_connectivity_state state)
Definition: connectivity_state.cc:36
struct grpc_pollset_set grpc_pollset_set
Definition: pollset_set.h:31
RefCountedPtr< SubchannelInterface > subchannel
Definition: ring_hash.cc:213
grpc_connectivity_state connectivity_state
Definition: ring_hash.cc:214
An array of arguments that can be passed around.
Definition: grpc_types.h:132
#define GRPC_TRACE_FLAG_ENABLED(f)
Definition: trace.h:112
TraceFlag * tracer
Definition: xds_api.cc:907