mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-11-04 00:02:37 +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