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();