Skip to content

Commit ccd5a86

Browse files
committed
rewrite
1 parent add2fa9 commit ccd5a86

File tree

4 files changed

+68
-29
lines changed

4 files changed

+68
-29
lines changed

polaris-core/src/main/java/org/apache/polaris/core/config/PolarisConfiguration.java

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,17 @@
2020

2121
import java.util.ArrayList;
2222
import java.util.List;
23-
import java.util.Map;
24-
import java.util.Objects;
2523
import java.util.Optional;
2624
import java.util.function.Function;
2725
import java.util.stream.Collectors;
2826
import java.util.stream.Stream;
29-
3027
import org.apache.polaris.core.context.CallContext;
3128
import org.slf4j.Logger;
3229
import org.slf4j.LoggerFactory;
3330

3431
/**
35-
* An ABC for Polaris configurations that alter the service's behavior
36-
* TODO: deprecate unsafe catalog configs and remove related code
32+
* An ABC for Polaris configurations that alter the service's behavior TODO: deprecate unsafe
33+
* catalog configs and remove related code
3734
*
3835
* @param <T> The type of the configuration
3936
*/
@@ -63,21 +60,20 @@ private static void registerConfiguration(PolarisConfiguration<?> configuration)
6360
throw new IllegalArgumentException(
6461
String.format("Config '%s' is already in use", configuration.key));
6562
} else {
66-
var configs = Stream.of(
67-
configuration.catalogConfigImpl,
68-
configuration.catalogConfigUnsafeImpl,
69-
existingConfiguration.catalogConfigImpl,
70-
existingConfiguration.catalogConfigUnsafeImpl
71-
)
72-
.flatMap(Optional::stream)
73-
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
74-
for (var entry: configs.entrySet()) {
63+
var configs =
64+
Stream.of(
65+
configuration.catalogConfigImpl,
66+
configuration.catalogConfigUnsafeImpl,
67+
existingConfiguration.catalogConfigImpl,
68+
existingConfiguration.catalogConfigUnsafeImpl)
69+
.flatMap(Optional::stream)
70+
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
71+
for (var entry : configs.entrySet()) {
7572
if (entry.getValue() > 1) {
7673
throw new IllegalArgumentException(
7774
String.format("Catalog config %s is already in use", entry.getKey()));
7875
}
7976
}
80-
8177
}
8278
}
8379
allConfigurations.add(configuration);
@@ -168,6 +164,10 @@ public Builder<T> catalogConfig(String catalogConfig) {
168164
@Deprecated
169165
public Builder<T> catalogConfigUnsafe(String catalogConfig) {
170166
LOGGER.info("catalogConfigUnsafe is deprecated! Use catalogConfig() instead.");
167+
if (catalogConfig.startsWith(SAFE_CATALOG_CONFIG_PREFIX)) {
168+
throw new IllegalArgumentException(
169+
"Unsafe catalog configs are not expected to start with " + SAFE_CATALOG_CONFIG_PREFIX);
170+
}
171171
this.catalogConfigUnsafe = Optional.of(catalogConfig);
172172
return this;
173173
}
@@ -177,7 +177,8 @@ public FeatureConfiguration<T> buildFeatureConfiguration() {
177177
throw new IllegalArgumentException("key, description, and defaultValue are required");
178178
}
179179
FeatureConfiguration<T> config =
180-
new FeatureConfiguration<>(key, description, defaultValue, catalogConfig, catalogConfigUnsafe);
180+
new FeatureConfiguration<>(
181+
key, description, defaultValue, catalogConfig, catalogConfigUnsafe);
181182
PolarisConfiguration.registerConfiguration(config);
182183
return config;
183184
}
@@ -191,7 +192,8 @@ public BehaviorChangeConfiguration<T> buildBehaviorChangeConfiguration() {
191192
"catalog configs are not valid for behavior change configs");
192193
}
193194
BehaviorChangeConfiguration<T> config =
194-
new BehaviorChangeConfiguration<>(key, description, defaultValue, catalogConfig, catalogConfigUnsafe);
195+
new BehaviorChangeConfiguration<>(
196+
key, description, defaultValue, catalogConfig, catalogConfigUnsafe);
195197
PolarisConfiguration.registerConfiguration(config);
196198
return config;
197199
}

polaris-core/src/main/java/org/apache/polaris/core/config/PolarisConfigurationStore.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@
2323
import jakarta.annotation.Nullable;
2424
import java.util.ArrayList;
2525
import java.util.List;
26-
import java.util.Map;
27-
2826
import org.apache.polaris.core.PolarisCallContext;
2927
import org.apache.polaris.core.entity.CatalogEntity;
3028
import org.slf4j.Logger;
@@ -129,5 +127,4 @@ public interface PolarisConfigurationStore {
129127
return getConfiguration(ctx, config);
130128
}
131129
}
132-
133130
}

quarkus/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusReservedProperties.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@
1919
package org.apache.polaris.service.quarkus.config;
2020

2121
import io.smallrye.config.ConfigMapping;
22+
import java.util.HashSet;
2223
import java.util.List;
24+
import java.util.Set;
25+
import org.apache.polaris.core.config.PolarisConfiguration;
2326
import org.apache.polaris.service.config.ReservedProperties;
2427

2528
@ConfigMapping(prefix = "polaris.reserved-properties")
@@ -28,4 +31,27 @@ public interface QuarkusReservedProperties extends ReservedProperties {
2831
default List<String> prefixes() {
2932
return List.of("polaris.");
3033
}
34+
35+
@Override
36+
default Set<String> allowlist() {
37+
return AllowlistHolder.INSTANCE;
38+
}
39+
40+
class AllowlistHolder {
41+
static final Set<String> INSTANCE = computeAllowlist();
42+
43+
private static Set<String> computeAllowlist() {
44+
Set<String> allowlist = new HashSet<>();
45+
PolarisConfiguration.allConfigurations.forEach(
46+
c -> {
47+
if (c.hasCatalogConfig()) {
48+
allowlist.add(c.catalogConfig());
49+
}
50+
if (c.hasCatalogConfigUnsafe()) {
51+
allowlist.add(c.catalogConfigUnsafe());
52+
}
53+
});
54+
return allowlist;
55+
}
56+
}
3157
}

service/common/src/main/java/org/apache/polaris/service/config/ReservedProperties.java

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.HashSet;
2323
import java.util.List;
2424
import java.util.Map;
25+
import java.util.Set;
2526
import java.util.stream.Collectors;
2627
import org.apache.iceberg.MetadataUpdate;
2728
import org.slf4j.Logger;
@@ -43,6 +44,11 @@ public interface ReservedProperties {
4344
public List<String> prefixes() {
4445
return List.of();
4546
}
47+
48+
@Override
49+
public Set<String> allowlist() {
50+
return Set.of();
51+
}
4652
};
4753

4854
/**
@@ -51,6 +57,12 @@ public List<String> prefixes() {
5157
*/
5258
List<String> prefixes();
5359

60+
/**
61+
* A list of properties that are *not* considered reserved, even if they start with a reserved
62+
* prefix
63+
*/
64+
Set<String> allowlist();
65+
5466
/** If true, attempts to modify a reserved property should throw an exception. */
5567
default boolean shouldThrow() {
5668
return true;
@@ -94,15 +106,17 @@ default Map<String, String> removeReservedProperties(Map<String, String> propert
94106
List<String> prefixes = prefixes();
95107
for (var entry : properties.entrySet()) {
96108
boolean isReserved = false;
97-
for (String prefix : prefixes) {
98-
if (entry.getKey().startsWith(prefix)) {
99-
isReserved = true;
100-
String message =
101-
String.format("Property '%s' matches reserved prefix '%s'", entry.getKey(), prefix);
102-
if (shouldThrow()) {
103-
throw new IllegalArgumentException(message);
104-
} else {
105-
LOGGER.debug(message);
109+
if (!allowlist().contains(entry.getKey())) {
110+
for (String prefix : prefixes) {
111+
if (entry.getKey().startsWith(prefix)) {
112+
isReserved = true;
113+
String message =
114+
String.format("Property '%s' matches reserved prefix '%s'", entry.getKey(), prefix);
115+
if (shouldThrow()) {
116+
throw new IllegalArgumentException(message);
117+
} else {
118+
LOGGER.debug(message);
119+
}
106120
}
107121
}
108122
}

0 commit comments

Comments
 (0)