18
18
import { ChannelOptions } from './channel-options' ;
19
19
import { ConnectivityState } from './connectivity-state' ;
20
20
import { LogVerbosity , Status } from './constants' ;
21
- import { durationToMs , isDuration , msToDuration } from './duration' ;
21
+ import { Duration , durationToMs , isDuration , msToDuration } from './duration' ;
22
22
import {
23
23
ChannelControlHelper ,
24
24
createChildChannelControlHelper ,
25
25
registerLoadBalancerType ,
26
26
} from './experimental' ;
27
27
import {
28
- getFirstUsableConfig ,
28
+ selectLbConfigFromList ,
29
29
LoadBalancer ,
30
- LoadBalancingConfig ,
31
- validateLoadBalancingConfig ,
30
+ TypedLoadBalancingConfig ,
32
31
} from './load-balancer' ;
33
32
import { ChildLoadBalancerHandler } from './load-balancer-child-handler' ;
34
33
import { PickArgs , Picker , PickResult , PickResultType } from './picker' ;
@@ -42,6 +41,7 @@ import {
42
41
SubchannelInterface ,
43
42
} from './subchannel-interface' ;
44
43
import * as logging from './logging' ;
44
+ import { LoadBalancingConfig } from './service-config' ;
45
45
46
46
const TRACER_NAME = 'outlier_detection' ;
47
47
@@ -68,6 +68,16 @@ export interface FailurePercentageEjectionConfig {
68
68
readonly request_volume : number ;
69
69
}
70
70
71
+ export interface OutlierDetectionRawConfig {
72
+ interval ?: Duration ;
73
+ base_ejection_time ?: Duration ;
74
+ max_ejection_time ?: Duration ;
75
+ max_ejection_percent ?: number ;
76
+ success_rate_ejection ?: Partial < SuccessRateEjectionConfig > ;
77
+ failure_percentage_ejection ?: Partial < FailurePercentageEjectionConfig > ;
78
+ child_policy : LoadBalancingConfig [ ] ;
79
+ }
80
+
71
81
const defaultSuccessRateEjectionConfig : SuccessRateEjectionConfig = {
72
82
stdev_factor : 1900 ,
73
83
enforcement_percentage : 100 ,
@@ -147,7 +157,7 @@ function validatePercentage(obj: any, fieldName: string, objectName?: string) {
147
157
}
148
158
149
159
export class OutlierDetectionLoadBalancingConfig
150
- implements LoadBalancingConfig
160
+ implements TypedLoadBalancingConfig
151
161
{
152
162
private readonly intervalMs : number ;
153
163
private readonly baseEjectionTimeMs : number ;
@@ -163,11 +173,10 @@ export class OutlierDetectionLoadBalancingConfig
163
173
maxEjectionPercent : number | null ,
164
174
successRateEjection : Partial < SuccessRateEjectionConfig > | null ,
165
175
failurePercentageEjection : Partial < FailurePercentageEjectionConfig > | null ,
166
- private readonly childPolicy : LoadBalancingConfig [ ]
176
+ private readonly childPolicy : TypedLoadBalancingConfig
167
177
) {
168
178
if (
169
- childPolicy . length > 0 &&
170
- childPolicy [ 0 ] . getLoadBalancerName ( ) === 'pick_first'
179
+ childPolicy . getLoadBalancerName ( ) === 'pick_first'
171
180
) {
172
181
throw new Error (
173
182
'outlier_detection LB policy cannot have a pick_first child policy'
@@ -198,7 +207,7 @@ export class OutlierDetectionLoadBalancingConfig
198
207
max_ejection_percent : this . maxEjectionPercent ,
199
208
success_rate_ejection : this . successRateEjection ,
200
209
failure_percentage_ejection : this . failurePercentageEjection ,
201
- child_policy : this . childPolicy . map ( policy => policy . toJsonObject ( ) ) ,
210
+ child_policy : [ this . childPolicy . toJsonObject ( ) ]
202
211
} ;
203
212
}
204
213
@@ -220,24 +229,10 @@ export class OutlierDetectionLoadBalancingConfig
220
229
getFailurePercentageEjectionConfig ( ) : FailurePercentageEjectionConfig | null {
221
230
return this . failurePercentageEjection ;
222
231
}
223
- getChildPolicy ( ) : LoadBalancingConfig [ ] {
232
+ getChildPolicy ( ) : TypedLoadBalancingConfig {
224
233
return this . childPolicy ;
225
234
}
226
235
227
- copyWithChildPolicy (
228
- childPolicy : LoadBalancingConfig [ ]
229
- ) : OutlierDetectionLoadBalancingConfig {
230
- return new OutlierDetectionLoadBalancingConfig (
231
- this . intervalMs ,
232
- this . baseEjectionTimeMs ,
233
- this . maxEjectionTimeMs ,
234
- this . maxEjectionPercent ,
235
- this . successRateEjection ,
236
- this . failurePercentageEjection ,
237
- childPolicy
238
- ) ;
239
- }
240
-
241
236
static createFromJson ( obj : any ) : OutlierDetectionLoadBalancingConfig {
242
237
validatePositiveDuration ( obj , 'interval' ) ;
243
238
validatePositiveDuration ( obj , 'base_ejection_time' ) ;
@@ -303,14 +298,22 @@ export class OutlierDetectionLoadBalancingConfig
303
298
) ;
304
299
}
305
300
301
+ if ( ! ( 'child_policy' in obj ) || ! Array . isArray ( obj . child_policy ) ) {
302
+ throw new Error ( 'outlier detection config child_policy must be an array' ) ;
303
+ }
304
+ const childPolicy = selectLbConfigFromList ( obj . child_policy ) ;
305
+ if ( ! childPolicy ) {
306
+ throw new Error ( 'outlier detection config child_policy: no valid recognized policy found' ) ;
307
+ }
308
+
306
309
return new OutlierDetectionLoadBalancingConfig (
307
310
obj . interval ? durationToMs ( obj . interval ) : null ,
308
311
obj . base_ejection_time ? durationToMs ( obj . base_ejection_time ) : null ,
309
312
obj . max_ejection_time ? durationToMs ( obj . max_ejection_time ) : null ,
310
313
obj . max_ejection_percent ?? null ,
311
314
obj . success_rate_ejection ,
312
315
obj . failure_percentage_ejection ,
313
- obj . child_policy . map ( validateLoadBalancingConfig )
316
+ childPolicy
314
317
) ;
315
318
}
316
319
}
@@ -794,7 +797,7 @@ export class OutlierDetectionLoadBalancer implements LoadBalancer {
794
797
795
798
updateAddressList (
796
799
addressList : SubchannelAddress [ ] ,
797
- lbConfig : LoadBalancingConfig ,
800
+ lbConfig : TypedLoadBalancingConfig ,
798
801
attributes : { [ key : string ] : unknown }
799
802
) : void {
800
803
if ( ! ( lbConfig instanceof OutlierDetectionLoadBalancingConfig ) ) {
@@ -821,10 +824,7 @@ export class OutlierDetectionLoadBalancer implements LoadBalancer {
821
824
this . addressMap . delete ( key ) ;
822
825
}
823
826
}
824
- const childPolicy : LoadBalancingConfig = getFirstUsableConfig (
825
- lbConfig . getChildPolicy ( ) ,
826
- true
827
- ) ;
827
+ const childPolicy = lbConfig . getChildPolicy ( ) ;
828
828
this . childBalancer . updateAddressList ( addressList , childPolicy , attributes ) ;
829
829
830
830
if (
0 commit comments