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 <[email protected]>
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();