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) + | ||||
|                     ", datastore: " + morDs.getValue()); | ||||
| 
 | ||||
|         VirtualDevice newDisk = VmwareHelper.prepareDiskDevice(this, null, getScsiDeviceControllerKey(), vmdkDatastorePathChain, morDs, -1, 1); | ||||
|         VirtualMachineConfigSpec reConfigSpec = new VirtualMachineConfigSpec(); | ||||
|         VirtualDeviceConfigSpec deviceConfigSpec = new VirtualDeviceConfigSpec(); | ||||
|         synchronized (_mor.getValue().intern()) { | ||||
|             VirtualDevice newDisk = VmwareHelper.prepareDiskDevice(this, null, getScsiDeviceControllerKey(), vmdkDatastorePathChain, morDs, -1, 1); | ||||
|             VirtualMachineConfigSpec reConfigSpec = new VirtualMachineConfigSpec(); | ||||
|             VirtualDeviceConfigSpec deviceConfigSpec = new VirtualDeviceConfigSpec(); | ||||
| 
 | ||||
|         deviceConfigSpec.setDevice(newDisk); | ||||
|         deviceConfigSpec.setOperation(VirtualDeviceConfigSpecOperation.ADD); | ||||
|             deviceConfigSpec.setDevice(newDisk); | ||||
|             deviceConfigSpec.setOperation(VirtualDeviceConfigSpecOperation.ADD); | ||||
| 
 | ||||
|         reConfigSpec.getDeviceChange().add(deviceConfigSpec); | ||||
|             reConfigSpec.getDeviceChange().add(deviceConfigSpec); | ||||
| 
 | ||||
|         ManagedObjectReference morTask = _context.getService().reconfigVMTask(_mor, reConfigSpec); | ||||
|         boolean result = _context.getVimClient().waitForTask(morTask); | ||||
|             ManagedObjectReference morTask = _context.getService().reconfigVMTask(_mor, reConfigSpec); | ||||
|             boolean result = _context.getVimClient().waitForTask(morTask); | ||||
| 
 | ||||
|         if (!result) { | ||||
|             if (s_logger.isTraceEnabled()) | ||||
|                 s_logger.trace("vCenter API trace - attachDisk() done(failed)"); | ||||
|             throw new Exception("Failed to attach disk due to " + TaskMO.getTaskFailureInfo(_context, morTask)); | ||||
|             if (!result) { | ||||
|                 if (s_logger.isTraceEnabled()) | ||||
|                     s_logger.trace("vCenter API trace - attachDisk() done(failed)"); | ||||
|                 throw new Exception("Failed to attach disk due to " + TaskMO.getTaskFailureInfo(_context, morTask)); | ||||
|             } | ||||
| 
 | ||||
|             _context.waitForTaskProgressDone(morTask); | ||||
|         } | ||||
| 
 | ||||
|         _context.waitForTaskProgressDone(morTask); | ||||
| 
 | ||||
|         if (s_logger.isTraceEnabled()) | ||||
|             s_logger.trace("vCenter API trace - attachDisk() done(successfully)"); | ||||
|     } | ||||
| @ -1085,26 +1087,28 @@ public class VirtualMachineMO extends BaseMO { | ||||
|         if (s_logger.isTraceEnabled()) | ||||
|             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); | ||||
|         VirtualMachineConfigSpec reConfigSpec = new VirtualMachineConfigSpec(); | ||||
|         VirtualDeviceConfigSpec deviceConfigSpec = new VirtualDeviceConfigSpec(); | ||||
|         synchronized (_mor.getValue().intern()) { | ||||
|             VirtualDevice newDisk = VmwareHelper.prepareDiskDevice(this, controllerKey, vmdkDatastorePathChain, -1, 1); | ||||
|             VirtualMachineConfigSpec reConfigSpec = new VirtualMachineConfigSpec(); | ||||
|             VirtualDeviceConfigSpec deviceConfigSpec = new VirtualDeviceConfigSpec(); | ||||
| 
 | ||||
|         deviceConfigSpec.setDevice(newDisk); | ||||
|         deviceConfigSpec.setOperation(VirtualDeviceConfigSpecOperation.ADD); | ||||
|             deviceConfigSpec.setDevice(newDisk); | ||||
|             deviceConfigSpec.setOperation(VirtualDeviceConfigSpecOperation.ADD); | ||||
| 
 | ||||
|         reConfigSpec.getDeviceChange().add(deviceConfigSpec); | ||||
|             reConfigSpec.getDeviceChange().add(deviceConfigSpec); | ||||
| 
 | ||||
|         ManagedObjectReference morTask = _context.getService().reconfigVMTask(_mor, reConfigSpec); | ||||
|         boolean result = _context.getVimClient().waitForTask(morTask); | ||||
|             ManagedObjectReference morTask = _context.getService().reconfigVMTask(_mor, reConfigSpec); | ||||
|             boolean result = _context.getVimClient().waitForTask(morTask); | ||||
| 
 | ||||
|         if (!result) { | ||||
|             if (s_logger.isTraceEnabled()) | ||||
|                 s_logger.trace("vCenter API trace - attachDisk() done(failed)"); | ||||
|             throw new Exception("Failed to attach disk due to " + TaskMO.getTaskFailureInfo(_context, morTask)); | ||||
|             if (!result) { | ||||
|                 if (s_logger.isTraceEnabled()) | ||||
|                     s_logger.trace("vCenter API trace - attachDisk() done(failed)"); | ||||
|                 throw new Exception("Failed to attach disk due to " + TaskMO.getTaskFailureInfo(_context, morTask)); | ||||
|             } | ||||
| 
 | ||||
|             _context.waitForTaskProgressDone(morTask); | ||||
|         } | ||||
| 
 | ||||
|         _context.waitForTaskProgressDone(morTask); | ||||
| 
 | ||||
|         if (s_logger.isTraceEnabled()) | ||||
|             s_logger.trace("vCenter API trace - attachDisk() done(successfully)"); | ||||
|     } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user