This is an automated email from the ASF dual-hosted git repository.
rohit pushed a commit to branch 4.15
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/4.15 by this push:
new a64ad9d server: Prevent vm snapshots being indefinitely stuck in
Expunging state on deletion failure (#4898)
a64ad9d is described below
commit a64ad9d9b7a75fee5a7be218251c5a63f08a9cf1
Author: Pearl Dsilva <[email protected]>
AuthorDate: Mon Apr 12 08:09:37 2021 +0530
server: Prevent vm snapshots being indefinitely stuck in Expunging state on
deletion failure (#4898)
Fixes #4201
This PR addresses the issue of a vm snapshot being indefinitely stuck is
Expunging state in case deletion fails.
Co-authored-by: Pearl Dsilva <[email protected]>
---
api/src/main/java/com/cloud/vm/snapshot/VMSnapshot.java | 1 +
.../storage/vmsnapshot/DefaultVMSnapshotStrategy.java | 15 +++++++++------
2 files changed, 10 insertions(+), 6 deletions(-)
diff --git a/api/src/main/java/com/cloud/vm/snapshot/VMSnapshot.java
b/api/src/main/java/com/cloud/vm/snapshot/VMSnapshot.java
index c398e58..3897df2 100644
--- a/api/src/main/java/com/cloud/vm/snapshot/VMSnapshot.java
+++ b/api/src/main/java/com/cloud/vm/snapshot/VMSnapshot.java
@@ -59,6 +59,7 @@ public interface VMSnapshot extends ControlledEntity,
Identity, InternalIdentity
s_fsm.addTransition(Error, Event.ExpungeRequested, Expunging);
s_fsm.addTransition(Expunging, Event.ExpungeRequested, Expunging);
s_fsm.addTransition(Expunging, Event.OperationSucceeded, Removed);
+ s_fsm.addTransition(Expunging, Event.OperationFailed, Error);
}
}
diff --git
a/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/vmsnapshot/DefaultVMSnapshotStrategy.java
b/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/vmsnapshot/DefaultVMSnapshotStrategy.java
index 8423624..d60e623 100644
---
a/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/vmsnapshot/DefaultVMSnapshotStrategy.java
+++
b/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/vmsnapshot/DefaultVMSnapshotStrategy.java
@@ -230,11 +230,10 @@ public class DefaultVMSnapshotStrategy extends
ManagerBase implements VMSnapshot
} else {
String errMsg = (answer == null) ? null : answer.getDetails();
s_logger.error("Delete vm snapshot " + vmSnapshot.getName() +
" of vm " + userVm.getInstanceName() + " failed due to " + errMsg);
+ processAnswer(vmSnapshotVO, userVm, answer, hostId);
throw new CloudRuntimeException("Delete vm snapshot " +
vmSnapshot.getName() + " of vm " + userVm.getInstanceName() + " failed due to "
+ errMsg);
}
- } catch (OperationTimedoutException e) {
- throw new CloudRuntimeException("Delete vm snapshot " +
vmSnapshot.getName() + " of vm " + userVm.getInstanceName() + " failed due to "
+ e.getMessage());
- } catch (AgentUnavailableException e) {
+ } catch (OperationTimedoutException | AgentUnavailableException e) {
throw new CloudRuntimeException("Delete vm snapshot " +
vmSnapshot.getName() + " of vm " + userVm.getInstanceName() + " failed due to "
+ e.getMessage());
}
}
@@ -254,9 +253,13 @@ public class DefaultVMSnapshotStrategy extends ManagerBase
implements VMSnapshot
finalizeRevert(vmSnapshot, answer.getVolumeTOs());
vmSnapshotHelper.vmSnapshotStateTransitTo(vmSnapshot,
VMSnapshot.Event.OperationSucceeded);
} else if (as instanceof DeleteVMSnapshotAnswer) {
- DeleteVMSnapshotAnswer answer =
(DeleteVMSnapshotAnswer)as;
- finalizeDelete(vmSnapshot, answer.getVolumeTOs());
- vmSnapshotDao.remove(vmSnapshot.getId());
+ if (as.getResult()) {
+ DeleteVMSnapshotAnswer answer =
(DeleteVMSnapshotAnswer) as;
+ finalizeDelete(vmSnapshot, answer.getVolumeTOs());
+ vmSnapshotDao.remove(vmSnapshot.getId());
+ } else {
+
vmSnapshotHelper.vmSnapshotStateTransitTo(vmSnapshot,
VMSnapshot.Event.OperationFailed);
+ }
}
}
});