@@ -93,40 +93,21 @@ class RoundRobinPicker implements Picker {
93
93
}
94
94
}
95
95
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
-
104
96
export class RoundRobinLoadBalancer implements LoadBalancer {
105
97
private subchannels : SubchannelInterface [ ] = [ ] ;
106
98
107
99
private currentState : ConnectivityState = ConnectivityState . IDLE ;
108
100
109
101
private subchannelStateListener : ConnectivityStateListener ;
110
102
111
- private subchannelStateCounts : ConnectivityStateCounts ;
112
-
113
103
private currentReadyPicker : RoundRobinPicker | null = null ;
114
104
115
105
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
- } ;
123
106
this . subchannelStateListener = (
124
107
subchannel : SubchannelInterface ,
125
108
previousState : ConnectivityState ,
126
109
newState : ConnectivityState
127
110
) => {
128
- this . subchannelStateCounts [ previousState ] -= 1 ;
129
- this . subchannelStateCounts [ newState ] += 1 ;
130
111
this . calculateAndUpdateState ( ) ;
131
112
132
113
if (
@@ -139,8 +120,12 @@ export class RoundRobinLoadBalancer implements LoadBalancer {
139
120
} ;
140
121
}
141
122
123
+ private countSubchannelsWithState ( state : ConnectivityState ) {
124
+ return this . subchannels . filter ( subchannel => subchannel . getConnectivityState ( ) === state ) . length ;
125
+ }
126
+
142
127
private calculateAndUpdateState ( ) {
143
- if ( this . subchannelStateCounts [ ConnectivityState . READY ] > 0 ) {
128
+ if ( this . countSubchannelsWithState ( ConnectivityState . READY ) > 0 ) {
144
129
const readySubchannels = this . subchannels . filter (
145
130
( subchannel ) =>
146
131
subchannel . getConnectivityState ( ) === ConnectivityState . READY
@@ -158,10 +143,10 @@ export class RoundRobinLoadBalancer implements LoadBalancer {
158
143
ConnectivityState . READY ,
159
144
new RoundRobinPicker ( readySubchannels , index )
160
145
) ;
161
- } else if ( this . subchannelStateCounts [ ConnectivityState . CONNECTING ] > 0 ) {
146
+ } else if ( this . countSubchannelsWithState ( ConnectivityState . CONNECTING ) > 0 ) {
162
147
this . updateState ( ConnectivityState . CONNECTING , new QueuePicker ( this ) ) ;
163
148
} else if (
164
- this . subchannelStateCounts [ ConnectivityState . TRANSIENT_FAILURE ] > 0
149
+ this . countSubchannelsWithState ( ConnectivityState . TRANSIENT_FAILURE ) > 0
165
150
) {
166
151
this . updateState (
167
152
ConnectivityState . TRANSIENT_FAILURE ,
@@ -193,13 +178,6 @@ export class RoundRobinLoadBalancer implements LoadBalancer {
193
178
subchannel . unref ( ) ;
194
179
this . channelControlHelper . removeChannelzChild ( subchannel . getChannelzRef ( ) ) ;
195
180
}
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
- } ;
203
181
this . subchannels = [ ] ;
204
182
}
205
183
@@ -220,7 +198,6 @@ export class RoundRobinLoadBalancer implements LoadBalancer {
220
198
subchannel . addConnectivityStateListener ( this . subchannelStateListener ) ;
221
199
this . channelControlHelper . addChannelzChild ( subchannel . getChannelzRef ( ) ) ;
222
200
const subchannelState = subchannel . getConnectivityState ( ) ;
223
- this . subchannelStateCounts [ subchannelState ] += 1 ;
224
201
if (
225
202
subchannelState === ConnectivityState . IDLE ||
226
203
subchannelState === ConnectivityState . TRANSIENT_FAILURE
0 commit comments