Federico Simoncelli has uploaded a new change for review.

Change subject: backend: prevent live storage migration on live snapshot failure
......................................................................

backend: prevent live storage migration on live snapshot failure

Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=1018876
Change-Id: I7c69f663836e74691c968f4a15c5f3012479a8b0
Signed-off-by: Federico Simoncelli <fsimo...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateAllSnapshotsFromVmCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateDisksTaskHandler.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveSnapshotTaskHandler.java
3 files changed, 20 insertions(+), 11 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/50/21350/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateAllSnapshotsFromVmCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateAllSnapshotsFromVmCommand.java
index ebc0ad2..a864561 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateAllSnapshotsFromVmCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateAllSnapshotsFromVmCommand.java
@@ -232,6 +232,8 @@
             public Void runInTransaction() {
                 boolean taskGroupSucceeded = 
getParameters().getTaskGroupSuccess();
                 Snapshot createdSnapshot = getSnapshotDao().get(getVmId(), 
getParameters().getSnapshotType(), SnapshotStatus.LOCKED);
+                boolean liveSnapshotRequired = isLiveSnapshotApplicable();
+                boolean liveSnapshotSucceeded = false;
                 // if the snapshot was not created the command should be
                 // handled as a failure
                 if (createdSnapshot == null) {
@@ -240,8 +242,8 @@
                 if (taskGroupSucceeded) {
                     getSnapshotDao().updateStatus(createdSnapshot.getId(), 
SnapshotStatus.OK);
 
-                    if (isLiveSnapshotApplicable()) {
-                        performLiveSnapshot(createdSnapshot);
+                    if (liveSnapshotRequired) {
+                        liveSnapshotSucceeded = 
performLiveSnapshot(createdSnapshot);
                     } else {
                         // If the created snapshot contains memory, remove the 
memory volumes as
                         // they are not in use since no live snapshot was 
created
@@ -271,7 +273,7 @@
 
                 incrementVmGeneration();
                 endActionOnDisks();
-                setSucceeded(taskGroupSucceeded);
+                setSucceeded(taskGroupSucceeded && (!liveSnapshotRequired || 
liveSnapshotSucceeded));
                 getReturnValue().setEndActionTryAgain(false);
                 return null;
             }
@@ -347,26 +349,25 @@
 
     /**
      * Perform live snapshot on the host that the VM is running on. If the 
snapshot fails, and the error is
-     * unrecoverable then the {@link 
CreateAllSnapshotsFromVmParameters#getTaskGroupSuccess()} will return false - 
which
-     * will indicate that rollback of snapshot command should happen.
+     * unrecoverable then the {@link 
CreateAllSnapshotsFromVmParameters#getTaskGroupSuccess()} will return false.
      *
-     * @param createdSnapshotId
+     * @param snapshot
      *            Snapshot to revert to being active, in case of rollback.
      */
-    protected void performLiveSnapshot(final Snapshot snapshot) {
+    protected boolean performLiveSnapshot(final Snapshot snapshot) {
         try {
             TransactionSupport.executeInScope(TransactionScopeOption.Suppress, 
new TransactionMethod<Void>() {
-
                 @Override
                 public Void runInTransaction() {
-
                     runVdsCommand(VDSCommandType.Snapshot, 
buildLiveSnapshotParameters(snapshot));
                     return null;
                 }
             });
         } catch (VdcBLLException e) {
             handleVdsLiveSnapshotFailure(e);
+            return false;
         }
+        return true;
     }
 
     private SnapshotVDSCommandParameters buildLiveSnapshotParameters(Snapshot 
snapshot) {
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateDisksTaskHandler.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateDisksTaskHandler.java
index cee277d..f2add73 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateDisksTaskHandler.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateDisksTaskHandler.java
@@ -10,6 +10,8 @@
 import org.ovirt.engine.core.common.action.VdcActionType;
 import org.ovirt.engine.core.common.action.VdcReturnValueBase;
 import org.ovirt.engine.core.common.asynctasks.AsyncTaskType;
+import org.ovirt.engine.core.common.errors.VdcBLLException;
+import org.ovirt.engine.core.common.errors.VdcBllErrors;
 import org.ovirt.engine.core.utils.log.Log;
 import org.ovirt.engine.core.utils.log.LogFactory;
 
@@ -24,6 +26,11 @@
 
     @Override
     public void execute() {
+        if (!enclosingCommand.getReturnValue().getSucceeded()) {
+            throw new VdcBLLException(VdcBllErrors.imageErr,
+                "Auto-generated live snapshot for VM " + 
enclosingCommand.getParameters().getVmId() + " failed");
+        }
+
         for (LiveMigrateDiskParameters parameters : 
enclosingCommand.getParameters().getParametersList()) {
             CommandContext commandContext = 
ExecutionHandler.createInternalJobContext();
             ExecutionHandler.setAsyncJob(commandContext.getExecutionContext(), 
true);
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveSnapshotTaskHandler.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveSnapshotTaskHandler.java
index 8554c29..43d14c1 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveSnapshotTaskHandler.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveSnapshotTaskHandler.java
@@ -66,9 +66,10 @@
     }
 
     private void endCreateAllSnapshots() {
-        Backend.getInstance().endAction(VdcActionType.CreateAllSnapshotsFromVm,
-                getCreateSnapshotParameters(),
+        VdcReturnValueBase returnValue = Backend.getInstance().endAction(
+                VdcActionType.CreateAllSnapshotsFromVm, 
getCreateSnapshotParameters(),
                 
ExecutionHandler.createDefaultContexForTasks(enclosingCommand.getExecutionContext()));
+        
enclosingCommand.getReturnValue().setSucceeded(returnValue.getSucceeded());
     }
 
     @Override


-- 
To view, visit http://gerrit.ovirt.org/21350
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I7c69f663836e74691c968f4a15c5f3012479a8b0
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: ovirt-engine-3.3
Gerrit-Owner: Federico Simoncelli <fsimo...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to