From ebb30898c98dc538f9dffff970d74c597411d0ac Mon Sep 17 00:00:00 2001 From: Edison Su Date: Thu, 1 Aug 2013 13:57:47 -0700 Subject: [PATCH] CLOUDSTACK-4008: fix snapshot npe if its volume is deleted --- .../apache/cloudstack/storage/to/SnapshotObjectTO.java | 9 +++++++-- .../cloudstack/storage/volume/VolumeDataFactoryImpl.java | 3 +++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/engine/api/src/org/apache/cloudstack/storage/to/SnapshotObjectTO.java b/engine/api/src/org/apache/cloudstack/storage/to/SnapshotObjectTO.java index d2cb72a387c..b4829bf7aa4 100644 --- a/engine/api/src/org/apache/cloudstack/storage/to/SnapshotObjectTO.java +++ b/engine/api/src/org/apache/cloudstack/storage/to/SnapshotObjectTO.java @@ -22,6 +22,7 @@ import com.cloud.agent.api.to.DataObjectType; import com.cloud.agent.api.to.DataStoreTO; import com.cloud.agent.api.to.DataTO; import com.cloud.hypervisor.Hypervisor.HypervisorType; +import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; public class SnapshotObjectTO implements DataTO { private String path; @@ -40,8 +41,12 @@ public class SnapshotObjectTO implements DataTO { public SnapshotObjectTO(SnapshotInfo snapshot) { this.path = snapshot.getPath(); this.setId(snapshot.getId()); - this.volume = (VolumeObjectTO) snapshot.getBaseVolume().getTO(); - this.setVmName(snapshot.getBaseVolume().getAttachedVmName()); + VolumeInfo vol = snapshot.getBaseVolume(); + if (vol != null) { + this.volume = (VolumeObjectTO)vol.getTO(); + this.setVmName(vol.getAttachedVmName()); + } + SnapshotInfo parentSnapshot = snapshot.getParent(); if (parentSnapshot != null) { this.parentSnapshotPath = parentSnapshot.getPath(); diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeDataFactoryImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeDataFactoryImpl.java index 2512c49348c..1d75ba1529b 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeDataFactoryImpl.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeDataFactoryImpl.java @@ -74,6 +74,9 @@ public class VolumeDataFactoryImpl implements VolumeDataFactory { @Override public VolumeInfo getVolume(long volumeId) { VolumeVO volumeVO = volumeDao.findById(volumeId); + if (volumeVO == null) { + return null; + } VolumeObject vol = null; if (volumeVO.getPoolId() == null) { DataStore store = null;