Arik Hadas has uploaded a new change for review. Change subject: core: remove snapshot's memory on remove vm from export domain ......................................................................
core: remove snapshot's memory on remove vm from export domain When a VM in export domain is being removed, the volumes of the memory of its snapshots should be removed from the export domain as well. Change-Id: I0bf0f29aade5cb7c93949a27067d7c4270e86032 Bug-Url: https://bugzilla.redhat.com/960931 Signed-off-by: Arik Hadas <[email protected]> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmFromImportExportCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryImageRemover.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryImageRemoverFromExportDomain.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryUtils.java 5 files changed, 179 insertions(+), 50 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/11/16711/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java index ce0e59a..b06d4eb 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java @@ -2,7 +2,6 @@ import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashMap; @@ -15,6 +14,7 @@ import org.ovirt.engine.core.bll.job.ExecutionContext; import org.ovirt.engine.core.bll.job.ExecutionHandler; import org.ovirt.engine.core.bll.memory.MemoryImageRemover; +import org.ovirt.engine.core.bll.memory.MemoryUtils; import org.ovirt.engine.core.bll.network.MacPoolManager; import org.ovirt.engine.core.bll.network.VmInterfaceManager; import org.ovirt.engine.core.bll.quota.QuotaConsumptionParameter; @@ -102,6 +102,7 @@ private final List<Guid> diskGuidList = new ArrayList<Guid>(); private final List<Guid> imageGuidList = new ArrayList<Guid>(); private final List<String> macsAdded = new ArrayList<String>(); + private final SnapshotsManager snapshotsManager = new SnapshotsManager(); public ImportVmCommand(ImportVmParameters parameters) { super(parameters); @@ -383,15 +384,6 @@ return true; } - private Set<String> getMemoryVolumesToBeImported() { - Set<String> memories = new HashSet<String>(); - for (Snapshot snapshot : getVm().getSnapshots()) { - memories.add(snapshot.getMemoryVolume()); - } - memories.remove(StringUtils.EMPTY); - return memories; - } - /** * This method fills the given map of domain to the required size for storing memory images * within it, and also update the memory volume in each snapshot that has memory volume with @@ -425,26 +417,14 @@ } domain2requiredSize.put(storageDomain, domain2requiredSize.get(storageDomain) + requiredSizeForMemory); - String modifiedMemoryVolume = createMemoryVolumeStringWithGivenDomainAndPool( - memoryVolume, storageDomain, getParameters().getStoragePoolId()); + String modifiedMemoryVolume = MemoryUtils.changeStorageDomainAndPoolInMemoryVolume( + memoryVolume, storageDomain.getId(), getParameters().getStoragePoolId()); // replace the volume representation with the one with the correct domain & pool snapshot.setMemoryVolume(modifiedMemoryVolume); // save it in case we'll find other snapshots with the same memory volume handledMemoryVolumes.put(memoryVolume, modifiedMemoryVolume); } return true; - } - - /** - * Modified the given memory volume String representation to have the given storage - * pool and storage domain - */ - private String createMemoryVolumeStringWithGivenDomainAndPool(String originalMemoryVolume, - StorageDomain storageDomain, Guid storagePoolId) { - List<Guid> guids = GuidUtils.getGuidListFromString(originalMemoryVolume); - return String.format("%1$s,%2$s,%3$s,%4$s,%5$s,%6$s", - storageDomain.getId().toString(), storagePoolId.toString(), - guids.get(2), guids.get(3), guids.get(4), guids.get(5)); } /** @@ -656,7 +636,7 @@ } private void copyAllMemoryImages(Guid containerId) { - for (String memoryVolumes : getMemoryVolumesToBeImported()) { + for (String memoryVolumes : MemoryUtils.getMemoryVolumesFromSnapshots(getVm().getSnapshots())) { List<Guid> guids = GuidUtils.getGuidListFromString(memoryVolumes); // copy the memory dump image @@ -876,10 +856,8 @@ * @return The generated snapshot */ protected Snapshot addActiveSnapshot(Guid snapshotId) { - return new SnapshotsManager(). - addActiveSnapshot(snapshotId, getVm(), - getMemoryVolumeForNewActiveSnapshot(), - getCompensationContext()); + return snapshotsManager.addActiveSnapshot(snapshotId, getVm(), + getMemoryVolumeForNewActiveSnapshot(), getCompensationContext()); } private String getMemoryVolumeForNewActiveSnapshot() { @@ -1097,8 +1075,8 @@ } private void removeVmSnapshots(VM vm) { - Collection<String> memoriesOfRemovedSnapshots = - new SnapshotsManager().removeSnapshots(vm.getId()); + Set<String> memoriesOfRemovedSnapshots = + snapshotsManager.removeSnapshots(vm.getId()); new MemoryImageRemover(vm, this).removeMemoryVolumes(memoriesOfRemovedSnapshots); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmFromImportExportCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmFromImportExportCommand.java index 95b2f4c..00bb9f1 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmFromImportExportCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmFromImportExportCommand.java @@ -7,17 +7,23 @@ import java.util.List; import java.util.Map; +import org.ovirt.engine.core.bll.job.ExecutionContext; +import org.ovirt.engine.core.bll.memory.MemoryImageRemoverFromExportDomain; +import org.ovirt.engine.core.bll.memory.MemoryUtils; +import org.ovirt.engine.core.bll.tasks.TaskHandlerCommand; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.RemoveVmFromImportExportParamenters; import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.common.action.VdcReturnValueBase; +import org.ovirt.engine.core.common.asynctasks.AsyncTaskCreationInfo; import org.ovirt.engine.core.common.asynctasks.EntityInfo; import org.ovirt.engine.core.common.businessentities.DiskImage; +import org.ovirt.engine.core.common.businessentities.StorageDomain; import org.ovirt.engine.core.common.businessentities.StorageDomainStatus; import org.ovirt.engine.core.common.businessentities.StorageDomainType; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VMStatus; -import org.ovirt.engine.core.common.businessentities.StorageDomain; import org.ovirt.engine.core.common.errors.VdcBllMessages; import org.ovirt.engine.core.common.queries.GetAllFromExportDomainQueryParameters; import org.ovirt.engine.core.common.queries.VdcQueryReturnValue; @@ -25,10 +31,11 @@ import org.ovirt.engine.core.common.vdscommands.RemoveVMVDSCommandParameters; import org.ovirt.engine.core.common.vdscommands.VDSCommandType; import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.compat.NotImplementedException; import org.ovirt.engine.core.dal.dbbroker.DbFacade; @NonTransactiveCommandAttribute -public class RemoveVmFromImportExportCommand<T extends RemoveVmFromImportExportParamenters> extends RemoveVmCommand<T> { +public class RemoveVmFromImportExportCommand<T extends RemoveVmFromImportExportParamenters> extends RemoveVmCommand<T> implements TaskHandlerCommand<RemoveVmFromImportExportParamenters>{ // this is needed since overriding getVmTemplate() private VM exportVm; @@ -76,6 +83,7 @@ protected void executeVmCommand() { removeVmInSpm(); removeDiskImages(); + removeMemoryImages(); setSucceeded(true); } @@ -100,6 +108,12 @@ getParameters().getStoragePoolId(), getVmId(), getParameters().getStorageDomainId()); + } + + private void removeMemoryImages() { + new MemoryImageRemoverFromExportDomain(getVm(), this, + getParameters().getStoragePoolId(), getParameters().getStorageDomainId()) + .removeMemoryVolumes(MemoryUtils.getMemoryVolumesFromSnapshots(getVm().getSnapshots())); } @Override @@ -148,4 +162,58 @@ } return jobProperties; } + + /////////////////////////////////////// + // TaskHandlerCommand Implementation // + /////////////////////////////////////// + + public T getParameters() { + return super.getParameters(); + } + + public VdcActionType getActionType() { + return super.getActionType(); + } + + public VdcReturnValueBase getReturnValue() { + return super.getReturnValue(); + } + + public ExecutionContext getExecutionContext() { + return super.getExecutionContext(); + } + + public void setExecutionContext(ExecutionContext executionContext) { + super.setExecutionContext(executionContext); + } + + public Guid createTask(Guid taskId, + AsyncTaskCreationInfo asyncTaskCreationInfo, + VdcActionType parentCommand, + VdcObjectType entityType, + Guid... entityIds) { + return super.createTaskInCurrentTransaction(taskId, asyncTaskCreationInfo, parentCommand, entityType, entityIds); + } + + public Guid createTask(Guid taskId, + AsyncTaskCreationInfo asyncTaskCreationInfo, + VdcActionType parentCommand) { + return super.createTask(taskId, asyncTaskCreationInfo, parentCommand); + } + + public ArrayList<Guid> getTaskIdList() { + return super.getTaskIdList(); + } + + public void preventRollback() { + throw new NotImplementedException(); + } + + public Guid persistAsyncTaskPlaceHolder() { + return super.persistAsyncTaskPlaceHolder(getActionType()); + } + + public Guid persistAsyncTaskPlaceHolder(String taskKey) { + return super.persistAsyncTaskPlaceHolder(getActionType(), taskKey); + } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryImageRemover.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryImageRemover.java index a72725a..1c783ab 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryImageRemover.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryImageRemover.java @@ -1,7 +1,7 @@ package org.ovirt.engine.core.bll.memory; -import java.util.Collection; import java.util.List; +import java.util.Set; import org.ovirt.engine.core.bll.AsyncTaskManager; import org.ovirt.engine.core.bll.Backend; @@ -23,6 +23,7 @@ private TaskHandlerCommand<?> enclosingCommand; private VM vm; + private Boolean cachedPostZero; public MemoryImageRemover(VM vm, TaskHandlerCommand<?> enclosingCommand) { this.enclosingCommand = enclosingCommand; @@ -35,7 +36,7 @@ } } - public void removeMemoryVolumes(Collection<String> memoryVolumes) { + public void removeMemoryVolumes(Set<String> memoryVolumes) { for (String memoryVols : memoryVolumes) { removeMemoryVolume(memoryVols); } @@ -58,17 +59,6 @@ List<Guid> guids = GuidUtils.getGuidListFromString(memVols); if (guids.size() == 6) { - // get all vm disks in order to check post zero - if one of the - // disks is marked with wipe_after_delete - boolean postZero = - LinqUtils.filter( - getDbFacade().getDiskDao().getAllForVm(vm.getId()), - new Predicate<Disk>() { - @Override - public boolean eval(Disk disk) { - return disk.isWipeAfterDelete(); - } - }).size() > 0; Guid taskId1 = enclosingCommand.persistAsyncTaskPlaceHolder(VmCommand.DELETE_PRIMARY_IMAGE_TASK_KEY); // delete first image @@ -79,8 +69,7 @@ .getResourceManager() .RunVdsCommand( VDSCommandType.DeleteImageGroup, - new DeleteImageGroupVDSCommandParameters(guids.get(1), guids.get(0), - guids.get(2), postZero, false)); + buildDeleteMemoryImageParams(guids)); if (!vdsRetValue.getSucceeded()) { return false; @@ -100,8 +89,7 @@ .getResourceManager() .RunVdsCommand( VDSCommandType.DeleteImageGroup, - new DeleteImageGroupVDSCommandParameters(guids.get(1), guids.get(0), - guids.get(4), postZero, false)); + buildDeleteMemoryConfParams(guids)); if (!vdsRetValue.getSucceeded()) { if (startPollingTasks) { @@ -123,4 +111,30 @@ return true; } + protected DeleteImageGroupVDSCommandParameters buildDeleteMemoryImageParams(List<Guid> guids) { + return new DeleteImageGroupVDSCommandParameters( + guids.get(1), guids.get(0), guids.get(2), isPostZero(), false); + } + + protected DeleteImageGroupVDSCommandParameters buildDeleteMemoryConfParams(List<Guid> guids) { + return new DeleteImageGroupVDSCommandParameters( + guids.get(1), guids.get(0), guids.get(4), isPostZero(), false); + } + + protected boolean isPostZero() { + if (cachedPostZero == null) { + // get all vm disks in order to check post zero - if one of the + // disks is marked with wipe_after_delete + cachedPostZero = + LinqUtils.filter( + getDbFacade().getDiskDao().getAllForVm(vm.getId()), + new Predicate<Disk>() { + @Override + public boolean eval(Disk disk) { + return disk.isWipeAfterDelete(); + } + }).size() > 0; + } + return cachedPostZero; + } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryImageRemoverFromExportDomain.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryImageRemoverFromExportDomain.java new file mode 100644 index 0000000..29eb2ba --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryImageRemoverFromExportDomain.java @@ -0,0 +1,35 @@ +package org.ovirt.engine.core.bll.memory; + +import org.ovirt.engine.core.bll.tasks.TaskHandlerCommand; +import org.ovirt.engine.core.common.businessentities.VM; +import org.ovirt.engine.core.compat.Guid; + +public class MemoryImageRemoverFromExportDomain extends MemoryImageRemover { + + private Guid storagePoolId; + private Guid storageDomainId; + + public MemoryImageRemoverFromExportDomain(VM vm, TaskHandlerCommand<?> enclosingCommand, + Guid storagePoolId, Guid storageDomainId) { + super(vm, enclosingCommand); + this.storagePoolId = storagePoolId; + this.storageDomainId = storageDomainId; + } + + @Override + protected boolean isPostZero() { + return false; + } + + @Override + protected boolean shouldRemoveMemorySnapshotVolumes(String memoryVolume) { + return !memoryVolume.isEmpty(); + } + + @Override + public void removeMemoryVolume(String memoryVolumes) { + super.removeMemoryVolume( + MemoryUtils.changeStorageDomainAndPoolInMemoryVolume( + memoryVolumes, storageDomainId, storagePoolId)); + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryUtils.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryUtils.java new file mode 100644 index 0000000..ef14751 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryUtils.java @@ -0,0 +1,34 @@ +package org.ovirt.engine.core.bll.memory; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.apache.commons.lang.StringUtils; +import org.ovirt.engine.core.common.businessentities.Snapshot; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.utils.GuidUtils; + +public class MemoryUtils { + + /** + * Modified the given memory volume String representation to have the given storage + * pool and storage domain + */ + public static String changeStorageDomainAndPoolInMemoryVolume( + String originalMemoryVolume, Guid storageDomainId, Guid storagePoolId) { + List<Guid> guids = GuidUtils.getGuidListFromString(originalMemoryVolume); + return String.format("%1$s,%2$s,%3$s,%4$s,%5$s,%6$s", + storageDomainId.toString(), storagePoolId.toString(), + guids.get(2), guids.get(3), guids.get(4), guids.get(5)); + } + + public static Set<String> getMemoryVolumesFromSnapshots(List<Snapshot> snapshots) { + Set<String> memories = new HashSet<String>(); + for (Snapshot snapshot : snapshots) { + memories.add(snapshot.getMemoryVolume()); + } + memories.remove(StringUtils.EMPTY); + return memories; + } +} -- To view, visit http://gerrit.ovirt.org/16711 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I0bf0f29aade5cb7c93949a27067d7c4270e86032 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Arik Hadas <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
