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 de351deb5 Introduce RealmConfig (#2015)
de351deb5 is described below
commit de351deb5648d4785639b0150d0c9df2aaab5b98
Author: Christopher Lambert <[email protected]>
AuthorDate: Mon Jul 14 12:20:06 2025 +0200
Introduce RealmConfig (#2015)
Getting a config value currently requires quite a ceremony:
```
ctx.getPolarisCallContext()
.getConfigurationStore()
.getConfiguration(ctx.getRealmContext(), "ALLOW_WILDCARD_LOCATION",
false))
```
since a `PolarisConfigurationStore` cant be used without a `RealmContext`
it makes sense to add a dedicated interface. this allows removal of verbose
code and also moves towards injecting that interface via CDI at a request/realm
scope in the future.
---
.../EclipseLinkPolarisMetaStoreManagerFactory.java | 8 +-
.../jdbc/JdbcMetaStoreManagerFactory.java | 12 +-
.../apache/polaris/core/PolarisCallContext.java | 28 ++--
.../polaris/core/auth/PolarisAuthorizerImpl.java | 14 +-
.../polaris/core/config/FeatureConfiguration.java | 6 +-
.../apache/polaris/core/config/RealmConfig.java | 66 +++++++++
.../polaris/core/config/RealmConfigImpl.java | 54 ++++++++
.../apache/polaris/core/context/CallContext.java | 3 +
.../apache/polaris/core/entity/CatalogEntity.java | 7 +-
.../AtomicOperationMetaStoreManager.java | 5 +-
.../LocalPolarisMetaStoreManagerFactory.java | 18 +--
.../core/persistence/MetaStoreManagerFactory.java | 6 +-
.../persistence/cache/InMemoryEntityCache.java | 14 +-
.../TransactionalMetaStoreManagerImpl.java | 5 +-
.../apache/polaris/core/rest/PolarisEndpoints.java | 12 +-
.../core/storage/InMemoryStorageIntegration.java | 6 +-
.../storage/PolarisStorageConfigurationInfo.java | 7 +-
.../aws/AwsCredentialsStorageIntegration.java | 5 +-
.../azure/AzureCredentialsStorageIntegration.java | 5 +-
.../core/storage/cache/StorageCredentialCache.java | 17 +--
.../persistence/cache/InMemoryEntityCacheTest.java | 3 +-
.../storage/cache/StorageCredentialCacheTest.java | 4 +-
.../polaris/core/persistence/BaseResolverTest.java | 4 +-
.../service/quarkus/config/QuarkusProducers.java | 16 ++-
.../quarkus/admin/ManagementServiceTest.java | 2 +-
.../quarkus/admin/PolarisAuthzTestBase.java | 2 +-
.../admin/PolarisS3InteroperabilityTest.java | 2 +-
.../quarkus/catalog/CatalogNoEntityCacheTest.java | 4 +-
.../catalog/IcebergCatalogHandlerAuthzTest.java | 6 +-
.../quarkus/catalog/IcebergCatalogTest.java | 48 +++----
.../quarkus/catalog/IcebergCatalogViewTest.java | 11 +-
.../catalog/PolarisCatalogWithEntityCacheTest.java | 6 +-
.../catalog/PolarisGenericTableCatalogTest.java | 11 +-
.../service/quarkus/catalog/PolicyCatalogTest.java | 11 +-
.../polaris/service/admin/PolarisAdminService.java | 19 +--
.../polaris/service/admin/PolarisServiceImpl.java | 24 +---
.../catalog/iceberg/CatalogHandlerUtils.java | 12 +-
.../service/catalog/iceberg/IcebergCatalog.java | 154 ++++++---------------
.../catalog/iceberg/IcebergCatalogHandler.java | 25 ++--
.../service/catalog/io/DefaultFileIOFactory.java | 7 +-
.../polaris/service/catalog/io/FileIOUtil.java | 9 +-
.../catalog/io/WasbTranslatingFileIOFactory.java | 7 +-
.../validation/IcebergPropertiesValidation.java | 15 +-
.../service/config/RealmEntityManagerFactory.java | 14 +-
...moryAtomicOperationMetaStoreManagerFactory.java | 9 +-
.../InMemoryPolarisMetaStoreManagerFactory.java | 9 +-
.../service/task/TableCleanupTaskHandler.java | 8 +-
.../service/admin/PolarisServiceImplTest.java | 25 ++--
.../service/catalog/io/FileIOFactoryTest.java | 5 +-
.../org/apache/polaris/service/TestServices.java | 17 +--
.../service/catalog/io/MeasuredFileIOFactory.java | 7 +-
51 files changed, 365 insertions(+), 429 deletions(-)
diff --git
a/persistence/eclipselink/src/main/java/org/apache/polaris/extension/persistence/impl/eclipselink/EclipseLinkPolarisMetaStoreManagerFactory.java
b/persistence/eclipselink/src/main/java/org/apache/polaris/extension/persistence/impl/eclipselink/EclipseLinkPolarisMetaStoreManagerFactory.java
index 9f7af1a26..492f61668 100644
---
a/persistence/eclipselink/src/main/java/org/apache/polaris/extension/persistence/impl/eclipselink/EclipseLinkPolarisMetaStoreManagerFactory.java
+++
b/persistence/eclipselink/src/main/java/org/apache/polaris/extension/persistence/impl/eclipselink/EclipseLinkPolarisMetaStoreManagerFactory.java
@@ -25,7 +25,6 @@ import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import java.nio.file.Path;
import org.apache.polaris.core.PolarisDiagnostics;
-import org.apache.polaris.core.config.PolarisConfigurationStore;
import org.apache.polaris.core.context.RealmContext;
import org.apache.polaris.core.persistence.LocalPolarisMetaStoreManagerFactory;
import org.apache.polaris.core.persistence.PolarisMetaStoreManager;
@@ -47,13 +46,12 @@ public class EclipseLinkPolarisMetaStoreManagerFactory
@Inject PolarisStorageIntegrationProvider storageIntegrationProvider;
protected EclipseLinkPolarisMetaStoreManagerFactory() {
- this(null, null);
+ this(null);
}
@Inject
- protected EclipseLinkPolarisMetaStoreManagerFactory(
- PolarisDiagnostics diagnostics, PolarisConfigurationStore
configurationStore) {
- super(diagnostics, configurationStore);
+ protected EclipseLinkPolarisMetaStoreManagerFactory(PolarisDiagnostics
diagnostics) {
+ super(diagnostics);
}
@Override
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 adf58a495..f91c9bfc8 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
@@ -31,7 +31,7 @@ import javax.sql.DataSource;
import org.apache.polaris.core.PolarisCallContext;
import org.apache.polaris.core.PolarisDefaultDiagServiceImpl;
import org.apache.polaris.core.PolarisDiagnostics;
-import org.apache.polaris.core.config.PolarisConfigurationStore;
+import org.apache.polaris.core.config.RealmConfig;
import org.apache.polaris.core.context.CallContext;
import org.apache.polaris.core.context.RealmContext;
import org.apache.polaris.core.entity.PolarisEntity;
@@ -78,7 +78,6 @@ public class JdbcMetaStoreManagerFactory implements
MetaStoreManagerFactory {
@Inject PolarisStorageIntegrationProvider storageIntegrationProvider;
@Inject Instance<DataSource> dataSource;
@Inject RelationalJdbcConfiguration relationalJdbcConfiguration;
- @Inject PolarisConfigurationStore configurationStore;
protected JdbcMetaStoreManagerFactory() {}
@@ -221,22 +220,23 @@ public class JdbcMetaStoreManagerFactory implements
MetaStoreManagerFactory {
@Override
public synchronized StorageCredentialCache getOrCreateStorageCredentialCache(
- RealmContext realmContext) {
+ RealmContext realmContext, RealmConfig realmConfig) {
if
(!storageCredentialCacheMap.containsKey(realmContext.getRealmIdentifier())) {
storageCredentialCacheMap.put(
- realmContext.getRealmIdentifier(), new
StorageCredentialCache(configurationStore));
+ realmContext.getRealmIdentifier(), new StorageCredentialCache());
}
return storageCredentialCacheMap.get(realmContext.getRealmIdentifier());
}
@Override
- public synchronized EntityCache getOrCreateEntityCache(RealmContext
realmContext) {
+ public synchronized EntityCache getOrCreateEntityCache(
+ RealmContext realmContext, RealmConfig realmConfig) {
if (!entityCacheMap.containsKey(realmContext.getRealmIdentifier())) {
PolarisMetaStoreManager metaStoreManager =
getOrCreateMetaStoreManager(realmContext);
entityCacheMap.put(
realmContext.getRealmIdentifier(),
- new InMemoryEntityCache(realmContext, configurationStore,
metaStoreManager));
+ new InMemoryEntityCache(realmConfig, metaStoreManager));
}
return entityCacheMap.get(realmContext.getRealmIdentifier());
diff --git
a/polaris-core/src/main/java/org/apache/polaris/core/PolarisCallContext.java
b/polaris-core/src/main/java/org/apache/polaris/core/PolarisCallContext.java
index 9e5a7a8b4..cf2a0cca4 100644
--- a/polaris-core/src/main/java/org/apache/polaris/core/PolarisCallContext.java
+++ b/polaris-core/src/main/java/org/apache/polaris/core/PolarisCallContext.java
@@ -22,6 +22,8 @@ import jakarta.annotation.Nonnull;
import java.time.Clock;
import java.time.ZoneId;
import org.apache.polaris.core.config.PolarisConfigurationStore;
+import org.apache.polaris.core.config.RealmConfig;
+import org.apache.polaris.core.config.RealmConfigImpl;
import org.apache.polaris.core.context.CallContext;
import org.apache.polaris.core.context.RealmContext;
import org.apache.polaris.core.persistence.BasePersistence;
@@ -42,8 +44,9 @@ public class PolarisCallContext implements CallContext {
private final Clock clock;
- // will make it final once we remove deprecated constructor
- private RealmContext realmContext = null;
+ private final RealmContext realmContext;
+
+ private final RealmConfig realmConfig;
public PolarisCallContext(
@Nonnull RealmContext realmContext,
@@ -56,17 +59,19 @@ public class PolarisCallContext implements CallContext {
this.diagServices = diagServices;
this.configurationStore = configurationStore;
this.clock = clock;
+ this.realmConfig = new RealmConfigImpl(this.configurationStore,
this.realmContext);
}
public PolarisCallContext(
@Nonnull RealmContext realmContext,
@Nonnull BasePersistence metaStore,
@Nonnull PolarisDiagnostics diagServices) {
- this.realmContext = realmContext;
- this.metaStore = metaStore;
- this.diagServices = diagServices;
- this.configurationStore = new PolarisConfigurationStore() {};
- this.clock = Clock.system(ZoneId.systemDefault());
+ this(
+ realmContext,
+ metaStore,
+ diagServices,
+ new PolarisConfigurationStore() {},
+ Clock.system(ZoneId.systemDefault()));
}
public BasePersistence getMetaStore() {
@@ -77,10 +82,6 @@ public class PolarisCallContext implements CallContext {
return diagServices;
}
- public PolarisConfigurationStore getConfigurationStore() {
- return configurationStore;
- }
-
public Clock getClock() {
return clock;
}
@@ -90,6 +91,11 @@ public class PolarisCallContext implements CallContext {
return realmContext;
}
+ @Override
+ public RealmConfig getRealmConfig() {
+ return realmConfig;
+ }
+
@Override
public PolarisCallContext getPolarisCallContext() {
return this;
diff --git
a/polaris-core/src/main/java/org/apache/polaris/core/auth/PolarisAuthorizerImpl.java
b/polaris-core/src/main/java/org/apache/polaris/core/auth/PolarisAuthorizerImpl.java
index d480d5207..6b582e7a7 100644
---
a/polaris-core/src/main/java/org/apache/polaris/core/auth/PolarisAuthorizerImpl.java
+++
b/polaris-core/src/main/java/org/apache/polaris/core/auth/PolarisAuthorizerImpl.java
@@ -114,7 +114,6 @@ import java.util.Set;
import java.util.stream.Collectors;
import org.apache.iceberg.exceptions.ForbiddenException;
import org.apache.polaris.core.config.FeatureConfiguration;
-import org.apache.polaris.core.config.PolarisConfigurationStore;
import org.apache.polaris.core.context.CallContext;
import org.apache.polaris.core.entity.PolarisBaseEntity;
import org.apache.polaris.core.entity.PolarisEntityConstants;
@@ -531,12 +530,8 @@ public class PolarisAuthorizerImpl implements
PolarisAuthorizer {
List.of(TABLE_DETACH_POLICY, CATALOG_MANAGE_METADATA,
CATALOG_MANAGE_CONTENT));
}
- private final PolarisConfigurationStore featureConfig;
-
@Inject
- public PolarisAuthorizerImpl(PolarisConfigurationStore featureConfig) {
- this.featureConfig = featureConfig;
- }
+ public PolarisAuthorizerImpl() {}
/**
* Checks whether the {@code grantedPrivilege} is sufficient to confer
{@code desiredPrivilege},
@@ -583,9 +578,10 @@ public class PolarisAuthorizerImpl implements
PolarisAuthorizer {
@Nullable List<PolarisResolvedPathWrapper> targets,
@Nullable List<PolarisResolvedPathWrapper> secondaries) {
boolean enforceCredentialRotationRequiredState =
- featureConfig.getConfiguration(
- callContext.getRealmContext(),
-
FeatureConfiguration.ENFORCE_PRINCIPAL_CREDENTIAL_ROTATION_REQUIRED_CHECKING);
+ callContext
+ .getRealmConfig()
+ .getConfig(
+
FeatureConfiguration.ENFORCE_PRINCIPAL_CREDENTIAL_ROTATION_REQUIRED_CHECKING);
if (enforceCredentialRotationRequiredState
&& authenticatedPrincipal
.getPrincipalEntity()
diff --git
a/polaris-core/src/main/java/org/apache/polaris/core/config/FeatureConfiguration.java
b/polaris-core/src/main/java/org/apache/polaris/core/config/FeatureConfiguration.java
index d8ec61320..2f69e898e 100644
---
a/polaris-core/src/main/java/org/apache/polaris/core/config/FeatureConfiguration.java
+++
b/polaris-core/src/main/java/org/apache/polaris/core/config/FeatureConfiguration.java
@@ -49,11 +49,7 @@ public class FeatureConfiguration<T> extends
PolarisConfiguration<T> {
*/
public static void enforceFeatureEnabledOrThrow(
CallContext callContext, FeatureConfiguration<Boolean> featureConfig) {
- boolean enabled =
- callContext
- .getPolarisCallContext()
- .getConfigurationStore()
- .getConfiguration(callContext.getRealmContext(), featureConfig);
+ boolean enabled = callContext.getRealmConfig().getConfig(featureConfig);
if (!enabled) {
throw new UnsupportedOperationException("Feature not enabled: " +
featureConfig.key());
}
diff --git
a/polaris-core/src/main/java/org/apache/polaris/core/config/RealmConfig.java
b/polaris-core/src/main/java/org/apache/polaris/core/config/RealmConfig.java
new file mode 100644
index 000000000..7443b1875
--- /dev/null
+++ b/polaris-core/src/main/java/org/apache/polaris/core/config/RealmConfig.java
@@ -0,0 +1,66 @@
+/*
+ * 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.config;
+
+import jakarta.annotation.Nullable;
+import org.apache.polaris.core.entity.CatalogEntity;
+
+/** Realm-specific configuration used to retrieve runtime parameters. */
+public interface RealmConfig {
+
+ /**
+ * Retrieve the current value for a configuration key. May be null if not
set.
+ *
+ * @param <T> the type of the configuration value
+ * @param configName the name of the configuration key to check
+ * @return the current value set for the configuration key, or null if not
set
+ */
+ <T> @Nullable T getConfig(String configName);
+
+ /**
+ * Retrieve the current value for a configuration key. If not set, return
the non-null default
+ * value.
+ *
+ * @param <T> the type of the configuration value
+ * @param configName the name of the configuration key to check
+ * @param defaultValue the default value if the configuration key has no
value
+ * @return the current value or the supplied default value
+ */
+ <T> T getConfig(String configName, T defaultValue);
+
+ /**
+ * Retrieve the current value for a configuration.
+ *
+ * @param <T> the type of the configuration value
+ * @param config the configuration to load
+ * @return the current value set for the configuration key or null if not set
+ */
+ <T> T getConfig(PolarisConfiguration<T> config);
+
+ /**
+ * Retrieve the current value for a configuration, overriding with a catalog
config if it is
+ * present.
+ *
+ * @param <T> the type of the configuration value
+ * @param config the configuration to load
+ * @param catalogEntity the catalog to check for an override
+ * @return the current value set for the configuration key or null if not set
+ */
+ <T> T getConfig(PolarisConfiguration<T> config, CatalogEntity catalogEntity);
+}
diff --git
a/polaris-core/src/main/java/org/apache/polaris/core/config/RealmConfigImpl.java
b/polaris-core/src/main/java/org/apache/polaris/core/config/RealmConfigImpl.java
new file mode 100644
index 000000000..5d93c833b
--- /dev/null
+++
b/polaris-core/src/main/java/org/apache/polaris/core/config/RealmConfigImpl.java
@@ -0,0 +1,54 @@
+/*
+ * 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.config;
+
+import jakarta.annotation.Nullable;
+import org.apache.polaris.core.context.RealmContext;
+import org.apache.polaris.core.entity.CatalogEntity;
+
+public class RealmConfigImpl implements RealmConfig {
+
+ private final PolarisConfigurationStore configurationStore;
+ private final RealmContext realmContext;
+
+ public RealmConfigImpl(PolarisConfigurationStore configurationStore,
RealmContext realmContext) {
+ this.configurationStore = configurationStore;
+ this.realmContext = realmContext;
+ }
+
+ @Override
+ public <T> @Nullable T getConfig(String configName) {
+ return configurationStore.getConfiguration(realmContext, configName);
+ }
+
+ @Override
+ public <T> T getConfig(String configName, T defaultValue) {
+ return configurationStore.getConfiguration(realmContext, configName,
defaultValue);
+ }
+
+ @Override
+ public <T> T getConfig(PolarisConfiguration<T> config) {
+ return configurationStore.getConfiguration(realmContext, config);
+ }
+
+ @Override
+ public <T> T getConfig(PolarisConfiguration<T> config, CatalogEntity
catalogEntity) {
+ return configurationStore.getConfiguration(realmContext, catalogEntity,
config);
+ }
+}
diff --git
a/polaris-core/src/main/java/org/apache/polaris/core/context/CallContext.java
b/polaris-core/src/main/java/org/apache/polaris/core/context/CallContext.java
index 84fec60ae..7164cfc75 100644
---
a/polaris-core/src/main/java/org/apache/polaris/core/context/CallContext.java
+++
b/polaris-core/src/main/java/org/apache/polaris/core/context/CallContext.java
@@ -19,6 +19,7 @@
package org.apache.polaris.core.context;
import org.apache.polaris.core.PolarisCallContext;
+import org.apache.polaris.core.config.RealmConfig;
/**
* Stores elements associated with an individual REST request such as
RealmContext, caller
@@ -53,4 +54,6 @@ public interface CallContext {
* @return the inner context used for delegating services
*/
PolarisCallContext getPolarisCallContext();
+
+ RealmConfig getRealmConfig();
}
diff --git
a/polaris-core/src/main/java/org/apache/polaris/core/entity/CatalogEntity.java
b/polaris-core/src/main/java/org/apache/polaris/core/entity/CatalogEntity.java
index 2061fd86a..e0d2089a7 100644
---
a/polaris-core/src/main/java/org/apache/polaris/core/entity/CatalogEntity.java
+++
b/polaris-core/src/main/java/org/apache/polaris/core/entity/CatalogEntity.java
@@ -313,11 +313,8 @@ public class CatalogEntity extends PolarisEntity
implements LocationBasedEntity
CallContext callContext, Collection<String> allowedLocations) {
int maxAllowedLocations =
callContext
- .getPolarisCallContext()
- .getConfigurationStore()
- .getConfiguration(
- callContext.getRealmContext(),
-
BehaviorChangeConfiguration.STORAGE_CONFIGURATION_MAX_LOCATIONS);
+ .getRealmConfig()
+
.getConfig(BehaviorChangeConfiguration.STORAGE_CONFIGURATION_MAX_LOCATIONS);
if (maxAllowedLocations != -1 && allowedLocations.size() >
maxAllowedLocations) {
throw new IllegalArgumentException(
String.format(
diff --git
a/polaris-core/src/main/java/org/apache/polaris/core/persistence/AtomicOperationMetaStoreManager.java
b/polaris-core/src/main/java/org/apache/polaris/core/persistence/AtomicOperationMetaStoreManager.java
index dad33646e..08bda144c 100644
---
a/polaris-core/src/main/java/org/apache/polaris/core/persistence/AtomicOperationMetaStoreManager.java
+++
b/polaris-core/src/main/java/org/apache/polaris/core/persistence/AtomicOperationMetaStoreManager.java
@@ -1508,9 +1508,8 @@ public class AtomicOperationMetaStoreManager extends
BaseMetaStoreManager {
PolarisObjectMapperUtil.parseTaskState(entity);
long taskAgeTimeout =
callCtx
- .getConfigurationStore()
- .getConfiguration(
- callCtx.getRealmContext(),
+ .getRealmConfig()
+ .getConfig(
PolarisTaskConstants.TASK_TIMEOUT_MILLIS_CONFIG,
PolarisTaskConstants.TASK_TIMEOUT_MILLIS);
return taskState == null
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 014308999..d4feb4850 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
@@ -26,7 +26,7 @@ import java.util.function.Supplier;
import org.apache.polaris.core.PolarisCallContext;
import org.apache.polaris.core.PolarisDefaultDiagServiceImpl;
import org.apache.polaris.core.PolarisDiagnostics;
-import org.apache.polaris.core.config.PolarisConfigurationStore;
+import org.apache.polaris.core.config.RealmConfig;
import org.apache.polaris.core.context.CallContext;
import org.apache.polaris.core.context.RealmContext;
import org.apache.polaris.core.entity.PolarisEntity;
@@ -64,14 +64,9 @@ public abstract class
LocalPolarisMetaStoreManagerFactory<StoreType>
LoggerFactory.getLogger(LocalPolarisMetaStoreManagerFactory.class);
private final PolarisDiagnostics diagnostics;
- private final PolarisConfigurationStore configurationStore;
- private boolean bootstrap;
- protected LocalPolarisMetaStoreManagerFactory(
- @Nonnull PolarisDiagnostics diagnostics,
- @Nonnull PolarisConfigurationStore configurationStore) {
+ protected LocalPolarisMetaStoreManagerFactory(@Nonnull PolarisDiagnostics
diagnostics) {
this.diagnostics = diagnostics;
- this.configurationStore = configurationStore;
}
protected abstract StoreType createBackingStore(@Nonnull PolarisDiagnostics
diagnostics);
@@ -179,22 +174,23 @@ public abstract class
LocalPolarisMetaStoreManagerFactory<StoreType>
@Override
public synchronized StorageCredentialCache getOrCreateStorageCredentialCache(
- RealmContext realmContext) {
+ RealmContext realmContext, RealmConfig realmConfig) {
if
(!storageCredentialCacheMap.containsKey(realmContext.getRealmIdentifier())) {
storageCredentialCacheMap.put(
- realmContext.getRealmIdentifier(), new
StorageCredentialCache(configurationStore));
+ realmContext.getRealmIdentifier(), new StorageCredentialCache());
}
return storageCredentialCacheMap.get(realmContext.getRealmIdentifier());
}
@Override
- public synchronized EntityCache getOrCreateEntityCache(RealmContext
realmContext) {
+ public synchronized EntityCache getOrCreateEntityCache(
+ RealmContext realmContext, RealmConfig realmConfig) {
if (!entityCacheMap.containsKey(realmContext.getRealmIdentifier())) {
PolarisMetaStoreManager metaStoreManager =
getOrCreateMetaStoreManager(realmContext);
entityCacheMap.put(
realmContext.getRealmIdentifier(),
- new InMemoryEntityCache(realmContext, configurationStore,
metaStoreManager));
+ new InMemoryEntityCache(realmConfig, metaStoreManager));
}
return entityCacheMap.get(realmContext.getRealmIdentifier());
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 5b5dadaa0..865abc03a 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
@@ -20,6 +20,7 @@ package org.apache.polaris.core.persistence;
import java.util.Map;
import java.util.function.Supplier;
+import org.apache.polaris.core.config.RealmConfig;
import org.apache.polaris.core.context.RealmContext;
import org.apache.polaris.core.persistence.bootstrap.BootstrapOptions;
import org.apache.polaris.core.persistence.bootstrap.RootCredentialsSet;
@@ -35,9 +36,10 @@ public interface MetaStoreManagerFactory {
Supplier<? extends BasePersistence> getOrCreateSessionSupplier(RealmContext
realmContext);
- StorageCredentialCache getOrCreateStorageCredentialCache(RealmContext
realmContext);
+ StorageCredentialCache getOrCreateStorageCredentialCache(
+ RealmContext realmContext, RealmConfig realmConfig);
- EntityCache getOrCreateEntityCache(RealmContext realmContext);
+ EntityCache getOrCreateEntityCache(RealmContext realmContext, RealmConfig
realmConfig);
Map<String, PrincipalSecretsResult> bootstrapRealms(
Iterable<String> realms, RootCredentialsSet rootCredentialsSet);
diff --git
a/polaris-core/src/main/java/org/apache/polaris/core/persistence/cache/InMemoryEntityCache.java
b/polaris-core/src/main/java/org/apache/polaris/core/persistence/cache/InMemoryEntityCache.java
index 3e1fc3ec6..36c44ea25 100644
---
a/polaris-core/src/main/java/org/apache/polaris/core/persistence/cache/InMemoryEntityCache.java
+++
b/polaris-core/src/main/java/org/apache/polaris/core/persistence/cache/InMemoryEntityCache.java
@@ -30,8 +30,7 @@ import java.util.concurrent.TimeUnit;
import org.apache.polaris.core.PolarisCallContext;
import org.apache.polaris.core.config.BehaviorChangeConfiguration;
import org.apache.polaris.core.config.FeatureConfiguration;
-import org.apache.polaris.core.config.PolarisConfigurationStore;
-import org.apache.polaris.core.context.RealmContext;
+import org.apache.polaris.core.config.RealmConfig;
import org.apache.polaris.core.entity.PolarisBaseEntity;
import org.apache.polaris.core.entity.PolarisEntityType;
import org.apache.polaris.core.entity.PolarisGrantRecord;
@@ -60,9 +59,7 @@ public class InMemoryEntityCache implements EntityCache {
* @param polarisMetaStoreManager the meta store manager implementation
*/
public InMemoryEntityCache(
- @Nonnull RealmContext realmContext,
- @Nonnull PolarisConfigurationStore configurationStore,
- @Nonnull PolarisMetaStoreManager polarisMetaStoreManager) {
+ @Nonnull RealmConfig realmConfig, @Nonnull PolarisMetaStoreManager
polarisMetaStoreManager) {
// by name cache
this.byName = new ConcurrentHashMap<>();
@@ -79,9 +76,7 @@ public class InMemoryEntityCache implements EntityCache {
}
};
- long weigherTarget =
- configurationStore.getConfiguration(
- realmContext, FeatureConfiguration.ENTITY_CACHE_WEIGHER_TARGET);
+ long weigherTarget =
realmConfig.getConfig(FeatureConfiguration.ENTITY_CACHE_WEIGHER_TARGET);
Caffeine<Long, ResolvedPolarisEntity> byIdBuilder =
Caffeine.newBuilder()
.maximumWeight(weigherTarget)
@@ -90,8 +85,7 @@ public class InMemoryEntityCache implements EntityCache {
.removalListener(removalListener); // Set the removal listener
boolean useSoftValues =
- configurationStore.getConfiguration(
- realmContext,
BehaviorChangeConfiguration.ENTITY_CACHE_SOFT_VALUES);
+
realmConfig.getConfig(BehaviorChangeConfiguration.ENTITY_CACHE_SOFT_VALUES);
if (useSoftValues) {
byIdBuilder.softValues();
}
diff --git
a/polaris-core/src/main/java/org/apache/polaris/core/persistence/transactional/TransactionalMetaStoreManagerImpl.java
b/polaris-core/src/main/java/org/apache/polaris/core/persistence/transactional/TransactionalMetaStoreManagerImpl.java
index 1286b67e7..e79dafcf5 100644
---
a/polaris-core/src/main/java/org/apache/polaris/core/persistence/transactional/TransactionalMetaStoreManagerImpl.java
+++
b/polaris-core/src/main/java/org/apache/polaris/core/persistence/transactional/TransactionalMetaStoreManagerImpl.java
@@ -1960,9 +1960,8 @@ public class TransactionalMetaStoreManagerImpl extends
BaseMetaStoreManager {
PolarisObjectMapperUtil.parseTaskState(entity);
long taskAgeTimeout =
callCtx
- .getConfigurationStore()
- .getConfiguration(
- callCtx.getRealmContext(),
+ .getRealmConfig()
+ .getConfig(
PolarisTaskConstants.TASK_TIMEOUT_MILLIS_CONFIG,
PolarisTaskConstants.TASK_TIMEOUT_MILLIS);
return taskState == null
diff --git
a/polaris-core/src/main/java/org/apache/polaris/core/rest/PolarisEndpoints.java
b/polaris-core/src/main/java/org/apache/polaris/core/rest/PolarisEndpoints.java
index d5e1e7167..b389fd92f 100644
---
a/polaris-core/src/main/java/org/apache/polaris/core/rest/PolarisEndpoints.java
+++
b/polaris-core/src/main/java/org/apache/polaris/core/rest/PolarisEndpoints.java
@@ -80,11 +80,7 @@ public class PolarisEndpoints {
public static Set<Endpoint> getSupportedGenericTableEndpoints(CallContext
callContext) {
// add the generic table endpoints as supported endpoints if generic table
feature is enabled.
boolean genericTableEnabled =
- callContext
- .getPolarisCallContext()
- .getConfigurationStore()
- .getConfiguration(
- callContext.getRealmContext(),
FeatureConfiguration.ENABLE_GENERIC_TABLES);
+
callContext.getRealmConfig().getConfig(FeatureConfiguration.ENABLE_GENERIC_TABLES);
return genericTableEnabled ? GENERIC_TABLE_ENDPOINTS : ImmutableSet.of();
}
@@ -95,11 +91,7 @@ public class PolarisEndpoints {
*/
public static Set<Endpoint> getSupportedPolicyEndpoints(CallContext
callContext) {
boolean policyStoreEnabled =
- callContext
- .getPolarisCallContext()
- .getConfigurationStore()
- .getConfiguration(
- callContext.getRealmContext(),
FeatureConfiguration.ENABLE_POLICY_STORE);
+
callContext.getRealmConfig().getConfig(FeatureConfiguration.ENABLE_POLICY_STORE);
return policyStoreEnabled ? POLICY_STORE_ENDPOINTS : ImmutableSet.of();
}
}
diff --git
a/polaris-core/src/main/java/org/apache/polaris/core/storage/InMemoryStorageIntegration.java
b/polaris-core/src/main/java/org/apache/polaris/core/storage/InMemoryStorageIntegration.java
index 4ec58ff71..e10802529 100644
---
a/polaris-core/src/main/java/org/apache/polaris/core/storage/InMemoryStorageIntegration.java
+++
b/polaris-core/src/main/java/org/apache/polaris/core/storage/InMemoryStorageIntegration.java
@@ -78,11 +78,7 @@ public abstract class InMemoryStorageIntegration<T extends
PolarisStorageConfigu
boolean allowWildcardLocation =
Optional.ofNullable(CallContext.getCurrentContext())
- .map(
- ctx ->
- ctx.getPolarisCallContext()
- .getConfigurationStore()
- .getConfiguration(ctx.getRealmContext(),
"ALLOW_WILDCARD_LOCATION", false))
+ .map(ctx ->
ctx.getRealmConfig().getConfig("ALLOW_WILDCARD_LOCATION", false))
.orElse(false);
if (allowWildcardLocation && allowedLocationStrings.contains("*")) {
diff --git
a/polaris-core/src/main/java/org/apache/polaris/core/storage/PolarisStorageConfigurationInfo.java
b/polaris-core/src/main/java/org/apache/polaris/core/storage/PolarisStorageConfigurationInfo.java
index 1d391015f..26ccb062a 100644
---
a/polaris-core/src/main/java/org/apache/polaris/core/storage/PolarisStorageConfigurationInfo.java
+++
b/polaris-core/src/main/java/org/apache/polaris/core/storage/PolarisStorageConfigurationInfo.java
@@ -163,11 +163,8 @@ public abstract class PolarisStorageConfigurationInfo {
CatalogEntity catalog = CatalogEntity.of(entityPath.get(0));
boolean allowEscape =
callContext
- .getConfigurationStore()
- .getConfiguration(
- callContext.getRealmContext(),
- catalog,
-
FeatureConfiguration.ALLOW_UNSTRUCTURED_TABLE_LOCATION);
+ .getRealmConfig()
+
.getConfig(FeatureConfiguration.ALLOW_UNSTRUCTURED_TABLE_LOCATION, catalog);
if (!allowEscape
&& catalog.getCatalogType() != Catalog.TypeEnum.EXTERNAL
&& baseLocation != null) {
diff --git
a/polaris-core/src/main/java/org/apache/polaris/core/storage/aws/AwsCredentialsStorageIntegration.java
b/polaris-core/src/main/java/org/apache/polaris/core/storage/aws/AwsCredentialsStorageIntegration.java
index 189c574dd..b473c077a 100644
---
a/polaris-core/src/main/java/org/apache/polaris/core/storage/aws/AwsCredentialsStorageIntegration.java
+++
b/polaris-core/src/main/java/org/apache/polaris/core/storage/aws/AwsCredentialsStorageIntegration.java
@@ -73,10 +73,7 @@ public class AwsCredentialsStorageIntegration
@Nonnull Set<String> allowedReadLocations,
@Nonnull Set<String> allowedWriteLocations) {
int storageCredentialDurationSeconds =
- callContext
- .getPolarisCallContext()
- .getConfigurationStore()
- .getConfiguration(callContext.getRealmContext(),
STORAGE_CREDENTIAL_DURATION_SECONDS);
+
callContext.getRealmConfig().getConfig(STORAGE_CREDENTIAL_DURATION_SECONDS);
AssumeRoleRequest.Builder request =
AssumeRoleRequest.builder()
.externalId(storageConfig.getExternalId())
diff --git
a/polaris-core/src/main/java/org/apache/polaris/core/storage/azure/AzureCredentialsStorageIntegration.java
b/polaris-core/src/main/java/org/apache/polaris/core/storage/azure/AzureCredentialsStorageIntegration.java
index 39bd363d4..232994a37 100644
---
a/polaris-core/src/main/java/org/apache/polaris/core/storage/azure/AzureCredentialsStorageIntegration.java
+++
b/polaris-core/src/main/java/org/apache/polaris/core/storage/azure/AzureCredentialsStorageIntegration.java
@@ -127,10 +127,7 @@ public class AzureCredentialsStorageIntegration
// clock skew between the client and server,
OffsetDateTime startTime =
start.truncatedTo(ChronoUnit.SECONDS).atOffset(ZoneOffset.UTC);
int intendedDurationSeconds =
- callContext
- .getPolarisCallContext()
- .getConfigurationStore()
- .getConfiguration(callContext.getRealmContext(),
STORAGE_CREDENTIAL_DURATION_SECONDS);
+
callContext.getRealmConfig().getConfig(STORAGE_CREDENTIAL_DURATION_SECONDS);
OffsetDateTime intendedEndTime =
start.plusSeconds(intendedDurationSeconds).atOffset(ZoneOffset.UTC);
OffsetDateTime maxAllowedEndTime =
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 22ad35857..4da19f0c2 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
@@ -32,8 +32,7 @@ import java.util.function.Function;
import org.apache.iceberg.exceptions.UnprocessableEntityException;
import org.apache.polaris.core.PolarisCallContext;
import org.apache.polaris.core.config.FeatureConfiguration;
-import org.apache.polaris.core.config.PolarisConfigurationStore;
-import org.apache.polaris.core.context.RealmContext;
+import org.apache.polaris.core.config.RealmConfig;
import org.apache.polaris.core.entity.PolarisEntity;
import org.apache.polaris.core.entity.PolarisEntityType;
import org.apache.polaris.core.persistence.dao.entity.ScopedCredentialsResult;
@@ -50,11 +49,9 @@ public class StorageCredentialCache {
private static final long CACHE_MAX_NUMBER_OF_ENTRIES = 10_000L;
private final LoadingCache<StorageCredentialCacheKey,
StorageCredentialCacheEntry> cache;
- private final PolarisConfigurationStore configurationStore;
/** Initialize the creds cache */
- public StorageCredentialCache(PolarisConfigurationStore configurationStore) {
- this.configurationStore = configurationStore;
+ public StorageCredentialCache() {
cache =
Caffeine.newBuilder()
.maximumSize(CACHE_MAX_NUMBER_OF_ENTRIES)
@@ -77,13 +74,11 @@ public class StorageCredentialCache {
}
/** How long credentials should remain in the cache. */
- private long maxCacheDurationMs(RealmContext realmContext) {
+ private long maxCacheDurationMs(RealmConfig realmConfig) {
var cacheDurationSeconds =
- configurationStore.getConfiguration(
- realmContext,
FeatureConfiguration.STORAGE_CREDENTIAL_CACHE_DURATION_SECONDS);
+
realmConfig.getConfig(FeatureConfiguration.STORAGE_CREDENTIAL_CACHE_DURATION_SECONDS);
var credentialDurationSeconds =
- configurationStore.getConfiguration(
- realmContext,
FeatureConfiguration.STORAGE_CREDENTIAL_DURATION_SECONDS);
+
realmConfig.getConfig(FeatureConfiguration.STORAGE_CREDENTIAL_DURATION_SECONDS);
if (cacheDurationSeconds >= credentialDurationSeconds) {
throw new IllegalArgumentException(
String.format(
@@ -139,7 +134,7 @@ public class StorageCredentialCache {
k.getAllowedReadLocations(),
k.getAllowedWriteLocations());
if (scopedCredentialsResult.isSuccess()) {
- long maxCacheDurationMs =
maxCacheDurationMs(callCtx.getRealmContext());
+ long maxCacheDurationMs =
maxCacheDurationMs(callCtx.getRealmConfig());
return new StorageCredentialCacheEntry(scopedCredentialsResult,
maxCacheDurationMs);
}
LOGGER
diff --git
a/polaris-core/src/test/java/org/apache/polaris/core/persistence/cache/InMemoryEntityCacheTest.java
b/polaris-core/src/test/java/org/apache/polaris/core/persistence/cache/InMemoryEntityCacheTest.java
index 945f1ccb6..78e9a5068 100644
---
a/polaris-core/src/test/java/org/apache/polaris/core/persistence/cache/InMemoryEntityCacheTest.java
+++
b/polaris-core/src/test/java/org/apache/polaris/core/persistence/cache/InMemoryEntityCacheTest.java
@@ -103,8 +103,7 @@ public class InMemoryEntityCacheTest {
* @return new cache for the entity store
*/
InMemoryEntityCache allocateNewCache() {
- return new InMemoryEntityCache(
- callCtx.getRealmContext(), callCtx.getConfigurationStore(),
this.metaStoreManager);
+ return new InMemoryEntityCache(callCtx.getRealmConfig(),
this.metaStoreManager);
}
@Test
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 01687aa56..0d4bb39bb 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
@@ -60,7 +60,7 @@ public class StorageCredentialCacheTest {
// the meta store manager
private final PolarisMetaStoreManager metaStoreManager;
- StorageCredentialCache storageCredentialCache;
+ private StorageCredentialCache storageCredentialCache;
public StorageCredentialCacheTest() {
// diag services
@@ -76,7 +76,7 @@ public class StorageCredentialCacheTest {
}
private StorageCredentialCache newStorageCredentialCache() {
- return new StorageCredentialCache(callCtx.getConfigurationStore());
+ return new StorageCredentialCache();
}
@Test
diff --git
a/polaris-core/src/testFixtures/java/org/apache/polaris/core/persistence/BaseResolverTest.java
b/polaris-core/src/testFixtures/java/org/apache/polaris/core/persistence/BaseResolverTest.java
index 1a7a82731..30fab4fb0 100644
---
a/polaris-core/src/testFixtures/java/org/apache/polaris/core/persistence/BaseResolverTest.java
+++
b/polaris-core/src/testFixtures/java/org/apache/polaris/core/persistence/BaseResolverTest.java
@@ -468,9 +468,7 @@ public abstract class BaseResolverTest {
// create a new cache if needs be
if (cache == null) {
- this.cache =
- new InMemoryEntityCache(
- callCtx().getRealmContext(), callCtx().getConfigurationStore(),
metaStoreManager());
+ this.cache = new InMemoryEntityCache(callCtx().getRealmConfig(),
metaStoreManager());
}
boolean allRoles = principalRolesScope == null;
Optional<List<PrincipalRoleEntity>> roleEntities =
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 74caae113..a9f9b2e77 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
@@ -41,6 +41,7 @@ import
org.apache.polaris.core.auth.AuthenticatedPolarisPrincipal;
import org.apache.polaris.core.auth.PolarisAuthorizer;
import org.apache.polaris.core.auth.PolarisAuthorizerImpl;
import org.apache.polaris.core.config.PolarisConfigurationStore;
+import org.apache.polaris.core.config.RealmConfig;
import org.apache.polaris.core.context.CallContext;
import org.apache.polaris.core.context.RealmContext;
import org.apache.polaris.core.persistence.BasePersistence;
@@ -99,15 +100,14 @@ public class QuarkusProducers {
@Produces
@ApplicationScoped
- public StorageCredentialCache storageCredentialCache(
- PolarisConfigurationStore configurationStore) {
- return new StorageCredentialCache(configurationStore);
+ public StorageCredentialCache storageCredentialCache() {
+ return new StorageCredentialCache();
}
@Produces
@ApplicationScoped
- public PolarisAuthorizer polarisAuthorizer(PolarisConfigurationStore
configurationStore) {
- return new PolarisAuthorizerImpl(configurationStore);
+ public PolarisAuthorizer polarisAuthorizer() {
+ return new PolarisAuthorizerImpl();
}
@Produces
@@ -138,6 +138,12 @@ public class QuarkusProducers {
realmContext, metaStoreSession, diagServices, configurationStore,
clock);
}
+ @Produces
+ @RequestScoped
+ public RealmConfig realmContext(CallContext callContext) {
+ return callContext.getRealmConfig();
+ }
+
// Polaris service beans - selected from @Identifier-annotated beans
@Produces
diff --git
a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/admin/ManagementServiceTest.java
b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/admin/ManagementServiceTest.java
index 3cb8216d8..319a0e354 100644
---
a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/admin/ManagementServiceTest.java
+++
b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/admin/ManagementServiceTest.java
@@ -230,7 +230,7 @@ public class ManagementServiceTest {
return "";
}
},
- new PolarisAuthorizerImpl(services.configurationStore()),
+ new PolarisAuthorizerImpl(),
new ReservedProperties() {
@Override
public List<String> prefixes() {
diff --git
a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/admin/PolarisAuthzTestBase.java
b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/admin/PolarisAuthzTestBase.java
index f568e54b7..536e994b9 100644
---
a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/admin/PolarisAuthzTestBase.java
+++
b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/admin/PolarisAuthzTestBase.java
@@ -235,7 +235,7 @@ public abstract class PolarisAuthzTestBase {
metaStoreManager =
managerFactory.getOrCreateMetaStoreManager(realmContext);
userSecretsManager =
userSecretsManagerFactory.getOrCreateUserSecretsManager(realmContext);
- polarisAuthorizer = new PolarisAuthorizerImpl(configurationStore);
+ polarisAuthorizer = new PolarisAuthorizerImpl();
polarisContext =
new PolarisCallContext(
diff --git
a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/admin/PolarisS3InteroperabilityTest.java
b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/admin/PolarisS3InteroperabilityTest.java
index 4a3312292..2e8d7ccd1 100644
---
a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/admin/PolarisS3InteroperabilityTest.java
+++
b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/admin/PolarisS3InteroperabilityTest.java
@@ -76,7 +76,7 @@ public class PolarisS3InteroperabilityTest {
public PolarisS3InteroperabilityTest() {
TestServices.FileIOFactorySupplier fileIOFactorySupplier =
- (entityManagerFactory, metaStoreManagerFactory, configurationStore) ->
+ (entityManagerFactory, metaStoreManagerFactory) ->
(FileIOFactory)
(callContext,
ioImplClassName,
diff --git
a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/CatalogNoEntityCacheTest.java
b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/CatalogNoEntityCacheTest.java
index 895b6ab81..f2e0bb662 100644
---
a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/CatalogNoEntityCacheTest.java
+++
b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/CatalogNoEntityCacheTest.java
@@ -21,6 +21,7 @@ package org.apache.polaris.service.quarkus.catalog;
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.junit.TestProfile;
import jakarta.annotation.Nullable;
+import org.apache.polaris.core.config.RealmConfig;
import org.apache.polaris.core.persistence.PolarisMetaStoreManager;
import org.apache.polaris.core.persistence.cache.InMemoryEntityCache;
@@ -30,7 +31,8 @@ public class CatalogNoEntityCacheTest extends
IcebergCatalogTest {
@Nullable
@Override
- protected InMemoryEntityCache createEntityCache(PolarisMetaStoreManager
metaStoreManager) {
+ protected InMemoryEntityCache createEntityCache(
+ RealmConfig realmConfig, PolarisMetaStoreManager metaStoreManager) {
return null;
}
}
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 4d89d5523..c6d848636 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
@@ -55,7 +55,6 @@ import
org.apache.polaris.core.admin.model.FileStorageConfigInfo;
import org.apache.polaris.core.admin.model.PrincipalWithCredentialsCredentials;
import org.apache.polaris.core.admin.model.StorageConfigInfo;
import org.apache.polaris.core.auth.AuthenticatedPolarisPrincipal;
-import org.apache.polaris.core.config.PolarisConfigurationStore;
import org.apache.polaris.core.context.CallContext;
import org.apache.polaris.core.context.RealmContext;
import org.apache.polaris.core.entity.CatalogEntity;
@@ -1792,7 +1791,7 @@ public class IcebergCatalogHandlerAuthzTest extends
PolarisAuthzTestBase {
PolarisCallContextCatalogFactory factory =
new PolarisCallContextCatalogFactory(
- new RealmEntityManagerFactory(null) {
+ new RealmEntityManagerFactory(null, null) {
@Override
public PolarisEntityManager
getOrCreateEntityManager(RealmContext realmContext) {
return entityManager;
@@ -1801,8 +1800,7 @@ public class IcebergCatalogHandlerAuthzTest extends
PolarisAuthzTestBase {
managerFactory,
userSecretsManagerFactory,
Mockito.mock(),
- new DefaultFileIOFactory(
- realmEntityManagerFactory, managerFactory, new
PolarisConfigurationStore() {}),
+ new DefaultFileIOFactory(realmEntityManagerFactory,
managerFactory),
polarisEventListener) {
@Override
public Catalog createCallContextCatalog(
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 3ea649729..2ef683b5d 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
@@ -99,6 +99,7 @@ import
org.apache.polaris.core.auth.AuthenticatedPolarisPrincipal;
import org.apache.polaris.core.auth.PolarisAuthorizerImpl;
import org.apache.polaris.core.config.FeatureConfiguration;
import org.apache.polaris.core.config.PolarisConfigurationStore;
+import org.apache.polaris.core.config.RealmConfig;
import org.apache.polaris.core.context.CallContext;
import org.apache.polaris.core.context.RealmContext;
import org.apache.polaris.core.entity.CatalogEntity;
@@ -255,10 +256,6 @@ public abstract class IcebergCatalogTest extends
CatalogTests<IcebergCatalog> {
private TestPolarisEventListener testPolarisEventListener;
private ReservedProperties reservedProperties;
- protected String getRealmName() {
- return realmName;
- }
-
@BeforeAll
public static void setUpMocks() {
PolarisStorageIntegrationProviderImpl mock =
@@ -268,7 +265,7 @@ public abstract class IcebergCatalogTest extends
CatalogTests<IcebergCatalog> {
@Nullable
protected abstract InMemoryEntityCache createEntityCache(
- PolarisMetaStoreManager metaStoreManager);
+ RealmConfig realmConfig, PolarisMetaStoreManager metaStoreManager);
@BeforeEach
@SuppressWarnings("unchecked")
@@ -292,8 +289,8 @@ public abstract class IcebergCatalogTest extends
CatalogTests<IcebergCatalog> {
entityManager =
new PolarisEntityManager(
metaStoreManager,
- new StorageCredentialCache(configurationStore),
- createEntityCache(metaStoreManager));
+ new StorageCredentialCache(),
+ createEntityCache(polarisContext.getRealmConfig(),
metaStoreManager));
PrincipalEntity rootEntity =
new PrincipalEntity(
@@ -323,7 +320,7 @@ public abstract class IcebergCatalogTest extends
CatalogTests<IcebergCatalog> {
metaStoreManager,
userSecretsManager,
securityContext,
- new PolarisAuthorizerImpl(new PolarisConfigurationStore() {}),
+ new PolarisAuthorizerImpl(),
reservedProperties);
String storageLocation = "s3://my-bucket/path/to/data";
@@ -355,10 +352,9 @@ public abstract class IcebergCatalogTest extends
CatalogTests<IcebergCatalog> {
.asCatalog()));
RealmEntityManagerFactory realmEntityManagerFactory =
- new RealmEntityManagerFactory(metaStoreManagerFactory);
+ new RealmEntityManagerFactory(metaStoreManagerFactory,
configurationStore);
this.fileIOFactory =
- new DefaultFileIOFactory(
- realmEntityManagerFactory, metaStoreManagerFactory,
configurationStore);
+ new DefaultFileIOFactory(realmEntityManagerFactory,
metaStoreManagerFactory);
StsClient stsClient = Mockito.mock(StsClient.class);
when(stsClient.assumeRole(isA(AssumeRoleRequest.class)))
@@ -990,9 +986,8 @@ public abstract class IcebergCatalogTest extends
CatalogTests<IcebergCatalog> {
FileIOFactory fileIOFactory =
spy(
new DefaultFileIOFactory(
- new RealmEntityManagerFactory(metaStoreManagerFactory),
- metaStoreManagerFactory,
- configurationStore));
+ new RealmEntityManagerFactory(metaStoreManagerFactory,
configurationStore),
+ metaStoreManagerFactory));
IcebergCatalog catalog =
new IcebergCatalog(
entityManager,
@@ -1356,9 +1351,8 @@ public abstract class IcebergCatalogTest extends
CatalogTests<IcebergCatalog> {
TableMetadataParser.toJson(createSampleTableMetadata(metadataLocation)).getBytes(UTF_8));
if (!polarisContext
- .getConfigurationStore()
- .getConfiguration(
- polarisContext.getRealmContext(),
FeatureConfiguration.SUPPORTED_CATALOG_STORAGE_TYPES)
+ .getRealmConfig()
+ .getConfig(FeatureConfiguration.SUPPORTED_CATALOG_STORAGE_TYPES)
.contains("FILE")) {
Assertions.assertThatThrownBy(() -> catalog.sendNotification(table,
request))
.isInstanceOf(ForbiddenException.class)
@@ -1424,9 +1418,8 @@ public abstract class IcebergCatalogTest extends
CatalogTests<IcebergCatalog> {
TableMetadataParser.toJson(createSampleTableMetadata(metadataLocation)).getBytes(UTF_8));
if (!polarisContext
- .getConfigurationStore()
- .getConfiguration(
- polarisContext.getRealmContext(),
FeatureConfiguration.SUPPORTED_CATALOG_STORAGE_TYPES)
+ .getRealmConfig()
+ .getConfig(FeatureConfiguration.SUPPORTED_CATALOG_STORAGE_TYPES)
.contains("FILE")) {
Assertions.assertThatThrownBy(() -> catalog.sendNotification(table,
request))
.isInstanceOf(ForbiddenException.class)
@@ -1446,9 +1439,8 @@ public abstract class IcebergCatalogTest extends
CatalogTests<IcebergCatalog> {
TableMetadataParser.toJson(createSampleTableMetadata(metadataLocation)).getBytes(UTF_8));
if (!polarisContext
- .getConfigurationStore()
- .getConfiguration(
- polarisContext.getRealmContext(),
FeatureConfiguration.SUPPORTED_CATALOG_STORAGE_TYPES)
+ .getRealmConfig()
+ .getConfig(FeatureConfiguration.SUPPORTED_CATALOG_STORAGE_TYPES)
.contains("FILE")) {
Assertions.assertThatThrownBy(() -> catalog.sendNotification(table,
newRequest))
.isInstanceOf(ForbiddenException.class)
@@ -1885,9 +1877,8 @@ public abstract class IcebergCatalogTest extends
CatalogTests<IcebergCatalog> {
FileIO fileIO =
new TaskFileIOSupplier(
new DefaultFileIOFactory(
- new RealmEntityManagerFactory(metaStoreManagerFactory),
- metaStoreManagerFactory,
- configurationStore))
+ new RealmEntityManagerFactory(metaStoreManagerFactory,
configurationStore),
+ metaStoreManagerFactory))
.apply(taskEntity, polarisContext);
Assertions.assertThat(fileIO).isNotNull().isInstanceOf(ExceptionMappingFileIO.class);
Assertions.assertThat(((ExceptionMappingFileIO) fileIO).getInnerIo())
@@ -2030,9 +2021,8 @@ public abstract class IcebergCatalogTest extends
CatalogTests<IcebergCatalog> {
MeasuredFileIOFactory measured =
new MeasuredFileIOFactory(
- new RealmEntityManagerFactory(metaStoreManagerFactory),
- metaStoreManagerFactory,
- configurationStore);
+ new RealmEntityManagerFactory(metaStoreManagerFactory,
configurationStore),
+ metaStoreManagerFactory);
IcebergCatalog catalog =
new IcebergCatalog(
entityManager,
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 4d4fa5053..4e516d015 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
@@ -179,8 +179,8 @@ public class IcebergCatalogViewTest extends
ViewCatalogTests<IcebergCatalog> {
PolarisEntityManager entityManager =
new PolarisEntityManager(
metaStoreManager,
- new StorageCredentialCache(configurationStore),
- new InMemoryEntityCache(realmContext, configurationStore,
metaStoreManager));
+ new StorageCredentialCache(),
+ new InMemoryEntityCache(polarisContext.getRealmConfig(),
metaStoreManager));
CallContext.setCurrentContext(polarisContext);
@@ -211,7 +211,7 @@ public class IcebergCatalogViewTest extends
ViewCatalogTests<IcebergCatalog> {
metaStoreManager,
userSecretsManager,
securityContext,
- new PolarisAuthorizerImpl(new PolarisConfigurationStore() {}),
+ new PolarisAuthorizerImpl(),
reservedProperties);
adminService.createCatalog(
new CreateCatalogRequest(
@@ -236,9 +236,8 @@ public class IcebergCatalogViewTest extends
ViewCatalogTests<IcebergCatalog> {
polarisContext, entityManager, securityContext, CATALOG_NAME);
FileIOFactory fileIOFactory =
new DefaultFileIOFactory(
- new RealmEntityManagerFactory(metaStoreManagerFactory),
- metaStoreManagerFactory,
- configurationStore);
+ new RealmEntityManagerFactory(metaStoreManagerFactory,
configurationStore),
+ metaStoreManagerFactory);
testPolarisEventListener = (TestPolarisEventListener) polarisEventListener;
this.catalog =
diff --git
a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolarisCatalogWithEntityCacheTest.java
b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolarisCatalogWithEntityCacheTest.java
index 3c59dff18..40fddc197 100644
---
a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolarisCatalogWithEntityCacheTest.java
+++
b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolarisCatalogWithEntityCacheTest.java
@@ -21,6 +21,7 @@ package org.apache.polaris.service.quarkus.catalog;
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.junit.TestProfile;
import jakarta.annotation.Nullable;
+import org.apache.polaris.core.config.RealmConfig;
import org.apache.polaris.core.persistence.PolarisMetaStoreManager;
import org.apache.polaris.core.persistence.cache.InMemoryEntityCache;
@@ -30,7 +31,8 @@ public class PolarisCatalogWithEntityCacheTest extends
IcebergCatalogTest {
@Nullable
@Override
- protected InMemoryEntityCache createEntityCache(PolarisMetaStoreManager
metaStoreManager) {
- return new InMemoryEntityCache(() -> getRealmName(), configurationStore,
metaStoreManager);
+ protected InMemoryEntityCache createEntityCache(
+ RealmConfig realmConfig, PolarisMetaStoreManager metaStoreManager) {
+ return new InMemoryEntityCache(realmConfig, 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 c4b743bd0..7b8cfa3e9 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
@@ -171,8 +171,8 @@ public class PolarisGenericTableCatalogTest {
entityManager =
new PolarisEntityManager(
metaStoreManager,
- new StorageCredentialCache(configurationStore),
- new InMemoryEntityCache(realmContext, configurationStore,
metaStoreManager));
+ new StorageCredentialCache(),
+ new InMemoryEntityCache(polarisContext.getRealmConfig(),
metaStoreManager));
PrincipalEntity rootEntity =
new PrincipalEntity(
@@ -201,7 +201,7 @@ public class PolarisGenericTableCatalogTest {
metaStoreManager,
userSecretsManager,
securityContext,
- new PolarisAuthorizerImpl(new PolarisConfigurationStore() {}),
+ new PolarisAuthorizerImpl(),
reservedProperties);
String storageLocation = "s3://my-bucket/path/to/data";
@@ -237,10 +237,9 @@ public class PolarisGenericTableCatalogTest {
polarisContext, entityManager, securityContext, CATALOG_NAME);
TaskExecutor taskExecutor = Mockito.mock();
RealmEntityManagerFactory realmEntityManagerFactory =
- new RealmEntityManagerFactory(metaStoreManagerFactory);
+ new RealmEntityManagerFactory(metaStoreManagerFactory,
configurationStore);
this.fileIOFactory =
- new DefaultFileIOFactory(
- realmEntityManagerFactory, metaStoreManagerFactory,
configurationStore);
+ new DefaultFileIOFactory(realmEntityManagerFactory,
metaStoreManagerFactory);
StsClient stsClient = Mockito.mock(StsClient.class);
when(stsClient.assumeRole(isA(AssumeRoleRequest.class)))
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 d7811e9ab..cadfab713 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
@@ -197,8 +197,8 @@ public class PolicyCatalogTest {
entityManager =
new PolarisEntityManager(
metaStoreManager,
- new StorageCredentialCache(configurationStore),
- new InMemoryEntityCache(realmContext, configurationStore,
metaStoreManager));
+ new StorageCredentialCache(),
+ new InMemoryEntityCache(polarisContext.getRealmConfig(),
metaStoreManager));
callContext = polarisContext;
@@ -229,7 +229,7 @@ public class PolicyCatalogTest {
metaStoreManager,
userSecretsManager,
securityContext,
- new PolarisAuthorizerImpl(new PolarisConfigurationStore() {}),
+ new PolarisAuthorizerImpl(),
reservedProperties);
String storageLocation = "s3://my-bucket/path/to/data";
@@ -263,10 +263,9 @@ public class PolicyCatalogTest {
callContext, entityManager, securityContext, CATALOG_NAME);
TaskExecutor taskExecutor = Mockito.mock();
RealmEntityManagerFactory realmEntityManagerFactory =
- new RealmEntityManagerFactory(metaStoreManagerFactory);
+ new RealmEntityManagerFactory(metaStoreManagerFactory,
configurationStore);
this.fileIOFactory =
- new DefaultFileIOFactory(
- realmEntityManagerFactory, metaStoreManagerFactory,
configurationStore);
+ new DefaultFileIOFactory(realmEntityManagerFactory,
metaStoreManagerFactory);
StsClient stsClient = Mockito.mock(StsClient.class);
when(stsClient.assumeRole(isA(AssumeRoleRequest.class)))
diff --git
a/service/common/src/main/java/org/apache/polaris/service/admin/PolarisAdminService.java
b/service/common/src/main/java/org/apache/polaris/service/admin/PolarisAdminService.java
index df046f6c4..9ef57701d 100644
---
a/service/common/src/main/java/org/apache/polaris/service/admin/PolarisAdminService.java
+++
b/service/common/src/main/java/org/apache/polaris/service/admin/PolarisAdminService.java
@@ -605,11 +605,7 @@ public class PolarisAdminService {
*/
private boolean catalogOverlapsWithExistingCatalog(CatalogEntity
catalogEntity) {
boolean allowOverlappingCatalogUrls =
- getCurrentPolarisContext()
- .getConfigurationStore()
- .getConfiguration(
- callContext.getRealmContext(),
FeatureConfiguration.ALLOW_OVERLAPPING_CATALOG_URLS);
-
+
callContext.getRealmConfig().getConfig(FeatureConfiguration.ALLOW_OVERLAPPING_CATALOG_URLS);
if (allowOverlappingCatalogUrls) {
return false;
}
@@ -743,11 +739,8 @@ public class PolarisAdminService {
Map<String, UserSecretReference> processedSecretReferences = Map.of();
List<String> supportedAuthenticationTypes =
callContext
- .getPolarisCallContext()
- .getConfigurationStore()
- .getConfiguration(
- callContext.getRealmContext(),
-
FeatureConfiguration.SUPPORTED_EXTERNAL_CATALOG_AUTHENTICATION_TYPES)
+ .getRealmConfig()
+
.getConfig(FeatureConfiguration.SUPPORTED_EXTERNAL_CATALOG_AUTHENTICATION_TYPES)
.stream()
.map(s -> s.toUpperCase(Locale.ROOT))
.toList();
@@ -799,12 +792,8 @@ public class PolarisAdminService {
findCatalogByName(name)
.orElseThrow(() -> new NotFoundException("Catalog %s not found",
name));
// TODO: Handle return value in case of concurrent modification
- PolarisCallContext polarisCallContext =
callContext.getPolarisCallContext();
boolean cleanup =
- polarisCallContext
- .getConfigurationStore()
- .getConfiguration(
- callContext.getRealmContext(),
FeatureConfiguration.CLEANUP_ON_CATALOG_DROP);
+
callContext.getRealmConfig().getConfig(FeatureConfiguration.CLEANUP_ON_CATALOG_DROP);
DropEntityResult dropEntityResult =
metaStoreManager.dropEntityIfExists(
getCurrentPolarisContext(), null, entity, Map.of(), cleanup);
diff --git
a/service/common/src/main/java/org/apache/polaris/service/admin/PolarisServiceImpl.java
b/service/common/src/main/java/org/apache/polaris/service/admin/PolarisServiceImpl.java
index 071e6b61a..c9d36eb6b 100644
---
a/service/common/src/main/java/org/apache/polaris/service/admin/PolarisServiceImpl.java
+++
b/service/common/src/main/java/org/apache/polaris/service/admin/PolarisServiceImpl.java
@@ -27,7 +27,6 @@ import java.util.Locale;
import org.apache.iceberg.catalog.Namespace;
import org.apache.iceberg.catalog.TableIdentifier;
import org.apache.iceberg.exceptions.NotAuthorizedException;
-import org.apache.polaris.core.PolarisCallContext;
import org.apache.polaris.core.admin.model.AddGrantRequest;
import org.apache.polaris.core.admin.model.AuthenticationParameters;
import org.apache.polaris.core.admin.model.Catalog;
@@ -154,13 +153,10 @@ public class PolarisServiceImpl
}
private void validateStorageConfig(StorageConfigInfo storageConfigInfo) {
- PolarisCallContext polarisCallContext =
callContext.getPolarisCallContext();
List<String> allowedStorageTypes =
- polarisCallContext
- .getConfigurationStore()
- .getConfiguration(
- callContext.getRealmContext(),
- FeatureConfiguration.SUPPORTED_CATALOG_STORAGE_TYPES);
+ callContext
+ .getRealmConfig()
+ .getConfig(FeatureConfiguration.SUPPORTED_CATALOG_STORAGE_TYPES);
if
(!allowedStorageTypes.contains(storageConfigInfo.getStorageType().name())) {
LOGGER
.atWarn()
@@ -188,11 +184,8 @@ public class PolarisServiceImpl
String connectionType = connectionConfigInfo.getConnectionType().name();
List<String> supportedConnectionTypes =
callContext
- .getPolarisCallContext()
- .getConfigurationStore()
- .getConfiguration(
- callContext.getRealmContext(),
- FeatureConfiguration.SUPPORTED_CATALOG_CONNECTION_TYPES)
+ .getRealmConfig()
+ .getConfig(FeatureConfiguration.SUPPORTED_CATALOG_CONNECTION_TYPES)
.stream()
.map(s -> s.toUpperCase(Locale.ROOT))
.toList();
@@ -206,11 +199,8 @@ public class PolarisServiceImpl
String authenticationType =
authenticationParameters.getAuthenticationType().name();
List<String> supportedAuthenticationTypes =
callContext
- .getPolarisCallContext()
- .getConfigurationStore()
- .getConfiguration(
- callContext.getRealmContext(),
-
FeatureConfiguration.SUPPORTED_EXTERNAL_CATALOG_AUTHENTICATION_TYPES)
+ .getRealmConfig()
+
.getConfig(FeatureConfiguration.SUPPORTED_EXTERNAL_CATALOG_AUTHENTICATION_TYPES)
.stream()
.map(s -> s.toUpperCase(Locale.ROOT))
.toList();
diff --git
a/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/CatalogHandlerUtils.java
b/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/CatalogHandlerUtils.java
index 480aafe7a..294daaf52 100644
---
a/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/CatalogHandlerUtils.java
+++
b/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/CatalogHandlerUtils.java
@@ -95,8 +95,7 @@ import org.apache.iceberg.view.ViewMetadata;
import org.apache.iceberg.view.ViewOperations;
import org.apache.iceberg.view.ViewRepresentation;
import org.apache.polaris.core.config.FeatureConfiguration;
-import org.apache.polaris.core.config.PolarisConfigurationStore;
-import org.apache.polaris.core.context.RealmContext;
+import org.apache.polaris.core.config.RealmConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -128,13 +127,10 @@ public class CatalogHandlerUtils {
private final boolean rollbackCompactionEnabled;
@Inject
- public CatalogHandlerUtils(
- RealmContext realmContext, PolarisConfigurationStore configurationStore)
{
+ public CatalogHandlerUtils(RealmConfig realmConfig) {
this(
- configurationStore.getConfiguration(
- realmContext, FeatureConfiguration.ICEBERG_COMMIT_MAX_RETRIES),
- configurationStore.getConfiguration(
- realmContext,
FeatureConfiguration.ICEBERG_ROLLBACK_COMPACTION_ON_CONFLICTS));
+ realmConfig.getConfig(FeatureConfiguration.ICEBERG_COMMIT_MAX_RETRIES),
+
realmConfig.getConfig(FeatureConfiguration.ICEBERG_ROLLBACK_COMPACTION_ON_CONFLICTS));
}
@VisibleForTesting
diff --git
a/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalog.java
b/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalog.java
index 5c0e6b18d..1a8e76900 100644
---
a/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalog.java
+++
b/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalog.java
@@ -93,9 +93,8 @@ import org.apache.polaris.core.admin.model.StorageConfigInfo;
import org.apache.polaris.core.catalog.PolarisCatalogHelpers;
import org.apache.polaris.core.config.BehaviorChangeConfiguration;
import org.apache.polaris.core.config.FeatureConfiguration;
-import org.apache.polaris.core.config.PolarisConfigurationStore;
+import org.apache.polaris.core.config.RealmConfig;
import org.apache.polaris.core.context.CallContext;
-import org.apache.polaris.core.context.RealmContext;
import org.apache.polaris.core.entity.CatalogEntity;
import org.apache.polaris.core.entity.LocationBasedEntity;
import org.apache.polaris.core.entity.NamespaceEntity;
@@ -344,10 +343,9 @@ public class IcebergCatalog extends
BaseMetastoreViewCatalog
@Override
protected TableOperations newTableOps(TableIdentifier tableIdentifier) {
boolean makeMetadataCurrentOnCommit =
- getCurrentPolarisContext()
- .getConfigurationStore()
- .getConfiguration(
- callContext.getRealmContext(),
+ callContext
+ .getRealmConfig()
+ .getConfig(
BehaviorChangeConfiguration.TABLE_OPERATIONS_MAKE_METADATA_CURRENT_ON_COMMIT);
return newTableOps(tableIdentifier, makeMetadataCurrentOnCommit);
}
@@ -517,11 +515,7 @@ public class IcebergCatalog extends
BaseMetastoreViewCatalog
// Set / suffix
boolean requireTrailingSlash =
- callContext
- .getPolarisCallContext()
- .getConfigurationStore()
- .getConfiguration(
- callContext.getRealmContext(),
FeatureConfiguration.ADD_TRAILING_SLASH_TO_LOCATION);
+
callContext.getRealmConfig().getConfig(FeatureConfiguration.ADD_TRAILING_SLASH_TO_LOCATION);
if (requireTrailingSlash && !baseLocation.endsWith("/")) {
baseLocation += "/";
}
@@ -536,10 +530,8 @@ public class IcebergCatalog extends
BaseMetastoreViewCatalog
.setBaseLocation(baseLocation)
.build();
if (!callContext
- .getPolarisCallContext()
- .getConfigurationStore()
- .getConfiguration(
- callContext.getRealmContext(),
FeatureConfiguration.ALLOW_NAMESPACE_LOCATION_OVERLAP)) {
+ .getRealmConfig()
+ .getConfig(FeatureConfiguration.ALLOW_NAMESPACE_LOCATION_OVERLAP)) {
LOGGER.debug("Validating no overlap for {} with sibling tables or
namespaces", namespace);
validateNoLocationOverlap(entity, resolvedParent.getRawFullPath());
} else {
@@ -669,7 +661,6 @@ public class IcebergCatalog extends BaseMetastoreViewCatalog
PolarisEntity leafEntity = resolvedEntities.getRawLeafEntity();
// drop if exists and is empty
- PolarisCallContext polarisCallContext =
callContext.getPolarisCallContext();
DropEntityResult dropEntityResult =
getMetaStoreManager()
.dropEntityIfExists(
@@ -677,11 +668,9 @@ public class IcebergCatalog extends
BaseMetastoreViewCatalog
PolarisEntity.toCoreList(catalogPath),
leafEntity,
Map.of(),
- polarisCallContext
- .getConfigurationStore()
- .getConfiguration(
- callContext.getRealmContext(),
- FeatureConfiguration.CLEANUP_ON_NAMESPACE_DROP));
+ callContext
+ .getRealmConfig()
+
.getConfig(FeatureConfiguration.CLEANUP_ON_NAMESPACE_DROP));
if (!dropEntityResult.isSuccess() &&
dropEntityResult.failedBecauseNotEmpty()) {
throw new NamespaceNotEmptyException("Namespace %s is not empty",
namespace);
@@ -707,10 +696,8 @@ public class IcebergCatalog extends
BaseMetastoreViewCatalog
new PolarisEntity.Builder(entity).setProperties(newProperties).build();
if (!callContext
- .getPolarisCallContext()
- .getConfigurationStore()
- .getConfiguration(
- callContext.getRealmContext(),
FeatureConfiguration.ALLOW_NAMESPACE_LOCATION_OVERLAP)) {
+ .getRealmConfig()
+ .getConfig(FeatureConfiguration.ALLOW_NAMESPACE_LOCATION_OVERLAP)) {
LOGGER.debug("Validating no overlap with sibling tables or namespaces");
validateNoLocationOverlap(
NamespaceEntity.of(updatedEntity),
resolvedEntities.getRawParentPath());
@@ -892,7 +879,6 @@ public class IcebergCatalog extends BaseMetastoreViewCatalog
callContext,
entityManager,
getCredentialVendor(),
- callContext.getPolarisCallContext().getConfigurationStore(),
tableIdentifier,
getLocationsAllowedToBeAccessed(tableMetadata),
storageActions,
@@ -924,23 +910,17 @@ public class IcebergCatalog extends
BaseMetastoreViewCatalog
*/
private String applyDefaultLocationObjectStoragePrefix(
TableIdentifier tableIdentifier, String location) {
- RealmContext realmContext = callContext.getRealmContext();
- PolarisConfigurationStore configurationStore =
- callContext.getPolarisCallContext().getConfigurationStore();
+ RealmConfig realmConfig = callContext.getRealmConfig();
boolean prefixEnabled =
- configurationStore.getConfiguration(
- realmContext,
- catalogEntity,
-
FeatureConfiguration.DEFAULT_LOCATION_OBJECT_STORAGE_PREFIX_ENABLED);
+ realmConfig.getConfig(
+
FeatureConfiguration.DEFAULT_LOCATION_OBJECT_STORAGE_PREFIX_ENABLED,
catalogEntity);
boolean allowUnstructuredTableLocation =
- configurationStore.getConfiguration(
- realmContext, catalogEntity,
FeatureConfiguration.ALLOW_UNSTRUCTURED_TABLE_LOCATION);
+ realmConfig.getConfig(
+ FeatureConfiguration.ALLOW_UNSTRUCTURED_TABLE_LOCATION,
catalogEntity);
boolean allowTableLocationOverlap =
- configurationStore.getConfiguration(
- realmContext, catalogEntity,
FeatureConfiguration.ALLOW_TABLE_LOCATION_OVERLAP);
+
realmConfig.getConfig(FeatureConfiguration.ALLOW_TABLE_LOCATION_OVERLAP,
catalogEntity);
boolean optimizedSiblingCheck =
- configurationStore.getConfiguration(
- realmContext, catalogEntity,
FeatureConfiguration.OPTIMIZED_SIBLING_CHECK);
+ realmConfig.getConfig(FeatureConfiguration.OPTIMIZED_SIBLING_CHECK,
catalogEntity);
if (location != null) {
return location;
} else if (!prefixEnabled) {
@@ -1094,11 +1074,8 @@ public class IcebergCatalog extends
BaseMetastoreViewCatalog
() -> {
List<String> allowedStorageTypes =
callContext
- .getPolarisCallContext()
- .getConfigurationStore()
- .getConfiguration(
- callContext.getRealmContext(),
- FeatureConfiguration.SUPPORTED_CATALOG_STORAGE_TYPES);
+ .getRealmConfig()
+
.getConfig(FeatureConfiguration.SUPPORTED_CATALOG_STORAGE_TYPES);
if
(!allowedStorageTypes.contains(StorageConfigInfo.StorageTypeEnum.FILE.name())) {
List<String> invalidLocations =
locations.stream()
@@ -1125,19 +1102,12 @@ public class IcebergCatalog extends
BaseMetastoreViewCatalog
PolarisEntity entity) {
boolean validateViewOverlap =
callContext
- .getPolarisCallContext()
- .getConfigurationStore()
- .getConfiguration(
- callContext.getRealmContext(),
- BehaviorChangeConfiguration.VALIDATE_VIEW_LOCATION_OVERLAP);
+ .getRealmConfig()
+
.getConfig(BehaviorChangeConfiguration.VALIDATE_VIEW_LOCATION_OVERLAP);
if (callContext
- .getPolarisCallContext()
- .getConfigurationStore()
- .getConfiguration(
- callContext.getRealmContext(),
- catalog,
- FeatureConfiguration.ALLOW_TABLE_LOCATION_OVERLAP)) {
+ .getRealmConfig()
+ .getConfig(FeatureConfiguration.ALLOW_TABLE_LOCATION_OVERLAP,
catalog)) {
LOGGER.debug("Skipping location overlap validation for identifier '{}'",
identifier);
} else if (validateViewOverlap
|| entity.getSubType().equals(PolarisEntitySubType.ICEBERG_TABLE)) {
@@ -1171,11 +1141,7 @@ public class IcebergCatalog extends
BaseMetastoreViewCatalog
// Attempt to directly query for siblings
boolean useOptimizedSiblingCheck =
- callContext
- .getPolarisCallContext()
- .getConfigurationStore()
- .getConfiguration(
- callContext.getRealmContext(),
FeatureConfiguration.OPTIMIZED_SIBLING_CHECK);
+
callContext.getRealmConfig().getConfig(FeatureConfiguration.OPTIMIZED_SIBLING_CHECK);
if (useOptimizedSiblingCheck) {
Optional<Optional<String>> directSiblingCheckResult =
getMetaStoreManager().hasOverlappingSiblings(callContext.getPolarisCallContext(),
entity);
@@ -1526,7 +1492,6 @@ public class IcebergCatalog extends
BaseMetastoreViewCatalog
resolvedTableEntities == null
?
resolvedEntityView.getResolvedPath(tableIdentifier.namespace()).getRawFullPath()
: resolvedTableEntities.getRawParentPath();
- CatalogEntity catalog = CatalogEntity.of(resolvedNamespace.getFirst());
if (base == null
|| !metadata.location().equals(base.location())
@@ -1567,7 +1532,7 @@ public class IcebergCatalog extends
BaseMetastoreViewCatalog
resolvedStorageEntity.getRawLeafEntity()));
// and that the metadata file points to a location within the table's
directory structure
if (metadata.metadataFileLocation() != null) {
- validateMetadataFileInTableDir(tableIdentifier, metadata, catalog);
+ validateMetadataFileInTableDir(tableIdentifier, metadata);
}
}
@@ -2101,20 +2066,13 @@ public class IcebergCatalog extends
BaseMetastoreViewCatalog
}
}
- private void validateMetadataFileInTableDir(
- TableIdentifier identifier, TableMetadata metadata, CatalogEntity
catalog) {
- PolarisCallContext polarisCallContext =
callContext.getPolarisCallContext();
+ private void validateMetadataFileInTableDir(TableIdentifier identifier,
TableMetadata metadata) {
boolean allowEscape =
- polarisCallContext
- .getConfigurationStore()
- .getConfiguration(
- callContext.getRealmContext(),
FeatureConfiguration.ALLOW_EXTERNAL_TABLE_LOCATION);
+
callContext.getRealmConfig().getConfig(FeatureConfiguration.ALLOW_EXTERNAL_TABLE_LOCATION);
if (!allowEscape
- && !polarisCallContext
- .getConfigurationStore()
- .getConfiguration(
- callContext.getRealmContext(),
- FeatureConfiguration.ALLOW_EXTERNAL_METADATA_FILE_LOCATION)) {
+ && !callContext
+ .getRealmConfig()
+
.getConfig(FeatureConfiguration.ALLOW_EXTERNAL_METADATA_FILE_LOCATION)) {
LOGGER.debug(
"Validating base location {} for table {} in metadata file {}",
metadata.location(),
@@ -2314,11 +2272,7 @@ public class IcebergCatalog extends
BaseMetastoreViewCatalog
IcebergTableLikeEntity icebergTableLikeEntity =
IcebergTableLikeEntity.of(entity);
// Set / suffix
boolean requireTrailingSlash =
- callContext
- .getPolarisCallContext()
- .getConfigurationStore()
- .getConfiguration(
- callContext.getRealmContext(),
FeatureConfiguration.ADD_TRAILING_SLASH_TO_LOCATION);
+
callContext.getRealmConfig().getConfig(FeatureConfiguration.ADD_TRAILING_SLASH_TO_LOCATION);
if (requireTrailingSlash
&& icebergTableLikeEntity.getBaseLocation() != null
&& !icebergTableLikeEntity.getBaseLocation().endsWith("/")) {
@@ -2383,11 +2337,7 @@ public class IcebergCatalog extends
BaseMetastoreViewCatalog
// Set / suffix
boolean requireTrailingSlash =
- callContext
- .getPolarisCallContext()
- .getConfigurationStore()
- .getConfiguration(
- callContext.getRealmContext(),
FeatureConfiguration.ADD_TRAILING_SLASH_TO_LOCATION);
+
callContext.getRealmConfig().getConfig(FeatureConfiguration.ADD_TRAILING_SLASH_TO_LOCATION);
if (requireTrailingSlash
&& icebergTableLikeEntity.getBaseLocation() != null
&& !icebergTableLikeEntity.getBaseLocation().endsWith("/")) {
@@ -2448,12 +2398,8 @@ public class IcebergCatalog extends
BaseMetastoreViewCatalog
if (catalogPath != null && !catalogPath.isEmpty() && purge) {
boolean dropWithPurgeEnabled =
callContext
- .getPolarisCallContext()
- .getConfigurationStore()
- .getConfiguration(
- callContext.getRealmContext(),
- catalogEntity,
- FeatureConfiguration.DROP_WITH_PURGE_ENABLED);
+ .getRealmConfig()
+ .getConfig(FeatureConfiguration.DROP_WITH_PURGE_ENABLED,
catalogEntity);
if (!dropWithPurgeEnabled) {
throw new ForbiddenException(
String.format(
@@ -2597,10 +2543,7 @@ public class IcebergCatalog extends
BaseMetastoreViewCatalog
validateLocationForTableLike(tableIdentifier, tableMetadata.location());
// finally, validate that the metadata file is within the table directory
- validateMetadataFileInTableDir(
- tableIdentifier,
- tableMetadata,
- CatalogEntity.of(resolvedParent.getRawFullPath().getFirst()));
+ validateMetadataFileInTableDir(tableIdentifier, tableMetadata);
// TODO: These might fail due to concurrent update; we need to do a
retry in those cases.
if (null == existingLocation) {
@@ -2694,19 +2637,10 @@ public class IcebergCatalog extends
BaseMetastoreViewCatalog
}
}
- /** Helper to retrieve dynamic context-based configuration that has a
boolean value. */
- private Boolean getBooleanContextConfiguration(String configKey, boolean
defaultValue) {
- return callContext
- .getPolarisCallContext()
- .getConfigurationStore()
- .getConfiguration(callContext.getRealmContext(), configKey,
defaultValue);
- }
-
private int getMaxMetadataRefreshRetries() {
- var ctx = callContext.getPolarisCallContext();
- return ctx.getConfigurationStore()
- .getConfiguration(
- callContext.getRealmContext(),
FeatureConfiguration.MAX_METADATA_REFRESH_RETRIES);
+ return callContext
+ .getRealmConfig()
+ .getConfig(FeatureConfiguration.MAX_METADATA_REFRESH_RETRIES);
}
/** Build a {@link PageToken} from a string and page size. */
@@ -2714,12 +2648,8 @@ public class IcebergCatalog extends
BaseMetastoreViewCatalog
boolean paginationEnabled =
callContext
- .getPolarisCallContext()
- .getConfigurationStore()
- .getConfiguration(
- callContext.getRealmContext(),
- catalogEntity,
- FeatureConfiguration.LIST_PAGINATION_ENABLED);
+ .getRealmConfig()
+ .getConfig(FeatureConfiguration.LIST_PAGINATION_ENABLED,
catalogEntity);
if (!paginationEnabled) {
return PageToken.readEverything();
} else {
diff --git
a/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogHandler.java
b/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogHandler.java
index c84253aa8..c0b0b3259 100644
---
a/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogHandler.java
+++
b/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogHandler.java
@@ -76,7 +76,6 @@ import
org.apache.iceberg.rest.responses.UpdateNamespacePropertiesResponse;
import org.apache.polaris.core.auth.PolarisAuthorizableOperation;
import org.apache.polaris.core.auth.PolarisAuthorizer;
import org.apache.polaris.core.config.FeatureConfiguration;
-import org.apache.polaris.core.config.PolarisConfigurationStore;
import org.apache.polaris.core.connection.ConnectionConfigInfoDpo;
import org.apache.polaris.core.connection.ConnectionType;
import org.apache.polaris.core.connection.hadoop.HadoopConnectionConfigInfoDpo;
@@ -698,22 +697,20 @@ public class IcebergCatalogHandler extends CatalogHandler
implements AutoCloseab
.getDiagServices()
.checkNotNull(catalogPath, "No catalog available for loadTable
request");
CatalogEntity catalogEntity =
CatalogEntity.of(catalogPath.getRawLeafEntity());
- PolarisConfigurationStore configurationStore =
- callContext.getPolarisCallContext().getConfigurationStore();
LOGGER.info("Catalog type: {}", catalogEntity.getCatalogType());
LOGGER.info(
"allow external catalog credential vending: {}",
- configurationStore.getConfiguration(
- callContext.getRealmContext(),
- catalogEntity,
- FeatureConfiguration.ALLOW_EXTERNAL_CATALOG_CREDENTIAL_VENDING));
+ callContext
+ .getRealmConfig()
+ .getConfig(
+
FeatureConfiguration.ALLOW_EXTERNAL_CATALOG_CREDENTIAL_VENDING, catalogEntity));
if (catalogEntity
.getCatalogType()
.equals(org.apache.polaris.core.admin.model.Catalog.TypeEnum.EXTERNAL)
- && !configurationStore.getConfiguration(
- callContext.getRealmContext(),
- catalogEntity,
- FeatureConfiguration.ALLOW_EXTERNAL_CATALOG_CREDENTIAL_VENDING)) {
+ && !callContext
+ .getRealmConfig()
+ .getConfig(
+
FeatureConfiguration.ALLOW_EXTERNAL_CATALOG_CREDENTIAL_VENDING, catalogEntity))
{
throw new ForbiddenException(
"Access Delegation is not enabled for this catalog. Please consult
applicable "
+ "documentation for the catalog config property '%s' to enable
this feature",
@@ -968,10 +965,8 @@ public class IcebergCatalogHandler extends CatalogHandler
implements AutoCloseab
.location()
.equals(((MetadataUpdate.SetLocation)
singleUpdate).location())
&& !callContext
- .getPolarisCallContext()
- .getConfigurationStore()
- .getConfiguration(
- callContext.getRealmContext(),
+ .getRealmConfig()
+ .getConfig(
FeatureConfiguration.ALLOW_NAMESPACE_LOCATION_OVERLAP)) {
throw new BadRequestException(
"Unsupported operation: commitTransaction
containing SetLocation"
diff --git
a/service/common/src/main/java/org/apache/polaris/service/catalog/io/DefaultFileIOFactory.java
b/service/common/src/main/java/org/apache/polaris/service/catalog/io/DefaultFileIOFactory.java
index db4874521..bf4b05a69 100644
---
a/service/common/src/main/java/org/apache/polaris/service/catalog/io/DefaultFileIOFactory.java
+++
b/service/common/src/main/java/org/apache/polaris/service/catalog/io/DefaultFileIOFactory.java
@@ -31,7 +31,6 @@ import org.apache.hadoop.conf.Configuration;
import org.apache.iceberg.CatalogUtil;
import org.apache.iceberg.catalog.TableIdentifier;
import org.apache.iceberg.io.FileIO;
-import org.apache.polaris.core.config.PolarisConfigurationStore;
import org.apache.polaris.core.context.CallContext;
import org.apache.polaris.core.context.RealmContext;
import org.apache.polaris.core.entity.PolarisEntity;
@@ -57,16 +56,13 @@ public class DefaultFileIOFactory implements FileIOFactory {
private final RealmEntityManagerFactory realmEntityManagerFactory;
private final MetaStoreManagerFactory metaStoreManagerFactory;
- private final PolarisConfigurationStore configurationStore;
@Inject
public DefaultFileIOFactory(
RealmEntityManagerFactory realmEntityManagerFactory,
- MetaStoreManagerFactory metaStoreManagerFactory,
- PolarisConfigurationStore configurationStore) {
+ MetaStoreManagerFactory metaStoreManagerFactory) {
this.realmEntityManagerFactory = realmEntityManagerFactory;
this.metaStoreManagerFactory = metaStoreManagerFactory;
- this.configurationStore = configurationStore;
}
@Override
@@ -95,7 +91,6 @@ public class DefaultFileIOFactory implements FileIOFactory {
callContext,
entityManager,
credentialVendor,
- configurationStore,
identifier,
tableLocations,
storageActions,
diff --git
a/service/common/src/main/java/org/apache/polaris/service/catalog/io/FileIOUtil.java
b/service/common/src/main/java/org/apache/polaris/service/catalog/io/FileIOUtil.java
index db3771b96..fcedcfe35 100644
---
a/service/common/src/main/java/org/apache/polaris/service/catalog/io/FileIOUtil.java
+++
b/service/common/src/main/java/org/apache/polaris/service/catalog/io/FileIOUtil.java
@@ -22,7 +22,6 @@ import java.util.Optional;
import java.util.Set;
import org.apache.iceberg.catalog.TableIdentifier;
import org.apache.polaris.core.config.FeatureConfiguration;
-import org.apache.polaris.core.config.PolarisConfigurationStore;
import org.apache.polaris.core.context.CallContext;
import org.apache.polaris.core.entity.PolarisEntity;
import org.apache.polaris.core.entity.PolarisEntityConstants;
@@ -79,17 +78,15 @@ public class FileIOUtil {
CallContext callContext,
PolarisEntityManager entityManager,
PolarisCredentialVendor credentialVendor,
- PolarisConfigurationStore configurationStore,
TableIdentifier tableIdentifier,
Set<String> tableLocations,
Set<PolarisStorageActions> storageActions,
PolarisEntity entity) {
boolean skipCredentialSubscopingIndirection =
- configurationStore.getConfiguration(
- callContext.getRealmContext(),
- FeatureConfiguration.SKIP_CREDENTIAL_SUBSCOPING_INDIRECTION.key(),
-
FeatureConfiguration.SKIP_CREDENTIAL_SUBSCOPING_INDIRECTION.defaultValue());
+ callContext
+ .getRealmConfig()
+
.getConfig(FeatureConfiguration.SKIP_CREDENTIAL_SUBSCOPING_INDIRECTION);
if (skipCredentialSubscopingIndirection) {
LOGGER
.atDebug()
diff --git
a/service/common/src/main/java/org/apache/polaris/service/catalog/io/WasbTranslatingFileIOFactory.java
b/service/common/src/main/java/org/apache/polaris/service/catalog/io/WasbTranslatingFileIOFactory.java
index a7074fdc0..0fa94ae30 100644
---
a/service/common/src/main/java/org/apache/polaris/service/catalog/io/WasbTranslatingFileIOFactory.java
+++
b/service/common/src/main/java/org/apache/polaris/service/catalog/io/WasbTranslatingFileIOFactory.java
@@ -26,7 +26,6 @@ import java.util.Map;
import java.util.Set;
import org.apache.iceberg.catalog.TableIdentifier;
import org.apache.iceberg.io.FileIO;
-import org.apache.polaris.core.config.PolarisConfigurationStore;
import org.apache.polaris.core.context.CallContext;
import org.apache.polaris.core.persistence.MetaStoreManagerFactory;
import org.apache.polaris.core.persistence.PolarisResolvedPathWrapper;
@@ -43,11 +42,9 @@ public class WasbTranslatingFileIOFactory implements
FileIOFactory {
@Inject
public WasbTranslatingFileIOFactory(
RealmEntityManagerFactory realmEntityManagerFactory,
- MetaStoreManagerFactory metaStoreManagerFactory,
- PolarisConfigurationStore configurationStore) {
+ MetaStoreManagerFactory metaStoreManagerFactory) {
defaultFileIOFactory =
- new DefaultFileIOFactory(
- realmEntityManagerFactory, metaStoreManagerFactory,
configurationStore);
+ new DefaultFileIOFactory(realmEntityManagerFactory,
metaStoreManagerFactory);
}
@Override
diff --git
a/service/common/src/main/java/org/apache/polaris/service/catalog/validation/IcebergPropertiesValidation.java
b/service/common/src/main/java/org/apache/polaris/service/catalog/validation/IcebergPropertiesValidation.java
index db512d852..bc44e032d 100644
---
a/service/common/src/main/java/org/apache/polaris/service/catalog/validation/IcebergPropertiesValidation.java
+++
b/service/common/src/main/java/org/apache/polaris/service/catalog/validation/IcebergPropertiesValidation.java
@@ -44,13 +44,11 @@ public class IcebergPropertiesValidation {
@Nonnull CallContext callContext,
@Nonnull Map<String, String> properties,
@Nullable PolarisStorageConfigurationInfo storageConfigurationInfo) {
- var ctx = callContext.getPolarisCallContext();
- var configStore = ctx.getConfigurationStore();
- var realmContext = callContext.getRealmContext();
-
+ var realmConfig = callContext.getPolarisCallContext().getRealmConfig();
var ioImpl = properties.get(CatalogProperties.FILE_IO_IMPL);
+
if (ioImpl != null) {
- if (!configStore.getConfiguration(realmContext,
ALLOW_SPECIFYING_FILE_IO_IMPL)) {
+ if (!realmConfig.getConfig(ALLOW_SPECIFYING_FILE_IO_IMPL)) {
throw new ValidationException(
"Cannot set property '%s' to '%s' for this catalog.",
CatalogProperties.FILE_IO_IMPL, ioImpl);
@@ -70,16 +68,13 @@ public class IcebergPropertiesValidation {
if (ioImpl != null) {
var storageType = StorageTypeFileIO.fromFileIoImplementation(ioImpl);
if (storageType.validateAllowedStorageType()
- && !configStore
- .getConfiguration(realmContext, SUPPORTED_CATALOG_STORAGE_TYPES)
- .contains(storageType.name())) {
+ &&
!realmConfig.getConfig(SUPPORTED_CATALOG_STORAGE_TYPES).contains(storageType.name()))
{
throw new ValidationException(
"File IO implementation '%s', as storage type '%s' is not
supported",
ioImpl, storageType);
}
- if (!storageType.safe()
- && !configStore.getConfiguration(realmContext,
ALLOW_INSECURE_STORAGE_TYPES)) {
+ if (!storageType.safe() &&
!realmConfig.getConfig(ALLOW_INSECURE_STORAGE_TYPES)) {
throw new ValidationException(
"File IO implementation '%s' (storage type '%s') is considered
insecure and must not be used",
ioImpl, storageType);
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 03799bd40..ff962dc63 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
@@ -22,6 +22,9 @@ import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import org.apache.polaris.core.config.PolarisConfigurationStore;
+import org.apache.polaris.core.config.RealmConfig;
+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;
@@ -35,13 +38,17 @@ public class RealmEntityManagerFactory {
private static final Logger LOGGER =
LoggerFactory.getLogger(RealmEntityManagerFactory.class);
private final MetaStoreManagerFactory metaStoreManagerFactory;
+ private final PolarisConfigurationStore configurationStore;
// Key: realmIdentifier
private final Map<String, PolarisEntityManager> cachedEntityManagers = new
ConcurrentHashMap<>();
@Inject
- public RealmEntityManagerFactory(MetaStoreManagerFactory
metaStoreManagerFactory) {
+ public RealmEntityManagerFactory(
+ MetaStoreManagerFactory metaStoreManagerFactory,
+ PolarisConfigurationStore configurationStore) {
this.metaStoreManagerFactory = metaStoreManagerFactory;
+ this.configurationStore = configurationStore;
}
public PolarisEntityManager getOrCreateEntityManager(RealmContext context) {
@@ -53,10 +60,11 @@ public class RealmEntityManagerFactory {
realm,
r -> {
LOGGER.info("Initializing new PolarisEntityManager for realm {}", r);
+ RealmConfig realmConfig = new RealmConfigImpl(configurationStore,
context);
return new PolarisEntityManager(
metaStoreManagerFactory.getOrCreateMetaStoreManager(context),
-
metaStoreManagerFactory.getOrCreateStorageCredentialCache(context),
- metaStoreManagerFactory.getOrCreateEntityCache(context));
+
metaStoreManagerFactory.getOrCreateStorageCredentialCache(context, realmConfig),
+ metaStoreManagerFactory.getOrCreateEntityCache(context,
realmConfig));
});
}
}
diff --git
a/service/common/src/main/java/org/apache/polaris/service/persistence/InMemoryAtomicOperationMetaStoreManagerFactory.java
b/service/common/src/main/java/org/apache/polaris/service/persistence/InMemoryAtomicOperationMetaStoreManagerFactory.java
index 83908f017..3f0b1a355 100644
---
a/service/common/src/main/java/org/apache/polaris/service/persistence/InMemoryAtomicOperationMetaStoreManagerFactory.java
+++
b/service/common/src/main/java/org/apache/polaris/service/persistence/InMemoryAtomicOperationMetaStoreManagerFactory.java
@@ -22,7 +22,6 @@ import io.smallrye.common.annotation.Identifier;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import org.apache.polaris.core.PolarisDiagnostics;
-import org.apache.polaris.core.config.PolarisConfigurationStore;
import org.apache.polaris.core.persistence.AtomicOperationMetaStoreManager;
import org.apache.polaris.core.persistence.PolarisMetaStoreManager;
import org.apache.polaris.core.storage.PolarisStorageIntegrationProvider;
@@ -37,15 +36,13 @@ public class InMemoryAtomicOperationMetaStoreManagerFactory
extends InMemoryPolarisMetaStoreManagerFactory {
public InMemoryAtomicOperationMetaStoreManagerFactory() {
- super(null, null, null);
+ super(null, null);
}
@Inject
public InMemoryAtomicOperationMetaStoreManagerFactory(
- PolarisStorageIntegrationProvider storageIntegration,
- PolarisDiagnostics diagnostics,
- PolarisConfigurationStore configurationStore) {
- super(storageIntegration, diagnostics, configurationStore);
+ PolarisStorageIntegrationProvider storageIntegration, PolarisDiagnostics
diagnostics) {
+ super(storageIntegration, diagnostics);
}
@Override
diff --git
a/service/common/src/main/java/org/apache/polaris/service/persistence/InMemoryPolarisMetaStoreManagerFactory.java
b/service/common/src/main/java/org/apache/polaris/service/persistence/InMemoryPolarisMetaStoreManagerFactory.java
index 367a57de6..895e5b51b 100644
---
a/service/common/src/main/java/org/apache/polaris/service/persistence/InMemoryPolarisMetaStoreManagerFactory.java
+++
b/service/common/src/main/java/org/apache/polaris/service/persistence/InMemoryPolarisMetaStoreManagerFactory.java
@@ -29,7 +29,6 @@ import java.util.Map;
import java.util.Set;
import java.util.function.Supplier;
import org.apache.polaris.core.PolarisDiagnostics;
-import org.apache.polaris.core.config.PolarisConfigurationStore;
import org.apache.polaris.core.context.RealmContext;
import org.apache.polaris.core.persistence.LocalPolarisMetaStoreManagerFactory;
import org.apache.polaris.core.persistence.PolarisMetaStoreManager;
@@ -49,15 +48,13 @@ public class InMemoryPolarisMetaStoreManagerFactory
private final Set<String> bootstrappedRealms = new HashSet<>();
public InMemoryPolarisMetaStoreManagerFactory() {
- this(null, null, null);
+ this(null, null);
}
@Inject
public InMemoryPolarisMetaStoreManagerFactory(
- PolarisStorageIntegrationProvider storageIntegration,
- PolarisDiagnostics diagnostics,
- PolarisConfigurationStore configurationStore) {
- super(diagnostics, configurationStore);
+ PolarisStorageIntegrationProvider storageIntegration, PolarisDiagnostics
diagnostics) {
+ super(diagnostics);
this.storageIntegration = storageIntegration;
}
diff --git
a/service/common/src/main/java/org/apache/polaris/service/task/TableCleanupTaskHandler.java
b/service/common/src/main/java/org/apache/polaris/service/task/TableCleanupTaskHandler.java
index 0fd353c51..db74cbcab 100644
---
a/service/common/src/main/java/org/apache/polaris/service/task/TableCleanupTaskHandler.java
+++
b/service/common/src/main/java/org/apache/polaris/service/task/TableCleanupTaskHandler.java
@@ -115,7 +115,7 @@ public class TableCleanupTaskHandler implements TaskHandler
{
Stream<TaskEntity> metadataFileCleanupTasks =
getMetadataTaskStream(
- cleanupTask, tableMetadata, fileIO, tableEntity,
metaStoreManager, callContext);
+ cleanupTask, tableMetadata, tableEntity, metaStoreManager,
callContext);
List<TaskEntity> taskEntities =
Stream.concat(manifestCleanupTasks,
metadataFileCleanupTasks).toList();
@@ -198,15 +198,11 @@ public class TableCleanupTaskHandler implements
TaskHandler {
private Stream<TaskEntity> getMetadataTaskStream(
TaskEntity cleanupTask,
TableMetadata tableMetadata,
- FileIO fileIO,
IcebergTableLikeEntity tableEntity,
PolarisMetaStoreManager metaStoreManager,
CallContext callContext) {
PolarisCallContext polarisCallContext =
callContext.getPolarisCallContext();
- int batchSize =
- polarisCallContext
- .getConfigurationStore()
- .getConfiguration(callContext.getRealmContext(),
BATCH_SIZE_CONFIG_KEY, 10);
+ int batchSize =
callContext.getRealmConfig().getConfig(BATCH_SIZE_CONFIG_KEY, 10);
return getMetadataFileBatches(tableMetadata, batchSize).stream()
.map(
metadataBatch -> {
diff --git
a/service/common/src/test/java/org/apache/polaris/service/admin/PolarisServiceImplTest.java
b/service/common/src/test/java/org/apache/polaris/service/admin/PolarisServiceImplTest.java
index fab1d7da4..a6d01ede4 100644
---
a/service/common/src/test/java/org/apache/polaris/service/admin/PolarisServiceImplTest.java
+++
b/service/common/src/test/java/org/apache/polaris/service/admin/PolarisServiceImplTest.java
@@ -24,7 +24,6 @@ import static org.mockito.Mockito.when;
import java.lang.reflect.Method;
import java.util.List;
-import org.apache.polaris.core.PolarisCallContext;
import org.apache.polaris.core.admin.model.AuthenticationParameters;
import org.apache.polaris.core.admin.model.Catalog;
import org.apache.polaris.core.admin.model.CatalogProperties;
@@ -35,9 +34,8 @@ import org.apache.polaris.core.admin.model.PolarisCatalog;
import org.apache.polaris.core.admin.model.StorageConfigInfo;
import org.apache.polaris.core.auth.PolarisAuthorizer;
import org.apache.polaris.core.config.FeatureConfiguration;
-import org.apache.polaris.core.config.PolarisConfigurationStore;
+import org.apache.polaris.core.config.RealmConfig;
import org.apache.polaris.core.context.CallContext;
-import org.apache.polaris.core.context.RealmContext;
import org.apache.polaris.core.persistence.MetaStoreManagerFactory;
import org.apache.polaris.core.secrets.UserSecretsManagerFactory;
import org.apache.polaris.service.config.RealmEntityManagerFactory;
@@ -54,9 +52,7 @@ public class PolarisServiceImplTest {
private PolarisAuthorizer polarisAuthorizer;
private CallContext callContext;
private ReservedProperties reservedProperties;
- private PolarisCallContext polarisCallContext;
- private PolarisConfigurationStore configurationStore;
- private RealmContext realmContext;
+ private RealmConfig realmConfig;
private PolarisServiceImpl polarisService;
@@ -68,18 +64,13 @@ public class PolarisServiceImplTest {
polarisAuthorizer = Mockito.mock(PolarisAuthorizer.class);
callContext = Mockito.mock(CallContext.class);
reservedProperties = Mockito.mock(ReservedProperties.class);
- polarisCallContext = Mockito.mock(PolarisCallContext.class);
- configurationStore = Mockito.mock(PolarisConfigurationStore.class);
- realmContext = Mockito.mock(RealmContext.class);
-
- when(callContext.getPolarisCallContext()).thenReturn(polarisCallContext);
- when(callContext.getRealmContext()).thenReturn(realmContext);
-
when(polarisCallContext.getConfigurationStore()).thenReturn(configurationStore);
- when(configurationStore.getConfiguration(
- realmContext,
FeatureConfiguration.SUPPORTED_CATALOG_CONNECTION_TYPES))
+ realmConfig = Mockito.mock(RealmConfig.class);
+
+ when(callContext.getRealmConfig()).thenReturn(realmConfig);
+
when(realmConfig.getConfig(FeatureConfiguration.SUPPORTED_CATALOG_CONNECTION_TYPES))
.thenReturn(List.of("ICEBERG_REST"));
- when(configurationStore.getConfiguration(
- realmContext,
FeatureConfiguration.SUPPORTED_EXTERNAL_CATALOG_AUTHENTICATION_TYPES))
+ when(realmConfig.getConfig(
+
FeatureConfiguration.SUPPORTED_EXTERNAL_CATALOG_AUTHENTICATION_TYPES))
.thenReturn(List.of("OAUTH"));
polarisService =
diff --git
a/service/common/src/test/java/org/apache/polaris/service/catalog/io/FileIOFactoryTest.java
b/service/common/src/test/java/org/apache/polaris/service/catalog/io/FileIOFactoryTest.java
index 1158632eb..34a9531d2 100644
---
a/service/common/src/test/java/org/apache/polaris/service/catalog/io/FileIOFactoryTest.java
+++
b/service/common/src/test/java/org/apache/polaris/service/catalog/io/FileIOFactoryTest.java
@@ -104,10 +104,9 @@ public class FileIOFactoryTest {
// Spy FileIOFactory and check if the credentials are passed to the FileIO
TestServices.FileIOFactorySupplier fileIOFactorySupplier =
- (entityManagerFactory, metaStoreManagerFactory, configurationStore) ->
+ (entityManagerFactory, metaStoreManagerFactory) ->
Mockito.spy(
- new DefaultFileIOFactory(
- entityManagerFactory, metaStoreManagerFactory,
configurationStore) {
+ new DefaultFileIOFactory(entityManagerFactory,
metaStoreManagerFactory) {
@Override
FileIO loadFileIOInternal(
@Nonnull String ioImplClassName, @Nonnull Map<String,
String> properties) {
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 555a0da15..e8f1950d5 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
@@ -30,6 +30,7 @@ import java.util.Date;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
+import java.util.function.BiFunction;
import org.apache.polaris.core.PolarisCallContext;
import org.apache.polaris.core.PolarisDiagnostics;
import org.apache.polaris.core.auth.AuthenticatedPolarisPrincipal;
@@ -65,7 +66,6 @@ import
org.apache.polaris.service.persistence.InMemoryPolarisMetaStoreManagerFac
import org.apache.polaris.service.secrets.UnsafeInMemorySecretsManagerFactory;
import
org.apache.polaris.service.storage.PolarisStorageIntegrationProviderImpl;
import org.apache.polaris.service.task.TaskExecutor;
-import org.assertj.core.util.TriFunction;
import org.mockito.Mockito;
import software.amazon.awssdk.services.sts.StsClient;
@@ -89,11 +89,7 @@ public record TestServices(
@FunctionalInterface
public interface FileIOFactorySupplier
- extends TriFunction<
- RealmEntityManagerFactory,
- MetaStoreManagerFactory,
- PolarisConfigurationStore,
- FileIOFactory> {}
+ extends BiFunction<RealmEntityManagerFactory, MetaStoreManagerFactory,
FileIOFactory> {}
private static class MockedConfigurationStore implements
PolarisConfigurationStore {
private final Map<String, Object> defaults;
@@ -155,9 +151,9 @@ public record TestServices(
() -> GoogleCredentials.create(new AccessToken(GCP_ACCESS_TOKEN,
new Date())));
InMemoryPolarisMetaStoreManagerFactory metaStoreManagerFactory =
new InMemoryPolarisMetaStoreManagerFactory(
- storageIntegrationProvider, polarisDiagnostics,
configurationStore);
+ storageIntegrationProvider, polarisDiagnostics);
RealmEntityManagerFactory realmEntityManagerFactory =
- new RealmEntityManagerFactory(metaStoreManagerFactory) {};
+ new RealmEntityManagerFactory(metaStoreManagerFactory,
configurationStore);
UserSecretsManagerFactory userSecretsManagerFactory =
new UnsafeInMemorySecretsManagerFactory();
@@ -178,8 +174,7 @@ public record TestServices(
userSecretsManagerFactory.getOrCreateUserSecretsManager(realmContext);
FileIOFactory fileIOFactory =
- fileIOFactorySupplier.apply(
- realmEntityManagerFactory, metaStoreManagerFactory,
configurationStore);
+ fileIOFactorySupplier.apply(realmEntityManagerFactory,
metaStoreManagerFactory);
TaskExecutor taskExecutor = Mockito.mock(TaskExecutor.class);
@@ -196,7 +191,7 @@ public record TestServices(
ReservedProperties reservedProperties = ReservedProperties.NONE;
CatalogHandlerUtils catalogHandlerUtils =
- new CatalogHandlerUtils(callContext.getRealmContext(),
configurationStore);
+ new CatalogHandlerUtils(callContext.getRealmConfig());
IcebergCatalogAdapter catalogService =
new IcebergCatalogAdapter(
diff --git
a/service/common/src/testFixtures/java/org/apache/polaris/service/catalog/io/MeasuredFileIOFactory.java
b/service/common/src/testFixtures/java/org/apache/polaris/service/catalog/io/MeasuredFileIOFactory.java
index abfb6e8c3..bdaa3e955 100644
---
a/service/common/src/testFixtures/java/org/apache/polaris/service/catalog/io/MeasuredFileIOFactory.java
+++
b/service/common/src/testFixtures/java/org/apache/polaris/service/catalog/io/MeasuredFileIOFactory.java
@@ -29,7 +29,6 @@ import java.util.Set;
import java.util.function.Supplier;
import org.apache.iceberg.catalog.TableIdentifier;
import org.apache.iceberg.io.FileIO;
-import org.apache.polaris.core.config.PolarisConfigurationStore;
import org.apache.polaris.core.context.CallContext;
import org.apache.polaris.core.persistence.MetaStoreManagerFactory;
import org.apache.polaris.core.persistence.PolarisResolvedPathWrapper;
@@ -55,11 +54,9 @@ public class MeasuredFileIOFactory implements FileIOFactory {
@Inject
public MeasuredFileIOFactory(
RealmEntityManagerFactory realmEntityManagerFactory,
- MetaStoreManagerFactory metaStoreManagerFactory,
- PolarisConfigurationStore configurationStore) {
+ MetaStoreManagerFactory metaStoreManagerFactory) {
defaultFileIOFactory =
- new DefaultFileIOFactory(
- realmEntityManagerFactory, metaStoreManagerFactory,
configurationStore);
+ new DefaultFileIOFactory(realmEntityManagerFactory,
metaStoreManagerFactory);
}
@Override