From 665d036e8bdbe97b5bbf3d2d7c64f2bd891d8e1a Mon Sep 17 00:00:00 2001 From: Likitha Shetty Date: Mon, 6 Jan 2014 14:19:31 +0530 Subject: [PATCH] CLOUDSTACK-5782. [VMware] Snapshot creation on a detached volume failes with NPE. For a detached volume, don't try to find the associated VM on the hypervisor/peer hypervisor host. By default create a worker VM to perform snapshot operations. --- .../resource/VmwareStorageProcessor.java | 42 ++++++++----------- 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java index 07b8db0bc01..0d9770931ae 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java +++ b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java @@ -1030,32 +1030,26 @@ public class VmwareStorageProcessor implements StorageProcessor { CopyCmdAnswer answer = null; try { - vmMo = hyperHost.findVmOnHyperHost(vmName); - if (vmMo == null) { - if(s_logger.isDebugEnabled()) { - s_logger.debug("Unable to find owner VM for BackupSnapshotCommand on host " + hyperHost.getHyperHostName() + ", will try within datacenter"); - } - - vmMo = hyperHost.findVmOnPeerHyperHost(vmName); - if(vmMo == null) { - dsMo = new DatastoreMO(hyperHost.getContext(), morDs); - - workerVMName = hostService.getWorkerName(context, cmd, 0); - - vmMo = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo, workerVMName); - - if (vmMo == null) { - throw new Exception("Failed to find the newly create or relocated VM. vmName: " + workerVMName); + if(vmName != null) { + vmMo = hyperHost.findVmOnHyperHost(vmName); + if (vmMo == null) { + if(s_logger.isDebugEnabled()) { + s_logger.debug("Unable to find owner VM for BackupSnapshotCommand on host " + hyperHost.getHyperHostName() + ", will try within datacenter"); } - workerVm = vmMo; - - // attach volume to worker VM - String datastoreVolumePath = dsMo.getDatastorePath(volumePath + ".vmdk"); - vmMo.attachDisk(new String[] { datastoreVolumePath }, morDs); - } else { - s_logger.info("Using owner VM " + vmName + " for snapshot operation"); - hasOwnerVm = true; + vmMo = hyperHost.findVmOnPeerHyperHost(vmName); } + } + if(vmMo == null) { + dsMo = new DatastoreMO(hyperHost.getContext(), morDs); + workerVMName = hostService.getWorkerName(context, cmd, 0); + vmMo = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo, workerVMName); + if (vmMo == null) { + throw new Exception("Failed to find the newly create or relocated VM. vmName: " + workerVMName); + } + workerVm = vmMo; + // attach volume to worker VM + String datastoreVolumePath = dsMo.getDatastorePath(volumePath + ".vmdk"); + vmMo.attachDisk(new String[] { datastoreVolumePath }, morDs); } else { s_logger.info("Using owner VM " + vmName + " for snapshot operation"); hasOwnerVm = true;