mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-10-26 08:42:29 +01:00 
			
		
		
		
	CLOUDSTACK-7248. [VMware] Extract volume fails with an NPE.
Synchronize attach disk to VM on the VM object value instead of using a DB lock.
This commit is contained in:
		
							parent
							
								
									bb7fc59947
								
							
						
					
					
						commit
						b41a78ce0f
					
				| @ -1056,26 +1056,28 @@ public class VirtualMachineMO extends BaseMO { | |||||||
|             s_logger.trace("vCenter API trace - attachDisk(). target MOR: " + _mor.getValue() + ", vmdkDatastorePath: " + new Gson().toJson(vmdkDatastorePathChain) + |             s_logger.trace("vCenter API trace - attachDisk(). target MOR: " + _mor.getValue() + ", vmdkDatastorePath: " + new Gson().toJson(vmdkDatastorePathChain) + | ||||||
|                     ", datastore: " + morDs.getValue()); |                     ", datastore: " + morDs.getValue()); | ||||||
| 
 | 
 | ||||||
|         VirtualDevice newDisk = VmwareHelper.prepareDiskDevice(this, null, getScsiDeviceControllerKey(), vmdkDatastorePathChain, morDs, -1, 1); |         synchronized (_mor.getValue().intern()) { | ||||||
|         VirtualMachineConfigSpec reConfigSpec = new VirtualMachineConfigSpec(); |             VirtualDevice newDisk = VmwareHelper.prepareDiskDevice(this, null, getScsiDeviceControllerKey(), vmdkDatastorePathChain, morDs, -1, 1); | ||||||
|         VirtualDeviceConfigSpec deviceConfigSpec = new VirtualDeviceConfigSpec(); |             VirtualMachineConfigSpec reConfigSpec = new VirtualMachineConfigSpec(); | ||||||
|  |             VirtualDeviceConfigSpec deviceConfigSpec = new VirtualDeviceConfigSpec(); | ||||||
| 
 | 
 | ||||||
|         deviceConfigSpec.setDevice(newDisk); |             deviceConfigSpec.setDevice(newDisk); | ||||||
|         deviceConfigSpec.setOperation(VirtualDeviceConfigSpecOperation.ADD); |             deviceConfigSpec.setOperation(VirtualDeviceConfigSpecOperation.ADD); | ||||||
| 
 | 
 | ||||||
|         reConfigSpec.getDeviceChange().add(deviceConfigSpec); |             reConfigSpec.getDeviceChange().add(deviceConfigSpec); | ||||||
| 
 | 
 | ||||||
|         ManagedObjectReference morTask = _context.getService().reconfigVMTask(_mor, reConfigSpec); |             ManagedObjectReference morTask = _context.getService().reconfigVMTask(_mor, reConfigSpec); | ||||||
|         boolean result = _context.getVimClient().waitForTask(morTask); |             boolean result = _context.getVimClient().waitForTask(morTask); | ||||||
| 
 | 
 | ||||||
|         if (!result) { |             if (!result) { | ||||||
|             if (s_logger.isTraceEnabled()) |                 if (s_logger.isTraceEnabled()) | ||||||
|                 s_logger.trace("vCenter API trace - attachDisk() done(failed)"); |                     s_logger.trace("vCenter API trace - attachDisk() done(failed)"); | ||||||
|             throw new Exception("Failed to attach disk due to " + TaskMO.getTaskFailureInfo(_context, morTask)); |                 throw new Exception("Failed to attach disk due to " + TaskMO.getTaskFailureInfo(_context, morTask)); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             _context.waitForTaskProgressDone(morTask); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         _context.waitForTaskProgressDone(morTask); |  | ||||||
| 
 |  | ||||||
|         if (s_logger.isTraceEnabled()) |         if (s_logger.isTraceEnabled()) | ||||||
|             s_logger.trace("vCenter API trace - attachDisk() done(successfully)"); |             s_logger.trace("vCenter API trace - attachDisk() done(successfully)"); | ||||||
|     } |     } | ||||||
| @ -1085,26 +1087,28 @@ public class VirtualMachineMO extends BaseMO { | |||||||
|         if (s_logger.isTraceEnabled()) |         if (s_logger.isTraceEnabled()) | ||||||
|             s_logger.trace("vCenter API trace - attachDisk(). target MOR: " + _mor.getValue() + ", vmdkDatastorePath: " + new Gson().toJson(vmdkDatastorePathChain)); |             s_logger.trace("vCenter API trace - attachDisk(). target MOR: " + _mor.getValue() + ", vmdkDatastorePath: " + new Gson().toJson(vmdkDatastorePathChain)); | ||||||
| 
 | 
 | ||||||
|         VirtualDevice newDisk = VmwareHelper.prepareDiskDevice(this, controllerKey, vmdkDatastorePathChain, -1, 1); |         synchronized (_mor.getValue().intern()) { | ||||||
|         VirtualMachineConfigSpec reConfigSpec = new VirtualMachineConfigSpec(); |             VirtualDevice newDisk = VmwareHelper.prepareDiskDevice(this, controllerKey, vmdkDatastorePathChain, -1, 1); | ||||||
|         VirtualDeviceConfigSpec deviceConfigSpec = new VirtualDeviceConfigSpec(); |             VirtualMachineConfigSpec reConfigSpec = new VirtualMachineConfigSpec(); | ||||||
|  |             VirtualDeviceConfigSpec deviceConfigSpec = new VirtualDeviceConfigSpec(); | ||||||
| 
 | 
 | ||||||
|         deviceConfigSpec.setDevice(newDisk); |             deviceConfigSpec.setDevice(newDisk); | ||||||
|         deviceConfigSpec.setOperation(VirtualDeviceConfigSpecOperation.ADD); |             deviceConfigSpec.setOperation(VirtualDeviceConfigSpecOperation.ADD); | ||||||
| 
 | 
 | ||||||
|         reConfigSpec.getDeviceChange().add(deviceConfigSpec); |             reConfigSpec.getDeviceChange().add(deviceConfigSpec); | ||||||
| 
 | 
 | ||||||
|         ManagedObjectReference morTask = _context.getService().reconfigVMTask(_mor, reConfigSpec); |             ManagedObjectReference morTask = _context.getService().reconfigVMTask(_mor, reConfigSpec); | ||||||
|         boolean result = _context.getVimClient().waitForTask(morTask); |             boolean result = _context.getVimClient().waitForTask(morTask); | ||||||
| 
 | 
 | ||||||
|         if (!result) { |             if (!result) { | ||||||
|             if (s_logger.isTraceEnabled()) |                 if (s_logger.isTraceEnabled()) | ||||||
|                 s_logger.trace("vCenter API trace - attachDisk() done(failed)"); |                     s_logger.trace("vCenter API trace - attachDisk() done(failed)"); | ||||||
|             throw new Exception("Failed to attach disk due to " + TaskMO.getTaskFailureInfo(_context, morTask)); |                 throw new Exception("Failed to attach disk due to " + TaskMO.getTaskFailureInfo(_context, morTask)); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             _context.waitForTaskProgressDone(morTask); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         _context.waitForTaskProgressDone(morTask); |  | ||||||
| 
 |  | ||||||
|         if (s_logger.isTraceEnabled()) |         if (s_logger.isTraceEnabled()) | ||||||
|             s_logger.trace("vCenter API trace - attachDisk() done(successfully)"); |             s_logger.trace("vCenter API trace - attachDisk() done(successfully)"); | ||||||
|     } |     } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user