diff options
Diffstat (limited to 'src/core/lib')
-rw-r--r-- | src/core/lib/channel/channelz.cc | 35 | ||||
-rw-r--r-- | src/core/lib/channel/channelz.h | 10 | ||||
-rw-r--r-- | src/core/lib/channel/channelz_registry.cc | 12 | ||||
-rw-r--r-- | src/core/lib/surface/server.cc | 10 | ||||
-rw-r--r-- | src/core/lib/surface/server.h | 3 |
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); |