From 01ec9c36f26e61109b2a35588d1c647231e2ac0f Mon Sep 17 00:00:00 2001 From: adwetojha Date: Sat, 3 Oct 2026 19:24:16 +0530 Subject: [PATCH] HDDS-16631. Fix node selection for scopes with common prefixes --- .../hadoop/hdds/scm/net/InnerNodeImpl.java | 2 +- .../hdds/scm/net/TestNetworkTopologyImpl.java | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/net/InnerNodeImpl.java b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/net/InnerNodeImpl.java index 7b523a3115a6..e4fccc5a0fb7 100644 --- a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/net/InnerNodeImpl.java +++ b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/net/InnerNodeImpl.java @@ -439,7 +439,7 @@ public Node getLeaf(int leafIndex, List excludedScopes, int leafCount = child.getNumOfLeaves(); // skip nodes covered by excluded scopes for (Map.Entry entry: excludedNodeCount.entrySet()) { - if (entry.getKey().startsWith(child.getNetworkFullPath())) { + if (child.isAncestor(entry.getKey())) { leafCount -= entry.getValue(); } } diff --git a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/scm/net/TestNetworkTopologyImpl.java b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/scm/net/TestNetworkTopologyImpl.java index be85104aa4b1..c71986cbb26d 100644 --- a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/scm/net/TestNetworkTopologyImpl.java +++ b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/scm/net/TestNetworkTopologyImpl.java @@ -454,6 +454,25 @@ void testChooseRandomExcludedScope(NodeSchema[] schemas, } } + @Test + void testChooseRandomWithExcludedScopePrefix() { + NodeSchema[] schemas = {ROOT_SCHEMA, RACK_SCHEMA, LEAF_SCHEMA}; + Node datanodeA = createDatanode("datanode-A", "/r1"); + Node datanodeB = createDatanode("datanode-B", "/r10"); + + Node[] nodeArray = {datanodeA, datanodeB}; + initNetworkTopology(schemas, nodeArray); + + List excludedScopes = new ArrayList<>(); + excludedScopes.add(datanodeB.getNetworkFullPath()); + + Node chosenNode = cluster.chooseRandom( + ROOT, excludedScopes, null, null, 0); + + assertEquals(datanodeA, chosenNode, + "datanode-A should be selected when datanode-B is excluded"); + } + /** * Following test checks that chooseRandom works for an excluded nodes. */