mirror of https://github.com/grpc/grpc-node.git
Add a helper for creating ChannelControlHelper children
This commit is contained in:
parent
fc35615e83
commit
2756a59495
|
@ -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));
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@ export {
|
||||||
LoadBalancer,
|
LoadBalancer,
|
||||||
LoadBalancingConfig,
|
LoadBalancingConfig,
|
||||||
ChannelControlHelper,
|
ChannelControlHelper,
|
||||||
|
createChildChannelControlHelper,
|
||||||
registerLoadBalancerType,
|
registerLoadBalancerType,
|
||||||
getFirstUsableConfig,
|
getFirstUsableConfig,
|
||||||
validateLoadBalancingConfig,
|
validateLoadBalancingConfig,
|
||||||
|
|
|
@ -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
|
Loading…
Reference in New Issue