Move resolver to core configuration (#28881)

* Move resolver to core configuration

* Automated change: Fix sanity tests

* Automated change: Fix sanity tests

* fix

* fix

* fix

* fix

* resolver: clean up and modernize registry

* fix race

* update visibility

* fix internal error

* review feedback

* resolve backref issues

* windows

* x

* fix sockaddrs on windows?

* fix sockaddrs on windows?

Co-authored-by: ctiller <ctiller@users.noreply.github.com>
Co-authored-by: Mark D. Roth <roth@google.com>
pull/28951/head
Craig Tiller 3 years ago committed by GitHub
parent ff87ca02b2
commit dd76a04b8c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 16
      BUILD
  2. 49
      CMakeLists.txt
  3. 2
      Makefile
  4. 11
      bazel/grpc_build_system.bzl
  5. 56
      build_autogenerated.yaml
  6. 1
      config.m4
  7. 1
      config.w32
  8. 1
      gRPC-Core.podspec
  9. 1
      grpc.gemspec
  10. 2
      grpc.gyp
  11. 1
      package.xml
  12. 9
      src/core/ext/filters/client_channel/client_channel.cc
  13. 2
      src/core/ext/filters/client_channel/client_channel_plugin.cc
  14. 4
      src/core/ext/filters/client_channel/lb_policy/rls/rls.cc
  15. 3
      src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc
  16. 20
      src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc
  17. 43
      src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc
  18. 31
      src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc
  19. 15
      src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc
  20. 25
      src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc
  21. 65
      src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc
  22. 15
      src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc
  23. 8
      src/core/ext/transport/chttp2/client/chttp2_connector.cc
  24. 6
      src/core/lib/config/core_configuration.cc
  25. 17
      src/core/lib/config/core_configuration.h
  26. 62
      src/core/lib/iomgr/sockaddr_utils_posix.cc
  27. 17
      src/core/lib/iomgr/socket_utils_common_posix.cc
  28. 48
      src/core/lib/resolver/resolver_factory.h
  29. 235
      src/core/lib/resolver/resolver_registry.cc
  30. 92
      src/core/lib/resolver/resolver_registry.h
  31. 6
      src/core/lib/surface/init.cc
  32. 34
      src/core/plugin_registry/grpc_plugin_registry.cc
  33. 20
      src/core/plugin_registry/grpc_plugin_registry_extra.cc
  34. 1
      src/python/grpcio/grpc_core_dependencies.py
  35. 36
      test/core/client_channel/resolvers/binder_resolver_test.cc
  36. 6
      test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc
  37. 8
      test/core/client_channel/resolvers/dns_resolver_cooldown_test.cc
  38. 10
      test/core/client_channel/resolvers/dns_resolver_test.cc
  39. 6
      test/core/client_channel/resolvers/fake_resolver_test.cc
  40. 24
      test/core/client_channel/resolvers/sockaddr_resolver_test.cc
  41. 1
      test/core/config/BUILD
  42. 11
      test/core/surface/BUILD
  43. 55
      test/core/surface/channel_create_test.cc
  44. 11
      test/core/surface/secure_channel_create_test.cc
  45. 3
      test/cpp/naming/cancel_ares_query_test.cc
  46. 3
      test/cpp/naming/resolver_component_test.cc
  47. 1
      tools/doxygen/Doxyfile.c++.internal
  48. 1
      tools/doxygen/Doxyfile.core.internal
  49. 24
      tools/run_tests/generated/tests.json

16
BUILD

@ -970,11 +970,13 @@ grpc_cc_library(
public_hdrs = [
"src/core/lib/config/core_configuration.h",
],
visibility = ["@grpc:client_channel"],
deps = [
"channel_args_preconditioning",
"channel_creds_registry",
"channel_init",
"gpr_base",
"grpc_resolver",
"handshaker_registry",
],
)
@ -1715,6 +1717,8 @@ grpc_cc_library(
name = "grpc_sockaddr",
srcs = [
"src/core/lib/event_engine/sockaddr.cc",
"src/core/lib/iomgr/sockaddr_utils_posix.cc",
"src/core/lib/iomgr/socket_utils_windows.cc",
],
hdrs = [
"src/core/lib/event_engine/sockaddr.h",
@ -1724,7 +1728,7 @@ grpc_cc_library(
"src/core/lib/iomgr/socket_utils.h",
],
deps = [
"gpr_platform",
"gpr_base",
"iomgr_port",
],
)
@ -1901,7 +1905,6 @@ grpc_cc_library(
"src/core/lib/iomgr/socket_utils_common_posix.cc",
"src/core/lib/iomgr/socket_utils_linux.cc",
"src/core/lib/iomgr/socket_utils_posix.cc",
"src/core/lib/iomgr/socket_utils_windows.cc",
"src/core/lib/iomgr/socket_windows.cc",
"src/core/lib/iomgr/tcp_client.cc",
"src/core/lib/iomgr/tcp_client_cfstream.cc",
@ -2289,6 +2292,7 @@ grpc_cc_library(
"src/core/lib/resolver/resolver_registry.h",
],
external_deps = [
"absl/memory",
"absl/strings",
"absl/strings:str_format",
],
@ -2731,6 +2735,7 @@ grpc_cc_library(
],
language = "c++",
deps = [
"config",
"dual_ref_counted",
"gpr_base",
"gpr_codegen",
@ -3013,6 +3018,7 @@ grpc_cc_library(
],
language = "c++",
deps = [
"config",
"gpr_base",
"grpc_base",
"grpc_client_channel",
@ -3369,6 +3375,7 @@ grpc_cc_library(
],
language = "c++",
deps = [
"config",
"gpr_base",
"grpc_base",
"grpc_client_channel",
@ -3403,6 +3410,7 @@ grpc_cc_library(
],
language = "c++",
deps = [
"config",
"error",
"gpr_base",
"grpc_base",
@ -3429,6 +3437,7 @@ grpc_cc_library(
],
language = "c++",
deps = [
"config",
"gpr_base",
"grpc_base",
"grpc_client_channel",
@ -3448,6 +3457,7 @@ grpc_cc_library(
],
language = "c++",
deps = [
"config",
"gpr_base",
"grpc_base",
"grpc_client_channel",
@ -3468,6 +3478,7 @@ grpc_cc_library(
"@grpc:grpc_resolver_fake",
],
deps = [
"config",
"gpr_base",
"grpc_base",
"grpc_client_channel",
@ -3498,6 +3509,7 @@ grpc_cc_library(
],
language = "c++",
deps = [
"config",
"gpr_base",
"grpc_base",
"grpc_client_channel",

49
CMakeLists.txt generated

@ -632,7 +632,6 @@ if(gRPC_BUILD_TESTS)
add_dependencies(buildtests_c bin_encoder_test)
add_dependencies(buildtests_c buffer_list_test)
add_dependencies(buildtests_c channel_args_test)
add_dependencies(buildtests_c channel_create_test)
add_dependencies(buildtests_c channel_stack_test)
add_dependencies(buildtests_c check_gcp_environment_linux_test)
add_dependencies(buildtests_c check_gcp_environment_windows_test)
@ -2056,6 +2055,7 @@ add_library(grpc
src/core/lib/iomgr/resolve_address.cc
src/core/lib/iomgr/resolve_address_posix.cc
src/core/lib/iomgr/resolve_address_windows.cc
src/core/lib/iomgr/sockaddr_utils_posix.cc
src/core/lib/iomgr/socket_factory_posix.cc
src/core/lib/iomgr/socket_mutator.cc
src/core/lib/iomgr/socket_utils_common_posix.cc
@ -2695,6 +2695,7 @@ add_library(grpc_unsecure
src/core/lib/iomgr/resolve_address.cc
src/core/lib/iomgr/resolve_address_posix.cc
src/core/lib/iomgr/resolve_address_windows.cc
src/core/lib/iomgr/sockaddr_utils_posix.cc
src/core/lib/iomgr/socket_factory_posix.cc
src/core/lib/iomgr/socket_mutator.cc
src/core/lib/iomgr/socket_utils_common_posix.cc
@ -4831,33 +4832,6 @@ target_link_libraries(channel_args_test
)
endif()
if(gRPC_BUILD_TESTS)
add_executable(channel_create_test
test/core/surface/channel_create_test.cc
)
target_include_directories(channel_create_test
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/include
${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
${_gRPC_RE2_INCLUDE_DIR}
${_gRPC_SSL_INCLUDE_DIR}
${_gRPC_UPB_GENERATED_DIR}
${_gRPC_UPB_GRPC_GENERATED_DIR}
${_gRPC_UPB_INCLUDE_DIR}
${_gRPC_XXHASH_INCLUDE_DIR}
${_gRPC_ZLIB_INCLUDE_DIR}
)
target_link_libraries(channel_create_test
${_gRPC_ALLTARGETS_LIBRARIES}
grpc_test_util
)
endif()
if(gRPC_BUILD_TESTS)
@ -9678,23 +9652,6 @@ endif()
if(gRPC_BUILD_TESTS)
add_executable(core_configuration_test
src/core/lib/channel/channel_args.cc
src/core/lib/channel/channel_args_preconditioning.cc
src/core/lib/channel/handshaker_registry.cc
src/core/lib/config/core_configuration.cc
src/core/lib/debug/trace.cc
src/core/lib/iomgr/combiner.cc
src/core/lib/iomgr/error.cc
src/core/lib/iomgr/exec_ctx.cc
src/core/lib/iomgr/executor.cc
src/core/lib/iomgr/iomgr_internal.cc
src/core/lib/json/json_reader.cc
src/core/lib/json/json_writer.cc
src/core/lib/slice/slice.cc
src/core/lib/slice/slice_refcount.cc
src/core/lib/slice/slice_string_helpers.cc
src/core/lib/surface/channel_init.cc
src/core/lib/surface/channel_stack_type.cc
test/core/config/core_configuration_test.cc
third_party/googletest/googletest/src/gtest-all.cc
third_party/googletest/googlemock/src/gmock-all.cc
@ -9722,7 +9679,7 @@ target_include_directories(core_configuration_test
target_link_libraries(core_configuration_test
${_gRPC_PROTOBUF_LIBRARIES}
${_gRPC_ALLTARGETS_LIBRARIES}
gpr
grpc
)

2
Makefile generated

@ -1502,6 +1502,7 @@ LIBGRPC_SRC = \
src/core/lib/iomgr/resolve_address.cc \
src/core/lib/iomgr/resolve_address_posix.cc \
src/core/lib/iomgr/resolve_address_windows.cc \
src/core/lib/iomgr/sockaddr_utils_posix.cc \
src/core/lib/iomgr/socket_factory_posix.cc \
src/core/lib/iomgr/socket_mutator.cc \
src/core/lib/iomgr/socket_utils_common_posix.cc \
@ -1990,6 +1991,7 @@ LIBGRPC_UNSECURE_SRC = \
src/core/lib/iomgr/resolve_address.cc \
src/core/lib/iomgr/resolve_address_posix.cc \
src/core/lib/iomgr/resolve_address_windows.cc \
src/core/lib/iomgr/sockaddr_utils_posix.cc \
src/core/lib/iomgr/socket_factory_posix.cc \
src/core/lib/iomgr/socket_mutator.cc \
src/core/lib/iomgr/socket_utils_common_posix.cc \

@ -43,6 +43,13 @@ def if_not_windows(a):
"//conditions:default": a,
})
def if_windows(a):
return select({
"//:windows": a,
"//:windows_msvc": a,
"//conditions:default": [],
})
def if_mac(a):
return select({
"//:mac_x86_64": a,
@ -153,7 +160,7 @@ def grpc_cc_library(
copts = if_mac(["-DGRPC_CFSTREAM"])
if language.upper() == "C":
copts = copts + if_not_windows(["-std=c99"])
linkopts = if_not_windows(["-pthread"])
linkopts = if_not_windows(["-pthread"]) + if_windows(["-defaultlib:ws2_32.lib"])
if use_cfstream:
linkopts = linkopts + if_mac(["-framework CoreFoundation"])
@ -300,7 +307,7 @@ def grpc_cc_test(name, srcs = [], deps = [], external_deps = [], args = [], data
"data": data,
"deps": deps + _get_external_deps(external_deps),
"copts": GRPC_DEFAULT_COPTS + copts,
"linkopts": if_not_windows(["-pthread"]),
"linkopts": if_not_windows(["-pthread"]) + if_windows(["-defaultlib:ws2_32.lib"]),
"size": size,
"timeout": timeout,
"exec_compatible_with": exec_compatible_with,

@ -1550,6 +1550,7 @@ libs:
- src/core/lib/iomgr/resolve_address.cc
- src/core/lib/iomgr/resolve_address_posix.cc
- src/core/lib/iomgr/resolve_address_windows.cc
- src/core/lib/iomgr/sockaddr_utils_posix.cc
- src/core/lib/iomgr/socket_factory_posix.cc
- src/core/lib/iomgr/socket_mutator.cc
- src/core/lib/iomgr/socket_utils_common_posix.cc
@ -2366,6 +2367,7 @@ libs:
- src/core/lib/iomgr/resolve_address.cc
- src/core/lib/iomgr/resolve_address_posix.cc
- src/core/lib/iomgr/resolve_address_windows.cc
- src/core/lib/iomgr/sockaddr_utils_posix.cc
- src/core/lib/iomgr/socket_factory_posix.cc
- src/core/lib/iomgr/socket_mutator.cc
- src/core/lib/iomgr/socket_utils_common_posix.cc
@ -3421,14 +3423,6 @@ targets:
deps:
- grpc_test_util
uses_polling: false
- name: channel_create_test
build: test
language: c
headers: []
src:
- test/core/surface/channel_create_test.cc
deps:
- grpc_test_util
- name: channel_stack_test
build: test
language: c
@ -5398,53 +5392,11 @@ targets:
gtest: true
build: test
language: c++
headers:
- src/core/lib/channel/channel_args.h
- src/core/lib/channel/channel_args_preconditioning.h
- src/core/lib/channel/handshaker_factory.h
- src/core/lib/channel/handshaker_registry.h
- src/core/lib/config/core_configuration.h
- src/core/lib/debug/trace.h
- src/core/lib/gprpp/atomic_utils.h
- src/core/lib/gprpp/ref_counted.h
- src/core/lib/gprpp/ref_counted_ptr.h
- src/core/lib/iomgr/closure.h
- src/core/lib/iomgr/combiner.h
- src/core/lib/iomgr/error.h
- src/core/lib/iomgr/error_internal.h
- src/core/lib/iomgr/exec_ctx.h
- src/core/lib/iomgr/executor.h
- src/core/lib/iomgr/iomgr_internal.h
- src/core/lib/json/json.h
- src/core/lib/security/credentials/channel_creds_registry.h
- src/core/lib/slice/slice.h
- src/core/lib/slice/slice_internal.h
- src/core/lib/slice/slice_refcount.h
- src/core/lib/slice/slice_refcount_base.h
- src/core/lib/slice/slice_string_helpers.h
- src/core/lib/surface/channel_init.h
- src/core/lib/surface/channel_stack_type.h
headers: []
src:
- src/core/lib/channel/channel_args.cc
- src/core/lib/channel/channel_args_preconditioning.cc
- src/core/lib/channel/handshaker_registry.cc
- src/core/lib/config/core_configuration.cc
- src/core/lib/debug/trace.cc
- src/core/lib/iomgr/combiner.cc
- src/core/lib/iomgr/error.cc
- src/core/lib/iomgr/exec_ctx.cc
- src/core/lib/iomgr/executor.cc
- src/core/lib/iomgr/iomgr_internal.cc
- src/core/lib/json/json_reader.cc
- src/core/lib/json/json_writer.cc
- src/core/lib/slice/slice.cc
- src/core/lib/slice/slice_refcount.cc
- src/core/lib/slice/slice_string_helpers.cc
- src/core/lib/surface/channel_init.cc
- src/core/lib/surface/channel_stack_type.cc
- test/core/config/core_configuration_test.cc
deps:
- gpr
- grpc
uses_polling: false
- name: cpp_impl_of_test
gtest: true

1
config.m4 generated

@ -562,6 +562,7 @@ if test "$PHP_GRPC" != "no"; then
src/core/lib/iomgr/resolve_address.cc \
src/core/lib/iomgr/resolve_address_posix.cc \
src/core/lib/iomgr/resolve_address_windows.cc \
src/core/lib/iomgr/sockaddr_utils_posix.cc \
src/core/lib/iomgr/socket_factory_posix.cc \
src/core/lib/iomgr/socket_mutator.cc \
src/core/lib/iomgr/socket_utils_common_posix.cc \

1
config.w32 generated

@ -528,6 +528,7 @@ if (PHP_GRPC != "no") {
"src\\core\\lib\\iomgr\\resolve_address.cc " +
"src\\core\\lib\\iomgr\\resolve_address_posix.cc " +
"src\\core\\lib\\iomgr\\resolve_address_windows.cc " +
"src\\core\\lib\\iomgr\\sockaddr_utils_posix.cc " +
"src\\core\\lib\\iomgr\\socket_factory_posix.cc " +
"src\\core\\lib\\iomgr\\socket_mutator.cc " +
"src\\core\\lib\\iomgr\\socket_utils_common_posix.cc " +

1
gRPC-Core.podspec generated

@ -1212,6 +1212,7 @@ Pod::Spec.new do |s|
'src/core/lib/iomgr/resolved_address.h',
'src/core/lib/iomgr/sockaddr.h',
'src/core/lib/iomgr/sockaddr_posix.h',
'src/core/lib/iomgr/sockaddr_utils_posix.cc',
'src/core/lib/iomgr/sockaddr_windows.h',
'src/core/lib/iomgr/socket_factory_posix.cc',
'src/core/lib/iomgr/socket_factory_posix.h',

1
grpc.gemspec generated

@ -1131,6 +1131,7 @@ Gem::Specification.new do |s|
s.files += %w( src/core/lib/iomgr/resolved_address.h )
s.files += %w( src/core/lib/iomgr/sockaddr.h )
s.files += %w( src/core/lib/iomgr/sockaddr_posix.h )
s.files += %w( src/core/lib/iomgr/sockaddr_utils_posix.cc )
s.files += %w( src/core/lib/iomgr/sockaddr_windows.h )
s.files += %w( src/core/lib/iomgr/socket_factory_posix.cc )
s.files += %w( src/core/lib/iomgr/socket_factory_posix.h )

2
grpc.gyp generated

@ -956,6 +956,7 @@
'src/core/lib/iomgr/resolve_address.cc',
'src/core/lib/iomgr/resolve_address_posix.cc',
'src/core/lib/iomgr/resolve_address_windows.cc',
'src/core/lib/iomgr/sockaddr_utils_posix.cc',
'src/core/lib/iomgr/socket_factory_posix.cc',
'src/core/lib/iomgr/socket_mutator.cc',
'src/core/lib/iomgr/socket_utils_common_posix.cc',
@ -1415,6 +1416,7 @@
'src/core/lib/iomgr/resolve_address.cc',
'src/core/lib/iomgr/resolve_address_posix.cc',
'src/core/lib/iomgr/resolve_address_windows.cc',
'src/core/lib/iomgr/sockaddr_utils_posix.cc',
'src/core/lib/iomgr/socket_factory_posix.cc',
'src/core/lib/iomgr/socket_mutator.cc',
'src/core/lib/iomgr/socket_utils_common_posix.cc',

1
package.xml generated

@ -1111,6 +1111,7 @@
<file baseinstalldir="/" name="src/core/lib/iomgr/resolved_address.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/sockaddr.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/sockaddr_posix.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/sockaddr_utils_posix.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/sockaddr_windows.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/socket_factory_posix.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/socket_factory_posix.h" role="src" />

@ -1083,7 +1083,8 @@ ClientChannel::ClientChannel(grpc_channel_element_args* args,
}
// Make sure the URI to resolve is valid, so that we know that
// resolver creation will succeed later.
if (!ResolverRegistry::IsValidTarget(uri_to_resolve_)) {
if (!CoreConfiguration::Get().resolver_registry().IsValidTarget(
uri_to_resolve_)) {
*error = GRPC_ERROR_CREATE_FROM_CPP_STRING(
absl::StrCat("the target uri is not valid: ", uri_to_resolve_));
return;
@ -1102,7 +1103,9 @@ ClientChannel::ClientChannel(grpc_channel_element_args* args,
const char* default_authority =
grpc_channel_args_find_string(channel_args_, GRPC_ARG_DEFAULT_AUTHORITY);
if (default_authority == nullptr) {
default_authority_ = ResolverRegistry::GetDefaultAuthority(server_uri);
default_authority_ =
CoreConfiguration::Get().resolver_registry().GetDefaultAuthority(
server_uri);
} else {
default_authority_ = default_authority;
}
@ -1539,7 +1542,7 @@ void ClientChannel::CreateResolverLocked() {
if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
gpr_log(GPR_INFO, "chand=%p: starting name resolution", this);
}
resolver_ = ResolverRegistry::CreateResolver(
resolver_ = CoreConfiguration::Get().resolver_registry().CreateResolver(
uri_to_resolve_.c_str(), channel_args_, interested_parties_,
work_serializer_, absl::make_unique<ResolverResultHandler>(this));
// Since the validity of the args was checked when the channel was created,

@ -42,7 +42,6 @@ void grpc_client_channel_init(void) {
grpc_core::internal::ClientChannelServiceConfigParser::Register();
grpc_core::internal::RetryServiceConfigParser::Register();
grpc_core::LoadBalancingPolicyRegistry::Builder::InitRegistry();
grpc_core::ResolverRegistry::Builder::InitRegistry();
grpc_core::internal::ServerRetryThrottleMap::Init();
grpc_core::ProxyMapperRegistry::Init();
grpc_core::RegisterHttpProxyMapper();
@ -54,7 +53,6 @@ void grpc_client_channel_shutdown(void) {
grpc_core::GlobalSubchannelPool::Shutdown();
grpc_core::ProxyMapperRegistry::Shutdown();
grpc_core::internal::ServerRetryThrottleMap::Shutdown();
grpc_core::ResolverRegistry::Builder::ShutdownRegistry();
grpc_core::LoadBalancingPolicyRegistry::Builder::ShutdownRegistry();
}

@ -55,6 +55,7 @@
#include "src/core/ext/filters/client_channel/lb_policy_factory.h"
#include "src/core/ext/filters/client_channel/lb_policy_registry.h"
#include "src/core/lib/backoff/backoff.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/gpr/env.h"
#include "src/core/lib/gpr/string.h"
#include "src/core/lib/gprpp/dual_ref_counted.h"
@ -2345,7 +2346,8 @@ RlsLbConfig::RouteLookupConfig ParseRouteLookupConfig(
// Parse lookupService.
if (ParseJsonObjectField(json, "lookupService",
&route_lookup_config.lookup_service, &error_list)) {
if (!ResolverRegistry::IsValidTarget(route_lookup_config.lookup_service)) {
if (!CoreConfiguration::Get().resolver_registry().IsValidTarget(
route_lookup_config.lookup_service)) {
error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
"field:lookupService error:must be valid gRPC target URI"));
}

@ -40,6 +40,7 @@
#include "src/core/ext/xds/xds_client_stats.h"
#include "src/core/ext/xds/xds_endpoint.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/gpr/string.h"
#include "src/core/lib/gprpp/orphanable.h"
#include "src/core/lib/gprpp/ref_counted_ptr.h"
@ -452,7 +453,7 @@ void XdsClusterResolverLb::LogicalDNSDiscoveryMechanism::Start() {
target = absl::StrCat("dns:", target);
args = grpc_channel_args_copy(parent()->args_);
}
resolver_ = ResolverRegistry::CreateResolver(
resolver_ = CoreConfiguration::Get().resolver_registry().CreateResolver(
target.c_str(), args, parent()->interested_parties(),
parent()->work_serializer(),
absl::make_unique<ResolverResultHandler>(

@ -25,6 +25,7 @@
#include "src/core/lib/address_utils/parse_address.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/gpr/string.h"
#include "src/core/lib/resolver/resolver_registry.h"
#include "src/core/lib/resolver/server_address.h"
@ -59,6 +60,8 @@ class BinderResolver : public Resolver {
class BinderResolverFactory : public ResolverFactory {
public:
absl::string_view scheme() const override { return "binder"; }
bool IsValidUri(const URI& uri) const override {
return ParseUri(uri, nullptr);
}
@ -70,8 +73,6 @@ class BinderResolverFactory : public ResolverFactory {
std::move(args));
}
const char* scheme() const override { return "binder"; }
private:
static grpc_error_handle BinderAddrPopulate(
absl::string_view path, grpc_resolved_address* resolved_addr) {
@ -121,19 +122,12 @@ class BinderResolverFactory : public ResolverFactory {
};
} // namespace
} // namespace grpc_core
void grpc_resolver_binder_init() {
grpc_core::ResolverRegistry::Builder::RegisterResolverFactory(
absl::make_unique<grpc_core::BinderResolverFactory>());
void RegisterBinderResolver(CoreConfiguration::Builder* builder) {
builder->resolver_registry()->RegisterResolverFactory(
absl::make_unique<BinderResolverFactory>());
}
void grpc_resolver_binder_shutdown() {}
#else
void grpc_resolver_binder_init() {}
void grpc_resolver_binder_shutdown() {}
} // namespace grpc_core
#endif

@ -16,6 +16,8 @@
#include <grpc/support/port_platform.h>
#include "src/core/lib/config/core_configuration.h"
#if GRPC_ARES == 1
#include <limits.h>
@ -466,6 +468,8 @@ void AresClientChannelDNSResolver::StartResolvingLocked() {
//
class AresClientChannelDNSResolverFactory : public ResolverFactory {
public:
absl::string_view scheme() const override { return "dns"; }
bool IsValidUri(const URI& uri) const override {
if (absl::StripPrefix(uri.path(), "/").empty()) {
gpr_log(GPR_ERROR, "no server name supplied in dns URI");
@ -477,8 +481,6 @@ class AresClientChannelDNSResolverFactory : public ResolverFactory {
OrphanablePtr<Resolver> CreateResolver(ResolverArgs args) const override {
return MakeOrphanable<AresClientChannelDNSResolver>(std::move(args));
}
const char* scheme() const override { return "dns"; }
};
class AresDNSResolver : public DNSResolver {
@ -608,18 +610,29 @@ bool ShouldUseAres(const char* resolver_env) {
gpr_stricmp(resolver_env, "ares") == 0;
}
bool g_use_ares_dns_resolver;
bool UseAresDnsResolver() {
static const bool result = []() {
UniquePtr<char> resolver = GPR_GLOBAL_CONFIG_GET(grpc_dns_resolver);
bool result = ShouldUseAres(resolver.get());
if (result) gpr_log(GPR_DEBUG, "Using ares dns resolver");
return result;
}();
return result;
}
} // namespace
void RegisterAresDnsResolver(CoreConfiguration::Builder* builder) {
if (UseAresDnsResolver()) {
builder->resolver_registry()->RegisterResolverFactory(
absl::make_unique<AresClientChannelDNSResolverFactory>());
}
}
} // namespace grpc_core
void grpc_resolver_dns_ares_init() {
grpc_core::UniquePtr<char> resolver =
GPR_GLOBAL_CONFIG_GET(grpc_dns_resolver);
if (grpc_core::ShouldUseAres(resolver.get())) {
grpc_core::g_use_ares_dns_resolver = true;
gpr_log(GPR_DEBUG, "Using ares dns resolver");
if (grpc_core::UseAresDnsResolver()) {
address_sorting_init();
grpc_error_handle error = grpc_ares_init();
if (error != GRPC_ERROR_NONE) {
@ -627,15 +640,11 @@ void grpc_resolver_dns_ares_init() {
return;
}
grpc_core::SetDNSResolver(grpc_core::AresDNSResolver::GetOrCreate());
grpc_core::ResolverRegistry::Builder::RegisterResolverFactory(
absl::make_unique<grpc_core::AresClientChannelDNSResolverFactory>());
} else {
grpc_core::g_use_ares_dns_resolver = false;
}
}
void grpc_resolver_dns_ares_shutdown() {
if (grpc_core::g_use_ares_dns_resolver) {
if (grpc_core::UseAresDnsResolver()) {
address_sorting_shutdown();
grpc_ares_cleanup();
}
@ -643,8 +652,12 @@ void grpc_resolver_dns_ares_shutdown() {
#else /* GRPC_ARES == 1 */
void grpc_resolver_dns_ares_init(void) {}
namespace grpc_core {
void RegisterAresDnsResolver(CoreConfiguration::Builder*) {}
} // namespace grpc_core
void grpc_resolver_dns_ares_init() {}
void grpc_resolver_dns_ares_shutdown(void) {}
void grpc_resolver_dns_ares_shutdown() {}
#endif /* GRPC_ARES == 1 */

@ -31,6 +31,7 @@
#include "src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h"
#include "src/core/lib/backoff/backoff.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/gpr/string.h"
#include "src/core/lib/gprpp/manual_constructor.h"
#include "src/core/lib/iomgr/resolve_address.h"
@ -294,6 +295,8 @@ void NativeClientChannelDNSResolver::StartResolvingLocked() {
class NativeClientChannelDNSResolverFactory : public ResolverFactory {
public:
absl::string_view scheme() const override { return "dns"; }
bool IsValidUri(const URI& uri) const override {
if (GPR_UNLIKELY(!uri.authority().empty())) {
gpr_log(GPR_ERROR, "authority based dns uri's not supported");
@ -310,32 +313,24 @@ class NativeClientChannelDNSResolverFactory : public ResolverFactory {
if (!IsValidUri(args.uri)) return nullptr;
return MakeOrphanable<NativeClientChannelDNSResolver>(std::move(args));
}
const char* scheme() const override { return "dns"; }
};
} // namespace
} // namespace grpc_core
void grpc_resolver_dns_native_init() {
grpc_core::UniquePtr<char> resolver =
GPR_GLOBAL_CONFIG_GET(grpc_dns_resolver);
if (gpr_stricmp(resolver.get(), "native") == 0) {
void RegisterNativeDnsResolver(CoreConfiguration::Builder* builder) {
static const char* const resolver =
GPR_GLOBAL_CONFIG_GET(grpc_dns_resolver).release();
if (gpr_stricmp(resolver, "native") == 0) {
gpr_log(GPR_DEBUG, "Using native dns resolver");
grpc_core::ResolverRegistry::Builder::RegisterResolverFactory(
absl::make_unique<grpc_core::NativeClientChannelDNSResolverFactory>());
builder->resolver_registry()->RegisterResolverFactory(
absl::make_unique<NativeClientChannelDNSResolverFactory>());
} else {
grpc_core::ResolverRegistry::Builder::InitRegistry();
grpc_core::ResolverFactory* existing_factory =
grpc_core::ResolverRegistry::LookupResolverFactory("dns");
if (existing_factory == nullptr) {
if (!builder->resolver_registry()->HasResolverFactory("dns")) {
gpr_log(GPR_DEBUG, "Using native dns resolver");
grpc_core::ResolverRegistry::Builder::RegisterResolverFactory(
absl::make_unique<
grpc_core::NativeClientChannelDNSResolverFactory>());
builder->resolver_registry()->RegisterResolverFactory(
absl::make_unique<NativeClientChannelDNSResolverFactory>());
}
}
}
void grpc_resolver_dns_native_shutdown() {}
} // namespace grpc_core

@ -32,6 +32,7 @@
#include "src/core/lib/address_utils/parse_address.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/gpr/string.h"
#include "src/core/lib/gpr/useful.h"
#include "src/core/lib/iomgr/closure.h"
@ -359,22 +360,22 @@ namespace {
class FakeResolverFactory : public ResolverFactory {
public:
absl::string_view scheme() const override { return "fake"; }
bool IsValidUri(const URI& /*uri*/) const override { return true; }
OrphanablePtr<Resolver> CreateResolver(ResolverArgs args) const override {
return MakeOrphanable<FakeResolver>(std::move(args));
}
const char* scheme() const override { return "fake"; }
};
} // namespace
} // namespace grpc_core
void grpc_resolver_fake_init() {
grpc_core::ResolverRegistry::Builder::RegisterResolverFactory(
absl::make_unique<grpc_core::FakeResolverFactory>());
void RegisterFakeResolver(CoreConfiguration::Builder* builder) {
builder->resolver_registry()->RegisterResolverFactory(
absl::make_unique<FakeResolverFactory>());
}
} // namespace grpc_core
void grpc_resolver_fake_shutdown() {}

@ -250,9 +250,10 @@ GoogleCloud2ProdResolver::GoogleCloud2ProdResolver(ResolverArgs args)
UniquePtr<char>(gpr_getenv("GRPC_XDS_BOOTSTRAP")) != nullptr ||
UniquePtr<char>(gpr_getenv("GRPC_XDS_BOOTSTRAP_CONFIG")) != nullptr) {
using_dns_ = true;
child_resolver_ = ResolverRegistry::CreateResolver(
absl::StrCat("dns:", name_to_resolve).c_str(), args.args,
args.pollset_set, work_serializer_, std::move(args.result_handler));
child_resolver_ =
CoreConfiguration::Get().resolver_registry().CreateResolver(
absl::StrCat("dns:", name_to_resolve).c_str(), args.args,
args.pollset_set, work_serializer_, std::move(args.result_handler));
GPR_ASSERT(child_resolver_ != nullptr);
return;
}
@ -266,7 +267,7 @@ GoogleCloud2ProdResolver::GoogleCloud2ProdResolver(ResolverArgs args)
metadata_server_name_ = std::string(test_only_metadata_server_override);
}
// Create xds resolver.
child_resolver_ = ResolverRegistry::CreateResolver(
child_resolver_ = CoreConfiguration::Get().resolver_registry().CreateResolver(
absl::StrCat("xds:", name_to_resolve).c_str(), args.args,
args.pollset_set, work_serializer_, std::move(args.result_handler));
GPR_ASSERT(child_resolver_ != nullptr);
@ -369,6 +370,12 @@ void GoogleCloud2ProdResolver::StartXdsResolver() {
class GoogleCloud2ProdResolverFactory : public ResolverFactory {
public:
// TODO(roth): Remove experimental suffix once this code is proven stable,
// and update the scheme in google_c2p_resolver_test.cc when doing so.
absl::string_view scheme() const override {
return "google-c2p-experimental";
}
bool IsValidUri(const URI& uri) const override {
if (GPR_UNLIKELY(!uri.authority().empty())) {
gpr_log(GPR_ERROR, "google-c2p URI scheme does not support authorities");
@ -381,19 +388,13 @@ class GoogleCloud2ProdResolverFactory : public ResolverFactory {
if (!IsValidUri(args.uri)) return nullptr;
return MakeOrphanable<GoogleCloud2ProdResolver>(std::move(args));
}
// TODO(roth): Remove experimental suffix once this code is proven stable,
// and update the scheme in google_c2p_resolver_test.cc when doing so.
const char* scheme() const override { return "google-c2p-experimental"; }
};
} // namespace
void GoogleCloud2ProdResolverInit() {
ResolverRegistry::Builder::RegisterResolverFactory(
void RegisterCloud2ProdResolver(CoreConfiguration::Builder* builder) {
builder->resolver_registry()->RegisterResolverFactory(
absl::make_unique<GoogleCloud2ProdResolverFactory>());
}
void GoogleCloud2ProdResolverShutdown() {}
} // namespace grpc_core

@ -1,20 +1,18 @@
/*
*
* Copyright 2015-2016 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.
*
*/
//
// Copyright 2015 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 <grpc/support/port_platform.h>
@ -30,6 +28,7 @@
#include "src/core/lib/address_utils/parse_address.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/gpr/string.h"
#include "src/core/lib/iomgr/resolve_address.h"
#include "src/core/lib/iomgr/unix_sockets_posix.h"
@ -127,7 +126,7 @@ class IPv4ResolverFactory : public ResolverFactory {
return CreateSockaddrResolver(std::move(args), grpc_parse_ipv4);
}
const char* scheme() const override { return "ipv4"; }
absl::string_view scheme() const override { return "ipv4"; }
};
class IPv6ResolverFactory : public ResolverFactory {
@ -140,7 +139,7 @@ class IPv6ResolverFactory : public ResolverFactory {
return CreateSockaddrResolver(std::move(args), grpc_parse_ipv6);
}
const char* scheme() const override { return "ipv6"; }
absl::string_view scheme() const override { return "ipv6"; }
};
#ifdef GRPC_HAVE_UNIX_SOCKET
@ -158,11 +157,13 @@ class UnixResolverFactory : public ResolverFactory {
return "localhost";
}
const char* scheme() const override { return "unix"; }
absl::string_view scheme() const override { return "unix"; }
};
class UnixAbstractResolverFactory : public ResolverFactory {
public:
absl::string_view scheme() const override { return "unix-abstract"; }
bool IsValidUri(const URI& uri) const override {
return ParseUri(uri, grpc_parse_unix_abstract, nullptr);
}
@ -174,26 +175,22 @@ class UnixAbstractResolverFactory : public ResolverFactory {
std::string GetDefaultAuthority(const URI& /*uri*/) const override {
return "localhost";
}
const char* scheme() const override { return "unix-abstract"; }
};
#endif // GRPC_HAVE_UNIX_SOCKET
} // namespace
} // namespace grpc_core
void grpc_resolver_sockaddr_init() {
grpc_core::ResolverRegistry::Builder::RegisterResolverFactory(
absl::make_unique<grpc_core::IPv4ResolverFactory>());
grpc_core::ResolverRegistry::Builder::RegisterResolverFactory(
absl::make_unique<grpc_core::IPv6ResolverFactory>());
void RegisterSockaddrResolver(CoreConfiguration::Builder* builder) {
builder->resolver_registry()->RegisterResolverFactory(
absl::make_unique<IPv4ResolverFactory>());
builder->resolver_registry()->RegisterResolverFactory(
absl::make_unique<IPv6ResolverFactory>());
#ifdef GRPC_HAVE_UNIX_SOCKET
grpc_core::ResolverRegistry::Builder::RegisterResolverFactory(
absl::make_unique<grpc_core::UnixResolverFactory>());
grpc_core::ResolverRegistry::Builder::RegisterResolverFactory(
absl::make_unique<grpc_core::UnixAbstractResolverFactory>());
builder->resolver_registry()->RegisterResolverFactory(
absl::make_unique<UnixResolverFactory>());
builder->resolver_registry()->RegisterResolverFactory(
absl::make_unique<UnixAbstractResolverFactory>());
#endif
}
void grpc_resolver_sockaddr_shutdown() {}
} // namespace grpc_core

@ -35,6 +35,7 @@
#include "src/core/ext/xds/xds_route_config.h"
#include "src/core/ext/xds/xds_routing.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/iomgr/closure.h"
#include "src/core/lib/iomgr/exec_ctx.h"
#include "src/core/lib/resolver/resolver_registry.h"
@ -988,6 +989,8 @@ void XdsResolver::MaybeRemoveUnusedClusters() {
class XdsResolverFactory : public ResolverFactory {
public:
absl::string_view scheme() const override { return "xds"; }
bool IsValidUri(const URI& uri) const override {
if (uri.path().empty() || uri.path().back() == '/') {
gpr_log(GPR_ERROR,
@ -1005,17 +1008,13 @@ class XdsResolverFactory : public ResolverFactory {
if (!IsValidUri(args.uri)) return nullptr;
return MakeOrphanable<XdsResolver>(std::move(args));
}
const char* scheme() const override { return "xds"; }
};
} // namespace
} // namespace grpc_core
void grpc_resolver_xds_init() {
grpc_core::ResolverRegistry::Builder::RegisterResolverFactory(
absl::make_unique<grpc_core::XdsResolverFactory>());
void RegisterXdsResolver(CoreConfiguration::Builder* builder) {
builder->resolver_registry()->RegisterResolverFactory(
absl::make_unique<XdsResolverFactory>());
}
void grpc_resolver_xds_shutdown() {}
} // namespace grpc_core

@ -353,10 +353,12 @@ grpc_channel* CreateChannel(const char* target, const grpc_channel_args* args,
return nullptr;
}
// Add channel arg containing the server URI.
UniquePtr<char> canonical_target =
ResolverRegistry::AddDefaultPrefixIfNeeded(target);
std::string canonical_target =
CoreConfiguration::Get().resolver_registry().AddDefaultPrefixIfNeeded(
target);
grpc_arg arg = grpc_channel_arg_string_create(
const_cast<char*>(GRPC_ARG_SERVER_URI), canonical_target.get());
const_cast<char*>(GRPC_ARG_SERVER_URI),
const_cast<char*>(canonical_target.c_str()));
const char* to_remove[] = {GRPC_ARG_SERVER_URI};
grpc_channel_args* new_args =
grpc_channel_args_copy_and_add_and_remove(args, to_remove, 1, &arg, 1);

@ -23,6 +23,7 @@ namespace grpc_core {
std::atomic<CoreConfiguration*> CoreConfiguration::config_{nullptr};
std::atomic<CoreConfiguration::RegisteredBuilder*> CoreConfiguration::builders_{
nullptr};
void (*CoreConfiguration::default_builder_)(CoreConfiguration::Builder*);
CoreConfiguration::Builder::Builder() = default;
@ -35,7 +36,8 @@ CoreConfiguration::CoreConfiguration(Builder* builder)
builder->channel_args_preconditioning_.Build()),
channel_init_(builder->channel_init_.Build()),
handshaker_registry_(builder->handshaker_registry_.Build()),
channel_creds_registry_(builder->channel_creds_registry_.Build()) {}
channel_creds_registry_(builder->channel_creds_registry_.Build()),
resolver_registry_(builder->resolver_registry_.Build()) {}
void CoreConfiguration::RegisterBuilder(std::function<void(Builder*)> builder) {
GPR_ASSERT(config_.load(std::memory_order_relaxed) == nullptr &&
@ -70,7 +72,7 @@ const CoreConfiguration& CoreConfiguration::BuildNewAndMaybeSet() {
(*it)->builder(&builder);
}
// Finally, call the built in configuration builder.
BuildCoreConfiguration(&builder);
if (default_builder_ != nullptr) (*default_builder_)(&builder);
// Use builder to construct a confguration
CoreConfiguration* p = builder.Build();
// Try to set configuration global - it's possible another thread raced us

@ -21,6 +21,7 @@
#include "src/core/lib/channel/channel_args_preconditioning.h"
#include "src/core/lib/channel/handshaker_registry.h"
#include "src/core/lib/resolver/resolver_registry.h"
#include "src/core/lib/security/credentials/channel_creds_registry.h"
#include "src/core/lib/surface/channel_init.h"
@ -51,6 +52,10 @@ class CoreConfiguration {
return &channel_creds_registry_;
}
ResolverRegistry::Builder* resolver_registry() {
return &resolver_registry_;
}
private:
friend class CoreConfiguration;
@ -58,6 +63,7 @@ class CoreConfiguration {
ChannelInit::Builder channel_init_;
HandshakerRegistry::Builder handshaker_registry_;
ChannelCredsRegistry<>::Builder channel_creds_registry_;
ResolverRegistry::Builder resolver_registry_;
Builder();
CoreConfiguration* Build();
@ -137,6 +143,14 @@ class CoreConfiguration {
return channel_creds_registry_;
}
const ResolverRegistry& resolver_registry() const {
return resolver_registry_;
}
static void SetDefaultBuilder(void (*builder)(CoreConfiguration::Builder*)) {
default_builder_ = builder;
}
private:
explicit CoreConfiguration(Builder* builder);
@ -154,11 +168,14 @@ class CoreConfiguration {
static std::atomic<CoreConfiguration*> config_;
// Extra registered builders
static std::atomic<RegisteredBuilder*> builders_;
// Default builder
static void (*default_builder_)(CoreConfiguration::Builder*);
ChannelArgsPreconditioning channel_args_preconditioning_;
ChannelInit channel_init_;
HandshakerRegistry handshaker_registry_;
ChannelCredsRegistry<> channel_creds_registry_;
ResolverRegistry resolver_registry_;
};
extern void BuildCoreConfiguration(CoreConfiguration::Builder* builder);

@ -0,0 +1,62 @@
/*
*
* Copyright 2015 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 <grpc/support/port_platform.h>
#include "src/core/lib/iomgr/port.h"
#ifdef GRPC_POSIX_SOCKET_UTILS_COMMON
#include "src/core/lib/iomgr/socket_utils.h"
#ifdef GRPC_LINUX_TCP_H
#include <linux/tcp.h>
#else
#include <netinet/tcp.h>
#endif
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#include <string>
#include <grpc/support/alloc.h>
#include <grpc/support/log.h>
#include <grpc/support/sync.h>
#include "src/core/lib/iomgr/sockaddr.h"
uint16_t grpc_htons(uint16_t hostshort) { return htons(hostshort); }
uint16_t grpc_ntohs(uint16_t netshort) { return ntohs(netshort); }
uint32_t grpc_htonl(uint32_t hostlong) { return htonl(hostlong); }
uint32_t grpc_ntohl(uint32_t netlong) { return ntohl(netlong); }
int grpc_inet_pton(int af, const char* src, void* dst) {
return inet_pton(af, src, dst);
}
const char* grpc_inet_ntop(int af, const void* src, char* dst, size_t size) {
GPR_ASSERT(size <= (socklen_t)-1);
return inet_ntop(af, src, dst, static_cast<socklen_t>(size));
}
#endif

@ -495,21 +495,4 @@ grpc_error_handle grpc_create_dualstack_socket_using_factory(
return error_for_fd(*newfd, resolved_addr);
}
uint16_t grpc_htons(uint16_t hostshort) { return htons(hostshort); }
uint16_t grpc_ntohs(uint16_t netshort) { return ntohs(netshort); }
uint32_t grpc_htonl(uint32_t hostlong) { return htonl(hostlong); }
uint32_t grpc_ntohl(uint32_t netlong) { return ntohl(netlong); }
int grpc_inet_pton(int af, const char* src, void* dst) {
return inet_pton(af, src, dst);
}
const char* grpc_inet_ntop(int af, const void* src, char* dst, size_t size) {
GPR_ASSERT(size <= (socklen_t)-1);
return inet_ntop(af, src, dst, static_cast<socklen_t>(size));
}
#endif

@ -1,20 +1,18 @@
/*
*
* Copyright 2015 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.
*
*/
//
// Copyright 2015 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_RESOLVER_RESOLVER_FACTORY_H
#define GRPC_CORE_LIB_RESOLVER_RESOLVER_FACTORY_H
@ -41,8 +39,6 @@ class WorkSerializer;
struct ResolverArgs {
/// The parsed URI to resolve.
URI uri;
/// The URI string.
std::string uri_string;
/// Channel args to be included in resolver results.
const grpc_channel_args* args = nullptr;
/// Used to drive I/O in the name resolution process.
@ -55,6 +51,12 @@ struct ResolverArgs {
class ResolverFactory {
public:
virtual ~ResolverFactory() {}
/// Returns the URI scheme that this factory implements.
/// Caller does NOT take ownership of result.
virtual absl::string_view scheme() const = 0;
/// Returns a bool indicating whether the input uri is valid to create a
/// resolver.
virtual bool IsValidUri(const URI& uri) const = 0;
@ -67,14 +69,8 @@ class ResolverFactory {
virtual std::string GetDefaultAuthority(const URI& uri) const {
return std::string(absl::StripPrefix(uri.path(), "/"));
}
/// Returns the URI scheme that this factory implements.
/// Caller does NOT take ownership of result.
virtual const char* scheme() const = 0;
virtual ~ResolverFactory() {}
};
} // namespace grpc_core
#endif /* GRPC_CORE_LIB_RESOLVER_RESOLVER_FACTORY_H */
#endif // GRPC_CORE_LIB_RESOLVER_RESOLVER_FACTORY_H

@ -1,20 +1,18 @@
/*
*
* Copyright 2015 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.
*
*/
//
// Copyright 2015 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 <grpc/support/port_platform.h>
@ -24,6 +22,7 @@
#include <vector>
#include "absl/memory/memory.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/str_format.h"
@ -31,139 +30,63 @@
#include <grpc/support/log.h>
#include <grpc/support/string_util.h>
namespace grpc_core {
namespace {
class RegistryState {
public:
RegistryState() : default_prefix_(gpr_strdup("dns:///")) {}
void SetDefaultPrefix(const char* default_resolver_prefix) {
GPR_ASSERT(default_resolver_prefix != nullptr);
GPR_ASSERT(*default_resolver_prefix != '\0');
default_prefix_.reset(gpr_strdup(default_resolver_prefix));
}
void RegisterResolverFactory(std::unique_ptr<ResolverFactory> factory) {
for (size_t i = 0; i < factories_.size(); ++i) {
GPR_ASSERT(strcmp(factories_[i]->scheme(), factory->scheme()) != 0);
}
factories_.push_back(std::move(factory));
}
ResolverFactory* LookupResolverFactory(absl::string_view scheme) const {
for (size_t i = 0; i < factories_.size(); ++i) {
if (scheme == factories_[i]->scheme()) {
return factories_[i].get();
}
}
return nullptr;
}
// Returns the factory for the scheme of \a target. If \a target does
// not parse as a URI, prepends \a default_prefix_ and tries again.
// If URI parsing is successful (in either attempt), sets \a uri to
// point to the parsed URI.
// If \a default_prefix_ needs to be prepended, sets \a canonical_target
// to the canonical target string.
ResolverFactory* FindResolverFactory(absl::string_view target, URI* uri,
std::string* canonical_target) const {
GPR_ASSERT(uri != nullptr);
absl::StatusOr<URI> tmp_uri = URI::Parse(target);
ResolverFactory* factory =
tmp_uri.ok() ? LookupResolverFactory(tmp_uri->scheme()) : nullptr;
if (factory != nullptr) {
*uri = std::move(*tmp_uri);
return factory;
}
*canonical_target = absl::StrCat(default_prefix_.get(), target);
absl::StatusOr<URI> tmp_uri2 = URI::Parse(*canonical_target);
factory =
tmp_uri2.ok() ? LookupResolverFactory(tmp_uri2->scheme()) : nullptr;
if (factory != nullptr) {
*uri = std::move(*tmp_uri2);
return factory;
}
if (!tmp_uri.ok() || !tmp_uri2.ok()) {
gpr_log(GPR_ERROR, "%s",
absl::StrFormat("Error parsing URI(s). '%s':%s; '%s':%s", target,
tmp_uri.status().ToString(), *canonical_target,
tmp_uri2.status().ToString())
.c_str());
return nullptr;
}
gpr_log(GPR_ERROR, "Don't know how to resolve '%s' or '%s'.",
std::string(target).c_str(), canonical_target->c_str());
return nullptr;
}
private:
// We currently support 10 factories without doing additional
// allocation. This number could be raised if there is a case where
// more factories are needed and the additional allocations are
// hurting performance (which is unlikely, since these allocations
// only occur at gRPC initialization time).
absl::InlinedVector<std::unique_ptr<ResolverFactory>, 10> factories_;
UniquePtr<char> default_prefix_;
};
RegistryState* g_state = nullptr;
#include "src/core/lib/resolver/resolver_registry.h"
} // namespace
namespace grpc_core {
//
// ResolverRegistry::Builder
//
void ResolverRegistry::Builder::InitRegistry() {
if (g_state == nullptr) g_state = new RegistryState();
ResolverRegistry::Builder::Builder() { Reset(); }
void ResolverRegistry::Builder::SetDefaultPrefix(std::string default_prefix) {
state_.default_prefix = std::move(default_prefix);
}
void ResolverRegistry::Builder::RegisterResolverFactory(
std::unique_ptr<ResolverFactory> factory) {
auto p = state_.factories.emplace(factory->scheme(), std::move(factory));
GPR_ASSERT(p.second);
}
void ResolverRegistry::Builder::ShutdownRegistry() {
delete g_state;
g_state = nullptr;
bool ResolverRegistry::Builder::HasResolverFactory(
absl::string_view scheme) const {
return state_.factories.find(scheme) != state_.factories.end();
}
void ResolverRegistry::Builder::SetDefaultPrefix(const char* default_prefix) {
InitRegistry();
g_state->SetDefaultPrefix(default_prefix);
void ResolverRegistry::Builder::Reset() {
state_.factories.clear();
state_.default_prefix = "dns:///";
}
void ResolverRegistry::Builder::RegisterResolverFactory(
std::unique_ptr<ResolverFactory> factory) {
InitRegistry();
g_state->RegisterResolverFactory(std::move(factory));
ResolverRegistry ResolverRegistry::Builder::Build() {
return ResolverRegistry(std::move(state_));
}
//
// ResolverRegistry
//
ResolverFactory* ResolverRegistry::LookupResolverFactory(const char* scheme) {
GPR_ASSERT(g_state != nullptr);
return g_state->LookupResolverFactory(scheme);
}
bool ResolverRegistry::IsValidTarget(absl::string_view target) {
URI uri;
bool ResolverRegistry::IsValidTarget(absl::string_view target) const {
std::string canonical_target;
URI uri;
ResolverFactory* factory =
g_state->FindResolverFactory(target, &uri, &canonical_target);
return factory == nullptr ? false : factory->IsValidUri(uri);
FindResolverFactory(target, &uri, &canonical_target);
if (factory == nullptr) return false;
return factory->IsValidUri(uri);
}
OrphanablePtr<Resolver> ResolverRegistry::CreateResolver(
const char* target, const grpc_channel_args* args,
absl::string_view target, const grpc_channel_args* args,
grpc_pollset_set* pollset_set,
std::shared_ptr<WorkSerializer> work_serializer,
std::unique_ptr<Resolver::ResultHandler> result_handler) {
GPR_ASSERT(g_state != nullptr);
std::unique_ptr<Resolver::ResultHandler> result_handler) const {
std::string canonical_target;
ResolverArgs resolver_args;
ResolverFactory* factory = g_state->FindResolverFactory(
target, &resolver_args.uri, &resolver_args.uri_string);
ResolverFactory* factory =
FindResolverFactory(target, &resolver_args.uri, &canonical_target);
if (factory == nullptr) return nullptr;
if (resolver_args.uri_string.empty()) resolver_args.uri_string = target;
resolver_args.args = args;
resolver_args.pollset_set = pollset_set;
resolver_args.work_serializer = std::move(work_serializer);
@ -171,25 +94,63 @@ OrphanablePtr<Resolver> ResolverRegistry::CreateResolver(
return factory->CreateResolver(std::move(resolver_args));
}
std::string ResolverRegistry::GetDefaultAuthority(absl::string_view target) {
GPR_ASSERT(g_state != nullptr);
URI uri;
std::string ResolverRegistry::GetDefaultAuthority(
absl::string_view target) const {
std::string canonical_target;
URI uri;
ResolverFactory* factory =
g_state->FindResolverFactory(target, &uri, &canonical_target);
std::string authority =
factory == nullptr ? "" : factory->GetDefaultAuthority(uri);
return authority;
FindResolverFactory(target, &uri, &canonical_target);
if (factory == nullptr) return "";
return factory->GetDefaultAuthority(uri);
}
UniquePtr<char> ResolverRegistry::AddDefaultPrefixIfNeeded(const char* target) {
GPR_ASSERT(g_state != nullptr);
URI uri;
std::string ResolverRegistry::AddDefaultPrefixIfNeeded(
absl::string_view target) const {
std::string canonical_target;
g_state->FindResolverFactory(target, &uri, &canonical_target);
return UniquePtr<char>(canonical_target.empty()
? gpr_strdup(target)
: gpr_strdup(canonical_target.c_str()));
URI uri;
FindResolverFactory(target, &uri, &canonical_target);
return canonical_target.empty() ? std::string(target) : canonical_target;
}
ResolverFactory* ResolverRegistry::LookupResolverFactory(
absl::string_view scheme) const {
auto it = state_.factories.find(scheme);
if (it == state_.factories.end()) return nullptr;
return it->second.get();
}
// Returns the factory for the scheme of \a target. If \a target does
// not parse as a URI, prepends \a default_prefix_ and tries again.
// If URI parsing is successful (in either attempt), sets \a uri to
// point to the parsed URI.
ResolverFactory* ResolverRegistry::FindResolverFactory(
absl::string_view target, URI* uri, std::string* canonical_target) const {
GPR_ASSERT(uri != nullptr);
absl::StatusOr<URI> tmp_uri = URI::Parse(target);
ResolverFactory* factory =
tmp_uri.ok() ? LookupResolverFactory(tmp_uri->scheme()) : nullptr;
if (factory != nullptr) {
*uri = std::move(*tmp_uri);
return factory;
}
*canonical_target = absl::StrCat(state_.default_prefix, target);
absl::StatusOr<URI> tmp_uri2 = URI::Parse(*canonical_target);
factory = tmp_uri2.ok() ? LookupResolverFactory(tmp_uri2->scheme()) : nullptr;
if (factory != nullptr) {
*uri = std::move(*tmp_uri2);
return factory;
}
if (!tmp_uri.ok() || !tmp_uri2.ok()) {
gpr_log(GPR_ERROR, "%s",
absl::StrFormat("Error parsing URI(s). '%s':%s; '%s':%s", target,
tmp_uri.status().ToString(), *canonical_target,
tmp_uri2.status().ToString())
.c_str());
return nullptr;
}
gpr_log(GPR_ERROR, "Don't know how to resolve '%s' or '%s'.",
std::string(target).c_str(), canonical_target->c_str());
return nullptr;
}
} // namespace grpc_core

@ -1,20 +1,18 @@
/*
*
* Copyright 2015 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.
*
*/
//
// Copyright 2015 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_RESOLVER_RESOLVER_REGISTRY_H
#define GRPC_CORE_LIB_RESOLVER_RESOLVER_REGISTRY_H
@ -28,29 +26,47 @@
namespace grpc_core {
class ResolverRegistry {
private:
// Forward declaration needed to use this in Builder.
struct State {
std::map<absl::string_view, std::unique_ptr<ResolverFactory>> factories;
std::string default_prefix;
};
public:
/// Methods used to create and populate the ResolverRegistry.
/// NOT THREAD SAFE -- to be used only during global gRPC
/// initialization and shutdown.
class Builder {
public:
/// Global initialization and shutdown hooks.
static void InitRegistry();
static void ShutdownRegistry();
Builder();
/// Sets the default URI prefix to \a default_prefix.
/// Calls InitRegistry() if it has not already been called.
static void SetDefaultPrefix(const char* default_prefix);
void SetDefaultPrefix(std::string default_prefix);
/// Registers a resolver factory. The factory will be used to create a
/// resolver for any URI whose scheme matches that of the factory.
/// Calls InitRegistry() if it has not already been called.
static void RegisterResolverFactory(
std::unique_ptr<ResolverFactory> factory);
void RegisterResolverFactory(std::unique_ptr<ResolverFactory> factory);
/// Returns true iff scheme already has a registered factory.
bool HasResolverFactory(absl::string_view scheme) const;
/// Wipe everything in the registry and reset to empty.
void Reset();
ResolverRegistry Build();
private:
ResolverRegistry::State state_;
};
ResolverRegistry(const ResolverRegistry&) = delete;
ResolverRegistry& operator=(const ResolverRegistry&) = delete;
ResolverRegistry(ResolverRegistry&&) noexcept;
ResolverRegistry& operator=(ResolverRegistry&&) noexcept;
/// Checks whether the user input \a target is valid to create a resolver.
static bool IsValidTarget(absl::string_view target);
bool IsValidTarget(absl::string_view target) const;
/// Creates a resolver given \a target.
/// First tries to parse \a target as a URI. If this succeeds, tries
@ -65,23 +81,33 @@ class ResolverRegistry {
/// name resolution process. \a work_serializer is the work_serializer under
/// which all resolver calls will be run. \a result_handler is used to return
/// results from the resolver.
static OrphanablePtr<Resolver> CreateResolver(
const char* target, const grpc_channel_args* args,
OrphanablePtr<Resolver> CreateResolver(
absl::string_view target, const grpc_channel_args* args,
grpc_pollset_set* pollset_set,
std::shared_ptr<WorkSerializer> work_serializer,
std::unique_ptr<Resolver::ResultHandler> result_handler);
std::unique_ptr<Resolver::ResultHandler> result_handler) const;
/// Returns the default authority to pass from a client for \a target.
static std::string GetDefaultAuthority(absl::string_view target);
std::string GetDefaultAuthority(absl::string_view target) const;
/// Returns \a target with the default prefix prepended, if needed.
static UniquePtr<char> AddDefaultPrefixIfNeeded(const char* target);
std::string AddDefaultPrefixIfNeeded(absl::string_view target) const;
/// Returns the resolver factory for \a scheme.
/// Caller does NOT own the return value.
static ResolverFactory* LookupResolverFactory(const char* scheme);
ResolverFactory* LookupResolverFactory(absl::string_view scheme) const;
private:
explicit ResolverRegistry(State state) : state_(std::move(state)) {}
// TODO(ctiller): fix callers such that the canonical_target argument can be
// removed, and replaced with uri.ToString().
ResolverFactory* FindResolverFactory(absl::string_view target, URI* uri,
std::string* canonical_target) const;
State state_;
};
} // namespace grpc_core
#endif /* GRPC_CORE_LIB_RESOLVER_RESOLVER_REGISTRY_H */
#endif // GRPC_CORE_LIB_RESOLVER_RESOLVER_REGISTRY_H

@ -72,7 +72,11 @@ extern void grpc_register_built_in_plugins(void);
static gpr_once g_basic_init = GPR_ONCE_INIT;
static grpc_core::Mutex* g_init_mu;
static int g_initializations ABSL_GUARDED_BY(g_init_mu) = 0;
static int g_initializations ABSL_GUARDED_BY(g_init_mu) = []() {
grpc_core::CoreConfiguration::SetDefaultBuilder(
grpc_core::BuildCoreConfiguration);
return 0;
}();
static grpc_core::CondVar* g_shutting_down_cv;
static bool g_shutting_down ABSL_GUARDED_BY(g_init_mu) = false;

@ -29,8 +29,6 @@ void grpc_chttp2_plugin_init(void);
void grpc_chttp2_plugin_shutdown(void);
void grpc_client_channel_init(void);
void grpc_client_channel_shutdown(void);
void grpc_resolver_fake_init(void);
void grpc_resolver_fake_shutdown(void);
void grpc_lb_policy_grpclb_init(void);
void grpc_lb_policy_grpclb_shutdown(void);
void grpc_lb_policy_priority_init(void);
@ -43,10 +41,6 @@ void grpc_lb_policy_round_robin_init(void);
void grpc_lb_policy_round_robin_shutdown(void);
void grpc_resolver_dns_ares_init(void);
void grpc_resolver_dns_ares_shutdown(void);
void grpc_resolver_dns_native_init(void);
void grpc_resolver_dns_native_shutdown(void);
void grpc_resolver_sockaddr_init(void);
void grpc_resolver_sockaddr_shutdown(void);
void grpc_message_size_filter_init(void);
void grpc_message_size_filter_shutdown(void);
namespace grpc_core {
@ -62,16 +56,10 @@ void ServiceConfigParserInit(void);
void ServiceConfigParserShutdown(void);
} // namespace grpc_core
#ifdef GPR_SUPPORT_BINDER_TRANSPORT
void grpc_resolver_binder_init(void);
void grpc_resolver_binder_shutdown(void);
#endif
void grpc_register_built_in_plugins(void) {
grpc_register_plugin(grpc_core::ServiceConfigParserInit,
grpc_core::ServiceConfigParserShutdown);
grpc_register_plugin(grpc_client_channel_init, grpc_client_channel_shutdown);
grpc_register_plugin(grpc_resolver_fake_init, grpc_resolver_fake_shutdown);
grpc_register_plugin(grpc_lb_policy_grpclb_init,
grpc_lb_policy_grpclb_shutdown);
#ifndef GRPC_NO_RLS
@ -90,18 +78,10 @@ void grpc_register_built_in_plugins(void) {
grpc_core::GrpcLbPolicyRingHashShutdown);
grpc_register_plugin(grpc_resolver_dns_ares_init,
grpc_resolver_dns_ares_shutdown);
grpc_register_plugin(grpc_resolver_dns_native_init,
grpc_resolver_dns_native_shutdown);
grpc_register_plugin(grpc_resolver_sockaddr_init,
grpc_resolver_sockaddr_shutdown);
grpc_register_plugin(grpc_message_size_filter_init,
grpc_message_size_filter_shutdown);
grpc_register_plugin(grpc_core::FaultInjectionFilterInit,
grpc_core::FaultInjectionFilterShutdown);
#ifdef GPR_SUPPORT_BINDER_TRANSPORT
grpc_register_plugin(grpc_resolver_binder_init,
grpc_resolver_binder_shutdown);
#endif
grpc_register_extra_plugins();
}
@ -124,6 +104,13 @@ extern void RegisterServiceConfigChannelArgFilter(
CoreConfiguration::Builder* builder);
extern void RegisterExtraFilters(CoreConfiguration::Builder* builder);
extern void RegisterResourceQuota(CoreConfiguration::Builder* builder);
extern void RegisterNativeDnsResolver(CoreConfiguration::Builder* builder);
extern void RegisterAresDnsResolver(CoreConfiguration::Builder* builder);
extern void RegisterSockaddrResolver(CoreConfiguration::Builder* builder);
extern void RegisterFakeResolver(CoreConfiguration::Builder* builder);
#ifdef GPR_SUPPORT_BINDER_TRANSPORT
extern void RegisterBinderResolver(CoreConfiguration::Builder* builder);
#endif
void BuildCoreConfiguration(CoreConfiguration::Builder* builder) {
BuildClientChannelConfiguration(builder);
@ -137,6 +124,13 @@ void BuildCoreConfiguration(CoreConfiguration::Builder* builder) {
RegisterMessageSizeFilter(builder);
RegisterServiceConfigChannelArgFilter(builder);
RegisterResourceQuota(builder);
RegisterAresDnsResolver(builder);
RegisterNativeDnsResolver(builder);
RegisterSockaddrResolver(builder);
RegisterFakeResolver(builder);
#ifdef GPR_SUPPORT_BINDER_TRANSPORT
RegisterBinderResolver(builder);
#endif
// Run last so it gets a consistent location.
// TODO(ctiller): Is this actually necessary?
RegisterSecurityFilters(builder);

@ -42,18 +42,14 @@ void grpc_lb_policy_xds_cluster_resolver_init(void);
void grpc_lb_policy_xds_cluster_resolver_shutdown(void);
void grpc_lb_policy_xds_cluster_manager_init(void);
void grpc_lb_policy_xds_cluster_manager_shutdown(void);
void grpc_resolver_xds_init(void);
void grpc_resolver_xds_shutdown(void);
namespace grpc_core {
void GoogleCloud2ProdResolverInit();
void GoogleCloud2ProdResolverShutdown();
} // namespace grpc_core
#endif
void grpc_register_extra_plugins() {
#ifndef GRPC_NO_XDS
// rbac_filter is being guarded with GRPC_NO_XDS to avoid a dependency on the re2 library by default
grpc_register_plugin(grpc_core::RbacFilterInit, grpc_core::RbacFilterShutdown);
// rbac_filter is being guarded with GRPC_NO_XDS to avoid a dependency on the
// re2 library by default
grpc_register_plugin(grpc_core::RbacFilterInit,
grpc_core::RbacFilterShutdown);
grpc_register_plugin(grpc_core::XdsClientGlobalInit,
grpc_core::XdsClientGlobalShutdown);
grpc_register_plugin(grpc_certificate_provider_registry_init,
@ -67,9 +63,6 @@ void grpc_register_extra_plugins() {
grpc_lb_policy_xds_cluster_resolver_shutdown);
grpc_register_plugin(grpc_lb_policy_xds_cluster_manager_init,
grpc_lb_policy_xds_cluster_manager_shutdown);
grpc_register_plugin(grpc_resolver_xds_init, grpc_resolver_xds_shutdown);
grpc_register_plugin(grpc_core::GoogleCloud2ProdResolverInit,
grpc_core::GoogleCloud2ProdResolverShutdown);
#endif
}
@ -78,6 +71,8 @@ namespace grpc_core {
extern void RegisterXdsChannelStackModifier(
CoreConfiguration::Builder* builder);
extern void RegisterChannelDefaultCreds(CoreConfiguration::Builder* builder);
extern void RegisterXdsResolver(CoreConfiguration::Builder* builder);
extern void RegisterCloud2ProdResolver(CoreConfiguration::Builder* builder);
#endif
void RegisterExtraFilters(CoreConfiguration::Builder* builder) {
// Use builder to avoid unused-parameter warning.
@ -85,7 +80,8 @@ void RegisterExtraFilters(CoreConfiguration::Builder* builder) {
#ifndef GRPC_NO_XDS
RegisterXdsChannelStackModifier(builder);
RegisterChannelDefaultCreds(builder);
RegisterXdsResolver(builder);
RegisterCloud2ProdResolver(builder);
#endif
}
} // namespace grpc_core

@ -537,6 +537,7 @@ CORE_SOURCE_FILES = [
'src/core/lib/iomgr/resolve_address.cc',
'src/core/lib/iomgr/resolve_address_posix.cc',
'src/core/lib/iomgr/resolve_address_windows.cc',
'src/core/lib/iomgr/sockaddr_utils_posix.cc',
'src/core/lib/iomgr/socket_factory_posix.cc',
'src/core/lib/iomgr/socket_mutator.cc',
'src/core/lib/iomgr/socket_utils_common_posix.cc',

@ -14,6 +14,7 @@
#include <gtest/gtest.h>
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/iomgr/port.h"
#include "test/core/util/test_config.h"
@ -34,25 +35,38 @@
// Registers the factory with `grpc_core::ResolverRegistry`. Defined in
// binder_resolver.cc
void grpc_resolver_binder_init(void);
namespace grpc_core {
void RegisterBinderResolver(CoreConfiguration::Builder* builder);
}
namespace {
class BinderResolverTest : public ::testing::Test {
public:
BinderResolverTest() {
factory_ = grpc_core::ResolverRegistry::LookupResolverFactory("binder");
factory_ = grpc_core::CoreConfiguration::Get()
.resolver_registry()
.LookupResolverFactory("binder");
}
~BinderResolverTest() override {}
static void SetUpTestSuite() {
grpc_core::CoreConfiguration::Reset();
grpc_core::CoreConfiguration::BuildSpecialConfiguration(
[](grpc_core::CoreConfiguration::Builder* builder) {
BuildCoreConfiguration(builder);
if (!builder->resolver_registry()->HasResolverFactory("binder")) {
// Binder resolver will only be registered on platforms that support
// binder transport. If it is not registered on current platform, we
// manually register it here for testing purpose.
RegisterBinderResolver(builder);
ASSERT_TRUE(
builder->resolver_registry()->HasResolverFactory("binder"));
}
});
grpc_init();
if (grpc_core::ResolverRegistry::LookupResolverFactory("binder") ==
nullptr) {
// Binder resolver will only be registered on platforms that support
// binder transport. If it is not registered on current platform, we
// manually register it here for testing purpose.
grpc_resolver_binder_init();
ASSERT_TRUE(grpc_core::ResolverRegistry::LookupResolverFactory("binder"));
if (grpc_core::CoreConfiguration::Get()
.resolver_registry()
.LookupResolverFactory("binder") == nullptr) {
}
}
static void TearDownTestSuite() { grpc_shutdown(); }
@ -88,7 +102,7 @@ class BinderResolverTest : public ::testing::Test {
void TestSucceeds(const char* string, const std::string& expected_path) {
gpr_log(GPR_DEBUG, "test: '%s' should be valid for '%s'", string,
factory_->scheme());
std::string(factory_->scheme()).c_str());
grpc_core::ExecCtx exec_ctx;
absl::StatusOr<grpc_core::URI> uri = grpc_core::URI::Parse(string);
ASSERT_TRUE(uri.ok()) << uri.status().ToString();
@ -104,7 +118,7 @@ class BinderResolverTest : public ::testing::Test {
void TestFails(const char* string) {
gpr_log(GPR_DEBUG, "test: '%s' should be invalid for '%s'", string,
factory_->scheme());
std::string(factory_->scheme()).c_str());
grpc_core::ExecCtx exec_ctx;
absl::StatusOr<grpc_core::URI> uri = grpc_core::URI::Parse(string);
ASSERT_TRUE(uri.ok()) << uri.status().ToString();

@ -23,6 +23,7 @@
#include "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/iomgr/resolve_address.h"
#include "src/core/lib/iomgr/resolve_address_impl.h"
#include "src/core/lib/iomgr/timer.h"
@ -121,8 +122,9 @@ static void my_cancel_ares_request(grpc_ares_request* request) {
static grpc_core::OrphanablePtr<grpc_core::Resolver> create_resolver(
const char* name,
std::unique_ptr<grpc_core::Resolver::ResultHandler> result_handler) {
grpc_core::ResolverFactory* factory =
grpc_core::ResolverRegistry::LookupResolverFactory("dns");
grpc_core::ResolverFactory* factory = grpc_core::CoreConfiguration::Get()
.resolver_registry()
.LookupResolverFactory("dns");
absl::StatusOr<grpc_core::URI> uri = grpc_core::URI::Parse(name);
if (!uri.ok()) {
gpr_log(GPR_ERROR, "%s", uri.status().ToString().c_str());

@ -25,6 +25,7 @@
#include "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h"
#include "src/core/lib/address_utils/sockaddr_utils.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/gprpp/memory.h"
#include "src/core/lib/iomgr/resolve_address.h"
#include "src/core/lib/iomgr/work_serializer.h"
@ -286,12 +287,13 @@ static void start_test_under_work_serializer(void* arg) {
OnResolutionCallbackArg* res_cb_arg =
static_cast<OnResolutionCallbackArg*>(arg);
res_cb_arg->result_handler = new ResultHandler();
grpc_core::ResolverFactory* factory =
grpc_core::ResolverRegistry::LookupResolverFactory("dns");
grpc_core::ResolverFactory* factory = grpc_core::CoreConfiguration::Get()
.resolver_registry()
.LookupResolverFactory("dns");
absl::StatusOr<grpc_core::URI> uri =
grpc_core::URI::Parse(res_cb_arg->uri_str);
gpr_log(GPR_DEBUG, "test: '%s' should be valid for '%s'", res_cb_arg->uri_str,
factory->scheme());
std::string(factory->scheme()).c_str());
if (!uri.ok()) {
gpr_log(GPR_ERROR, "%s", uri.status().ToString().c_str());
GPR_ASSERT(uri.ok());

@ -23,6 +23,7 @@
#include "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h"
#include "src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/gpr/string.h"
#include "src/core/lib/gprpp/memory.h"
#include "src/core/lib/iomgr/work_serializer.h"
@ -38,7 +39,7 @@ class TestResultHandler : public grpc_core::Resolver::ResultHandler {
static void test_succeeds(grpc_core::ResolverFactory* factory,
const char* string) {
gpr_log(GPR_DEBUG, "test: '%s' should be valid for '%s'", string,
factory->scheme());
std::string(factory->scheme()).c_str());
grpc_core::ExecCtx exec_ctx;
absl::StatusOr<grpc_core::URI> uri = grpc_core::URI::Parse(string);
if (!uri.ok()) {
@ -57,7 +58,7 @@ static void test_succeeds(grpc_core::ResolverFactory* factory,
static void test_fails(grpc_core::ResolverFactory* factory,
const char* string) {
gpr_log(GPR_DEBUG, "test: '%s' should be invalid for '%s'", string,
factory->scheme());
std::string(factory->scheme()).c_str());
grpc_core::ExecCtx exec_ctx;
absl::StatusOr<grpc_core::URI> uri = grpc_core::URI::Parse(string);
if (!uri.ok()) {
@ -80,8 +81,9 @@ int main(int argc, char** argv) {
auto work_serializer = std::make_shared<grpc_core::WorkSerializer>();
g_work_serializer = &work_serializer;
grpc_core::ResolverFactory* dns =
grpc_core::ResolverRegistry::LookupResolverFactory("dns");
grpc_core::ResolverFactory* dns = grpc_core::CoreConfiguration::Get()
.resolver_registry()
.LookupResolverFactory("dns");
test_succeeds(dns, "dns:10.2.1.1");
test_succeeds(dns, "dns:10.2.1.1:1234");

@ -29,6 +29,7 @@
#include "src/core/lib/address_utils/parse_address.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/gprpp/ref_counted_ptr.h"
#include "src/core/lib/iomgr/work_serializer.h"
#include "src/core/lib/resolver/resolver_registry.h"
@ -68,8 +69,9 @@ static grpc_core::OrphanablePtr<grpc_core::Resolver> build_fake_resolver(
std::shared_ptr<grpc_core::WorkSerializer> work_serializer,
grpc_core::FakeResolverResponseGenerator* response_generator,
std::unique_ptr<grpc_core::Resolver::ResultHandler> result_handler) {
grpc_core::ResolverFactory* factory =
grpc_core::ResolverRegistry::LookupResolverFactory("fake");
grpc_core::ResolverFactory* factory = grpc_core::CoreConfiguration::Get()
.resolver_registry()
.LookupResolverFactory("fake");
grpc_arg generator_arg =
grpc_core::FakeResolverResponseGenerator::MakeChannelArg(
response_generator);

@ -24,6 +24,7 @@
#include <grpc/support/string_util.h>
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/iomgr/work_serializer.h"
#include "src/core/lib/resolver/resolver_registry.h"
#include "test/core/util/test_config.h"
@ -38,7 +39,7 @@ class ResultHandler : public grpc_core::Resolver::ResultHandler {
static void test_succeeds(grpc_core::ResolverFactory* factory,
const char* string) {
gpr_log(GPR_DEBUG, "test: '%s' should be valid for '%s'", string,
factory->scheme());
std::string(factory->scheme()).c_str());
grpc_core::ExecCtx exec_ctx;
absl::StatusOr<grpc_core::URI> uri = grpc_core::URI::Parse(string);
if (!uri.ok()) {
@ -61,7 +62,7 @@ static void test_succeeds(grpc_core::ResolverFactory* factory,
static void test_fails(grpc_core::ResolverFactory* factory,
const char* string) {
gpr_log(GPR_DEBUG, "test: '%s' should be invalid for '%s'", string,
factory->scheme());
std::string(factory->scheme()).c_str());
grpc_core::ExecCtx exec_ctx;
absl::StatusOr<grpc_core::URI> uri = grpc_core::URI::Parse(string);
if (!uri.ok()) {
@ -84,10 +85,12 @@ int main(int argc, char** argv) {
auto work_serializer = std::make_shared<grpc_core::WorkSerializer>();
g_work_serializer = &work_serializer;
grpc_core::ResolverFactory* ipv4 =
grpc_core::ResolverRegistry::LookupResolverFactory("ipv4");
grpc_core::ResolverFactory* ipv6 =
grpc_core::ResolverRegistry::LookupResolverFactory("ipv6");
grpc_core::ResolverFactory* ipv4 = grpc_core::CoreConfiguration::Get()
.resolver_registry()
.LookupResolverFactory("ipv4");
grpc_core::ResolverFactory* ipv6 = grpc_core::CoreConfiguration::Get()
.resolver_registry()
.LookupResolverFactory("ipv6");
test_fails(ipv4, "ipv4:10.2.1.1");
test_succeeds(ipv4, "ipv4:10.2.1.1:1234");
@ -104,10 +107,13 @@ int main(int argc, char** argv) {
test_fails(ipv6, "ipv6:www.google.com");
#ifdef GRPC_HAVE_UNIX_SOCKET
grpc_core::ResolverFactory* uds =
grpc_core::ResolverRegistry::LookupResolverFactory("unix");
grpc_core::ResolverFactory* uds = grpc_core::CoreConfiguration::Get()
.resolver_registry()
.LookupResolverFactory("unix");
grpc_core::ResolverFactory* uds_abstract =
grpc_core::ResolverRegistry::LookupResolverFactory("unix-abstract");
grpc_core::CoreConfiguration::Get()
.resolver_registry()
.LookupResolverFactory("unix-abstract");
test_succeeds(uds, "unix:///tmp/sockaddr_resolver_test");
test_succeeds(uds_abstract, "unix-abstract:sockaddr_resolver_test");

@ -26,6 +26,7 @@ grpc_cc_test(
uses_polling = False,
deps = [
"//:config",
"//:grpc",
"//test/core/util:grpc_suppressions",
],
)

@ -30,17 +30,6 @@ grpc_cc_test(
],
)
grpc_cc_test(
name = "channel_create_test",
srcs = ["channel_create_test.cc"],
language = "C++",
deps = [
"//:gpr",
"//:grpc",
"//test/core/util:grpc_test_util",
],
)
grpc_cc_test(
name = "grpc_completion_queue_test",
srcs = ["completion_queue_test.cc"],

@ -1,55 +0,0 @@
/*
*
* Copyright 2015 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 <string.h>
#include <grpc/grpc.h>
#include <grpc/grpc_security.h>
#include <grpc/support/log.h>
#include "src/core/lib/channel/channel_stack.h"
#include "src/core/lib/resolver/resolver_registry.h"
#include "src/core/lib/surface/channel.h"
#include "test/core/util/test_config.h"
void test_unknown_scheme_target(void) {
grpc_channel* chan;
/* avoid default prefix */
grpc_core::ResolverRegistry::Builder::ShutdownRegistry();
grpc_core::ResolverRegistry::Builder::InitRegistry();
grpc_channel_credentials* creds = grpc_insecure_credentials_create();
chan = grpc_channel_create("blah://blah", creds, nullptr);
grpc_channel_credentials_release(creds);
GPR_ASSERT(chan != nullptr);
grpc_core::ExecCtx exec_ctx;
grpc_channel_element* elem =
grpc_channel_stack_element(grpc_channel_get_channel_stack(chan), 0);
GPR_ASSERT(0 == strcmp(elem->filter->name, "lame-client"));
grpc_channel_destroy(chan);
}
int main(int argc, char** argv) {
grpc::testing::TestEnvironment env(argc, argv);
grpc_init();
test_unknown_scheme_target();
grpc_shutdown();
return 0;
}

@ -22,6 +22,7 @@
#include <grpc/grpc_security.h>
#include <grpc/support/log.h>
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/resolver/resolver_registry.h"
#include "src/core/lib/security/credentials/fake/fake_credentials.h"
#include "src/core/lib/security/security_connector/security_connector.h"
@ -29,8 +30,6 @@
#include "test/core/util/test_config.h"
void test_unknown_scheme_target(void) {
grpc_core::ResolverRegistry::Builder::ShutdownRegistry();
grpc_core::ResolverRegistry::Builder::InitRegistry();
grpc_channel_credentials* creds =
grpc_fake_transport_security_credentials_create();
grpc_channel* chan = grpc_channel_create("blah://blah", creds, nullptr);
@ -69,7 +68,13 @@ int main(int argc, char** argv) {
grpc_init();
test_security_connector_already_in_arg();
test_null_creds();
test_unknown_scheme_target();
grpc_core::CoreConfiguration::RunWithSpecialConfiguration(
[](grpc_core::CoreConfiguration::Builder* builder) {
BuildCoreConfiguration(builder);
// Avoid default prefix
builder->resolver_registry()->Reset();
},
[]() { test_unknown_scheme_target(); });
grpc_shutdown();
return 0;
}

@ -35,6 +35,7 @@
#include "src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/debug/stats.h"
#include "src/core/lib/gpr/string.h"
#include "src/core/lib/gprpp/orphanable.h"
@ -165,7 +166,7 @@ void TestCancelActiveDNSQuery(ArgsStruct* args) {
fake_dns_server.port());
// create resolver and resolve
grpc_core::OrphanablePtr<grpc_core::Resolver> resolver =
grpc_core::ResolverRegistry::CreateResolver(
grpc_core::CoreConfiguration::Get().resolver_registry().CreateResolver(
client_target.c_str(), nullptr, args->pollset_set, args->lock,
std::unique_ptr<grpc_core::Resolver::ResultHandler>(
new AssertFailureResultHandler(args)));

@ -46,6 +46,7 @@
#include "src/core/lib/address_utils/parse_address.h"
#include "src/core/lib/address_utils/sockaddr_utils.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/gpr/string.h"
#include "src/core/lib/gprpp/host_port.h"
#include "src/core/lib/gprpp/orphanable.h"
@ -639,7 +640,7 @@ void RunResolvesRelevantRecordsTest(
}
// create resolver and resolve
grpc_core::OrphanablePtr<grpc_core::Resolver> resolver =
grpc_core::ResolverRegistry::CreateResolver(
grpc_core::CoreConfiguration::Get().resolver_registry().CreateResolver(
whole_uri.c_str(), resolver_args, args.pollset_set, args.lock,
CreateResultHandler(&args));
grpc_channel_args_destroy(resolver_args);

@ -2110,6 +2110,7 @@ src/core/lib/iomgr/resolve_address_windows.h \
src/core/lib/iomgr/resolved_address.h \
src/core/lib/iomgr/sockaddr.h \
src/core/lib/iomgr/sockaddr_posix.h \
src/core/lib/iomgr/sockaddr_utils_posix.cc \
src/core/lib/iomgr/sockaddr_windows.h \
src/core/lib/iomgr/socket_factory_posix.cc \
src/core/lib/iomgr/socket_factory_posix.h \

@ -1905,6 +1905,7 @@ src/core/lib/iomgr/resolve_address_windows.h \
src/core/lib/iomgr/resolved_address.h \
src/core/lib/iomgr/sockaddr.h \
src/core/lib/iomgr/sockaddr_posix.h \
src/core/lib/iomgr/sockaddr_utils_posix.cc \
src/core/lib/iomgr/sockaddr_windows.h \
src/core/lib/iomgr/socket_factory_posix.cc \
src/core/lib/iomgr/socket_factory_posix.h \

@ -549,30 +549,6 @@
],
"uses_polling": false
},
{
"args": [],
"benchmark": false,
"ci_platforms": [
"linux",
"mac",
"posix",
"windows"
],
"cpu_cost": 1.0,
"exclude_configs": [],
"exclude_iomgrs": [],
"flaky": false,
"gtest": false,
"language": "c",
"name": "channel_create_test",
"platforms": [
"linux",
"mac",
"posix",
"windows"
],
"uses_polling": true
},
{
"args": [],
"benchmark": false,

Loading…
Cancel
Save