From 869e515ea8acc1e7abc90f3c50a539bc88fbf6b4 Mon Sep 17 00:00:00 2001 From: Michael Lumish Date: Fri, 18 Jul 2025 11:23:48 -0700 Subject: [PATCH] grpc-js: round_robin: Start connecting to endpoints from a random index --- packages/grpc-js/src/load-balancer-round-robin.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/grpc-js/src/load-balancer-round-robin.ts b/packages/grpc-js/src/load-balancer-round-robin.ts index 15a071c8..17756b41 100644 --- a/packages/grpc-js/src/load-balancer-round-robin.ts +++ b/packages/grpc-js/src/load-balancer-round-robin.ts @@ -90,6 +90,10 @@ class RoundRobinPicker implements Picker { } } +function rotateArray(list: T[], startIndex: number) { + return [...list.slice(startIndex), ...list.slice(0, startIndex)]; +} + export class RoundRobinLoadBalancer implements LoadBalancer { private children: LeafLoadBalancer[] = []; @@ -228,7 +232,8 @@ export class RoundRobinLoadBalancer implements LoadBalancer { } return true; } - const endpointList = maybeEndpointList.value; + const startIndex = (Math.random() * maybeEndpointList.value.length) | 0; + const endpointList = rotateArray(maybeEndpointList.value, startIndex); this.resetSubchannelList(); if (endpointList.length === 0) { const errorMessage = `No addresses resolved. Resolution note: ${resolutionNote}`;