This is an automated email from the ASF dual-hosted git repository. rohit pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/master by this push: new 2adbaeb CLOUDSTACK-9932: Snapshot is getting deleted while volume creation from the snapshot is in progress (#2149) 2adbaeb is described below commit 2adbaeb64128d1b911efc20ee6a2c3a9cdae1eda Author: pavanaravapalli <pavankuma...@accelerite.com> AuthorDate: Thu Jan 4 10:54:23 2018 +0530 CLOUDSTACK-9932: Snapshot is getting deleted while volume creation from the snapshot is in progress (#2149) Added validation to check if any volume(s) are in creating state , before performing delete snapshot. --- .../storage/snapshot/StorageSystemSnapshotStrategy.java | 14 ++++++++++++++ .../storage/snapshot/XenserverSnapshotStrategy.java | 15 +++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/StorageSystemSnapshotStrategy.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/StorageSystemSnapshotStrategy.java index 7aa5388..5a4eee4 100644 --- a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/StorageSystemSnapshotStrategy.java +++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/StorageSystemSnapshotStrategy.java @@ -41,6 +41,8 @@ import com.cloud.storage.dao.SnapshotDao; import com.cloud.storage.dao.SnapshotDetailsDao; import com.cloud.storage.dao.SnapshotDetailsVO; import com.cloud.storage.dao.VolumeDao; +import com.cloud.storage.dao.VolumeDetailsDao; +import com.cloud.storage.VolumeDetailVO; import com.cloud.utils.db.DB; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.fsm.NoTransitionException; @@ -90,6 +92,7 @@ public class StorageSystemSnapshotStrategy extends SnapshotStrategyBase { @Inject private VMInstanceDao vmInstanceDao; @Inject private VolumeDao volumeDao; @Inject private VolumeService volService; + @Inject private VolumeDetailsDao _volumeDetailsDaoImpl; @Override public SnapshotInfo backupSnapshot(SnapshotInfo snapshotInfo) { @@ -169,6 +172,17 @@ public class StorageSystemSnapshotStrategy extends SnapshotStrategyBase { try { snapshotObj.processEvent(Snapshot.Event.DestroyRequested); + List<VolumeDetailVO> volumesFromSnapshot; + volumesFromSnapshot = _volumeDetailsDaoImpl.findDetails("SNAPSHOT_ID", String.valueOf(snapshotId), null); + + if (volumesFromSnapshot.size() > 0) { + try { + snapshotObj.processEvent(Snapshot.Event.OperationFailed); + } catch (NoTransitionException e1) { + s_logger.debug("Failed to change snapshot state: " + e1.toString()); + } + throw new InvalidParameterValueException("Unable to perform delete operation, Snapshot with id: " + snapshotId + " is in use "); + } } catch (NoTransitionException e) { s_logger.debug("Failed to set the state to destroying: ", e); diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java index 837b201..3ab2129 100644 --- a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java +++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java @@ -55,9 +55,11 @@ import com.cloud.storage.StoragePool; import com.cloud.storage.StoragePoolStatus; import com.cloud.storage.Volume; import com.cloud.storage.VolumeVO; +import com.cloud.storage.VolumeDetailVO; import com.cloud.storage.dao.SnapshotDao; import com.cloud.storage.dao.SnapshotDetailsDao; import com.cloud.storage.dao.VolumeDao; +import com.cloud.storage.dao.VolumeDetailsDao; import com.cloud.utils.db.Transaction; import com.cloud.utils.db.TransactionCallbackNoReturn; import com.cloud.utils.db.TransactionStatus; @@ -93,6 +95,8 @@ public class XenserverSnapshotStrategy extends SnapshotStrategyBase { private SnapshotDetailsDao _snapshotDetailsDao; @Inject private SyncQueueItemDao _syncQueueItemDao; + @Inject + VolumeDetailsDao _volumeDetailsDaoImpl; @Override public SnapshotInfo backupSnapshot(SnapshotInfo snapshot) { @@ -278,6 +282,17 @@ public class XenserverSnapshotStrategy extends SnapshotStrategyBase { SnapshotObject obj = (SnapshotObject)snapshotOnImage; try { obj.processEvent(Snapshot.Event.DestroyRequested); + List<VolumeDetailVO> volumesFromSnapshot; + volumesFromSnapshot = _volumeDetailsDaoImpl.findDetails("SNAPSHOT_ID", String.valueOf(snapshotId), null); + + if (volumesFromSnapshot.size() > 0) { + try { + obj.processEvent(Snapshot.Event.OperationFailed); + } catch (NoTransitionException e1) { + s_logger.debug("Failed to change snapshot state: " + e1.toString()); + } + throw new InvalidParameterValueException("Unable to perform delete operation, Snapshot with id: " + snapshotId + " is in use "); + } } catch (NoTransitionException e) { s_logger.debug("Failed to set the state to destroying: ", e); return false; -- To stop receiving notification emails like this one, please contact ['"commits@cloudstack.apache.org" <commits@cloudstack.apache.org>'].