This is an automated email from the ASF dual-hosted git repository.
dimas 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 15f23cae8 Make PolarisConfiguration member variables private (#2007)
15f23cae8 is described below
commit 15f23cae8e678f8a13c20c5012919565288525a0
Author: Pooja Nilangekar <[email protected]>
AuthorDate: Fri Jul 11 09:40:14 2025 -0400
Make PolarisConfiguration member variables private (#2007)
* Make PolarisConfiguration members private
* Make methods final
---
.../polaris/core/config/FeatureConfiguration.java | 4 ++--
.../polaris/core/config/PolarisConfiguration.java | 26 ++++++++++++++++------
.../core/config/PolarisConfigurationStore.java | 14 ++++++------
.../core/storage/cache/StorageCredentialCache.java | 4 ++--
.../storage/PolarisConfigurationStoreTest.java | 6 ++---
.../quarkus/config/ProductionReadinessChecks.java | 20 ++++++++---------
.../quarkus/admin/PolarisOverlappingTableTest.java | 4 ++--
.../quarkus/catalog/IcebergCatalogTest.java | 2 +-
.../service/catalog/iceberg/IcebergCatalog.java | 18 +++++++--------
.../polaris/service/catalog/io/FileIOUtil.java | 4 ++--
10 files changed, 57 insertions(+), 45 deletions(-)
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 59de973be..d8ec61320 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
@@ -55,7 +55,7 @@ public class FeatureConfiguration<T> extends
PolarisConfiguration<T> {
.getConfigurationStore()
.getConfiguration(callContext.getRealmContext(), featureConfig);
if (!enabled) {
- throw new UnsupportedOperationException("Feature not enabled: " +
featureConfig.key);
+ throw new UnsupportedOperationException("Feature not enabled: " +
featureConfig.key());
}
}
@@ -211,7 +211,7 @@ public class FeatureConfiguration<T> extends
PolarisConfiguration<T> {
.key("STORAGE_CREDENTIAL_CACHE_DURATION_SECONDS")
.description(
"How long to store storage credentials in the local cache. This
should be less than "
- + STORAGE_CREDENTIAL_DURATION_SECONDS.key)
+ + STORAGE_CREDENTIAL_DURATION_SECONDS.key())
.defaultValue(30 * 60) // 30 minutes
.buildFeatureConfiguration();
diff --git
a/polaris-core/src/main/java/org/apache/polaris/core/config/PolarisConfiguration.java
b/polaris-core/src/main/java/org/apache/polaris/core/config/PolarisConfiguration.java
index 31ae18795..f9cf8192f 100644
---
a/polaris-core/src/main/java/org/apache/polaris/core/config/PolarisConfiguration.java
+++
b/polaris-core/src/main/java/org/apache/polaris/core/config/PolarisConfiguration.java
@@ -39,9 +39,9 @@ public abstract class PolarisConfiguration<T> {
private static final List<PolarisConfiguration<?>> allConfigurations = new
ArrayList<>();
- public final String key;
- public final String description;
- public final T defaultValue;
+ private final String key;
+ private final String description;
+ private final T defaultValue;
private final Optional<String> catalogConfigImpl;
private final Optional<String> catalogConfigUnsafeImpl;
private final Class<T> typ;
@@ -98,22 +98,22 @@ public abstract class PolarisConfiguration<T> {
this.typ = (Class<T>) defaultValue.getClass();
}
- public boolean hasCatalogConfig() {
+ public final boolean hasCatalogConfig() {
return catalogConfigImpl.isPresent();
}
- public String catalogConfig() {
+ public final String catalogConfig() {
return catalogConfigImpl.orElseThrow(
() ->
new IllegalStateException(
"Attempted to read a catalog config key from a configuration
that doesn't have one."));
}
- public boolean hasCatalogConfigUnsafe() {
+ public final boolean hasCatalogConfigUnsafe() {
return catalogConfigUnsafeImpl.isPresent();
}
- public String catalogConfigUnsafe() {
+ public final String catalogConfigUnsafe() {
return catalogConfigUnsafeImpl.orElseThrow(
() ->
new IllegalStateException(
@@ -124,6 +124,18 @@ public abstract class PolarisConfiguration<T> {
return this.typ.cast(value);
}
+ public final String key() {
+ return key;
+ }
+
+ public final String description() {
+ return description;
+ }
+
+ public final T defaultValue() {
+ return defaultValue;
+ }
+
public static class Builder<T> {
private String key;
private String description;
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 4923d97ee..1e2a1928d 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
@@ -71,18 +71,18 @@ public interface PolarisConfigurationStore {
*/
private <T> @Nonnull T tryCast(PolarisConfiguration<T> config, Object value)
{
if (value == null) {
- return config.defaultValue;
+ return config.defaultValue();
}
- if (config.defaultValue instanceof Boolean) {
+ if (config.defaultValue() instanceof Boolean) {
return config.cast(Boolean.valueOf(String.valueOf(value)));
- } else if (config.defaultValue instanceof Integer) {
+ } else if (config.defaultValue() instanceof Integer) {
return config.cast(Integer.valueOf(String.valueOf(value)));
- } else if (config.defaultValue instanceof Long) {
+ } else if (config.defaultValue() instanceof Long) {
return config.cast(Long.valueOf(String.valueOf(value)));
- } else if (config.defaultValue instanceof Double) {
+ } else if (config.defaultValue() instanceof Double) {
return config.cast(Double.valueOf(String.valueOf(value)));
- } else if (config.defaultValue instanceof List<?>) {
+ } else if (config.defaultValue() instanceof List<?>) {
return config.cast(new ArrayList<>((List<?>) value));
} else {
return config.cast(value);
@@ -99,7 +99,7 @@ public interface PolarisConfigurationStore {
*/
default <T> @Nonnull T getConfiguration(
@Nonnull RealmContext realmContext, PolarisConfiguration<T> config) {
- T result = getConfiguration(realmContext, config.key, config.defaultValue);
+ T result = getConfiguration(realmContext, config.key(),
config.defaultValue());
return tryCast(config, result);
}
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 36f666db0..e3a7a4f13 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
@@ -91,8 +91,8 @@ public class StorageCredentialCache {
throw new IllegalArgumentException(
String.format(
"%s should be less than %s",
-
FeatureConfiguration.STORAGE_CREDENTIAL_CACHE_DURATION_SECONDS.key,
- FeatureConfiguration.STORAGE_CREDENTIAL_DURATION_SECONDS.key));
+
FeatureConfiguration.STORAGE_CREDENTIAL_CACHE_DURATION_SECONDS.key(),
+ FeatureConfiguration.STORAGE_CREDENTIAL_DURATION_SECONDS.key()));
} else {
return cacheDurationSeconds * 1000L;
}
diff --git
a/polaris-core/src/test/java/org/apache/polaris/service/storage/PolarisConfigurationStoreTest.java
b/polaris-core/src/test/java/org/apache/polaris/service/storage/PolarisConfigurationStoreTest.java
index 4b190d3d1..612b8716b 100644
---
a/polaris-core/src/test/java/org/apache/polaris/service/storage/PolarisConfigurationStoreTest.java
+++
b/polaris-core/src/test/java/org/apache/polaris/service/storage/PolarisConfigurationStoreTest.java
@@ -56,8 +56,8 @@ public class PolarisConfigurationStoreTest {
@Override
public <T> @Nullable T getConfiguration(@Nonnull RealmContext ctx,
String configName) {
for (PolarisConfiguration<?> c : configs) {
- if (c.key.equals(configName)) {
- return (T) String.valueOf(c.defaultValue);
+ if (c.key().equals(configName)) {
+ return (T) String.valueOf(c.defaultValue());
}
}
@@ -71,7 +71,7 @@ public class PolarisConfigurationStoreTest {
// Ensure that we can fetch all the configs and that the value is what we
expect, which
// is the config's default value based on how we've implemented
PolarisConfigurationStore above.
for (PolarisConfiguration<?> c : configs) {
- Assertions.assertEquals(c.defaultValue,
store.getConfiguration(testRealmContext, c));
+ Assertions.assertEquals(c.defaultValue(),
store.getConfiguration(testRealmContext, c));
}
}
diff --git
a/runtime/service/src/main/java/org/apache/polaris/service/quarkus/config/ProductionReadinessChecks.java
b/runtime/service/src/main/java/org/apache/polaris/service/quarkus/config/ProductionReadinessChecks.java
index ef2c1813e..4205ef4cf 100644
---
a/runtime/service/src/main/java/org/apache/polaris/service/quarkus/config/ProductionReadinessChecks.java
+++
b/runtime/service/src/main/java/org/apache/polaris/service/quarkus/config/ProductionReadinessChecks.java
@@ -217,26 +217,26 @@ public class ProductionReadinessChecks {
var insecure = FeatureConfiguration.ALLOW_INSECURE_STORAGE_TYPES;
var errors = new ArrayList<Error>();
- if
(Boolean.parseBoolean(featureConfiguration.defaults().get(insecure.key))) {
+ if
(Boolean.parseBoolean(featureConfiguration.defaults().get(insecure.key()))) {
errors.add(
Error.ofSevere(
"Must not enable a configuration that exposes known and severe
security risks: "
- + insecure.description,
- format("polaris.features.\"%s\"", insecure.key)));
+ + insecure.description(),
+ format("polaris.features.\"%s\"", insecure.key())));
}
featureConfiguration
.realmOverrides()
.forEach(
(realmId, overrides) -> {
- if
(Boolean.parseBoolean(overrides.overrides().get(insecure.key))) {
+ if
(Boolean.parseBoolean(overrides.overrides().get(insecure.key()))) {
errors.add(
Error.ofSevere(
"Must not enable a configuration that exposes known
and severe security risks: "
- + insecure.description,
+ + insecure.description(),
format(
"polaris.features.realm-overrides.\"%s\".overrides.\"%s\"",
- realmId, insecure.key)));
+ realmId, insecure.key())));
}
});
@@ -245,7 +245,7 @@ public class ProductionReadinessChecks {
var defaults = featureConfiguration.parseDefaults(mapper);
var realmOverrides = featureConfiguration.parseRealmOverrides(mapper);
@SuppressWarnings("unchecked")
- var supported = (List<String>) defaults.getOrDefault(storageTypes.key,
List.of());
+ var supported = (List<String>) defaults.getOrDefault(storageTypes.key(),
List.of());
supported.stream()
.filter(n -> !IcebergPropertiesValidation.safeStorageType(n))
.forEach(
@@ -255,11 +255,11 @@ public class ProductionReadinessChecks {
format(
"The storage type '%s' is considered insecure and
exposes the service to severe security risks!",
t),
- format("polaris.features.\"%s\"", storageTypes.key))));
+ format("polaris.features.\"%s\"",
storageTypes.key()))));
realmOverrides.forEach(
(realmId, overrides) -> {
@SuppressWarnings("unchecked")
- var s = (List<String>) overrides.getOrDefault(storageTypes.key,
List.of());
+ var s = (List<String>) overrides.getOrDefault(storageTypes.key(),
List.of());
s.stream()
.filter(n -> !IcebergPropertiesValidation.safeStorageType(n))
.forEach(
@@ -271,7 +271,7 @@ public class ProductionReadinessChecks {
t),
format(
"polaris.features.realm-overrides.\"%s\".overrides.\"%s\"",
- realmId, storageTypes.key))));
+ realmId, storageTypes.key()))));
});
return errors.isEmpty()
? ProductionReadinessCheck.OK
diff --git
a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/admin/PolarisOverlappingTableTest.java
b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/admin/PolarisOverlappingTableTest.java
index a658b8e88..2245bb9e9 100644
---
a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/admin/PolarisOverlappingTableTest.java
+++
b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/admin/PolarisOverlappingTableTest.java
@@ -340,7 +340,7 @@ public class PolarisOverlappingTableTest {
"true",
"SUPPORTED_CATALOG_STORAGE_TYPES",
List.of("FILE", "S3"),
- OPTIMIZED_SIBLING_CHECK.key,
+ OPTIMIZED_SIBLING_CHECK.key(),
"false");
TestServices services =
@@ -369,7 +369,7 @@ public class PolarisOverlappingTableTest {
"true",
"SUPPORTED_CATALOG_STORAGE_TYPES",
List.of("FILE", "S3"),
- OPTIMIZED_SIBLING_CHECK.key,
+ OPTIMIZED_SIBLING_CHECK.key(),
"true");
Map<String, String> hashedAndOverlapButNoOptimizedCatalog =
Map.of(
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 a5f4f9080..8534e18ea 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
@@ -1956,7 +1956,7 @@ public abstract class IcebergCatalogTest extends
CatalogTests<IcebergCatalog> {
// Attempt to drop the table:
Assertions.assertThatThrownBy(() -> noPurgeCatalog.dropTable(TABLE, true))
.isInstanceOf(ForbiddenException.class)
-
.hasMessageContaining(FeatureConfiguration.DROP_WITH_PURGE_ENABLED.key);
+
.hasMessageContaining(FeatureConfiguration.DROP_WITH_PURGE_ENABLED.key());
}
private TableMetadata createSampleTableMetadata(String tableLocation) {
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 e1b317a91..5c0e6b18d 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
@@ -949,8 +949,8 @@ public class IcebergCatalog extends BaseMetastoreViewCatalog
throw new IllegalStateException(
String.format(
"The configuration %s is enabled, but %s is not enabled",
-
FeatureConfiguration.DEFAULT_LOCATION_OBJECT_STORAGE_PREFIX_ENABLED.key,
- FeatureConfiguration.ALLOW_UNSTRUCTURED_TABLE_LOCATION.key));
+
FeatureConfiguration.DEFAULT_LOCATION_OBJECT_STORAGE_PREFIX_ENABLED.key(),
+ FeatureConfiguration.ALLOW_UNSTRUCTURED_TABLE_LOCATION.key()));
} else if (!allowTableLocationOverlap) {
// TODO consider doing this check any time ALLOW_EXTERNAL_TABLE_LOCATION
is enabled, not just
// here
@@ -961,17 +961,17 @@ public class IcebergCatalog extends
BaseMetastoreViewCatalog
+ " performed, but only within each namespace. However, %s
is enabled, which indicates"
+ " that tables may be created outside of their parent
namespace. This is not a safe"
+ " combination of configurations.",
- FeatureConfiguration.ALLOW_TABLE_LOCATION_OVERLAP.key,
- FeatureConfiguration.OPTIMIZED_SIBLING_CHECK.key,
- FeatureConfiguration.ALLOW_UNSTRUCTURED_TABLE_LOCATION.key));
+ FeatureConfiguration.ALLOW_TABLE_LOCATION_OVERLAP.key(),
+ FeatureConfiguration.OPTIMIZED_SIBLING_CHECK.key(),
+ FeatureConfiguration.ALLOW_UNSTRUCTURED_TABLE_LOCATION.key()));
} else if (!loggedPrefixOverlapWarning.getAndSet(true)) {
LOGGER.warn(
"A table is being created with {} and {} enabled, but with {}
disabled. "
+ "This is a safe combination of configurations which may
prevent table overlap, but only if the "
+ "underlying persistence actually implements %s. Exercise
caution.",
-
FeatureConfiguration.DEFAULT_LOCATION_OBJECT_STORAGE_PREFIX_ENABLED.key,
- FeatureConfiguration.OPTIMIZED_SIBLING_CHECK.key,
- FeatureConfiguration.ALLOW_TABLE_LOCATION_OVERLAP.key);
+
FeatureConfiguration.DEFAULT_LOCATION_OBJECT_STORAGE_PREFIX_ENABLED.key(),
+ FeatureConfiguration.OPTIMIZED_SIBLING_CHECK.key(),
+ FeatureConfiguration.ALLOW_TABLE_LOCATION_OVERLAP.key());
}
return buildPrefixedLocation(tableIdentifier);
} else {
@@ -2460,7 +2460,7 @@ public class IcebergCatalog extends
BaseMetastoreViewCatalog
"Unable to purge entity: %s. To enable this feature, set the
Polaris configuration %s "
+ "or the catalog configuration %s",
identifier.name(),
- FeatureConfiguration.DROP_WITH_PURGE_ENABLED.key,
+ FeatureConfiguration.DROP_WITH_PURGE_ENABLED.key(),
FeatureConfiguration.DROP_WITH_PURGE_ENABLED.catalogConfig()));
}
}
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 0e6211076..db3771b96 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
@@ -88,8 +88,8 @@ public class FileIOUtil {
boolean skipCredentialSubscopingIndirection =
configurationStore.getConfiguration(
callContext.getRealmContext(),
- FeatureConfiguration.SKIP_CREDENTIAL_SUBSCOPING_INDIRECTION.key,
-
FeatureConfiguration.SKIP_CREDENTIAL_SUBSCOPING_INDIRECTION.defaultValue);
+ FeatureConfiguration.SKIP_CREDENTIAL_SUBSCOPING_INDIRECTION.key(),
+
FeatureConfiguration.SKIP_CREDENTIAL_SUBSCOPING_INDIRECTION.defaultValue());
if (skipCredentialSubscopingIndirection) {
LOGGER
.atDebug()