Return-Path: X-Original-To: apmail-cloudstack-commits-archive@www.apache.org Delivered-To: apmail-cloudstack-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 49C1F10797 for ; Thu, 9 Jan 2014 22:33:53 +0000 (UTC) Received: (qmail 39534 invoked by uid 500); 9 Jan 2014 22:33:50 -0000 Delivered-To: apmail-cloudstack-commits-archive@cloudstack.apache.org Received: (qmail 39456 invoked by uid 500); 9 Jan 2014 22:33:50 -0000 Mailing-List: contact commits-help@cloudstack.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cloudstack.apache.org Delivered-To: mailing list commits@cloudstack.apache.org Received: (qmail 39058 invoked by uid 99); 9 Jan 2014 22:33:50 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 09 Jan 2014 22:33:50 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id 21F1C8B46E9; Thu, 9 Jan 2014 22:33:50 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: kelveny@apache.org To: commits@cloudstack.apache.org Date: Thu, 09 Jan 2014 22:34:00 -0000 Message-Id: <05a5a54b360a4d95b628253236b71892@git.apache.org> In-Reply-To: References: X-Mailer: ASF-Git Admin Mailer Subject: [12/13] git commit: updated refs/heads/master to 1e2e1ea CLOUDSTACK-5765: cleanup internal serialization and exception propagation issues Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/1e2e1ea0 Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/1e2e1ea0 Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/1e2e1ea0 Branch: refs/heads/master Commit: 1e2e1ea0515178d40efc536dfa3328de4b8d48e1 Parents: a05d71a Author: Kelven Yang Authored: Tue Jan 7 17:11:48 2014 -0800 Committer: Kelven Yang Committed: Thu Jan 9 14:29:13 2014 -0800 ---------------------------------------------------------------------- api/src/com/cloud/deploy/DeployDestination.java | 21 +++++---- api/src/com/cloud/deploy/DeploymentPlanner.java | 5 +- api/src/com/cloud/exception/CloudException.java | 5 +- .../exception/OperationTimedoutException.java | 10 +++- .../src/com/cloud/vm/VirtualMachineManager.java | 4 +- .../src/com/cloud/vm/VmWorkJobHandlerProxy.java | 4 +- .../com/cloud/vm/VirtualMachineManagerImpl.java | 36 +++++++------- .../src/com/cloud/vm/VmWorkJobDispatcher.java | 6 +-- .../src/com/cloud/vm/VmWorkReconfigure.java | 11 ++--- .../com/cloud/service/ServiceOfferingVO.java | 26 +++++------ .../vm/snapshot/VMSnapshotManagerImpl.java | 2 +- .../utils/exception/CloudRuntimeException.java | 49 +++++++++++++++++++- .../utils/exception/ExceptionProxyObject.java | 14 ++++-- 13 files changed, 131 insertions(+), 62 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1e2e1ea0/api/src/com/cloud/deploy/DeployDestination.java ---------------------------------------------------------------------- diff --git a/api/src/com/cloud/deploy/DeployDestination.java b/api/src/com/cloud/deploy/DeployDestination.java index 05625d6..4ded5eb 100644 --- a/api/src/com/cloud/deploy/DeployDestination.java +++ b/api/src/com/cloud/deploy/DeployDestination.java @@ -16,6 +16,7 @@ // under the License. package com.cloud.deploy; +import java.io.Serializable; import java.util.Map; import com.cloud.dc.DataCenter; @@ -26,7 +27,9 @@ import com.cloud.storage.StoragePool; import com.cloud.storage.Volume; import com.cloud.utils.NumbersUtil; -public class DeployDestination { +public class DeployDestination implements Serializable { + private static final long serialVersionUID = 7113840781939014695L; + DataCenter _dc; Pod _pod; Cluster _cluster; @@ -76,28 +79,28 @@ public class DeployDestination { @Override public boolean equals(Object obj) { DeployDestination that = (DeployDestination)obj; - if (this._dc == null || that._dc == null) { + if (_dc == null || that._dc == null) { return false; } - if (this._dc.getId() != that._dc.getId()) { + if (_dc.getId() != that._dc.getId()) { return false; } - if (this._pod == null || that._pod == null) { + if (_pod == null || that._pod == null) { return false; } - if (this._pod.getId() != that._pod.getId()) { + if (_pod.getId() != that._pod.getId()) { return false; } - if (this._cluster == null || that._cluster == null) { + if (_cluster == null || that._cluster == null) { return false; } - if (this._cluster.getId() != that._cluster.getId()) { + if (_cluster.getId() != that._cluster.getId()) { return false; } - if (this._host == null || that._host == null) { + if (_host == null || that._host == null) { return false; } - return this._host.getId() == that._host.getId(); + return _host.getId() == that._host.getId(); } @Override http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1e2e1ea0/api/src/com/cloud/deploy/DeploymentPlanner.java ---------------------------------------------------------------------- diff --git a/api/src/com/cloud/deploy/DeploymentPlanner.java b/api/src/com/cloud/deploy/DeploymentPlanner.java index 35f406d..0dccf3d 100644 --- a/api/src/com/cloud/deploy/DeploymentPlanner.java +++ b/api/src/com/cloud/deploy/DeploymentPlanner.java @@ -16,6 +16,7 @@ // under the License. package com.cloud.deploy; +import java.io.Serializable; import java.util.Collection; import java.util.HashSet; import java.util.Set; @@ -89,7 +90,9 @@ public interface DeploymentPlanner extends Adapter { Shared, Dedicated; } - public static class ExcludeList { + public static class ExcludeList implements Serializable { + private static final long serialVersionUID = -482175549460148301L; + private Set _dcIds; private Set _podIds; private Set _clusterIds; http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1e2e1ea0/api/src/com/cloud/exception/CloudException.java ---------------------------------------------------------------------- diff --git a/api/src/com/cloud/exception/CloudException.java b/api/src/com/cloud/exception/CloudException.java index f898719..f35249b 100644 --- a/api/src/com/cloud/exception/CloudException.java +++ b/api/src/com/cloud/exception/CloudException.java @@ -27,6 +27,7 @@ import com.cloud.utils.exception.CSExceptionErrorCode; */ public class CloudException extends Exception { + private static final long serialVersionUID = 8784427323859682503L; // This holds a list of uuids and their names. Add uuid:fieldname pairs protected ArrayList idList = new ArrayList(); @@ -58,10 +59,10 @@ public class CloudException extends Exception { } public void setCSErrorCode(int cserrcode) { - this.csErrorCode = cserrcode; + csErrorCode = cserrcode; } public int getCSErrorCode() { - return this.csErrorCode; + return csErrorCode; } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1e2e1ea0/api/src/com/cloud/exception/OperationTimedoutException.java ---------------------------------------------------------------------- diff --git a/api/src/com/cloud/exception/OperationTimedoutException.java b/api/src/com/cloud/exception/OperationTimedoutException.java index d531c32..fe27408 100644 --- a/api/src/com/cloud/exception/OperationTimedoutException.java +++ b/api/src/com/cloud/exception/OperationTimedoutException.java @@ -28,7 +28,15 @@ public class OperationTimedoutException extends CloudException { long _agentId; long _seqId; int _time; - Command[] _cmds; + + // TODO + // I did a reference search on usage of getCommands() and found none + // + // to prevent serialization problems across boundaries, I'm disabling serialization of _cmds here + // getCommands() will still be available within the same serialization boundary, but it will be lost + // when exception is propagated across job boundaries. + // + transient Command[] _cmds; boolean _isActive; public OperationTimedoutException(Command[] cmds, long agentId, long seqId, int time, boolean isActive) { http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1e2e1ea0/engine/api/src/com/cloud/vm/VirtualMachineManager.java ---------------------------------------------------------------------- diff --git a/engine/api/src/com/cloud/vm/VirtualMachineManager.java b/engine/api/src/com/cloud/vm/VirtualMachineManager.java index 0de5156..ac79860 100644 --- a/engine/api/src/com/cloud/vm/VirtualMachineManager.java +++ b/engine/api/src/com/cloud/vm/VirtualMachineManager.java @@ -190,7 +190,9 @@ public interface VirtualMachineManager extends Manager { */ VirtualMachineTO toVmTO(VirtualMachineProfile profile); - VirtualMachine reConfigureVm(String vmUuid, ServiceOffering newServiceOffering, boolean sameHost) throws ResourceUnavailableException, ConcurrentOperationException; + VirtualMachine reConfigureVm(String vmUuid, ServiceOffering newServiceOffering, boolean sameHost) throws ResourceUnavailableException, ConcurrentOperationException, + InsufficientServerCapacityException; + void findHostAndMigrate(String vmUuid, Long newSvcOfferingId, DeploymentPlanner.ExcludeList excludeHostList) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException; http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1e2e1ea0/engine/components-api/src/com/cloud/vm/VmWorkJobHandlerProxy.java ---------------------------------------------------------------------- diff --git a/engine/components-api/src/com/cloud/vm/VmWorkJobHandlerProxy.java b/engine/components-api/src/com/cloud/vm/VmWorkJobHandlerProxy.java index 574e60f..ce10a83 100644 --- a/engine/components-api/src/com/cloud/vm/VmWorkJobHandlerProxy.java +++ b/engine/components-api/src/com/cloud/vm/VmWorkJobHandlerProxy.java @@ -116,8 +116,10 @@ public class VmWorkJobHandlerProxy implements VmWorkJobHandler { // 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) + if (e.getCause() != null && e.getCause() instanceof Exception) { + s_logger.info("Rethrow exception " + e.getCause()); throw (Exception)e.getCause(); + } throw e; } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1e2e1ea0/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java ---------------------------------------------------------------------- diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java index 0653747..c553607 100755 --- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -3670,7 +3670,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac @Override public VMInstanceVO reConfigureVm(String vmUuid, ServiceOffering oldServiceOffering, boolean reconfiguringOnExistingHost) - throws ResourceUnavailableException, ConcurrentOperationException { + throws ResourceUnavailableException, InsufficientServerCapacityException, ConcurrentOperationException { AsyncJobExecutionContext jobContext = AsyncJobExecutionContext.getCurrentExecutionContext(); if (!VmJobEnabled.value() || jobContext.isJobDispatchedBy(VmWorkConstants.VM_WORK_JOB_DISPATCHER)) { @@ -3688,20 +3688,21 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac throw new RuntimeException("Execution excetion", e); } - AsyncJobVO jobVo = _entityMgr.findById(AsyncJobVO.class, outcome.getJob().getId()); - if (jobVo.getResultCode() == JobInfo.Status.SUCCEEDED.ordinal()) { - return _entityMgr.findById(VMInstanceVO.class, vm.getId()); - } else { - Object jobResult = _jobMgr.unmarshallResultObject(outcome.getJob()); - if (jobResult != null) { - if (jobResult instanceof ResourceUnavailableException) - throw (ResourceUnavailableException)jobResult; - else if (jobResult instanceof ConcurrentOperationException) - throw (ConcurrentOperationException)jobResult; + Object jobResult = _jobMgr.unmarshallResultObject(outcome.getJob()); + if (jobResult != null) { + if (jobResult instanceof ResourceUnavailableException) + throw (ResourceUnavailableException)jobResult; + else if (jobResult instanceof ConcurrentOperationException) + throw (ConcurrentOperationException)jobResult; + else if (jobResult instanceof InsufficientServerCapacityException) + throw (InsufficientServerCapacityException)jobResult; + else if (jobResult instanceof Throwable) { + s_logger.error("Unhandled exception", (Throwable)jobResult); + throw new RuntimeException("Unhandled exception", (Throwable)jobResult); } - - throw new RuntimeException("Failed with un-handled exception"); } + + return (VMInstanceVO)vm; } } @@ -4633,7 +4634,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac } public Outcome reconfigureVmThroughJobQueue( - final String vmUuid, final ServiceOffering oldServiceOffering, final boolean reconfiguringOnExistingHost) { + final String vmUuid, final ServiceOffering newServiceOffering, final boolean reconfiguringOnExistingHost) { final CallContext context = CallContext.current(); final User user = context.getCallingUser(); @@ -4668,7 +4669,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac // save work context info (there are some duplications) VmWorkReconfigure workInfo = new VmWorkReconfigure(user.getId(), account.getId(), vm.getId(), - VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, oldServiceOffering, reconfiguringOnExistingHost); + VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, newServiceOffering.getId(), reconfiguringOnExistingHost); workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo)); _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId()); @@ -4796,7 +4797,10 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac s_logger.info("Unable to find vm " + work.getVmId()); } assert (vm != null); - reConfigureVm(vm.getUuid(), work.getNewServiceOffering(), + + ServiceOffering newServiceOffering = _offeringDao.findById(vm.getId(), work.getNewServiceOfferingId()); + + reConfigureVm(vm.getUuid(), newServiceOffering, work.isSameHost()); return new Pair(JobInfo.Status.SUCCEEDED, null); } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1e2e1ea0/engine/orchestration/src/com/cloud/vm/VmWorkJobDispatcher.java ---------------------------------------------------------------------- diff --git a/engine/orchestration/src/com/cloud/vm/VmWorkJobDispatcher.java b/engine/orchestration/src/com/cloud/vm/VmWorkJobDispatcher.java index 95314e3..285c8a2 100644 --- a/engine/orchestration/src/com/cloud/vm/VmWorkJobDispatcher.java +++ b/engine/orchestration/src/com/cloud/vm/VmWorkJobDispatcher.java @@ -26,7 +26,6 @@ import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.framework.jobs.AsyncJob; import org.apache.cloudstack.framework.jobs.AsyncJobDispatcher; import org.apache.cloudstack.framework.jobs.AsyncJobManager; -import org.apache.cloudstack.framework.jobs.impl.JobSerializerHelper; import org.apache.cloudstack.jobs.JobInfo; import com.cloud.utils.Pair; @@ -105,9 +104,8 @@ public class VmWorkJobDispatcher extends AdapterBase implements AsyncJobDispatch } catch(Throwable e) { s_logger.error("Unable to complete " + job + ", job origin:" + job.getRelated(), e); - String exceptionJson = JobSerializerHelper.toSerializedString(e); - s_logger.info("Serialize exception object into json: " + exceptionJson + ", job origin: " + job.getRelated()); - _asyncJobMgr.completeAsyncJob(job.getId(), JobInfo.Status.FAILED, 0, exceptionJson); + RuntimeException ex = new RuntimeException("Job failed due to exception " + e.getMessage()); + _asyncJobMgr.completeAsyncJob(job.getId(), JobInfo.Status.FAILED, 0, _asyncJobMgr.marshallResultObject(ex)); } finally { CallContext.unregister(); } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1e2e1ea0/engine/orchestration/src/com/cloud/vm/VmWorkReconfigure.java ---------------------------------------------------------------------- diff --git a/engine/orchestration/src/com/cloud/vm/VmWorkReconfigure.java b/engine/orchestration/src/com/cloud/vm/VmWorkReconfigure.java index 4c564d5..17abeb2 100644 --- a/engine/orchestration/src/com/cloud/vm/VmWorkReconfigure.java +++ b/engine/orchestration/src/com/cloud/vm/VmWorkReconfigure.java @@ -16,25 +16,24 @@ // under the License. package com.cloud.vm; -import com.cloud.offering.ServiceOffering; public class VmWorkReconfigure extends VmWork { private static final long serialVersionUID = -4517030323758086615L; - ServiceOffering newServiceOffering; + Long newServiceOfferingId; boolean sameHost; public VmWorkReconfigure(long userId, long accountId, long vmId, String handlerName, - ServiceOffering newServiceOffering, boolean sameHost) { + Long newServiceOfferingId, boolean sameHost) { super(userId, accountId, vmId, handlerName); - this.newServiceOffering = newServiceOffering; + this.newServiceOfferingId = newServiceOfferingId; this.sameHost = sameHost; } - public ServiceOffering getNewServiceOffering() { - return newServiceOffering; + public Long getNewServiceOfferingId() { + return newServiceOfferingId; } public boolean isSameHost() { http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1e2e1ea0/engine/schema/src/com/cloud/service/ServiceOfferingVO.java ---------------------------------------------------------------------- diff --git a/engine/schema/src/com/cloud/service/ServiceOfferingVO.java b/engine/schema/src/com/cloud/service/ServiceOfferingVO.java index b554a23..3873dd2 100755 --- a/engine/schema/src/com/cloud/service/ServiceOfferingVO.java +++ b/engine/schema/src/com/cloud/service/ServiceOfferingVO.java @@ -97,8 +97,8 @@ public class ServiceOfferingVO extends DiskOfferingVO implements ServiceOffering this.rateMbps = rateMbps; this.multicastRateMbps = multicastRateMbps; this.offerHA = offerHA; - this.limitCpuUse = false; - this.volatileVm = false; + limitCpuUse = false; + volatileVm = false; this.defaultUse = defaultUse; this.vmType = vmType == null ? null : vmType.toString().toLowerCase(); } @@ -174,16 +174,16 @@ public class ServiceOfferingVO extends DiskOfferingVO implements ServiceOffering offering.getSystemUse(), true, offering.getDomainId()); - this.cpu = offering.getCpu(); - this.ramSize = offering.getRamSize(); - this.speed = offering.getSpeed(); - this.rateMbps = offering.getRateMbps(); - this.multicastRateMbps = offering.getMulticastRateMbps(); - this.offerHA = offering.getOfferHA(); - this.limitCpuUse = offering.getLimitCpuUse(); - this.volatileVm = offering.getVolatileVm(); - this.hostTag = offering.getHostTag(); - this.vmType = offering.getSystemVmType(); + cpu = offering.getCpu(); + ramSize = offering.getRamSize(); + speed = offering.getSpeed(); + rateMbps = offering.getRateMbps(); + multicastRateMbps = offering.getMulticastRateMbps(); + offerHA = offering.getOfferHA(); + limitCpuUse = offering.getLimitCpuUse(); + volatileVm = offering.getVolatileVm(); + hostTag = offering.getHostTag(); + vmType = offering.getSystemVmType(); } @Override @@ -325,6 +325,6 @@ public class ServiceOfferingVO extends DiskOfferingVO implements ServiceOffering } public void setDynamicFlag(boolean isdynamic) { - this.isDynamic = isdynamic; + isDynamic = isdynamic; } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1e2e1ea0/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java b/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java index 2a5009e..7d6e0ec 100644 --- a/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java +++ b/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java @@ -131,7 +131,7 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana // TODO static final ConfigKey VmJobEnabled = new ConfigKey("Advanced", - Boolean.class, "vm.job.enabled", "true", + Boolean.class, "vm.job.enabled", "false", "True to enable new VM sync model. false to use the old way", false); static final ConfigKey VmJobCheckInterval = new ConfigKey("Advanced", Long.class, "vm.job.check.interval", "3000", http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1e2e1ea0/utils/src/com/cloud/utils/exception/CloudRuntimeException.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/exception/CloudRuntimeException.java b/utils/src/com/cloud/utils/exception/CloudRuntimeException.java index f2608ed..148c25b 100755 --- a/utils/src/com/cloud/utils/exception/CloudRuntimeException.java +++ b/utils/src/com/cloud/utils/exception/CloudRuntimeException.java @@ -16,6 +16,9 @@ // under the License. package com.cloud.utils.exception; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; import java.util.ArrayList; import java.util.List; @@ -30,9 +33,9 @@ public class CloudRuntimeException extends RuntimeException implements ErrorCont private static final long serialVersionUID = SerialVersionUID.CloudRuntimeException; // This holds a list of uuids and their descriptive names. - protected ArrayList idList = new ArrayList(); + transient protected ArrayList idList = new ArrayList(); - protected ArrayList, String>> uuidList = new ArrayList, String>>(); + transient protected ArrayList, String>> uuidList = new ArrayList, String>>(); protected int csErrorCode; @@ -48,6 +51,7 @@ public class CloudRuntimeException extends RuntimeException implements ErrorCont protected CloudRuntimeException() { super(); + setCSErrorCode(CSExceptionErrorCode.getCSErrCode(this.getClass().getName())); } @@ -90,4 +94,45 @@ public class CloudRuntimeException extends RuntimeException implements ErrorCont public List, String>> getEntitiesInError() { return uuidList; } + + private void writeObject(ObjectOutputStream out) throws IOException { + out.defaultWriteObject(); + + int idListSize = idList.size(); + out.writeInt(idListSize); + for (ExceptionProxyObject proxy : idList) { + out.writeObject(proxy); + } + + int uuidListSize = uuidList.size(); + out.writeInt(uuidListSize); + for (Pair, String> entry : uuidList) { + out.writeObject(entry.first().getCanonicalName()); + out.writeObject(entry.second()); + } + } + + private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { + in.defaultReadObject(); + + int idListSize = in.readInt(); + if (idList == null) + idList = new ArrayList(); + if (uuidList == null) + uuidList = new ArrayList, String>>(); + + for (int i = 0; i < idListSize; i++) { + ExceptionProxyObject proxy = (ExceptionProxyObject)in.readObject(); + + idList.add(proxy); + } + + int uuidListSize = in.readInt(); + for (int i = 0; i < uuidListSize; i++) { + String clzName = (String)in.readObject(); + String val = (String)in.readObject(); + + uuidList.add(new Pair, String>(Class.forName(clzName), val)); + } + } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1e2e1ea0/utils/src/com/cloud/utils/exception/ExceptionProxyObject.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/exception/ExceptionProxyObject.java b/utils/src/com/cloud/utils/exception/ExceptionProxyObject.java index ef84a14..0f1b4e0 100644 --- a/utils/src/com/cloud/utils/exception/ExceptionProxyObject.java +++ b/utils/src/com/cloud/utils/exception/ExceptionProxyObject.java @@ -16,17 +16,22 @@ // under the License. package com.cloud.utils.exception; -public class ExceptionProxyObject { +import java.io.Serializable; + + +public class ExceptionProxyObject implements Serializable { + private static final long serialVersionUID = -7514266713085362352L; + private String uuid; private String description; - public ExceptionProxyObject() { + public ExceptionProxyObject(){ } - public ExceptionProxyObject(String uuid, String desc) { + public ExceptionProxyObject(String uuid, String desc){ this.uuid = uuid; - this.description = desc; + description = desc; } public String getUuid() { @@ -44,5 +49,4 @@ public class ExceptionProxyObject { public void setDescription(String description) { this.description = description; } - }