mirror of https://github.com/grpc/grpc-node.git
grpc-js-xds: Reject EDS updates with duplicate locality/priority pairs
This commit is contained in:
parent
4e457b52e7
commit
1e1f732363
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
import { experimental, logVerbosity, StatusObject } from "@grpc/grpc-js";
|
import { experimental, logVerbosity, StatusObject } from "@grpc/grpc-js";
|
||||||
import { isIPv4, isIPv6 } from "net";
|
import { isIPv4, isIPv6 } from "net";
|
||||||
|
import { Locality__Output } from "../generated/envoy/config/core/v3/Locality";
|
||||||
import { ClusterLoadAssignment__Output } from "../generated/envoy/config/endpoint/v3/ClusterLoadAssignment";
|
import { ClusterLoadAssignment__Output } from "../generated/envoy/config/endpoint/v3/ClusterLoadAssignment";
|
||||||
import { Any__Output } from "../generated/google/protobuf/Any";
|
import { Any__Output } from "../generated/google/protobuf/Any";
|
||||||
import { HandleResponseResult, RejectedResourceEntry, ResourcePair, Watcher, XdsStreamState } from "./xds-stream-state";
|
import { HandleResponseResult, RejectedResourceEntry, ResourcePair, Watcher, XdsStreamState } from "./xds-stream-state";
|
||||||
|
@ -27,6 +28,10 @@ function trace(text: string): void {
|
||||||
experimental.trace(logVerbosity.DEBUG, TRACER_NAME, text);
|
experimental.trace(logVerbosity.DEBUG, TRACER_NAME, text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function localitiesEqual(a: Locality__Output, b: Locality__Output) {
|
||||||
|
return a.region === b.region && a.sub_zone === b.sub_zone && a.zone === b.zone;
|
||||||
|
}
|
||||||
|
|
||||||
export class EdsState implements XdsStreamState<ClusterLoadAssignment__Output> {
|
export class EdsState implements XdsStreamState<ClusterLoadAssignment__Output> {
|
||||||
public versionInfo = '';
|
public versionInfo = '';
|
||||||
public nonce = '';
|
public nonce = '';
|
||||||
|
@ -112,7 +117,17 @@ export class EdsState implements XdsStreamState<ClusterLoadAssignment__Output> {
|
||||||
* @param message
|
* @param message
|
||||||
*/
|
*/
|
||||||
private validateResponse(message: ClusterLoadAssignment__Output) {
|
private validateResponse(message: ClusterLoadAssignment__Output) {
|
||||||
|
const seenLocalities: {locality: Locality__Output, priority: number}[] = [];
|
||||||
for (const endpoint of message.endpoints) {
|
for (const endpoint of message.endpoints) {
|
||||||
|
if (!endpoint.locality) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (const {locality, priority} of seenLocalities) {
|
||||||
|
if (localitiesEqual(endpoint.locality, locality) && endpoint.priority === priority) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
seenLocalities.push({locality: endpoint.locality, priority: endpoint.priority});
|
||||||
for (const lb of endpoint.lb_endpoints) {
|
for (const lb of endpoint.lb_endpoints) {
|
||||||
const socketAddress = lb.endpoint?.address?.socket_address;
|
const socketAddress = lb.endpoint?.address?.socket_address;
|
||||||
if (!socketAddress) {
|
if (!socketAddress) {
|
||||||
|
|
Loading…
Reference in New Issue