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

Reply via email to