Skip to content

Commit 68d15b4

Browse files
committed
address reviews
1 parent 3a9ebbf commit 68d15b4

File tree

3 files changed

+34
-18
lines changed

3 files changed

+34
-18
lines changed

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

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,9 @@ protected boolean destroySnapshotEntriesAndFiles(SnapshotVO snapshotVo, Long zon
332332
} else {
333333
snapshotZoneDao.removeSnapshotFromZones(snapshotVo.getId());
334334
}
335+
336+
updateEndOfChainIfNeeded(snapshotVo);
337+
335338
if (CollectionUtils.isNotEmpty(retrieveSnapshotEntries(snapshotVo.getId(), null))) {
336339
return true;
337340
}
@@ -340,13 +343,9 @@ protected boolean destroySnapshotEntriesAndFiles(SnapshotVO snapshotVo, Long zon
340343
}
341344

342345
/**
343-
* Updates the snapshot to {@link Snapshot.State#Destroyed}. If using the KVM hypervisor and the snapshot was the end of a chain,
344-
* will mark their parents as end of chain as well.
345-
*/
346-
protected void updateSnapshotToDestroyed(SnapshotVO snapshotVo) {
347-
snapshotVo.setState(Snapshot.State.Destroyed);
348-
snapshotDao.update(snapshotVo.getId(), snapshotVo);
349-
346+
* If using the KVM hypervisor and the snapshot was the end of a chain, will mark their parents as end of chain.
347+
* */
348+
protected void updateEndOfChainIfNeeded(SnapshotVO snapshotVo) {
350349
if (!HypervisorType.KVM.equals(snapshotVo.getHypervisorType())) {
351350
return;
352351
}
@@ -367,7 +366,14 @@ protected void updateSnapshotToDestroyed(SnapshotVO snapshotVo) {
367366
parentSnapshotDatastoreVo.setEndOfChain(true);
368367
snapshotStoreDao.update(parentSnapshotDatastoreVo.getId(), parentSnapshotDatastoreVo);
369368
}
369+
}
370370

371+
/**
372+
* Updates the snapshot to {@link Snapshot.State#Destroyed}.
373+
*/
374+
protected void updateSnapshotToDestroyed(SnapshotVO snapshotVo) {
375+
snapshotVo.setState(Snapshot.State.Destroyed);
376+
snapshotDao.update(snapshotVo.getId(), snapshotVo);
371377
}
372378

373379
protected List<SnapshotDataStoreVO> findLastAliveAncestors(long snapshotId) {

engine/storage/snapshot/src/test/java/org/apache/cloudstack/storage/snapshot/DefaultSnapshotStrategyTest.java

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -111,32 +111,30 @@ public void validateRetrieveSnapshotEntries() {
111111
}
112112

113113
@Test
114-
public void updateSnapshotToDestroyedTestNotKvm() {
114+
public void updateEndOfChainIfNeededTestNotKvm() {
115115
Mockito.doReturn(Hypervisor.HypervisorType.VMware).when(snapshotVoMock).getHypervisorType();
116116

117-
defaultSnapshotStrategySpy.updateSnapshotToDestroyed(snapshotVoMock);
117+
defaultSnapshotStrategySpy.updateEndOfChainIfNeeded(snapshotVoMock);
118118

119-
Mockito.verify(snapshotVoMock).setState(Snapshot.State.Destroyed);
120-
Mockito.verify(snapshotVoMock, Mockito.never()).getSnapshotId();
119+
Mockito.verify(snapshotDataStoreDao, Mockito.never()).findBySnapshotIdAndDataStoreRoleAndState(Mockito.anyLong(), Mockito.any(), Mockito.any());
121120
}
122121

123122
@Test
124-
public void updateSnapshotToDestroyedTestKvmAndIsNotEndOfChain() {
123+
public void updateEndOfChainIfNeededTestKvmAndIsNotEndOfChain() {
125124
Mockito.doReturn(Hypervisor.HypervisorType.KVM).when(snapshotVoMock).getHypervisorType();
126125
Mockito.doReturn(2L).when(snapshotVoMock).getSnapshotId();
127126

128127
SnapshotDataStoreVO snapshotDataStoreVO = new SnapshotDataStoreVO();
129128
snapshotDataStoreVO.setEndOfChain(false);
130129
Mockito.doReturn(snapshotDataStoreVO).when(snapshotDataStoreDao).findBySnapshotIdAndDataStoreRoleAndState(2, DataStoreRole.Image, ObjectInDataStoreStateMachine.State.Destroyed);
131130

132-
defaultSnapshotStrategySpy.updateSnapshotToDestroyed(snapshotVoMock);
131+
defaultSnapshotStrategySpy.updateEndOfChainIfNeeded(snapshotVoMock);
133132

134-
Mockito.verify(snapshotVoMock).setState(Snapshot.State.Destroyed);
135133
Mockito.verify(snapshotDataStoreDao, Mockito.never()).update(Mockito.anyLong(), Mockito.any());
136134
}
137135

138136
@Test
139-
public void updateSnapshotToDestroyedTestKvmAndIsEndOfChain() {
137+
public void updateEndOfChainIfNeededTestKvmAndIsEndOfChain() {
140138
Mockito.doReturn(Hypervisor.HypervisorType.KVM).when(snapshotVoMock).getHypervisorType();
141139
Mockito.doReturn(2L).when(snapshotVoMock).getSnapshotId();
142140

@@ -148,9 +146,8 @@ public void updateSnapshotToDestroyedTestKvmAndIsEndOfChain() {
148146
Mockito.doReturn(ObjectInDataStoreStateMachine.State.Ready).when(snapshotDataStoreVOMock).getState();
149147
Mockito.doReturn(List.of(snapshotDataStoreVOMock)).when(snapshotDataStoreDao).listBySnapshotId(8);
150148

151-
defaultSnapshotStrategySpy.updateSnapshotToDestroyed(snapshotVoMock);
149+
defaultSnapshotStrategySpy.updateEndOfChainIfNeeded(snapshotVoMock);
152150

153-
Mockito.verify(snapshotVoMock).setState(Snapshot.State.Destroyed);
154151
Mockito.verify(snapshotDataStoreDao, Mockito.times(1)).listBySnapshotId(Mockito.anyLong());
155152
Mockito.verify(snapshotDataStoreVOMock).setEndOfChain(true);
156153
Mockito.verify(snapshotDataStoreDao, Mockito.times(1)).update(Mockito.anyLong(), Mockito.any());

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

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1545,7 +1545,11 @@ public SnapshotInfo takeSnapshot(VolumeInfo volume) throws ResourceAllocationExc
15451545
boolean backupSnapToSecondary = isBackupSnapshotToSecondaryForZone(volume.getDataCenterId());
15461546

15471547
if (isKvmAndFileBasedStorage && backupSnapToSecondary) {
1548-
snapshot.setImageStore(snapshotSrv.findSnapshotImageStore(snapshot));
1548+
DataStore imageStore = snapshotSrv.findSnapshotImageStore(snapshot);
1549+
if (imageStore == null) {
1550+
throw new CloudRuntimeException(String.format("Could not find any secondary storage to allocate snapshot [%s].", snapshot));
1551+
}
1552+
snapshot.setImageStore(imageStore);
15491553
}
15501554

15511555
updateSnapshotPayload(volume.getPoolId(), payload, isKvmAndFileBasedStorage, clusterId);
@@ -1918,6 +1922,15 @@ private boolean checkAndProcessSnapshotAlreadyExistInStore(long snapshotId, Data
19181922
}
19191923
return true; // already downloaded on this image store
19201924
}
1925+
1926+
if (ObjectInDataStoreStateMachine.State.Hidden.equals(dstSnapshotStore.getState())) {
1927+
logger.debug("Snapshot [{}] was hidden in secondary storage [{}]. Since the user asked to copy it back. We will put it as ready.", dstSnapshotStore, dstSecStore);
1928+
dstSnapshotStore.setState(ObjectInDataStoreStateMachine.State.Ready);
1929+
dstSnapshotStore.setDisplay(true);
1930+
_snapshotStoreDao.update(dstSnapshotStore.getId(), dstSnapshotStore);
1931+
return true;
1932+
}
1933+
19211934
if ((dstSnapshotStore.getDownloadState() != null && List.of(VMTemplateStorageResourceAssoc.Status.ABANDONED,
19221935
VMTemplateStorageResourceAssoc.Status.DOWNLOAD_ERROR,
19231936
VMTemplateStorageResourceAssoc.Status.NOT_DOWNLOADED,

0 commit comments

Comments
 (0)