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

penghui pushed a commit to branch branch-2.7
in repository https://gitbox.apache.org/repos/asf/pulsar.git


The following commit(s) were added to refs/heads/branch-2.7 by this push:
     new 0c14efb758f Fix invalid rack name cause bookie join rack failed 
(#16845)
0c14efb758f is described below

commit 0c14efb758f91acbfc77acf4c262c360231f393f
Author: JiangHaiting <[email protected]>
AuthorDate: Wed Aug 3 09:27:42 2022 +0800

    Fix invalid rack name cause bookie join rack failed (#16845)
---
 .../org/apache/pulsar/admin/cli/CmdBookies.java    | 17 +++++++++++---
 .../zookeeper/ZkBookieRackAffinityMapping.java     |  7 +++---
 .../zookeeper/ZkBookieRackAffinityMappingTest.java | 27 +++++++++++++++++++---
 3 files changed, 42 insertions(+), 9 deletions(-)

diff --git 
a/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdBookies.java 
b/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdBookies.java
index 83f2934528f..65b70c97609 100644
--- 
a/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdBookies.java
+++ 
b/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdBookies.java
@@ -18,11 +18,12 @@
  */
 package org.apache.pulsar.admin.cli;
 
-import org.apache.pulsar.client.admin.PulsarAdmin;
-import org.apache.pulsar.common.policies.data.BookieInfo;
-
 import com.beust.jcommander.Parameter;
 import com.beust.jcommander.Parameters;
+import com.google.common.base.Strings;
+import lombok.NonNull;
+import org.apache.pulsar.client.admin.PulsarAdmin;
+import org.apache.pulsar.common.policies.data.BookieInfo;
 
 @Parameters(commandDescription = "Operations about bookies rack placement")
 public class CmdBookies extends CmdBase {
@@ -62,6 +63,8 @@ public class CmdBookies extends CmdBase {
 
     @Parameters(commandDescription = "Updates the rack placement information 
for a specific bookie in the cluster (note. bookie address 
format:`address:port`)")
     private class UpdateBookie extends CliCommand {
+        private static final String PATH_SEPARATOR = "/";
+
         @Parameter(names = { "-g", "--group" }, description = "Bookie group 
name", required = false)
         private String group = "default";
 
@@ -76,8 +79,16 @@ public class CmdBookies extends CmdBase {
 
         @Override
         void run() throws Exception {
+            checkArgument(!Strings.isNullOrEmpty(bookieRack) && 
!bookieRack.trim().equals(PATH_SEPARATOR),
+                    "rack name is invalid, it should not be null, empty or 
'/'");
             admin.bookies().updateBookieRackInfo(bookieAddress, group, new 
BookieInfo(bookieRack, bookieHost));
         }
+
+        private void checkArgument(boolean expression, @NonNull Object 
errorMessage) {
+            if (!expression) {
+                throw new 
IllegalArgumentException(String.valueOf(errorMessage));
+            }
+        }
     }
 
     public CmdBookies(PulsarAdmin admin) {
diff --git 
a/pulsar-zookeeper-utils/src/main/java/org/apache/pulsar/zookeeper/ZkBookieRackAffinityMapping.java
 
b/pulsar-zookeeper-utils/src/main/java/org/apache/pulsar/zookeeper/ZkBookieRackAffinityMapping.java
index c13b044bc47..e8442c78315 100644
--- 
a/pulsar-zookeeper-utils/src/main/java/org/apache/pulsar/zookeeper/ZkBookieRackAffinityMapping.java
+++ 
b/pulsar-zookeeper-utils/src/main/java/org/apache/pulsar/zookeeper/ZkBookieRackAffinityMapping.java
@@ -19,7 +19,7 @@
 package org.apache.pulsar.zookeeper;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
-
+import com.google.common.base.Strings;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.util.ArrayList;
@@ -28,7 +28,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import java.util.concurrent.TimeUnit;
-
 import org.apache.bookkeeper.client.ITopologyAwareEnsemblePlacementPolicy;
 import org.apache.bookkeeper.client.RackChangeNotifier;
 import org.apache.bookkeeper.conf.ClientConfiguration;
@@ -197,7 +196,9 @@ public class ZkBookieRackAffinityMapping extends 
AbstractDNSToSwitchMapping
             }
         }
 
-        if (bi != null) {
+        if (bi != null
+                && !Strings.isNullOrEmpty(bi.getRack())
+                && !bi.getRack().trim().equals("/")) {
             String rack = bi.getRack();
             if (!rack.startsWith("/")) {
                 rack = "/" + rack;
diff --git 
a/pulsar-zookeeper-utils/src/test/java/org/apache/pulsar/zookeeper/ZkBookieRackAffinityMappingTest.java
 
b/pulsar-zookeeper-utils/src/test/java/org/apache/pulsar/zookeeper/ZkBookieRackAffinityMappingTest.java
index dd972cbfc1a..7858ff2d2d8 100644
--- 
a/pulsar-zookeeper-utils/src/test/java/org/apache/pulsar/zookeeper/ZkBookieRackAffinityMappingTest.java
+++ 
b/pulsar-zookeeper-utils/src/test/java/org/apache/pulsar/zookeeper/ZkBookieRackAffinityMappingTest.java
@@ -19,14 +19,12 @@
 package org.apache.pulsar.zookeeper;
 
 import static org.testng.Assert.assertEquals;
-
+import static org.testng.AssertJUnit.assertNull;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.collect.Lists;
-
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-
 import org.apache.bookkeeper.conf.ClientConfiguration;
 import org.apache.bookkeeper.net.BookieSocketAddress;
 import org.apache.bookkeeper.util.ZkUtils;
@@ -101,6 +99,29 @@ public class ZkBookieRackAffinityMappingTest {
         localZkc.delete(ZkBookieRackAffinityMapping.BOOKIE_INFO_ROOT_PATH, -1);
     }
 
+    @Test
+    public void testInvalidRackName() throws Exception {
+        String data = "{\"group1\": {\"" + BOOKIE1
+                + "\": {\"rack\": \"/\", \"hostname\": 
\"bookie1.example.com\"}, \"" + BOOKIE2
+                + "\": {\"rack\": \"\", \"hostname\": 
\"bookie2.example.com\"}}}";
+
+        ZkUtils.createFullPathOptimistic(localZkc, 
ZkBookieRackAffinityMapping.BOOKIE_INFO_ROOT_PATH, data.getBytes(),
+                ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
+
+        // Case1: ZKCache is given
+        ZkBookieRackAffinityMapping mapping1 = new 
ZkBookieRackAffinityMapping();
+        ClientConfiguration bkClientConf1 = new ClientConfiguration();
+        bkClientConf1.setProperty(ZooKeeperCache.ZK_CACHE_INSTANCE, new 
ZooKeeperCache("test", localZkc, 30) {
+        });
+        mapping1.setConf(bkClientConf1);
+        List<String> racks1 = mapping1
+                .resolve(Lists.newArrayList(BOOKIE1.getHostName(), 
BOOKIE2.getHostName(), BOOKIE3.getHostName()));
+
+        assertNull(racks1.get(0));
+        assertNull(racks1.get(1));
+        assertNull(racks1.get(2));
+    }
+
     @Test
     public void testNoBookieInfo() throws Exception {
         ZkBookieRackAffinityMapping mapping = new 
ZkBookieRackAffinityMapping();

Reply via email to