Merge pull request #2412 from murgatroid99/grpc-js_round_robin_refactor

grpc-js: Simplify round robin implementation
This commit is contained in:
Michael Lumish 2023-04-12 13:53:12 -07:00 committed by GitHub
commit 8f329e08b2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 7 additions and 30 deletions

View File

@ -93,14 +93,6 @@ class RoundRobinPicker implements Picker {
} }
} }
interface ConnectivityStateCounts {
[ConnectivityState.CONNECTING]: number;
[ConnectivityState.IDLE]: number;
[ConnectivityState.READY]: number;
[ConnectivityState.SHUTDOWN]: number;
[ConnectivityState.TRANSIENT_FAILURE]: number;
}
export class RoundRobinLoadBalancer implements LoadBalancer { export class RoundRobinLoadBalancer implements LoadBalancer {
private subchannels: SubchannelInterface[] = []; private subchannels: SubchannelInterface[] = [];
@ -108,25 +100,14 @@ export class RoundRobinLoadBalancer implements LoadBalancer {
private subchannelStateListener: ConnectivityStateListener; private subchannelStateListener: ConnectivityStateListener;
private subchannelStateCounts: ConnectivityStateCounts;
private currentReadyPicker: RoundRobinPicker | null = null; private currentReadyPicker: RoundRobinPicker | null = null;
constructor(private readonly channelControlHelper: ChannelControlHelper) { constructor(private readonly channelControlHelper: ChannelControlHelper) {
this.subchannelStateCounts = {
[ConnectivityState.CONNECTING]: 0,
[ConnectivityState.IDLE]: 0,
[ConnectivityState.READY]: 0,
[ConnectivityState.SHUTDOWN]: 0,
[ConnectivityState.TRANSIENT_FAILURE]: 0,
};
this.subchannelStateListener = ( this.subchannelStateListener = (
subchannel: SubchannelInterface, subchannel: SubchannelInterface,
previousState: ConnectivityState, previousState: ConnectivityState,
newState: ConnectivityState newState: ConnectivityState
) => { ) => {
this.subchannelStateCounts[previousState] -= 1;
this.subchannelStateCounts[newState] += 1;
this.calculateAndUpdateState(); this.calculateAndUpdateState();
if ( if (
@ -139,8 +120,12 @@ export class RoundRobinLoadBalancer implements LoadBalancer {
}; };
} }
private countSubchannelsWithState(state: ConnectivityState) {
return this.subchannels.filter(subchannel => subchannel.getConnectivityState() === state).length;
}
private calculateAndUpdateState() { private calculateAndUpdateState() {
if (this.subchannelStateCounts[ConnectivityState.READY] > 0) { if (this.countSubchannelsWithState(ConnectivityState.READY) > 0) {
const readySubchannels = this.subchannels.filter( const readySubchannels = this.subchannels.filter(
(subchannel) => (subchannel) =>
subchannel.getConnectivityState() === ConnectivityState.READY subchannel.getConnectivityState() === ConnectivityState.READY
@ -158,10 +143,10 @@ export class RoundRobinLoadBalancer implements LoadBalancer {
ConnectivityState.READY, ConnectivityState.READY,
new RoundRobinPicker(readySubchannels, index) new RoundRobinPicker(readySubchannels, index)
); );
} else if (this.subchannelStateCounts[ConnectivityState.CONNECTING] > 0) { } else if (this.countSubchannelsWithState(ConnectivityState.CONNECTING) > 0) {
this.updateState(ConnectivityState.CONNECTING, new QueuePicker(this)); this.updateState(ConnectivityState.CONNECTING, new QueuePicker(this));
} else if ( } else if (
this.subchannelStateCounts[ConnectivityState.TRANSIENT_FAILURE] > 0 this.countSubchannelsWithState(ConnectivityState.TRANSIENT_FAILURE) > 0
) { ) {
this.updateState( this.updateState(
ConnectivityState.TRANSIENT_FAILURE, ConnectivityState.TRANSIENT_FAILURE,
@ -193,13 +178,6 @@ export class RoundRobinLoadBalancer implements LoadBalancer {
subchannel.unref(); subchannel.unref();
this.channelControlHelper.removeChannelzChild(subchannel.getChannelzRef()); this.channelControlHelper.removeChannelzChild(subchannel.getChannelzRef());
} }
this.subchannelStateCounts = {
[ConnectivityState.CONNECTING]: 0,
[ConnectivityState.IDLE]: 0,
[ConnectivityState.READY]: 0,
[ConnectivityState.SHUTDOWN]: 0,
[ConnectivityState.TRANSIENT_FAILURE]: 0,
};
this.subchannels = []; this.subchannels = [];
} }
@ -220,7 +198,6 @@ export class RoundRobinLoadBalancer implements LoadBalancer {
subchannel.addConnectivityStateListener(this.subchannelStateListener); subchannel.addConnectivityStateListener(this.subchannelStateListener);
this.channelControlHelper.addChannelzChild(subchannel.getChannelzRef()); this.channelControlHelper.addChannelzChild(subchannel.getChannelzRef());
const subchannelState = subchannel.getConnectivityState(); const subchannelState = subchannel.getConnectivityState();
this.subchannelStateCounts[subchannelState] += 1;
if ( if (
subchannelState === ConnectivityState.IDLE || subchannelState === ConnectivityState.IDLE ||
subchannelState === ConnectivityState.TRANSIENT_FAILURE subchannelState === ConnectivityState.TRANSIENT_FAILURE