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