This is an automated email from the ASF dual-hosted git repository. yong pushed a commit to branch branch-4.15 in repository https://gitbox.apache.org/repos/asf/bookkeeper.git
commit 2c204b71146144c106580174a63e2f435885b8c2 Author: fengyubiao <[email protected]> AuthorDate: Mon Nov 20 09:39:52 2023 +0800 Fix no known bookies after reset racks for all BKs (#4128) * Fix no known bookies after reset racks for all BKs (cherry picked from commit c07e72aabd68abec18ac761e61aec289814390c4) --- .../apache/bookkeeper/net/NetworkTopologyImpl.java | 3 ++ .../bookkeeper/net/NetworkTopologyImplTest.java | 40 ++++++++++++++++++++++ 2 files changed, 43 insertions(+) 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 3d4361d570..1b8cc614c0 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 @@ -506,6 +506,9 @@ public class NetworkTopologyImpl implements NetworkTopology { if (rack == null) { numOfRacks--; } + if (clusterMap.numOfLeaves == 0) { + depthOfAllLeaves = -1; + } } if (LOG.isDebugEnabled()) { LOG.debug("NetworkTopology became:\n" + this.toString()); 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 6122e51f0c..e9ed1577e7 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 @@ -65,6 +65,46 @@ public class NetworkTopologyImplTest { assertTrue(leavesScopeRack1.contains(bookieRack1ScopeNode)); } + @Test + public void testRestartBKWithNewRackDepth() { + NetworkTopologyImpl networkTopology = new NetworkTopologyImpl(); + String dp1Rack = "/rack-1"; + String dp2Rack = "/dp/rack-1"; + BookieId bkId1 = BookieId.parse("bookieIdScopeRack0"); + BookieId bkId2 = BookieId.parse("bookieIdScopeRack1"); + + // Register 2 BKs with depth 1 rack. + BookieNode dp1BkNode1 = new BookieNode(bkId1, dp1Rack); + BookieNode dp1BkNode2 = new BookieNode(bkId2, dp1Rack); + networkTopology.add(dp1BkNode1); + networkTopology.add(dp1BkNode2); + + // Update one BK with depth 2 rack. + // Assert it can not be added due to different depth. + networkTopology.remove(dp1BkNode1); + BookieNode dp2BkNode1 = new BookieNode(bkId1, dp2Rack); + try { + networkTopology.add(dp2BkNode1); + fail("Expected add node failed caused by different depth of rack"); + } catch (NetworkTopologyImpl.InvalidTopologyException ex) { + // Expected ex. + } + Set<Node> leaves = networkTopology.getLeaves(dp1Rack); + assertEquals(leaves.size(), 1); + assertTrue(leaves.contains(dp1BkNode2)); + + // Update all Bks with depth 2 rack. + // Verify update success. + networkTopology.remove(dp1BkNode2); + BookieNode dp2BkNode2 = new BookieNode(bkId2, dp2Rack); + networkTopology.add(dp2BkNode1); + networkTopology.add(dp2BkNode2); + leaves = networkTopology.getLeaves(dp2Rack); + assertEquals(leaves.size(), 2); + assertTrue(leaves.contains(dp2BkNode1)); + assertTrue(leaves.contains(dp2BkNode2)); + } + @Test public void getLeavesShouldReturnLeavesThatAreNotInExcludedScope() { // GIVEN
