Skip to content

Commit 20ee0aa

Browse files
author
kunal.behbudzade
committed
kvm: refine direct-download migration checks
Avoid repeating storage pool lookups while deciding and preparing KVM live storage migration requests. Also make the skipped-volume test assert that skipped direct-download volumes do not affect the full-clone decision.
1 parent 4b6de36 commit 20ee0aa

2 files changed

Lines changed: 24 additions & 6 deletions

File tree

engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/StorageSystemDataMotionStrategy.java

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2015,11 +2015,15 @@ protected void setVolumeMigrationOptions(VolumeInfo srcVolumeInfo, VolumeInfo de
20152015
* not use incremental shared-backing semantics for a disk whose backing chain is not guaranteed on the destination.
20162016
*/
20172017
protected boolean shouldForceFullCloneMigration(Map<VolumeInfo, DataStore> volumeDataStoreMap, Host destHost) {
2018+
return shouldForceFullCloneMigration(volumeDataStoreMap, destHost, new HashMap<>());
2019+
}
2020+
2021+
protected boolean shouldForceFullCloneMigration(Map<VolumeInfo, DataStore> volumeDataStoreMap, Host destHost, Map<Long, StoragePoolVO> storagePoolsById) {
20182022
for (Map.Entry<VolumeInfo, DataStore> entry : volumeDataStoreMap.entrySet()) {
20192023
VolumeInfo srcVolumeInfo = entry.getKey();
20202024
DataStore destDataStore = entry.getValue();
2021-
StoragePoolVO sourceStoragePool = _storagePoolDao.findById(srcVolumeInfo.getPoolId());
2022-
StoragePoolVO destStoragePool = _storagePoolDao.findById(destDataStore.getId());
2025+
StoragePoolVO sourceStoragePool = getStoragePool(storagePoolsById, srcVolumeInfo.getPoolId());
2026+
StoragePoolVO destStoragePool = getStoragePool(storagePoolsById, destDataStore.getId());
20232027

20242028
if (shouldSkipVolumeMigration(sourceStoragePool, destHost, destStoragePool)) {
20252029
continue;
@@ -2032,6 +2036,17 @@ protected boolean shouldForceFullCloneMigration(Map<VolumeInfo, DataStore> volum
20322036
return false;
20332037
}
20342038

2039+
private StoragePoolVO getStoragePool(Map<Long, StoragePoolVO> storagePoolsById, long storagePoolId) {
2040+
StoragePoolVO storagePool = storagePoolsById.get(storagePoolId);
2041+
if (storagePool == null) {
2042+
storagePool = _storagePoolDao.findById(storagePoolId);
2043+
if (storagePool != null) {
2044+
storagePoolsById.put(storagePoolId, storagePool);
2045+
}
2046+
}
2047+
return storagePool;
2048+
}
2049+
20352050
protected boolean shouldSkipVolumeMigration(StoragePoolVO sourceStoragePool, Host destHost, StoragePoolVO destStoragePool) {
20362051
return (sourceStoragePool.getId() == destStoragePool.getId() && sourceStoragePool.getPoolType() == Storage.StoragePoolType.PowerFlex) ||
20372052
!shouldMigrateVolume(sourceStoragePool, destHost, destStoragePool);
@@ -2064,7 +2079,8 @@ public void copyAsync(Map<VolumeInfo, DataStore> volumeDataStoreMap, VirtualMach
20642079
List<MigrateDiskInfo> migrateDiskInfoList = new ArrayList<MigrateDiskInfo>();
20652080

20662081
Map<String, MigrateCommand.MigrateDiskInfo> migrateStorage = new HashMap<>();
2067-
boolean forceFullCloneMigration = shouldForceFullCloneMigration(volumeDataStoreMap, destHost);
2082+
Map<Long, StoragePoolVO> storagePoolsById = new HashMap<>();
2083+
boolean forceFullCloneMigration = shouldForceFullCloneMigration(volumeDataStoreMap, destHost, storagePoolsById);
20682084
if (forceFullCloneMigration) {
20692085
logger.info("Using full clone live storage migration for VM [{}] because one or more migrated volumes are backed by direct-download templates.", vmTO);
20702086
}
@@ -2076,8 +2092,8 @@ public void copyAsync(Map<VolumeInfo, DataStore> volumeDataStoreMap, VirtualMach
20762092
DataStore destDataStore = entry.getValue();
20772093

20782094
VolumeVO srcVolume = _volumeDao.findById(srcVolumeInfo.getId());
2079-
StoragePoolVO destStoragePool = _storagePoolDao.findById(destDataStore.getId());
2080-
StoragePoolVO sourceStoragePool = _storagePoolDao.findById(srcVolumeInfo.getPoolId());
2095+
StoragePoolVO destStoragePool = getStoragePool(storagePoolsById, destDataStore.getId());
2096+
StoragePoolVO sourceStoragePool = getStoragePool(storagePoolsById, srcVolumeInfo.getPoolId());
20812097

20822098
if (shouldSkipVolumeMigration(sourceStoragePool, destHost, destStoragePool)) {
20832099
continue;

engine/storage/datamotion/src/test/java/org/apache/cloudstack/storage/motion/StorageSystemDataMotionStrategyTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -414,16 +414,18 @@ public void shouldForceFullCloneMigrationIgnoresSkippedDirectDownloadVolumes() {
414414
DataStore samePowerFlexStore = Mockito.mock(DataStore.class);
415415
DataStore destPrimary = Mockito.mock(DataStore.class);
416416
Host destHost = Mockito.mock(Host.class);
417-
Map<VolumeInfo, DataStore> volumeMap = new HashMap<>();
417+
Map<VolumeInfo, DataStore> volumeMap = new LinkedHashMap<>();
418418

419419
configurePoolLookup(skippedDirectDownloadVolume, samePowerFlexStore, 1L, 1L, StoragePoolType.PowerFlex, StoragePoolType.PowerFlex);
420420
configurePoolLookup(regularVolume, destPrimary, 3L, 4L, StoragePoolType.NetworkFilesystem, StoragePoolType.NetworkFilesystem);
421+
lenient().when(skippedDirectDownloadVolume.isDirectDownload()).thenReturn(true);
421422
Mockito.when(regularVolume.isDirectDownload()).thenReturn(false);
422423

423424
volumeMap.put(skippedDirectDownloadVolume, samePowerFlexStore);
424425
volumeMap.put(regularVolume, destPrimary);
425426

426427
Assert.assertFalse(strategy.shouldForceFullCloneMigration(volumeMap, destHost));
428+
Mockito.verify(skippedDirectDownloadVolume, Mockito.never()).isDirectDownload();
427429
}
428430

429431
@Test

0 commit comments

Comments
 (0)