|
22 | 22 | import com.cloud.hypervisor.Hypervisor; |
23 | 23 | import com.cloud.storage.ImageStore; |
24 | 24 | import com.cloud.storage.snapshot.SnapshotManager; |
25 | | -import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStore; |
26 | 25 | import org.apache.logging.log4j.Logger; |
27 | 26 | import org.apache.logging.log4j.LogManager; |
28 | 27 | import org.springframework.stereotype.Component; |
@@ -141,18 +140,16 @@ public DataObject create(DataObject obj, DataStore dataStore) { |
141 | 140 | ss.setSize(snapshotInfo.getSize()); // this is the virtual size of snapshot in primary storage. |
142 | 141 | ss.setPhysicalSize(snapshotInfo.getSize()); // this physical size will get updated with actual size once the snapshot backup is done. |
143 | 142 | Long clusterId = hostDao.findClusterIdByVolumeInfo(snapshotInfo.getBaseVolume()); |
144 | | - boolean kvmIncrementalSnapshot = SnapshotManager.kvmIncrementalSnapshot.valueIn(clusterId); |
145 | | - SnapshotDataStoreVO snapshotDataStoreVO = snapshotDataStoreDao.findParent(dataStore.getRole(), dataStore.getId(), null, snapshotInfo.getVolumeId(), kvmIncrementalSnapshot, snapshotInfo.getHypervisorType()); |
146 | | - snapshotDataStoreVO = tryToGetSnapshotOnSecondaryIfNotOnPrimaryAndIsKVM(dataStore, snapshotInfo, snapshotDataStoreVO, kvmIncrementalSnapshot, snapshotInfo.getHypervisorType()); |
147 | | - if (snapshotDataStoreVO != null) { |
| 143 | + SnapshotDataStoreVO parentSnapshotDataStoreVO = findParent(dataStore, clusterId, snapshotInfo); |
| 144 | + if (parentSnapshotDataStoreVO != null) { |
148 | 145 | //Double check the snapshot is removed or not |
149 | | - SnapshotVO parentSnap = snapshotDao.findById(snapshotDataStoreVO.getSnapshotId()); |
150 | | - if (parentSnap != null && !snapshotDataStoreVO.isEndOfChain()) { |
151 | | - ss.setParentSnapshotId(snapshotDataStoreVO.getSnapshotId()); |
152 | | - } else if (snapshotDataStoreVO.isEndOfChain()) { |
| 146 | + SnapshotVO parentSnap = snapshotDao.findById(parentSnapshotDataStoreVO.getSnapshotId()); |
| 147 | + if (parentSnap != null && !parentSnapshotDataStoreVO.isEndOfChain()) { |
| 148 | + ss.setParentSnapshotId(parentSnapshotDataStoreVO.getSnapshotId()); |
| 149 | + } else if (parentSnapshotDataStoreVO.isEndOfChain()) { |
153 | 150 | logger.debug("Snapshot [{}] will begin a new chain, as the last one has finished.", ss.getSnapshotId()); |
154 | 151 | } else { |
155 | | - logger.debug("find inconsistent db for snapshot " + snapshotDataStoreVO.getSnapshotId()); |
| 152 | + logger.debug("find inconsistent db for snapshot " + parentSnapshotDataStoreVO.getSnapshotId()); |
156 | 153 | } |
157 | 154 | } |
158 | 155 | ss.setState(ObjectInDataStoreStateMachine.State.Allocated); |
@@ -219,10 +216,29 @@ public DataObject create(DataObject obj, DataStore dataStore) { |
219 | 216 | return this.get(obj, dataStore, null); |
220 | 217 | } |
221 | 218 |
|
222 | | - private SnapshotDataStoreVO tryToGetSnapshotOnSecondaryIfNotOnPrimaryAndIsKVM(DataStore dataStore, SnapshotInfo snapshotInfo, SnapshotDataStoreVO snapshotDataStoreVO, |
223 | | - boolean kvmIncrementalSnapshot, Hypervisor.HypervisorType hypervisorType) { |
224 | | - if (snapshotDataStoreVO == null && Hypervisor.HypervisorType.KVM.equals(snapshotInfo.getHypervisorType()) && DataStoreRole.Primary.equals(dataStore.getRole())) { |
225 | | - snapshotDataStoreVO = snapshotDataStoreDao.findParent(DataStoreRole.Image, null, ((PrimaryDataStore)dataStore).getDataCenterId(), snapshotInfo.getVolumeId(), kvmIncrementalSnapshot, hypervisorType); |
| 219 | + private SnapshotDataStoreVO findParent(DataStore dataStore, Long clusterId, SnapshotInfo snapshotInfo) { |
| 220 | + boolean kvmIncrementalSnapshot = SnapshotManager.kvmIncrementalSnapshot.valueIn(clusterId); |
| 221 | + SnapshotDataStoreVO snapshotDataStoreVO; |
| 222 | + if (Hypervisor.HypervisorType.KVM.equals(snapshotInfo.getHypervisorType()) && kvmIncrementalSnapshot) { |
| 223 | + snapshotDataStoreVO = snapshotDataStoreDao.findParent(null, null, null, snapshotInfo.getVolumeId(), |
| 224 | + kvmIncrementalSnapshot, snapshotInfo.getHypervisorType()); |
| 225 | + snapshotDataStoreVO = returnNullIfNotOnSameTypeOfStoreRole(snapshotInfo, snapshotDataStoreVO); |
| 226 | + } else { |
| 227 | + snapshotDataStoreVO = snapshotDataStoreDao.findParent(dataStore.getRole(), dataStore.getId(), null, snapshotInfo.getVolumeId(), |
| 228 | + kvmIncrementalSnapshot, snapshotInfo.getHypervisorType()); |
| 229 | + } |
| 230 | + return snapshotDataStoreVO; |
| 231 | + } |
| 232 | + |
| 233 | + private SnapshotDataStoreVO returnNullIfNotOnSameTypeOfStoreRole(SnapshotInfo snapshotInfo, SnapshotDataStoreVO snapshotDataStoreVO) { |
| 234 | + if (snapshotDataStoreVO == null) { |
| 235 | + return snapshotDataStoreVO; |
| 236 | + } |
| 237 | + if ((snapshotInfo.getImageStore() != null && !snapshotDataStoreVO.getRole().isImageStore()) || |
| 238 | + (snapshotInfo.getImageStore() == null && snapshotDataStoreVO.getRole().isImageStore())) { |
| 239 | + snapshotDataStoreVO.setEndOfChain(true); |
| 240 | + snapshotDataStoreDao.update(snapshotDataStoreVO.getId(), snapshotDataStoreVO); |
| 241 | + return null; |
226 | 242 | } |
227 | 243 | return snapshotDataStoreVO; |
228 | 244 | } |
|
0 commit comments