mirror of https://github.com/grpc/grpc-node.git
grpc-js: Disallow pick_first as child of outlier_detection
This commit is contained in:
parent
09d74ca43d
commit
b53f5882f1
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@grpc/grpc-js",
|
"name": "@grpc/grpc-js",
|
||||||
"version": "1.8.16",
|
"version": "1.8.17",
|
||||||
"description": "gRPC Library for Node - pure JS implementation",
|
"description": "gRPC Library for Node - pure JS implementation",
|
||||||
"homepage": "https://grpc.io/",
|
"homepage": "https://grpc.io/",
|
||||||
"repository": "https://github.com/grpc/grpc-node/tree/master/packages/grpc-js",
|
"repository": "https://github.com/grpc/grpc-node/tree/master/packages/grpc-js",
|
||||||
|
|
|
@ -113,6 +113,9 @@ export class OutlierDetectionLoadBalancingConfig implements LoadBalancingConfig
|
||||||
failurePercentageEjection: Partial<FailurePercentageEjectionConfig> | null,
|
failurePercentageEjection: Partial<FailurePercentageEjectionConfig> | null,
|
||||||
private readonly childPolicy: LoadBalancingConfig[]
|
private readonly childPolicy: LoadBalancingConfig[]
|
||||||
) {
|
) {
|
||||||
|
if (childPolicy[0].getLoadBalancerName() === 'pick_first') {
|
||||||
|
throw new Error('outlier_detection LB policy cannot have a pick_first child policy');
|
||||||
|
}
|
||||||
this.intervalMs = intervalMs ?? 10_000;
|
this.intervalMs = intervalMs ?? 10_000;
|
||||||
this.baseEjectionTimeMs = baseEjectionTimeMs ?? 30_000;
|
this.baseEjectionTimeMs = baseEjectionTimeMs ?? 30_000;
|
||||||
this.maxEjectionTimeMs = maxEjectionTimeMs ?? 300_000;
|
this.maxEjectionTimeMs = maxEjectionTimeMs ?? 300_000;
|
||||||
|
@ -395,8 +398,8 @@ export class OutlierDetectionLoadBalancer implements LoadBalancer {
|
||||||
}
|
}
|
||||||
|
|
||||||
private isCountingEnabled(): boolean {
|
private isCountingEnabled(): boolean {
|
||||||
return this.latestConfig !== null &&
|
return this.latestConfig !== null &&
|
||||||
(this.latestConfig.getSuccessRateEjectionConfig() !== null ||
|
(this.latestConfig.getSuccessRateEjectionConfig() !== null ||
|
||||||
this.latestConfig.getFailurePercentageEjectionConfig() !== null);
|
this.latestConfig.getFailurePercentageEjectionConfig() !== null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -496,7 +499,7 @@ export class OutlierDetectionLoadBalancer implements LoadBalancer {
|
||||||
if (addressesWithTargetVolume < failurePercentageConfig.minimum_hosts) {
|
if (addressesWithTargetVolume < failurePercentageConfig.minimum_hosts) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Step 2
|
// Step 2
|
||||||
for (const [address, mapEntry] of this.addressMap.entries()) {
|
for (const [address, mapEntry] of this.addressMap.entries()) {
|
||||||
// Step 2.i
|
// Step 2.i
|
||||||
|
@ -656,4 +659,4 @@ export function setup() {
|
||||||
if (OUTLIER_DETECTION_ENABLED) {
|
if (OUTLIER_DETECTION_ENABLED) {
|
||||||
registerLoadBalancerType(TYPE_NAME, OutlierDetectionLoadBalancer, OutlierDetectionLoadBalancingConfig);
|
registerLoadBalancerType(TYPE_NAME, OutlierDetectionLoadBalancer, OutlierDetectionLoadBalancingConfig);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -137,7 +137,7 @@ class DnsResolver implements Resolver {
|
||||||
details: `Name resolution failed for target ${uriToString(this.target)}`,
|
details: `Name resolution failed for target ${uriToString(this.target)}`,
|
||||||
metadata: new Metadata(),
|
metadata: new Metadata(),
|
||||||
};
|
};
|
||||||
|
|
||||||
const backoffOptions: BackoffOptions = {
|
const backoffOptions: BackoffOptions = {
|
||||||
initialDelay: channelOptions['grpc.initial_reconnect_backoff_ms'],
|
initialDelay: channelOptions['grpc.initial_reconnect_backoff_ms'],
|
||||||
maxDelay: channelOptions['grpc.max_reconnect_backoff_ms'],
|
maxDelay: channelOptions['grpc.max_reconnect_backoff_ms'],
|
||||||
|
@ -276,7 +276,7 @@ class DnsResolver implements Resolver {
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
this.latestServiceConfigError = {
|
this.latestServiceConfigError = {
|
||||||
code: Status.UNAVAILABLE,
|
code: Status.UNAVAILABLE,
|
||||||
details: 'Parsing service config failed',
|
details: `Parsing service config failed with error ${(err as Error).message}`,
|
||||||
metadata: new Metadata(),
|
metadata: new Metadata(),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -360,6 +360,16 @@ describe('Outlier detection config validation', () => {
|
||||||
}, /failure_percentage_ejection\.enforcement_percentage parse error: value out of range for percentage/);
|
}, /failure_percentage_ejection\.enforcement_percentage parse error: value out of range for percentage/);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
describe('child_policy', () => {
|
||||||
|
it('Should reject a pick_first child_policy', () => {
|
||||||
|
const loadBalancingConfig = {
|
||||||
|
child_policy: [{pick_first: {}}]
|
||||||
|
};
|
||||||
|
assert.throws(() => {
|
||||||
|
OutlierDetectionLoadBalancingConfig.createFromJson(loadBalancingConfig);
|
||||||
|
}, /outlier_detection LB policy cannot have a pick_first child policy/);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('Outlier detection', () => {
|
describe('Outlier detection', () => {
|
||||||
|
@ -533,4 +543,4 @@ describe('Outlier detection', () => {
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue