From 07abcf570581f84c281c8fa1b72a16dd5d0cdc47 Mon Sep 17 00:00:00 2001 From: Harikrishna Patnala Date: Fri, 9 Oct 2020 02:01:56 +0530 Subject: [PATCH] During migrate volume command, when operation timed out exception or any exception is occured it is not handled properly to clean the volume_store_ref entry. Fixed it to clean the volume_store_ref entry upon on any exception --- .../motion/AncientDataMotionStrategy.java | 62 +++++++++++-------- 1 file changed, 36 insertions(+), 26 deletions(-) diff --git a/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java b/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java index 7c930fb34c9..c49ffba0b82 100644 --- a/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java +++ b/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java @@ -356,37 +356,47 @@ public class AncientDataMotionStrategy implements DataMotionStrategy { DataObject objOnImageStore = imageStore.create(srcData); objOnImageStore.processEvent(Event.CreateOnlyRequested); - Answer answer = copyObject(srcData, objOnImageStore); - if (answer == null || !answer.getResult()) { - if (answer != null) { - s_logger.debug("copy to image store failed: " + answer.getDetails()); + Answer answer = null; + try { + answer = copyObject(srcData, objOnImageStore); + + if (answer == null || !answer.getResult()) { + if (answer != null) { + s_logger.debug("copy to image store failed: " + answer.getDetails()); + } + objOnImageStore.processEvent(Event.OperationFailed); + imageStore.delete(objOnImageStore); + return answer; } - objOnImageStore.processEvent(Event.OperationFailed); - imageStore.delete(objOnImageStore); - return answer; - } - objOnImageStore.processEvent(Event.OperationSuccessed, answer); + objOnImageStore.processEvent(Event.OperationSuccessed, answer); - objOnImageStore.processEvent(Event.CopyingRequested); + objOnImageStore.processEvent(Event.CopyingRequested); - CopyCommand cmd = new CopyCommand(objOnImageStore.getTO(), addFullCloneFlagOnVMwareDest(destData.getTO()), _copyvolumewait, VirtualMachineManager.ExecuteInSequence.value()); - EndPoint ep = selector.select(objOnImageStore, destData); - if (ep == null) { - String errMsg = "No remote endpoint to send command, check if host or ssvm is down?"; - s_logger.error(errMsg); - answer = new Answer(cmd, false, errMsg); - } else { - answer = ep.sendMessage(cmd); - } - - if (answer == null || !answer.getResult()) { - if (answer != null) { - s_logger.debug("copy to primary store failed: " + answer.getDetails()); + CopyCommand cmd = new CopyCommand(objOnImageStore.getTO(), addFullCloneFlagOnVMwareDest(destData.getTO()), _copyvolumewait, VirtualMachineManager.ExecuteInSequence.value()); + EndPoint ep = selector.select(objOnImageStore, destData); + if (ep == null) { + String errMsg = "No remote endpoint to send command, check if host or ssvm is down?"; + s_logger.error(errMsg); + answer = new Answer(cmd, false, errMsg); + } else { + answer = ep.sendMessage(cmd); } - objOnImageStore.processEvent(Event.OperationFailed); - imageStore.delete(objOnImageStore); - return answer; + + if (answer == null || !answer.getResult()) { + if (answer != null) { + s_logger.debug("copy to primary store failed: " + answer.getDetails()); + } + objOnImageStore.processEvent(Event.OperationFailed); + imageStore.delete(objOnImageStore); + return answer; + } + } catch (Exception e) { + if (imageStore.exists(objOnImageStore)) { + objOnImageStore.processEvent(Event.OperationFailed); + imageStore.delete(objOnImageStore); + } + throw e; } objOnImageStore.processEvent(Event.OperationSuccessed);