Skip to content

Commit fe7ed8b

Browse files
committed
Reduce locking and concurrency issues
Signed-off-by: christian.lutnik <[email protected]>
1 parent a9d8daa commit fe7ed8b

File tree

1 file changed

+13
-9
lines changed

1 file changed

+13
-9
lines changed

src/main/java/dev/openfeature/sdk/OpenFeatureClient.java

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import dev.openfeature.sdk.internal.AutoCloseableLock;
99
import dev.openfeature.sdk.internal.AutoCloseableReentrantReadWriteLock;
1010
import dev.openfeature.sdk.internal.ObjectUtils;
11+
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
1112
import java.util.ArrayList;
1213
import java.util.Arrays;
1314
import java.util.Collections;
@@ -162,29 +163,32 @@ public EvaluationContext getEvaluationContext() {
162163
return this.evaluationContext.get();
163164
}
164165

166+
@SuppressFBWarnings(
167+
value = {"REC_CATCH_EXCEPTION"},
168+
justification =
169+
"We don't want to allow any exception to reach the user. Instead, we return an evaluation result with the appropriate error code.")
165170
private <T> FlagEvaluationDetails<T> evaluateFlag(
166171
FlagValueType type, String key, T defaultValue, EvaluationContext ctx, FlagEvaluationOptions options) {
167-
FlagEvaluationOptions flagOptions = ObjectUtils.defaultIfNull(
172+
var flagOptions = ObjectUtils.defaultIfNull(
168173
options, () -> FlagEvaluationOptions.builder().build());
169-
Map<String, Object> hints = Collections.unmodifiableMap(flagOptions.getHookHints());
174+
var hints = Collections.unmodifiableMap(flagOptions.getHookHints());
170175

171176
FlagEvaluationDetails<T> details = null;
172177
List<Hook> mergedHooks = null;
173178
HookContext<T> afterHookContext = null;
174-
FeatureProvider provider;
175179

176180
try {
177-
FeatureProviderStateManager stateManager = openfeatureApi.getFeatureProviderStateManager(this.domain);
181+
var stateManager = openfeatureApi.getFeatureProviderStateManager(this.domain);
178182
// provider must be accessed once to maintain a consistent reference
179-
provider = stateManager.getProvider();
180-
ProviderState state = stateManager.getState();
183+
var provider = stateManager.getProvider();
184+
var state = stateManager.getState();
181185

182186
try (AutoCloseableLock ignored = this.hooksLock.readLockAutoCloseable()) {
183187
mergedHooks = ObjectUtils.merge(
184188
provider.getProviderHooks(), flagOptions.getHooks(), clientHooks, openfeatureApi.getHooks());
185189
}
186190

187-
EvaluationContext mergedCtx = hookSupport.beforeHooks(
191+
var mergedCtx = hookSupport.beforeHooks(
188192
type,
189193
HookContext.from(
190194
key,
@@ -207,12 +211,12 @@ private <T> FlagEvaluationDetails<T> evaluateFlag(
207211
throw new FatalError("Provider is in an irrecoverable error state");
208212
}
209213

210-
ProviderEvaluation<T> providerEval =
214+
var providerEval =
211215
(ProviderEvaluation<T>) createProviderEvaluation(type, key, defaultValue, provider, mergedCtx);
212216

213217
details = FlagEvaluationDetails.from(providerEval, key);
214218
if (details.getErrorCode() != null) {
215-
OpenFeatureError error =
219+
var error =
216220
ExceptionUtils.instantiateErrorByErrorCode(details.getErrorCode(), details.getErrorMessage());
217221
enrichDetailsWithErrorDefaults(defaultValue, details);
218222
hookSupport.errorHooks(type, afterHookContext, error, mergedHooks, hints);

0 commit comments

Comments
 (0)