@@ -166,6 +166,7 @@ interface PriorityChildBalancer {
166
166
isFailoverTimerPending ( ) : boolean ;
167
167
getConnectivityState ( ) : ConnectivityState ;
168
168
getPicker ( ) : Picker ;
169
+ getErrorMessage ( ) : string | null ;
169
170
getName ( ) : string ;
170
171
destroy ( ) : void ;
171
172
}
@@ -183,14 +184,15 @@ export class PriorityLoadBalancer implements LoadBalancer {
183
184
private PriorityChildImpl = class implements PriorityChildBalancer {
184
185
private connectivityState : ConnectivityState = ConnectivityState . IDLE ;
185
186
private picker : Picker ;
187
+ private errorMessage : string | null = null ;
186
188
private childBalancer : ChildLoadBalancerHandler ;
187
189
private failoverTimer : NodeJS . Timeout | null = null ;
188
190
private deactivationTimer : NodeJS . Timeout | null = null ;
189
191
private seenReadyOrIdleSinceTransientFailure = false ;
190
192
constructor ( private parent : PriorityLoadBalancer , private name : string , ignoreReresolutionRequests : boolean ) {
191
193
this . childBalancer = new ChildLoadBalancerHandler ( experimental . createChildChannelControlHelper ( this . parent . channelControlHelper , {
192
- updateState : ( connectivityState : ConnectivityState , picker : Picker ) => {
193
- this . updateState ( connectivityState , picker ) ;
194
+ updateState : ( connectivityState : ConnectivityState , picker : Picker , errorMessage : string | null ) => {
195
+ this . updateState ( connectivityState , picker , errorMessage ) ;
194
196
} ,
195
197
requestReresolution : ( ) => {
196
198
if ( ! ignoreReresolutionRequests ) {
@@ -202,10 +204,11 @@ export class PriorityLoadBalancer implements LoadBalancer {
202
204
this . startFailoverTimer ( ) ;
203
205
}
204
206
205
- private updateState ( connectivityState : ConnectivityState , picker : Picker ) {
207
+ private updateState ( connectivityState : ConnectivityState , picker : Picker , errorMessage : string | null ) {
206
208
trace ( 'Child ' + this . name + ' ' + ConnectivityState [ this . connectivityState ] + ' -> ' + ConnectivityState [ connectivityState ] ) ;
207
209
this . connectivityState = connectivityState ;
208
210
this . picker = picker ;
211
+ this . errorMessage = errorMessage ;
209
212
if ( connectivityState === ConnectivityState . CONNECTING ) {
210
213
if ( this . seenReadyOrIdleSinceTransientFailure && this . failoverTimer === null ) {
211
214
this . startFailoverTimer ( ) ;
@@ -226,9 +229,11 @@ export class PriorityLoadBalancer implements LoadBalancer {
226
229
this . failoverTimer = setTimeout ( ( ) => {
227
230
trace ( 'Failover timer triggered for child ' + this . name ) ;
228
231
this . failoverTimer = null ;
232
+ const errorMessage = `No connection established. Last error: ${ this . errorMessage } ` ;
229
233
this . updateState (
230
234
ConnectivityState . TRANSIENT_FAILURE ,
231
- new UnavailablePicker ( )
235
+ new UnavailablePicker ( { code : Status . UNAVAILABLE , details : errorMessage } ) ,
236
+ errorMessage
232
237
) ;
233
238
} , DEFAULT_FAILOVER_TIME_MS ) ;
234
239
}
@@ -285,6 +290,10 @@ export class PriorityLoadBalancer implements LoadBalancer {
285
290
return this . picker ;
286
291
}
287
292
293
+ getErrorMessage ( ) {
294
+ return this . errorMessage ;
295
+ }
296
+
288
297
getName ( ) {
289
298
return this . name ;
290
299
}
@@ -325,7 +334,7 @@ export class PriorityLoadBalancer implements LoadBalancer {
325
334
326
335
constructor ( private channelControlHelper : ChannelControlHelper ) { }
327
336
328
- private updateState ( state : ConnectivityState , picker : Picker ) {
337
+ private updateState ( state : ConnectivityState , picker : Picker , errorMessage : string | null ) {
329
338
trace (
330
339
'Transitioning to ' +
331
340
ConnectivityState [ state ]
@@ -336,7 +345,7 @@ export class PriorityLoadBalancer implements LoadBalancer {
336
345
if ( state === ConnectivityState . IDLE ) {
337
346
picker = new QueuePicker ( this , picker ) ;
338
347
}
339
- this . channelControlHelper . updateState ( state , picker ) ;
348
+ this . channelControlHelper . updateState ( state , picker , errorMessage ) ;
340
349
}
341
350
342
351
private onChildStateChange ( child : PriorityChildBalancer ) {
@@ -363,7 +372,8 @@ export class PriorityLoadBalancer implements LoadBalancer {
363
372
const chosenChild = this . children . get ( this . priorities [ priority ] ) ! ;
364
373
this . updateState (
365
374
chosenChild . getConnectivityState ( ) ,
366
- chosenChild . getPicker ( )
375
+ chosenChild . getPicker ( ) ,
376
+ chosenChild . getErrorMessage ( )
367
377
) ;
368
378
if ( deactivateLowerPriorities ) {
369
379
for ( let i = priority + 1 ; i < this . priorities . length ; i ++ ) {
@@ -374,7 +384,8 @@ export class PriorityLoadBalancer implements LoadBalancer {
374
384
375
385
private choosePriority ( ) {
376
386
if ( this . priorities . length === 0 ) {
377
- this . updateState ( ConnectivityState . TRANSIENT_FAILURE , new UnavailablePicker ( { code : Status . UNAVAILABLE , details : 'priority policy has empty priority list' , metadata : new Metadata ( ) } ) ) ;
387
+ const errorMessage = 'priority policy has empty priority list' ;
388
+ this . updateState ( ConnectivityState . TRANSIENT_FAILURE , new UnavailablePicker ( { code : Status . UNAVAILABLE , details : errorMessage } ) , errorMessage ) ;
378
389
return ;
379
390
}
380
391
0 commit comments