Add a helper for creating ChannelControlHelper children

This commit is contained in:
Michael Lumish 2021-09-27 16:12:23 -07:00
parent fc35615e83
commit 2756a59495
8 changed files with 32 additions and 50 deletions

View File

@ -185,14 +185,7 @@ export class EdsLoadBalancer implements LoadBalancer {
private concurrentRequests: number = 0; private concurrentRequests: number = 0;
constructor(private readonly channelControlHelper: ChannelControlHelper) { constructor(private readonly channelControlHelper: ChannelControlHelper) {
this.childBalancer = new ChildLoadBalancerHandler({ this.childBalancer = new ChildLoadBalancerHandler(experimental.createChildChannelControlHelper(this.channelControlHelper, {
createSubchannel: (subchannelAddress, subchannelArgs) =>
this.channelControlHelper.createSubchannel(
subchannelAddress,
subchannelArgs
),
requestReresolution: () =>
this.channelControlHelper.requestReresolution(),
updateState: (connectivityState, originalPicker) => { updateState: (connectivityState, originalPicker) => {
if (this.latestEdsUpdate === null) { if (this.latestEdsUpdate === null) {
return; return;
@ -243,7 +236,7 @@ export class EdsLoadBalancer implements LoadBalancer {
}; };
this.channelControlHelper.updateState(connectivityState, edsPicker); this.channelControlHelper.updateState(connectivityState, edsPicker);
}, },
}); }));
this.watcher = { this.watcher = {
onValidUpdate: (update) => { onValidUpdate: (update) => {
trace('Received EDS update for ' + this.edsServiceName + ': ' + JSON.stringify(update, undefined, 2)); trace('Received EDS update for ' + this.edsServiceName + ': ' + JSON.stringify(update, undefined, 2));

View File

@ -174,20 +174,14 @@ export class LrsLoadBalancer implements LoadBalancer {
private localityStatsReporter: XdsClusterLocalityStats | null = null; private localityStatsReporter: XdsClusterLocalityStats | null = null;
constructor(private channelControlHelper: ChannelControlHelper) { constructor(private channelControlHelper: ChannelControlHelper) {
this.childBalancer = new ChildLoadBalancerHandler({ this.childBalancer = new ChildLoadBalancerHandler(experimental.createChildChannelControlHelper(channelControlHelper, {
createSubchannel: (subchannelAddress, subchannelArgs) =>
channelControlHelper.createSubchannel(
subchannelAddress,
subchannelArgs
),
requestReresolution: () => channelControlHelper.requestReresolution(),
updateState: (connectivityState: ConnectivityState, picker: Picker) => { updateState: (connectivityState: ConnectivityState, picker: Picker) => {
if (this.localityStatsReporter !== null) { if (this.localityStatsReporter !== null) {
picker = new LoadReportingPicker(picker, this.localityStatsReporter); picker = new LoadReportingPicker(picker, this.localityStatsReporter);
} }
channelControlHelper.updateState(connectivityState, picker); channelControlHelper.updateState(connectivityState, picker);
}, },
}); }));
} }
updateAddressList( updateAddressList(

View File

@ -139,23 +139,11 @@ export class PriorityLoadBalancer implements LoadBalancer {
private failoverTimer: NodeJS.Timer | null = null; private failoverTimer: NodeJS.Timer | null = null;
private deactivationTimer: NodeJS.Timer | null = null; private deactivationTimer: NodeJS.Timer | null = null;
constructor(private parent: PriorityLoadBalancer, private name: string) { constructor(private parent: PriorityLoadBalancer, private name: string) {
this.childBalancer = new ChildLoadBalancerHandler({ this.childBalancer = new ChildLoadBalancerHandler(experimental.createChildChannelControlHelper(this.parent.channelControlHelper, {
createSubchannel: (
subchannelAddress: SubchannelAddress,
subchannelArgs: ChannelOptions
) => {
return this.parent.channelControlHelper.createSubchannel(
subchannelAddress,
subchannelArgs
);
},
updateState: (connectivityState: ConnectivityState, picker: Picker) => { updateState: (connectivityState: ConnectivityState, picker: Picker) => {
this.updateState(connectivityState, picker); this.updateState(connectivityState, picker);
}, },
requestReresolution: () => { }));
this.parent.channelControlHelper.requestReresolution();
},
});
this.picker = new QueuePicker(this.childBalancer); this.picker = new QueuePicker(this.childBalancer);
} }

View File

@ -168,17 +168,11 @@ export class WeightedTargetLoadBalancer implements LoadBalancer {
private weight: number = 0; private weight: number = 0;
constructor(private parent: WeightedTargetLoadBalancer, private name: string) { constructor(private parent: WeightedTargetLoadBalancer, private name: string) {
this.childBalancer = new ChildLoadBalancerHandler({ this.childBalancer = new ChildLoadBalancerHandler(experimental.createChildChannelControlHelper(this.parent.channelControlHelper, {
createSubchannel: (subchannelAddress, subchannelOptions) => { updateState: (connectivityState: ConnectivityState, picker: Picker) => {
return this.parent.channelControlHelper.createSubchannel(subchannelAddress, subchannelOptions);
},
updateState: (connectivityState, picker) => {
this.updateState(connectivityState, picker); this.updateState(connectivityState, picker);
}, },
requestReresolution: () => { }));
this.parent.channelControlHelper.requestReresolution();
}
});
this.picker = new QueuePicker(this.childBalancer); this.picker = new QueuePicker(this.childBalancer);
} }

View File

@ -131,17 +131,11 @@ class XdsClusterManager implements LoadBalancer {
private childBalancer: ChildLoadBalancerHandler; private childBalancer: ChildLoadBalancerHandler;
constructor(private parent: XdsClusterManager, private name: string) { constructor(private parent: XdsClusterManager, private name: string) {
this.childBalancer = new ChildLoadBalancerHandler({ this.childBalancer = new ChildLoadBalancerHandler(experimental.createChildChannelControlHelper(this.parent.channelControlHelper, {
createSubchannel: (subchannelAddress, subchannelOptions) => { updateState: (connectivityState: ConnectivityState, picker: Picker) => {
return this.parent.channelControlHelper.createSubchannel(subchannelAddress, subchannelOptions);
},
updateState: (connectivityState, picker) => {
this.updateState(connectivityState, picker); this.updateState(connectivityState, picker);
}, },
requestReresolution: () => { }));
this.parent.channelControlHelper.requestReresolution();
}
});
this.picker = new QueuePicker(this.childBalancer); this.picker = new QueuePicker(this.childBalancer);
} }

View File

@ -12,6 +12,7 @@ export {
LoadBalancer, LoadBalancer,
LoadBalancingConfig, LoadBalancingConfig,
ChannelControlHelper, ChannelControlHelper,
createChildChannelControlHelper,
registerLoadBalancerType, registerLoadBalancerType,
getFirstUsableConfig, getFirstUsableConfig,
validateLoadBalancingConfig, validateLoadBalancingConfig,

View File

@ -52,6 +52,24 @@ export interface ChannelControlHelper {
removeChannelzChild(child: ChannelRef | SubchannelRef): void; removeChannelzChild(child: ChannelRef | SubchannelRef): void;
} }
/**
* Create a child ChannelControlHelper that overrides some methods of the
* parent while letting others pass through to the parent unmodified. This
* allows other code to create these children without needing to know about
* all of the methods to be passed through.
* @param parent
* @param overrides
*/
export function createChildChannelControlHelper(parent: ChannelControlHelper, overrides: Partial<ChannelControlHelper>): ChannelControlHelper {
return {
createSubchannel: overrides.createSubchannel?.bind(overrides) ?? parent.createSubchannel.bind(parent),
updateState: overrides.updateState?.bind(overrides) ?? parent.updateState.bind(parent),
requestReresolution: overrides.requestReresolution?.bind(overrides) ?? parent.requestReresolution.bind(parent),
addChannelzChild: overrides.addChannelzChild?.bind(overrides) ?? parent.addChannelzChild.bind(parent),
removeChannelzChild: overrides.removeChannelzChild?.bind(overrides) ?? parent.removeChannelzChild.bind(parent)
};
}
/** /**
* Tracks one or more connected subchannels and determines which subchannel * Tracks one or more connected subchannels and determines which subchannel
* each request should use. * each request should use.

@ -1 +1 @@
Subproject commit a6e1cc7e328c45a0cb9856c530c8f6cd23314163 Subproject commit 6aa539bf0195f188ff86efe6fb8bfa2b676cdd46