Merge pull request #22771 from grpc/revert-22735-string_less

Revert "Remove StringLess and src/core/lib/gprpp/map.h"
pull/22778/head
nanahpang 5 years ago committed by GitHub
commit d704da61a6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      BUILD
  2. 1
      BUILD.gn
  3. 1
      build_autogenerated.yaml
  4. 2
      gRPC-C++.podspec
  5. 2
      gRPC-Core.podspec
  6. 1
      grpc.gemspec
  7. 1
      package.xml
  8. 4
      src/core/ext/filters/client_channel/backend_metric.cc
  9. 47
      src/core/ext/filters/client_channel/client_channel.cc
  10. 7
      src/core/ext/filters/client_channel/health/health_check_client.cc
  11. 6
      src/core/ext/filters/client_channel/health/health_check_client.h
  12. 5
      src/core/ext/filters/client_channel/lb_policy.h
  13. 15
      src/core/ext/filters/client_channel/resolver_result_parsing.cc
  14. 6
      src/core/ext/filters/client_channel/resolver_result_parsing.h
  15. 43
      src/core/ext/filters/client_channel/subchannel.cc
  16. 18
      src/core/ext/filters/client_channel/subchannel.h
  17. 1
      src/core/ext/filters/client_channel/xds/xds_bootstrap.h
  18. 3
      src/core/ext/filters/client_channel/xds/xds_client.cc
  19. 2
      src/core/ext/filters/client_channel/xds/xds_client.h
  20. 4
      src/core/ext/filters/client_channel/xds/xds_client_stats.h
  21. 2
      src/core/lib/channel/channelz.h
  22. 3
      src/core/lib/channel/channelz_registry.h
  23. 51
      src/core/lib/gprpp/map.h
  24. 3
      src/core/lib/transport/connectivity_state.h
  25. 4
      test/core/client_channel/service_config_test.cc
  26. 2
      test/cpp/end2end/xds_end2end_test.cc
  27. 1
      tools/doxygen/Doxyfile.c++.internal
  28. 1
      tools/doxygen/Doxyfile.core.internal

@ -551,6 +551,7 @@ grpc_cc_library(
"src/core/lib/gprpp/global_config_generic.h", "src/core/lib/gprpp/global_config_generic.h",
"src/core/lib/gprpp/host_port.h", "src/core/lib/gprpp/host_port.h",
"src/core/lib/gprpp/manual_constructor.h", "src/core/lib/gprpp/manual_constructor.h",
"src/core/lib/gprpp/map.h",
"src/core/lib/gprpp/memory.h", "src/core/lib/gprpp/memory.h",
"src/core/lib/gprpp/mpscq.h", "src/core/lib/gprpp/mpscq.h",
"src/core/lib/gprpp/string_view.h", "src/core/lib/gprpp/string_view.h",

@ -156,6 +156,7 @@ config("grpc_config") {
"src/core/lib/gprpp/host_port.cc", "src/core/lib/gprpp/host_port.cc",
"src/core/lib/gprpp/host_port.h", "src/core/lib/gprpp/host_port.h",
"src/core/lib/gprpp/manual_constructor.h", "src/core/lib/gprpp/manual_constructor.h",
"src/core/lib/gprpp/map.h",
"src/core/lib/gprpp/memory.h", "src/core/lib/gprpp/memory.h",
"src/core/lib/gprpp/mpscq.cc", "src/core/lib/gprpp/mpscq.cc",
"src/core/lib/gprpp/mpscq.h", "src/core/lib/gprpp/mpscq.h",

@ -299,6 +299,7 @@ libs:
- src/core/lib/gprpp/global_config_generic.h - src/core/lib/gprpp/global_config_generic.h
- src/core/lib/gprpp/host_port.h - src/core/lib/gprpp/host_port.h
- src/core/lib/gprpp/manual_constructor.h - src/core/lib/gprpp/manual_constructor.h
- src/core/lib/gprpp/map.h
- src/core/lib/gprpp/memory.h - src/core/lib/gprpp/memory.h
- src/core/lib/gprpp/mpscq.h - src/core/lib/gprpp/mpscq.h
- src/core/lib/gprpp/string_view.h - src/core/lib/gprpp/string_view.h

@ -419,6 +419,7 @@ Pod::Spec.new do |s|
'src/core/lib/gprpp/global_config_generic.h', 'src/core/lib/gprpp/global_config_generic.h',
'src/core/lib/gprpp/host_port.h', 'src/core/lib/gprpp/host_port.h',
'src/core/lib/gprpp/manual_constructor.h', 'src/core/lib/gprpp/manual_constructor.h',
'src/core/lib/gprpp/map.h',
'src/core/lib/gprpp/memory.h', 'src/core/lib/gprpp/memory.h',
'src/core/lib/gprpp/mpscq.h', 'src/core/lib/gprpp/mpscq.h',
'src/core/lib/gprpp/orphanable.h', 'src/core/lib/gprpp/orphanable.h',
@ -868,6 +869,7 @@ Pod::Spec.new do |s|
'src/core/lib/gprpp/global_config_generic.h', 'src/core/lib/gprpp/global_config_generic.h',
'src/core/lib/gprpp/host_port.h', 'src/core/lib/gprpp/host_port.h',
'src/core/lib/gprpp/manual_constructor.h', 'src/core/lib/gprpp/manual_constructor.h',
'src/core/lib/gprpp/map.h',
'src/core/lib/gprpp/memory.h', 'src/core/lib/gprpp/memory.h',
'src/core/lib/gprpp/mpscq.h', 'src/core/lib/gprpp/mpscq.h',
'src/core/lib/gprpp/orphanable.h', 'src/core/lib/gprpp/orphanable.h',

@ -611,6 +611,7 @@ Pod::Spec.new do |s|
'src/core/lib/gprpp/host_port.cc', 'src/core/lib/gprpp/host_port.cc',
'src/core/lib/gprpp/host_port.h', 'src/core/lib/gprpp/host_port.h',
'src/core/lib/gprpp/manual_constructor.h', 'src/core/lib/gprpp/manual_constructor.h',
'src/core/lib/gprpp/map.h',
'src/core/lib/gprpp/memory.h', 'src/core/lib/gprpp/memory.h',
'src/core/lib/gprpp/mpscq.cc', 'src/core/lib/gprpp/mpscq.cc',
'src/core/lib/gprpp/mpscq.h', 'src/core/lib/gprpp/mpscq.h',
@ -1224,6 +1225,7 @@ Pod::Spec.new do |s|
'src/core/lib/gprpp/global_config_generic.h', 'src/core/lib/gprpp/global_config_generic.h',
'src/core/lib/gprpp/host_port.h', 'src/core/lib/gprpp/host_port.h',
'src/core/lib/gprpp/manual_constructor.h', 'src/core/lib/gprpp/manual_constructor.h',
'src/core/lib/gprpp/map.h',
'src/core/lib/gprpp/memory.h', 'src/core/lib/gprpp/memory.h',
'src/core/lib/gprpp/mpscq.h', 'src/core/lib/gprpp/mpscq.h',
'src/core/lib/gprpp/orphanable.h', 'src/core/lib/gprpp/orphanable.h',

@ -533,6 +533,7 @@ Gem::Specification.new do |s|
s.files += %w( src/core/lib/gprpp/host_port.cc ) s.files += %w( src/core/lib/gprpp/host_port.cc )
s.files += %w( src/core/lib/gprpp/host_port.h ) s.files += %w( src/core/lib/gprpp/host_port.h )
s.files += %w( src/core/lib/gprpp/manual_constructor.h ) s.files += %w( src/core/lib/gprpp/manual_constructor.h )
s.files += %w( src/core/lib/gprpp/map.h )
s.files += %w( src/core/lib/gprpp/memory.h ) s.files += %w( src/core/lib/gprpp/memory.h )
s.files += %w( src/core/lib/gprpp/mpscq.cc ) s.files += %w( src/core/lib/gprpp/mpscq.cc )
s.files += %w( src/core/lib/gprpp/mpscq.h ) s.files += %w( src/core/lib/gprpp/mpscq.h )

@ -513,6 +513,7 @@
<file baseinstalldir="/" name="src/core/lib/gprpp/host_port.cc" role="src" /> <file baseinstalldir="/" name="src/core/lib/gprpp/host_port.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/gprpp/host_port.h" role="src" /> <file baseinstalldir="/" name="src/core/lib/gprpp/host_port.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/gprpp/manual_constructor.h" role="src" /> <file baseinstalldir="/" name="src/core/lib/gprpp/manual_constructor.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/gprpp/map.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/gprpp/memory.h" role="src" /> <file baseinstalldir="/" name="src/core/lib/gprpp/memory.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/gprpp/mpscq.cc" role="src" /> <file baseinstalldir="/" name="src/core/lib/gprpp/mpscq.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/gprpp/mpscq.h" role="src" /> <file baseinstalldir="/" name="src/core/lib/gprpp/mpscq.h" role="src" />

@ -26,12 +26,12 @@ namespace grpc_core {
namespace { namespace {
template <typename EntryType> template <typename EntryType>
std::map<StringView, double> ParseMap( std::map<StringView, double, StringLess> ParseMap(
udpa_data_orca_v1_OrcaLoadReport* msg, udpa_data_orca_v1_OrcaLoadReport* msg,
EntryType** (*entry_func)(udpa_data_orca_v1_OrcaLoadReport*, size_t*), EntryType** (*entry_func)(udpa_data_orca_v1_OrcaLoadReport*, size_t*),
upb_strview (*key_func)(const EntryType*), upb_strview (*key_func)(const EntryType*),
double (*value_func)(const EntryType*), Arena* arena) { double (*value_func)(const EntryType*), Arena* arena) {
std::map<StringView, double> result; std::map<StringView, double, StringLess> result;
size_t size; size_t size;
const auto* const* entries = entry_func(msg, &size); const auto* const* entries = entry_func(msg, &size);
for (size_t i = 0; i < size; ++i) { for (size_t i = 0; i < size; ++i) {

@ -26,7 +26,6 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <map>
#include <set> #include <set>
#include <grpc/support/alloc.h> #include <grpc/support/alloc.h>
@ -57,6 +56,7 @@
#include "src/core/lib/channel/status_util.h" #include "src/core/lib/channel/status_util.h"
#include "src/core/lib/gpr/string.h" #include "src/core/lib/gpr/string.h"
#include "src/core/lib/gprpp/manual_constructor.h" #include "src/core/lib/gprpp/manual_constructor.h"
#include "src/core/lib/gprpp/map.h"
#include "src/core/lib/gprpp/sync.h" #include "src/core/lib/gprpp/sync.h"
#include "src/core/lib/iomgr/iomgr.h" #include "src/core/lib/iomgr/iomgr.h"
#include "src/core/lib/iomgr/polling_entity.h" #include "src/core/lib/iomgr/polling_entity.h"
@ -295,7 +295,7 @@ class ChannelData {
RefCountedPtr<SubchannelPoolInterface> subchannel_pool_; RefCountedPtr<SubchannelPoolInterface> subchannel_pool_;
OrphanablePtr<ResolvingLoadBalancingPolicy> resolving_lb_policy_; OrphanablePtr<ResolvingLoadBalancingPolicy> resolving_lb_policy_;
ConnectivityStateTracker state_tracker_; ConnectivityStateTracker state_tracker_;
std::string health_check_service_name_; grpc_core::UniquePtr<char> health_check_service_name_;
RefCountedPtr<ServiceConfig> saved_service_config_; RefCountedPtr<ServiceConfig> saved_service_config_;
bool received_first_resolver_result_ = false; bool received_first_resolver_result_ = false;
// The number of SubchannelWrapper instances referencing a given Subchannel. // The number of SubchannelWrapper instances referencing a given Subchannel.
@ -850,7 +850,7 @@ class CallData {
class ChannelData::SubchannelWrapper : public SubchannelInterface { class ChannelData::SubchannelWrapper : public SubchannelInterface {
public: public:
SubchannelWrapper(ChannelData* chand, Subchannel* subchannel, SubchannelWrapper(ChannelData* chand, Subchannel* subchannel,
std::string health_check_service_name) grpc_core::UniquePtr<char> health_check_service_name)
: SubchannelInterface(&grpc_client_channel_routing_trace), : SubchannelInterface(&grpc_client_channel_routing_trace),
chand_(chand), chand_(chand),
subchannel_(subchannel), subchannel_(subchannel),
@ -897,7 +897,7 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface {
grpc_connectivity_state CheckConnectivityState() override { grpc_connectivity_state CheckConnectivityState() override {
RefCountedPtr<ConnectedSubchannel> connected_subchannel; RefCountedPtr<ConnectedSubchannel> connected_subchannel;
grpc_connectivity_state connectivity_state = grpc_connectivity_state connectivity_state =
subchannel_->CheckConnectivityState(health_check_service_name_, subchannel_->CheckConnectivityState(health_check_service_name_.get(),
&connected_subchannel); &connected_subchannel);
MaybeUpdateConnectedSubchannel(std::move(connected_subchannel)); MaybeUpdateConnectedSubchannel(std::move(connected_subchannel));
return connectivity_state; return connectivity_state;
@ -912,7 +912,9 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface {
Ref(DEBUG_LOCATION, "WatcherWrapper"), Ref(DEBUG_LOCATION, "WatcherWrapper"),
initial_state); initial_state);
subchannel_->WatchConnectivityState( subchannel_->WatchConnectivityState(
initial_state, health_check_service_name_, initial_state,
grpc_core::UniquePtr<char>(
gpr_strdup(health_check_service_name_.get())),
RefCountedPtr<Subchannel::ConnectivityStateWatcherInterface>( RefCountedPtr<Subchannel::ConnectivityStateWatcherInterface>(
watcher_wrapper)); watcher_wrapper));
} }
@ -921,7 +923,7 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface {
ConnectivityStateWatcherInterface* watcher) override { ConnectivityStateWatcherInterface* watcher) override {
auto it = watcher_map_.find(watcher); auto it = watcher_map_.find(watcher);
GPR_ASSERT(it != watcher_map_.end()); GPR_ASSERT(it != watcher_map_.end());
subchannel_->CancelConnectivityStateWatch(health_check_service_name_, subchannel_->CancelConnectivityStateWatch(health_check_service_name_.get(),
it->second); it->second);
watcher_map_.erase(it); watcher_map_.erase(it);
} }
@ -934,13 +936,14 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface {
return subchannel_->channel_args(); return subchannel_->channel_args();
} }
void UpdateHealthCheckServiceName(std::string health_check_service_name) { void UpdateHealthCheckServiceName(
grpc_core::UniquePtr<char> health_check_service_name) {
if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) { if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
gpr_log(GPR_INFO, gpr_log(GPR_INFO,
"chand=%p: subchannel wrapper %p: updating health check service " "chand=%p: subchannel wrapper %p: updating health check service "
"name from \"%s\" to \"%s\"", "name from \"%s\" to \"%s\"",
chand_, this, health_check_service_name_.c_str(), chand_, this, health_check_service_name_.get(),
health_check_service_name.c_str()); health_check_service_name.get());
} }
for (auto& p : watcher_map_) { for (auto& p : watcher_map_) {
WatcherWrapper*& watcher_wrapper = p.second; WatcherWrapper*& watcher_wrapper = p.second;
@ -955,11 +958,13 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface {
// problem, we may be able to handle it by waiting for the new // problem, we may be able to handle it by waiting for the new
// watcher to report READY before we use it to replace the old one. // watcher to report READY before we use it to replace the old one.
WatcherWrapper* replacement = watcher_wrapper->MakeReplacement(); WatcherWrapper* replacement = watcher_wrapper->MakeReplacement();
subchannel_->CancelConnectivityStateWatch(health_check_service_name_, subchannel_->CancelConnectivityStateWatch(
watcher_wrapper); health_check_service_name_.get(), watcher_wrapper);
watcher_wrapper = replacement; watcher_wrapper = replacement;
subchannel_->WatchConnectivityState( subchannel_->WatchConnectivityState(
replacement->last_seen_state(), health_check_service_name, replacement->last_seen_state(),
grpc_core::UniquePtr<char>(
gpr_strdup(health_check_service_name.get())),
RefCountedPtr<Subchannel::ConnectivityStateWatcherInterface>( RefCountedPtr<Subchannel::ConnectivityStateWatcherInterface>(
replacement)); replacement));
} }
@ -1097,7 +1102,7 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface {
ChannelData* chand_; ChannelData* chand_;
Subchannel* subchannel_; Subchannel* subchannel_;
std::string health_check_service_name_; grpc_core::UniquePtr<char> health_check_service_name_;
// Maps from the address of the watcher passed to us by the LB policy // Maps from the address of the watcher passed to us by the LB policy
// to the address of the WrapperWatcher that we passed to the underlying // to the address of the WrapperWatcher that we passed to the underlying
// subchannel. This is needed so that when the LB policy calls // subchannel. This is needed so that when the LB policy calls
@ -1260,9 +1265,10 @@ class ChannelData::ClientChannelControlHelper
const grpc_channel_args& args) override { const grpc_channel_args& args) override {
bool inhibit_health_checking = grpc_channel_arg_get_bool( bool inhibit_health_checking = grpc_channel_arg_get_bool(
grpc_channel_args_find(&args, GRPC_ARG_INHIBIT_HEALTH_CHECKING), false); grpc_channel_args_find(&args, GRPC_ARG_INHIBIT_HEALTH_CHECKING), false);
std::string health_check_service_name; grpc_core::UniquePtr<char> health_check_service_name;
if (!inhibit_health_checking) { if (!inhibit_health_checking) {
health_check_service_name = chand_->health_check_service_name_; health_check_service_name.reset(
gpr_strdup(chand_->health_check_service_name_.get()));
} }
static const char* args_to_remove[] = { static const char* args_to_remove[] = {
GRPC_ARG_INHIBIT_HEALTH_CHECKING, GRPC_ARG_INHIBIT_HEALTH_CHECKING,
@ -1457,7 +1463,7 @@ void ChannelData::UpdateStateAndPickerLocked(
std::unique_ptr<LoadBalancingPolicy::SubchannelPicker> picker) { std::unique_ptr<LoadBalancingPolicy::SubchannelPicker> picker) {
// Clean the control plane when entering IDLE. // Clean the control plane when entering IDLE.
if (picker_ == nullptr) { if (picker_ == nullptr) {
health_check_service_name_.clear(); health_check_service_name_.reset();
saved_service_config_.reset(); saved_service_config_.reset();
received_first_resolver_result_ = false; received_first_resolver_result_ = false;
} }
@ -1700,15 +1706,16 @@ bool ChannelData::ProcessResolverResultLocked(
} }
// Save health check service name. // Save health check service name.
if (service_config != nullptr) { if (service_config != nullptr) {
chand->health_check_service_name_ = chand->health_check_service_name_.reset(
parsed_service_config->health_check_service_name(); gpr_strdup(parsed_service_config->health_check_service_name()));
} else { } else {
chand->health_check_service_name_.clear(); chand->health_check_service_name_.reset();
} }
// Update health check service name used by existing subchannel wrappers. // Update health check service name used by existing subchannel wrappers.
for (auto* subchannel_wrapper : chand->subchannel_wrappers_) { for (auto* subchannel_wrapper : chand->subchannel_wrappers_) {
subchannel_wrapper->UpdateHealthCheckServiceName( subchannel_wrapper->UpdateHealthCheckServiceName(
chand->health_check_service_name_); grpc_core::UniquePtr<char>(
gpr_strdup(chand->health_check_service_name_.get())));
} }
// Save service config. // Save service config.
chand->saved_service_config_ = std::move(service_config); chand->saved_service_config_ = std::move(service_config);

@ -44,7 +44,7 @@ TraceFlag grpc_health_check_client_trace(false, "health_check_client");
// //
HealthCheckClient::HealthCheckClient( HealthCheckClient::HealthCheckClient(
absl::string_view service_name, const char* service_name,
RefCountedPtr<ConnectedSubchannel> connected_subchannel, RefCountedPtr<ConnectedSubchannel> connected_subchannel,
grpc_pollset_set* interested_parties, grpc_pollset_set* interested_parties,
RefCountedPtr<channelz::SubchannelNode> channelz_node, RefCountedPtr<channelz::SubchannelNode> channelz_node,
@ -171,14 +171,13 @@ void HealthCheckClient::OnRetryTimer(void* arg, grpc_error* error) {
namespace { namespace {
void EncodeRequest(absl::string_view service_name, void EncodeRequest(const char* service_name,
ManualConstructor<SliceBufferByteStream>* send_message) { ManualConstructor<SliceBufferByteStream>* send_message) {
upb::Arena arena; upb::Arena arena;
grpc_health_v1_HealthCheckRequest* request_struct = grpc_health_v1_HealthCheckRequest* request_struct =
grpc_health_v1_HealthCheckRequest_new(arena.ptr()); grpc_health_v1_HealthCheckRequest_new(arena.ptr());
grpc_health_v1_HealthCheckRequest_set_service( grpc_health_v1_HealthCheckRequest_set_service(
request_struct, request_struct, upb_strview_makez(service_name));
upb_strview_make(service_name.data(), service_name.size()));
size_t buf_length; size_t buf_length;
char* buf = grpc_health_v1_HealthCheckRequest_serialize( char* buf = grpc_health_v1_HealthCheckRequest_serialize(
request_struct, arena.ptr(), &buf_length); request_struct, arena.ptr(), &buf_length);

@ -21,8 +21,6 @@
#include <grpc/support/port_platform.h> #include <grpc/support/port_platform.h>
#include "absl/strings/string_view.h"
#include <grpc/grpc.h> #include <grpc/grpc.h>
#include <grpc/support/sync.h> #include <grpc/support/sync.h>
@ -46,7 +44,7 @@ namespace grpc_core {
class HealthCheckClient : public InternallyRefCounted<HealthCheckClient> { class HealthCheckClient : public InternallyRefCounted<HealthCheckClient> {
public: public:
HealthCheckClient(absl::string_view service_name, HealthCheckClient(const char* service_name,
RefCountedPtr<ConnectedSubchannel> connected_subchannel, RefCountedPtr<ConnectedSubchannel> connected_subchannel,
grpc_pollset_set* interested_parties, grpc_pollset_set* interested_parties,
RefCountedPtr<channelz::SubchannelNode> channelz_node, RefCountedPtr<channelz::SubchannelNode> channelz_node,
@ -152,7 +150,7 @@ class HealthCheckClient : public InternallyRefCounted<HealthCheckClient> {
void SetHealthStatusLocked(grpc_connectivity_state state, void SetHealthStatusLocked(grpc_connectivity_state state,
const char* reason); // Requires holding mu_. const char* reason); // Requires holding mu_.
absl::string_view service_name_; const char* service_name_; // Do not own.
RefCountedPtr<ConnectedSubchannel> connected_subchannel_; RefCountedPtr<ConnectedSubchannel> connected_subchannel_;
grpc_pollset_set* interested_parties_; // Do not own. grpc_pollset_set* interested_parties_; // Do not own.
RefCountedPtr<channelz::SubchannelNode> channelz_node_; RefCountedPtr<channelz::SubchannelNode> channelz_node_;

@ -27,6 +27,7 @@
#include "src/core/ext/filters/client_channel/server_address.h" #include "src/core/ext/filters/client_channel/server_address.h"
#include "src/core/ext/filters/client_channel/service_config.h" #include "src/core/ext/filters/client_channel/service_config.h"
#include "src/core/ext/filters/client_channel/subchannel_interface.h" #include "src/core/ext/filters/client_channel/subchannel_interface.h"
#include "src/core/lib/gprpp/map.h"
#include "src/core/lib/gprpp/orphanable.h" #include "src/core/lib/gprpp/orphanable.h"
#include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/gprpp/ref_counted_ptr.h"
#include "src/core/lib/gprpp/string_view.h" #include "src/core/lib/gprpp/string_view.h"
@ -92,11 +93,11 @@ class LoadBalancingPolicy : public InternallyRefCounted<LoadBalancingPolicy> {
/// Application-specific requests cost metrics. Metric names are /// Application-specific requests cost metrics. Metric names are
/// determined by the application. Each value is an absolute cost /// determined by the application. Each value is an absolute cost
/// (e.g. 3487 bytes of storage) associated with the request. /// (e.g. 3487 bytes of storage) associated with the request.
std::map<StringView, double> request_cost; std::map<StringView, double, StringLess> request_cost;
/// Application-specific resource utilization metrics. Metric names /// Application-specific resource utilization metrics. Metric names
/// are determined by the application. Each value is expressed as a /// are determined by the application. Each value is expressed as a
/// fraction of total resources available. /// fraction of total resources available.
std::map<StringView, double> utilization; std::map<StringView, double, StringLess> utilization;
}; };
/// Interface for accessing per-call state. /// Interface for accessing per-call state.

@ -284,13 +284,13 @@ grpc_error* ParseRetryThrottling(
return GRPC_ERROR_CREATE_FROM_VECTOR("retryPolicy", &error_list); return GRPC_ERROR_CREATE_FROM_VECTOR("retryPolicy", &error_list);
} }
std::string ParseHealthCheckConfig(const Json& field, grpc_error** error) { const char* ParseHealthCheckConfig(const Json& field, grpc_error** error) {
GPR_DEBUG_ASSERT(error != nullptr && *error == GRPC_ERROR_NONE); GPR_DEBUG_ASSERT(error != nullptr && *error == GRPC_ERROR_NONE);
std::string service_name; const char* service_name = nullptr;
if (field.type() != Json::Type::OBJECT) { if (field.type() != Json::Type::OBJECT) {
*error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
"field:healthCheckConfig error:should be of type object"); "field:healthCheckConfig error:should be of type object");
return service_name; return nullptr;
} }
std::vector<grpc_error*> error_list; std::vector<grpc_error*> error_list;
auto it = field.object_value().find("serviceName"); auto it = field.object_value().find("serviceName");
@ -299,9 +299,12 @@ std::string ParseHealthCheckConfig(const Json& field, grpc_error** error) {
error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
"field:serviceName error:should be of type string")); "field:serviceName error:should be of type string"));
} else { } else {
service_name = it->second.string_value(); service_name = it->second.string_value().c_str();
} }
} }
if (!error_list.empty()) {
return nullptr;
}
*error = *error =
GRPC_ERROR_CREATE_FROM_VECTOR("field:healthCheckConfig", &error_list); GRPC_ERROR_CREATE_FROM_VECTOR("field:healthCheckConfig", &error_list);
return service_name; return service_name;
@ -318,7 +321,7 @@ ClientChannelServiceConfigParser::ParseGlobalParams(const Json& json,
std::string lb_policy_name; std::string lb_policy_name;
absl::optional<ClientChannelGlobalParsedConfig::RetryThrottling> absl::optional<ClientChannelGlobalParsedConfig::RetryThrottling>
retry_throttling; retry_throttling;
std::string health_check_service_name; const char* health_check_service_name = nullptr;
// Parse LB config. // Parse LB config.
auto it = json.object_value().find("loadBalancingConfig"); auto it = json.object_value().find("loadBalancingConfig");
if (it != json.object_value().end()) { if (it != json.object_value().end()) {
@ -385,7 +388,7 @@ ClientChannelServiceConfigParser::ParseGlobalParams(const Json& json,
if (*error == GRPC_ERROR_NONE) { if (*error == GRPC_ERROR_NONE) {
return absl::make_unique<ClientChannelGlobalParsedConfig>( return absl::make_unique<ClientChannelGlobalParsedConfig>(
std::move(parsed_lb_config), std::move(lb_policy_name), std::move(parsed_lb_config), std::move(lb_policy_name),
retry_throttling, std::move(health_check_service_name)); retry_throttling, health_check_service_name);
} }
return nullptr; return nullptr;
} }

@ -49,7 +49,7 @@ class ClientChannelGlobalParsedConfig : public ServiceConfig::ParsedConfig {
RefCountedPtr<LoadBalancingPolicy::Config> parsed_lb_config, RefCountedPtr<LoadBalancingPolicy::Config> parsed_lb_config,
std::string parsed_deprecated_lb_policy, std::string parsed_deprecated_lb_policy,
const absl::optional<RetryThrottling>& retry_throttling, const absl::optional<RetryThrottling>& retry_throttling,
std::string health_check_service_name) const char* health_check_service_name)
: parsed_lb_config_(std::move(parsed_lb_config)), : parsed_lb_config_(std::move(parsed_lb_config)),
parsed_deprecated_lb_policy_(std::move(parsed_deprecated_lb_policy)), parsed_deprecated_lb_policy_(std::move(parsed_deprecated_lb_policy)),
retry_throttling_(retry_throttling), retry_throttling_(retry_throttling),
@ -67,7 +67,7 @@ class ClientChannelGlobalParsedConfig : public ServiceConfig::ParsedConfig {
return parsed_deprecated_lb_policy_; return parsed_deprecated_lb_policy_;
} }
const std::string& health_check_service_name() const { const char* health_check_service_name() const {
return health_check_service_name_; return health_check_service_name_;
} }
@ -75,7 +75,7 @@ class ClientChannelGlobalParsedConfig : public ServiceConfig::ParsedConfig {
RefCountedPtr<LoadBalancingPolicy::Config> parsed_lb_config_; RefCountedPtr<LoadBalancingPolicy::Config> parsed_lb_config_;
std::string parsed_deprecated_lb_policy_; std::string parsed_deprecated_lb_policy_;
absl::optional<RetryThrottling> retry_throttling_; absl::optional<RetryThrottling> retry_throttling_;
std::string health_check_service_name_; const char* health_check_service_name_;
}; };
class ClientChannelMethodParsedConfig : public ServiceConfig::ParsedConfig { class ClientChannelMethodParsedConfig : public ServiceConfig::ParsedConfig {

@ -424,10 +424,11 @@ void Subchannel::ConnectivityStateWatcherList::NotifyLocked(
class Subchannel::HealthWatcherMap::HealthWatcher class Subchannel::HealthWatcherMap::HealthWatcher
: public AsyncConnectivityStateWatcherInterface { : public AsyncConnectivityStateWatcherInterface {
public: public:
HealthWatcher(Subchannel* c, absl::string_view health_check_service_name, HealthWatcher(Subchannel* c,
grpc_core::UniquePtr<char> health_check_service_name,
grpc_connectivity_state subchannel_state) grpc_connectivity_state subchannel_state)
: subchannel_(c), : subchannel_(c),
health_check_service_name_(std::string(health_check_service_name)), health_check_service_name_(std::move(health_check_service_name)),
state_(subchannel_state == GRPC_CHANNEL_READY ? GRPC_CHANNEL_CONNECTING state_(subchannel_state == GRPC_CHANNEL_READY ? GRPC_CHANNEL_CONNECTING
: subchannel_state) { : subchannel_state) {
GRPC_SUBCHANNEL_WEAK_REF(subchannel_, "health_watcher"); GRPC_SUBCHANNEL_WEAK_REF(subchannel_, "health_watcher");
@ -439,8 +440,8 @@ class Subchannel::HealthWatcherMap::HealthWatcher
GRPC_SUBCHANNEL_WEAK_UNREF(subchannel_, "health_watcher"); GRPC_SUBCHANNEL_WEAK_UNREF(subchannel_, "health_watcher");
} }
absl::string_view health_check_service_name() const { const char* health_check_service_name() const {
return health_check_service_name_; return health_check_service_name_.get();
} }
grpc_connectivity_state state() const { return state_; } grpc_connectivity_state state() const { return state_; }
@ -499,12 +500,12 @@ class Subchannel::HealthWatcherMap::HealthWatcher
void StartHealthCheckingLocked() { void StartHealthCheckingLocked() {
GPR_ASSERT(health_check_client_ == nullptr); GPR_ASSERT(health_check_client_ == nullptr);
health_check_client_ = MakeOrphanable<HealthCheckClient>( health_check_client_ = MakeOrphanable<HealthCheckClient>(
health_check_service_name_, subchannel_->connected_subchannel_, health_check_service_name_.get(), subchannel_->connected_subchannel_,
subchannel_->pollset_set_, subchannel_->channelz_node_, Ref()); subchannel_->pollset_set_, subchannel_->channelz_node_, Ref());
} }
Subchannel* subchannel_; Subchannel* subchannel_;
std::string health_check_service_name_; grpc_core::UniquePtr<char> health_check_service_name_;
OrphanablePtr<HealthCheckClient> health_check_client_; OrphanablePtr<HealthCheckClient> health_check_client_;
grpc_connectivity_state state_; grpc_connectivity_state state_;
ConnectivityStateWatcherList watcher_list_; ConnectivityStateWatcherList watcher_list_;
@ -516,17 +517,18 @@ class Subchannel::HealthWatcherMap::HealthWatcher
void Subchannel::HealthWatcherMap::AddWatcherLocked( void Subchannel::HealthWatcherMap::AddWatcherLocked(
Subchannel* subchannel, grpc_connectivity_state initial_state, Subchannel* subchannel, grpc_connectivity_state initial_state,
absl::string_view health_check_service_name, grpc_core::UniquePtr<char> health_check_service_name,
RefCountedPtr<ConnectivityStateWatcherInterface> watcher) { RefCountedPtr<ConnectivityStateWatcherInterface> watcher) {
// If the health check service name is not already present in the map, // If the health check service name is not already present in the map,
// add it. // add it.
auto it = map_.find(health_check_service_name); auto it = map_.find(health_check_service_name.get());
HealthWatcher* health_watcher; HealthWatcher* health_watcher;
if (it == map_.end()) { if (it == map_.end()) {
const char* key = health_check_service_name.get();
auto w = MakeOrphanable<HealthWatcher>( auto w = MakeOrphanable<HealthWatcher>(
subchannel, health_check_service_name, subchannel->state_); subchannel, std::move(health_check_service_name), subchannel->state_);
health_watcher = w.get(); health_watcher = w.get();
map_[w->health_check_service_name()] = std::move(w); map_[key] = std::move(w);
} else { } else {
health_watcher = it->second.get(); health_watcher = it->second.get();
} }
@ -535,7 +537,7 @@ void Subchannel::HealthWatcherMap::AddWatcherLocked(
} }
void Subchannel::HealthWatcherMap::RemoveWatcherLocked( void Subchannel::HealthWatcherMap::RemoveWatcherLocked(
absl::string_view health_check_service_name, const char* health_check_service_name,
ConnectivityStateWatcherInterface* watcher) { ConnectivityStateWatcherInterface* watcher) {
auto it = map_.find(health_check_service_name); auto it = map_.find(health_check_service_name);
GPR_ASSERT(it != map_.end()); GPR_ASSERT(it != map_.end());
@ -553,7 +555,7 @@ void Subchannel::HealthWatcherMap::NotifyLocked(grpc_connectivity_state state) {
grpc_connectivity_state grpc_connectivity_state
Subchannel::HealthWatcherMap::CheckConnectivityStateLocked( Subchannel::HealthWatcherMap::CheckConnectivityStateLocked(
Subchannel* subchannel, absl::string_view health_check_service_name) { Subchannel* subchannel, const char* health_check_service_name) {
auto it = map_.find(health_check_service_name); auto it = map_.find(health_check_service_name);
if (it == map_.end()) { if (it == map_.end()) {
// If the health check service name is not found in the map, we're // If the health check service name is not found in the map, we're
@ -797,11 +799,11 @@ channelz::SubchannelNode* Subchannel::channelz_node() {
} }
grpc_connectivity_state Subchannel::CheckConnectivityState( grpc_connectivity_state Subchannel::CheckConnectivityState(
absl::string_view health_check_service_name, const char* health_check_service_name,
RefCountedPtr<ConnectedSubchannel>* connected_subchannel) { RefCountedPtr<ConnectedSubchannel>* connected_subchannel) {
MutexLock lock(&mu_); MutexLock lock(&mu_);
grpc_connectivity_state state; grpc_connectivity_state state;
if (health_check_service_name.empty()) { if (health_check_service_name == nullptr) {
state = state_; state = state_;
} else { } else {
state = health_watcher_map_.CheckConnectivityStateLocked( state = health_watcher_map_.CheckConnectivityStateLocked(
@ -815,33 +817,34 @@ grpc_connectivity_state Subchannel::CheckConnectivityState(
void Subchannel::WatchConnectivityState( void Subchannel::WatchConnectivityState(
grpc_connectivity_state initial_state, grpc_connectivity_state initial_state,
absl::string_view health_check_service_name, grpc_core::UniquePtr<char> health_check_service_name,
RefCountedPtr<ConnectivityStateWatcherInterface> watcher) { RefCountedPtr<ConnectivityStateWatcherInterface> watcher) {
MutexLock lock(&mu_); MutexLock lock(&mu_);
grpc_pollset_set* interested_parties = watcher->interested_parties(); grpc_pollset_set* interested_parties = watcher->interested_parties();
if (interested_parties != nullptr) { if (interested_parties != nullptr) {
grpc_pollset_set_add_pollset_set(pollset_set_, interested_parties); grpc_pollset_set_add_pollset_set(pollset_set_, interested_parties);
} }
if (health_check_service_name.empty()) { if (health_check_service_name == nullptr) {
if (state_ != initial_state) { if (state_ != initial_state) {
new AsyncWatcherNotifierLocked(watcher, this, state_); new AsyncWatcherNotifierLocked(watcher, this, state_);
} }
watcher_list_.AddWatcherLocked(std::move(watcher)); watcher_list_.AddWatcherLocked(std::move(watcher));
} else { } else {
health_watcher_map_.AddWatcherLocked( health_watcher_map_.AddWatcherLocked(this, initial_state,
this, initial_state, health_check_service_name, std::move(watcher)); std::move(health_check_service_name),
std::move(watcher));
} }
} }
void Subchannel::CancelConnectivityStateWatch( void Subchannel::CancelConnectivityStateWatch(
absl::string_view health_check_service_name, const char* health_check_service_name,
ConnectivityStateWatcherInterface* watcher) { ConnectivityStateWatcherInterface* watcher) {
MutexLock lock(&mu_); MutexLock lock(&mu_);
grpc_pollset_set* interested_parties = watcher->interested_parties(); grpc_pollset_set* interested_parties = watcher->interested_parties();
if (interested_parties != nullptr) { if (interested_parties != nullptr) {
grpc_pollset_set_del_pollset_set(pollset_set_, interested_parties); grpc_pollset_set_del_pollset_set(pollset_set_, interested_parties);
} }
if (health_check_service_name.empty()) { if (health_check_service_name == nullptr) {
watcher_list_.RemoveWatcherLocked(watcher); watcher_list_.RemoveWatcherLocked(watcher);
} else { } else {
health_watcher_map_.RemoveWatcherLocked(health_check_service_name, watcher); health_watcher_map_.RemoveWatcherLocked(health_check_service_name, watcher);

@ -23,8 +23,6 @@
#include <deque> #include <deque>
#include "absl/strings/string_view.h"
#include "src/core/ext/filters/client_channel/client_channel_channelz.h" #include "src/core/ext/filters/client_channel/client_channel_channelz.h"
#include "src/core/ext/filters/client_channel/connector.h" #include "src/core/ext/filters/client_channel/connector.h"
#include "src/core/ext/filters/client_channel/subchannel_pool_interface.h" #include "src/core/ext/filters/client_channel/subchannel_pool_interface.h"
@ -32,6 +30,7 @@
#include "src/core/lib/channel/channel_stack.h" #include "src/core/lib/channel/channel_stack.h"
#include "src/core/lib/gpr/time_precise.h" #include "src/core/lib/gpr/time_precise.h"
#include "src/core/lib/gprpp/arena.h" #include "src/core/lib/gprpp/arena.h"
#include "src/core/lib/gprpp/map.h"
#include "src/core/lib/gprpp/ref_counted.h" #include "src/core/lib/gprpp/ref_counted.h"
#include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/gprpp/ref_counted_ptr.h"
#include "src/core/lib/gprpp/sync.h" #include "src/core/lib/gprpp/sync.h"
@ -252,7 +251,7 @@ class Subchannel {
// service name. // service name.
// If the return value is GRPC_CHANNEL_READY, also sets *connected_subchannel. // If the return value is GRPC_CHANNEL_READY, also sets *connected_subchannel.
grpc_connectivity_state CheckConnectivityState( grpc_connectivity_state CheckConnectivityState(
absl::string_view health_check_service_name, const char* health_check_service_name,
RefCountedPtr<ConnectedSubchannel>* connected_subchannel); RefCountedPtr<ConnectedSubchannel>* connected_subchannel);
// Starts watching the subchannel's connectivity state. // Starts watching the subchannel's connectivity state.
@ -265,12 +264,12 @@ class Subchannel {
// destroyed or when CancelConnectivityStateWatch() is called. // destroyed or when CancelConnectivityStateWatch() is called.
void WatchConnectivityState( void WatchConnectivityState(
grpc_connectivity_state initial_state, grpc_connectivity_state initial_state,
absl::string_view health_check_service_name, grpc_core::UniquePtr<char> health_check_service_name,
RefCountedPtr<ConnectivityStateWatcherInterface> watcher); RefCountedPtr<ConnectivityStateWatcherInterface> watcher);
// Cancels a connectivity state watch. // Cancels a connectivity state watch.
// If the watcher has already been destroyed, this is a no-op. // If the watcher has already been destroyed, this is a no-op.
void CancelConnectivityStateWatch(absl::string_view health_check_service_name, void CancelConnectivityStateWatch(const char* health_check_service_name,
ConnectivityStateWatcherInterface* watcher); ConnectivityStateWatcherInterface* watcher);
// Attempt to connect to the backend. Has no effect if already connected. // Attempt to connect to the backend. Has no effect if already connected.
@ -334,24 +333,23 @@ class Subchannel {
public: public:
void AddWatcherLocked( void AddWatcherLocked(
Subchannel* subchannel, grpc_connectivity_state initial_state, Subchannel* subchannel, grpc_connectivity_state initial_state,
absl::string_view health_check_service_name, grpc_core::UniquePtr<char> health_check_service_name,
RefCountedPtr<ConnectivityStateWatcherInterface> watcher); RefCountedPtr<ConnectivityStateWatcherInterface> watcher);
void RemoveWatcherLocked(absl::string_view health_check_service_name, void RemoveWatcherLocked(const char* health_check_service_name,
ConnectivityStateWatcherInterface* watcher); ConnectivityStateWatcherInterface* watcher);
// Notifies the watcher when the subchannel's state changes. // Notifies the watcher when the subchannel's state changes.
void NotifyLocked(grpc_connectivity_state state); void NotifyLocked(grpc_connectivity_state state);
grpc_connectivity_state CheckConnectivityStateLocked( grpc_connectivity_state CheckConnectivityStateLocked(
Subchannel* subchannel, absl::string_view health_check_service_name); Subchannel* subchannel, const char* health_check_service_name);
void ShutdownLocked(); void ShutdownLocked();
private: private:
class HealthWatcher; class HealthWatcher;
// Key points to the health_check_service_name_ field in the value object. std::map<const char*, OrphanablePtr<HealthWatcher>, StringLess> map_;
std::map<absl::string_view, OrphanablePtr<HealthWatcher>> map_;
}; };
class ConnectedSubchannelStateWatcher; class ConnectedSubchannelStateWatcher;

@ -27,6 +27,7 @@
#include <grpc/impl/codegen/slice.h> #include <grpc/impl/codegen/slice.h>
#include "src/core/lib/gprpp/map.h"
#include "src/core/lib/gprpp/memory.h" #include "src/core/lib/gprpp/memory.h"
#include "src/core/lib/iomgr/error.h" #include "src/core/lib/iomgr/error.h"
#include "src/core/lib/json/json.h" #include "src/core/lib/json/json.h"

@ -22,8 +22,6 @@
#include <limits.h> #include <limits.h>
#include <string.h> #include <string.h>
#include <map>
#include "absl/container/inlined_vector.h" #include "absl/container/inlined_vector.h"
#include "absl/strings/str_format.h" #include "absl/strings/str_format.h"
#include "absl/strings/str_join.h" #include "absl/strings/str_join.h"
@ -47,6 +45,7 @@
#include "src/core/lib/channel/channel_args.h" #include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/channel/channel_stack.h" #include "src/core/lib/channel/channel_stack.h"
#include "src/core/lib/gpr/string.h" #include "src/core/lib/gpr/string.h"
#include "src/core/lib/gprpp/map.h"
#include "src/core/lib/gprpp/memory.h" #include "src/core/lib/gprpp/memory.h"
#include "src/core/lib/gprpp/orphanable.h" #include "src/core/lib/gprpp/orphanable.h"
#include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/gprpp/ref_counted_ptr.h"

@ -19,7 +19,6 @@
#include <grpc/support/port_platform.h> #include <grpc/support/port_platform.h>
#include <map>
#include <set> #include <set>
#include "absl/types/optional.h" #include "absl/types/optional.h"
@ -28,6 +27,7 @@
#include "src/core/ext/filters/client_channel/xds/xds_api.h" #include "src/core/ext/filters/client_channel/xds/xds_api.h"
#include "src/core/ext/filters/client_channel/xds/xds_bootstrap.h" #include "src/core/ext/filters/client_channel/xds/xds_bootstrap.h"
#include "src/core/ext/filters/client_channel/xds/xds_client_stats.h" #include "src/core/ext/filters/client_channel/xds/xds_client_stats.h"
#include "src/core/lib/gprpp/map.h"
#include "src/core/lib/gprpp/memory.h" #include "src/core/lib/gprpp/memory.h"
#include "src/core/lib/gprpp/orphanable.h" #include "src/core/lib/gprpp/orphanable.h"
#include "src/core/lib/gprpp/ref_counted.h" #include "src/core/lib/gprpp/ref_counted.h"

@ -21,14 +21,12 @@
#include <grpc/support/port_platform.h> #include <grpc/support/port_platform.h>
#include <map>
#include <grpc/support/string_util.h> #include <grpc/support/string_util.h>
#include "src/core/lib/gprpp/atomic.h" #include "src/core/lib/gprpp/atomic.h"
#include "src/core/lib/gprpp/map.h"
#include "src/core/lib/gprpp/memory.h" #include "src/core/lib/gprpp/memory.h"
#include "src/core/lib/gprpp/ref_counted.h" #include "src/core/lib/gprpp/ref_counted.h"
#include "src/core/lib/gprpp/string_view.h"
#include "src/core/lib/gprpp/sync.h" #include "src/core/lib/gprpp/sync.h"
#include "src/core/lib/iomgr/exec_ctx.h" #include "src/core/lib/iomgr/exec_ctx.h"

@ -23,7 +23,6 @@
#include <grpc/grpc.h> #include <grpc/grpc.h>
#include <map>
#include <string> #include <string>
#include "absl/container/inlined_vector.h" #include "absl/container/inlined_vector.h"
@ -32,6 +31,7 @@
#include "src/core/lib/gpr/time_precise.h" #include "src/core/lib/gpr/time_precise.h"
#include "src/core/lib/gprpp/atomic.h" #include "src/core/lib/gprpp/atomic.h"
#include "src/core/lib/gprpp/manual_constructor.h" #include "src/core/lib/gprpp/manual_constructor.h"
#include "src/core/lib/gprpp/map.h"
#include "src/core/lib/gprpp/ref_counted.h" #include "src/core/lib/gprpp/ref_counted.h"
#include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/gprpp/ref_counted_ptr.h"
#include "src/core/lib/gprpp/sync.h" #include "src/core/lib/gprpp/sync.h"

@ -23,10 +23,9 @@
#include <stdint.h> #include <stdint.h>
#include <map>
#include "src/core/lib/channel/channel_trace.h" #include "src/core/lib/channel/channel_trace.h"
#include "src/core/lib/channel/channelz.h" #include "src/core/lib/channel/channelz.h"
#include "src/core/lib/gprpp/map.h"
#include "src/core/lib/gprpp/sync.h" #include "src/core/lib/gprpp/sync.h"
namespace grpc_core { namespace grpc_core {

@ -0,0 +1,51 @@
/*
*
* Copyright 2017 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.
*
*/
#ifndef GRPC_CORE_LIB_GPRPP_MAP_H
#define GRPC_CORE_LIB_GPRPP_MAP_H
#include <grpc/support/port_platform.h>
#include <string.h>
#include <map>
#include "src/core/lib/gprpp/ref_counted_ptr.h"
#include "src/core/lib/gprpp/string_view.h"
namespace grpc_core {
struct StringLess {
bool operator()(const char* a, const char* b) const {
return strcmp(a, b) < 0;
}
bool operator()(const grpc_core::UniquePtr<char>& a,
const grpc_core::UniquePtr<char>& b) const {
return strcmp(a.get(), b.get()) < 0;
}
bool operator()(const StringView& a, const StringView& b) const {
const size_t min_size = std::min(a.size(), b.size());
int c = strncmp(a.data(), b.data(), min_size);
if (c != 0) return c < 0;
return a.size() < b.size();
}
};
} // namespace grpc_core
#endif /* GRPC_CORE_LIB_GPRPP_MAP_H */

@ -21,12 +21,11 @@
#include <grpc/support/port_platform.h> #include <grpc/support/port_platform.h>
#include <map>
#include <grpc/grpc.h> #include <grpc/grpc.h>
#include "src/core/lib/debug/trace.h" #include "src/core/lib/debug/trace.h"
#include "src/core/lib/gprpp/atomic.h" #include "src/core/lib/gprpp/atomic.h"
#include "src/core/lib/gprpp/map.h"
#include "src/core/lib/gprpp/orphanable.h" #include "src/core/lib/gprpp/orphanable.h"
#include "src/core/lib/iomgr/closure.h" #include "src/core/lib/iomgr/closure.h"
#include "src/core/lib/iomgr/exec_ctx.h" #include "src/core/lib/iomgr/exec_ctx.h"

@ -913,8 +913,8 @@ TEST_F(ClientChannelParserTest, ValidHealthCheck) {
static_cast<grpc_core::internal::ClientChannelGlobalParsedConfig*>( static_cast<grpc_core::internal::ClientChannelGlobalParsedConfig*>(
svc_cfg->GetGlobalParsedConfig(0)); svc_cfg->GetGlobalParsedConfig(0));
ASSERT_NE(parsed_config, nullptr); ASSERT_NE(parsed_config, nullptr);
EXPECT_EQ(parsed_config->health_check_service_name(), EXPECT_STREQ(parsed_config->health_check_service_name(),
"health_check_service_name"); "health_check_service_name");
} }
TEST_F(ClientChannelParserTest, InvalidHealthCheckMultipleEntries) { TEST_F(ClientChannelParserTest, InvalidHealthCheckMultipleEntries) {

@ -17,7 +17,6 @@
*/ */
#include <deque> #include <deque>
#include <map>
#include <memory> #include <memory>
#include <mutex> #include <mutex>
#include <numeric> #include <numeric>
@ -48,6 +47,7 @@
#include "src/core/ext/filters/client_channel/xds/xds_api.h" #include "src/core/ext/filters/client_channel/xds/xds_api.h"
#include "src/core/lib/gpr/env.h" #include "src/core/lib/gpr/env.h"
#include "src/core/lib/gpr/tmpfile.h" #include "src/core/lib/gpr/tmpfile.h"
#include "src/core/lib/gprpp/map.h"
#include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/gprpp/ref_counted_ptr.h"
#include "src/core/lib/gprpp/sync.h" #include "src/core/lib/gprpp/sync.h"
#include "src/core/lib/iomgr/sockaddr.h" #include "src/core/lib/iomgr/sockaddr.h"

@ -1496,6 +1496,7 @@ src/core/lib/gprpp/global_config_generic.h \
src/core/lib/gprpp/host_port.cc \ src/core/lib/gprpp/host_port.cc \
src/core/lib/gprpp/host_port.h \ src/core/lib/gprpp/host_port.h \
src/core/lib/gprpp/manual_constructor.h \ src/core/lib/gprpp/manual_constructor.h \
src/core/lib/gprpp/map.h \
src/core/lib/gprpp/memory.h \ src/core/lib/gprpp/memory.h \
src/core/lib/gprpp/mpscq.cc \ src/core/lib/gprpp/mpscq.cc \
src/core/lib/gprpp/mpscq.h \ src/core/lib/gprpp/mpscq.h \

@ -1307,6 +1307,7 @@ src/core/lib/gprpp/global_config_generic.h \
src/core/lib/gprpp/host_port.cc \ src/core/lib/gprpp/host_port.cc \
src/core/lib/gprpp/host_port.h \ src/core/lib/gprpp/host_port.h \
src/core/lib/gprpp/manual_constructor.h \ src/core/lib/gprpp/manual_constructor.h \
src/core/lib/gprpp/map.h \
src/core/lib/gprpp/memory.h \ src/core/lib/gprpp/memory.h \
src/core/lib/gprpp/mpscq.cc \ src/core/lib/gprpp/mpscq.cc \
src/core/lib/gprpp/mpscq.h \ src/core/lib/gprpp/mpscq.h \

Loading…
Cancel
Save