Skip to content

Commit a08e7a5

Browse files
committed
refactor clvm code
1 parent f9d8062 commit a08e7a5

File tree

6 files changed

+177
-316
lines changed

6 files changed

+177
-316
lines changed

engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDaoImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ public boolean configure(String name, Map<String, Object> params) throws Configu
148148

149149
idStateNeqSearch = createSearchBuilder();
150150
idStateNeqSearch.and(SNAPSHOT_ID, idStateNeqSearch.entity().getSnapshotId(), SearchCriteria.Op.EQ);
151-
idStateNeqSearch.and(STATE, idStateNeqSearch.entity().getState(), SearchCriteria.Op.NEQ);
151+
idStateNeqSearch.and(STATE, idStateNeqSearch.entity().getState(), SearchCriteria.Op.NIN);
152152
idStateNeqSearch.done();
153153

154154
snapshotVOSearch = snapshotDao.createSearchBuilder();

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

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727

2828
import com.cloud.hypervisor.Hypervisor;
2929
import com.cloud.storage.Snapshot;
30+
import com.cloud.storage.Storage;
3031
import com.cloud.storage.dao.SnapshotDao;
3132
import com.cloud.vm.snapshot.VMSnapshotDetailsVO;
3233
import com.cloud.vm.snapshot.dao.VMSnapshotDetailsDao;
@@ -468,6 +469,13 @@ public boolean revertVMSnapshot(VMSnapshot vmSnapshot) {
468469

469470
@Override
470471
public StrategyPriority canHandle(VMSnapshot vmSnapshot) {
472+
UserVmVO vm = userVmDao.findById(vmSnapshot.getVmId());
473+
String cantHandleLog = String.format("Default VM snapshot cannot handle VM snapshot for [%s]", vm);
474+
475+
if (isRunningVMVolumeOnCLVMStorage(vm, cantHandleLog)) {
476+
return StrategyPriority.CANT_HANDLE;
477+
}
478+
471479
return StrategyPriority.DEFAULT;
472480
}
473481

@@ -493,10 +501,31 @@ public boolean deleteVMSnapshotFromDB(VMSnapshot vmSnapshot, boolean unmanage) {
493501
return vmSnapshotDao.remove(vmSnapshot.getId());
494502
}
495503

504+
protected boolean isRunningVMVolumeOnCLVMStorage(UserVmVO vm, String cantHandleLog) {
505+
Long vmId = vm.getId();
506+
if (State.Running.equals(vm.getState())) {
507+
List<VolumeVO> volumes = volumeDao.findByInstance(vmId);
508+
for (VolumeVO volume : volumes) {
509+
StoragePool pool = primaryDataStoreDao.findById(volume.getPoolId());
510+
if (pool != null && pool.getPoolType() == Storage.StoragePoolType.CLVM) {
511+
logger.warn("Rejecting VM snapshot request: {} - VM is running on CLVM storage (pool: {}, poolType: CLVM)",
512+
cantHandleLog, pool.getName());
513+
return true;
514+
}
515+
}
516+
}
517+
return false;
518+
}
519+
496520
@Override
497521
public StrategyPriority canHandle(Long vmId, Long rootPoolId, boolean snapshotMemory) {
498522
UserVmVO vm = userVmDao.findById(vmId);
499523
String cantHandleLog = String.format("Default VM snapshot cannot handle VM snapshot for [%s]", vm);
524+
525+
if (isRunningVMVolumeOnCLVMStorage(vm, cantHandleLog)) {
526+
return StrategyPriority.CANT_HANDLE;
527+
}
528+
500529
if (State.Running.equals(vm.getState()) && !snapshotMemory) {
501530
logger.debug("{} as it is running and its memory will not be affected.", cantHandleLog, vm);
502531
return StrategyPriority.CANT_HANDLE;

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,13 @@ public StrategyPriority canHandle(VMSnapshot vmSnapshot) {
345345
}
346346
}
347347

348+
Long vmId = vmSnapshot.getVmId();
349+
UserVmVO vm = userVmDao.findById(vmId);
350+
String cantHandleLog = String.format("Storage VM snapshot strategy cannot handle VM snapshot for [%s]", vm);
351+
if (vm != null && isRunningVMVolumeOnCLVMStorage(vm, cantHandleLog)) {
352+
return StrategyPriority.CANT_HANDLE;
353+
}
354+
348355
if ( SnapshotManager.VmStorageSnapshotKvm.value() && userVm.getHypervisorType() == Hypervisor.HypervisorType.KVM
349356
&& vmSnapshot.getType() == VMSnapshot.Type.Disk) {
350357
return StrategyPriority.HYPERVISOR;

0 commit comments

Comments
 (0)