Liron Aravot has uploaded a new change for review. Change subject: tmp4 ......................................................................
tmp4 Change-Id: Ia0bfedbec4f181afdab91801c2abecde3fb2206e Signed-off-by: [email protected] <[email protected]> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromTemplateCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/BaseImagesCommand.java 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/CreateAllSnapshotsFromVmCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateCloneOfTemplateCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateOvfStoresForStorageDomainCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateOvfVolumeForStorageDomainCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateSnapshotCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ProcessOvfUpdateForStorageDomainCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveImageCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RestoreFromSnapshotCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/TryBackToAllSnapshotsOfVmCommand.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ProcessOvfUpdateForStorageDomainCommandParameters.java 15 files changed, 237 insertions(+), 119 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/23/39323/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java index d1623e9..2340495 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java @@ -1082,7 +1082,7 @@ public AuditLogType getAuditLogTypeValue() { switch (getActionState()) { case EXECUTE: - return getSucceeded() ? (!getReturnValue().getVdsmTaskIdList().isEmpty() ? AuditLogType.USER_ADD_VM_STARTED + return getSucceeded() ? (!noAsyncOperations() ? AuditLogType.USER_ADD_VM_STARTED : AuditLogType.USER_ADD_VM) : AuditLogType.USER_FAILED_ADD_VM; case END_SUCCESS: diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromTemplateCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromTemplateCommand.java index b6db61c3..c5a6b11 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromTemplateCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromTemplateCommand.java @@ -61,7 +61,7 @@ getVm().getStaticData().setQuotaId(getParameters().getVmStaticData().getQuotaId()); DbFacade.getInstance().getVmStaticDao().update(getVm().getStaticData()); // if there are no tasks, we can end the command right away. - if (getTaskIdList().isEmpty()) { + if (noAsyncOperations()) { endSuccessfully(); } checkTrustedService(); @@ -97,7 +97,7 @@ } VmHandler.lockVm(getVm().getDynamicData(), getCompensationContext()); for (DiskImage disk : getVmTemplate().getDiskTemplateMap().values()) { - VdcReturnValueBase result = runInternalActionWithTasksContext( + VdcReturnValueBase result = runChildActionWithTasksContextIfNeeded( VdcActionType.CreateCloneOfTemplate, buildCreateCloneOfTemplateParameters(disk) ); @@ -125,6 +125,7 @@ params.setParentCommand(VdcActionType.AddVmFromTemplate); params.setParentParameters(getParameters()); params.setEntityInfo(getParameters().getEntityInfo()); + params.setStoragePoolId(getStoragePoolId()); params.setQuotaId(diskInfoDestinationMap.get(disk.getId()).getQuotaId() != null ? diskInfoDestinationMap.get(disk.getId()).getQuotaId() : null); params.setDiskProfileId(diskInfoDestinationMap.get(disk.getId()).getDiskProfileId()); diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java index 69f658f..747f9db 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java @@ -330,7 +330,7 @@ // means that there are no asynchronous tasks to execute and that we can // end the command synchronously - pendingAsyncTasks = !getReturnValue().getVdsmTaskIdList().isEmpty() || (isDataCenterWithoutSpm() && !CommandCoordinatorUtil.getChildCommandIds(getCommandId()).isEmpty()); + pendingAsyncTasks = !noAsyncOperations(); if (!pendingAsyncTasks) { endSuccessfullySynchronous(); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/BaseImagesCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/BaseImagesCommand.java index 8eb7a5c..a4bb4c0 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/BaseImagesCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/BaseImagesCommand.java @@ -24,7 +24,6 @@ import org.ovirt.engine.core.common.utils.Pair; import org.ovirt.engine.core.common.vdscommands.GetImageInfoVDSCommandParameters; import org.ovirt.engine.core.common.vdscommands.VDSCommandType; -import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.dao.BaseDiskDao; @@ -129,7 +128,7 @@ } } - protected VDSReturnValue performImageVdsmOperation() { + protected boolean performImageVdsmOperation() { throw new NotImplementedException(); } 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 91b08a4..9126cdac 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 @@ -2367,7 +2367,7 @@ if (isDataCenterWithSpm()) { return runInternalActionWithTasksContext(actionType, parameters, null); } else { - return executeCoCoCommandSync(actionType, parameters, null); + return executeCoCoCommandSyncWithTasksContext(actionType, parameters, null); } } @@ -2407,4 +2407,8 @@ protected MacPoolManagerStrategy getMacPool() { return MacPoolPerDcSingleton.getInstance().poolForDataCenter(getStoragePoolId()); } + + protected boolean noAsyncOperations() { + return isDataCenterWithSpm() ? getReturnValue().getVdsmTaskIdList().isEmpty() : CommandCoordinatorUtil.getChildCommandIds(getCommandId()).isEmpty(); + } } 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 3ad9aa8..8ba772c 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 @@ -203,7 +203,7 @@ fastForwardDisksToActiveSnapshot(); memoryImageBuilder.build(); - if (getTaskIdList().isEmpty()) { + if (noAsyncOperations()) { getParameters().setTaskGroupSuccess(true); incrementVmGeneration(); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateCloneOfTemplateCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateCloneOfTemplateCommand.java index 5dfda31..fb24e35 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateCloneOfTemplateCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateCloneOfTemplateCommand.java @@ -5,7 +5,9 @@ import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.bll.storage.PostZeroHandler; +import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallBack; import org.ovirt.engine.core.common.VdcObjectType; +import org.ovirt.engine.core.common.action.CloneImageGroupVolumesWithCollapseCommandParameters; import org.ovirt.engine.core.common.action.CreateCloneOfTemplateParameters; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.asynctasks.AsyncTaskType; @@ -45,45 +47,68 @@ } @Override - protected VDSReturnValue performImageVdsmOperation() { + public CommandCallBack getCallBack() { + if (isDataCenterWithoutSpm()){ + return new ConcurrentChildCommandsExecutionCallback(); + } + + return null; + } + + @Override + protected boolean performImageVdsmOperation() { setDestinationImageId(Guid.newGuid()); newDiskImage = cloneDiskImage(getDestinationImageId()); newDiskImage.setId(Guid.newGuid()); Guid storagePoolID = newDiskImage.getStoragePoolId() != null ? newDiskImage .getStoragePoolId() : Guid.Empty; - VDSReturnValue vdsReturnValue = null; - Guid taskId = persistAsyncTaskPlaceHolder(VdcActionType.AddVmFromTemplate); - try { - vdsReturnValue = runVdsCommand(VDSCommandType.CopyImage, - PostZeroHandler.fixParametersWithPostZero( - new CopyImageVDSCommandParameters(storagePoolID, getParameters().getStorageDomainId(), - getVmTemplateId(), getDiskImage().getId(), getImage().getImageId(), - newDiskImage.getId(), getDestinationImageId(), - "", getDestinationStorageDomainId(), CopyVolumeType.LeafVol, - newDiskImage.getVolumeFormat(), newDiskImage.getVolumeType(), - getDiskImage().isWipeAfterDelete(), false))); + if (isDataCenterWithSpm()) { + try { + Guid taskId = persistAsyncTaskPlaceHolder(VdcActionType.AddVmFromTemplate); + VDSReturnValue vdsReturnValue = runVdsCommand(VDSCommandType.CopyImage, + PostZeroHandler.fixParametersWithPostZero( + new CopyImageVDSCommandParameters(storagePoolID, getParameters().getStorageDomainId(), + getVmTemplateId(), getDiskImage().getId(), getImage().getImageId(), + newDiskImage.getId(), getDestinationImageId(), + "", getDestinationStorageDomainId(), CopyVolumeType.LeafVol, + newDiskImage.getVolumeFormat(), newDiskImage.getVolumeType(), + getDiskImage().isWipeAfterDelete(), false))); - } catch (VdcBLLException e) { - log.error("Failed creating snapshot from image id '{}'", getImage().getImageId()); - throw e; + if (vdsReturnValue.getSucceeded()) { + getReturnValue().getInternalVdsmTaskIdList().add( + createTask(taskId, + vdsReturnValue.getCreationInfo(), + VdcActionType.AddVmFromTemplate, + VdcObjectType.Storage, + getParameters().getStorageDomainId(), + getDestinationStorageDomainId())); + } + + vdsReturnValue.getSucceeded(); + + } catch (VdcBLLException e) { + log.error("Failed creating snapshot from image id '{}'", getImage().getImageId()); + throw e; + } + + return false; + } else { + return executeCoCoCommandSyncWithTasksContext(VdcActionType.CloneImageGroupVolumesWithCollapse, + new CloneImageGroupVolumesWithCollapseCommandParameters(storagePoolID, null, + getParameters().getStorageDomainId(), getDiskImage().getId(), getImage().getImageId(), + getDestinationStorageDomainId(), + newDiskImage.getId(), getDestinationImageId(), + getActionType(), getParameters())).getSucceeded(); } - - if (vdsReturnValue.getSucceeded()) { - getReturnValue().getInternalVdsmTaskIdList().add( - createTask(taskId, - vdsReturnValue.getCreationInfo(), - VdcActionType.AddVmFromTemplate, - VdcObjectType.Storage, - getParameters().getStorageDomainId(), - getDestinationStorageDomainId())); - } - - return vdsReturnValue; } @Override protected AsyncTaskType getTaskType() { - return AsyncTaskType.copyImage; + if (isDataCenterWithSpm()) { + return AsyncTaskType.copyImage; + } + + return super.getTaskType(); } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateOvfStoresForStorageDomainCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateOvfStoresForStorageDomainCommand.java index e6df962..16507a1 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateOvfStoresForStorageDomainCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateOvfStoresForStorageDomainCommand.java @@ -3,6 +3,8 @@ import java.util.List; import org.ovirt.engine.core.bll.context.CommandContext; +import org.ovirt.engine.core.bll.tasks.CommandCoordinatorUtil; +import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallBack; import org.ovirt.engine.core.bll.utils.PermissionSubject; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.action.AddImageFromScratchParameters; @@ -32,15 +34,28 @@ } @Override + public CommandCallBack getCallBack() { + if (isDataCenterWithoutSpm()) { + return new ConcurrentChildCommandsExecutionCallback(); + } + + return super.getCallBack(); + } + + @Override protected void executeCommand() { for (int i = 0; i < getParameters().getStoresCount(); i++) { CreateOvfVolumeForStorageDomainCommandParameters parameters = createCreateOvfVolumeForStorageDomainParams(); - VdcReturnValueBase vdcReturnValueBase = - runInternalAction(VdcActionType.CreateOvfVolumeForStorageDomain, - parameters); + if (isDataCenterWithSpm()) { + VdcReturnValueBase vdcReturnValueBase = + runInternalAction(VdcActionType.CreateOvfVolumeForStorageDomain, + parameters); - getReturnValue().getInternalVdsmTaskIdList().addAll(vdcReturnValueBase.getInternalVdsmTaskIdList()); + getReturnValue().getInternalVdsmTaskIdList().addAll(vdcReturnValueBase.getInternalVdsmTaskIdList()); + } else { + CommandCoordinatorUtil.executeAsyncCommand(VdcActionType.CreateOvfVolumeForStorageDomain, parameters, getContext().clone()); + } } setSucceeded(true); @@ -91,11 +106,11 @@ } } - // if we'd have the possibility to know whether we failed because of failure to acquire locks as there's an - // update in progress, we could - // try again (avoid setSucceeded(true) in that scenario). - VdcReturnValueBase returnValue = runInternalActionWithTasksContext(VdcActionType.ProcessOvfUpdateForStorageDomain, createProcessOvfUpdateForDomainParams(), null); - getReturnValue().getInternalVdsmTaskIdList().addAll(returnValue.getInternalVdsmTaskIdList()); +// // if we'd have the possibility to know whether we failed because of failure to acquire locks as there's an +// // update in progress, we could +// // try again (avoid setSucceeded(true) in that scenario). +// VdcReturnValueBase returnValue = runInternalActionWithTasksContext(VdcActionType.ProcessOvfUpdateForStorageDomain, createProcessOvfUpdateForDomainParams(), null); +// getReturnValue().getInternalVdsmTaskIdList().addAll(returnValue.getInternalVdsmTaskIdList()); setSucceeded(true); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateOvfVolumeForStorageDomainCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateOvfVolumeForStorageDomainCommand.java index 639cec5..5536c20 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateOvfVolumeForStorageDomainCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateOvfVolumeForStorageDomainCommand.java @@ -6,6 +6,7 @@ import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.bll.storage.StorageDomainCommandBase; +import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallBack; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.action.AddDiskParameters; import org.ovirt.engine.core.common.action.CreateOvfVolumeForStorageDomainCommandParameters; @@ -38,7 +39,15 @@ } @Override + public CommandCallBack getCallBack() { + if (isDataCenterWithoutSpm()) { + return new ConcurrentChildCommandsExecutionCallback(); + } + return super.getCallBack(); + } + + @Override protected void executeCommand() { AddDiskParameters diskParameters = new AddDiskParameters(null, createDisk(getStorageDomainId())); diskParameters.setStorageDomainId(getStorageDomainId()); @@ -47,7 +56,7 @@ diskParameters.setShouldRemainIllegalOnFailedExecution(true); diskParameters.setSkipDomainCheck(getParameters().isSkipDomainChecks()); VdcReturnValueBase vdcReturnValueBase = - runInternalActionWithTasksContext(VdcActionType.AddDisk, diskParameters); + runChildActionWithTasksContextIfNeeded(VdcActionType.AddDisk, diskParameters); Guid createdId = (Guid)vdcReturnValueBase.getActionReturnValue(); if (createdId != null) { diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateSnapshotCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateSnapshotCommand.java index eef142c..8626d3d 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateSnapshotCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateSnapshotCommand.java @@ -53,8 +53,8 @@ @Override protected void executeCommand() { if (canCreateSnapshot()) { - VDSReturnValue vdsReturnValue = performImageVdsmOperation(); - if (vdsReturnValue != null && vdsReturnValue.getSucceeded()) { + boolean succeeded = performImageVdsmOperation(); + if (succeeded) { TransactionSupport.executeInNewTransaction(new TransactionMethod<Void>() { @Override public Void runInTransaction() { @@ -77,7 +77,7 @@ } @Override - protected VDSReturnValue performImageVdsmOperation() { + protected boolean performImageVdsmOperation() { setDestinationImageId(Guid.newGuid()); newDiskImage = cloneDiskImage(getDestinationImageId()); newDiskImage.setStorageIds(new ArrayList<Guid>(Arrays.asList(getDestinationStorageDomainId()))); @@ -146,7 +146,7 @@ throw new VdcBLLException(VdcBllErrors.VolumeCreationError); } - return vdsReturnValue; + return vdsReturnValue.getSucceeded(); } @Override diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ProcessOvfUpdateForStorageDomainCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ProcessOvfUpdateForStorageDomainCommand.java index e861033..a6dba74 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ProcessOvfUpdateForStorageDomainCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ProcessOvfUpdateForStorageDomainCommand.java @@ -19,6 +19,7 @@ import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.bll.storage.StorageDomainCommandBase; +import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallBack; import org.ovirt.engine.core.bll.validator.StorageDomainValidator; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.action.CreateOvfStoresForStorageDomainCommandParameters; @@ -53,7 +54,7 @@ @InternalCommandAttribute @NonTransactiveCommandAttribute -public class ProcessOvfUpdateForStorageDomainCommand<T extends ProcessOvfUpdateForStorageDomainCommandParameters> extends StorageDomainCommandBase<T> { +public class ProcessOvfUpdateForStorageDomainCommand<T extends ProcessOvfUpdateForStorageDomainCommandParameters> extends StorageDomainCommandBase<T> implements SerialChildExecutingCommand { private LinkedList<Pair<StorageDomainOvfInfo, DiskImage>> domainOvfStoresInfoForUpdate = new LinkedList<>(); private StorageDomain storageDomain; private int ovfDiskCount; @@ -77,15 +78,19 @@ } @Override + public CommandCallBack getCallBack() { + return new SerialChildCommandsExecutionCallback(); + } + + @Override protected LockProperties applyLockProperties(LockProperties lockProperties) { return lockProperties.withScope(Scope.Execution); } @Override protected boolean canDoAction() { - loadStorageDomain(); if (!getParameters().isSkipDomainChecks()) { - StorageDomainValidator storageDomainValidator = new StorageDomainValidator(storageDomain); + StorageDomainValidator storageDomainValidator = new StorageDomainValidator(getStorageDomain()); if (!validate(storageDomainValidator.isDomainExistAndActive())) { return false; } @@ -121,12 +126,6 @@ domainOvfStoresInfoForUpdate.add(new Pair(storageDomainOvfInfo, ovfDisk)); } } - } - - private void loadStorageDomain() { - storageDomain = - getDbFacade().getStorageDomainDao().getForStoragePool(getParameters().getStorageDomainId(), - getParameters().getStoragePoolId()); } private String getPostUpdateOvfStoreDescription(long size) { @@ -260,7 +259,7 @@ if (!failedOvfDisks.isEmpty()) { AuditLogableBase auditLogableBase = new AuditLogableBase(); auditLogableBase.addCustomValue("DataCenterName", getStoragePool().getName()); - auditLogableBase.addCustomValue("StorageDomainName", storageDomain.getName()); + auditLogableBase.addCustomValue("StorageDomainName", getStorageDomain().getName()); auditLogableBase.addCustomValue("DisksIds", StringUtils.join(failedOvfDisks, ", ")); AuditLogDirector.log(auditLogableBase, AuditLogType.UPDATE_FOR_OVF_STORES_FAILED); } @@ -339,28 +338,64 @@ return false; } + private int getMissingDiskCount() { + return Config.<Integer> getValue(ConfigValues.StorageDomainOvfStoreCount) - ovfDiskCount; + } + @Override protected void executeCommand() { - int missingDiskCount = Config.<Integer> getValue(ConfigValues.StorageDomainOvfStoreCount) - ovfDiskCount; +// int missingDiskCount = getMissingDiskCount(); +// +// if (missingDiskCount > 0) { +// CreateOvfStoresForStorageDomainCommandParameters parameters = new CreateOvfStoresForStorageDomainCommandParameters(getParameters().getStoragePoolId(), +// getParameters().getStorageDomainId(), missingDiskCount); +// parameters.setParentParameters(getParameters().getParentParameters()); +// parameters.setParentCommand(getParameters().getParentCommand()); +// parameters.setSkipDomainChecks(getParameters().isSkipDomainChecks()); +// VdcReturnValueBase returnValueBase = runChildActionWithTasksContextIfNeeded(VdcActionType.CreateOvfStoresForStorageDomain, +// parameters); +// if (hasParentCommand()) { +// getReturnValue().getInternalVdsmTaskIdList().addAll(returnValueBase.getInternalVdsmTaskIdList()); +// } else { +// getReturnValue().getVdsmTaskIdList().addAll(returnValueBase.getInternalVdsmTaskIdList()); +// } +// } else { +// updateOvfStoreContent(); +// } - if (missingDiskCount > 0) { - CreateOvfStoresForStorageDomainCommandParameters parameters = new CreateOvfStoresForStorageDomainCommandParameters(getParameters().getStoragePoolId(), - getParameters().getStorageDomainId(), missingDiskCount); - parameters.setParentParameters(getParameters().getParentParameters()); - parameters.setParentCommand(getParameters().getParentCommand()); - parameters.setSkipDomainChecks(getParameters().isSkipDomainChecks()); - VdcReturnValueBase returnValueBase = runInternalActionWithTasksContext(VdcActionType.CreateOvfStoresForStorageDomain, - parameters); - if (hasParentCommand()) { - getReturnValue().getInternalVdsmTaskIdList().addAll(returnValueBase.getInternalVdsmTaskIdList()); - } else { - getReturnValue().getVdsmTaskIdList().addAll(returnValueBase.getInternalVdsmTaskIdList()); - } + if (getMissingDiskCount() == 0) { + getParameters().setChildCount(1); } else { - updateOvfStoreContent(); + getParameters().setChildCount(2); } + persistCommand(getParameters().getParentCommand()); + setSucceeded(true); + } + + public void createOvfStoreDisks(int missingDiskCount) { + CreateOvfStoresForStorageDomainCommandParameters parameters = new CreateOvfStoresForStorageDomainCommandParameters(getParameters().getStoragePoolId(), + getParameters().getStorageDomainId(), missingDiskCount); + parameters.setParentParameters(getParameters()); + parameters.setParentCommand(getActionType()); + parameters.setSkipDomainChecks(getParameters().isSkipDomainChecks()); + VdcReturnValueBase returnValueBase = runChildActionWithTasksContextIfNeeded(VdcActionType.CreateOvfStoresForStorageDomain, + parameters); + if (hasParentCommand()) { + getReturnValue().getInternalVdsmTaskIdList().addAll(returnValueBase.getInternalVdsmTaskIdList()); + } else { + getReturnValue().getVdsmTaskIdList().addAll(returnValueBase.getInternalVdsmTaskIdList()); + } + } + + @Override + public void performNextOperation(int completedChildCount) { + if (completedChildCount == 0) { + createOvfStoreDisks(getMissingDiskCount()); + return; + } + updateOvfStoreContent(); } protected Set<Guid> buildFilesForOvfs(List<Pair<Guid, String>> ovfs, InMemoryTar inMemoryTar) throws Exception { @@ -426,4 +461,9 @@ return super.getAuditLogTypeValue(); } + + @Override + public int getChildCount() { + return getParameters().getChildCount(); + } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveImageCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveImageCommand.java index 9c6c14f..7b03c78 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveImageCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveImageCommand.java @@ -72,32 +72,7 @@ @Override protected void executeCommand() { if (getDiskImage() != null) { - try { - Guid taskId = persistAsyncTaskPlaceHolder(getParameters().getParentCommand()); - - VDSReturnValue vdsReturnValue = performImageVdsmOperation(); - getReturnValue().getInternalVdsmTaskIdList().add( - createTask(taskId, - vdsReturnValue.getCreationInfo(), - getParameters().getParentCommand(), - VdcObjectType.Storage, - getStorageDomainId())); - } catch (VdcBLLException e) { - if (e.getErrorCode() == VdcBllErrors.ImageDoesNotExistInDomainError) { - log.info("Disk '{}' doesn't exist on storage domain '{}', rolling forward", - getDiskImage().getId(), getStorageDomainId()); - } - // VDSM renames the image before deleting it, so technically the image doesn't exist after renaming, - // but the actual delete can still fail with ImageDeleteError. - // In this case, Engine has to check whether image still exists on the storage or not. - else if (e.getErrorCode() == VdcBllErrors.ImageDeleteError && isImageRemovedFromStorage()) { - log.info("Disk '{}' was deleted from storage domain '{}'", getDiskImage().getId(), - getStorageDomainId()); - } else { - throw e; - } - } - + performImageVdsmOperation(); if (getParameters().getParentCommand() != VdcActionType.RemoveVmFromImportExport && getParameters().getParentCommand() != VdcActionType.RemoveVmTemplateFromImportExport) { performImageDbOperations(); @@ -288,20 +263,49 @@ } @Override - protected VDSReturnValue performImageVdsmOperation() { - if (getParameters().isShouldLockImage()) { - // the image status should be set to ILLEGAL, so that in case compensation runs the image status will - // be revert to be ILLEGAL, as we can't tell whether the task started on vdsm side or not. - ImagesHandler.updateAllDiskImageSnapshotsStatusWithCompensation(getRelevantDiskImage().getId(), - ImageStatus.LOCKED, - ImageStatus.ILLEGAL, - getCompensationContext()); + protected boolean performImageVdsmOperation() { + try { + Guid taskId = persistAsyncTaskPlaceHolder(getParameters().getParentCommand()); + + if (getParameters().isShouldLockImage()) { + // the image status should be set to ILLEGAL, so that in case compensation runs the image status will + // be revert to be ILLEGAL, as we can't tell whether the task started on vdsm side or not. + ImagesHandler.updateAllDiskImageSnapshotsStatusWithCompensation(getRelevantDiskImage().getId(), + ImageStatus.LOCKED, + ImageStatus.ILLEGAL, + getCompensationContext()); + } + VDSReturnValue vdsReturnValue = runVdsCommand(VDSCommandType.DeleteImageGroup, + PostZeroHandler.fixParametersWithPostZero( + new DeleteImageGroupVDSCommandParameters(getDiskImage().getStoragePoolId(), + getStorageDomainId(), getDiskImage().getId(), + getDiskImage().isWipeAfterDelete(), getParameters().getForceDelete()))); + + getReturnValue().getInternalVdsmTaskIdList().add( + createTask(taskId, + vdsReturnValue.getCreationInfo(), + getParameters().getParentCommand(), + VdcObjectType.Storage, + getStorageDomainId())); + + return true; + } catch (VdcBLLException e) { + if (e.getErrorCode() == VdcBllErrors.ImageDoesNotExistInDomainError) { + log.info("Disk '{}' doesn't exist on storage domain '{}', rolling forward", + getDiskImage().getId(), getStorageDomainId()); + } + // VDSM renames the image before deleting it, so technically the image doesn't exist after renaming, + // but the actual delete can still fail with ImageDeleteError. + // In this case, Engine has to check whether image still exists on the storage or not. + else if (e.getErrorCode() == VdcBllErrors.ImageDeleteError && isImageRemovedFromStorage()) { + log.info("Disk '{}' was deleted from storage domain '{}'", getDiskImage().getId(), + getStorageDomainId()); + } else { + throw e; + } } - return runVdsCommand(VDSCommandType.DeleteImageGroup, - PostZeroHandler.fixParametersWithPostZero( - new DeleteImageGroupVDSCommandParameters(getDiskImage().getStoragePoolId(), - getStorageDomainId(), getDiskImage().getId(), - getDiskImage().isWipeAfterDelete(), getParameters().getForceDelete()))); + + return false; } protected VmDeviceDAO getVmDeviceDAO() { diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RestoreFromSnapshotCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RestoreFromSnapshotCommand.java index 8c9107e..1edb8da 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RestoreFromSnapshotCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RestoreFromSnapshotCommand.java @@ -59,8 +59,7 @@ break; } - VDSReturnValue vdsReturnValue = performImageVdsmOperation(); - return vdsReturnValue != null && vdsReturnValue.getSucceeded(); + return performImageVdsmOperation(); } @Override @@ -89,7 +88,7 @@ } @Override - protected VDSReturnValue performImageVdsmOperation() { + protected boolean performImageVdsmOperation() { VDSReturnValue vdsReturnValue = null; try { Guid storagePoolId = getDiskImage().getStoragePoolId() != null ? getDiskImage().getStoragePoolId() @@ -116,6 +115,8 @@ VdcObjectType.Storage, storageDomainId)); } + + return vdsReturnValue.getSucceeded(); } // Don't throw an exception when cannot destroy image in the VDSM. catch (VdcBLLException e) { @@ -123,6 +124,7 @@ getReturnValue().setFault(new VdcFault(e, e.getVdsError().getCode())); log.info("Image '{}' not exist in Irs", getDiskImage().getImageId()); } - return vdsReturnValue; + + return false; } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/TryBackToAllSnapshotsOfVmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/TryBackToAllSnapshotsOfVmCommand.java index 0e9432a..403fa60 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/TryBackToAllSnapshotsOfVmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/TryBackToAllSnapshotsOfVmCommand.java @@ -12,6 +12,7 @@ import org.ovirt.engine.core.bll.snapshots.SnapshotsManager; import org.ovirt.engine.core.bll.snapshots.SnapshotsValidator; import org.ovirt.engine.core.bll.storage.StoragePoolValidator; +import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallBack; import org.ovirt.engine.core.bll.validator.DiskImagesValidator; import org.ovirt.engine.core.bll.validator.DiskSnapshotsValidator; import org.ovirt.engine.core.bll.validator.MultipleStorageDomainsValidator; @@ -58,6 +59,14 @@ public TryBackToAllSnapshotsOfVmCommand(T parameters) { this(parameters, null); + } + + public CommandCallBack getCallBack() { + if (!isDataCenterWithSpm()) { + return new ConcurrentChildCommandsExecutionCallback(); + } + + return null; } public TryBackToAllSnapshotsOfVmCommand(T parameters, CommandContext commandContext) { @@ -185,7 +194,7 @@ public Void runInTransaction() { for (DiskImage image : filteredImages) { VdcReturnValueBase vdcReturnValue = - runInternalActionWithTasksContext(VdcActionType.TryBackToSnapshot, + runChildActionWithTasksContextIfNeeded(VdcActionType.TryBackToSnapshot, buildTryBackToSnapshotParameters(newActiveSnapshotId, image)); if (vdcReturnValue.getSucceeded()) { @@ -210,6 +219,7 @@ params.setEntityInfo(getParameters().getEntityInfo()); params.setParentParameters(getParameters()); params.setQuotaId(image.getQuotaId()); + params.setStoragePoolId(getStoragePoolId()); return params; } }); diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ProcessOvfUpdateForStorageDomainCommandParameters.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ProcessOvfUpdateForStorageDomainCommandParameters.java index e8b8405..a1b348e 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ProcessOvfUpdateForStorageDomainCommandParameters.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ProcessOvfUpdateForStorageDomainCommandParameters.java @@ -4,6 +4,7 @@ public class ProcessOvfUpdateForStorageDomainCommandParameters extends StorageDomainParametersBase { private boolean skipDomainChecks; + private int childCount; public ProcessOvfUpdateForStorageDomainCommandParameters() { super(); @@ -20,4 +21,12 @@ public void setSkipDomainChecks(boolean skipDomainChecks) { this.skipDomainChecks = skipDomainChecks; } + + public int getChildCount() { + return childCount; + } + + public void setChildCount(int childCount) { + this.childCount = childCount; + } } -- To view, visit https://gerrit.ovirt.org/39323 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ia0bfedbec4f181afdab91801c2abecde3fb2206e Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Liron Aravot <[email protected]> Gerrit-Reviewer: [email protected] Gerrit-Reviewer: oVirt Jenkins CI Server _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
