@@ -41,6 +41,7 @@ public class FlagdProvider extends EventProvider {
41
41
private volatile EvaluationContext enrichedContext = new ImmutableContext ();
42
42
private final List <Hook > hooks = new ArrayList <>();
43
43
private volatile ProviderEvent previousEvent = null ;
44
+ private final Object eventLock ;
44
45
45
46
/**
46
47
* An executor service responsible for emitting {@link ProviderEvent#PROVIDER_ERROR} after the provider went
@@ -97,6 +98,7 @@ public FlagdProvider(final FlagdOptions options) {
97
98
this .errorExecutor = Executors .newSingleThreadScheduledExecutor ();
98
99
this .gracePeriod = options .getRetryGracePeriod ();
99
100
this .deadline = options .getDeadline ();
101
+ this .eventLock = new Object ();
100
102
}
101
103
102
104
@ Override
@@ -188,39 +190,41 @@ EvaluationContext getEnrichedContext() {
188
190
}
189
191
190
192
@ SuppressWarnings ("checkstyle:fallthrough" )
191
- private synchronized void onProviderEvent (FlagdProviderEvent flagdProviderEvent ) {
192
-
193
+ private void onProviderEvent (FlagdProviderEvent flagdProviderEvent ) {
194
+ log . info ( "FlagdProviderEvent: {}" , flagdProviderEvent );
193
195
syncMetadata = flagdProviderEvent .getSyncMetadata ();
194
196
if (flagdProviderEvent .getSyncMetadata () != null ) {
195
197
enrichedContext = contextEnricher .apply (flagdProviderEvent .getSyncMetadata ());
196
198
}
197
199
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 ;
208
217
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 ;
215
218
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
+ }
224
228
}
225
229
}
226
230
@@ -258,7 +262,7 @@ private void onError() {
258
262
if (!errorExecutor .isShutdown ()) {
259
263
errorTask = errorExecutor .schedule (
260
264
() -> {
261
- if (previousEvent == ProviderEvent .PROVIDER_ERROR ) {
265
+ if (previousEvent == ProviderEvent .PROVIDER_ERROR ) {
262
266
log .debug (
263
267
"Provider did not reconnect successfully within {}s. Emit ERROR event..." ,
264
268
gracePeriod );
0 commit comments