From bec9115a617ecac27e5b5785c8e838a535764f7d Mon Sep 17 00:00:00 2001 From: Rajani Karuturi Date: Thu, 3 Nov 2016 10:52:44 +0530 Subject: [PATCH] CLOUDSTACK-8896: allocated percentage of storage pool going beyond 100% This issue occurs when a volume in Ready state is moved across storage pools. While finding if the storage pool has enough space, it has a check to consider the size of non Ready volumes only. This is true if the volume to be attached to a vm is in the same storage pool. But, if the volume is in another storage pool and has to be moved to a vm's storage pool, the size of the volume should be considered in doing the space check. computing the asking size when volume is not in ready state or when the volume is on a different storage pool. --- .../src/com/cloud/storage/StorageManagerImpl.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index c0dda25bf00..a5ffbb0b3b7 100644 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -1719,6 +1719,9 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C } // allocated space includes templates + if(s_logger.isDebugEnabled()) { + s_logger.debug("Destination pool id: " + pool.getId()); + } StoragePoolVO poolVO = _storagePoolDao.findById(pool.getId()); long allocatedSizeWithTemplate = _capacityMgr.getAllocatedPoolCapacity(poolVO, null); long totalAskingSize = 0; @@ -1746,10 +1749,12 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C allocatedSizeWithTemplate = _capacityMgr.getAllocatedPoolCapacity(poolVO, tmpl); } } - - if (volumeVO.getState() != Volume.State.Ready) { - totalAskingSize += getDataObjectSizeIncludingHypervisorSnapshotReserve(volumeVO, pool); - + // A ready state volume is already allocated in a pool. so the asking size is zero for it. + // In case the volume is moving across pools or is not ready yet, the asking size has to be computed + if (s_logger.isDebugEnabled()) { + s_logger.debug("pool id for the volume with id: " + volumeVO.getId() + " is " + volumeVO.getPoolId()); + } + if ((volumeVO.getState() != Volume.State.Ready) || (volumeVO.getPoolId() != pool.getId())) { if (ScopeType.ZONE.equals(poolVO.getScope()) && volumeVO.getTemplateId() != null) { VMTemplateVO tmpl = _templateDao.findByIdIncludingRemoved(volumeVO.getTemplateId());