Skip to content

Commit 30e5f82

Browse files
committed
fixup: fixing synchronization in a strange way
Signed-off-by: Simon Schrottner <[email protected]>
1 parent 338f367 commit 30e5f82

File tree

5 files changed

+35
-30
lines changed

5 files changed

+35
-30
lines changed

Diff for: .gitmodules

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
[submodule "providers/flagd/test-harness"]
55
path = providers/flagd/test-harness
66
url = https://github.com/open-feature/test-harness.git
7-
branch = v1.1.0
7+
branch = v1.1.1
88
[submodule "providers/flagd/spec"]
99
path = providers/flagd/spec
1010
url = https://github.com/open-feature/spec.git

Diff for: providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/FlagdProvider.java

+31-27
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public class FlagdProvider extends EventProvider {
4141
private volatile EvaluationContext enrichedContext = new ImmutableContext();
4242
private final List<Hook> hooks = new ArrayList<>();
4343
private volatile ProviderEvent previousEvent = null;
44+
private final Object eventLock;
4445

4546
/**
4647
* An executor service responsible for emitting {@link ProviderEvent#PROVIDER_ERROR} after the provider went
@@ -97,6 +98,7 @@ public FlagdProvider(final FlagdOptions options) {
9798
this.errorExecutor = Executors.newSingleThreadScheduledExecutor();
9899
this.gracePeriod = options.getRetryGracePeriod();
99100
this.deadline = options.getDeadline();
101+
this.eventLock = new Object();
100102
}
101103

102104
@Override
@@ -188,39 +190,41 @@ EvaluationContext getEnrichedContext() {
188190
}
189191

190192
@SuppressWarnings("checkstyle:fallthrough")
191-
private synchronized void onProviderEvent(FlagdProviderEvent flagdProviderEvent) {
192-
193+
private void onProviderEvent(FlagdProviderEvent flagdProviderEvent) {
194+
log.info("FlagdProviderEvent: {}", flagdProviderEvent);
193195
syncMetadata = flagdProviderEvent.getSyncMetadata();
194196
if (flagdProviderEvent.getSyncMetadata() != null) {
195197
enrichedContext = contextEnricher.apply(flagdProviderEvent.getSyncMetadata());
196198
}
197199

198-
/*
199-
We only use Error and Ready as previous states.
200-
As error will first be emitted as Stale, and only turns after a while into an emitted Error.
201-
Ready is needed, as the InProcessResolver does not have a dedicated ready event, hence we need to
202-
forward a configuration changed to the ready, if we are not in the ready state.
203-
*/
204-
switch (flagdProviderEvent.getEvent()) {
205-
case PROVIDER_CONFIGURATION_CHANGED:
206-
if (previousEvent == ProviderEvent.PROVIDER_READY) {
207-
onConfigurationChanged(flagdProviderEvent);
200+
synchronized (eventLock) {
201+
/*
202+
We only use Error and Ready as previous states.
203+
As error will first be emitted as Stale, and only turns after a while into an emitted Error.
204+
Ready is needed, as the InProcessResolver does not have a dedicated ready event, hence we need to
205+
forward a configuration changed to the ready, if we are not in the ready state.
206+
*/
207+
switch (flagdProviderEvent.getEvent()) {
208+
case PROVIDER_CONFIGURATION_CHANGED:
209+
if (previousEvent == ProviderEvent.PROVIDER_READY) {
210+
onConfigurationChanged(flagdProviderEvent);
211+
break;
212+
}
213+
// intentional fall through, a not-ready change will trigger a ready.
214+
case PROVIDER_READY:
215+
onReady();
216+
previousEvent = ProviderEvent.PROVIDER_READY;
208217
break;
209-
}
210-
// intentional fall through, a not-ready change will trigger a ready.
211-
case PROVIDER_READY:
212-
onReady();
213-
previousEvent = ProviderEvent.PROVIDER_READY;
214-
break;
215218

216-
case PROVIDER_ERROR:
217-
if (previousEvent != ProviderEvent.PROVIDER_ERROR) {
218-
onError();
219-
}
220-
previousEvent = ProviderEvent.PROVIDER_ERROR;
221-
break;
222-
default:
223-
log.info("Unknown event {}", flagdProviderEvent.getEvent());
219+
case PROVIDER_ERROR:
220+
if (previousEvent != ProviderEvent.PROVIDER_ERROR) {
221+
onError();
222+
}
223+
previousEvent = ProviderEvent.PROVIDER_ERROR;
224+
break;
225+
default:
226+
log.info("Unknown event {}", flagdProviderEvent.getEvent());
227+
}
224228
}
225229
}
226230

@@ -258,7 +262,7 @@ private void onError() {
258262
if (!errorExecutor.isShutdown()) {
259263
errorTask = errorExecutor.schedule(
260264
() -> {
261-
if(previousEvent == ProviderEvent.PROVIDER_ERROR) {
265+
if (previousEvent == ProviderEvent.PROVIDER_ERROR) {
262266
log.debug(
263267
"Provider did not reconnect successfully within {}s. Emit ERROR event...",
264268
gracePeriod);

Diff for: providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/e2e/FlagdContainer.java

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.jetbrains.annotations.NotNull;
88
import org.testcontainers.containers.GenericContainer;
99
import org.testcontainers.containers.Network;
10+
import org.testcontainers.containers.wait.strategy.Wait;
1011
import org.testcontainers.utility.DockerImageName;
1112
import org.testcontainers.utility.MountableFile;
1213

Diff for: providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/e2e/RunInProcessTest.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("in-process")
31-
@ExcludeTags({"unixsocket", "customCert", "targetURI"})
31+
@ExcludeTags({"unixsocket", "targetURI"})
3232
@Testcontainers
3333
public class RunInProcessTest {
3434

Diff for: providers/flagd/test-harness

0 commit comments

Comments
 (0)