You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ha...@apache.org on 2023/05/31 11:58:36 UTC
[cloudstack] 05/23: recent changes
This is an automated email from the ASF dual-hosted git repository.
harikrishna pushed a commit to branch LiveStoragMigrationScaleIOMain
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
commit de1d6c258676d84b1ba345c61cde552d5c0f0a1a
Author: Harikrishna Patnala <ha...@gmail.com>
AuthorDate: Mon Mar 6 13:12:19 2023 +0530
recent changes
---
.../LibvirtMigrateVolumeCommandWrapper.java | 116 +++++++++++++--------
.../driver/ScaleIOPrimaryDataStoreDriver.java | 23 ++--
2 files changed, 84 insertions(+), 55 deletions(-)
diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateVolumeCommandWrapper.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateVolumeCommandWrapper.java
index 8ad52664751..6ff437cd44c 100644
--- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateVolumeCommandWrapper.java
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateVolumeCommandWrapper.java
@@ -48,6 +48,7 @@ import org.libvirt.Connect;
import org.libvirt.Domain;
import org.libvirt.DomainInfo;
import org.libvirt.TypedParameter;
+import org.libvirt.TypedUlongParameter;
import org.libvirt.LibvirtException;
import org.libvirt.event.BlockJobListener;
import org.libvirt.event.BlockJobStatus;
@@ -59,8 +60,6 @@ public final class LibvirtMigrateVolumeCommandWrapper extends CommandWrapper<Mig
@Override
public Answer execute(final MigrateVolumeCommand command, final LibvirtComputingResource libvirtComputingResource) {
- LOGGER.info("I'm here HARIIIII");
-
VolumeObjectTO srcVolumeObjectTO = (VolumeObjectTO)command.getSrcData();
PrimaryDataStoreTO srcPrimaryDataStore = (PrimaryDataStoreTO)srcVolumeObjectTO.getDataStore();
@@ -75,76 +74,82 @@ public final class LibvirtMigrateVolumeCommandWrapper extends CommandWrapper<Mig
}
private MigrateVolumeAnswer migrateVolumeInternal (final MigrateVolumeCommand command, final LibvirtComputingResource libvirtComputingResource) {
- VolumeObjectTO srcVolumeObjectTO = (VolumeObjectTO)command.getSrcData();
- PrimaryDataStoreTO srcPrimaryDataStore = (PrimaryDataStoreTO)srcVolumeObjectTO.getDataStore();
- final String vmName = srcVolumeObjectTO.getVmName();
- LOGGER.info("HARI VM name: "+ vmName);
-
- VolumeObjectTO destVolumeObjectTO = (VolumeObjectTO)command.getDestData();
- PrimaryDataStoreTO destPrimaryDataStore = (PrimaryDataStoreTO)destVolumeObjectTO.getDataStore();
+ // Source Details
+ VolumeObjectTO srcVolumeObjectTO = (VolumeObjectTO)command.getSrcData();
String srcPath = srcVolumeObjectTO.getPath();
- String destPath = destVolumeObjectTO.getPath();
+ final String srcVolumeId = ScaleIOUtil.getVolumePath(srcVolumeObjectTO.getPath());
+ final String vmName = srcVolumeObjectTO.getVmName();
+ Map<String, String> srcDetails = command.getSrcDetails();
+ final String srcSystemId = srcDetails.get(ScaleIOGatewayClient.STORAGE_POOL_SYSTEM_ID);
- Map<String, String> destDetails = command.getDestDetails();
+ final String diskFileName = ScaleIOUtil.DISK_NAME_PREFIX + srcSystemId + "-" + srcVolumeId;
+ final String srcFilePath = ScaleIOUtil.DISK_PATH + File.separator + diskFileName;
- final String srcVolumeId = ScaleIOUtil.getVolumePath(srcVolumeObjectTO.getPath());
LOGGER.info("HARI Source volume ID: "+ srcVolumeId);
+ LOGGER.info("HARI source volume PATH: "+ srcFilePath);
+ LOGGER.info("HARI source system ID: "+ srcSystemId);
+ // Destination Details
+ VolumeObjectTO destVolumeObjectTO = (VolumeObjectTO)command.getDestData();
+ String destPath = destVolumeObjectTO.getPath();
final String destVolumeId = ScaleIOUtil.getVolumePath(destVolumeObjectTO.getPath());
- LOGGER.info("HARI destination volume ID: "+ destVolumeId);
-
+ Map<String, String> destDetails = command.getDestDetails();
final String destSystemId = destDetails.get(ScaleIOGatewayClient.STORAGE_POOL_SYSTEM_ID);
- LOGGER.info("HARI destination system ID: "+ destSystemId);
-
final String destDiskFileName = ScaleIOUtil.DISK_NAME_PREFIX + destSystemId + "-" + destVolumeId;
final String diskFilePath = ScaleIOUtil.DISK_PATH + File.separator + destDiskFileName;
+ LOGGER.info("HARI destination volume ID: "+ destVolumeId);
+ LOGGER.info("HARI destination system ID: "+ destSystemId);
+
Domain dm = null;
try {
final LibvirtUtilitiesHelper libvirtUtilitiesHelper = libvirtComputingResource.getLibvirtUtilitiesHelper();
Connect conn = libvirtUtilitiesHelper.getConnection();
dm = libvirtComputingResource.getDomain(conn, vmName);
-
if (dm == null) {
- return new MigrateVolumeAnswer(command, false,
- "Migrate volume failed due to can not find vm: " + vmName, null);
+ return new MigrateVolumeAnswer(command, false, "Migrate volume failed due to can not find vm: " + vmName, null);
}
DomainInfo.DomainState domainState = dm.getInfo().state ;
if (domainState != DomainInfo.DomainState.VIR_DOMAIN_RUNNING) {
- return new MigrateVolumeAnswer(command, false,
- "Migrate volume failed due to VM is not running: " + vmName + " with domainState = " + domainState, null);
+ return new MigrateVolumeAnswer(command, false, "Migrate volume failed due to VM is not running: " + vmName + " with domainState = " + domainState, null);
}
- final LibvirtDomainXMLParser parser = new LibvirtDomainXMLParser();
- final String domXml = dm.getXMLDesc(0);
- parser.parseDomainXML(domXml);
- LOGGER.info(String.format("VM [%s] with XML configuration [%s] will be migrated to host.", vmName, domXml));
-
- List<LibvirtVMDef.DiskDef> disks = parser.getDisks();
- LibvirtVMDef.DiskDef diskdef = null;
- for (final LibvirtVMDef.DiskDef disk : disks) {
- final String file = disk.getDiskPath();
- LOGGER.info("HARIIII : " + file);
- if (file != null && file.contains(srcVolumeId)) {
- diskdef = disk;
- break;
- }
- }
- if (diskdef == null) {
- throw new InternalErrorException("disk: " + srcPath + " is not attached before");
- }
- diskdef.setDiskPath(diskFilePath);
- LOGGER.info("HARIIII Destination xml : " + diskdef.toString());
- dm.blockCopy(srcPath, diskdef.toString(), new TypedParameter[]{}, 0);
+ LibvirtVMDef.DiskDef diskdef = generateDestinationDiskDefinition(dm, srcVolumeId, srcPath, diskFilePath);
+
+ TypedUlongParameter parameter = new TypedUlongParameter("bandwidth", 0);
+ TypedParameter[] parameters = new TypedParameter[1];
+ parameters[0] = parameter;
+ LOGGER.info("Krishna source disk label: " + diskdef.getDiskLabel());
+
+ Domain finalDm = dm;
+ final Boolean[] copyStatus = {true};
+ dm.blockCopy(diskdef.getDiskLabel(), diskdef.toString(), parameters, Domain.BlockCopyFlags.REUSE_EXT);
BlockJobListener listener = new BlockJobListener() {
@Override
public void onEvent(Domain domain, String diskPath, BlockJobType type, BlockJobStatus status) {
-
+ if (type == BlockJobType.COPY && status == BlockJobStatus.READY) {
+ try {
+ finalDm.blockJobAbort(diskFilePath, 0);
+ copyStatus[0] = false;
+ } catch (LibvirtException e) {
+ throw new RuntimeException(e);
+ }
+ }
}
};
+ dm.addBlockJobListener(listener);
+ while (copyStatus[0]) {
+ LOGGER.info("Waiting for the block copy to complete");
+ }
+
+ if (copyStatus[0]) {
+ String msg = "Migrate volume failed due to timeout";
+ LOGGER.warn(msg);
+ return new MigrateVolumeAnswer(command, false, msg, null);
+ }
return new MigrateVolumeAnswer(command, true, null, destPath);
} catch (Exception e) {
@@ -161,6 +166,31 @@ public final class LibvirtMigrateVolumeCommandWrapper extends CommandWrapper<Mig
}
}
}
+
+ private LibvirtVMDef.DiskDef generateDestinationDiskDefinition(Domain dm, String srcVolumeId, String srcPath, String diskFilePath) throws InternalErrorException, LibvirtException {
+ final LibvirtDomainXMLParser parser = new LibvirtDomainXMLParser();
+ final String domXml = dm.getXMLDesc(0);
+ parser.parseDomainXML(domXml);
+
+ List<LibvirtVMDef.DiskDef> disks = parser.getDisks();
+ LibvirtVMDef.DiskDef diskdef = null;
+ for (final LibvirtVMDef.DiskDef disk : disks) {
+ final String file = disk.getDiskPath();
+ LOGGER.info("HARIIII disk: " + file);
+ if (file != null && file.contains(srcVolumeId)) {
+ diskdef = disk;
+ break;
+ }
+ }
+ if (diskdef == null) {
+ throw new InternalErrorException("disk: " + srcPath + " is not attached before");
+ }
+ diskdef.setDiskPath(diskFilePath);
+ LOGGER.info("HARIIII Destination xml : " + diskdef.toString());
+
+ return diskdef;
+ }
+
private MigrateVolumeAnswer migrateRegularVolume(final MigrateVolumeCommand command, final LibvirtComputingResource libvirtComputingResource) {
KVMStoragePoolManager storagePoolManager = libvirtComputingResource.getStoragePoolMgr();
diff --git a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java
index 81abff9ff38..6c3dd0f1b08 100644
--- a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java
+++ b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java
@@ -19,7 +19,6 @@ package org.apache.cloudstack.storage.datastore.driver;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.UUID;
import javax.inject.Inject;
@@ -773,18 +772,17 @@ public class ScaleIOPrimaryDataStoreDriver implements PrimaryDataStoreDriver {
final String srcVolumeId = ScaleIOUtil.getVolumePath(srcVolumePath);
final StoragePoolVO destStoragePool = storagePoolDao.findById(destPoolId);
final String destStoragePoolId = destStoragePool.getPath();
- //CreateObjectAnswer createAnswer = createVolume((VolumeInfo) destData, destStore.getId());
- //String destVolumePath = createAnswer.getData().getPath();
- final String destVolumeId = UUID.randomUUID().toString().replaceAll("-", "").substring(0, 16);
- final String destScaleIOVolumeName = String.format("%s-%s-%s-%s", ScaleIOUtil.VOLUME_PREFIX, srcData.getId(),
- srcData.getUuid().split("-")[0].substring(4), ManagementServerImpl.customCsIdentifier.value());
- String destVolumePath = String.format("%s:%s", destVolumeId, destScaleIOVolumeName);
+ CreateObjectAnswer createAnswer = createVolume((VolumeInfo) destData, destStore.getId());
+ String destVolumePath = createAnswer.getData().getPath();
+ //final String destVolumeId = UUID.randomUUID().toString().replaceAll("-", "").substring(0, 16);
+ //final String destScaleIOVolumeName = String.format("%s-%s-%s-%s", ScaleIOUtil.VOLUME_PREFIX, srcData.getId(), srcData.getUuid().split("-")[0].substring(4), ManagementServerImpl.customCsIdentifier.value());
+ //String destVolumePath = String.format("%s:%s", destVolumeId, destScaleIOVolumeName);
VolumeObjectTO destVolTO = (VolumeObjectTO) destData.getTO();
destVolTO.setPath(destVolumePath);
- Map<String, String> srcDetails = getVolumeDetails((VolumeInfo) srcData);
- Map<String, String> destDetails = getVolumeDetails((VolumeInfo) destData);
+ Map<String, String> srcDetails = getVolumeDetails((VolumeInfo) srcData, srcStore);
+ Map<String, String> destDetails = getVolumeDetails((VolumeInfo) destData, destStore);
String value = configDao.getValue(Config.MigrateWait.key());
int waitInterval = NumbersUtil.parseInt(value, Integer.parseInt(Config.MigrateWait.getDefaultValue()));
@@ -804,6 +802,7 @@ public class ScaleIOPrimaryDataStoreDriver implements PrimaryDataStoreDriver {
throw new CloudRuntimeException("Found no hosts to run resize command on");
}
EndPoint ep = RemoteHostEndPoint.getHypervisorHostEndPoint(host);
+ grantAccess(destData, ep, destData.getDataStore());
answer = ep.sendMessage(migrateVolumeCommand);
boolean migrateStatus = answer.getResult();
@@ -878,8 +877,8 @@ public class ScaleIOPrimaryDataStoreDriver implements PrimaryDataStoreDriver {
return answer;
}
- private Map<String, String> getVolumeDetails(VolumeInfo volumeInfo) {
- long storagePoolId = volumeInfo.getPoolId();
+ private Map<String, String> getVolumeDetails(VolumeInfo volumeInfo, DataStore dataStore) {
+ long storagePoolId = dataStore.getId();
StoragePoolVO storagePoolVO = storagePoolDao.findById(storagePoolId);
if (!storagePoolVO.isManaged()) {
@@ -899,7 +898,7 @@ public class ScaleIOPrimaryDataStoreDriver implements PrimaryDataStoreDriver {
volumeDetails.put(DiskTO.VOLUME_SIZE, String.valueOf(volumeVO.getSize()));
volumeDetails.put(DiskTO.SCSI_NAA_DEVICE_ID, getVolumeProperty(volumeInfo.getId(), DiskTO.SCSI_NAA_DEVICE_ID));
- ChapInfo chapInfo = volumeService.getChapInfo(volumeInfo, volumeInfo.getDataStore());
+ ChapInfo chapInfo = volumeService.getChapInfo(volumeInfo, dataStore);
if (chapInfo != null) {
volumeDetails.put(DiskTO.CHAP_INITIATOR_USERNAME, chapInfo.getInitiatorUsername());