Repository: cloudstack
Updated Branches:
  refs/heads/master 74847dce4 -> b41a78ce0


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.


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/b41a78ce
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/b41a78ce
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/b41a78ce

Branch: refs/heads/master
Commit: b41a78ce0f9cbc2981f6038e3e020ebab564ba0b
Parents: bb7fc59
Author: Likitha Shetty <[email protected]>
Authored: Fri Aug 8 15:26:56 2014 +0530
Committer: Likitha Shetty <[email protected]>
Committed: Fri Aug 8 15:31:03 2014 +0530

----------------------------------------------------------------------
 .../hypervisor/vmware/mo/VirtualMachineMO.java  | 60 +++++++++++---------
 1 file changed, 32 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b41a78ce/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
----------------------------------------------------------------------
diff --git 
a/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java 
b/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
index 2439691..c2e9d7f 100644
--- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
+++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
@@ -1056,25 +1056,27 @@ 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,25 +1087,27 @@ 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)");

Reply via email to