aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/lib')
-rw-r--r--src/core/lib/channel/channelz.cc35
-rw-r--r--src/core/lib/channel/channelz.h10
-rw-r--r--src/core/lib/channel/channelz_registry.cc12
-rw-r--r--src/core/lib/surface/server.cc10
-rw-r--r--src/core/lib/surface/server.h3
5 files changed, 65 insertions, 5 deletions
diff --git a/src/core/lib/channel/channelz.cc b/src/core/lib/channel/channelz.cc
index c1194ae872..47ba1492ea 100644
--- a/src/core/lib/channel/channelz.cc
+++ b/src/core/lib/channel/channelz.cc
@@ -157,6 +157,38 @@ ServerNode::ServerNode(grpc_server* server, size_t channel_tracer_max_nodes)
ServerNode::~ServerNode() {}
+char* ServerNode::RenderServerSockets(intptr_t start_socket_id) {
+ grpc_json* top_level_json = grpc_json_create(GRPC_JSON_OBJECT);
+ grpc_json* json = top_level_json;
+ grpc_json* json_iterator = nullptr;
+ ChildRefsList socket_refs;
+ // uuids index into entities one-off (idx 0 is really uuid 1, since 0 is
+ // reserved). However, we want to support requests coming in with
+ // start_server_id=0, which signifies "give me everything."
+ size_t start_idx = start_socket_id == 0 ? 0 : start_socket_id - 1;
+ grpc_server_populate_listen_sockets(server_, &socket_refs, start_idx);
+ if (!socket_refs.empty()) {
+ // create list of socket refs
+ grpc_json* array_parent = grpc_json_create_child(
+ nullptr, json, "socketRef", nullptr, GRPC_JSON_ARRAY, false);
+ for (size_t i = 0; i < socket_refs.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",
+ socket_refs[i]);
+ }
+ }
+ // For now we do not have any pagination rules. In the future we could
+ // pick a constant for max_channels_sent for a GetServers request.
+ // Tracking: https://github.com/grpc/grpc/issues/16019.
+ json_iterator = grpc_json_create_child(nullptr, json, "end", nullptr,
+ GRPC_JSON_TRUE, false);
+ char* json_str = grpc_json_dump_to_string(top_level_json, 0);
+ grpc_json_destroy(top_level_json);
+ return json_str;
+}
+
grpc_json* ServerNode::RenderJson() {
// We need to track these three json objects to build our object
grpc_json* top_level_json = grpc_json_create(GRPC_JSON_OBJECT);
@@ -187,7 +219,8 @@ grpc_json* ServerNode::RenderJson() {
call_counter_.PopulateCallCounts(json);
json = top_level_json;
ChildRefsList listen_sockets;
- grpc_server_populate_listen_sockets(server_, &listen_sockets);
+ grpc_server_populate_listen_sockets(server_, &listen_sockets,
+ 0 /* start_idx*/);
if (!listen_sockets.empty()) {
grpc_json* array_parent = grpc_json_create_child(
nullptr, json, "listenSocket", nullptr, GRPC_JSON_ARRAY, false);
diff --git a/src/core/lib/channel/channelz.h b/src/core/lib/channel/channelz.h
index 5edd90c813..9ae2e56ec8 100644
--- a/src/core/lib/channel/channelz.h
+++ b/src/core/lib/channel/channelz.h
@@ -74,6 +74,12 @@ class BaseNode : public RefCounted<BaseNode> {
// All children must implement this function.
virtual grpc_json* RenderJson() GRPC_ABSTRACT;
+ // Fat interface for functionality that will only ever be called on Servers.
+ // All other channelz entities will assert false.
+ virtual char* RenderServerSockets(intptr_t start_socket_id) {
+ GPR_ASSERT(false);
+ }
+
// Renders the json and returns allocated string that must be freed by the
// caller.
char* RenderJsonString();
@@ -184,6 +190,10 @@ class ServerNode : public BaseNode {
grpc_json* RenderJson() override;
+ // Server overrides this functionality to populate the JSON with
+ // the sockets it owns.
+ char* RenderServerSockets(intptr_t start_socket_id) override;
+
// proxy methods to composed classes.
void AddTraceEvent(ChannelTrace::Severity severity, grpc_slice data) {
trace_.AddTraceEvent(severity, data);
diff --git a/src/core/lib/channel/channelz_registry.cc b/src/core/lib/channel/channelz_registry.cc
index 841f1c6104..820ed7bf8d 100644
--- a/src/core/lib/channel/channelz_registry.cc
+++ b/src/core/lib/channel/channelz_registry.cc
@@ -160,6 +160,18 @@ char* grpc_channelz_get_servers(intptr_t start_server_id) {
return grpc_core::channelz::ChannelzRegistry::GetServers(start_server_id);
}
+char* grpc_channelz_get_server_sockets(intptr_t server_id,
+ intptr_t start_socket_id) {
+ grpc_core::channelz::BaseNode* server_node =
+ grpc_core::channelz::ChannelzRegistry::Get(server_id);
+ if (server_node == nullptr ||
+ server_node->type() !=
+ grpc_core::channelz::BaseNode::EntityType::kServer) {
+ return nullptr;
+ }
+ return server_node->RenderServerSockets(start_socket_id);
+}
+
char* grpc_channelz_get_channel(intptr_t channel_id) {
grpc_core::channelz::BaseNode* channel_node =
grpc_core::channelz::ChannelzRegistry::Get(channel_id);
diff --git a/src/core/lib/surface/server.cc b/src/core/lib/surface/server.cc
index a35d60e275..da643f54ef 100644
--- a/src/core/lib/surface/server.cc
+++ b/src/core/lib/surface/server.cc
@@ -1213,7 +1213,8 @@ void grpc_server_setup_transport(grpc_server* s, grpc_transport* transport,
}
void grpc_server_populate_listen_sockets(
- grpc_server* s, grpc_core::ChildRefsList* listen_sockets) {
+ grpc_server* s, grpc_core::ChildRefsList* listen_sockets,
+ intptr_t start_idx) {
gpr_mu_lock(&s->mu_global);
channel_data* c = nullptr;
for (c = s->root_channel_data.next; c != &s->root_channel_data; c = c->next) {
@@ -1221,8 +1222,11 @@ void grpc_server_populate_listen_sockets(
grpc_channel_element* connected_channel_elem =
grpc_channel_stack_last_element(
grpc_channel_get_channel_stack(c->channel));
- listen_sockets->push_back(
- grpc_connected_channel_get_socket_uuid(connected_channel_elem));
+ intptr_t socket_uuid =
+ grpc_connected_channel_get_socket_uuid(connected_channel_elem);
+ if (socket_uuid >= start_idx) {
+ listen_sockets->push_back(socket_uuid);
+ }
}
}
gpr_mu_unlock(&s->mu_global);
diff --git a/src/core/lib/surface/server.h b/src/core/lib/surface/server.h
index db47d8032b..b3fd45564e 100644
--- a/src/core/lib/surface/server.h
+++ b/src/core/lib/surface/server.h
@@ -48,7 +48,8 @@ void grpc_server_setup_transport(grpc_server* server, grpc_transport* transport,
const grpc_channel_args* args);
void grpc_server_populate_listen_sockets(
- grpc_server* server, grpc_core::ChildRefsList* listen_sockets);
+ grpc_server* server, grpc_core::ChildRefsList* listen_sockets,
+ intptr_t start_idx);
grpc_core::channelz::ServerNode* grpc_server_get_channelz_node(
grpc_server* server);