diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/net/NetworkTopologyImpl.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/net/NetworkTopologyImpl.java index 123f13ca8a3..19b2c0497f7 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/net/NetworkTopologyImpl.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/net/NetworkTopologyImpl.java @@ -17,6 +17,7 @@ */ package org.apache.bookkeeper.net; +import com.google.common.base.Strings; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -119,9 +120,10 @@ boolean isRack() { * @return true if this node is an ancestor of n */ boolean isAncestor(Node n) { - return getPath(this).equals(NodeBase.PATH_SEPARATOR_STR) + return !Strings.isNullOrEmpty(n.getNetworkLocation()) + && (getPath(this).equals(NodeBase.PATH_SEPARATOR_STR) || (n.getNetworkLocation() + NodeBase.PATH_SEPARATOR_STR).startsWith(getPath(this) - + NodeBase.PATH_SEPARATOR_STR); + + NodeBase.PATH_SEPARATOR_STR)); } /** diff --git a/bookkeeper-server/src/test/java/org/apache/bookkeeper/net/NetworkTopologyImplTest.java b/bookkeeper-server/src/test/java/org/apache/bookkeeper/net/NetworkTopologyImplTest.java index a6cc8c330a3..6122e51f0cd 100644 --- a/bookkeeper-server/src/test/java/org/apache/bookkeeper/net/NetworkTopologyImplTest.java +++ b/bookkeeper-server/src/test/java/org/apache/bookkeeper/net/NetworkTopologyImplTest.java @@ -17,7 +17,9 @@ */ package org.apache.bookkeeper.net; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import java.util.Set; import org.junit.Test; @@ -97,4 +99,31 @@ public void getLeavesShouldReturnLeavesThatAreNotInExcludedScope() { assertTrue(leavesExcludingRack2Scope.contains(bookieRack0ScopeNode)); assertTrue(leavesExcludingRack2Scope.contains(bookieRack2ScopeNode)); } + + @Test + public void testInvalidRackName() { + NetworkTopologyImpl networkTopology = new NetworkTopologyImpl(); + String rack0Scope = ""; + BookieId bookieIdScopeRack0 = BookieId.parse("bookieIdScopeRack0"); + BookieNode bookieRack0ScopeNode = new BookieNode(bookieIdScopeRack0, rack0Scope); + + String rack1Scope = "/"; + BookieId bookieIdScopeRack1 = BookieId.parse("bookieIdScopeRack1"); + BookieNode bookieRack1ScopeNode = new BookieNode(bookieIdScopeRack1, rack1Scope); + + try { + networkTopology.add(bookieRack0ScopeNode); + fail(); + } catch (IllegalArgumentException e) { + assertEquals("bookieIdScopeRack0, which is located at , is not a decendent of /", e.getMessage()); + } + + try { + networkTopology.add(bookieRack1ScopeNode); + fail(); + } catch (IllegalArgumentException e) { + assertEquals("bookieIdScopeRack1, which is located at , is not a decendent of /", e.getMessage()); + } + + } } \ No newline at end of file