Skip to content

Commit 6c7d975

Browse files
Check and Cleanup snapshots / vm snapshots on MS start
1 parent 2ae2fab commit 6c7d975

12 files changed

Lines changed: 105 additions & 24 deletions

File tree

api/src/main/java/com/cloud/vm/snapshot/VMSnapshotService.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import java.util.List;
2121

22+
import com.cloud.utils.fsm.NoTransitionException;
2223
import org.apache.cloudstack.api.command.user.vmsnapshot.ListVMSnapshotCmd;
2324

2425
import com.cloud.exception.ConcurrentOperationException;
@@ -53,4 +54,6 @@ UserVm revertToSnapshot(Long vmSnapshotId) throws InsufficientServerCapacityExce
5354
* @param id vm id
5455
*/
5556
boolean deleteVMSnapshotsFromDB(Long vmId, boolean unmanage);
57+
58+
void updateOperationFailed(VMSnapshot vmSnapshot) throws NoTransitionException;
5659
}

engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/SnapshotDataFactory.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.List;
2222

2323
import com.cloud.storage.DataStoreRole;
24+
import com.cloud.utils.fsm.NoTransitionException;
2425

2526
public interface SnapshotDataFactory {
2627
SnapshotInfo getSnapshot(long snapshotId, DataStore store);
@@ -42,4 +43,6 @@ public interface SnapshotDataFactory {
4243
List<SnapshotInfo> listSnapshotOnCache(long snapshotId);
4344

4445
SnapshotInfo getReadySnapshotOnCache(long snapshotId);
46+
47+
void updateOperationFailed(long snapshotId) throws NoTransitionException;
4548
}

engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/VMSnapshotStrategy.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
*/
1919
package org.apache.cloudstack.engine.subsystem.api.storage;
2020

21+
import com.cloud.utils.fsm.NoTransitionException;
2122
import com.cloud.vm.snapshot.VMSnapshot;
2223

2324
public interface VMSnapshotStrategy {
@@ -44,4 +45,6 @@ public interface VMSnapshotStrategy {
4445
* @return true if vm snapshot removed from DB, false if not.
4546
*/
4647
boolean deleteVMSnapshotFromDB(VMSnapshot vmSnapshot, boolean unmanage);
48+
49+
void updateOperationFailed(VMSnapshot vmSnapshot) throws NoTransitionException;
4750
}

engine/components-api/src/main/java/com/cloud/vm/snapshot/VMSnapshotManager.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,5 +54,4 @@ public interface VMSnapshotManager extends VMSnapshotService, Manager {
5454
boolean hasActiveVMSnapshotTasks(Long vmId);
5555

5656
RestoreVMSnapshotCommand createRestoreCommand(UserVmVO userVm, List<VMSnapshotVO> vmSnapshotVOs);
57-
5857
}

engine/schema/src/main/java/com/cloud/vm/snapshot/dao/VMSnapshotDao.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,4 @@ public interface VMSnapshotDao extends GenericDao<VMSnapshotVO, Long>, StateDao<
3838
VMSnapshotVO findByName(Long vmId, String name);
3939

4040
List<VMSnapshotVO> listByAccountId(Long accountId);
41-
42-
List<VMSnapshotVO> listAllByStatus(VMSnapshot.State... status);
4341
}

engine/schema/src/main/java/com/cloud/vm/snapshot/dao/VMSnapshotDaoImpl.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -124,13 +124,6 @@ public List<VMSnapshotVO> listByAccountId(Long accountId) {
124124
return listBy(sc, null);
125125
}
126126

127-
@Override
128-
public List<VMSnapshotVO> listAllByStatus(VMSnapshot.State... status) {
129-
SearchCriteria<VMSnapshotVO> sc = SnapshotStatusSearch.create();
130-
sc.setParameters("status", (Object[])status);
131-
return listBy(sc, null);
132-
}
133-
134127
@Override
135128
public boolean updateState(State currentState, Event event, State nextState, VMSnapshot vo, Object data) {
136129

engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/snapshot/SnapshotDataFactoryImpl.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,12 @@
2323

2424
import javax.inject.Inject;
2525

26+
import com.cloud.storage.Snapshot;
27+
import com.cloud.utils.fsm.NoTransitionException;
2628
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
2729
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
2830
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
31+
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
2932
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotDataFactory;
3033
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
3134
import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao;
@@ -73,7 +76,7 @@ public List<SnapshotInfo> getSnapshotsForVolumeAndStoreRole(long volumeId, DataS
7376
for (SnapshotDataStoreVO snapshotDataStoreVO : allSnapshotsFromVolumeAndDataStore) {
7477
DataStore store = storeMgr.getDataStore(snapshotDataStoreVO.getDataStoreId(), role);
7578
SnapshotVO snapshot = snapshotDao.findById(snapshotDataStoreVO.getSnapshotId());
76-
if (snapshot == null){ //snapshot may have been removed;
79+
if (snapshot == null) { //snapshot may have been removed;
7780
continue;
7881
}
7982
SnapshotObject info = SnapshotObject.getSnapshotObject(snapshot, store);
@@ -107,8 +110,6 @@ public List<SnapshotInfo> getSnapshots(long snapshotId, Long zoneId) {
107110
return infos;
108111
}
109112

110-
111-
112113
@Override
113114
public SnapshotInfo getSnapshot(long snapshotId, long storeId, DataStoreRole role) {
114115
SnapshotVO snapshot = snapshotDao.findById(snapshotId);
@@ -202,4 +203,15 @@ public List<SnapshotInfo> listSnapshotOnCache(long snapshotId) {
202203
return snapObjs;
203204
}
204205

206+
@Override
207+
public void updateOperationFailed(long snapshotId) throws NoTransitionException {
208+
List<SnapshotDataStoreVO> snapshotStoreRefs = snapshotStoreDao.findBySnapshotId(snapshotId);
209+
for (SnapshotDataStoreVO snapshotStoreRef : snapshotStoreRefs) {
210+
SnapshotInfo snapshotInfo = getSnapshot(snapshotStoreRef.getSnapshotId(), snapshotStoreRef.getDataStoreId(), snapshotStoreRef.getRole());
211+
if (snapshotInfo != null) {
212+
((SnapshotObject)snapshotInfo).processEvent(Snapshot.Event.OperationFailed);
213+
snapshotInfo.processEvent(ObjectInDataStoreStateMachine.Event.OperationFailed);
214+
}
215+
}
216+
}
205217
}

engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/vmsnapshot/DefaultVMSnapshotStrategy.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,4 +483,14 @@ public StrategyPriority canHandle(Long vmId, Long rootPoolId, boolean snapshotMe
483483
}
484484
return StrategyPriority.DEFAULT;
485485
}
486+
487+
@Override
488+
public void updateOperationFailed(VMSnapshot vmSnapshot) throws NoTransitionException {
489+
try {
490+
vmSnapshotHelper.vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.OperationFailed);
491+
} catch (NoTransitionException e) {
492+
s_logger.debug("Failed to change vm snapshot state with event OperationFailed");
493+
throw e;
494+
}
495+
}
486496
}

engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/vmsnapshot/ScaleIOVMSnapshotStrategy.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -480,6 +480,16 @@ public boolean deleteVMSnapshotFromDB(VMSnapshot vmSnapshot, boolean unmanage) {
480480
return vmSnapshotDao.remove(vmSnapshot.getId());
481481
}
482482

483+
@Override
484+
public void updateOperationFailed(VMSnapshot vmSnapshot) throws NoTransitionException {
485+
try {
486+
vmSnapshotHelper.vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.OperationFailed);
487+
} catch (NoTransitionException e) {
488+
LOGGER.debug("Failed to change vm snapshot state with event OperationFailed");
489+
throw e;
490+
}
491+
}
492+
483493
private void publishUsageEvent(String type, VMSnapshot vmSnapshot, UserVm userVm, VolumeObjectTO volumeTo) {
484494
VolumeVO volume = volumeDao.findById(volumeTo.getId());
485495
Long diskOfferingId = volume.getDiskOfferingId();

framework/jobs/src/main/java/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@
3535
import javax.inject.Inject;
3636
import javax.naming.ConfigurationException;
3737

38+
import com.cloud.storage.SnapshotVO;
39+
import com.cloud.vm.snapshot.VMSnapshot;
40+
import com.cloud.vm.snapshot.VMSnapshotService;
41+
import com.cloud.vm.snapshot.VMSnapshotVO;
42+
import com.cloud.vm.snapshot.dao.VMSnapshotDao;
3843
import org.apache.cloudstack.api.ApiCommandResourceType;
3944
import org.apache.cloudstack.api.ApiErrorCode;
4045
import org.apache.cloudstack.context.CallContext;
@@ -155,11 +160,15 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager,
155160
@Inject
156161
private SnapshotDao _snapshotDao;
157162
@Inject
163+
private VMSnapshotDao _vmSnapshotDao;
164+
@Inject
158165
private SnapshotService snapshotSrv;
159166
@Inject
160167
private SnapshotDataFactory snapshotFactory;
161168
@Inject
162169
private SnapshotDetailsDao _snapshotDetailsDao;
170+
@Inject
171+
private VMSnapshotService _vmSnapshotService;
163172

164173
@Inject
165174
private VolumeDataFactory volFactory;
@@ -1151,6 +1160,10 @@ protected boolean cleanupResources(AsyncJobVO job) {
11511160
return cleanupVirtualMachine(job.getInstanceId());
11521161
case Network:
11531162
return cleanupNetwork(job.getInstanceId());
1163+
case Snapshot:
1164+
return cleanupSnapshot(job.getInstanceId());
1165+
case VmSnapshot:
1166+
return cleanupVmSnapshot(job.getInstanceId());
11541167
}
11551168
} catch (Exception e) {
11561169
s_logger.warn("Error while cleaning up resource: [" + job.getInstanceType().toString() + "] with Id: " + job.getInstanceId(), e);
@@ -1189,7 +1202,7 @@ private boolean cleanupVirtualMachine(final long vmId) throws Exception {
11891202
return true;
11901203
}
11911204

1192-
private boolean cleanupNetwork(final long networkId) throws Exception {
1205+
private boolean cleanupNetwork(final long networkId) {
11931206
NetworkVO networkVO = networkDao.findById(networkId);
11941207
if (networkVO == null) {
11951208
s_logger.warn("Network not found. Skip Cleanup. NetworkId: " + networkId);
@@ -1208,6 +1221,46 @@ private boolean cleanupNetwork(final long networkId) throws Exception {
12081221
return true;
12091222
}
12101223

1224+
private boolean cleanupSnapshot(final long snapshotId) {
1225+
SnapshotVO snapshotVO = _snapshotDao.findById(snapshotId);
1226+
if (snapshotVO == null) {
1227+
s_logger.warn("Snapshot not found. Skip Cleanup. SnapshotId: " + snapshotId);
1228+
return true;
1229+
}
1230+
if (Snapshot.State.Allocated.equals(snapshotVO.getState())) {
1231+
_snapshotDao.remove(snapshotId);
1232+
}
1233+
if (Snapshot.State.Creating.equals(snapshotVO.getState())) {
1234+
try {
1235+
snapshotFactory.updateOperationFailed(snapshotId);
1236+
} catch (NoTransitionException e) {
1237+
snapshotVO.setState(Snapshot.State.Error);
1238+
_snapshotDao.update(snapshotVO.getId(), snapshotVO);
1239+
}
1240+
}
1241+
return true;
1242+
}
1243+
1244+
private boolean cleanupVmSnapshot(final long vmSnapshotId) {
1245+
VMSnapshotVO vmSnapshotVO = _vmSnapshotDao.findById(vmSnapshotId);
1246+
if (vmSnapshotVO == null) {
1247+
s_logger.warn("VM Snapshot not found. Skip Cleanup. VMSnapshotId: " + vmSnapshotId);
1248+
return true;
1249+
}
1250+
if (VMSnapshot.State.Allocated.equals(vmSnapshotVO.getState())) {
1251+
_vmSnapshotDao.remove(vmSnapshotId);
1252+
}
1253+
if (VMSnapshot.State.Creating.equals(vmSnapshotVO.getState())) {
1254+
try {
1255+
_vmSnapshotService.updateOperationFailed(vmSnapshotVO);
1256+
} catch (NoTransitionException e) {
1257+
vmSnapshotVO.setState(VMSnapshot.State.Error);
1258+
_vmSnapshotDao.update(vmSnapshotVO.getId(), vmSnapshotVO);
1259+
}
1260+
}
1261+
return true;
1262+
}
1263+
12111264
private void cleanupFailedVolumesCreatedFromSnapshots(final long volumeId) {
12121265
try {
12131266
VolumeDetailVO volumeDetail = _volumeDetailsDao.findDetail(volumeId, VolumeService.SNAPSHOT_ID);

0 commit comments

Comments
 (0)