Skip to content

Commit 8961523

Browse files
committed
feat(flagd-inprocess): Use program flow instead of exceptions for flag not found errors
Exceptions are expensive GOTO statements, and in a performance relevant system not the best to be used for control flow . A FlagNotFound-Error can be expected, but the performance draw backs of exception in this case not. Signed-off-by: Simon Schrottner <[email protected]>
1 parent 5465337 commit 8961523

File tree

3 files changed

+15
-10
lines changed

3 files changed

+15
-10
lines changed

providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/resolver/process/InProcessResolver.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import dev.openfeature.contrib.providers.flagd.resolver.process.storage.connector.grpc.GrpcStreamConnector;
1313
import dev.openfeature.contrib.providers.flagd.resolver.process.targeting.Operator;
1414
import dev.openfeature.contrib.providers.flagd.resolver.process.targeting.TargetingRuleException;
15+
import dev.openfeature.sdk.ErrorCode;
1516
import dev.openfeature.sdk.EvaluationContext;
1617
import dev.openfeature.sdk.ImmutableMetadata;
1718
import dev.openfeature.sdk.ProviderEvaluation;
@@ -166,12 +167,18 @@ private <T> ProviderEvaluation<T> resolve(Class<T> type, String key,
166167

167168
// missing flag
168169
if (flag == null) {
169-
throw new FlagNotFoundError("flag: " + key + " not found");
170+
return ProviderEvaluation.<T>builder()
171+
.errorMessage("flag: " + key + " not found")
172+
.errorCode(ErrorCode.FLAG_NOT_FOUND)
173+
.build();
170174
}
171175

172176
// state check
173177
if ("DISABLED".equals(flag.getState())) {
174-
throw new FlagNotFoundError("flag: " + key + " is disabled");
178+
return ProviderEvaluation.<T>builder()
179+
.errorMessage("flag: " + key + " is disabled")
180+
.errorCode(ErrorCode.FLAG_NOT_FOUND)
181+
.build();
175182
}
176183

177184
final String resolvedVariant;

providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/resolver/process/InProcessResolverTest.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import dev.openfeature.contrib.providers.flagd.resolver.process.storage.StorageState;
88
import dev.openfeature.contrib.providers.flagd.resolver.process.storage.connector.file.FileConnector;
99
import dev.openfeature.contrib.providers.flagd.resolver.process.storage.connector.grpc.GrpcStreamConnector;
10+
import dev.openfeature.sdk.ErrorCode;
1011
import dev.openfeature.sdk.ImmutableContext;
1112
import dev.openfeature.sdk.ImmutableMetadata;
1213
import dev.openfeature.sdk.MutableContext;
@@ -231,10 +232,8 @@ public void missingFlag() throws Exception {
231232
});
232233

233234
// when/then
234-
assertThrows(FlagNotFoundError.class, () -> {
235-
inProcessResolver.booleanEvaluation("missingFlag", false, new ImmutableContext());
236-
237-
});
235+
ProviderEvaluation<Boolean> missingFlag = inProcessResolver.booleanEvaluation("missingFlag", false, new ImmutableContext());
236+
assertEquals(ErrorCode.FLAG_NOT_FOUND, missingFlag.getErrorCode());
238237
}
239238

240239
@Test
@@ -247,9 +246,8 @@ public void disabledFlag() throws Exception {
247246
});
248247

249248
// when/then
250-
assertThrows(FlagNotFoundError.class, () -> {
251-
inProcessResolver.booleanEvaluation("disabledFlag", false, new ImmutableContext());
252-
});
249+
ProviderEvaluation<Boolean> disabledFlag = inProcessResolver.booleanEvaluation("disabledFlag", false, new ImmutableContext());
250+
assertEquals(ErrorCode.FLAG_NOT_FOUND, disabledFlag.getErrorCode());
253251
}
254252

255253
@Test

tools/junit-openfeature/src/main/java/dev/openfeature/contrib/tools/junitopenfeature/OpenFeature.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
/**
2525
* Collection of {@link Flag} configurations for this domain.
2626
*/
27-
Flag[] value();
27+
Flags value();
2828
}
2929

3030

0 commit comments

Comments
 (0)