diff --git a/api/src/main/java/com/cloud/vm/DiskProfile.java b/api/src/main/java/com/cloud/vm/DiskProfile.java index 971ebde496e4..149c44505aba 100644 --- a/api/src/main/java/com/cloud/vm/DiskProfile.java +++ b/api/src/main/java/com/cloud/vm/DiskProfile.java @@ -44,6 +44,7 @@ public class DiskProfile { private String cacheMode; private Long minIops; private Long maxIops; + private Long newDiskOfferingId; private boolean requiresEncryption; private HypervisorType hyperType; @@ -254,6 +255,13 @@ public void setMaxIops(Long maxIops) { this.maxIops = maxIops; } + public Long getNewDiskOfferingId() { + return newDiskOfferingId; + } + + public void setNewDiskOfferingId(Long newDiskOfferingId) { + this.newDiskOfferingId = newDiskOfferingId; + } public boolean requiresEncryption() { return requiresEncryption; } public void setEncryption(boolean encrypt) { this.requiresEncryption = encrypt; } diff --git a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java index c1d17cc8f70b..dadd3483c398 100644 --- a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java @@ -2427,10 +2427,12 @@ public boolean storagePoolHasEnoughSpace(List> volumeD Volume volume = volumeDiskProfilePair.first(); DiskProfile diskProfile = volumeDiskProfilePair.second(); VolumeVO volumeVO = _volumeDao.findById(volume.getId()); + Long newDiskOfferingId = diskProfile.getNewDiskOfferingId(); - if (volumeVO.getHypervisorSnapshotReserve() == null) { + if (volumeVO.getHypervisorSnapshotReserve() == null || volumeVO.getHypervisorSnapshotReserve() == 0) { // update the volume's hv_ss_reserve (hypervisor snapshot reserve) from a disk offering (used for managed storage) - volService.updateHypervisorSnapshotReserveForVolume(getDiskOfferingVO(volumeVO), volumeVO.getId(), getHypervisorType(volumeVO)); + volService.updateHypervisorSnapshotReserveForVolume(getDiskOfferingForSnapshotReserve(volumeVO, newDiskOfferingId), + volumeVO.getId(), getHypervisorType(volumeVO)); // hv_ss_reserve field might have been updated; refresh from DB to make use of it in getDataObjectSizeIncludingHypervisorSnapshotReserve volumeVO = _volumeDao.findById(volume.getId()); @@ -2630,8 +2632,8 @@ private long getDataObjectSizeIncludingHypervisorSnapshotReserve(Volume volume, return volume.getSize(); } - private DiskOfferingVO getDiskOfferingVO(Volume volume) { - Long diskOfferingId = volume.getDiskOfferingId(); + private DiskOfferingVO getDiskOfferingForSnapshotReserve(Volume volume, Long newDiskOfferingId) { + Long diskOfferingId = newDiskOfferingId == null ? volume.getDiskOfferingId() : newDiskOfferingId; return _diskOfferingDao.findById(diskOfferingId); } diff --git a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java index 2f88b5f44fc1..b2197e4a337e 100644 --- a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java +++ b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java @@ -3081,8 +3081,10 @@ public Volume migrateVolume(MigrateVolumeCmd cmd) { throw new CloudRuntimeException("Storage pool " + destPool.getName() + " is not suitable to migrate volume " + vol.getName()); } + DiskOfferingVO newDiskOffering = retrieveAndValidateNewDiskOffering(cmd); HypervisorType hypervisorType = _volsDao.getHypervisorType(volumeId); DiskProfile diskProfile = new DiskProfile(vol, diskOffering, hypervisorType); + diskProfile.setNewDiskOfferingId(newDiskOffering.getId()); Pair volumeDiskProfilePair = new Pair<>(vol, diskProfile); if (!storageMgr.storagePoolHasEnoughSpace(Collections.singletonList(volumeDiskProfilePair), destPool)) { throw new CloudRuntimeException("Storage pool " + destPool.getName() + " does not have enough space to migrate volume " + vol.getName()); @@ -3127,7 +3129,6 @@ public Volume migrateVolume(MigrateVolumeCmd cmd) { } } - DiskOfferingVO newDiskOffering = retrieveAndValidateNewDiskOffering(cmd); validateConditionsToReplaceDiskOfferingOfVolume(vol, newDiskOffering, destPool); if (vm != null) {