From 1e30cb66018637cf15030fdb372ed68d168030a5 Mon Sep 17 00:00:00 2001 From: Stephane Landelle Date: Thu, 6 Jul 2023 22:42:43 +0200 Subject: [PATCH] core,grpclb: Resolve isAndroid only once on class loading (#10345) Motivation: When multiple NameResolvers are created, the Classloader is scanned every time trying to figure out if the Platform is Android. This expensive work could be done only once. Modification: Cache isAndroid resolution in a constant. Result: Less expensive multiple NameResolvers instantiation. --- .../main/java/io/grpc/internal/DnsNameResolverProvider.java | 5 ++++- .../io/grpc/grpclb/SecretGrpclbNameResolverProvider.java | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/io/grpc/internal/DnsNameResolverProvider.java b/core/src/main/java/io/grpc/internal/DnsNameResolverProvider.java index da0410f3e5..cfe65afc1b 100644 --- a/core/src/main/java/io/grpc/internal/DnsNameResolverProvider.java +++ b/core/src/main/java/io/grpc/internal/DnsNameResolverProvider.java @@ -46,6 +46,9 @@ public final class DnsNameResolverProvider extends NameResolverProvider { private static final String SCHEME = "dns"; + private static final boolean IS_ANDROID = InternalServiceProviders + .isAndroid(DnsNameResolverProvider.class.getClassLoader()); + @Override public NameResolver newNameResolver(URI targetUri, NameResolver.Args args) { if (SCHEME.equals(targetUri.getScheme())) { @@ -60,7 +63,7 @@ public final class DnsNameResolverProvider extends NameResolverProvider { args, GrpcUtil.SHARED_CHANNEL_EXECUTOR, Stopwatch.createUnstarted(), - InternalServiceProviders.isAndroid(getClass().getClassLoader())), + IS_ANDROID), new BackoffPolicyRetryScheduler( new ExponentialBackoffPolicy.Provider(), args.getScheduledExecutorService(), diff --git a/grpclb/src/main/java/io/grpc/grpclb/SecretGrpclbNameResolverProvider.java b/grpclb/src/main/java/io/grpc/grpclb/SecretGrpclbNameResolverProvider.java index da5b7c3353..3970c281e1 100644 --- a/grpclb/src/main/java/io/grpc/grpclb/SecretGrpclbNameResolverProvider.java +++ b/grpclb/src/main/java/io/grpc/grpclb/SecretGrpclbNameResolverProvider.java @@ -53,6 +53,9 @@ final class SecretGrpclbNameResolverProvider { private static final String SCHEME = "dns"; + private static final boolean IS_ANDROID = InternalServiceProviders + .isAndroid(SecretGrpclbNameResolverProvider.class.getClassLoader()); + @Override public GrpclbNameResolver newNameResolver(URI targetUri, Args args) { if (SCHEME.equals(targetUri.getScheme())) { @@ -68,7 +71,7 @@ final class SecretGrpclbNameResolverProvider { args, GrpcUtil.SHARED_CHANNEL_EXECUTOR, Stopwatch.createUnstarted(), - InternalServiceProviders.isAndroid(getClass().getClassLoader())); + IS_ANDROID); } else { return null; }