From 42941b3376dae903bf512f24dc3d77c06de3feb4 Mon Sep 17 00:00:00 2001 From: Likitha Shetty Date: Sun, 10 Nov 2013 22:41:06 +0530 Subject: [PATCH] CLOUDSTACK-5122. System VMs are getting recreated with old template after upgrading to 4.2. In VMware during VM start the existing disk information is used to configure the VMs. So even if a new disk is created using the new template VM continues to use the old disk. Once the old root disk is marked for destroy force expunge it and sync the new disk into the VM folder before VM start --- .../cloud/storage/resource/VmwareStorageProcessor.java | 2 -- server/src/com/cloud/storage/VolumeManagerImpl.java | 10 ++++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java index 3b661e9959c..9538176e944 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java +++ b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java @@ -397,8 +397,6 @@ public class VmwareStorageProcessor implements StorageProcessor { // restoreVM - move the new ROOT disk into corresponding VM folder String vmInternalCSName = volume.getVmName(); if (dsMo.folderExists(String.format("[%s]", dsMo.getName()), vmInternalCSName)) { - String oldRootDisk = VmwareStorageLayoutHelper.getVmwareDatastorePathFromVmdkFileName(dsMo, vmInternalCSName, vmdkName); - if (oldRootDisk != null) VmwareStorageLayoutHelper.syncVolumeToVmDefaultFolder(dcMo, vmInternalCSName, dsMo, vmdkName); } diff --git a/server/src/com/cloud/storage/VolumeManagerImpl.java b/server/src/com/cloud/storage/VolumeManagerImpl.java index faa4ed31914..31b52ca9e2b 100644 --- a/server/src/com/cloud/storage/VolumeManagerImpl.java +++ b/server/src/com/cloud/storage/VolumeManagerImpl.java @@ -2133,6 +2133,16 @@ public class VolumeManagerImpl extends ManagerBase implements VolumeManager { } catch (NoTransitionException e) { s_logger.debug("Unable to destroy existing volume: " + e.toString()); } + // In case of VMware VM will continue to use the old root disk until expunged, so force expunge old root disk + if (vm.getHypervisorType() == HypervisorType.VMware) { + s_logger.info("Expunging volume " + existingVolume.getId() + " from primary data store"); + AsyncCallFuture future = volService.expungeVolumeAsync(volFactory.getVolume(existingVolume.getId())); + try { + future.get(); + } catch (Exception e) { + s_logger.debug("Failed to expunge volume:" + existingVolume.getId(), e); + } + } txn.commit(); return newVolume;