diff --git a/engine/components-api/src/com/cloud/vm/VmWorkJobHandlerProxy.java b/engine/components-api/src/com/cloud/vm/VmWorkJobHandlerProxy.java index 65502817cfe..ce10a83c7cd 100644 --- a/engine/components-api/src/com/cloud/vm/VmWorkJobHandlerProxy.java +++ b/engine/components-api/src/com/cloud/vm/VmWorkJobHandlerProxy.java @@ -16,6 +16,7 @@ // under the License. package com.cloud.vm; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; @@ -98,24 +99,35 @@ public class VmWorkJobHandlerProxy implements VmWorkJobHandler { Method method = getHandlerMethod(work.getClass()); if (method != null) { - if (s_logger.isDebugEnabled()) - s_logger.debug("Execute VM work job: " + work.getClass().getName() + _gsonLogger.toJson(work)); - Object obj = method.invoke(_target, work); + try { + if (s_logger.isDebugEnabled()) + s_logger.debug("Execute VM work job: " + work.getClass().getName() + _gsonLogger.toJson(work)); - if (s_logger.isDebugEnabled()) - s_logger.debug("Done executing VM work job: " + work.getClass().getName() + _gsonLogger.toJson(work)); + Object obj = method.invoke(_target, work); - assert (obj instanceof Pair); - return (Pair)obj; + if (s_logger.isDebugEnabled()) + s_logger.debug("Done executing VM work job: " + work.getClass().getName() + _gsonLogger.toJson(work)); + + assert (obj instanceof Pair); + return (Pair)obj; + } catch (InvocationTargetException e) { + s_logger.error("Invocation exception, caused by: " + e.getCause()); + + // legacy CloudStack code relies on checked exception for error handling + // we need to re-throw the real exception here + if (e.getCause() != null && e.getCause() instanceof Exception) { + s_logger.info("Rethrow exception " + e.getCause()); + throw (Exception)e.getCause(); + } + + throw e; + } } else { s_logger.error("Unable to find handler for VM work job: " + work.getClass().getName() + _gsonLogger.toJson(work)); - RuntimeException e = new RuntimeException("Unsupported VM work job: " + work.getClass().getName() + _gsonLogger.toJson(work)); - String exceptionJson = JobSerializerHelper.toSerializedString(e); - - s_logger.error("Serialize exception object into json: " + exceptionJson); - return new Pair(JobInfo.Status.FAILED, exceptionJson); + RuntimeException ex = new RuntimeException("Unable to find handler for VM work job: " + work.getClass().getName()); + return new Pair(JobInfo.Status.FAILED, JobSerializerHelper.toObjectSerializedString(ex)); } } } diff --git a/server/src/com/cloud/storage/VolumeApiServiceImpl.java b/server/src/com/cloud/storage/VolumeApiServiceImpl.java index e7d51647885..179a10c63d7 100644 --- a/server/src/com/cloud/storage/VolumeApiServiceImpl.java +++ b/server/src/com/cloud/storage/VolumeApiServiceImpl.java @@ -165,6 +165,7 @@ import com.cloud.vm.VirtualMachineManager; import com.cloud.vm.VmWork; import com.cloud.vm.VmWorkConstants; import com.cloud.vm.VmWorkJobHandler; +import com.cloud.vm.VmWorkJobHandlerProxy; import com.cloud.vm.VmWorkSerializer; import com.cloud.vm.dao.ConsoleProxyDao; import com.cloud.vm.dao.DomainRouterDao;