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) { |     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; | ||||||
|  | |||||||
| @ -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; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user