mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
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:
parent
4e5dc59218
commit
8bb4022f37
@ -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;
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user