diff --git a/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java b/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java index 68940d48b36..348c1423433 100644 --- a/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java +++ b/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java @@ -1123,12 +1123,6 @@ public class VolumeServiceImpl implements VolumeService { // Refresh the volume info from the DB. volumeInfo = volFactory.getVolume(volumeInfo.getId(), destPrimaryDataStore); - volumeInfo.processEvent(Event.CreateRequested); - CreateVolumeFromBaseImageContext context = new CreateVolumeFromBaseImageContext<>(null, volumeInfo, destPrimaryDataStore, srcTemplateOnPrimary, future, null, null); - AsyncCallbackDispatcher caller = AsyncCallbackDispatcher.create(this); - caller.setCallback(caller.getTarget().createVolumeFromBaseManagedImageCallBack(null, null)); - caller.setContext(context); - Map details = new HashMap(); details.put(PrimaryDataStore.MANAGED, Boolean.TRUE.toString()); details.put(PrimaryDataStore.STORAGE_HOST, destPrimaryDataStore.getHostAddress()); @@ -1141,6 +1135,13 @@ public class VolumeServiceImpl implements VolumeService { grantAccess(volumeInfo, destHost, destPrimaryDataStore); + volumeInfo.processEvent(Event.CreateRequested); + + CreateVolumeFromBaseImageContext context = new CreateVolumeFromBaseImageContext<>(null, volumeInfo, destPrimaryDataStore, srcTemplateOnPrimary, future, null, null); + AsyncCallbackDispatcher caller = AsyncCallbackDispatcher.create(this); + caller.setCallback(caller.getTarget().createVolumeFromBaseManagedImageCallBack(null, null)); + caller.setContext(context); + try { motionSrv.copyAsync(srcTemplateOnPrimary, volumeInfo, destHost, caller); } finally { @@ -1919,6 +1920,11 @@ public class VolumeServiceImpl implements VolumeService { AsyncCallFuture createVolumeFuture = createVolumeAsync(destVolume, destStore); VolumeApiResult createVolumeResult = createVolumeFuture.get(); if (createVolumeResult.isFailed()) { + s_logger.debug("Failed to create dest volume " + destVolume.getId() + ", volume can be removed"); + destroyVolume(destVolume.getId()); + destVolume.processEvent(Event.ExpungeRequested); + destVolume.processEvent(Event.OperationSuccessed); + volDao.remove(destVolume.getId()); throw new CloudRuntimeException("Creation of a dest volume failed: " + createVolumeResult.getResult()); }