This is an automated email from the ASF dual-hosted git repository.
penghui pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pulsar.git
The following commit(s) were added to refs/heads/master by this push:
new 1668c072a23 [fix][broker] Fix Npe thrown by splitBundle (#17370)
1668c072a23 is described below
commit 1668c072a235ff7b87c88c7781beab09dc2742d1
Author: gaozhangmin <[email protected]>
AuthorDate: Thu Sep 1 20:27:09 2022 +0800
[fix][broker] Fix Npe thrown by splitBundle (#17370)
---
.../pulsar/broker/admin/impl/NamespacesBase.java | 13 +++++++++++--
.../broker/namespace/NamespaceServiceTest.java | 21 +++++++++++++++++++++
2 files changed, 32 insertions(+), 2 deletions(-)
diff --git
a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/NamespacesBase.java
b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/NamespacesBase.java
index 0b25599c126..411ab11ce4e 100644
---
a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/NamespacesBase.java
+++
b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/NamespacesBase.java
@@ -1158,6 +1158,10 @@ public abstract class NamespacesBase extends
AdminResource {
.thenCompose(__ -> getNamespacePoliciesAsync(namespaceName))
.thenCompose(policies->{
String bundleRange = getBundleRange(bundleName);
+ if (bundleRange == null) {
+ throw new RestException(Status.NOT_FOUND,
+ String.format("Bundle range %s not found",
bundleName));
+ }
return
validateNamespaceBundleOwnershipAsync(namespaceName, policies.bundles,
bundleRange,
authoritative, false)
.thenCompose(nsBundle ->
pulsar().getNamespaceService().splitAndOwnBundle(nsBundle, unload,
@@ -1216,13 +1220,18 @@ public abstract class NamespacesBase extends
AdminResource {
}
private String getBundleRange(String bundleName) {
+ NamespaceBundle nsBundle;
if (BundleType.LARGEST.toString().equals(bundleName)) {
- return findLargestBundleWithTopics(namespaceName).getBundleRange();
+ nsBundle = findLargestBundleWithTopics(namespaceName);
} else if (BundleType.HOT.toString().equals(bundleName)) {
- return findHotBundle(namespaceName).getBundleRange();
+ nsBundle = findHotBundle(namespaceName);
} else {
return bundleName;
}
+ if (nsBundle == null) {
+ return null;
+ }
+ return nsBundle.getBundleRange();
}
private NamespaceBundle findLargestBundleWithTopics(NamespaceName
namespaceName) {
diff --git
a/pulsar-broker/src/test/java/org/apache/pulsar/broker/namespace/NamespaceServiceTest.java
b/pulsar-broker/src/test/java/org/apache/pulsar/broker/namespace/NamespaceServiceTest.java
index 9f03c026225..cd615f6a0ec 100644
---
a/pulsar-broker/src/test/java/org/apache/pulsar/broker/namespace/NamespaceServiceTest.java
+++
b/pulsar-broker/src/test/java/org/apache/pulsar/broker/namespace/NamespaceServiceTest.java
@@ -59,6 +59,7 @@ import org.apache.pulsar.broker.lookup.LookupResult;
import org.apache.pulsar.broker.service.BrokerTestBase;
import org.apache.pulsar.broker.service.Topic;
import org.apache.pulsar.broker.service.persistent.PersistentTopic;
+import org.apache.pulsar.client.admin.PulsarAdminException;
import org.apache.pulsar.client.api.Consumer;
import org.apache.pulsar.client.api.PulsarClient;
@@ -595,6 +596,26 @@ public class NamespaceServiceTest extends BrokerTestBase {
}
}
+ public void testSplitBUndleWithNoBundle() throws Exception {
+ conf.setLoadManagerClassName(ModularLoadManagerImpl.class.getName());
+ restartBroker();
+ String namespace = "prop/test/ns-abc2";
+
+ BundlesData bundleData = BundlesData.builder().numBundles(10).build();
+ admin.namespaces().createNamespace(namespace, bundleData);
+
+ NamespaceService namespaceService = pulsar.getNamespaceService();
+ NamespaceName nsname = NamespaceName.get(namespace);
+ NamespaceBundles bundles =
namespaceService.getNamespaceBundleFactory().getBundles(nsname);
+
+ try {
+ admin.namespaces().splitNamespaceBundle(namespace,
Policies.BundleType.HOT.toString(), false, null);
+ fail("should have failed.");
+ } catch (Exception ex) {
+ Assert.assertEquals(404, ((PulsarAdminException)
ex).getStatusCode());
+ Assert.assertEquals("Bundle range HOT not found", ex.getMessage());
+ }
+ }
/**
* Test bundle split with hot bundle which is serving highest load.
*