@@ -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 );
0 commit comments