// // Copyright 2018 gRPC authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #include "src/core/xds/grpc/xds_endpoint.h" #include #include "absl/strings/str_cat.h" #include "absl/strings/str_join.h" namespace grpc_core { std::string XdsEndpointResource::Priority::Locality::ToString() const { std::vector endpoint_strings; for (const EndpointAddresses& endpoint : endpoints) { endpoint_strings.emplace_back(endpoint.ToString()); } return absl::StrCat("{name=", name->human_readable_string().as_string_view(), ", lb_weight=", lb_weight, ", endpoints=[", absl::StrJoin(endpoint_strings, ", "), "]}"); } bool XdsEndpointResource::Priority::operator==(const Priority& other) const { if (localities.size() != other.localities.size()) return false; auto it1 = localities.begin(); auto it2 = other.localities.begin(); while (it1 != localities.end()) { if (*it1->first != *it2->first) return false; if (it1->second != it2->second) return false; ++it1; ++it2; } return true; } std::string XdsEndpointResource::Priority::ToString() const { std::vector locality_strings; locality_strings.reserve(localities.size()); for (const auto& p : localities) { locality_strings.emplace_back(p.second.ToString()); } return absl::StrCat("[", absl::StrJoin(locality_strings, ", "), "]"); } bool XdsEndpointResource::DropConfig::ShouldDrop( const std::string** category_name) { for (size_t i = 0; i < drop_category_list_.size(); ++i) { const auto& drop_category = drop_category_list_[i]; // Generate a random number in [0, 1000000). const uint32_t random = [&]() { MutexLock lock(&mu_); return absl::Uniform(bit_gen_, 0, 1000000); }(); if (random < drop_category.parts_per_million) { *category_name = &drop_category.name; return true; } } return false; } std::string XdsEndpointResource::DropConfig::ToString() const { std::vector category_strings; for (const DropCategory& category : drop_category_list_) { category_strings.emplace_back( absl::StrCat(category.name, "=", category.parts_per_million)); } return absl::StrCat("{[", absl::StrJoin(category_strings, ", "), "], drop_all=", drop_all_, "}"); } std::string XdsEndpointResource::ToString() const { std::vector priority_strings; for (size_t i = 0; i < priorities.size(); ++i) { const Priority& priority = priorities[i]; priority_strings.emplace_back( absl::StrCat("priority ", i, ": ", priority.ToString())); } return absl::StrCat( "priorities=[", absl::StrJoin(priority_strings, ", "), "], drop_config=", drop_config == nullptr ? "" : drop_config->ToString()); } } // namespace grpc_core