From 8bb4022f3729154f85036c4a7f55e2de783e4909 Mon Sep 17 00:00:00 2001 From: Likitha Shetty Date: Fri, 8 Aug 2014 14:20:03 +0530 Subject: [PATCH] CLOUDSTACK-4587. System VMs fail to start when the primary storage that has the System VMs is put into maintenance. During VM start while configuring its disk devices, obtain the matching disk for a volume in storage using both the volume's path and volume's datastore information. --- .../hypervisor/vmware/resource/VmwareResource.java | 5 +++-- .../vmware/mo/VirtualMachineDiskInfoBuilder.java | 10 +++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java index 60007e390ee..7474d5c8327 100755 --- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java +++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java @@ -1999,12 +1999,13 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa private VirtualMachineDiskInfo getMatchingExistingDisk(VirtualMachineDiskInfoBuilder diskInfoBuilder, DiskTO vol) { if (diskInfoBuilder != null) { VolumeObjectTO volume = (VolumeObjectTO)vol.getData(); + String dsName = volume.getDataStore().getUuid().replace("-", ""); Map details = vol.getDetails(); boolean isManaged = details != null && Boolean.parseBoolean(details.get(DiskTO.MANAGED)); VirtualMachineDiskInfo diskInfo = - diskInfoBuilder.getDiskInfoByBackingFileBaseName(isManaged ? new DatastoreFile(volume.getPath()).getFileBaseName() : volume.getPath()); + diskInfoBuilder.getDiskInfoByBackingFileBaseName(isManaged ? new DatastoreFile(volume.getPath()).getFileBaseName() : volume.getPath(), dsName); if (diskInfo != null) { s_logger.info("Found existing disk info from volume path: " + volume.getPath()); return diskInfo; @@ -2017,7 +2018,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa if (disks.length > 0) { for (String diskPath : disks) { DatastoreFile file = new DatastoreFile(diskPath); - diskInfo = diskInfoBuilder.getDiskInfoByBackingFileBaseName(file.getFileBaseName()); + diskInfo = diskInfoBuilder.getDiskInfoByBackingFileBaseName(file.getFileBaseName(), dsName); if (diskInfo != null) { s_logger.info("Found existing disk from chain info: " + diskPath); return diskInfo; diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineDiskInfoBuilder.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineDiskInfoBuilder.java index 9e9fa8988a4..ba0a3ea9f25 100644 --- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineDiskInfoBuilder.java +++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineDiskInfoBuilder.java @@ -61,9 +61,9 @@ public class VirtualMachineDiskInfoBuilder { return null; } - public VirtualMachineDiskInfo getDiskInfoByBackingFileBaseName(String diskBackingFileBaseName) { + public VirtualMachineDiskInfo getDiskInfoByBackingFileBaseName(String diskBackingFileBaseName, String dataStoreName) { for (Map.Entry> entry : disks.entrySet()) { - if (chainContains(entry.getValue(), diskBackingFileBaseName)) { + if (chainContains(entry.getValue(), diskBackingFileBaseName, dataStoreName)) { VirtualMachineDiskInfo diskInfo = new VirtualMachineDiskInfo(); diskInfo.setDiskDeviceBusName(entry.getKey()); diskInfo.setDiskChain(entry.getValue().toArray(new String[1])); @@ -84,11 +84,11 @@ public class VirtualMachineDiskInfoBuilder { return chain; } - private static boolean chainContains(List chain, String diskBackingFileBaseName) { + private static boolean chainContains(List chain, String diskBackingFileBaseName, String dataStoreName) { for (String backing : chain) { DatastoreFile file = new DatastoreFile(backing); - - if (file.getFileBaseName().equals(diskBackingFileBaseName)) + // Ensure matching disk exists in the right datastore + if (file.getFileBaseName().equals(diskBackingFileBaseName) && backing.contains(dataStoreName)) return true; }