You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by pe...@apache.org on 2022/06/12 11:28:51 UTC
[pulsar] branch branch-2.9 updated: [fix] [admin] [branch-2.9] fix reach max tenants error if the tenant already exists (#16007)
This is an automated email from the ASF dual-hosted git repository.
penghui pushed a commit to branch branch-2.9
in repository https://gitbox.apache.org/repos/asf/pulsar.git
The following commit(s) were added to refs/heads/branch-2.9 by this push:
new d7cb6a108c2 [fix] [admin] [branch-2.9] fix reach max tenants error if the tenant already exists (#16007)
d7cb6a108c2 is described below
commit d7cb6a108c237b664c1081044db3b4867eeb05c6
Author: fengyubiao <yu...@streamnative.io>
AuthorDate: Sun Jun 12 19:28:46 2022 +0800
[fix] [admin] [branch-2.9] fix reach max tenants error if the tenant already exists (#16007)
---
.../pulsar/broker/admin/impl/TenantsBase.java | 37 +++++++++++-----------
.../org/apache/pulsar/broker/admin/AdminTest.java | 33 +++++++++++++++++++
2 files changed, 51 insertions(+), 19 deletions(-)
diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/TenantsBase.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/TenantsBase.java
index 3ec725e6f80..29b46990ca4 100644
--- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/TenantsBase.java
+++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/TenantsBase.java
@@ -136,38 +136,37 @@ public class TenantsBase extends PulsarWebResource {
return;
}
- tenantResources().listTenantsAsync().whenComplete((tenants, e) -> {
- if (e != null) {
- log.error("[{}] Failed to create tenant ", clientAppId, e.getCause());
- asyncResponse.resume(new RestException(e));
+ tenantResources().tenantExistsAsync(tenant).thenAccept(exist -> {
+ if (exist) {
+ asyncResponse.resume(new RestException(Status.CONFLICT, "Tenant already exist"));
return;
}
-
- int maxTenants = pulsar().getConfiguration().getMaxTenants();
- // Due to the cost of distributed locks, no locks are added here.
- // In a concurrent scenario, the threshold will be exceeded.
- if (maxTenants > 0) {
- if (tenants != null && tenants.size() >= maxTenants) {
- asyncResponse.resume(
- new RestException(Status.PRECONDITION_FAILED, "Exceed the maximum number of tenants"));
+ tenantResources().listTenantsAsync().whenComplete((tenants, e) -> {
+ if (e != null) {
+ log.error("[{}] Failed to create tenant ", clientAppId, e.getCause());
+ asyncResponse.resume(new RestException(e));
return;
}
- }
- tenantResources().tenantExistsAsync(tenant).thenAccept(exist -> {
- if (exist) {
- asyncResponse.resume(new RestException(Status.CONFLICT, "Tenant already exist"));
- return;
+ int maxTenants = pulsar().getConfiguration().getMaxTenants();
+ // Due to the cost of distributed locks, no locks are added here.
+ // In a concurrent scenario, the threshold will be exceeded.
+ if (maxTenants > 0) {
+ if (tenants != null && tenants.size() >= maxTenants) {
+ asyncResponse.resume(
+ new RestException(Status.PRECONDITION_FAILED, "Exceed the maximum number of tenants"));
+ return;
+ }
}
tenantResources().createTenantAsync(tenant, tenantInfo).thenAccept((r) -> {
log.info("[{}] Created tenant {}", clientAppId(), tenant);
asyncResponse.resume(Response.noContent().build());
}).exceptionally(ex -> {
- log.error("[{}] Failed to create tenant {}", clientAppId, tenant, e);
+ log.error("[{}] Failed to create tenant {}", clientAppId, tenant, ex);
asyncResponse.resume(new RestException(ex));
return null;
});
}).exceptionally(ex -> {
- log.error("[{}] Failed to create tenant {}", clientAppId(), tenant, e);
+ log.error("[{}] Failed to create tenant {}", clientAppId(), tenant, ex);
asyncResponse.resume(new RestException(ex));
return null;
});
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminTest.java
index a2f04927de9..1e825d340c0 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminTest.java
@@ -124,6 +124,12 @@ public class AdminTest extends MockedPulsarServiceBaseTest {
super();
}
+ @Override
+ protected void doInitConf() throws Exception {
+ super.doInitConf();
+ conf.setMaxTenants(10);
+ }
+
@Override
@BeforeMethod
public void setup() throws Exception {
@@ -627,6 +633,33 @@ public class AdminTest extends MockedPulsarServiceBaseTest {
assertEquals(e.getResponse().getStatus(), Status.PRECONDITION_FAILED.getStatusCode());
}
+ // Check max tenant count
+ int maxTenants = pulsar.getConfiguration().getMaxTenants();
+ List<String> tenants = pulsar.getPulsarResources().getTenantResources().listTenants();
+
+ for(int tenantSize = tenants.size();tenantSize < maxTenants; tenantSize++ ){
+ final int tenantIndex = tenantSize;
+ Response obj = (Response)asynRequests(ctx ->
+ properties.createTenant(ctx, "test-tenant-" + tenantIndex, tenantInfo));
+ Assert.assertTrue(obj.getStatus() < 400 && obj.getStatus() >= 200);
+ }
+ try {
+ response = asynRequests(ctx ->
+ properties.createTenant(ctx, "test-tenant-" + maxTenants, tenantInfo));
+ fail("should have failed");
+ } catch (RestException e) {
+ assertEquals(e.getResponse().getStatus(), Status.PRECONDITION_FAILED.getStatusCode());
+ }
+
+ // Check creating existing property when tenant reach max count.
+ try {
+ response = asynRequests(ctx ->
+ properties.createTenant(ctx, "test-tenant-" + (maxTenants-1), tenantInfo));
+ fail("should have failed");
+ } catch (RestException e) {
+ assertEquals(e.getResponse().getStatus(), Status.CONFLICT.getStatusCode());
+ }
+
AsyncResponse response2 = mock(AsyncResponse.class);
namespaces.deleteNamespace(response2, "my-tenant", "use", "my-namespace", false, false);
ArgumentCaptor<Response> captor = ArgumentCaptor.forClass(Response.class);