mirror of https://github.com/grpc/grpc-node.git
Merge pull request #2412 from murgatroid99/grpc-js_round_robin_refactor
grpc-js: Simplify round robin implementation
This commit is contained in:
commit
8f329e08b2
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue