From 656e855792737318b7bb5c84eea7a2a30eb6ad71 Mon Sep 17 00:00:00 2001 From: Anshul Gangwar Date: Wed, 9 Sep 2015 14:21:15 +0530 Subject: [PATCH] CLOUDSTACK-8827: Move the VM snapshots stuck in transitional states to stable state during managment server restart i.e. If snapshot in creating state move it to Error state and if it is in reverting state move it to Ready state. --- .../cloud/vm/snapshot/VMSnapshotService.java | 4 +- .../cloud/vm/VirtualMachineManagerImpl.java | 1 + .../vm/snapshot/VMSnapshotManagerImpl.java | 47 +++++++++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/api/src/com/cloud/vm/snapshot/VMSnapshotService.java b/api/src/com/cloud/vm/snapshot/VMSnapshotService.java index e376265acfa4..da22ba4ff5a1 100644 --- a/api/src/com/cloud/vm/snapshot/VMSnapshotService.java +++ b/api/src/com/cloud/vm/snapshot/VMSnapshotService.java @@ -47,10 +47,12 @@ UserVm revertToSnapshot(Long vmSnapshotId) throws InsufficientServerCapacityExce VirtualMachine getVMBySnapshotId(Long id); + void cleanupVmSnapshotJobs(); + /** * Delete vm snapshots only from database. Introduced as a Vmware optimization in which vm snapshots are deleted when * the vm gets deleted on hypervisor (no need to delete each vm snapshot before deleting vm, just mark them as deleted on DB) - * @param id vm id + * @param vmId vm id */ boolean deleteVMSnapshotsFromDB(Long vmId); } diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java index d19aaf372cc0..148c348577f9 100755 --- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -578,6 +578,7 @@ public boolean start() { cancelWorkItems(_nodeId); volumeMgr.cleanupStorageJobs(); + _vmSnapshotMgr.cleanupVmSnapshotJobs(); // cleanup left over place holder works _workJobDao.expungeLeftoverWorkJobs(ManagementServerNode.getManagementServerId()); return true; diff --git a/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java b/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java index e4ee45163937..c3dafc6ae7a4 100644 --- a/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java +++ b/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java @@ -1297,4 +1297,51 @@ public boolean deleteVMSnapshotsFromDB(Long vmId) { } return true; } + + @Override + public void cleanupVmSnapshotJobs(){ + List jobs = _jobMgr.findFailureAsyncJobs(VmWorkCreateVMSnapshot.class.getName(), VmWorkRevertToVMSnapshot.class.getName()); + + for (AsyncJobVO job : jobs) { + try { + if (job.getCmd().equalsIgnoreCase(VmWorkCreateVMSnapshot.class.getName())) { + VmWorkCreateVMSnapshot work = VmWorkSerializer.deserialize(VmWorkCreateVMSnapshot.class, job.getCmdInfo()); + cleanupVmSnapshotCreateFailure(work.getVmSnapshotId()); + } else if(job.getCmd().equalsIgnoreCase(VmWorkRevertToVMSnapshot.class.getName())) { + VmWorkRevertToVMSnapshot work = VmWorkSerializer.deserialize(VmWorkRevertToVMSnapshot.class, job.getCmdInfo()); + cleanupVmSnapshotRevertFailure(work.getVmSnapshotId()); + } + } catch (Exception e) { + s_logger.error("clean up job failure, will continue", e); + } + } + } + + private void cleanupVmSnapshotRevertFailure(Long vmSnapshotId) { + VMSnapshotVO vmSnapshotVO = _vmSnapshotDao.findById(vmSnapshotId); + + if(vmSnapshotVO == null) { + return; + } + + if(vmSnapshotVO.getState().equals(VMSnapshot.State.Reverting)) { + s_logger.debug("Change VM snapshot state to Error : " + vmSnapshotId); + vmSnapshotVO.setState(VMSnapshot.State.Ready); + _vmSnapshotDao.update(vmSnapshotId, vmSnapshotVO); + } + } + + private void cleanupVmSnapshotCreateFailure(Long vmSnapshotId) { + VMSnapshotVO vmSnapshotVO = _vmSnapshotDao.findById(vmSnapshotId); + + if(vmSnapshotVO == null) { + return; + } + + if(vmSnapshotVO.getState().equals(VMSnapshot.State.Creating)) { + s_logger.debug("Change VM snapshot state to Error : " + vmSnapshotId); + vmSnapshotVO.setState(VMSnapshot.State.Error); + _vmSnapshotDao.update(vmSnapshotId, vmSnapshotVO); + } + } }