Skip to content

Commit d8a5adb

Browse files
committed
Add support for clvm incremental volume snaps
1 parent fdcace1 commit d8a5adb

2 files changed

Lines changed: 14 additions & 11 deletions

File tree

‎plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java‎

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2095,7 +2095,15 @@ public Answer createSnapshot(final CreateObjectCommand cmd) {
20952095
String diskPath = disk.getPath();
20962096
String snapshotPath = diskPath + File.separator + snapshotName;
20972097
SnapshotObjectTO newSnapshot = new SnapshotObjectTO();
2098-
if (DomainInfo.DomainState.VIR_DOMAIN_RUNNING.equals(state) && !primaryPool.isExternalSnapshot()) {
2098+
boolean isClvmNgIncremental = primaryPool.getType() == StoragePoolType.CLVM_NG && snapshotTO.isKvmIncrementalSnapshot();
2099+
if (isClvmNgIncremental && secondaryPool == null) {
2100+
String errorMsg = String.format("Incremental snapshots for CLVM_NG require secondary storage. " +
2101+
"Please configure secondary storage or disable incremental snapshots for volume [%s].", volume.getName());
2102+
logger.error(errorMsg);
2103+
return new CreateObjectAnswer(errorMsg);
2104+
}
2105+
boolean isLiveClvmNgIncremental = isClvmNgIncremental && (DomainInfo.DomainState.VIR_DOMAIN_RUNNING.equals(state) || DomainInfo.DomainState.VIR_DOMAIN_PAUSED.equals(state));
2106+
if ((DomainInfo.DomainState.VIR_DOMAIN_RUNNING.equals(state) && !primaryPool.isExternalSnapshot()) || isLiveClvmNgIncremental) {
20992107
if (snapshotTO.isKvmIncrementalSnapshot()) {
21002108
newSnapshot = takeIncrementalVolumeSnapshotOfRunningVm(snapshotTO, primaryPool, secondaryPool, imageStoreTo != null ? imageStoreTo.getUrl() : null, snapshotName, volume, vm, conn, cmd.getWait());
21012109
} else {
@@ -2109,13 +2117,7 @@ public Answer createSnapshot(final CreateObjectCommand cmd) {
21092117
newSnapshot.setPhysicalSize(snapshotSize);
21102118
}
21112119
} else if (primaryPool.getType() == StoragePoolType.CLVM || primaryPool.getType() == StoragePoolType.CLVM_NG) {
2112-
if (primaryPool.getType() == StoragePoolType.CLVM_NG && snapshotTO.isKvmIncrementalSnapshot()) {
2113-
if (secondaryPool == null) {
2114-
String errorMsg = String.format("Incremental snapshots for CLVM_NG require secondary storage. " +
2115-
"Please configure secondary storage or disable incremental snapshots for volume [%s].", volume.getName());
2116-
logger.error(errorMsg);
2117-
return new CreateObjectAnswer(errorMsg);
2118-
}
2120+
if (isClvmNgIncremental) {
21192121
logger.info("Taking incremental snapshot of CLVM_NG volume [{}] using QCOW2 backup to secondary storage.", volume.getName());
21202122
newSnapshot = takeIncrementalVolumeSnapshotOfStoppedVm(snapshotTO, primaryPool, secondaryPool,
21212123
imageStoreTo.getUrl(), snapshotName, volume, conn, cmd.getWait());

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1638,8 +1638,9 @@ public SnapshotInfo takeSnapshot(VolumeInfo volume) throws ResourceAllocationExc
16381638
boolean backupSnapToSecondary = isBackupSnapshotToSecondaryForZone(volume.getDataCenterId());
16391639

16401640
StoragePoolType poolType = volume.getStoragePoolType();
1641+
boolean isClvmNgIncrementalCandidate = StoragePoolType.CLVM_NG == poolType && kvmIncrementalSnapshot.valueIn(clusterId);
16411642

1642-
if (isKvmAndFileBasedStorage && backupSnapToSecondary) {
1643+
if ((isKvmAndFileBasedStorage || isClvmNgIncrementalCandidate) && backupSnapToSecondary) {
16431644
DataStore imageStore = snapshotSrv.findSnapshotImageStore(snapshot);
16441645
if (imageStore == null) {
16451646
throw new CloudRuntimeException(String.format("Could not find any secondary storage to allocate snapshot [%s].", snapshot));
@@ -1663,7 +1664,7 @@ public SnapshotInfo takeSnapshot(VolumeInfo volume) throws ResourceAllocationExc
16631664
SnapshotInfo snapshotOnPrimary = snapshotStrategy.takeSnapshot(snapshot);
16641665

16651666
if (backupSnapToSecondary) {
1666-
if (!isKvmAndFileBasedStorage) {
1667+
if (!isKvmAndFileBasedStorage && !isClvmNgIncrementalCandidate) {
16671668
backupSnapshotToSecondary(payload.getAsyncBackup(), snapshotStrategy, snapshotOnPrimary, payload.getZoneIds(), payload.getStoragePoolIds());
16681669
if (!payload.getAsyncBackup() && ClvmPoolManager.isClvmPoolType(storagePool.getPoolType())) {
16691670
_snapshotStoreDao.removeBySnapshotStore(snapshotId, snapshotOnPrimary.getDataStore().getId(), snapshotOnPrimary.getDataStore().getRole());
@@ -1877,7 +1878,7 @@ private void updateSnapshotPayload(long storagePoolId, CreateSnapshotPayload pay
18771878
payload.setLocationType(null);
18781879
}
18791880

1880-
if (isKvmAndFileBasedStorage && kvmIncrementalSnapshot.valueIn(clusterId)) {
1881+
if ((isKvmAndFileBasedStorage || StoragePoolType.CLVM_NG == poolType) && kvmIncrementalSnapshot.valueIn(clusterId)) {
18811882
payload.setKvmIncrementalSnapshot(true);
18821883
}
18831884
}

0 commit comments

Comments
 (0)