diff --git a/persistence/relational-jdbc/src/main/java/org/apache/polaris/persistence/relational/jdbc/JdbcMetaStoreManagerFactory.java b/persistence/relational-jdbc/src/main/java/org/apache/polaris/persistence/relational/jdbc/JdbcMetaStoreManagerFactory.java index f91c9bfc89..62a87f28c2 100644 --- a/persistence/relational-jdbc/src/main/java/org/apache/polaris/persistence/relational/jdbc/JdbcMetaStoreManagerFactory.java +++ b/persistence/relational-jdbc/src/main/java/org/apache/polaris/persistence/relational/jdbc/JdbcMetaStoreManagerFactory.java @@ -54,7 +54,6 @@ import org.apache.polaris.core.persistence.dao.entity.EntityResult; import org.apache.polaris.core.persistence.dao.entity.PrincipalSecretsResult; import org.apache.polaris.core.storage.PolarisStorageIntegrationProvider; -import org.apache.polaris.core.storage.cache.StorageCredentialCache; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -70,7 +69,6 @@ public class JdbcMetaStoreManagerFactory implements MetaStoreManagerFactory { private static final Logger LOGGER = LoggerFactory.getLogger(JdbcMetaStoreManagerFactory.class); final Map metaStoreManagerMap = new HashMap<>(); - final Map storageCredentialCacheMap = new HashMap<>(); final Map entityCacheMap = new HashMap<>(); final Map> sessionSupplierMap = new HashMap<>(); protected final PolarisDiagnostics diagServices = new PolarisDefaultDiagServiceImpl(); @@ -183,7 +181,6 @@ public Map purgeRealms(Iterable realms) { BaseResult result = metaStoreManager.purge(callContext); results.put(realm, result); - storageCredentialCacheMap.remove(realm); sessionSupplierMap.remove(realm); metaStoreManagerMap.remove(realm); } @@ -218,17 +215,6 @@ public synchronized Supplier getOrCreateSessionSupplier( return sessionSupplierMap.get(realmContext.getRealmIdentifier()); } - @Override - public synchronized StorageCredentialCache getOrCreateStorageCredentialCache( - RealmContext realmContext, RealmConfig realmConfig) { - if (!storageCredentialCacheMap.containsKey(realmContext.getRealmIdentifier())) { - storageCredentialCacheMap.put( - realmContext.getRealmIdentifier(), new StorageCredentialCache()); - } - - return storageCredentialCacheMap.get(realmContext.getRealmIdentifier()); - } - @Override public synchronized EntityCache getOrCreateEntityCache( RealmContext realmContext, RealmConfig realmConfig) { diff --git a/polaris-core/src/main/java/org/apache/polaris/core/persistence/LocalPolarisMetaStoreManagerFactory.java b/polaris-core/src/main/java/org/apache/polaris/core/persistence/LocalPolarisMetaStoreManagerFactory.java index d4feb4850e..2483968fe4 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/persistence/LocalPolarisMetaStoreManagerFactory.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/persistence/LocalPolarisMetaStoreManagerFactory.java @@ -41,7 +41,6 @@ import org.apache.polaris.core.persistence.dao.entity.PrincipalSecretsResult; import org.apache.polaris.core.persistence.transactional.TransactionalMetaStoreManagerImpl; import org.apache.polaris.core.persistence.transactional.TransactionalPersistence; -import org.apache.polaris.core.storage.cache.StorageCredentialCache; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -54,7 +53,6 @@ public abstract class LocalPolarisMetaStoreManagerFactory implements MetaStoreManagerFactory { final Map metaStoreManagerMap = new HashMap<>(); - final Map storageCredentialCacheMap = new HashMap<>(); final Map entityCacheMap = new HashMap<>(); final Map backingStoreMap = new HashMap<>(); final Map> sessionSupplierMap = new HashMap<>(); @@ -138,7 +136,6 @@ public Map purgeRealms(Iterable realms) { BaseResult result = metaStoreManager.purge(callContext); results.put(realm, result); - storageCredentialCacheMap.remove(realm); backingStoreMap.remove(realm); sessionSupplierMap.remove(realm); metaStoreManagerMap.remove(realm); @@ -172,17 +169,6 @@ public synchronized Supplier getOrCreateSessionSupplie return sessionSupplierMap.get(realmContext.getRealmIdentifier()); } - @Override - public synchronized StorageCredentialCache getOrCreateStorageCredentialCache( - RealmContext realmContext, RealmConfig realmConfig) { - if (!storageCredentialCacheMap.containsKey(realmContext.getRealmIdentifier())) { - storageCredentialCacheMap.put( - realmContext.getRealmIdentifier(), new StorageCredentialCache()); - } - - return storageCredentialCacheMap.get(realmContext.getRealmIdentifier()); - } - @Override public synchronized EntityCache getOrCreateEntityCache( RealmContext realmContext, RealmConfig realmConfig) { diff --git a/polaris-core/src/main/java/org/apache/polaris/core/persistence/MetaStoreManagerFactory.java b/polaris-core/src/main/java/org/apache/polaris/core/persistence/MetaStoreManagerFactory.java index 865abc03aa..c9f14cd8e8 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/persistence/MetaStoreManagerFactory.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/persistence/MetaStoreManagerFactory.java @@ -27,7 +27,6 @@ import org.apache.polaris.core.persistence.cache.EntityCache; import org.apache.polaris.core.persistence.dao.entity.BaseResult; import org.apache.polaris.core.persistence.dao.entity.PrincipalSecretsResult; -import org.apache.polaris.core.storage.cache.StorageCredentialCache; /** Configuration interface for configuring the {@link PolarisMetaStoreManager}. */ public interface MetaStoreManagerFactory { @@ -36,9 +35,6 @@ public interface MetaStoreManagerFactory { Supplier getOrCreateSessionSupplier(RealmContext realmContext); - StorageCredentialCache getOrCreateStorageCredentialCache( - RealmContext realmContext, RealmConfig realmConfig); - EntityCache getOrCreateEntityCache(RealmContext realmContext, RealmConfig realmConfig); Map bootstrapRealms( diff --git a/polaris-core/src/main/java/org/apache/polaris/core/storage/cache/StorageCredentialCache.java b/polaris-core/src/main/java/org/apache/polaris/core/storage/cache/StorageCredentialCache.java index 4da19f0c22..27523ef736 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/storage/cache/StorageCredentialCache.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/storage/cache/StorageCredentialCache.java @@ -46,15 +46,13 @@ public class StorageCredentialCache { private static final Logger LOGGER = LoggerFactory.getLogger(StorageCredentialCache.class); - private static final long CACHE_MAX_NUMBER_OF_ENTRIES = 10_000L; - private final LoadingCache cache; /** Initialize the creds cache */ - public StorageCredentialCache() { + public StorageCredentialCache(StorageCredentialCacheConfig cacheConfig) { cache = Caffeine.newBuilder() - .maximumSize(CACHE_MAX_NUMBER_OF_ENTRIES) + .maximumSize(cacheConfig.maxEntryCount()) .expireAfter( Expiry.creating( (StorageCredentialCacheKey key, StorageCredentialCacheEntry entry) -> { diff --git a/polaris-core/src/main/java/org/apache/polaris/core/storage/cache/StorageCredentialCacheConfig.java b/polaris-core/src/main/java/org/apache/polaris/core/storage/cache/StorageCredentialCacheConfig.java new file mode 100644 index 0000000000..e1e22b5c6d --- /dev/null +++ b/polaris-core/src/main/java/org/apache/polaris/core/storage/cache/StorageCredentialCacheConfig.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.polaris.core.storage.cache; + +public interface StorageCredentialCacheConfig { + + long maxEntryCount(); +} diff --git a/polaris-core/src/test/java/org/apache/polaris/core/storage/cache/StorageCredentialCacheTest.java b/polaris-core/src/test/java/org/apache/polaris/core/storage/cache/StorageCredentialCacheTest.java index 0d4bb39bb1..1460b71cf6 100644 --- a/polaris-core/src/test/java/org/apache/polaris/core/storage/cache/StorageCredentialCacheTest.java +++ b/polaris-core/src/test/java/org/apache/polaris/core/storage/cache/StorageCredentialCacheTest.java @@ -54,10 +54,8 @@ public class StorageCredentialCacheTest { - // polaris call context private final PolarisCallContext callCtx; - - // the meta store manager + private final StorageCredentialCacheConfig storageCredentialCacheConfig; private final PolarisMetaStoreManager metaStoreManager; private StorageCredentialCache storageCredentialCache; @@ -71,12 +69,13 @@ public StorageCredentialCacheTest() { TransactionalPersistence metaStore = new TreeMapTransactionalPersistenceImpl(store, Mockito.mock(), RANDOM_SECRETS); callCtx = new PolarisCallContext(() -> "testRealm", metaStore, diagServices); + storageCredentialCacheConfig = () -> 10_000; metaStoreManager = Mockito.mock(PolarisMetaStoreManager.class); storageCredentialCache = newStorageCredentialCache(); } private StorageCredentialCache newStorageCredentialCache() { - return new StorageCredentialCache(); + return new StorageCredentialCache(storageCredentialCacheConfig); } @Test diff --git a/runtime/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusProducers.java b/runtime/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusProducers.java index a9f9b2e77f..f3eeb161fe 100644 --- a/runtime/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusProducers.java +++ b/runtime/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusProducers.java @@ -52,6 +52,7 @@ import org.apache.polaris.core.secrets.UserSecretsManager; import org.apache.polaris.core.secrets.UserSecretsManagerFactory; import org.apache.polaris.core.storage.cache.StorageCredentialCache; +import org.apache.polaris.core.storage.cache.StorageCredentialCacheConfig; import org.apache.polaris.service.auth.ActiveRolesProvider; import org.apache.polaris.service.auth.AuthenticationType; import org.apache.polaris.service.auth.Authenticator; @@ -100,8 +101,9 @@ public Clock clock() { @Produces @ApplicationScoped - public StorageCredentialCache storageCredentialCache() { - return new StorageCredentialCache(); + public StorageCredentialCache storageCredentialCache( + StorageCredentialCacheConfig storageCredentialCacheConfig) { + return new StorageCredentialCache(storageCredentialCacheConfig); } @Produces diff --git a/runtime/service/src/main/java/org/apache/polaris/service/quarkus/storage/QuarkusStorageCredentialCacheConfig.java b/runtime/service/src/main/java/org/apache/polaris/service/quarkus/storage/QuarkusStorageCredentialCacheConfig.java new file mode 100644 index 0000000000..c21dcc9caf --- /dev/null +++ b/runtime/service/src/main/java/org/apache/polaris/service/quarkus/storage/QuarkusStorageCredentialCacheConfig.java @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.polaris.service.quarkus.storage; + +import io.smallrye.config.ConfigMapping; +import io.smallrye.config.WithDefault; +import io.smallrye.config.WithName; +import jakarta.validation.constraints.Min; +import org.apache.polaris.core.storage.cache.StorageCredentialCacheConfig; + +@ConfigMapping(prefix = "polaris.storage-credential-cache") +public interface QuarkusStorageCredentialCacheConfig extends StorageCredentialCacheConfig { + @WithName("max-entry-count") + @WithDefault("10000") + @Min(0) + @Override + long maxEntryCount(); +} diff --git a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/IcebergCatalogHandlerAuthzTest.java b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/IcebergCatalogHandlerAuthzTest.java index c6d848636d..9a668f2c3f 100644 --- a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/IcebergCatalogHandlerAuthzTest.java +++ b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/IcebergCatalogHandlerAuthzTest.java @@ -1791,7 +1791,7 @@ public void testSendNotificationSufficientPrivileges() { PolarisCallContextCatalogFactory factory = new PolarisCallContextCatalogFactory( - new RealmEntityManagerFactory(null, null) { + new RealmEntityManagerFactory(null, null, null) { @Override public PolarisEntityManager getOrCreateEntityManager(RealmContext realmContext) { return entityManager; diff --git a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/IcebergCatalogTest.java b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/IcebergCatalogTest.java index 2ef683b5d3..0bd413cba3 100644 --- a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/IcebergCatalogTest.java +++ b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/IcebergCatalogTest.java @@ -126,6 +126,7 @@ import org.apache.polaris.core.storage.aws.AwsCredentialsStorageIntegration; import org.apache.polaris.core.storage.aws.AwsStorageConfigurationInfo; import org.apache.polaris.core.storage.cache.StorageCredentialCache; +import org.apache.polaris.core.storage.cache.StorageCredentialCacheConfig; import org.apache.polaris.service.admin.PolarisAdminService; import org.apache.polaris.service.catalog.PolarisPassthroughResolutionView; import org.apache.polaris.service.catalog.iceberg.CatalogHandlerUtils; @@ -237,6 +238,7 @@ public Map getConfigOverrides() { @Inject MetaStoreManagerFactory metaStoreManagerFactory; @Inject PolarisConfigurationStore configurationStore; + @Inject StorageCredentialCacheConfig storageCredentialCacheConfig; @Inject PolarisStorageIntegrationProvider storageIntegrationProvider; @Inject UserSecretsManagerFactory userSecretsManagerFactory; @Inject PolarisDiagnostics diagServices; @@ -248,6 +250,7 @@ public Map getConfigOverrides() { private UserSecretsManager userSecretsManager; private PolarisCallContext polarisContext; private PolarisAdminService adminService; + private StorageCredentialCache storageCredentialCache; private PolarisEntityManager entityManager; private FileIOFactory fileIOFactory; private InMemoryFileIO fileIO; @@ -286,10 +289,12 @@ public void before(TestInfo testInfo) { configurationStore, Clock.systemDefaultZone()); + storageCredentialCache = new StorageCredentialCache(storageCredentialCacheConfig); + entityManager = new PolarisEntityManager( metaStoreManager, - new StorageCredentialCache(), + storageCredentialCache, createEntityCache(polarisContext.getRealmConfig(), metaStoreManager)); PrincipalEntity rootEntity = @@ -352,7 +357,8 @@ public void before(TestInfo testInfo) { .asCatalog())); RealmEntityManagerFactory realmEntityManagerFactory = - new RealmEntityManagerFactory(metaStoreManagerFactory, configurationStore); + new RealmEntityManagerFactory( + metaStoreManagerFactory, configurationStore, storageCredentialCache); this.fileIOFactory = new DefaultFileIOFactory(realmEntityManagerFactory, metaStoreManagerFactory); @@ -986,7 +992,8 @@ public void testValidateNotificationFailToCreateFileIO() { FileIOFactory fileIOFactory = spy( new DefaultFileIOFactory( - new RealmEntityManagerFactory(metaStoreManagerFactory, configurationStore), + new RealmEntityManagerFactory( + metaStoreManagerFactory, configurationStore, storageCredentialCache), metaStoreManagerFactory)); IcebergCatalog catalog = new IcebergCatalog( @@ -1877,7 +1884,8 @@ public void testDropTableWithPurge() { FileIO fileIO = new TaskFileIOSupplier( new DefaultFileIOFactory( - new RealmEntityManagerFactory(metaStoreManagerFactory, configurationStore), + new RealmEntityManagerFactory( + metaStoreManagerFactory, configurationStore, storageCredentialCache), metaStoreManagerFactory)) .apply(taskEntity, polarisContext); Assertions.assertThat(fileIO).isNotNull().isInstanceOf(ExceptionMappingFileIO.class); @@ -2021,7 +2029,8 @@ public void testFileIOWrapper() { MeasuredFileIOFactory measured = new MeasuredFileIOFactory( - new RealmEntityManagerFactory(metaStoreManagerFactory, configurationStore), + new RealmEntityManagerFactory( + metaStoreManagerFactory, configurationStore, storageCredentialCache), metaStoreManagerFactory); IcebergCatalog catalog = new IcebergCatalog( diff --git a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/IcebergCatalogViewTest.java b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/IcebergCatalogViewTest.java index 4e516d015c..9f587fae93 100644 --- a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/IcebergCatalogViewTest.java +++ b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/IcebergCatalogViewTest.java @@ -62,6 +62,7 @@ import org.apache.polaris.core.secrets.UserSecretsManager; import org.apache.polaris.core.secrets.UserSecretsManagerFactory; import org.apache.polaris.core.storage.cache.StorageCredentialCache; +import org.apache.polaris.core.storage.cache.StorageCredentialCacheConfig; import org.apache.polaris.service.admin.PolarisAdminService; import org.apache.polaris.service.catalog.PolarisPassthroughResolutionView; import org.apache.polaris.service.catalog.iceberg.IcebergCatalog; @@ -130,6 +131,7 @@ public Map getConfigOverrides() { @Inject MetaStoreManagerFactory metaStoreManagerFactory; @Inject UserSecretsManagerFactory userSecretsManagerFactory; @Inject PolarisConfigurationStore configurationStore; + @Inject StorageCredentialCacheConfig storageCredentialCacheConfig; @Inject PolarisDiagnostics diagServices; @Inject PolarisEventListener polarisEventListener; @@ -176,10 +178,12 @@ public void before(TestInfo testInfo) { configurationStore, Clock.systemDefaultZone()); + StorageCredentialCache storageCredentialCache = + new StorageCredentialCache(storageCredentialCacheConfig); PolarisEntityManager entityManager = new PolarisEntityManager( metaStoreManager, - new StorageCredentialCache(), + storageCredentialCache, new InMemoryEntityCache(polarisContext.getRealmConfig(), metaStoreManager)); CallContext.setCurrentContext(polarisContext); @@ -236,7 +240,8 @@ public void before(TestInfo testInfo) { polarisContext, entityManager, securityContext, CATALOG_NAME); FileIOFactory fileIOFactory = new DefaultFileIOFactory( - new RealmEntityManagerFactory(metaStoreManagerFactory, configurationStore), + new RealmEntityManagerFactory( + metaStoreManagerFactory, configurationStore, storageCredentialCache), metaStoreManagerFactory); testPolarisEventListener = (TestPolarisEventListener) polarisEventListener; diff --git a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolarisGenericTableCatalogTest.java b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolarisGenericTableCatalogTest.java index 7b8cfa3e99..002ddc8d29 100644 --- a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolarisGenericTableCatalogTest.java +++ b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolarisGenericTableCatalogTest.java @@ -67,6 +67,7 @@ import org.apache.polaris.core.storage.aws.AwsCredentialsStorageIntegration; import org.apache.polaris.core.storage.aws.AwsStorageConfigurationInfo; import org.apache.polaris.core.storage.cache.StorageCredentialCache; +import org.apache.polaris.core.storage.cache.StorageCredentialCacheConfig; import org.apache.polaris.service.admin.PolarisAdminService; import org.apache.polaris.service.catalog.PolarisPassthroughResolutionView; import org.apache.polaris.service.catalog.generic.PolarisGenericTableCatalog; @@ -120,6 +121,7 @@ public Map getConfigOverrides() { @Inject MetaStoreManagerFactory metaStoreManagerFactory; @Inject UserSecretsManagerFactory userSecretsManagerFactory; @Inject PolarisConfigurationStore configurationStore; + @Inject StorageCredentialCacheConfig storageCredentialCacheConfig; @Inject PolarisStorageIntegrationProvider storageIntegrationProvider; @Inject PolarisDiagnostics diagServices; @@ -168,10 +170,12 @@ public void before(TestInfo testInfo) { diagServices, configurationStore, Clock.systemDefaultZone()); + StorageCredentialCache storageCredentialCache = + new StorageCredentialCache(storageCredentialCacheConfig); entityManager = new PolarisEntityManager( metaStoreManager, - new StorageCredentialCache(), + storageCredentialCache, new InMemoryEntityCache(polarisContext.getRealmConfig(), metaStoreManager)); PrincipalEntity rootEntity = @@ -237,7 +241,8 @@ public void before(TestInfo testInfo) { polarisContext, entityManager, securityContext, CATALOG_NAME); TaskExecutor taskExecutor = Mockito.mock(); RealmEntityManagerFactory realmEntityManagerFactory = - new RealmEntityManagerFactory(metaStoreManagerFactory, configurationStore); + new RealmEntityManagerFactory( + metaStoreManagerFactory, configurationStore, storageCredentialCache); this.fileIOFactory = new DefaultFileIOFactory(realmEntityManagerFactory, metaStoreManagerFactory); diff --git a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolicyCatalogTest.java b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolicyCatalogTest.java index cadfab7131..3938bc1120 100644 --- a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolicyCatalogTest.java +++ b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolicyCatalogTest.java @@ -81,6 +81,7 @@ import org.apache.polaris.core.storage.aws.AwsCredentialsStorageIntegration; import org.apache.polaris.core.storage.aws.AwsStorageConfigurationInfo; import org.apache.polaris.core.storage.cache.StorageCredentialCache; +import org.apache.polaris.core.storage.cache.StorageCredentialCacheConfig; import org.apache.polaris.service.admin.PolarisAdminService; import org.apache.polaris.service.catalog.PolarisPassthroughResolutionView; import org.apache.polaris.service.catalog.iceberg.IcebergCatalog; @@ -150,6 +151,7 @@ public Map getConfigOverrides() { @Inject MetaStoreManagerFactory metaStoreManagerFactory; @Inject UserSecretsManagerFactory userSecretsManagerFactory; @Inject PolarisConfigurationStore configurationStore; + @Inject StorageCredentialCacheConfig storageCredentialCacheConfig; @Inject PolarisStorageIntegrationProvider storageIntegrationProvider; @Inject PolarisDiagnostics diagServices; @@ -194,10 +196,12 @@ public void before(TestInfo testInfo) { diagServices, configurationStore, Clock.systemDefaultZone()); + StorageCredentialCache storageCredentialCache = + new StorageCredentialCache(storageCredentialCacheConfig); entityManager = new PolarisEntityManager( metaStoreManager, - new StorageCredentialCache(), + storageCredentialCache, new InMemoryEntityCache(polarisContext.getRealmConfig(), metaStoreManager)); callContext = polarisContext; @@ -263,7 +267,8 @@ public void before(TestInfo testInfo) { callContext, entityManager, securityContext, CATALOG_NAME); TaskExecutor taskExecutor = Mockito.mock(); RealmEntityManagerFactory realmEntityManagerFactory = - new RealmEntityManagerFactory(metaStoreManagerFactory, configurationStore); + new RealmEntityManagerFactory( + metaStoreManagerFactory, configurationStore, storageCredentialCache); this.fileIOFactory = new DefaultFileIOFactory(realmEntityManagerFactory, metaStoreManagerFactory); diff --git a/service/common/src/main/java/org/apache/polaris/service/config/RealmEntityManagerFactory.java b/service/common/src/main/java/org/apache/polaris/service/config/RealmEntityManagerFactory.java index ff962dc639..af372f682c 100644 --- a/service/common/src/main/java/org/apache/polaris/service/config/RealmEntityManagerFactory.java +++ b/service/common/src/main/java/org/apache/polaris/service/config/RealmEntityManagerFactory.java @@ -28,6 +28,7 @@ import org.apache.polaris.core.context.RealmContext; import org.apache.polaris.core.persistence.MetaStoreManagerFactory; import org.apache.polaris.core.persistence.PolarisEntityManager; +import org.apache.polaris.core.storage.cache.StorageCredentialCache; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -39,6 +40,7 @@ public class RealmEntityManagerFactory { private final MetaStoreManagerFactory metaStoreManagerFactory; private final PolarisConfigurationStore configurationStore; + private final StorageCredentialCache storageCredentialCache; // Key: realmIdentifier private final Map cachedEntityManagers = new ConcurrentHashMap<>(); @@ -46,9 +48,11 @@ public class RealmEntityManagerFactory { @Inject public RealmEntityManagerFactory( MetaStoreManagerFactory metaStoreManagerFactory, - PolarisConfigurationStore configurationStore) { + PolarisConfigurationStore configurationStore, + StorageCredentialCache storageCredentialCache) { this.metaStoreManagerFactory = metaStoreManagerFactory; this.configurationStore = configurationStore; + this.storageCredentialCache = storageCredentialCache; } public PolarisEntityManager getOrCreateEntityManager(RealmContext context) { @@ -63,7 +67,7 @@ public PolarisEntityManager getOrCreateEntityManager(RealmContext context) { RealmConfig realmConfig = new RealmConfigImpl(configurationStore, context); return new PolarisEntityManager( metaStoreManagerFactory.getOrCreateMetaStoreManager(context), - metaStoreManagerFactory.getOrCreateStorageCredentialCache(context, realmConfig), + storageCredentialCache, metaStoreManagerFactory.getOrCreateEntityCache(context, realmConfig)); }); } diff --git a/service/common/src/testFixtures/java/org/apache/polaris/service/TestServices.java b/service/common/src/testFixtures/java/org/apache/polaris/service/TestServices.java index e8f1950d5d..38cedd8be6 100644 --- a/service/common/src/testFixtures/java/org/apache/polaris/service/TestServices.java +++ b/service/common/src/testFixtures/java/org/apache/polaris/service/TestServices.java @@ -47,6 +47,8 @@ import org.apache.polaris.core.persistence.dao.entity.CreatePrincipalResult; import org.apache.polaris.core.secrets.UserSecretsManager; import org.apache.polaris.core.secrets.UserSecretsManagerFactory; +import org.apache.polaris.core.storage.cache.StorageCredentialCache; +import org.apache.polaris.core.storage.cache.StorageCredentialCacheConfig; import org.apache.polaris.service.admin.PolarisServiceImpl; import org.apache.polaris.service.admin.api.PolarisCatalogsApi; import org.apache.polaris.service.catalog.DefaultCatalogPrefixParser; @@ -152,8 +154,12 @@ public TestServices build() { InMemoryPolarisMetaStoreManagerFactory metaStoreManagerFactory = new InMemoryPolarisMetaStoreManagerFactory( storageIntegrationProvider, polarisDiagnostics); + StorageCredentialCacheConfig storageCredentialCacheConfig = () -> 10_000; + StorageCredentialCache storageCredentialCache = + new StorageCredentialCache(storageCredentialCacheConfig); RealmEntityManagerFactory realmEntityManagerFactory = - new RealmEntityManagerFactory(metaStoreManagerFactory, configurationStore); + new RealmEntityManagerFactory( + metaStoreManagerFactory, configurationStore, storageCredentialCache); UserSecretsManagerFactory userSecretsManagerFactory = new UnsafeInMemorySecretsManagerFactory();