diff --git a/core/src/main/java/tech/ydb/core/impl/pool/PriorityPicker.java b/core/src/main/java/tech/ydb/core/impl/pool/PriorityPicker.java index 2aed6ca49..a401851b2 100644 --- a/core/src/main/java/tech/ydb/core/impl/pool/PriorityPicker.java +++ b/core/src/main/java/tech/ydb/core/impl/pool/PriorityPicker.java @@ -67,8 +67,12 @@ static String getLocationFromConfig(String preferable, String selfLocation) { @VisibleForTesting static String detectLocalDC(List endpoints, Ticker ticker) { + // Endpoints without a known location carry no information about datacenters. They must be + // filtered out because groupingBy rejects a null key - the endpoint the transport bootstraps + // with has no location until the first discovery completes. Map> dcLocationToNodes = endpoints .stream() + .filter(endpoint -> endpoint.getLocation() != null && !endpoint.getLocation().isEmpty()) .collect(Collectors.groupingBy(EndpointRecord::getLocation)); if (dcLocationToNodes.size() < 2) { diff --git a/core/src/test/java/tech/ydb/core/impl/pool/PriorityPickerTest.java b/core/src/test/java/tech/ydb/core/impl/pool/PriorityPickerTest.java index b1da65ad4..037056f3d 100644 --- a/core/src/test/java/tech/ydb/core/impl/pool/PriorityPickerTest.java +++ b/core/src/test/java/tech/ydb/core/impl/pool/PriorityPickerTest.java @@ -9,6 +9,7 @@ import javax.net.ServerSocketFactory; +import com.google.common.base.Ticker; import org.junit.Assert; import org.junit.Test; @@ -56,6 +57,19 @@ public void detectLocalDCFallbackTest() { Assert.assertEquals(0, ignoreSelfLocation.getEndpointPriority("DC3")); } + @Test + public void detectLocalDCWithoutLocationsTest() { + // the endpoint a transport bootstraps with has no location until the first discovery completes + List bootstrap = Collections.singletonList(new EndpointRecord("localhost", 2136)); + PriorityPicker picker = PriorityPicker.from(BalancingSettings.detectLocalDs(), null, bootstrap); + + Assert.assertEquals(0, picker.getEndpointPriority("DC1")); + Assert.assertEquals(0, picker.getEndpointPriority(null)); + + Assert.assertNull(PriorityPicker.detectLocalDC(bootstrap, Ticker.systemTicker())); + Assert.assertNull(PriorityPicker.detectLocalDC(Collections.emptyList(), Ticker.systemTicker())); + } + @Test public void detectLocalDCTest() { TestTicker testTicker = new TestTicker(