Skip to content

Commit aefa941

Browse files
authored
fix: enriched context lost on some events (#1226)
Signed-off-by: Todd Baert <[email protected]>
1 parent 020c9a1 commit aefa941

File tree

5 files changed

+13
-24
lines changed

5 files changed

+13
-24
lines changed

providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/FlagdProvider.java

+7-19
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import dev.openfeature.sdk.EventProvider;
1111
import dev.openfeature.sdk.Hook;
1212
import dev.openfeature.sdk.ImmutableContext;
13-
import dev.openfeature.sdk.ImmutableStructure;
1413
import dev.openfeature.sdk.Metadata;
1514
import dev.openfeature.sdk.ProviderEvaluation;
1615
import dev.openfeature.sdk.ProviderEvent;
@@ -184,19 +183,6 @@ public ProviderEvaluation<Value> getObjectEvaluation(String key, Value defaultVa
184183
return flagResolver.objectEvaluation(key, defaultValue, ctx);
185184
}
186185

187-
/**
188-
* An unmodifiable view of a Structure representing the latest result of the
189-
* SyncMetadata.
190-
* Set on initial connection and updated with every reconnection.
191-
* see:
192-
* https://buf.build/open-feature/flagd/docs/main:flagd.sync.v1#flagd.sync.v1.FlagSyncService.GetMetadata
193-
*
194-
* @return Object map representing sync metadata
195-
*/
196-
protected Structure getSyncMetadata() {
197-
return new ImmutableStructure(eventsLock.syncMetadata.asMap());
198-
}
199-
200186
/**
201187
* The updated context mixed into all evaluations based on the sync-metadata.
202188
*
@@ -211,10 +197,6 @@ private void onProviderEvent(FlagdProviderEvent flagdProviderEvent) {
211197

212198
synchronized (eventsLock) {
213199
log.info("FlagdProviderEvent: {}", flagdProviderEvent.getEvent());
214-
eventsLock.syncMetadata = flagdProviderEvent.getSyncMetadata();
215-
if (flagdProviderEvent.getSyncMetadata() != null) {
216-
eventsLock.enrichedContext = contextEnricher.apply(flagdProviderEvent.getSyncMetadata());
217-
}
218200

219201
/*
220202
* We only use Error and Ready as previous states.
@@ -233,6 +215,13 @@ private void onProviderEvent(FlagdProviderEvent flagdProviderEvent) {
233215
}
234216
// intentional fall through, a not-ready change will trigger a ready.
235217
case PROVIDER_READY:
218+
/*
219+
* Sync metadata is used to enrich the context, and is immutable in flagd,
220+
* so we only need it to be fetched once at READY.
221+
*/
222+
if (flagdProviderEvent.getSyncMetadata() != null) {
223+
eventsLock.enrichedContext = contextEnricher.apply(flagdProviderEvent.getSyncMetadata());
224+
}
236225
onReady();
237226
eventsLock.previousEvent = ProviderEvent.PROVIDER_READY;
238227
break;
@@ -304,7 +293,6 @@ private void onError() {
304293
*/
305294
static class EventsLock {
306295
volatile ProviderEvent previousEvent = null;
307-
volatile Structure syncMetadata = new ImmutableStructure();
308296
volatile boolean initialized = false;
309297
volatile EvaluationContext enrichedContext = new ImmutableContext();
310298
}

providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/FlagdProviderTest.java

-1
Original file line numberDiff line numberDiff line change
@@ -669,7 +669,6 @@ void updatesSyncMetadataWithCallback() throws Exception {
669669
provider.initialize(ctx);
670670

671671
// the onConnectionEvent should have updated the sync metadata and the
672-
assertEquals(val, provider.getSyncMetadata().getValue(key).asString());
673672
assertEquals(val, provider.getEnrichedContext().getValue(key).asString());
674673

675674
// call the hook manually and make sure the enriched context is returned

providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/e2e/RunFileTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
@ConfigurationParameter(key = GLUE_PROPERTY_NAME, value = "dev.openfeature.contrib.providers.flagd.e2e.steps")
2929
@ConfigurationParameter(key = OBJECT_FACTORY_PROPERTY_NAME, value = "io.cucumber.picocontainer.PicoFactory")
3030
@IncludeTags("file")
31-
@ExcludeTags({"unixsocket", "targetURI", "reconnect", "customCert", "events", "flagdcontext"})
31+
@ExcludeTags({"unixsocket", "targetURI", "reconnect", "customCert", "events", "contextEnrichment"})
3232
@Testcontainers
3333
public class RunFileTest {
3434

providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/e2e/steps/EventSteps.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
@Slf4j
1818
public class EventSteps extends AbstractSteps {
1919

20+
private static final int EVENT_TIMEOUT_MS = 12_000;
21+
2022
public EventSteps(State state) {
2123
super(state);
2224
state.events = new LinkedList<>();
@@ -47,12 +49,12 @@ public void a_stale_event_handler(String eventType) {
4749

4850
@When("a {} event was fired")
4951
public void eventWasFired(String eventType) throws InterruptedException {
50-
eventHandlerShouldBeExecutedWithin(eventType, 8000);
52+
eventHandlerShouldBeExecutedWithin(eventType, EVENT_TIMEOUT_MS);
5153
}
5254

5355
@Then("the {} event handler should have been executed")
5456
public void eventHandlerShouldBeExecuted(String eventType) {
55-
eventHandlerShouldBeExecutedWithin(eventType, 10000);
57+
eventHandlerShouldBeExecutedWithin(eventType, EVENT_TIMEOUT_MS);
5658
}
5759

5860
@Then("the {} event handler should have been executed within {int}ms")

providers/flagd/test-harness

0 commit comments

Comments
 (0)