This is an automated email from the ASF dual-hosted git repository.
dahn pushed a commit to branch 4.20
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/4.20 by this push:
new 23de6c7db4d Fix update resource count failure for domains (#11138)
23de6c7db4d is described below
commit 23de6c7db4db4f63c95b9f7a95aae1576cc0b583
Author: Pearl Dsilva <[email protected]>
AuthorDate: Fri Jul 18 16:35:38 2025 -0400
Fix update resource count failure for domains (#11138)
---
.../resourcelimit/ResourceLimitManagerImpl.java | 110 ++++++++++-----------
1 file changed, 52 insertions(+), 58 deletions(-)
diff --git
a/server/src/main/java/com/cloud/resourcelimit/ResourceLimitManagerImpl.java
b/server/src/main/java/com/cloud/resourcelimit/ResourceLimitManagerImpl.java
index 4a2702eb76d..85cca63546c 100644
--- a/server/src/main/java/com/cloud/resourcelimit/ResourceLimitManagerImpl.java
+++ b/server/src/main/java/com/cloud/resourcelimit/ResourceLimitManagerImpl.java
@@ -139,6 +139,7 @@ import com.cloud.vm.dao.VMInstanceDao;
@Component
public class ResourceLimitManagerImpl extends ManagerBase implements
ResourceLimitService, Configurable {
+ public static final String CHECKING_IF = "Checking if {}";
@Inject
private AccountManager _accountMgr;
@Inject
@@ -164,8 +165,6 @@ public class ResourceLimitManagerImpl extends ManagerBase
implements ResourceLim
@Inject
private ResourceLimitDao _resourceLimitDao;
@Inject
- private ResourceLimitService resourceLimitService;
- @Inject
private ReservationDao reservationDao;
@Inject
protected SnapshotDao _snapshotDao;
@@ -330,7 +329,7 @@ public class ResourceLimitManagerImpl extends ManagerBase
implements ResourceLim
return;
}
- final long numToIncrement = (delta.length == 0) ? 1 :
delta[0].longValue();
+ final long numToIncrement = (delta.length == 0) ? 1 : delta[0];
removeResourceReservationIfNeededAndIncrementResourceCount(accountId,
type, tag, numToIncrement);
}
@@ -346,7 +345,7 @@ public class ResourceLimitManagerImpl extends ManagerBase
implements ResourceLim
logger.trace("Not decrementing resource count for system accounts,
returning");
return;
}
- long numToDecrement = (delta.length == 0) ? 1 : delta[0].longValue();
+ long numToDecrement = (delta.length == 0) ? 1 : delta[0];
if (!updateResourceCountForAccount(accountId, type, tag, false,
numToDecrement)) {
_alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_UPDATE_RESOURCE_COUNT,
0L, 0L, "Failed to decrement resource count of type " + type + " for account
id=" + accountId,
@@ -373,11 +372,11 @@ public class ResourceLimitManagerImpl extends ManagerBase
implements ResourceLim
// Check if limit is configured for account
if (limit != null) {
- max = limit.getMax().longValue();
+ max = limit.getMax();
} else {
String resourceTypeName = type.name();
// If the account has an no limit set, then return global default
account limits
- Long value = null;
+ Long value;
if (account.getType() == Account.Type.PROJECT) {
value = projectResourceLimitMap.get(resourceTypeName);
} else {
@@ -418,10 +417,10 @@ public class ResourceLimitManagerImpl extends ManagerBase
implements ResourceLim
// Check if limit is configured for account
if (limit != null) {
- max = limit.longValue();
+ max = limit;
} else {
// If the account has an no limit set, then return global default
account limits
- Long value = null;
+ Long value;
if (account.getType() == Account.Type.PROJECT) {
value = projectResourceLimitMap.get(type.getName());
} else {
@@ -453,7 +452,7 @@ public class ResourceLimitManagerImpl extends ManagerBase
implements ResourceLim
ResourceLimitVO limit =
_resourceLimitDao.findByOwnerIdAndTypeAndTag(domain.getId(),
ResourceOwnerType.Domain, type, tag);
if (limit != null) {
- max = limit.getMax().longValue();
+ max = limit.getMax();
} else {
// check domain hierarchy
Long domainId = domain.getParent();
@@ -467,12 +466,12 @@ public class ResourceLimitManagerImpl extends ManagerBase
implements ResourceLim
}
if (limit != null) {
- max = limit.getMax().longValue();
+ max = limit.getMax();
} else {
if (StringUtils.isNotEmpty(tag)) {
return findCorrectResourceLimitForDomain(domain, type,
null);
}
- Long value = null;
+ Long value;
value = domainResourceLimitMap.get(type.name());
if (value != null) {
if (value < 0) { // return unlimit if value is set to
negative
@@ -491,7 +490,7 @@ public class ResourceLimitManagerImpl extends ManagerBase
implements ResourceLim
protected void checkDomainResourceLimit(final Account account, final
Project project, final ResourceType type, String tag, long numResources) throws
ResourceAllocationException {
// check all domains in the account's domain hierarchy
- Long domainId = null;
+ Long domainId;
if (project != null) {
domainId = project.getDomainId();
} else {
@@ -530,9 +529,7 @@ public class ResourceLimitManagerImpl extends ManagerBase
implements ResourceLim
convCurrentDomainResourceCount,
convCurrentResourceReservation, convNumResources
);
- if (logger.isDebugEnabled()) {
- logger.debug("Checking if" + messageSuffix);
- }
+ logger.debug(CHECKING_IF, messageSuffix);
if (domainResourceLimit != Resource.RESOURCE_UNLIMITED &&
requestedDomainResourceCount > domainResourceLimit) {
String message = "Maximum" + messageSuffix;
@@ -571,9 +568,7 @@ public class ResourceLimitManagerImpl extends ManagerBase
implements ResourceLim
convertedAccountResourceLimit, convertedCurrentResourceCount,
convertedCurrentResourceReservation, convertedNumResources
);
- if (logger.isDebugEnabled()) {
- logger.debug("Checking if" + messageSuffix);
- }
+ logger.debug(CHECKING_IF, messageSuffix);
if (accountResourceLimit != Resource.RESOURCE_UNLIMITED &&
requestedResourceCount > accountResourceLimit) {
String message = "Maximum" + messageSuffix;
@@ -592,14 +587,14 @@ public class ResourceLimitManagerImpl extends ManagerBase
implements ResourceLim
@Override
public long findDefaultResourceLimitForDomain(ResourceType resourceType) {
- Long resourceLimit = null;
+ Long resourceLimit;
resourceLimit = domainResourceLimitMap.get(resourceType.getName());
if (resourceLimit != null && (resourceType ==
ResourceType.primary_storage || resourceType ==
ResourceType.secondary_storage)) {
if (!
Long.valueOf(Resource.RESOURCE_UNLIMITED).equals(resourceLimit)) {
resourceLimit = resourceLimit * ResourceType.bytesToGiB;
}
} else {
- resourceLimit = Long.valueOf(Resource.RESOURCE_UNLIMITED);
+ resourceLimit = (long) Resource.RESOURCE_UNLIMITED;
}
return resourceLimit;
}
@@ -677,8 +672,8 @@ public class ResourceLimitManagerImpl extends ManagerBase
implements ResourceLim
@Override
public List<ResourceLimitVO> searchForLimits(Long id, Long accountId, Long
domainId, ResourceType resourceType, String tag, Long startIndex, Long
pageSizeVal) {
Account caller = CallContext.current().getCallingAccount();
- List<ResourceLimitVO> limits = new ArrayList<ResourceLimitVO>();
- boolean isAccount = true;
+ List<ResourceLimitVO> limits = new ArrayList<>();
+ boolean isAccount;
if (!_accountMgr.isAdmin(caller.getId())) {
accountId = caller.getId();
@@ -770,7 +765,7 @@ public class ResourceLimitManagerImpl extends ManagerBase
implements ResourceLim
if (foundLimits.isEmpty()) {
ResourceOwnerType ownerType = ResourceOwnerType.Domain;
Long ownerId = domainId;
- long max = 0;
+ long max;
if (isAccount) {
ownerType = ResourceOwnerType.Account;
ownerId = accountId;
@@ -788,8 +783,8 @@ public class ResourceLimitManagerImpl extends ManagerBase
implements ResourceLim
// see if any limits are missing from the table, and if yes - get
it from the config table and add
ResourceType[] resourceTypes = ResourceCount.ResourceType.values();
if (foundLimits.size() != resourceTypes.length) {
- List<String> accountLimitStr = new ArrayList<String>();
- List<String> domainLimitStr = new ArrayList<String>();
+ List<String> accountLimitStr = new ArrayList<>();
+ List<String> domainLimitStr = new ArrayList<>();
for (ResourceLimitVO foundLimit : foundLimits) {
if (foundLimit.getAccountId() != null) {
accountLimitStr.add(foundLimit.getType().toString());
@@ -883,8 +878,8 @@ public class ResourceLimitManagerImpl extends ManagerBase
implements ResourceLim
Account caller = CallContext.current().getCallingAccount();
if (max == null) {
- max = new Long(Resource.RESOURCE_UNLIMITED);
- } else if (max.longValue() < Resource.RESOURCE_UNLIMITED) {
+ max = (long)Resource.RESOURCE_UNLIMITED;
+ } else if (max < Resource.RESOURCE_UNLIMITED) {
throw new InvalidParameterValueException("Please specify either
'-1' for an infinite limit, or a limit that is at least '0'.");
}
@@ -892,7 +887,7 @@ public class ResourceLimitManagerImpl extends ManagerBase
implements ResourceLim
ResourceType resourceType = null;
if (typeId != null) {
for (ResourceType type : Resource.ResourceType.values()) {
- if (type.getOrdinal() == typeId.intValue()) {
+ if (type.getOrdinal() == typeId) {
resourceType = type;
}
}
@@ -929,7 +924,7 @@ public class ResourceLimitManagerImpl extends ManagerBase
implements ResourceLim
throw new InvalidParameterValueException("Only " +
Resource.RESOURCE_UNLIMITED + " limit is supported for Root Admin accounts");
}
- if ((caller.getAccountId() == accountId.longValue()) &&
(_accountMgr.isDomainAdmin(caller.getId()) || caller.getType() ==
Account.Type.RESOURCE_DOMAIN_ADMIN)) {
+ if ((caller.getAccountId() == accountId) &&
(_accountMgr.isDomainAdmin(caller.getId()) || caller.getType() ==
Account.Type.RESOURCE_DOMAIN_ADMIN)) {
// If the admin is trying to update their own account,
disallow.
throw new PermissionDeniedException(String.format("Unable to
update resource limit for their own account %s, permission denied", account));
}
@@ -955,12 +950,12 @@ public class ResourceLimitManagerImpl extends ManagerBase
implements ResourceLim
_accountMgr.checkAccess(caller, domain);
- if (Domain.ROOT_DOMAIN == domainId.longValue()) {
+ if (Domain.ROOT_DOMAIN == domainId) {
// no one can add limits on ROOT domain, disallow...
throw new PermissionDeniedException("Cannot update resource
limit for ROOT domain " + domainId + ", permission denied");
}
- if ((caller.getDomainId() == domainId.longValue()) &&
caller.getType() == Account.Type.DOMAIN_ADMIN || caller.getType() ==
Account.Type.RESOURCE_DOMAIN_ADMIN) {
+ if ((caller.getDomainId() == domainId) && caller.getType() ==
Account.Type.DOMAIN_ADMIN || caller.getType() ==
Account.Type.RESOURCE_DOMAIN_ADMIN) {
// if the admin is trying to update their own domain,
disallow...
throw new PermissionDeniedException("Unable to update resource
limit for domain " + domainId + ", permission denied");
}
@@ -975,7 +970,7 @@ public class ResourceLimitManagerImpl extends ManagerBase
implements ResourceLim
if (parentDomainId != null) {
DomainVO parentDomain = _domainDao.findById(parentDomainId);
long parentMaximum =
findCorrectResourceLimitForDomain(parentDomain, resourceType, tag);
- if ((parentMaximum >= 0) && (max.longValue() > parentMaximum))
{
+ if ((parentMaximum >= 0) && (max > parentMaximum)) {
throw new
InvalidParameterValueException(String.format("Domain %s has maximum allowed
resource limit %d for %s, please specify a value less than or equal to %d",
parentDomain, parentMaximum, resourceType, parentMaximum));
}
}
@@ -1064,15 +1059,15 @@ public class ResourceLimitManagerImpl extends
ManagerBase implements ResourceLim
@Override
public List<? extends ResourceCount> recalculateResourceCount(Long
accountId, Long domainId, Integer typeId, String tag) throws
CloudRuntimeException {
Account callerAccount = CallContext.current().getCallingAccount();
- long count = 0;
- List<ResourceCountVO> counts = new ArrayList<ResourceCountVO>();
- List<ResourceType> resourceTypes = new ArrayList<ResourceType>();
+ long count;
+ List<ResourceCountVO> counts = new ArrayList<>();
+ List<ResourceType> resourceTypes = new ArrayList<>();
ResourceType resourceType = null;
if (typeId != null) {
for (ResourceType type : Resource.ResourceType.values()) {
- if (type.getOrdinal() == typeId.intValue()) {
+ if (type.getOrdinal() == typeId) {
resourceType = type;
}
}
@@ -1091,12 +1086,13 @@ public class ResourceLimitManagerImpl extends
ManagerBase implements ResourceLim
throw new InvalidParameterValueException("Please specify a valid
domain ID.");
}
_accountMgr.checkAccess(callerAccount, domain);
- Account account = _entityMgr.findById(Account.class, accountId);
- if (account == null) {
- throw new InvalidParameterValueException("Unable to find account "
+ accountId);
+ if (accountId != null) {
+ Account account = _entityMgr.findById(Account.class, accountId);
+ if (account == null) {
+ throw new InvalidParameterValueException("Unable to find
account " + accountId);
+ }
+
_accountMgr.verifyCallerPrivilegeForUserOrAccountOperations(account);
}
- _accountMgr.verifyCallerPrivilegeForUserOrAccountOperations(account);
-
if (resourceType != null) {
resourceTypes.add(resourceType);
} else {
@@ -1145,7 +1141,7 @@ public class ResourceLimitManagerImpl extends ManagerBase
implements ResourceLim
convertedDelta = toHumanReadableSize(delta);
}
String typeStr = StringUtils.isNotEmpty(tag) ? String.format("%s
(tag: %s)", type, tag) : type.getName();
- logger.debug("Updating resource Type = " + typeStr + " count for
Account = " + accountId + " Operation = " + (increment ? "increasing" :
"decreasing") + " Amount = " + convertedDelta);
+ logger.debug("Updating resource Type = {} count for Account with
id = {} Operation = {} Amount = {}", typeStr, accountId, (increment ?
"increasing" : "decreasing"), convertedDelta);
}
Set<Long> rowIdsToUpdate =
_resourceCountDao.listAllRowsToUpdate(accountId, ResourceOwnerType.Account,
type, tag);
return _resourceCountDao.updateCountByDeltaForIds(new
ArrayList<>(rowIdsToUpdate), increment, delta);
@@ -1200,6 +1196,7 @@ public class ResourceLimitManagerImpl extends ManagerBase
implements ResourceLim
newResourceCount +=
_projectDao.countProjectsForDomain(domainId);
}
+ // TODO make sure that the resource counts are not null
for (ResourceCountVO resourceCount : resourceCounts) {
if (resourceCount.getResourceOwnerType() ==
ResourceOwnerType.Domain && resourceCount.getDomainId() == domainId) {
oldResourceCount = resourceCount.getCount();
@@ -1209,11 +1206,12 @@ public class ResourceLimitManagerImpl extends
ManagerBase implements ResourceLim
}
}
+ // TODO domainRC may be null if there are no resource counts for
the domain found in the loop above
if (oldResourceCount != newResourceCount) {
domainRC.setCount(newResourceCount);
_resourceCountDao.update(domainRC.getId(), domainRC);
- logger.warn("Discrepency in the resource count has been
detected " + "(original count = " + oldResourceCount + " correct count = " +
newResourceCount + ") for Type = " + type
- + " for Domain ID = " + domainId + " is fixed during
resource count recalculation.");
+ logger.warn("Discrepency in the resource count has been
detected (original count = {} correct count = {}) for Type = {} for Domain ID =
{} is fixed during resource count recalculation.",
+ oldResourceCount, newResourceCount, type, domainId);
}
return newResourceCount;
});
@@ -1280,8 +1278,8 @@ public class ResourceLimitManagerImpl extends ManagerBase
implements ResourceLim
// resource count which will not lead to any discrepancy.
if (newCount != null && !newCount.equals(oldCount) &&
type != Resource.ResourceType.primary_storage && type !=
Resource.ResourceType.secondary_storage) {
- logger.warn("Discrepancy in the resource count " + "(original
count=" + oldCount + " correct count = " + newCount + ") for type " + type +
- " for account ID " + accountId + " is fixed during
resource count recalculation.");
+ logger.warn("Discrepancy in the resource count (original count={}
correct count = {}) for type {} for account ID {} is fixed during resource
count recalculation.",
+ oldCount, newCount, type, accountId);
}
return (newCount == null) ? 0 : newCount;
@@ -1425,20 +1423,16 @@ public class ResourceLimitManagerImpl extends
ManagerBase implements ResourceLim
}
private long calculatePublicIpForAccount(long accountId) {
- Long dedicatedCount = 0L;
- Long allocatedCount = 0L;
+ long dedicatedCount = 0L;
+ long allocatedCount;
List<VlanVO> dedicatedVlans = _vlanDao.listDedicatedVlans(accountId);
for (VlanVO dedicatedVlan : dedicatedVlans) {
List<IPAddressVO> ips =
_ipAddressDao.listByVlanId(dedicatedVlan.getId());
- dedicatedCount += new Long(ips.size());
+ dedicatedCount += ips.size();
}
allocatedCount = _ipAddressDao.countAllocatedIPsForAccount(accountId);
- if (dedicatedCount > allocatedCount) {
- return dedicatedCount;
- } else {
- return allocatedCount;
- }
+ return Math.max(dedicatedCount, allocatedCount);
}
protected long calculatePrimaryStorageForAccount(long accountId, String
tag) {
@@ -1526,10 +1520,10 @@ public class ResourceLimitManagerImpl extends
ManagerBase implements ResourceLim
protected TaggedResourceLimitAndCountResponse
getTaggedResourceLimitAndCountResponse(Account account,
Domain domain, ResourceOwnerType ownerType, ResourceType type, String
tag) {
- Long limit = ResourceOwnerType.Account.equals(ownerType) ?
+ long limit = ResourceOwnerType.Account.equals(ownerType) ?
findCorrectResourceLimitForAccount(account, type, tag) :
findCorrectResourceLimitForDomain(domain, type, tag);
- Long count = 0L;
+ long count = 0L;
ResourceCountVO countVO = _resourceCountDao.findByOwnerAndTypeAndTag(
ResourceOwnerType.Account.equals(ownerType) ? account.getId()
: domain.getId(), ownerType, type, tag);
if (countVO != null) {
@@ -1778,7 +1772,7 @@ public class ResourceLimitManagerImpl extends ManagerBase
implements ResourceLim
if (currentOfferingTags.isEmpty() && newOfferingTags.isEmpty()) {
return null;
}
- Set<String> sameTags =
currentOfferingTags.stream().filter(newOfferingTags::contains).collect(Collectors.toSet());;
+ Set<String> sameTags =
currentOfferingTags.stream().filter(newOfferingTags::contains).collect(Collectors.toSet());
Set<String> newTags = newOfferingTags.stream().filter(tag ->
!currentOfferingTags.contains(tag)).collect(Collectors.toSet());
Set<String> removedTags = currentOfferingTags.stream().filter(tag ->
!newOfferingTags.contains(tag)).collect(Collectors.toSet());
return new Ternary<>(sameTags, newTags, removedTags);
@@ -1849,7 +1843,7 @@ public class ResourceLimitManagerImpl extends ManagerBase
implements ResourceLim
if (currentOfferingTags.isEmpty() && newOfferingTags.isEmpty()) {
return null;
}
- Set<String> sameTags =
currentOfferingTags.stream().filter(newOfferingTags::contains).collect(Collectors.toSet());;
+ Set<String> sameTags =
currentOfferingTags.stream().filter(newOfferingTags::contains).collect(Collectors.toSet());
Set<String> newTags = newOfferingTags.stream().filter(tag ->
!currentOfferingTags.contains(tag)).collect(Collectors.toSet());
Set<String> removedTags = currentOfferingTags.stream().filter(tag ->
!newOfferingTags.contains(tag)).collect(Collectors.toSet());
return new Ternary<>(sameTags, newTags, removedTags);