From dcc901a519707b1d6258c2f986f483ff41d6f93b Mon Sep 17 00:00:00 2001 From: Christopher Lambert <1204398+XN137@users.noreply.github.com> Date: Thu, 10 Jul 2025 09:33:26 +0200 Subject: [PATCH 1/3] Use application-scoped StorageCredentialCache --- .../jdbc/JdbcMetaStoreManagerFactory.java | 14 -------------- .../LocalPolarisMetaStoreManagerFactory.java | 14 -------------- .../persistence/MetaStoreManagerFactory.java | 4 ---- .../catalog/IcebergCatalogHandlerAuthzTest.java | 2 +- .../quarkus/catalog/IcebergCatalogTest.java | 17 ++++++++++++----- .../quarkus/catalog/IcebergCatalogViewTest.java | 6 ++++-- .../catalog/PolarisGenericTableCatalogTest.java | 6 ++++-- .../quarkus/catalog/PolicyCatalogTest.java | 6 ++++-- .../config/RealmEntityManagerFactory.java | 8 ++++++-- .../apache/polaris/service/TestServices.java | 5 ++++- 10 files changed, 35 insertions(+), 47 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 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/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..2d944cd2bf 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 @@ -248,6 +248,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 +287,12 @@ public void before(TestInfo testInfo) { configurationStore, Clock.systemDefaultZone()); + storageCredentialCache = new StorageCredentialCache(); + entityManager = new PolarisEntityManager( metaStoreManager, - new StorageCredentialCache(), + storageCredentialCache, createEntityCache(polarisContext.getRealmConfig(), metaStoreManager)); PrincipalEntity rootEntity = @@ -352,7 +355,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 +990,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 +1882,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 +2027,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..e2b12ee2de 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 @@ -176,10 +176,11 @@ public void before(TestInfo testInfo) { configurationStore, Clock.systemDefaultZone()); + StorageCredentialCache storageCredentialCache = new StorageCredentialCache(); PolarisEntityManager entityManager = new PolarisEntityManager( metaStoreManager, - new StorageCredentialCache(), + storageCredentialCache, new InMemoryEntityCache(polarisContext.getRealmConfig(), metaStoreManager)); CallContext.setCurrentContext(polarisContext); @@ -236,7 +237,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..57786ab954 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 @@ -168,10 +168,11 @@ public void before(TestInfo testInfo) { diagServices, configurationStore, Clock.systemDefaultZone()); + StorageCredentialCache storageCredentialCache = new StorageCredentialCache(); entityManager = new PolarisEntityManager( metaStoreManager, - new StorageCredentialCache(), + storageCredentialCache, new InMemoryEntityCache(polarisContext.getRealmConfig(), metaStoreManager)); PrincipalEntity rootEntity = @@ -237,7 +238,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..7a3d3d2b34 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 @@ -194,10 +194,11 @@ public void before(TestInfo testInfo) { diagServices, configurationStore, Clock.systemDefaultZone()); + StorageCredentialCache storageCredentialCache = new StorageCredentialCache(); entityManager = new PolarisEntityManager( metaStoreManager, - new StorageCredentialCache(), + storageCredentialCache, new InMemoryEntityCache(polarisContext.getRealmConfig(), metaStoreManager)); callContext = polarisContext; @@ -263,7 +264,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..ff0f8c0d0a 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,7 @@ 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.service.admin.PolarisServiceImpl; import org.apache.polaris.service.admin.api.PolarisCatalogsApi; import org.apache.polaris.service.catalog.DefaultCatalogPrefixParser; @@ -152,8 +153,10 @@ public TestServices build() { InMemoryPolarisMetaStoreManagerFactory metaStoreManagerFactory = new InMemoryPolarisMetaStoreManagerFactory( storageIntegrationProvider, polarisDiagnostics); + StorageCredentialCache storageCredentialCache = new StorageCredentialCache(); RealmEntityManagerFactory realmEntityManagerFactory = - new RealmEntityManagerFactory(metaStoreManagerFactory, configurationStore); + new RealmEntityManagerFactory( + metaStoreManagerFactory, configurationStore, storageCredentialCache); UserSecretsManagerFactory userSecretsManagerFactory = new UnsafeInMemorySecretsManagerFactory(); From db1c4c58d2cd43be29608f9781329d6ac3f3dd6a Mon Sep 17 00:00:00 2001 From: Christopher Lambert <1204398+XN137@users.noreply.github.com> Date: Mon, 14 Jul 2025 12:43:15 +0200 Subject: [PATCH 2/3] review: add StorageCredentialCacheConfig --- .../storage/cache/StorageCredentialCache.java | 6 ++-- .../cache/StorageCredentialCacheConfig.java | 25 +++++++++++++ .../cache/StorageCredentialCacheTest.java | 7 ++-- .../quarkus/config/QuarkusProducers.java | 6 ++-- .../QuarkusStorageCredentialCacheConfig.java | 35 +++++++++++++++++++ .../quarkus/catalog/IcebergCatalogTest.java | 4 ++- .../catalog/IcebergCatalogViewTest.java | 5 ++- .../PolarisGenericTableCatalogTest.java | 5 ++- .../quarkus/catalog/PolicyCatalogTest.java | 5 ++- .../apache/polaris/service/TestServices.java | 5 ++- 10 files changed, 88 insertions(+), 15 deletions(-) create mode 100644 polaris-core/src/main/java/org/apache/polaris/core/storage/cache/StorageCredentialCacheConfig.java create mode 100644 runtime/service/src/main/java/org/apache/polaris/service/quarkus/storage/QuarkusStorageCredentialCacheConfig.java 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/IcebergCatalogTest.java b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/IcebergCatalogTest.java index 2d944cd2bf..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; @@ -287,7 +289,7 @@ public void before(TestInfo testInfo) { configurationStore, Clock.systemDefaultZone()); - storageCredentialCache = new StorageCredentialCache(); + storageCredentialCache = new StorageCredentialCache(storageCredentialCacheConfig); entityManager = new PolarisEntityManager( 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 e2b12ee2de..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,7 +178,8 @@ public void before(TestInfo testInfo) { configurationStore, Clock.systemDefaultZone()); - StorageCredentialCache storageCredentialCache = new StorageCredentialCache(); + StorageCredentialCache storageCredentialCache = + new StorageCredentialCache(storageCredentialCacheConfig); PolarisEntityManager entityManager = new PolarisEntityManager( metaStoreManager, 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 57786ab954..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,7 +170,8 @@ public void before(TestInfo testInfo) { diagServices, configurationStore, Clock.systemDefaultZone()); - StorageCredentialCache storageCredentialCache = new StorageCredentialCache(); + StorageCredentialCache storageCredentialCache = + new StorageCredentialCache(storageCredentialCacheConfig); entityManager = new PolarisEntityManager( metaStoreManager, 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 7a3d3d2b34..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,7 +196,8 @@ public void before(TestInfo testInfo) { diagServices, configurationStore, Clock.systemDefaultZone()); - StorageCredentialCache storageCredentialCache = new StorageCredentialCache(); + StorageCredentialCache storageCredentialCache = + new StorageCredentialCache(storageCredentialCacheConfig); entityManager = new PolarisEntityManager( metaStoreManager, 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 ff0f8c0d0a..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 @@ -48,6 +48,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.PolarisServiceImpl; import org.apache.polaris.service.admin.api.PolarisCatalogsApi; import org.apache.polaris.service.catalog.DefaultCatalogPrefixParser; @@ -153,7 +154,9 @@ public TestServices build() { InMemoryPolarisMetaStoreManagerFactory metaStoreManagerFactory = new InMemoryPolarisMetaStoreManagerFactory( storageIntegrationProvider, polarisDiagnostics); - StorageCredentialCache storageCredentialCache = new StorageCredentialCache(); + StorageCredentialCacheConfig storageCredentialCacheConfig = () -> 10_000; + StorageCredentialCache storageCredentialCache = + new StorageCredentialCache(storageCredentialCacheConfig); RealmEntityManagerFactory realmEntityManagerFactory = new RealmEntityManagerFactory( metaStoreManagerFactory, configurationStore, storageCredentialCache); From 758e4984fc1f7b69e793f84520563a37ba6a63d8 Mon Sep 17 00:00:00 2001 From: Christopher Lambert <1204398+XN137@users.noreply.github.com> Date: Tue, 15 Jul 2025 07:34:28 +0200 Subject: [PATCH 3/3] review: rename to max-entries --- .../polaris/core/storage/cache/StorageCredentialCache.java | 2 +- .../core/storage/cache/StorageCredentialCacheConfig.java | 2 +- .../quarkus/storage/QuarkusStorageCredentialCacheConfig.java | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) 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 27523ef736..14b696389b 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 @@ -52,7 +52,7 @@ public class StorageCredentialCache { public StorageCredentialCache(StorageCredentialCacheConfig cacheConfig) { cache = Caffeine.newBuilder() - .maximumSize(cacheConfig.maxEntryCount()) + .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 index e1e22b5c6d..43961db2da 100644 --- 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 @@ -21,5 +21,5 @@ public interface StorageCredentialCacheConfig { - long maxEntryCount(); + long maxEntries(); } 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 index c21dcc9caf..15d04ba8f3 100644 --- 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 @@ -27,9 +27,9 @@ @ConfigMapping(prefix = "polaris.storage-credential-cache") public interface QuarkusStorageCredentialCacheConfig extends StorageCredentialCacheConfig { - @WithName("max-entry-count") + @WithName("max-entries") @WithDefault("10000") @Min(0) @Override - long maxEntryCount(); + long maxEntries(); }