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.
This commit is contained in:
Likitha Shetty 2014-08-08 14:20:03 +05:30
parent 4e5dc59218
commit 8bb4022f37
2 changed files with 8 additions and 7 deletions

View File

@ -1999,12 +1999,13 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
private VirtualMachineDiskInfo getMatchingExistingDisk(VirtualMachineDiskInfoBuilder diskInfoBuilder, DiskTO vol) { private VirtualMachineDiskInfo getMatchingExistingDisk(VirtualMachineDiskInfoBuilder diskInfoBuilder, DiskTO vol) {
if (diskInfoBuilder != null) { if (diskInfoBuilder != null) {
VolumeObjectTO volume = (VolumeObjectTO)vol.getData(); VolumeObjectTO volume = (VolumeObjectTO)vol.getData();
String dsName = volume.getDataStore().getUuid().replace("-", "");
Map<String, String> details = vol.getDetails(); Map<String, String> details = vol.getDetails();
boolean isManaged = details != null && Boolean.parseBoolean(details.get(DiskTO.MANAGED)); boolean isManaged = details != null && Boolean.parseBoolean(details.get(DiskTO.MANAGED));
VirtualMachineDiskInfo diskInfo = 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) { if (diskInfo != null) {
s_logger.info("Found existing disk info from volume path: " + volume.getPath()); s_logger.info("Found existing disk info from volume path: " + volume.getPath());
return diskInfo; return diskInfo;
@ -2017,7 +2018,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
if (disks.length > 0) { if (disks.length > 0) {
for (String diskPath : disks) { for (String diskPath : disks) {
DatastoreFile file = new DatastoreFile(diskPath); DatastoreFile file = new DatastoreFile(diskPath);
diskInfo = diskInfoBuilder.getDiskInfoByBackingFileBaseName(file.getFileBaseName()); diskInfo = diskInfoBuilder.getDiskInfoByBackingFileBaseName(file.getFileBaseName(), dsName);
if (diskInfo != null) { if (diskInfo != null) {
s_logger.info("Found existing disk from chain info: " + diskPath); s_logger.info("Found existing disk from chain info: " + diskPath);
return diskInfo; return diskInfo;

View File

@ -61,9 +61,9 @@ public class VirtualMachineDiskInfoBuilder {
return null; return null;
} }
public VirtualMachineDiskInfo getDiskInfoByBackingFileBaseName(String diskBackingFileBaseName) { public VirtualMachineDiskInfo getDiskInfoByBackingFileBaseName(String diskBackingFileBaseName, String dataStoreName) {
for (Map.Entry<String, List<String>> entry : disks.entrySet()) { for (Map.Entry<String, List<String>> entry : disks.entrySet()) {
if (chainContains(entry.getValue(), diskBackingFileBaseName)) { if (chainContains(entry.getValue(), diskBackingFileBaseName, dataStoreName)) {
VirtualMachineDiskInfo diskInfo = new VirtualMachineDiskInfo(); VirtualMachineDiskInfo diskInfo = new VirtualMachineDiskInfo();
diskInfo.setDiskDeviceBusName(entry.getKey()); diskInfo.setDiskDeviceBusName(entry.getKey());
diskInfo.setDiskChain(entry.getValue().toArray(new String[1])); diskInfo.setDiskChain(entry.getValue().toArray(new String[1]));
@ -84,11 +84,11 @@ public class VirtualMachineDiskInfoBuilder {
return chain; return chain;
} }
private static boolean chainContains(List<String> chain, String diskBackingFileBaseName) { private static boolean chainContains(List<String> chain, String diskBackingFileBaseName, String dataStoreName) {
for (String backing : chain) { for (String backing : chain) {
DatastoreFile file = new DatastoreFile(backing); DatastoreFile file = new DatastoreFile(backing);
// Ensure matching disk exists in the right datastore
if (file.getFileBaseName().equals(diskBackingFileBaseName)) if (file.getFileBaseName().equals(diskBackingFileBaseName) && backing.contains(dataStoreName))
return true; return true;
} }