From 1a3b02b44bdd6d0422d9f5225a3f9919873a9ce0 Mon Sep 17 00:00:00 2001 From: sanjaypujare Date: Mon, 5 Apr 2021 16:26:29 -0700 Subject: [PATCH] xds: cache bootstrapInfo in the SslContextProviderFactory to prevent rereading (#8051) --- .../internal/sds/ClientSslContextProviderFactory.java | 10 ++++++++-- .../internal/sds/ServerSslContextProviderFactory.java | 10 ++++++++-- .../sds/ClientSslContextProviderFactoryTest.java | 7 +++++++ .../sds/ServerSslContextProviderFactoryTest.java | 7 +++++++ 4 files changed, 30 insertions(+), 4 deletions(-) diff --git a/xds/src/main/java/io/grpc/xds/internal/sds/ClientSslContextProviderFactory.java b/xds/src/main/java/io/grpc/xds/internal/sds/ClientSslContextProviderFactory.java index db031b6a820..9b339cdcabb 100644 --- a/xds/src/main/java/io/grpc/xds/internal/sds/ClientSslContextProviderFactory.java +++ b/xds/src/main/java/io/grpc/xds/internal/sds/ClientSslContextProviderFactory.java @@ -31,6 +31,7 @@ final class ClientSslContextProviderFactory implements ValueFactory { private final Bootstrapper bootstrapper; + private Bootstrapper.BootstrapInfo bootstrapInfo; private final CertProviderClientSslContextProvider.Factory certProviderClientSslContextProviderFactory; @@ -54,7 +55,9 @@ public SslContextProvider create(UpstreamTlsContext upstreamTlsContext) { if (CommonTlsContextUtil.hasCertProviderInstance( upstreamTlsContext.getCommonTlsContext())) { try { - Bootstrapper.BootstrapInfo bootstrapInfo = bootstrapper.bootstrap(); + if (bootstrapInfo == null) { + bootstrapInfo = bootstrapper.bootstrap(); + } return certProviderClientSslContextProviderFactory.getProvider( upstreamTlsContext, bootstrapInfo.getNode().toEnvoyProtoNode(), @@ -68,9 +71,12 @@ public SslContextProvider create(UpstreamTlsContext upstreamTlsContext) { } else if (CommonTlsContextUtil.hasAllSecretsUsingSds( upstreamTlsContext.getCommonTlsContext())) { try { + if (bootstrapInfo == null) { + bootstrapInfo = bootstrapper.bootstrap(); + } return SdsClientSslContextProvider.getProvider( upstreamTlsContext, - bootstrapper.bootstrap().getNode().toEnvoyProtoNodeV2(), + bootstrapInfo.getNode().toEnvoyProtoNodeV2(), Executors.newSingleThreadExecutor(new ThreadFactoryBuilder() .setNameFormat("client-sds-sslcontext-provider-%d") .setDaemon(true) diff --git a/xds/src/main/java/io/grpc/xds/internal/sds/ServerSslContextProviderFactory.java b/xds/src/main/java/io/grpc/xds/internal/sds/ServerSslContextProviderFactory.java index cd5bc852830..b6d714e1fe2 100644 --- a/xds/src/main/java/io/grpc/xds/internal/sds/ServerSslContextProviderFactory.java +++ b/xds/src/main/java/io/grpc/xds/internal/sds/ServerSslContextProviderFactory.java @@ -31,6 +31,7 @@ final class ServerSslContextProviderFactory implements ValueFactory { private final Bootstrapper bootstrapper; + private Bootstrapper.BootstrapInfo bootstrapInfo; private final CertProviderServerSslContextProvider.Factory certProviderServerSslContextProviderFactory; @@ -55,7 +56,9 @@ public SslContextProvider create( if (CommonTlsContextUtil.hasCertProviderInstance( downstreamTlsContext.getCommonTlsContext())) { try { - Bootstrapper.BootstrapInfo bootstrapInfo = bootstrapper.bootstrap(); + if (bootstrapInfo == null) { + bootstrapInfo = bootstrapper.bootstrap(); + } return certProviderServerSslContextProviderFactory.getProvider( downstreamTlsContext, bootstrapInfo.getNode().toEnvoyProtoNode(), @@ -69,9 +72,12 @@ public SslContextProvider create( } else if (CommonTlsContextUtil.hasAllSecretsUsingSds( downstreamTlsContext.getCommonTlsContext())) { try { + if (bootstrapInfo == null) { + bootstrapInfo = bootstrapper.bootstrap(); + } return SdsServerSslContextProvider.getProvider( downstreamTlsContext, - bootstrapper.bootstrap().getNode().toEnvoyProtoNodeV2(), + bootstrapInfo.getNode().toEnvoyProtoNodeV2(), Executors.newSingleThreadExecutor(new ThreadFactoryBuilder() .setNameFormat("server-sds-sslcontext-provider-%d") .setDaemon(true) diff --git a/xds/src/test/java/io/grpc/xds/internal/sds/ClientSslContextProviderFactoryTest.java b/xds/src/test/java/io/grpc/xds/internal/sds/ClientSslContextProviderFactoryTest.java index 4a1b79c8dd4..2fb30a91be9 100644 --- a/xds/src/test/java/io/grpc/xds/internal/sds/ClientSslContextProviderFactoryTest.java +++ b/xds/src/test/java/io/grpc/xds/internal/sds/ClientSslContextProviderFactoryTest.java @@ -23,6 +23,8 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import com.google.common.collect.ImmutableSet; @@ -139,6 +141,11 @@ public void createCertProviderClientSslContextProvider() throws XdsInitializatio clientSslContextProviderFactory.create(upstreamTlsContext); assertThat(sslContextProvider).isInstanceOf(CertProviderClientSslContextProvider.class); verifyWatcher(sslContextProvider, watcherCaptor[0]); + // verify that bootstrapInfo is cached... + sslContextProvider = + clientSslContextProviderFactory.create(upstreamTlsContext); + assertThat(sslContextProvider).isInstanceOf(CertProviderClientSslContextProvider.class); + verify(bootstrapper, times(1)).bootstrap(); } @Test diff --git a/xds/src/test/java/io/grpc/xds/internal/sds/ServerSslContextProviderFactoryTest.java b/xds/src/test/java/io/grpc/xds/internal/sds/ServerSslContextProviderFactoryTest.java index 43fbf41b75f..75247654ff2 100644 --- a/xds/src/test/java/io/grpc/xds/internal/sds/ServerSslContextProviderFactoryTest.java +++ b/xds/src/test/java/io/grpc/xds/internal/sds/ServerSslContextProviderFactoryTest.java @@ -23,6 +23,8 @@ import static io.grpc.xds.internal.sds.CommonTlsContextTestsUtil.SERVER_1_KEY_FILE; import static io.grpc.xds.internal.sds.CommonTlsContextTestsUtil.SERVER_1_PEM_FILE; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import com.google.common.collect.ImmutableSet; @@ -135,6 +137,11 @@ public void createCertProviderServerSslContextProvider() throws XdsInitializatio serverSslContextProviderFactory.create(downstreamTlsContext); assertThat(sslContextProvider).isInstanceOf(CertProviderServerSslContextProvider.class); verifyWatcher(sslContextProvider, watcherCaptor[0]); + // verify that bootstrapInfo is cached... + sslContextProvider = + serverSslContextProviderFactory.create(downstreamTlsContext); + assertThat(sslContextProvider).isInstanceOf(CertProviderServerSslContextProvider.class); + verify(bootstrapper, times(1)).bootstrap(); } @Test