mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
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.
This commit is contained in:
parent
000ee36224
commit
2adbaeb641
@ -41,6 +41,8 @@ import com.cloud.storage.dao.SnapshotDao;
|
|||||||
import com.cloud.storage.dao.SnapshotDetailsDao;
|
import com.cloud.storage.dao.SnapshotDetailsDao;
|
||||||
import com.cloud.storage.dao.SnapshotDetailsVO;
|
import com.cloud.storage.dao.SnapshotDetailsVO;
|
||||||
import com.cloud.storage.dao.VolumeDao;
|
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.db.DB;
|
||||||
import com.cloud.utils.exception.CloudRuntimeException;
|
import com.cloud.utils.exception.CloudRuntimeException;
|
||||||
import com.cloud.utils.fsm.NoTransitionException;
|
import com.cloud.utils.fsm.NoTransitionException;
|
||||||
@ -90,6 +92,7 @@ public class StorageSystemSnapshotStrategy extends SnapshotStrategyBase {
|
|||||||
@Inject private VMInstanceDao vmInstanceDao;
|
@Inject private VMInstanceDao vmInstanceDao;
|
||||||
@Inject private VolumeDao volumeDao;
|
@Inject private VolumeDao volumeDao;
|
||||||
@Inject private VolumeService volService;
|
@Inject private VolumeService volService;
|
||||||
|
@Inject private VolumeDetailsDao _volumeDetailsDaoImpl;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SnapshotInfo backupSnapshot(SnapshotInfo snapshotInfo) {
|
public SnapshotInfo backupSnapshot(SnapshotInfo snapshotInfo) {
|
||||||
@ -169,6 +172,17 @@ public class StorageSystemSnapshotStrategy extends SnapshotStrategyBase {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
snapshotObj.processEvent(Snapshot.Event.DestroyRequested);
|
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) {
|
catch (NoTransitionException e) {
|
||||||
s_logger.debug("Failed to set the state to destroying: ", e);
|
s_logger.debug("Failed to set the state to destroying: ", e);
|
||||||
|
|||||||
@ -55,9 +55,11 @@ import com.cloud.storage.StoragePool;
|
|||||||
import com.cloud.storage.StoragePoolStatus;
|
import com.cloud.storage.StoragePoolStatus;
|
||||||
import com.cloud.storage.Volume;
|
import com.cloud.storage.Volume;
|
||||||
import com.cloud.storage.VolumeVO;
|
import com.cloud.storage.VolumeVO;
|
||||||
|
import com.cloud.storage.VolumeDetailVO;
|
||||||
import com.cloud.storage.dao.SnapshotDao;
|
import com.cloud.storage.dao.SnapshotDao;
|
||||||
import com.cloud.storage.dao.SnapshotDetailsDao;
|
import com.cloud.storage.dao.SnapshotDetailsDao;
|
||||||
import com.cloud.storage.dao.VolumeDao;
|
import com.cloud.storage.dao.VolumeDao;
|
||||||
|
import com.cloud.storage.dao.VolumeDetailsDao;
|
||||||
import com.cloud.utils.db.Transaction;
|
import com.cloud.utils.db.Transaction;
|
||||||
import com.cloud.utils.db.TransactionCallbackNoReturn;
|
import com.cloud.utils.db.TransactionCallbackNoReturn;
|
||||||
import com.cloud.utils.db.TransactionStatus;
|
import com.cloud.utils.db.TransactionStatus;
|
||||||
@ -93,6 +95,8 @@ public class XenserverSnapshotStrategy extends SnapshotStrategyBase {
|
|||||||
private SnapshotDetailsDao _snapshotDetailsDao;
|
private SnapshotDetailsDao _snapshotDetailsDao;
|
||||||
@Inject
|
@Inject
|
||||||
private SyncQueueItemDao _syncQueueItemDao;
|
private SyncQueueItemDao _syncQueueItemDao;
|
||||||
|
@Inject
|
||||||
|
VolumeDetailsDao _volumeDetailsDaoImpl;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SnapshotInfo backupSnapshot(SnapshotInfo snapshot) {
|
public SnapshotInfo backupSnapshot(SnapshotInfo snapshot) {
|
||||||
@ -278,6 +282,17 @@ public class XenserverSnapshotStrategy extends SnapshotStrategyBase {
|
|||||||
SnapshotObject obj = (SnapshotObject)snapshotOnImage;
|
SnapshotObject obj = (SnapshotObject)snapshotOnImage;
|
||||||
try {
|
try {
|
||||||
obj.processEvent(Snapshot.Event.DestroyRequested);
|
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) {
|
} catch (NoTransitionException e) {
|
||||||
s_logger.debug("Failed to set the state to destroying: ", e);
|
s_logger.debug("Failed to set the state to destroying: ", e);
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user