mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
Merge remote-tracking branch 'origin/4.11'
Signed-off-by: Rohit Yadav <rohit.yadav@shapeblue.com>
This commit is contained in:
commit
c49807f8f4
@ -186,6 +186,8 @@ public interface StorageManager extends StorageService {
|
|||||||
*/
|
*/
|
||||||
boolean storagePoolHasEnoughSpace(List<Volume> volume, StoragePool pool, Long clusterId);
|
boolean storagePoolHasEnoughSpace(List<Volume> volume, StoragePool pool, Long clusterId);
|
||||||
|
|
||||||
|
boolean storagePoolHasEnoughSpaceForResize(StoragePool pool, long currentSize, long newSiz);
|
||||||
|
|
||||||
boolean registerHostListener(String providerUuid, HypervisorHostListener listener);
|
boolean registerHostListener(String providerUuid, HypervisorHostListener listener);
|
||||||
|
|
||||||
void connectHostToSharedPool(long hostId, long poolId) throws StorageUnavailableException, StorageConflictException;
|
void connectHostToSharedPool(long hostId, long poolId) throws StorageUnavailableException, StorageConflictException;
|
||||||
|
|||||||
@ -1790,8 +1790,8 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
|
|||||||
if (s_logger.isDebugEnabled()) {
|
if (s_logger.isDebugEnabled()) {
|
||||||
s_logger.debug("Destination pool id: " + pool.getId());
|
s_logger.debug("Destination pool id: " + pool.getId());
|
||||||
}
|
}
|
||||||
|
// allocated space includes templates
|
||||||
StoragePoolVO poolVO = _storagePoolDao.findById(pool.getId());
|
final StoragePoolVO poolVO = _storagePoolDao.findById(pool.getId());
|
||||||
long allocatedSizeWithTemplate = _capacityMgr.getAllocatedPoolCapacity(poolVO, null);
|
long allocatedSizeWithTemplate = _capacityMgr.getAllocatedPoolCapacity(poolVO, null);
|
||||||
long totalAskingSize = 0;
|
long totalAskingSize = 0;
|
||||||
|
|
||||||
@ -1832,6 +1832,32 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return checkPoolforSpace(pool, allocatedSizeWithTemplate, totalAskingSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean storagePoolHasEnoughSpaceForResize(StoragePool pool, long currentSize, long newSiz) {
|
||||||
|
if (!checkUsagedSpace(pool)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (s_logger.isDebugEnabled()) {
|
||||||
|
s_logger.debug("Destination pool id: " + pool.getId());
|
||||||
|
}
|
||||||
|
long totalAskingSize = newSiz - currentSize;
|
||||||
|
|
||||||
|
if (totalAskingSize <= 0) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
final StoragePoolVO poolVO = _storagePoolDao.findById(pool.getId());
|
||||||
|
final long allocatedSizeWithTemplate = _capacityMgr.getAllocatedPoolCapacity(poolVO, null);
|
||||||
|
return checkPoolforSpace(pool, allocatedSizeWithTemplate, totalAskingSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean checkPoolforSpace(StoragePool pool, long allocatedSizeWithTemplate, long totalAskingSize) {
|
||||||
|
// allocated space includes templates
|
||||||
|
StoragePoolVO poolVO = _storagePoolDao.findById(pool.getId());
|
||||||
|
|
||||||
long totalOverProvCapacity;
|
long totalOverProvCapacity;
|
||||||
|
|
||||||
if (pool.getPoolType().supportsOverProvisioning()) {
|
if (pool.getPoolType().supportsOverProvisioning()) {
|
||||||
@ -1852,16 +1878,16 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
|
|||||||
double storageAllocatedThreshold = CapacityManager.StorageAllocatedCapacityDisableThreshold.valueIn(pool.getDataCenterId());
|
double storageAllocatedThreshold = CapacityManager.StorageAllocatedCapacityDisableThreshold.valueIn(pool.getDataCenterId());
|
||||||
|
|
||||||
if (s_logger.isDebugEnabled()) {
|
if (s_logger.isDebugEnabled()) {
|
||||||
s_logger.debug("Checking pool with ID " + pool.getId() + " for volume allocation " + volumes.toString() + ", maxSize: " + totalOverProvCapacity + ", totalAllocatedSize: "
|
s_logger.debug("Checking pool: " + pool.getId() + " for storage allocation , maxSize : " + totalOverProvCapacity + ", totalAllocatedSize : " + allocatedSizeWithTemplate
|
||||||
+ allocatedSizeWithTemplate + ", askingSize: " + totalAskingSize + ", allocated disable threshold: " + storageAllocatedThreshold);
|
+ ", askingSize : " + totalAskingSize + ", allocated disable threshold: " + storageAllocatedThreshold);
|
||||||
}
|
}
|
||||||
|
|
||||||
double usedPercentage = (allocatedSizeWithTemplate + totalAskingSize) / (double)(totalOverProvCapacity);
|
double usedPercentage = (allocatedSizeWithTemplate + totalAskingSize) / (double)(totalOverProvCapacity);
|
||||||
|
|
||||||
if (usedPercentage > storageAllocatedThreshold) {
|
if (usedPercentage > storageAllocatedThreshold) {
|
||||||
if (s_logger.isDebugEnabled()) {
|
if (s_logger.isDebugEnabled()) {
|
||||||
s_logger.debug("Insufficient un-allocated capacity on the pool with ID " + pool.getId() + " for volume allocation: " + volumes.toString() + " since its allocated percentage "
|
s_logger.debug("Insufficient un-allocated capacity on: " + pool.getId() + " for storage allocation since its allocated percentage: " + usedPercentage
|
||||||
+ usedPercentage + " has crossed the allocated pool.storage.allocated.capacity.disablethreshold " + storageAllocatedThreshold + ", skipping this pool");
|
+ " has crossed the allocated pool.storage.allocated.capacity.disablethreshold: " + storageAllocatedThreshold + ", skipping this pool");
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@ -1869,8 +1895,8 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
|
|||||||
|
|
||||||
if (totalOverProvCapacity < (allocatedSizeWithTemplate + totalAskingSize)) {
|
if (totalOverProvCapacity < (allocatedSizeWithTemplate + totalAskingSize)) {
|
||||||
if (s_logger.isDebugEnabled()) {
|
if (s_logger.isDebugEnabled()) {
|
||||||
s_logger.debug("Insufficient un-allocated capacity on the pool with ID " + pool.getId() + " for volume allocation: " + volumes.toString() + "; not enough storage, maxSize: "
|
s_logger.debug("Insufficient un-allocated capacity on: " + pool.getId() + " for storage allocation, not enough storage, maxSize : " + totalOverProvCapacity
|
||||||
+ totalOverProvCapacity + ", totalAllocatedSize: " + allocatedSizeWithTemplate + ", askingSize: " + totalAskingSize);
|
+ ", totalAllocatedSize : " + allocatedSizeWithTemplate + ", askingSize : " + totalAskingSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@ -20,6 +20,7 @@ import java.net.MalformedURLException;
|
|||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -1136,6 +1137,11 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
|
|||||||
UserVmVO userVm = _userVmDao.findById(volume.getInstanceId());
|
UserVmVO userVm = _userVmDao.findById(volume.getInstanceId());
|
||||||
StoragePoolVO storagePool = _storagePoolDao.findById(volume.getPoolId());
|
StoragePoolVO storagePool = _storagePoolDao.findById(volume.getPoolId());
|
||||||
boolean isManaged = storagePool.isManaged();
|
boolean isManaged = storagePool.isManaged();
|
||||||
|
|
||||||
|
if (!storageMgr.storagePoolHasEnoughSpaceForResize(storagePool, currentSize, newSize)) {
|
||||||
|
throw new CloudRuntimeException("Storage pool " + storagePool.getName() + " does not have enough space to resize volume " + volume.getName());
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* get a list of hosts to send the commands to, try the system the
|
* get a list of hosts to send the commands to, try the system the
|
||||||
* associated vm is running on first, then the last known place it ran.
|
* associated vm is running on first, then the last known place it ran.
|
||||||
@ -2060,6 +2066,10 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
|
|||||||
throw new InvalidParameterValueException("Cannot migrate volume " + vol + "to the destination storage pool " + destPool.getName() + " as the storage pool is in maintenance mode.");
|
throw new InvalidParameterValueException("Cannot migrate volume " + vol + "to the destination storage pool " + destPool.getName() + " as the storage pool is in maintenance mode.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!storageMgr.storagePoolHasEnoughSpace(Collections.singletonList(vol), destPool)) {
|
||||||
|
throw new CloudRuntimeException("Storage pool " + destPool.getName() + " does not have enough space to migrate volume " + vol.getName());
|
||||||
|
}
|
||||||
|
|
||||||
if (liveMigrateVolume && destPool.getClusterId() != null && srcClusterId != null) {
|
if (liveMigrateVolume && destPool.getClusterId() != null && srcClusterId != null) {
|
||||||
if (!srcClusterId.equals(destPool.getClusterId())) {
|
if (!srcClusterId.equals(destPool.getClusterId())) {
|
||||||
throw new InvalidParameterValueException("Cannot migrate a volume of a virtual machine to a storage pool in a different cluster");
|
throw new InvalidParameterValueException("Cannot migrate a volume of a virtual machine to a storage pool in a different cluster");
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user