From 4822fcae1369e14674559e65b6d83bc55ff85ef0 Mon Sep 17 00:00:00 2001 From: Murali Reddy Date: Wed, 6 Apr 2011 18:18:38 +0530 Subject: [PATCH] Bug 9273 - Count' in resource_count table has negative values Resolved Fixed --- server/src/com/cloud/user/AccountManagerImpl.java | 6 ++++-- server/src/com/cloud/vm/UserVmManagerImpl.java | 5 ++++- server/src/com/cloud/vm/VirtualMachineManagerImpl.java | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/server/src/com/cloud/user/AccountManagerImpl.java b/server/src/com/cloud/user/AccountManagerImpl.java index 0058207f04b..008370332eb 100755 --- a/server/src/com/cloud/user/AccountManagerImpl.java +++ b/server/src/com/cloud/user/AccountManagerImpl.java @@ -229,14 +229,16 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag if (m_resourceCountLock.lock(120)) { // 2 minutes try { - _resourceCountDao.updateAccountCount(accountId, type, false, numToDecrement); + assert ((_resourceCountDao.getAccountCount(accountId, type) - numToDecrement) >= 0) : "Resource counts can not be negative. Check where we skipped increment."; + _resourceCountDao.updateAccountCount(accountId, type, false, numToDecrement); // on a per-domain basis, decrement the count // FIXME: can this decrement be done on the database side in a custom update statement? Account account = _accountDao.findByIdIncludingRemoved(accountId); // find all accounts, even removed accounts if this happens to be for an account that's being deleted Long domainId = account.getDomainId(); while (domainId != null) { - _resourceCountDao.updateDomainCount(domainId, type, false, numToDecrement); + assert ((_resourceCountDao.getDomainCount(domainId, type) - numToDecrement) >= 0) : "Resource counts can not be negative. Check where we skipped increment."; + _resourceCountDao.updateDomainCount(domainId, type, false, numToDecrement); DomainVO domain = _domainDao.findById(domainId); domainId = domain.getParent(); } diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 7f9e098e02f..a93d725999e 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -2593,6 +2593,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager User caller = _userDao.findById(userId); boolean status; + State vmState = vm.getState(); try { status = _itMgr.destroy(vm, caller, account); } catch (OperationTimedoutException e) { @@ -2611,7 +2612,9 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager } UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_VM_DESTROY, vm.getAccountId(), vm.getDataCenterId(), vm.getId(), vm.getName()); _usageEventDao.persist(usageEvent); - _accountMgr.decrementResourceCount(vm.getAccountId(), ResourceType.user_vm); + if (vmState != State.Error) { + _accountMgr.decrementResourceCount(vm.getAccountId(), ResourceType.user_vm); + } return _vmDao.findById(vmId); } else { throw new CloudRuntimeException("Failed to destroy vm with id " + vmId); diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java index e8e6045b483..25b548276f9 100755 --- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -605,7 +605,6 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Listene } if (dest == null) { - _accountMgr.decrementResourceCount(vm.getAccountId(), ResourceType.user_vm); throw new InsufficientServerCapacityException("Unable to create a deployment for " + vmProfile, DataCenter.class, plan.getDataCenterId()); } @@ -693,6 +692,7 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Listene } } finally { if (startedVm == null) { + _accountMgr.decrementResourceCount(vm.getAccountId(), ResourceType.user_vm); changeState(vm, Event.OperationFailed, null, work, Step.Done); } }