Skip to content

Commit be255e4

Browse files
DaanHooglandDaan Hoogland
andauthored
server: protect against stray snapshot-details without snapshot (#4924)
This PR makes sure no orphaned snapshot details are considered in the cleanup at startup job. a real solution would be to implement some kind of cascading delete, but as the parent record is "only" marked as removed this would be a bit com Co-authored-by: Daan Hoogland <dahn@onecht.net>
1 parent 39cb2bf commit be255e4

6 files changed

Lines changed: 14 additions & 15 deletions

File tree

engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/DataMigrationUtility.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,9 @@ protected List<DataObject> getAllReadySnapshotsAndChains(DataStore srcDataStore,
200200
snapshotVO != null && snapshotVO.getHypervisorType() != Hypervisor.HypervisorType.Simulator
201201
&& snapshot.getParentSnapshotId() == 0 ) {
202202
SnapshotInfo snap = snapshotFactory.getSnapshot(snapshotVO.getSnapshotId(), DataStoreRole.Image);
203-
files.add(snap);
203+
if (snap != null) {
204+
files.add(snap);
205+
}
204206
}
205207
}
206208

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,9 @@ public List<SnapshotInfo> getSnapshots(long volumeId, DataStoreRole role) {
8787
@Override
8888
public SnapshotInfo getSnapshot(long snapshotId, DataStoreRole role) {
8989
SnapshotVO snapshot = snapshotDao.findById(snapshotId);
90+
if (snapshot == null) {
91+
return null;
92+
}
9093
SnapshotDataStoreVO snapshotStore = snapshotStoreDao.findBySnapshot(snapshotId, role);
9194
if (snapshotStore == null) {
9295
snapshotStore = snapshotStoreDao.findByVolume(snapshot.getVolumeId(), role);

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,10 @@ public List<SnapshotInfo> getChildren() {
142142
List<SnapshotInfo> children = new ArrayList<>();
143143
if (vos != null) {
144144
for (SnapshotDataStoreVO vo : vos) {
145-
children.add(snapshotFactory.getSnapshot(vo.getSnapshotId(), DataStoreRole.Image));
145+
SnapshotInfo info = snapshotFactory.getSnapshot(vo.getSnapshotId(), DataStoreRole.Image);
146+
if (info != null) {
147+
children.add(info);
148+
}
146149
}
147150
}
148151
return children;

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1097,6 +1097,10 @@ public void doInTransactionWithoutResult(TransactionStatus status) {
10971097
final List<SnapshotDetailsVO> snapshotList = _snapshotDetailsDao.findDetails(AsyncJob.Constants.MS_ID, Long.toString(msid), false);
10981098
for (final SnapshotDetailsVO snapshotDetailsVO : snapshotList) {
10991099
SnapshotInfo snapshot = snapshotFactory.getSnapshot(snapshotDetailsVO.getResourceId(), DataStoreRole.Primary);
1100+
if (snapshot == null) {
1101+
_snapshotDetailsDao.remove(snapshotDetailsVO.getId());
1102+
continue;
1103+
}
11001104
snapshotSrv.processEventOnSnapshotObject(snapshot, Snapshot.Event.OperationFailed);
11011105
_snapshotDetailsDao.removeDetail(snapshotDetailsVO.getResourceId(), AsyncJob.Constants.MS_ID);
11021106
}

server/src/main/java/com/cloud/storage/snapshot/SnapshotManager.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import com.cloud.agent.api.Answer;
2525
import com.cloud.agent.api.Command;
2626
import com.cloud.exception.ResourceAllocationException;
27-
import com.cloud.storage.Snapshot;
2827
import com.cloud.storage.SnapshotVO;
2928
import com.cloud.storage.Volume;
3029

@@ -83,7 +82,5 @@ public interface SnapshotManager extends Configurable {
8382

8483
SnapshotVO getParentSnapshot(VolumeInfo volume);
8584

86-
Snapshot backupSnapshot(Long snapshotId);
87-
8885
SnapshotInfo takeSnapshot(VolumeInfo volume) throws ResourceAllocationException;
8986
}

server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -420,16 +420,6 @@ public Snapshot archiveSnapshot(Long snapshotId) {
420420
return snapshotOnSecondary;
421421
}
422422

423-
@Override
424-
public Snapshot backupSnapshot(Long snapshotId) {
425-
SnapshotInfo snapshot = snapshotFactory.getSnapshot(snapshotId, DataStoreRole.Image);
426-
if (snapshot != null) {
427-
throw new CloudRuntimeException("Already in the backup snapshot:" + snapshotId);
428-
}
429-
430-
return snapshotSrv.backupSnapshot(snapshot);
431-
}
432-
433423
@Override
434424
public Snapshot backupSnapshotFromVmSnapshot(Long snapshotId, Long vmId, Long volumeId, Long vmSnapshotId) {
435425
VMInstanceVO vm = _vmDao.findById(vmId);

0 commit comments

Comments
 (0)