From 265b39b6defe1627b68a09058e449702d685cf1b Mon Sep 17 00:00:00 2001 From: Michael Lumish Date: Mon, 4 May 2020 15:06:51 -0700 Subject: [PATCH] Fix state changes when handling resolution failures --- packages/grpc-js/src/resolving-load-balancer.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/grpc-js/src/resolving-load-balancer.ts b/packages/grpc-js/src/resolving-load-balancer.ts index 8766c36a..87ece2fd 100644 --- a/packages/grpc-js/src/resolving-load-balancer.ts +++ b/packages/grpc-js/src/resolving-load-balancer.ts @@ -51,6 +51,8 @@ export class ResolvingLoadBalancer implements LoadBalancer { private innerResolver: Resolver; private childLoadBalancer: ChildLoadBalancerHandler; + private latestChildState: ConnectivityState = ConnectivityState.IDLE; + private latestChildPicker: Picker = new QueuePicker(this); /** * This resolving load balancer's current connectivity state. */ @@ -106,6 +108,8 @@ export class ResolvingLoadBalancer implements LoadBalancer { } }, updateState: (newState: ConnectivityState, picker: Picker) => { + this.latestChildState = newState; + this.latestChildPicker = picker; this.updateState(newState, picker); } }); @@ -177,6 +181,8 @@ export class ResolvingLoadBalancer implements LoadBalancer { if (this.continueResolving) { this.updateResolution(); this.continueResolving = false; + } else { + this.updateState(this.latestChildState, this.latestChildPicker) } }); } @@ -205,7 +211,7 @@ export class ResolvingLoadBalancer implements LoadBalancer { } private handleResolutionFailure(error: StatusObject) { - if (this.currentState === ConnectivityState.IDLE) { + if (this.latestChildState === ConnectivityState.IDLE) { this.updateState( ConnectivityState.TRANSIENT_FAILURE, new UnavailablePicker(error)