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:
pavanaravapalli 2018-01-04 10:54:23 +05:30 committed by Rohit Yadav
parent 000ee36224
commit 2adbaeb641
2 changed files with 29 additions and 0 deletions

View File

@ -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);

View File

@ -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;