Greg Padgett has uploaded a new change for review. Change subject: core: Enable Live Merge in Snapshots Overview ......................................................................
core: Enable Live Merge in Snapshots Overview Enable Live Merge in the snapshots overview. This required enabling the action in CanDoAction using code similar to RemoveSnapshotCommand, and branching RemoveDiskSnapshotsCommand to use CoCo in executing the Live Merge rather than task handlers for cold merge. The task handlers for cold merge are initialized early in the command lifecycle, before the command knows if the VM is up. Therefore, a means of disabling these handlers is provided so that once the command can determine a Live Merge is occurring, it can disable the handlers and rely on command coordination for the merge execution. Change-Id: I30d152a70ebdeacf0410d7ad15a49e44fb564a18 Bug-Url: https://bugzilla.redhat.com/1133890 Signed-off-by: Greg Padgett <gpadg...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskSnapshotsCommand.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskSnapshotsCommandCallback.java 3 files changed, 124 insertions(+), 0 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/38/32338/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java index 4d06950..6fb0ba2 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java @@ -2109,6 +2109,11 @@ return taskHandlers; } + protected void clearTaskHandlers() { + // For use when combining TaskHandler and CommandExecutor-driven child commands + taskHandlers = null; + } + public boolean hasTaskHandlers() { return getTaskHandlers() != null; } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskSnapshotsCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskSnapshotsCommand.java index 839b7dd..551a352 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskSnapshotsCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskSnapshotsCommand.java @@ -7,10 +7,13 @@ import java.util.Map; import org.apache.commons.lang.StringUtils; +import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.bll.snapshots.SnapshotsValidator; import org.ovirt.engine.core.bll.storage.StoragePoolValidator; +import org.ovirt.engine.core.bll.tasks.CommandCoordinatorUtil; import org.ovirt.engine.core.bll.tasks.SPMAsyncTaskHandler; import org.ovirt.engine.core.bll.tasks.TaskHandlerCommand; +import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallBack; import org.ovirt.engine.core.bll.utils.PermissionSubject; import org.ovirt.engine.core.bll.validator.DiskImagesValidator; import org.ovirt.engine.core.bll.validator.DiskSnapshotsValidator; @@ -21,6 +24,7 @@ import org.ovirt.engine.core.common.action.LockProperties; import org.ovirt.engine.core.common.action.LockProperties.Scope; import org.ovirt.engine.core.common.action.RemoveDiskSnapshotsParameters; +import org.ovirt.engine.core.common.action.RemoveSnapshotSingleDiskParameters; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.asynctasks.AsyncTaskCreationInfo; import org.ovirt.engine.core.common.businessentities.DiskImage; @@ -31,6 +35,7 @@ import org.ovirt.engine.core.common.locks.LockingGroup; import org.ovirt.engine.core.common.utils.Pair; import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.dao.DiskDao; import org.ovirt.engine.core.dao.DiskImageDAO; import org.ovirt.engine.core.dao.VmDeviceDAO; @@ -45,6 +50,10 @@ public RemoveDiskSnapshotsCommand(T parameters) { super(parameters); + } + + public RemoveDiskSnapshotsCommand(T parameters, CommandContext cmdContext) { + super(parameters, cmdContext); } @Override @@ -75,6 +84,13 @@ VM vm = listVms.get(0); setVm(vm); } + } + + // FIXME: It would be better to not add the task handlers in the first place, but at + // the time they are added (via super.init()), setVm() hasn't been called and thus + // initTaskHandlers() can't yet tell if this is a live or cold merge. + if (isLiveMerge()) { + clearTaskHandlers(); } } @@ -171,10 +187,50 @@ } @Override + public CommandCallBack getCallBack() { + if (isLiveMerge()) { + return new RemoveDiskSnapshotsCommandCallback(); + } else { + return null; + } + } + + private boolean isLiveMerge() { + return (!getVm().isDown()); + } + + @Override protected void executeCommand() { + if (isLiveMerge()) { + persistCommand(getParameters().getParentCommand(), true); + } setSucceeded(true); } + public void startNextLiveMerge(int completedChildren) { + Guid imageId = getParameters().getImageIds().get(completedChildren); + log.infoFormat("Starting child command {0} of {1}, image {2}", + completedChildren + 1, getParameters().getImageIds().size(), imageId); + CommandCoordinatorUtil.executeAsyncCommand( + VdcActionType.RemoveSnapshotSingleDiskLive, + buildRemoveSnapshotSingleDiskLiveParameters(imageId), + cloneContextAndDetachFromParent()); + } + + private RemoveSnapshotSingleDiskParameters buildRemoveSnapshotSingleDiskLiveParameters(Guid imageId) { + DiskImage dest = DbFacade.getInstance().getDiskImageDao().getAllSnapshotsForParent(imageId).get(0); + RemoveSnapshotSingleDiskParameters parameters = + new RemoveSnapshotSingleDiskParameters(imageId, getVmId()); + parameters.setDestinationImageId(dest.getImageId()); + parameters.setEntityInfo(getParameters().getEntityInfo()); + parameters.setParentParameters(getParameters()); + parameters.setParentCommand(getActionType()); + parameters.setCommandType(VdcActionType.RemoveSnapshotSingleDiskLive); + parameters.setVdsId(getVm().getRunOnVds()); + parameters.setSessionId(getParameters().getSessionId()); + return parameters; + } + protected void updateSnapshotVmConfiguration() { Guid imageId = getParameters().getImageIds().get(getParameters().getExecutionIndex()); Snapshot snapshot = getSnapshotDao().get(getSnapshotId()); diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskSnapshotsCommandCallback.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskSnapshotsCommandCallback.java new file mode 100644 index 0000000..1217661 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskSnapshotsCommandCallback.java @@ -0,0 +1,63 @@ +package org.ovirt.engine.core.bll; + +import java.util.List; + +import org.ovirt.engine.core.bll.tasks.CommandCoordinatorUtil; +import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallBack; +import org.ovirt.engine.core.common.action.RemoveDiskSnapshotsParameters; +import org.ovirt.engine.core.compat.CommandStatus; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.utils.log.Log; +import org.ovirt.engine.core.utils.log.LogFactory; + +public class RemoveDiskSnapshotsCommandCallback extends CommandCallBack { + private static final Log log = LogFactory.getLog(RemoveDiskSnapshotsCommandCallback.class); + + @Override + public void doPolling(Guid cmdId, List<Guid> childCmdIds) { + boolean anyFailed = false; + int completedChildren = 0; + for (Guid childCmdId : childCmdIds) { + switch (CommandCoordinatorUtil.getCommandStatus(childCmdId)) { + case ACTIVE: + log.info("Waiting on Live Merge child commands to complete"); + return; + case FAILED: + case FAILED_RESTARTED: + case UNKNOWN: + anyFailed = true; + break; + default: + ++completedChildren; + break; + } + } + + RemoveDiskSnapshotsCommand<RemoveDiskSnapshotsParameters> command = getCommand(cmdId); + if (!anyFailed && completedChildren < command.getParameters().getImageIds().size()) { + command.startNextLiveMerge(completedChildren); + return; + } + + command.getParameters().setTaskGroupSuccess(!anyFailed); + command.setCommandStatus(anyFailed ? CommandStatus.FAILED : CommandStatus.SUCCEEDED); + log.infoFormat("All Live Merge child commands have completed, status {0}", + command.getCommandStatus()); + } + + @Override + public void onSucceeded(Guid cmdId, List<Guid> childCmdIds) { + getCommand(cmdId).endAction(); + CommandCoordinatorUtil.removeAllCommandsInHierarchy(cmdId); + } + + @Override + public void onFailed(Guid cmdId, List<Guid> childCmdIds) { + getCommand(cmdId).endAction(); + CommandCoordinatorUtil.removeAllCommandsInHierarchy(cmdId); + } + + private RemoveDiskSnapshotsCommand<RemoveDiskSnapshotsParameters> getCommand(Guid cmdId) { + return (RemoveDiskSnapshotsCommand<RemoveDiskSnapshotsParameters>) CommandCoordinatorUtil.retrieveCommand(cmdId); + } +} -- To view, visit http://gerrit.ovirt.org/32338 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I30d152a70ebdeacf0410d7ad15a49e44fb564a18 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Greg Padgett <gpadg...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches