Skip to content

Commit 8f329e0

Browse files
authored
Merge pull request #2412 from murgatroid99/grpc-js_round_robin_refactor
grpc-js: Simplify round robin implementation
2 parents 9f8ed64 + d21ce8c commit 8f329e0

File tree

1 file changed

+7
-30
lines changed

1 file changed

+7
-30
lines changed

packages/grpc-js/src/load-balancer-round-robin.ts

Lines changed: 7 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -93,40 +93,21 @@ class RoundRobinPicker implements Picker {
9393
}
9494
}
9595

96-
interface ConnectivityStateCounts {
97-
[ConnectivityState.CONNECTING]: number;
98-
[ConnectivityState.IDLE]: number;
99-
[ConnectivityState.READY]: number;
100-
[ConnectivityState.SHUTDOWN]: number;
101-
[ConnectivityState.TRANSIENT_FAILURE]: number;
102-
}
103-
10496
export class RoundRobinLoadBalancer implements LoadBalancer {
10597
private subchannels: SubchannelInterface[] = [];
10698

10799
private currentState: ConnectivityState = ConnectivityState.IDLE;
108100

109101
private subchannelStateListener: ConnectivityStateListener;
110102

111-
private subchannelStateCounts: ConnectivityStateCounts;
112-
113103
private currentReadyPicker: RoundRobinPicker | null = null;
114104

115105
constructor(private readonly channelControlHelper: ChannelControlHelper) {
116-
this.subchannelStateCounts = {
117-
[ConnectivityState.CONNECTING]: 0,
118-
[ConnectivityState.IDLE]: 0,
119-
[ConnectivityState.READY]: 0,
120-
[ConnectivityState.SHUTDOWN]: 0,
121-
[ConnectivityState.TRANSIENT_FAILURE]: 0,
122-
};
123106
this.subchannelStateListener = (
124107
subchannel: SubchannelInterface,
125108
previousState: ConnectivityState,
126109
newState: ConnectivityState
127110
) => {
128-
this.subchannelStateCounts[previousState] -= 1;
129-
this.subchannelStateCounts[newState] += 1;
130111
this.calculateAndUpdateState();
131112

132113
if (
@@ -139,8 +120,12 @@ export class RoundRobinLoadBalancer implements LoadBalancer {
139120
};
140121
}
141122

123+
private countSubchannelsWithState(state: ConnectivityState) {
124+
return this.subchannels.filter(subchannel => subchannel.getConnectivityState() === state).length;
125+
}
126+
142127
private calculateAndUpdateState() {
143-
if (this.subchannelStateCounts[ConnectivityState.READY] > 0) {
128+
if (this.countSubchannelsWithState(ConnectivityState.READY) > 0) {
144129
const readySubchannels = this.subchannels.filter(
145130
(subchannel) =>
146131
subchannel.getConnectivityState() === ConnectivityState.READY
@@ -158,10 +143,10 @@ export class RoundRobinLoadBalancer implements LoadBalancer {
158143
ConnectivityState.READY,
159144
new RoundRobinPicker(readySubchannels, index)
160145
);
161-
} else if (this.subchannelStateCounts[ConnectivityState.CONNECTING] > 0) {
146+
} else if (this.countSubchannelsWithState(ConnectivityState.CONNECTING) > 0) {
162147
this.updateState(ConnectivityState.CONNECTING, new QueuePicker(this));
163148
} else if (
164-
this.subchannelStateCounts[ConnectivityState.TRANSIENT_FAILURE] > 0
149+
this.countSubchannelsWithState(ConnectivityState.TRANSIENT_FAILURE) > 0
165150
) {
166151
this.updateState(
167152
ConnectivityState.TRANSIENT_FAILURE,
@@ -193,13 +178,6 @@ export class RoundRobinLoadBalancer implements LoadBalancer {
193178
subchannel.unref();
194179
this.channelControlHelper.removeChannelzChild(subchannel.getChannelzRef());
195180
}
196-
this.subchannelStateCounts = {
197-
[ConnectivityState.CONNECTING]: 0,
198-
[ConnectivityState.IDLE]: 0,
199-
[ConnectivityState.READY]: 0,
200-
[ConnectivityState.SHUTDOWN]: 0,
201-
[ConnectivityState.TRANSIENT_FAILURE]: 0,
202-
};
203181
this.subchannels = [];
204182
}
205183

@@ -220,7 +198,6 @@ export class RoundRobinLoadBalancer implements LoadBalancer {
220198
subchannel.addConnectivityStateListener(this.subchannelStateListener);
221199
this.channelControlHelper.addChannelzChild(subchannel.getChannelzRef());
222200
const subchannelState = subchannel.getConnectivityState();
223-
this.subchannelStateCounts[subchannelState] += 1;
224201
if (
225202
subchannelState === ConnectivityState.IDLE ||
226203
subchannelState === ConnectivityState.TRANSIENT_FAILURE

0 commit comments

Comments
 (0)