This is an automated email from the ASF dual-hosted git repository. snazy pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/polaris.git
The following commit(s) were added to refs/heads/main by this push: new 2c2052c28 Use application-scoped StorageCredentialCache (#2022) 2c2052c28 is described below commit 2c2052c28f899aaa85e5f11a9131d9812ec62679 Author: Christopher Lambert <xn...@gmx.de> AuthorDate: Tue Jul 15 10:05:48 2025 +0200 Use application-scoped StorageCredentialCache (#2022) Since `StorageCredentialCache` is application scoped and after 6ddd1487877ce13f2640ea73437b24bbd7c3eb09 its constructor no longer uses the `RealmContext` passed into `getOrCreateStorageCredentialCache` we can now let all `PolarisEntityManager` instances share the same `StorageCredentialCache`. --- .../jdbc/JdbcMetaStoreManagerFactory.java | 14 --------- .../LocalPolarisMetaStoreManagerFactory.java | 14 --------- .../core/persistence/MetaStoreManagerFactory.java | 4 --- .../core/storage/cache/StorageCredentialCache.java | 6 ++-- .../cache/StorageCredentialCacheConfig.java | 25 ++++++++++++++++ .../storage/cache/StorageCredentialCacheTest.java | 7 ++--- .../service/quarkus/config/QuarkusProducers.java | 6 ++-- .../QuarkusStorageCredentialCacheConfig.java | 35 ++++++++++++++++++++++ .../catalog/IcebergCatalogHandlerAuthzTest.java | 2 +- .../quarkus/catalog/IcebergCatalogTest.java | 19 ++++++++---- .../quarkus/catalog/IcebergCatalogViewTest.java | 9 ++++-- .../catalog/PolarisGenericTableCatalogTest.java | 9 ++++-- .../service/quarkus/catalog/PolicyCatalogTest.java | 9 ++++-- .../service/config/RealmEntityManagerFactory.java | 8 +++-- .../org/apache/polaris/service/TestServices.java | 8 ++++- 15 files changed, 118 insertions(+), 57 deletions(-) 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 f91c9bfc8..62a87f28c 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.BaseResult; 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<String, PolarisMetaStoreManager> metaStoreManagerMap = new HashMap<>(); - final Map<String, StorageCredentialCache> storageCredentialCacheMap = new HashMap<>(); final Map<String, EntityCache> entityCacheMap = new HashMap<>(); final Map<String, Supplier<BasePersistence>> sessionSupplierMap = new HashMap<>(); protected final PolarisDiagnostics diagServices = new PolarisDefaultDiagServiceImpl(); @@ -183,7 +181,6 @@ public class JdbcMetaStoreManagerFactory implements MetaStoreManagerFactory { BaseResult result = metaStoreManager.purge(callContext); results.put(realm, result); - storageCredentialCacheMap.remove(realm); sessionSupplierMap.remove(realm); metaStoreManagerMap.remove(realm); } @@ -218,17 +215,6 @@ public class JdbcMetaStoreManagerFactory implements MetaStoreManagerFactory { 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 d4feb4850..2483968fe 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.EntityResult; 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<StoreType> implements MetaStoreManagerFactory { final Map<String, PolarisMetaStoreManager> metaStoreManagerMap = new HashMap<>(); - final Map<String, StorageCredentialCache> storageCredentialCacheMap = new HashMap<>(); final Map<String, EntityCache> entityCacheMap = new HashMap<>(); final Map<String, StoreType> backingStoreMap = new HashMap<>(); final Map<String, Supplier<TransactionalPersistence>> sessionSupplierMap = new HashMap<>(); @@ -138,7 +136,6 @@ public abstract class LocalPolarisMetaStoreManagerFactory<StoreType> 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 abstract class LocalPolarisMetaStoreManagerFactory<StoreType> 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 865abc03a..c9f14cd8e 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.bootstrap.RootCredentialsSet; 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<? extends BasePersistence> getOrCreateSessionSupplier(RealmContext realmContext); - StorageCredentialCache getOrCreateStorageCredentialCache( - RealmContext realmContext, RealmConfig realmConfig); - EntityCache getOrCreateEntityCache(RealmContext realmContext, RealmConfig realmConfig); Map<String, PrincipalSecretsResult> 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 4da19f0c2..14b696389 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<StorageCredentialCacheKey, StorageCredentialCacheEntry> cache; /** Initialize the creds cache */ - public StorageCredentialCache() { + public StorageCredentialCache(StorageCredentialCacheConfig cacheConfig) { cache = Caffeine.newBuilder() - .maximumSize(CACHE_MAX_NUMBER_OF_ENTRIES) + .maximumSize(cacheConfig.maxEntries()) .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 000000000..43961db2d --- /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 maxEntries(); +} 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 0d4bb39bb..1460b71cf 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 @@ import org.mockito.Mockito; 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 class 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 a9f9b2e77..f3eeb161f 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.persistence.bootstrap.RootCredentialsSet; 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 class QuarkusProducers { @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 000000000..15d04ba8f --- /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-entries") + @WithDefault("10000") + @Min(0) + @Override + long maxEntries(); +} 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 c6d848636..9a668f2c3 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 class IcebergCatalogHandlerAuthzTest extends PolarisAuthzTestBase { 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 2ef683b5d..0bd413cba 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.StorageAccessProperty; 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 abstract class IcebergCatalogTest extends CatalogTests<IcebergCatalog> { @Inject MetaStoreManagerFactory metaStoreManagerFactory; @Inject PolarisConfigurationStore configurationStore; + @Inject StorageCredentialCacheConfig storageCredentialCacheConfig; @Inject PolarisStorageIntegrationProvider storageIntegrationProvider; @Inject UserSecretsManagerFactory userSecretsManagerFactory; @Inject PolarisDiagnostics diagServices; @@ -248,6 +250,7 @@ public abstract class IcebergCatalogTest extends CatalogTests<IcebergCatalog> { 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 abstract class IcebergCatalogTest extends CatalogTests<IcebergCatalog> { 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 abstract class IcebergCatalogTest extends CatalogTests<IcebergCatalog> { .asCatalog())); RealmEntityManagerFactory realmEntityManagerFactory = - new RealmEntityManagerFactory(metaStoreManagerFactory, configurationStore); + new RealmEntityManagerFactory( + metaStoreManagerFactory, configurationStore, storageCredentialCache); this.fileIOFactory = new DefaultFileIOFactory(realmEntityManagerFactory, metaStoreManagerFactory); @@ -986,7 +992,8 @@ public abstract class IcebergCatalogTest extends CatalogTests<IcebergCatalog> { FileIOFactory fileIOFactory = spy( new DefaultFileIOFactory( - new RealmEntityManagerFactory(metaStoreManagerFactory, configurationStore), + new RealmEntityManagerFactory( + metaStoreManagerFactory, configurationStore, storageCredentialCache), metaStoreManagerFactory)); IcebergCatalog catalog = new IcebergCatalog( @@ -1877,7 +1884,8 @@ public abstract class IcebergCatalogTest extends CatalogTests<IcebergCatalog> { 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 abstract class IcebergCatalogTest extends CatalogTests<IcebergCatalog> { 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 4e516d015..9f587fae9 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.persistence.cache.InMemoryEntityCache; 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 class IcebergCatalogViewTest extends ViewCatalogTests<IcebergCatalog> { @Inject MetaStoreManagerFactory metaStoreManagerFactory; @Inject UserSecretsManagerFactory userSecretsManagerFactory; @Inject PolarisConfigurationStore configurationStore; + @Inject StorageCredentialCacheConfig storageCredentialCacheConfig; @Inject PolarisDiagnostics diagServices; @Inject PolarisEventListener polarisEventListener; @@ -176,10 +178,12 @@ public class IcebergCatalogViewTest extends ViewCatalogTests<IcebergCatalog> { 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 class IcebergCatalogViewTest extends ViewCatalogTests<IcebergCatalog> { 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 7b8cfa3e9..002ddc8d2 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.PolarisStorageIntegrationProvider; 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 class PolarisGenericTableCatalogTest { @Inject MetaStoreManagerFactory metaStoreManagerFactory; @Inject UserSecretsManagerFactory userSecretsManagerFactory; @Inject PolarisConfigurationStore configurationStore; + @Inject StorageCredentialCacheConfig storageCredentialCacheConfig; @Inject PolarisStorageIntegrationProvider storageIntegrationProvider; @Inject PolarisDiagnostics diagServices; @@ -168,10 +170,12 @@ public class PolarisGenericTableCatalogTest { 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 class PolarisGenericTableCatalogTest { 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 cadfab713..3938bc112 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.PolarisStorageIntegrationProvider; 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 class PolicyCatalogTest { @Inject MetaStoreManagerFactory metaStoreManagerFactory; @Inject UserSecretsManagerFactory userSecretsManagerFactory; @Inject PolarisConfigurationStore configurationStore; + @Inject StorageCredentialCacheConfig storageCredentialCacheConfig; @Inject PolarisStorageIntegrationProvider storageIntegrationProvider; @Inject PolarisDiagnostics diagServices; @@ -194,10 +196,12 @@ public class PolicyCatalogTest { 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 class PolicyCatalogTest { 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 ff962dc63..af372f682 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.config.RealmConfigImpl; 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<String, PolarisEntityManager> 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 class RealmEntityManagerFactory { 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 e8f1950d5..38cedd8be 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.PolarisMetaStoreManager; 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 record TestServices( 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();