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) {
if (diskInfoBuilder != null) {
VolumeObjectTO volume = (VolumeObjectTO)vol.getData();
String dsName = volume.getDataStore().getUuid().replace("-", "");
Map<String, String> 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;

View File

@ -61,9 +61,9 @@ public class VirtualMachineDiskInfoBuilder {
return null;
}
public VirtualMachineDiskInfo getDiskInfoByBackingFileBaseName(String diskBackingFileBaseName) {
public VirtualMachineDiskInfo getDiskInfoByBackingFileBaseName(String diskBackingFileBaseName, String dataStoreName) {
for (Map.Entry<String, List<String>> 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<String> chain, String diskBackingFileBaseName) {
private static boolean chainContains(List<String> 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;
}