diff options
Diffstat (limited to 'src/core/lib/channel/channelz_registry.cc')
-rw-r--r-- | src/core/lib/channel/channelz_registry.cc | 34 |
1 files changed, 15 insertions, 19 deletions
diff --git a/src/core/lib/channel/channelz_registry.cc b/src/core/lib/channel/channelz_registry.cc index e90a9e1f7f..1fe2fad3e1 100644 --- a/src/core/lib/channel/channelz_registry.cc +++ b/src/core/lib/channel/channelz_registry.cc @@ -79,12 +79,13 @@ void ChannelzRegistry::MaybePerformCompactionLocked() { } } -int ChannelzRegistry::FindByUuidLocked(intptr_t target_uuid) { - size_t left = 0; - size_t right = entities_.size() - 1; +int ChannelzRegistry::FindByUuidLocked(intptr_t target_uuid, + bool direct_hit_needed) { + int left = 0; + int right = int(entities_.size() - 1); while (left <= right) { - size_t true_middle = left + (right - left) / 2; - size_t first_non_null = true_middle; + int true_middle = left + (right - left) / 2; + int first_non_null = true_middle; while (first_non_null < right && entities_[first_non_null] == nullptr) { first_non_null++; } @@ -102,14 +103,14 @@ int ChannelzRegistry::FindByUuidLocked(intptr_t target_uuid) { right = true_middle - 1; } } - return -1; + return direct_hit_needed ? -1 : left; } void ChannelzRegistry::InternalUnregister(intptr_t uuid) { GPR_ASSERT(uuid >= 1); MutexLock lock(&mu_); GPR_ASSERT(uuid <= uuid_generator_); - int idx = FindByUuidLocked(uuid); + int idx = FindByUuidLocked(uuid, true); GPR_ASSERT(idx >= 0); entities_[idx] = nullptr; num_empty_slots_++; @@ -121,7 +122,7 @@ BaseNode* ChannelzRegistry::InternalGet(intptr_t uuid) { if (uuid < 1 || uuid > uuid_generator_) { return nullptr; } - int idx = FindByUuidLocked(uuid); + int idx = FindByUuidLocked(uuid, true); return idx < 0 ? nullptr : entities_[idx]; } @@ -131,16 +132,13 @@ char* ChannelzRegistry::InternalGetTopChannels(intptr_t start_channel_id) { grpc_json* json = top_level_json; grpc_json* json_iterator = nullptr; InlinedVector<BaseNode*, 10> top_level_channels; - // 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_channel_id=0, which signifies "give me everything." Hence this - // funky looking line below. - size_t start_idx = start_channel_id == 0 ? 0 : start_channel_id - 1; bool reached_pagination_limit = false; + int start_idx = GPR_MAX(FindByUuidLocked(start_channel_id, false), 0); for (size_t i = start_idx; i < entities_.size(); ++i) { if (entities_[i] != nullptr && entities_[i]->type() == - grpc_core::channelz::BaseNode::EntityType::kTopLevelChannel) { + grpc_core::channelz::BaseNode::EntityType::kTopLevelChannel && + entities_[i]->uuid() >= start_channel_id) { // check if we are over pagination limit to determine if we need to set // the "end" element. If we don't go through this block, we know that // when the loop terminates, we have <= to kPaginationLimit. @@ -176,15 +174,13 @@ char* ChannelzRegistry::InternalGetServers(intptr_t start_server_id) { grpc_json* json = top_level_json; grpc_json* json_iterator = nullptr; InlinedVector<BaseNode*, 10> servers; - // 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_server_id == 0 ? 0 : start_server_id - 1; bool reached_pagination_limit = false; + int start_idx = GPR_MAX(FindByUuidLocked(start_server_id, false), 0); for (size_t i = start_idx; i < entities_.size(); ++i) { if (entities_[i] != nullptr && entities_[i]->type() == - grpc_core::channelz::BaseNode::EntityType::kServer) { + grpc_core::channelz::BaseNode::EntityType::kServer && + entities_[i]->uuid() >= start_server_id) { // check if we are over pagination limit to determine if we need to set // the "end" element. If we don't go through this block, we know that // when the loop terminates, we have <= to kPaginationLimit. |