Skip to content

Commit 486bbba

Browse files
committed
fix: only update the configuration once
Signed-off-by: Chris Laprun <claprun@redhat.com>
1 parent fa23191 commit 486bbba

File tree

1 file changed

+24
-14
lines changed

1 file changed

+24
-14
lines changed

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/AbstractConfigurationService.java

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
*/
1616
@SuppressWarnings("rawtypes")
1717
public class AbstractConfigurationService implements ConfigurationService {
18-
private final Map<String, ControllerConfiguration> configurations = new ConcurrentHashMap<>();
18+
private final Map<String, Configured> configurations = new ConcurrentHashMap<>();
1919
private final Version version;
2020
private KubernetesClient client;
2121
private Cloner cloner;
@@ -88,12 +88,13 @@ private <R extends HasMetadata> void put(
8888
ControllerConfiguration<R> config, boolean failIfExisting) {
8989
final var name = config.getName();
9090
if (failIfExisting) {
91-
final var existing = configurations.get(name);
91+
final var existing = getFor(name);
9292
if (existing != null) {
9393
throwExceptionOnNameCollision(config.getAssociatedReconcilerClassName(), existing);
9494
}
9595
}
96-
configurations.put(name, config);
96+
// record the configuration but mark is as un-configured in case a reconciler wants to override the configuration when registering
97+
configurations.put(name, new Configured(false, config));
9798
}
9899

99100
protected <R extends HasMetadata> void throwExceptionOnNameCollision(
@@ -112,22 +113,31 @@ protected <R extends HasMetadata> void throwExceptionOnNameCollision(
112113
public <R extends HasMetadata> ControllerConfiguration<R> getConfigurationFor(
113114
Reconciler<R> reconciler) {
114115
final var key = keyFor(reconciler);
115-
var configuration = configurations.get(key);
116-
if (configuration == null) {
116+
var configured = configurations.get(key);
117+
if (configured == null) {
117118
logMissingReconcilerWarning(key, getReconcilersNameMessage());
118-
} else {
119-
// if a reconciler is also a ConfigurableReconciler, update and replace its configuration
119+
return null;
120+
}
121+
122+
var config = configured.config;
123+
// if a reconciler is also a ConfigurableReconciler, update and replace its configuration if it
124+
// hasn't already been configured
125+
if (!configured.configured) {
120126
if (reconciler instanceof ConfigurableReconciler<?> configurableReconciler) {
121-
final var overrider = ControllerConfigurationOverrider.override(configuration);
127+
128+
final var overrider = ControllerConfigurationOverrider.override(config);
122129
configurableReconciler.updateConfigurationFrom(overrider);
123-
configuration = overrider.build();
124-
configurations.put(key, configuration);
130+
config = overrider.build();
125131
}
132+
// mark the reconciler as configured so that we don't attempt to do so again next time the configuration is requested
133+
configurations.put(key, new Configured(true, config));
126134
}
127135

128-
return configuration;
136+
return config;
129137
}
130138

139+
private record Configured(boolean configured, ControllerConfiguration config) {}
140+
131141
protected void logMissingReconcilerWarning(String reconcilerKey, String reconcilersNameMessage) {
132142
log.warn("Cannot find reconciler named '{}'. {}", reconcilerKey, reconcilersNameMessage);
133143
}
@@ -142,14 +152,14 @@ protected <R extends HasMetadata> String keyFor(Reconciler<R> reconciler) {
142152
return ReconcilerUtils.getNameFor(reconciler);
143153
}
144154

145-
@SuppressWarnings("unused")
146155
protected ControllerConfiguration getFor(String reconcilerName) {
147-
return configurations.get(reconcilerName);
156+
final var configured = configurations.get(reconcilerName);
157+
return configured != null ? configured.config : null;
148158
}
149159

150160
@SuppressWarnings("unused")
151161
protected Stream<ControllerConfiguration> controllerConfigurations() {
152-
return configurations.values().stream();
162+
return configurations.values().stream().map(Configured::config);
153163
}
154164

155165
@Override

0 commit comments

Comments
 (0)