Skip to content

Commit 3d2a3ca

Browse files
author
Pearl Dsilva
committed
minor improvement - when migrating vm with volumes, if there's a failures, change the clvm vols to exclusive on source from shared, and on success, change dest vol to exclusive only for cross-pool migration
1 parent 729f79a commit 3d2a3ca

1 file changed

Lines changed: 41 additions & 2 deletions

File tree

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

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2215,7 +2215,7 @@ public void copyAsync(Map<VolumeInfo, DataStore> volumeDataStoreMap, VirtualMach
22152215
}
22162216
}
22172217

2218-
handlePostMigration(success, srcVolumeInfoToDestVolumeInfo, vmTO, destHost);
2218+
handlePostMigration(success, srcVolumeInfoToDestVolumeInfo, vmTO, srcHost, destHost);
22192219

22202220
if (!success) {
22212221
if (migrateAnswer == null) {
@@ -2434,7 +2434,26 @@ String getVolumeBackingFile(VolumeInfo srcVolumeInfo) {
24342434
return null;
24352435
}
24362436

2437-
private void handlePostMigration(boolean success, Map<VolumeInfo, VolumeInfo> srcVolumeInfoToDestVolumeInfo, VirtualMachineTO vmTO, Host destHost) {
2437+
private void sendClvmLockCommand(long hostId, StoragePoolVO pool, VolumeInfo volumeInfo,
2438+
ClvmLockTransferCommand.Operation operation) {
2439+
String vgName = pool.getPath();
2440+
if (vgName.startsWith("/")) {
2441+
vgName = vgName.substring(1);
2442+
}
2443+
String lvPath = String.format("/dev/%s/%s", vgName, volumeInfo.getPath());
2444+
try {
2445+
Answer answer = agentManager.send(hostId,
2446+
new ClvmLockTransferCommand(operation, lvPath, volumeInfo.getUuid()));
2447+
if (answer == null || !answer.getResult()) {
2448+
String details = answer != null ? answer.getDetails() : "null answer";
2449+
logger.warn("CLVM lock command [{}] failed for LV [{}] on host [{}]: {}", operation, lvPath, hostId, details);
2450+
}
2451+
} catch (AgentUnavailableException | OperationTimedoutException e) {
2452+
logger.warn("Exception sending CLVM lock command [{}] for LV [{}] on host [{}]: {}", operation, lvPath, hostId, e.getMessage());
2453+
}
2454+
}
2455+
2456+
private void handlePostMigration(boolean success, Map<VolumeInfo, VolumeInfo> srcVolumeInfoToDestVolumeInfo, VirtualMachineTO vmTO, Host srcHost, Host destHost) {
24382457
if (!success) {
24392458
try {
24402459
PrepareForMigrationCommand pfmc = new PrepareForMigrationCommand(vmTO);
@@ -2453,6 +2472,17 @@ private void handlePostMigration(boolean success, Map<VolumeInfo, VolumeInfo> sr
24532472
catch (Exception e) {
24542473
logger.debug("Failed to disconnect one or more (original) dest volumes", e);
24552474
}
2475+
2476+
if (srcHost != null && srcHost.getHypervisorType() == HypervisorType.KVM) {
2477+
for (VolumeInfo srcVolumeInfo : srcVolumeInfoToDestVolumeInfo.keySet()) {
2478+
StoragePoolVO srcPool = _storagePoolDao.findById(srcVolumeInfo.getPoolId());
2479+
if (srcPool == null || !ClvmPoolManager.isClvmPoolType(srcPool.getPoolType())) {
2480+
continue;
2481+
}
2482+
sendClvmLockCommand(srcHost.getId(), srcPool, srcVolumeInfo,
2483+
ClvmLockTransferCommand.Operation.ACTIVATE_EXCLUSIVE);
2484+
}
2485+
}
24562486
}
24572487

24582488
for (Map.Entry<VolumeInfo, VolumeInfo> entry : srcVolumeInfoToDestVolumeInfo.entrySet()) {
@@ -2480,6 +2510,15 @@ private void handlePostMigration(boolean success, Map<VolumeInfo, VolumeInfo> sr
24802510

24812511
_volumeDao.update(volumeVO.getId(), volumeVO);
24822512

2513+
StoragePoolVO srcPoolVO = _storagePoolDao.findById(srcVolumeInfo.getPoolId());
2514+
StoragePoolVO destPoolVO = _storagePoolDao.findById(destVolumeInfo.getPoolId());
2515+
if (destPoolVO != null && ClvmPoolManager.isClvmPoolType(destPoolVO.getPoolType())
2516+
&& (srcPoolVO == null || srcPoolVO.getId() != destPoolVO.getId())) {
2517+
sendClvmLockCommand(destHost.getId(), destPoolVO, destVolumeInfo,
2518+
ClvmLockTransferCommand.Operation.ACTIVATE_EXCLUSIVE);
2519+
clvmPoolManager.setClvmLockHostId(destVolumeInfo.getId(), destHost.getId());
2520+
}
2521+
24832522
_volumeService.copyPoliciesBetweenVolumesAndDestroySourceVolumeAfterMigration(Event.OperationSucceeded, null, srcVolumeInfo, destVolumeInfo, false);
24842523

24852524
// Update the volume ID for snapshots on secondary storage

0 commit comments

Comments
 (0)