Skip to content

Commit 2756a59

Browse files
committed
Add a helper for creating ChannelControlHelper children
1 parent fc35615 commit 2756a59

File tree

8 files changed

+32
-50
lines changed

8 files changed

+32
-50
lines changed

packages/grpc-js-xds/src/load-balancer-eds.ts

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -185,14 +185,7 @@ export class EdsLoadBalancer implements LoadBalancer {
185185
private concurrentRequests: number = 0;
186186

187187
constructor(private readonly channelControlHelper: ChannelControlHelper) {
188-
this.childBalancer = new ChildLoadBalancerHandler({
189-
createSubchannel: (subchannelAddress, subchannelArgs) =>
190-
this.channelControlHelper.createSubchannel(
191-
subchannelAddress,
192-
subchannelArgs
193-
),
194-
requestReresolution: () =>
195-
this.channelControlHelper.requestReresolution(),
188+
this.childBalancer = new ChildLoadBalancerHandler(experimental.createChildChannelControlHelper(this.channelControlHelper, {
196189
updateState: (connectivityState, originalPicker) => {
197190
if (this.latestEdsUpdate === null) {
198191
return;
@@ -243,7 +236,7 @@ export class EdsLoadBalancer implements LoadBalancer {
243236
};
244237
this.channelControlHelper.updateState(connectivityState, edsPicker);
245238
},
246-
});
239+
}));
247240
this.watcher = {
248241
onValidUpdate: (update) => {
249242
trace('Received EDS update for ' + this.edsServiceName + ': ' + JSON.stringify(update, undefined, 2));

packages/grpc-js-xds/src/load-balancer-lrs.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -174,20 +174,14 @@ export class LrsLoadBalancer implements LoadBalancer {
174174
private localityStatsReporter: XdsClusterLocalityStats | null = null;
175175

176176
constructor(private channelControlHelper: ChannelControlHelper) {
177-
this.childBalancer = new ChildLoadBalancerHandler({
178-
createSubchannel: (subchannelAddress, subchannelArgs) =>
179-
channelControlHelper.createSubchannel(
180-
subchannelAddress,
181-
subchannelArgs
182-
),
183-
requestReresolution: () => channelControlHelper.requestReresolution(),
177+
this.childBalancer = new ChildLoadBalancerHandler(experimental.createChildChannelControlHelper(channelControlHelper, {
184178
updateState: (connectivityState: ConnectivityState, picker: Picker) => {
185179
if (this.localityStatsReporter !== null) {
186180
picker = new LoadReportingPicker(picker, this.localityStatsReporter);
187181
}
188182
channelControlHelper.updateState(connectivityState, picker);
189183
},
190-
});
184+
}));
191185
}
192186

193187
updateAddressList(

packages/grpc-js-xds/src/load-balancer-priority.ts

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -139,23 +139,11 @@ export class PriorityLoadBalancer implements LoadBalancer {
139139
private failoverTimer: NodeJS.Timer | null = null;
140140
private deactivationTimer: NodeJS.Timer | null = null;
141141
constructor(private parent: PriorityLoadBalancer, private name: string) {
142-
this.childBalancer = new ChildLoadBalancerHandler({
143-
createSubchannel: (
144-
subchannelAddress: SubchannelAddress,
145-
subchannelArgs: ChannelOptions
146-
) => {
147-
return this.parent.channelControlHelper.createSubchannel(
148-
subchannelAddress,
149-
subchannelArgs
150-
);
151-
},
142+
this.childBalancer = new ChildLoadBalancerHandler(experimental.createChildChannelControlHelper(this.parent.channelControlHelper, {
152143
updateState: (connectivityState: ConnectivityState, picker: Picker) => {
153144
this.updateState(connectivityState, picker);
154145
},
155-
requestReresolution: () => {
156-
this.parent.channelControlHelper.requestReresolution();
157-
},
158-
});
146+
}));
159147
this.picker = new QueuePicker(this.childBalancer);
160148
}
161149

packages/grpc-js-xds/src/load-balancer-weighted-target.ts

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -168,17 +168,11 @@ export class WeightedTargetLoadBalancer implements LoadBalancer {
168168
private weight: number = 0;
169169

170170
constructor(private parent: WeightedTargetLoadBalancer, private name: string) {
171-
this.childBalancer = new ChildLoadBalancerHandler({
172-
createSubchannel: (subchannelAddress, subchannelOptions) => {
173-
return this.parent.channelControlHelper.createSubchannel(subchannelAddress, subchannelOptions);
174-
},
175-
updateState: (connectivityState, picker) => {
171+
this.childBalancer = new ChildLoadBalancerHandler(experimental.createChildChannelControlHelper(this.parent.channelControlHelper, {
172+
updateState: (connectivityState: ConnectivityState, picker: Picker) => {
176173
this.updateState(connectivityState, picker);
177174
},
178-
requestReresolution: () => {
179-
this.parent.channelControlHelper.requestReresolution();
180-
}
181-
});
175+
}));
182176

183177
this.picker = new QueuePicker(this.childBalancer);
184178
}

packages/grpc-js-xds/src/load-balancer-xds-cluster-manager.ts

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -131,17 +131,11 @@ class XdsClusterManager implements LoadBalancer {
131131
private childBalancer: ChildLoadBalancerHandler;
132132

133133
constructor(private parent: XdsClusterManager, private name: string) {
134-
this.childBalancer = new ChildLoadBalancerHandler({
135-
createSubchannel: (subchannelAddress, subchannelOptions) => {
136-
return this.parent.channelControlHelper.createSubchannel(subchannelAddress, subchannelOptions);
137-
},
138-
updateState: (connectivityState, picker) => {
134+
this.childBalancer = new ChildLoadBalancerHandler(experimental.createChildChannelControlHelper(this.parent.channelControlHelper, {
135+
updateState: (connectivityState: ConnectivityState, picker: Picker) => {
139136
this.updateState(connectivityState, picker);
140137
},
141-
requestReresolution: () => {
142-
this.parent.channelControlHelper.requestReresolution();
143-
}
144-
});
138+
}));
145139

146140
this.picker = new QueuePicker(this.childBalancer);
147141
}

packages/grpc-js/src/experimental.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export {
1212
LoadBalancer,
1313
LoadBalancingConfig,
1414
ChannelControlHelper,
15+
createChildChannelControlHelper,
1516
registerLoadBalancerType,
1617
getFirstUsableConfig,
1718
validateLoadBalancingConfig,

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,24 @@ export interface ChannelControlHelper {
5252
removeChannelzChild(child: ChannelRef | SubchannelRef): void;
5353
}
5454

55+
/**
56+
* Create a child ChannelControlHelper that overrides some methods of the
57+
* parent while letting others pass through to the parent unmodified. This
58+
* allows other code to create these children without needing to know about
59+
* all of the methods to be passed through.
60+
* @param parent
61+
* @param overrides
62+
*/
63+
export function createChildChannelControlHelper(parent: ChannelControlHelper, overrides: Partial<ChannelControlHelper>): ChannelControlHelper {
64+
return {
65+
createSubchannel: overrides.createSubchannel?.bind(overrides) ?? parent.createSubchannel.bind(parent),
66+
updateState: overrides.updateState?.bind(overrides) ?? parent.updateState.bind(parent),
67+
requestReresolution: overrides.requestReresolution?.bind(overrides) ?? parent.requestReresolution.bind(parent),
68+
addChannelzChild: overrides.addChannelzChild?.bind(overrides) ?? parent.addChannelzChild.bind(parent),
69+
removeChannelzChild: overrides.removeChannelzChild?.bind(overrides) ?? parent.removeChannelzChild.bind(parent)
70+
};
71+
}
72+
5573
/**
5674
* Tracks one or more connected subchannels and determines which subchannel
5775
* each request should use.

packages/grpc-tools/deps/protobuf

Submodule protobuf updated 1819 files

0 commit comments

Comments
 (0)