Skip to content

Commit d0f37a6

Browse files
committed
Blacklist synchronizers. Cleaner state management.
1 parent c37bf9f commit d0f37a6

File tree

3 files changed

+48
-19
lines changed

3 files changed

+48
-19
lines changed
Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1 @@
1-
streaming/retry behavior/do not retry after unrecoverable HTTP error on initial connect/error 401
2-
streaming/retry behavior/do not retry after unrecoverable HTTP error on initial connect/error 403
3-
streaming/retry behavior/do not retry after unrecoverable HTTP error on initial connect/error 405
4-
streaming/retry behavior/do not retry after unrecoverable HTTP error on reconnect/error 401
5-
streaming/retry behavior/do not retry after unrecoverable HTTP error on reconnect/error 403
6-
streaming/retry behavior/do not retry after unrecoverable HTTP error on reconnect/error 405
71
streaming/fdv2/disconnects on goodbye

pkgs/sdk/server/src/Internal/FDv2DataSources/FDv2DataSource.InitializationTracker.cs

Lines changed: 46 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ private class InitializationTracker : IDisposable
2828

2929
private bool _initializersRemain;
3030
private bool _synchronizersRemain;
31-
private bool _fallbackRemain;
3231

3332
private enum State
3433
{
@@ -46,6 +45,11 @@ private enum State
4645
/// The tracker has been informed that initializers are exhausted.
4746
/// </summary>
4847
InitializersExhausted,
48+
49+
/// <summary>
50+
/// State entered when we have been informed that we are falling back to FDv1.
51+
/// </summary>
52+
FallingBack,
4953

5054
/// <summary>
5155
/// The tracker is initialized and is no longer processing updates.
@@ -84,11 +88,16 @@ private enum Action
8488
/// We have received a selector.
8589
/// </summary>
8690
SelectorReceived,
91+
92+
/// <summary>
93+
/// We are attempting to fallback to FDv1.
94+
/// </summary>
95+
FallingBack,
8796
}
8897

89-
public InitializationTracker(bool hasInitializers, bool hasSynchronizers, bool hasFallback)
98+
public InitializationTracker(bool hasInitializers, bool hasSynchronizers)
9099
{
91-
if (!(hasInitializers || hasSynchronizers || hasFallback))
100+
if (!(hasInitializers || hasSynchronizers))
92101
{
93102
// If we have no data sources, then we are immediately initialized.
94103
_state = State.Initialized;
@@ -98,7 +107,6 @@ public InitializationTracker(bool hasInitializers, bool hasSynchronizers, bool h
98107

99108
_initializersRemain = hasInitializers;
100109
_synchronizersRemain = hasSynchronizers;
101-
_fallbackRemain = hasFallback;
102110

103111
if (!hasInitializers)
104112
{
@@ -108,11 +116,10 @@ public InitializationTracker(bool hasInitializers, bool hasSynchronizers, bool h
108116

109117
public Task<bool> Task => _taskCompletionSource.Task;
110118

111-
private bool RemainingSources => _initializersRemain || _synchronizersRemain || _fallbackRemain;
112-
113119
private void HandleRemainingSources()
114120
{
115-
if (!RemainingSources)
121+
// We only consider fallback if we have transitioned to fallback.
122+
if (!_initializersRemain && !_synchronizersRemain)
116123
{
117124
_state = State.Failed;
118125
}
@@ -145,8 +152,9 @@ private void DetermineState(Action action)
145152
HandleRemainingSources();
146153
break;
147154
case Action.FallbackExhausted:
148-
_fallbackRemain = false;
149-
HandleRemainingSources();
155+
// This would indicate that we skipped going through the fallback
156+
// process. So this generally shouldn't be an achievable state.
157+
_state = State.Failed;
150158
break;
151159
}
152160

@@ -160,6 +168,7 @@ private void DetermineState(Action action)
160168
case Action.FallbackExhausted:
161169
case Action.InitializersExhausted:
162170
case Action.SelectorReceived:
171+
case Action.FallingBack:
163172
_state = State.Initialized;
164173
break;
165174
}
@@ -175,8 +184,30 @@ private void DetermineState(Action action)
175184
HandleRemainingSources();
176185
break;
177186
case Action.FallbackExhausted:
178-
_fallbackRemain = false;
179-
HandleRemainingSources();
187+
// This would indicate that we skipped going through the fallback
188+
// process. So this generally shouldn't be an achievable state.
189+
_state = State.Failed;
190+
break;
191+
192+
case Action.FallingBack:
193+
_state = State.FallingBack;
194+
break;
195+
case Action.DataReceived:
196+
case Action.SelectorReceived:
197+
_state = State.Initialized;
198+
break;
199+
}
200+
201+
break;
202+
case State.FallingBack:
203+
switch (action)
204+
{
205+
case Action.FallingBack:
206+
case Action.InitializersExhausted:
207+
case Action.SynchronizersExhausted:
208+
break;
209+
case Action.FallbackExhausted:
210+
_state = State.Failed;
180211
break;
181212
case Action.DataReceived:
182213
case Action.SelectorReceived:
@@ -231,8 +262,11 @@ public void UpdateStatus(DataSourceState newState, DataSourceStatus.ErrorInfo? n
231262
DetermineState(Action.FallbackExhausted);
232263
break;
233264
}
234-
default:
265+
case DataSourceCategory.FallbackSynchronizers when newState == DataSourceState.Initializing:
266+
{
267+
DetermineState(Action.FallingBack);
235268
break;
269+
}
236270
}
237271
}
238272

pkgs/sdk/server/src/Internal/FDv2DataSources/FDv2DataSource.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public static IDataSource CreateFDv2DataSource(
3939
ActionApplierFactory fdv1FallbackApplierFactory = (actionable) => new FDv1FallbackActionApplier(actionable);
4040

4141
var initializationTracker =
42-
new InitializationTracker(Any(initializers), Any(synchronizers), Any(fdv1Synchronizers));
42+
new InitializationTracker(Any(initializers), Any(synchronizers));
4343
var initializationObserver =
4444
new InitializationObserver(initializationTracker, DataSourceCategory.Initializers);
4545
var synchronizationObserver =
@@ -194,6 +194,7 @@ public void UpdateStatus(DataSourceState newState, DataSourceStatus.ErrorInfo? n
194194
// When a synchronizer reports it is off, fall back immediately
195195
if (newState == DataSourceState.Off)
196196
{
197+
_actionable.BlacklistCurrent();
197198
_actionable.DisposeCurrent();
198199
_actionable.GoToNext();
199200
_actionable.StartCurrent();

0 commit comments

Comments
 (0)