From c9548e37885bee6abf62c515c910fe29f9fcd7c6 Mon Sep 17 00:00:00 2001 From: Sanjay Tripathi Date: Fri, 12 Jul 2013 14:11:36 +0530 Subject: [PATCH] CLOUDSTACK-3376: NPE: resource count calculation from the account manager on account cleanup This issue is happing because of the steps the code follow to cleanup the account. The cleanupAccount was deleting the entries from the resource_limit and resource_count table and performing further cleaning afterwards. Ideally, deletion of entries from resourceLimit and resourceCount should be the last step in cleanupAccount process. Signed-off-by: Prasanna Santhanam (cherry picked from commit 21b1c9449a1289db9fa92c2ec76a936006100ab3) --- .../com/cloud/user/AccountManagerImpl.java | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/server/src/com/cloud/user/AccountManagerImpl.java b/server/src/com/cloud/user/AccountManagerImpl.java index 283e832529c..0f4bdcdec29 100755 --- a/server/src/com/cloud/user/AccountManagerImpl.java +++ b/server/src/com/cloud/user/AccountManagerImpl.java @@ -732,16 +732,6 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M int vlansReleased = _accountGuestVlanMapDao.removeByAccountId(accountId); s_logger.info("deleteAccount: Released " + vlansReleased + " dedicated guest vlan ranges from account " + accountId); - // Update resource count for this account and for parent domains. - List resourceCounts = _resourceCountDao.listByOwnerId(accountId, ResourceOwnerType.Account); - for (ResourceCountVO resourceCount : resourceCounts) { - _resourceLimitMgr.decrementResourceCount(accountId, resourceCount.getType(), resourceCount.getCount()); - } - - // Delete resource count and resource limits entries set for this account (if there are any). - _resourceCountDao.removeEntriesByOwner(accountId, ResourceOwnerType.Account); - _resourceLimitDao.removeEntriesByOwner(accountId, ResourceOwnerType.Account); - // release account specific acquired portable IP's. Since all the portable IP's must have been already // disassociated with VPC/guest network (due to deletion), so just mark portable IP as free. List portableIpsToRelease = _ipAddressDao.listByAccount(accountId); @@ -759,6 +749,17 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M } } } + + // Updating and deleting the resourceLimit and resourceCount should be the last step in cleanupAccount process. + // Update resource count for this account and for parent domains. + List resourceCounts = _resourceCountDao.listByOwnerId(accountId, ResourceOwnerType.Account); + for (ResourceCountVO resourceCount : resourceCounts) { + _resourceLimitMgr.decrementResourceCount(accountId, resourceCount.getType(), resourceCount.getCount()); + } + + // Delete resource count and resource limits entries set for this account (if there are any). + _resourceCountDao.removeEntriesByOwner(accountId, ResourceOwnerType.Account); + _resourceLimitDao.removeEntriesByOwner(accountId, ResourceOwnerType.Account); return true; } catch (Exception ex) { s_logger.warn("Failed to cleanup account " + account + " due to ", ex);