apache / apache/pulsar

ResourceGroupConfigListener and ResourceGroupNamespaceConfigListener has an cocurrent bug at startrup

Open
#15,113 2 comments 0 reactions 1 assignee Claimed by @leizhiyuan View on GitHub
lifecycle/stale Stale type/bug
Dominant language
Java
Stars
15.3k
Forks
3.8k
Avg merge
1d 14h
Merged PRs (30d)
160

Description

**Describe the bug**
A clear and concise description of what the bug is.

```
public ResourceGroupConfigListener(ResourceGroupService rgService, PulsarService pulsarService) {
this.rgService = rgService;
this.pulsarService = pulsarService;
this.rgResources = pulsarService.getPulsarResources().getResourcegroupResources();
loadAllResourceGroups(); // THIS IS ASYNC 1
this.rgResources.getStore().registerListener(this);
rgNamespaceConfigListener = new ResourceGroupNamespaceConfigListener(
rgService, pulsarService, this);
}
```

loadAllResourceGroups(); // THIS IS ASYNC 1
add invoke
resourceGroupsMap.put(rgName, rg);

```
public ResourceGroupNamespaceConfigListener(ResourceGroupService rgService, PulsarService pulsarService,
ResourceGroupConfigListener rgConfigListener) {
this.rgService = rgService;
this.pulsarService = pulsarService;
this.namespaceResources = pulsarService.getPulsarResources().getNamespaceResources();
this.tenantResources = pulsarService.getPulsarResources().getTenantResources();
this.rgConfigListener = rgConfigListener;
loadAllNamespaceResourceGroups(); // THIS IS ASYNC 2
this.namespaceResources.getStore().registerListener(this);
}

```

loadAllNamespaceResourceGroups(); // THIS IS ASYNC 2

will invoke
rgService.registerNameSpace(policy.resource_group_name, ns);

then
```
private ResourceGroup checkResourceGroupExists(String rgName) throws PulsarAdminException {
ResourceGroup rg = this.getResourceGroupInternal(rgName);
if (rg == null) {
throw new PulsarAdminException("Resource group does not exist: " + rgName);
}
return rg;
}
```
inside
```
/**
* Get the RG with the given name. For internal operations only.
*/
private ResourceGroup getResourceGroupInternal(String resourceGroupName) {
if (resourceGroupName == null) {
throw new IllegalArgumentException("Invalid null resource group name: " + resourceGroupName);
}

return resourceGroupsMap.get(resourceGroupName);
}

```

if 2 run earlier than 1, it will occur error, if no namespace add/delete, it won't recover.

**To Reproduce**

review the code

**Expected behavior**
A clear and concise description of what you expected to happen.

maybe we need loadAllResourceGroups sync, or when it done, then loadAllNamespaceResourceGroups

**Screenshots**
If applicable, add screenshots to help explain your problem.

**Desktop (please complete the following information):**
- OS: [e.g. iOS]

**Additional context**
Add any other context about the problem here.
master branch

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.