Ensure subchannel channelz only created if enabled
diff --git a/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc b/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc
index 1ecae16..390b4ee 100644
--- a/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc
+++ b/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc
@@ -328,8 +328,12 @@
if (subchannel_list_ != nullptr) {
for (size_t i = 0; i < subchannel_list_->num_subchannels(); ++i) {
if (subchannel_list_->subchannel(i)->subchannel() != nullptr) {
- cs.push_back(grpc_subchannel_get_uuid(
- subchannel_list_->subchannel(i)->subchannel()));
+ grpc_core::channelz::SubchannelNode* subchannel_node =
+ grpc_subchannel_get_channelz_node(
+ subchannel_list_->subchannel(i)->subchannel());
+ if (subchannel_node != nullptr) {
+ cs.push_back(subchannel_node->subchannel_uuid());
+ }
}
}
}
@@ -338,8 +342,12 @@
++i) {
if (latest_pending_subchannel_list_->subchannel(i)->subchannel() !=
nullptr) {
- cs.push_back(grpc_subchannel_get_uuid(
- latest_pending_subchannel_list_->subchannel(i)->subchannel()));
+ grpc_core::channelz::SubchannelNode* subchannel_node =
+ grpc_subchannel_get_channelz_node(
+ latest_pending_subchannel_list_->subchannel(i)->subchannel());
+ if (subchannel_node != nullptr) {
+ cs.push_back(subchannel_node->subchannel_uuid());
+ }
}
}
}
diff --git a/src/core/ext/filters/client_channel/subchannel.cc b/src/core/ext/filters/client_channel/subchannel.cc
index 6c4f186..0e349da 100644
--- a/src/core/ext/filters/client_channel/subchannel.cc
+++ b/src/core/ext/filters/client_channel/subchannel.cc
@@ -135,10 +135,8 @@
/** our alarm */
grpc_timer alarm;
- /* the global uuid for this subchannel */
- // TODO(ncteisen): move this into SubchannelNode while implementing
- // GetSubchannel.
- intptr_t subchannel_uuid;
+ grpc_core::RefCountedPtr<grpc_core::channelz::SubchannelNode>
+ channelz_subchannel;
};
struct grpc_subchannel_call {
@@ -379,14 +377,21 @@
c->backoff.Init(backoff_options);
gpr_mu_init(&c->mu);
- // This is just a placeholder for now
- c->subchannel_uuid = 42;
+ // This is just a placeholder channelz class for for now.
+ const grpc_arg* arg =
+ grpc_channel_args_find(c->args, GRPC_ARG_ENABLE_CHANNELZ);
+ bool channelz_enabled = grpc_channel_arg_get_bool(arg, false);
+ if (channelz_enabled) {
+ c->channelz_subchannel =
+ grpc_core::MakeRefCounted<grpc_core::channelz::SubchannelNode>();
+ }
return grpc_subchannel_index_register(key, c);
}
-intptr_t grpc_subchannel_get_uuid(grpc_subchannel* s) {
- return s->subchannel_uuid;
+grpc_core::channelz::SubchannelNode* grpc_subchannel_get_channelz_node(
+ grpc_subchannel* s) {
+ return s->channelz_subchannel.get();
}
static void continue_connect_locked(grpc_subchannel* c) {
diff --git a/src/core/ext/filters/client_channel/subchannel.h b/src/core/ext/filters/client_channel/subchannel.h
index 590e80f..f76be81 100644
--- a/src/core/ext/filters/client_channel/subchannel.h
+++ b/src/core/ext/filters/client_channel/subchannel.h
@@ -71,6 +71,10 @@
namespace grpc_core {
+namespace channelz {
+class SubchannelNode;
+}
+
class ConnectedSubchannel : public RefCountedWithTracing<ConnectedSubchannel> {
public:
struct CallArgs {
@@ -115,7 +119,8 @@
void grpc_subchannel_call_unref(
grpc_subchannel_call* call GRPC_SUBCHANNEL_REF_EXTRA_ARGS);
-intptr_t grpc_subchannel_get_uuid(grpc_subchannel* subchannel);
+grpc_core::channelz::SubchannelNode* grpc_subchannel_get_channelz_node(
+ grpc_subchannel* subchannel);
/** Returns a pointer to the parent data associated with \a subchannel_call.
The data will be of the size specified in \a parent_data_size
diff --git a/src/core/lib/channel/channelz.cc b/src/core/lib/channel/channelz.cc
index d9bce98..5a0620c 100644
--- a/src/core/lib/channel/channelz.cc
+++ b/src/core/lib/channel/channelz.cc
@@ -131,5 +131,13 @@
channel, channel_tracer_max_nodes);
}
+SubchannelNode::SubchannelNode() : subchannel_uuid_(-1) {
+ subchannel_uuid_ = ChannelzRegistry::Register(this);
+}
+
+SubchannelNode::~SubchannelNode() {
+ ChannelzRegistry::Unregister(subchannel_uuid_);
+}
+
} // namespace channelz
} // namespace grpc_core
diff --git a/src/core/lib/channel/channelz.h b/src/core/lib/channel/channelz.h
index e84c187..f2c5ecd 100644
--- a/src/core/lib/channel/channelz.h
+++ b/src/core/lib/channel/channelz.h
@@ -95,6 +95,24 @@
ManualConstructor<ChannelTrace> trace_;
};
+// Placeholds channelz class for subchannels. All this can do now is track its
+// uuid (this information is needed by the parent channelz class). In the next
+// PR I will build this out to support the GetSubchannel channelz request.
+class SubchannelNode : public RefCounted<SubchannelNode> {
+ public:
+ SubchannelNode();
+ virtual ~SubchannelNode();
+
+ intptr_t subchannel_uuid() { return subchannel_uuid_; }
+
+ protected:
+ GPRC_ALLOW_CLASS_TO_USE_NON_PUBLIC_DELETE
+ GPRC_ALLOW_CLASS_TO_USE_NON_PUBLIC_NEW
+
+ private:
+ intptr_t subchannel_uuid_;
+};
+
// Creation functions
typedef RefCountedPtr<ChannelNode> (*ChannelNodeCreationFunc)(grpc_channel*,