diff --git a/polaris-core/src/main/java/org/apache/polaris/core/config/PolarisConfigurationStore.java b/polaris-core/src/main/java/org/apache/polaris/core/config/PolarisConfigurationStore.java
index 1e2a1928d7..21bae33084 100644
--- a/polaris-core/src/main/java/org/apache/polaris/core/config/PolarisConfigurationStore.java
+++ b/polaris-core/src/main/java/org/apache/polaris/core/config/PolarisConfigurationStore.java
@@ -107,6 +107,10 @@ public interface PolarisConfigurationStore {
* Retrieve the current value for a configuration, overriding with a catalog config if it is
* present.
*
+ *
Prefer using {@link #getConfiguration(RealmContext, Map, PolarisConfiguration)} when the
+ * catalog properties are already available or are needed repeatedly to prevent unnecessary JSON
+ * deserialization.
+ *
* @param realmContext the current realm context
* @param catalogEntity the catalog to check for an override
* @param config the configuration to load
@@ -117,15 +121,31 @@ public interface PolarisConfigurationStore {
@Nonnull RealmContext realmContext,
@Nonnull CatalogEntity catalogEntity,
PolarisConfiguration config) {
+ return getConfiguration(realmContext, catalogEntity.getPropertiesAsMap(), config);
+ }
+
+ /**
+ * Retrieve the current value for a configuration, overriding with a catalog config if it is
+ * present.
+ *
+ * @param realmContext the current realm context
+ * @param catalogProperties the catalog configuration to check for an override
+ * @param config the configuration to load
+ * @return the current value set for the configuration key or null if not set
+ * @param the type of the configuration value
+ */
+ default @Nonnull T getConfiguration(
+ @Nonnull RealmContext realmContext,
+ @Nonnull Map catalogProperties,
+ PolarisConfiguration config) {
if (config.hasCatalogConfig() || config.hasCatalogConfigUnsafe()) {
- Map propertiesMap = catalogEntity.getPropertiesAsMap();
String propertyValue = null;
if (config.hasCatalogConfig()) {
- propertyValue = propertiesMap.get(config.catalogConfig());
+ propertyValue = catalogProperties.get(config.catalogConfig());
}
if (propertyValue == null) {
if (config.hasCatalogConfigUnsafe()) {
- propertyValue = propertiesMap.get(config.catalogConfigUnsafe());
+ propertyValue = catalogProperties.get(config.catalogConfigUnsafe());
}
if (propertyValue != null) {
LOGGER.warn(
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
index 7443b1875e..026ae8e2a9 100644
--- 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
@@ -19,6 +19,7 @@
package org.apache.polaris.core.config;
import jakarta.annotation.Nullable;
+import java.util.Map;
import org.apache.polaris.core.entity.CatalogEntity;
/** Realm-specific configuration used to retrieve runtime parameters. */
@@ -57,10 +58,24 @@ public interface RealmConfig {
* Retrieve the current value for a configuration, overriding with a catalog config if it is
* present.
*
+ * Prefer using {@link #getConfig(PolarisConfiguration, Map)} when the catalog properties are
+ * already available or are needed repeatedly to prevent unnecessary JSON deserialization.
+ *
* @param 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 getConfig(PolarisConfiguration config, CatalogEntity catalogEntity);
+
+ /**
+ * Retrieve the current value for a configuration, overriding with a catalog config if it is
+ * present.
+ *
+ * @param the type of the configuration value
+ * @param config the configuration to load
+ * @param catalogProperties the catalog configuration to check for an override
+ * @return the current value set for the configuration key or null if not set
+ */
+ T getConfig(PolarisConfiguration config, Map catalogProperties);
}
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
index 5d93c833b8..d2c28bae2f 100644
--- 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
@@ -19,6 +19,7 @@
package org.apache.polaris.core.config;
import jakarta.annotation.Nullable;
+import java.util.Map;
import org.apache.polaris.core.context.RealmContext;
import org.apache.polaris.core.entity.CatalogEntity;
@@ -51,4 +52,9 @@ public T getConfig(PolarisConfiguration config) {
public T getConfig(PolarisConfiguration config, CatalogEntity catalogEntity) {
return configurationStore.getConfiguration(realmContext, catalogEntity, config);
}
+
+ @Override
+ public T getConfig(PolarisConfiguration config, Map catalogProperties) {
+ return configurationStore.getConfiguration(realmContext, catalogProperties, config);
+ }
}
diff --git a/runtime/service/src/test/java/org/apache/polaris/service/admin/PolarisAdminServiceTest.java b/runtime/service/src/test/java/org/apache/polaris/service/admin/PolarisAdminServiceTest.java
index 9241bec85f..276315fb15 100644
--- a/runtime/service/src/test/java/org/apache/polaris/service/admin/PolarisAdminServiceTest.java
+++ b/runtime/service/src/test/java/org/apache/polaris/service/admin/PolarisAdminServiceTest.java
@@ -89,7 +89,8 @@ void setUp() throws Exception {
when(realmConfig.getConfig(FeatureConfiguration.ENABLE_SUB_CATALOG_RBAC_FOR_FEDERATED_CATALOGS))
.thenReturn(true);
when(realmConfig.getConfig(
- eq(FeatureConfiguration.ENABLE_SUB_CATALOG_RBAC_FOR_FEDERATED_CATALOGS), Mockito.any()))
+ eq(FeatureConfiguration.ENABLE_SUB_CATALOG_RBAC_FOR_FEDERATED_CATALOGS),
+ (CatalogEntity) Mockito.any()))
.thenReturn(true);
when(resolutionManifestFactory.createResolutionManifest(any(), any()))
@@ -353,7 +354,8 @@ void testGrantPrivilegeOnNamespaceToRole_PassthroughFacade_FeatureDisabled() thr
when(realmConfig.getConfig(FeatureConfiguration.ENABLE_SUB_CATALOG_RBAC_FOR_FEDERATED_CATALOGS))
.thenReturn(false);
when(realmConfig.getConfig(
- eq(FeatureConfiguration.ENABLE_SUB_CATALOG_RBAC_FOR_FEDERATED_CATALOGS), Mockito.any()))
+ eq(FeatureConfiguration.ENABLE_SUB_CATALOG_RBAC_FOR_FEDERATED_CATALOGS),
+ (CatalogEntity) Mockito.any()))
.thenReturn(false);
PolarisEntity catalogEntity = createEntity(catalogName, PolarisEntityType.CATALOG);
@@ -516,7 +518,8 @@ void testGrantPrivilegeOnTableLikeToRole_PassthroughFacade_FeatureDisabled() thr
when(realmConfig.getConfig(FeatureConfiguration.ENABLE_SUB_CATALOG_RBAC_FOR_FEDERATED_CATALOGS))
.thenReturn(false);
when(realmConfig.getConfig(
- eq(FeatureConfiguration.ENABLE_SUB_CATALOG_RBAC_FOR_FEDERATED_CATALOGS), Mockito.any()))
+ eq(FeatureConfiguration.ENABLE_SUB_CATALOG_RBAC_FOR_FEDERATED_CATALOGS),
+ (CatalogEntity) Mockito.any()))
.thenReturn(false);
PolarisEntity catalogEntity = createEntity(catalogName, PolarisEntityType.CATALOG);
diff --git a/runtime/service/src/test/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogHandlerAuthzTest.java b/runtime/service/src/test/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogHandlerAuthzTest.java
index 3651498129..dd4bc57dee 100644
--- a/runtime/service/src/test/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogHandlerAuthzTest.java
+++ b/runtime/service/src/test/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogHandlerAuthzTest.java
@@ -1164,6 +1164,17 @@ public T getConfig(PolarisConfiguration config, CatalogEntity catalogEnti
}
return realmConfig.getConfig(config, catalogEntity);
}
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public T getConfig(
+ PolarisConfiguration config, Map catalogProperties) {
+ // Override the specific configuration we want to test
+ if (config.equals(FeatureConfiguration.ENABLE_FINE_GRAINED_UPDATE_TABLE_PRIVILEGES)) {
+ return (T) Boolean.valueOf(fineGrainedAuthzEnabled);
+ }
+ return realmConfig.getConfig(config, catalogProperties);
+ }
};
// Mock the regular CallContext calls