mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
fix volume migration across cluster-scope pools (#10266)
This commit is contained in:
parent
a09c579b5b
commit
f992ebb52a
@ -24,6 +24,7 @@ public class MigrationOptions implements Serializable {
|
|||||||
|
|
||||||
private String srcPoolUuid;
|
private String srcPoolUuid;
|
||||||
private Storage.StoragePoolType srcPoolType;
|
private Storage.StoragePoolType srcPoolType;
|
||||||
|
private Long srcPoolClusterId;
|
||||||
private Type type;
|
private Type type;
|
||||||
private ScopeType scopeType;
|
private ScopeType scopeType;
|
||||||
private String srcBackingFilePath;
|
private String srcBackingFilePath;
|
||||||
@ -38,21 +39,23 @@ public class MigrationOptions implements Serializable {
|
|||||||
public MigrationOptions() {
|
public MigrationOptions() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public MigrationOptions(String srcPoolUuid, Storage.StoragePoolType srcPoolType, String srcBackingFilePath, boolean copySrcTemplate, ScopeType scopeType) {
|
public MigrationOptions(String srcPoolUuid, Storage.StoragePoolType srcPoolType, String srcBackingFilePath, boolean copySrcTemplate, ScopeType scopeType, Long srcPoolClusterId) {
|
||||||
this.srcPoolUuid = srcPoolUuid;
|
this.srcPoolUuid = srcPoolUuid;
|
||||||
this.srcPoolType = srcPoolType;
|
this.srcPoolType = srcPoolType;
|
||||||
this.type = Type.LinkedClone;
|
this.type = Type.LinkedClone;
|
||||||
this.scopeType = scopeType;
|
this.scopeType = scopeType;
|
||||||
this.srcBackingFilePath = srcBackingFilePath;
|
this.srcBackingFilePath = srcBackingFilePath;
|
||||||
this.copySrcTemplate = copySrcTemplate;
|
this.copySrcTemplate = copySrcTemplate;
|
||||||
|
this.srcPoolClusterId = srcPoolClusterId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public MigrationOptions(String srcPoolUuid, Storage.StoragePoolType srcPoolType, String srcVolumeUuid, ScopeType scopeType) {
|
public MigrationOptions(String srcPoolUuid, Storage.StoragePoolType srcPoolType, String srcVolumeUuid, ScopeType scopeType, Long srcPoolClusterId) {
|
||||||
this.srcPoolUuid = srcPoolUuid;
|
this.srcPoolUuid = srcPoolUuid;
|
||||||
this.srcPoolType = srcPoolType;
|
this.srcPoolType = srcPoolType;
|
||||||
this.type = Type.FullClone;
|
this.type = Type.FullClone;
|
||||||
this.scopeType = scopeType;
|
this.scopeType = scopeType;
|
||||||
this.srcVolumeUuid = srcVolumeUuid;
|
this.srcVolumeUuid = srcVolumeUuid;
|
||||||
|
this.srcPoolClusterId = srcPoolClusterId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getSrcPoolUuid() {
|
public String getSrcPoolUuid() {
|
||||||
@ -63,6 +66,10 @@ public class MigrationOptions implements Serializable {
|
|||||||
return srcPoolType;
|
return srcPoolType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Long getSrcPoolClusterId() {
|
||||||
|
return srcPoolClusterId;
|
||||||
|
}
|
||||||
|
|
||||||
public ScopeType getScopeType() { return scopeType; }
|
public ScopeType getScopeType() { return scopeType; }
|
||||||
|
|
||||||
public String getSrcBackingFilePath() {
|
public String getSrcBackingFilePath() {
|
||||||
|
|||||||
@ -217,7 +217,7 @@ public class KvmNonManagedStorageDataMotionStrategy extends StorageSystemDataMot
|
|||||||
}
|
}
|
||||||
|
|
||||||
VMTemplateStoragePoolVO sourceVolumeTemplateStoragePoolVO = vmTemplatePoolDao.findByPoolTemplate(destStoragePool.getId(), srcVolumeInfo.getTemplateId(), null);
|
VMTemplateStoragePoolVO sourceVolumeTemplateStoragePoolVO = vmTemplatePoolDao.findByPoolTemplate(destStoragePool.getId(), srcVolumeInfo.getTemplateId(), null);
|
||||||
if (sourceVolumeTemplateStoragePoolVO == null && (isStoragePoolTypeInList(destStoragePool.getPoolType(), StoragePoolType.Filesystem, StoragePoolType.SharedMountPoint))) {
|
if (sourceVolumeTemplateStoragePoolVO == null && (isStoragePoolTypeInList(destStoragePool.getPoolType(), StoragePoolType.NetworkFilesystem, StoragePoolType.Filesystem, StoragePoolType.SharedMountPoint))) {
|
||||||
DataStore sourceTemplateDataStore = dataStoreManagerImpl.getRandomImageStore(srcVolumeInfo.getDataCenterId());
|
DataStore sourceTemplateDataStore = dataStoreManagerImpl.getRandomImageStore(srcVolumeInfo.getDataCenterId());
|
||||||
if (sourceTemplateDataStore != null) {
|
if (sourceTemplateDataStore != null) {
|
||||||
TemplateInfo sourceTemplateInfo = templateDataFactory.getTemplate(srcVolumeInfo.getTemplateId(), sourceTemplateDataStore);
|
TemplateInfo sourceTemplateInfo = templateDataFactory.getTemplate(srcVolumeInfo.getTemplateId(), sourceTemplateDataStore);
|
||||||
|
|||||||
@ -1948,18 +1948,26 @@ public class StorageSystemDataMotionStrategy implements DataMotionStrategy {
|
|||||||
/**
|
/**
|
||||||
* Return expected MigrationOptions for a linked clone volume live storage migration
|
* Return expected MigrationOptions for a linked clone volume live storage migration
|
||||||
*/
|
*/
|
||||||
protected MigrationOptions createLinkedCloneMigrationOptions(VolumeInfo srcVolumeInfo, VolumeInfo destVolumeInfo, String srcVolumeBackingFile, String srcPoolUuid, Storage.StoragePoolType srcPoolType) {
|
protected MigrationOptions createLinkedCloneMigrationOptions(VolumeInfo srcVolumeInfo, VolumeInfo destVolumeInfo, String srcVolumeBackingFile, StoragePoolVO srcPool) {
|
||||||
|
String srcPoolUuid = srcPool.getUuid();
|
||||||
|
Storage.StoragePoolType srcPoolType = srcPool.getPoolType();
|
||||||
|
Long srcPoolClusterId = srcPool.getClusterId();
|
||||||
VMTemplateStoragePoolVO ref = templatePoolDao.findByPoolTemplate(destVolumeInfo.getPoolId(), srcVolumeInfo.getTemplateId(), null);
|
VMTemplateStoragePoolVO ref = templatePoolDao.findByPoolTemplate(destVolumeInfo.getPoolId(), srcVolumeInfo.getTemplateId(), null);
|
||||||
boolean updateBackingFileReference = ref == null;
|
boolean updateBackingFileReference = ref == null;
|
||||||
String backingFile = !updateBackingFileReference ? ref.getInstallPath() : srcVolumeBackingFile;
|
String backingFile = !updateBackingFileReference ? ref.getInstallPath() : srcVolumeBackingFile;
|
||||||
return new MigrationOptions(srcPoolUuid, srcPoolType, backingFile, updateBackingFileReference, srcVolumeInfo.getDataStore().getScope().getScopeType());
|
ScopeType scopeType = srcVolumeInfo.getDataStore().getScope().getScopeType();
|
||||||
|
return new MigrationOptions(srcPoolUuid, srcPoolType, backingFile, updateBackingFileReference, scopeType, srcPoolClusterId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return expected MigrationOptions for a full clone volume live storage migration
|
* Return expected MigrationOptions for a full clone volume live storage migration
|
||||||
*/
|
*/
|
||||||
protected MigrationOptions createFullCloneMigrationOptions(VolumeInfo srcVolumeInfo, VirtualMachineTO vmTO, Host srcHost, String srcPoolUuid, Storage.StoragePoolType srcPoolType) {
|
protected MigrationOptions createFullCloneMigrationOptions(VolumeInfo srcVolumeInfo, VirtualMachineTO vmTO, Host srcHost, StoragePoolVO srcPool) {
|
||||||
return new MigrationOptions(srcPoolUuid, srcPoolType, srcVolumeInfo.getPath(), srcVolumeInfo.getDataStore().getScope().getScopeType());
|
String srcPoolUuid = srcPool.getUuid();
|
||||||
|
Storage.StoragePoolType srcPoolType = srcPool.getPoolType();
|
||||||
|
Long srcPoolClusterId = srcPool.getClusterId();
|
||||||
|
ScopeType scopeType = srcVolumeInfo.getDataStore().getScope().getScopeType();
|
||||||
|
return new MigrationOptions(srcPoolUuid, srcPoolType, srcVolumeInfo.getPath(), scopeType, srcPoolClusterId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1982,9 +1990,9 @@ public class StorageSystemDataMotionStrategy implements DataMotionStrategy {
|
|||||||
|
|
||||||
MigrationOptions migrationOptions;
|
MigrationOptions migrationOptions;
|
||||||
if (MigrationOptions.Type.LinkedClone.equals(migrationType)) {
|
if (MigrationOptions.Type.LinkedClone.equals(migrationType)) {
|
||||||
migrationOptions = createLinkedCloneMigrationOptions(srcVolumeInfo, destVolumeInfo, srcVolumeBackingFile, srcPoolUuid, srcPoolType);
|
migrationOptions = createLinkedCloneMigrationOptions(srcVolumeInfo, destVolumeInfo, srcVolumeBackingFile, srcPool);
|
||||||
} else {
|
} else {
|
||||||
migrationOptions = createFullCloneMigrationOptions(srcVolumeInfo, vmTO, srcHost, srcPoolUuid, srcPoolType);
|
migrationOptions = createFullCloneMigrationOptions(srcVolumeInfo, vmTO, srcHost, srcPool);
|
||||||
}
|
}
|
||||||
migrationOptions.setTimeout(StorageManager.KvmStorageOnlineMigrationWait.value());
|
migrationOptions.setTimeout(StorageManager.KvmStorageOnlineMigrationWait.value());
|
||||||
destVolumeInfo.setMigrationOptions(migrationOptions);
|
destVolumeInfo.setMigrationOptions(migrationOptions);
|
||||||
|
|||||||
@ -625,6 +625,10 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
|
|||||||
return libvirtUtilitiesHelper;
|
return libvirtUtilitiesHelper;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getClusterId() {
|
||||||
|
return clusterId;
|
||||||
|
}
|
||||||
|
|
||||||
public CPUStat getCPUStat() {
|
public CPUStat getCPUStat() {
|
||||||
return cpuStat;
|
return cpuStat;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2638,6 +2638,12 @@ public class KVMStorageProcessor implements StorageProcessor {
|
|||||||
return localPool;
|
return localPool;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (migrationOptions.getScopeType().equals(ScopeType.CLUSTER)
|
||||||
|
&& migrationOptions.getSrcPoolClusterId() != null
|
||||||
|
&& !migrationOptions.getSrcPoolClusterId().toString().equals(resource.getClusterId())) {
|
||||||
|
return localPool;
|
||||||
|
}
|
||||||
|
|
||||||
return storagePoolMgr.getStoragePool(migrationOptions.getSrcPoolType(), migrationOptions.getSrcPoolUuid());
|
return storagePoolMgr.getStoragePool(migrationOptions.getSrcPoolType(), migrationOptions.getSrcPoolUuid());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user