Greg Padgett has uploaded a new change for review.

Change subject: core: fix race when removing memory volumes during Live Merge
......................................................................

core: fix race when removing memory volumes during Live Merge

Memory volume removal was not tracked as a child command, and its
completion would trigger endAction of RemoveSnapshotCommand before the
tasks run by ExecutionHandler were complete.  Instead, use the newer
RemoveMemoryVolumesCommand during Live Merge, which Executionhandler can
coordinate.

Change-Id: I12e317ada7159101cc5349e9a084b7f316493048
Signed-off-by: Greg Padgett <gpadg...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveMemoryVolumesCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveSnapshotCommand.java
2 files changed, 17 insertions(+), 5 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/08/30608/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveMemoryVolumesCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveMemoryVolumesCommand.java
index d9fc5ec..4971792 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveMemoryVolumesCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveMemoryVolumesCommand.java
@@ -26,6 +26,10 @@
 @InternalCommandAttribute
 public class RemoveMemoryVolumesCommand<T extends 
RemoveMemoryVolumesParameters> extends CommandBase<T> implements 
TaskHandlerCommand<T> {
 
+    public RemoveMemoryVolumesCommand(T parameters) {
+        super(parameters);
+    }
+
     public RemoveMemoryVolumesCommand(T parameters, CommandContext cmdContext) 
{
         super(parameters, cmdContext);
     }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveSnapshotCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveSnapshotCommand.java
index 380e875..bb41322 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveSnapshotCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveSnapshotCommand.java
@@ -24,6 +24,7 @@
 import org.ovirt.engine.core.common.action.ImagesContainterParametersBase;
 import org.ovirt.engine.core.common.action.LockProperties;
 import org.ovirt.engine.core.common.action.LockProperties.Scope;
+import org.ovirt.engine.core.common.action.RemoveMemoryVolumesParameters;
 import org.ovirt.engine.core.common.action.RemoveSnapshotParameters;
 import org.ovirt.engine.core.common.action.RemoveSnapshotSingleDiskParameters;
 import org.ovirt.engine.core.common.action.VdcActionParametersBase;
@@ -125,6 +126,7 @@
         freeLock();
         getParameters().setEntityInfo(new EntityInfo(VdcObjectType.VM, 
getVmId()));
 
+        boolean useTaskManagerToRemoveMemory = false;
         if (snapshotHasImages) {
             removeImages();
 
@@ -132,11 +134,12 @@
                 // Enable callbacks in order to monitor for new-style child 
completion
                 setCommandStatus(CommandStatus.ACTIVE_ASYNC);
                 
persistCommandWithoutContext(getParameters().getParentCommand(), true);
+                useTaskManagerToRemoveMemory = true;
             }
         }
 
         if (removeSnapshotMemory) {
-            removeMemory(snapshot);
+            removeMemory(snapshot, useTaskManagerToRemoveMemory);
         }
 
         setSucceeded(true);
@@ -151,10 +154,15 @@
                 
getDbFacade().getSnapshotDao().getNumOfSnapshotsByMemory(memoryVolume) == 1;
     }
 
-    private void removeMemory(final Snapshot snapshot) {
-        boolean success = removeMemoryVolumes(snapshot.getMemoryVolume(), 
getActionType(), false);
-        if (!success) {
-            log.errorFormat("Cannot remove memory volumes for snapshot {0}", 
snapshot.getId());
+    private void removeMemory(final Snapshot snapshot, boolean useTaskManager) 
{
+        RemoveMemoryVolumesParameters parameters = new 
RemoveMemoryVolumesParameters(snapshot.getMemoryVolume(), getVmId());
+        if (useTaskManager) {
+            
TaskManagerUtil.executeAsyncCommand(VdcActionType.RemoveMemoryVolumes, 
parameters, cloneContextAndDetachFromParent());
+        } else {
+            VdcReturnValueBase ret = 
runInternalAction(VdcActionType.RemoveMemoryVolumes, parameters);
+            if (!ret.getSucceeded()) {
+                log.errorFormat("Cannot remove memory volumes for snapshot 
{0}", snapshot.getId());
+            }
         }
     }
 


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I12e317ada7159101cc5349e9a084b7f316493048
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: ovirt-engine-3.5
Gerrit-Owner: Greg Padgett <gpadg...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to