This is an automated email from the ASF dual-hosted git repository.

yong pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/bookkeeper.git


The following commit(s) were added to refs/heads/master by this push:
     new c07e72aabd Fix no known bookies after reset racks for all BKs (#4128)
c07e72aabd is described below

commit c07e72aabd68abec18ac761e61aec289814390c4
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
---
 .../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 d4f0c4fd03..ff5704407a 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
@@ -505,6 +505,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);
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

Reply via email to