Further reduce pick_first state space

This commit is contained in:
Michael Lumish 2024-08-02 15:44:07 -07:00
parent a6575c3e73
commit 3d43b1a7be
1 changed files with 6 additions and 25 deletions

View File

@ -213,8 +213,6 @@ export class PickFirstLoadBalancer implements LoadBalancer {
*/ */
private connectionDelayTimeout: NodeJS.Timeout; private connectionDelayTimeout: NodeJS.Timeout;
private triedAllSubchannels = false;
/** /**
* The LB policy enters sticky TRANSIENT_FAILURE mode when all * The LB policy enters sticky TRANSIENT_FAILURE mode when all
* subchannels have failed to connect at least once, and it stays in that * subchannels have failed to connect at least once, and it stays in that
@ -225,12 +223,6 @@ export class PickFirstLoadBalancer implements LoadBalancer {
private reportHealthStatus: boolean; private reportHealthStatus: boolean;
/**
* Indicates whether we called channelControlHelper.requestReresolution since
* the last call to updateAddressList
*/
private requestedResolutionSinceLastUpdate = false;
/** /**
* The most recent error reported by any subchannel as it transitioned to * The most recent error reported by any subchannel as it transitioned to
* TRANSIENT_FAILURE. * TRANSIENT_FAILURE.
@ -259,6 +251,10 @@ export class PickFirstLoadBalancer implements LoadBalancer {
return this.children.every(child => child.hasReportedTransientFailure); return this.children.every(child => child.hasReportedTransientFailure);
} }
private resetChildrenReportedTF() {
this.children.every(child => child.hasReportedTransientFailure = false);
}
private calculateAndReportNewState() { private calculateAndReportNewState() {
if (this.currentPick) { if (this.currentPick) {
if (this.reportHealthStatus && !this.currentPick.isHealthy()) { if (this.reportHealthStatus && !this.currentPick.isHealthy()) {
@ -291,7 +287,6 @@ export class PickFirstLoadBalancer implements LoadBalancer {
} }
private requestReresolution() { private requestReresolution() {
this.requestedResolutionSinceLastUpdate = true;
this.channelControlHelper.requestReresolution(); this.channelControlHelper.requestReresolution();
} }
@ -299,15 +294,8 @@ export class PickFirstLoadBalancer implements LoadBalancer {
if (!this.allChildrenHaveReportedTF()) { if (!this.allChildrenHaveReportedTF()) {
return; return;
} }
if (!this.requestedResolutionSinceLastUpdate) {
/* Each time we get an update we reset each subchannel's
* hasReportedTransientFailure flag, so the next time we get to this
* point after that, each subchannel has reported TRANSIENT_FAILURE
* at least once since then. That is the trigger for requesting
* reresolution, whether or not the LB policy is already in sticky TF
* mode. */
this.requestReresolution(); this.requestReresolution();
} this.resetChildrenReportedTF();
if (this.stickyTransientFailureMode) { if (this.stickyTransientFailureMode) {
return; return;
} }
@ -369,9 +357,6 @@ export class PickFirstLoadBalancer implements LoadBalancer {
private startNextSubchannelConnecting(startIndex: number) { private startNextSubchannelConnecting(startIndex: number) {
clearTimeout(this.connectionDelayTimeout); clearTimeout(this.connectionDelayTimeout);
if (this.triedAllSubchannels) {
return;
}
for (const [index, child] of this.children.entries()) { for (const [index, child] of this.children.entries()) {
if (index >= startIndex) { if (index >= startIndex) {
const subchannelState = child.subchannel.getConnectivityState(); const subchannelState = child.subchannel.getConnectivityState();
@ -384,7 +369,6 @@ export class PickFirstLoadBalancer implements LoadBalancer {
} }
} }
} }
this.triedAllSubchannels = true;
this.maybeEnterStickyTransientFailureMode(); this.maybeEnterStickyTransientFailureMode();
} }
@ -464,8 +448,6 @@ export class PickFirstLoadBalancer implements LoadBalancer {
} }
this.currentSubchannelIndex = 0; this.currentSubchannelIndex = 0;
this.children = []; this.children = [];
this.triedAllSubchannels = false;
this.requestedResolutionSinceLastUpdate = false;
} }
private connectToAddressList(addressList: SubchannelAddress[]) { private connectToAddressList(addressList: SubchannelAddress[]) {
@ -511,7 +493,6 @@ export class PickFirstLoadBalancer implements LoadBalancer {
if (!(lbConfig instanceof PickFirstLoadBalancingConfig)) { if (!(lbConfig instanceof PickFirstLoadBalancingConfig)) {
return; return;
} }
this.requestedResolutionSinceLastUpdate = false;
/* Previously, an update would be discarded if it was identical to the /* Previously, an update would be discarded if it was identical to the
* previous update, to minimize churn. Now the DNS resolver is * previous update, to minimize churn. Now the DNS resolver is
* rate-limited, so that is less of a concern. */ * rate-limited, so that is less of a concern. */