aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/ext
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/ext')
-rw-r--r--src/core/ext/filters/client_channel/client_channel_channelz.cc19
-rw-r--r--src/core/ext/filters/client_channel/client_channel_channelz.h8
-rw-r--r--src/core/ext/filters/client_channel/subchannel.cc10
-rw-r--r--src/core/ext/filters/client_channel/subchannel.h3
-rw-r--r--src/core/ext/transport/chttp2/transport/chttp2_transport.cc12
-rw-r--r--src/core/ext/transport/cronet/transport/cronet_transport.cc6
-rw-r--r--src/core/ext/transport/inproc/inproc_transport.cc5
7 files changed, 55 insertions, 8 deletions
diff --git a/src/core/ext/filters/client_channel/client_channel_channelz.cc b/src/core/ext/filters/client_channel/client_channel_channelz.cc
index 7e8f59bcd3..4fedcbcbb6 100644
--- a/src/core/ext/filters/client_channel/client_channel_channelz.cc
+++ b/src/core/ext/filters/client_channel/client_channel_channelz.cc
@@ -136,6 +136,23 @@ void SubchannelNode::PopulateConnectivityState(grpc_json* json) {
false);
}
+void SubchannelNode::PopulateChildSockets(grpc_json* json) {
+ ChildRefsList child_sockets;
+ grpc_json* json_iterator = nullptr;
+ grpc_subchannel_populate_child_sockets(subchannel_, &child_sockets);
+ if (!child_sockets.empty()) {
+ grpc_json* array_parent = grpc_json_create_child(
+ nullptr, json, "socketRef", nullptr, GRPC_JSON_ARRAY, false);
+ for (size_t i = 0; i < child_sockets.size(); ++i) {
+ json_iterator =
+ grpc_json_create_child(json_iterator, array_parent, nullptr, nullptr,
+ GRPC_JSON_OBJECT, false);
+ grpc_json_add_number_string_child(json_iterator, nullptr, "socketId",
+ child_sockets[i]);
+ }
+ }
+}
+
grpc_json* SubchannelNode::RenderJson() {
grpc_json* top_level_json = grpc_json_create(GRPC_JSON_OBJECT);
grpc_json* json = top_level_json;
@@ -166,6 +183,8 @@ grpc_json* SubchannelNode::RenderJson() {
}
// ask CallCountingHelper to populate trace and call count data.
call_counter_.PopulateCallCounts(json);
+ json = top_level_json;
+ PopulateChildSockets(json);
return top_level_json;
}
diff --git a/src/core/ext/filters/client_channel/client_channel_channelz.h b/src/core/ext/filters/client_channel/client_channel_channelz.h
index 8ce331e529..a63df00f9f 100644
--- a/src/core/ext/filters/client_channel/client_channel_channelz.h
+++ b/src/core/ext/filters/client_channel/client_channel_channelz.h
@@ -31,11 +31,6 @@ typedef struct grpc_subchannel grpc_subchannel;
namespace grpc_core {
-// TODO(ncteisen), this only contains the uuids of the children for now,
-// since that is all that is strictly needed. In a future enhancement we will
-// add human readable names as in the channelz.proto
-typedef InlinedVector<intptr_t, 10> ChildRefsList;
-
namespace channelz {
// Subtype of ChannelNode that overrides and provides client_channel specific
@@ -76,6 +71,9 @@ class SubchannelNode : public BaseNode {
grpc_json* RenderJson() override;
+ // helper to populate the socket(s) that this subchannel owns.
+ void PopulateChildSockets(grpc_json* json);
+
// proxy methods to composed classes.
void AddTraceEvent(ChannelTrace::Severity severity, grpc_slice data) {
trace_.AddTraceEvent(severity, data);
diff --git a/src/core/ext/filters/client_channel/subchannel.cc b/src/core/ext/filters/client_channel/subchannel.cc
index 57d0b3759f..29aeb06e7b 100644
--- a/src/core/ext/filters/client_channel/subchannel.cc
+++ b/src/core/ext/filters/client_channel/subchannel.cc
@@ -97,6 +97,8 @@ struct grpc_subchannel {
/** set during connection */
grpc_connect_out_args connecting_result;
+ grpc_transport* transport;
+
/** callback for connection finishing */
grpc_closure on_connected;
@@ -411,6 +413,13 @@ grpc_core::channelz::SubchannelNode* grpc_subchannel_get_channelz_node(
return subchannel->channelz_subchannel.get();
}
+void grpc_subchannel_populate_child_sockets(
+ grpc_subchannel* subchannel, grpc_core::ChildRefsList* child_sockets) {
+ if (subchannel->transport != nullptr) {
+ grpc_transport_populate_sockets(subchannel->transport, child_sockets);
+ }
+}
+
static void continue_connect_locked(grpc_subchannel* c) {
grpc_connect_in_args args;
args.interested_parties = c->pollset_set;
@@ -621,6 +630,7 @@ static bool publish_transport_locked(grpc_subchannel* c) {
GRPC_ERROR_UNREF(error);
return false;
}
+ c->transport = c->connecting_result.transport;
memset(&c->connecting_result, 0, sizeof(c->connecting_result));
/* initialize state watcher */
diff --git a/src/core/ext/filters/client_channel/subchannel.h b/src/core/ext/filters/client_channel/subchannel.h
index 84febb5204..2cf5067fc2 100644
--- a/src/core/ext/filters/client_channel/subchannel.h
+++ b/src/core/ext/filters/client_channel/subchannel.h
@@ -126,6 +126,9 @@ void grpc_subchannel_call_unref(
grpc_core::channelz::SubchannelNode* grpc_subchannel_get_channelz_node(
grpc_subchannel* subchannel);
+void grpc_subchannel_populate_child_sockets(
+ grpc_subchannel* subchannel, grpc_core::ChildRefsList* child_sockets);
+
/** 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
field of the args passed to \a grpc_connected_subchannel_create_call(). */
diff --git a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc b/src/core/ext/transport/chttp2/transport/chttp2_transport.cc
index d3232f4d26..202da652de 100644
--- a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc
+++ b/src/core/ext/transport/chttp2/transport/chttp2_transport.cc
@@ -3157,6 +3157,15 @@ static grpc_endpoint* chttp2_get_endpoint(grpc_transport* t) {
return (reinterpret_cast<grpc_chttp2_transport*>(t))->ep;
}
+static void populate_sockets(grpc_transport* transport,
+ grpc_core::ChildRefsList* child_sockets) {
+ grpc_chttp2_transport* t =
+ reinterpret_cast<grpc_chttp2_transport*>(transport);
+ if (t->channelz_socket != nullptr) {
+ child_sockets->push_back(t->channelz_socket->uuid());
+ }
+}
+
static const grpc_transport_vtable vtable = {sizeof(grpc_chttp2_stream),
"chttp2",
init_stream,
@@ -3166,7 +3175,8 @@ static const grpc_transport_vtable vtable = {sizeof(grpc_chttp2_stream),
perform_transport_op,
destroy_stream,
destroy_transport,
- chttp2_get_endpoint};
+ chttp2_get_endpoint,
+ populate_sockets};
static const grpc_transport_vtable* get_vtable(void) { return &vtable; }
diff --git a/src/core/ext/transport/cronet/transport/cronet_transport.cc b/src/core/ext/transport/cronet/transport/cronet_transport.cc
index 81e2634e3a..f3826a78de 100644
--- a/src/core/ext/transport/cronet/transport/cronet_transport.cc
+++ b/src/core/ext/transport/cronet/transport/cronet_transport.cc
@@ -1439,6 +1439,9 @@ static grpc_endpoint* get_endpoint(grpc_transport* gt) { return nullptr; }
static void perform_op(grpc_transport* gt, grpc_transport_op* op) {}
+static void populate_sockets(grpc_transport* t,
+ grpc_core::ChildRefsList* child_sockets) {}
+
static const grpc_transport_vtable grpc_cronet_vtable = {
sizeof(stream_obj),
"cronet_http",
@@ -1449,7 +1452,8 @@ static const grpc_transport_vtable grpc_cronet_vtable = {
perform_op,
destroy_stream,
destroy_transport,
- get_endpoint};
+ get_endpoint,
+ populate_sockets};
grpc_transport* grpc_create_cronet_transport(void* engine, const char* target,
const grpc_channel_args* args,
diff --git a/src/core/ext/transport/inproc/inproc_transport.cc b/src/core/ext/transport/inproc/inproc_transport.cc
index b0ca7f8207..2deaacb2e0 100644
--- a/src/core/ext/transport/inproc/inproc_transport.cc
+++ b/src/core/ext/transport/inproc/inproc_transport.cc
@@ -1170,6 +1170,9 @@ static void set_pollset_set(grpc_transport* gt, grpc_stream* gs,
static grpc_endpoint* get_endpoint(grpc_transport* t) { return nullptr; }
+static void populate_sockets(grpc_transport* t,
+ grpc_core::ChildRefsList* child_sockets) {}
+
/*******************************************************************************
* GLOBAL INIT AND DESTROY
*/
@@ -1194,7 +1197,7 @@ static const grpc_transport_vtable inproc_vtable = {
sizeof(inproc_stream), "inproc", init_stream,
set_pollset, set_pollset_set, perform_stream_op,
perform_transport_op, destroy_stream, destroy_transport,
- get_endpoint};
+ get_endpoint, populate_sockets};
/*******************************************************************************
* Main inproc transport functions