Skip to content

Commit 8832fc2

Browse files
committed
grpc-js-xds: Validate uniqueness of addresses in EDS updates
1 parent 2f6d49d commit 8832fc2

File tree

1 file changed

+12
-0
lines changed

1 file changed

+12
-0
lines changed

packages/grpc-js-xds/src/xds-stream-state/eds-state.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import { experimental, logVerbosity, StatusObject } from "@grpc/grpc-js";
1919
import { isIPv4, isIPv6 } from "net";
2020
import { Locality__Output } from "../generated/envoy/config/core/v3/Locality";
21+
import { SocketAddress__Output } from "../generated/envoy/config/core/v3/SocketAddress";
2122
import { ClusterLoadAssignment__Output } from "../generated/envoy/config/endpoint/v3/ClusterLoadAssignment";
2223
import { Any__Output } from "../generated/google/protobuf/Any";
2324
import { BaseXdsStreamState, HandleResponseResult, RejectedResourceEntry, ResourcePair, Watcher, XdsStreamState } from "./xds-stream-state";
@@ -32,6 +33,10 @@ function localitiesEqual(a: Locality__Output, b: Locality__Output) {
3233
return a.region === b.region && a.sub_zone === b.sub_zone && a.zone === b.zone;
3334
}
3435

36+
function addressesEqual(a: SocketAddress__Output, b: SocketAddress__Output) {
37+
return a.address === b.address && a.port_value === b.port_value;
38+
}
39+
3540
export class EdsState extends BaseXdsStreamState<ClusterLoadAssignment__Output> implements XdsStreamState<ClusterLoadAssignment__Output> {
3641
protected getResourceName(resource: ClusterLoadAssignment__Output): string {
3742
return resource.cluster_name;
@@ -50,6 +55,7 @@ export class EdsState extends BaseXdsStreamState<ClusterLoadAssignment__Output>
5055
*/
5156
public validateResponse(message: ClusterLoadAssignment__Output) {
5257
const seenLocalities: {locality: Locality__Output, priority: number}[] = [];
58+
const seenAddresses: SocketAddress__Output[] = [];
5359
const priorityTotalWeights: Map<number, number> = new Map();
5460
for (const endpoint of message.endpoints) {
5561
if (!endpoint.locality) {
@@ -72,6 +78,12 @@ export class EdsState extends BaseXdsStreamState<ClusterLoadAssignment__Output>
7278
if (!(isIPv4(socketAddress.address) || isIPv6(socketAddress.address))) {
7379
return false;
7480
}
81+
for (const address of seenAddresses) {
82+
if (addressesEqual(socketAddress, address)) {
83+
return false;
84+
}
85+
}
86+
seenAddresses.push(socketAddress);
7587
}
7688
priorityTotalWeights.set(endpoint.priority, (priorityTotalWeights.get(endpoint.priority) ?? 0) + (endpoint.load_balancing_weight?.value ?? 0));
7789
}

0 commit comments

Comments
 (0)