Liron Aravot has uploaded a new change for review. Change subject: tmp ......................................................................
tmp Change-Id: I5b5bb672c5027c262619691007593a16875024aa Signed-off-by: lara...@redhat.com <lara...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddImageFromScratchCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumesCommand.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/ConcurrentChildCommandsExecutionCallback.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/ImageSpmCommand.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/SerialChildCommandsExecutionCallback.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SerialChildExecutingCommand.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/TempParentCommandForTasksCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DeactivateStorageDomainWithOvfUpdateCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CoCoAsyncTaskHelper.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorImpl.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CreateOvfVolumeForStorageDomainCommandParameters.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/TempParentCommandForTasksParameters.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionParametersBase.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/StorageDomainMetadataCommand.java 20 files changed, 441 insertions(+), 248 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/42/39542/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java index 3be8467..2e37fff 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java @@ -427,13 +427,20 @@ parameters.setShouldRemainIllegalOnFailedExecution(getParameters().isShouldRemainIllegalOnFailedExecution()); parameters.setStorageDomainId(getStorageDomainId()); - if (isExecutedAsChildCommand()) { - parameters.setParentCommand(getParameters().getParentCommand()); - parameters.setParentParameters(getParameters().getParentParameters()); - } else { - parameters.setParentCommand(VdcActionType.AddDisk); - parameters.setParentParameters(getParameters()); - } + // used as child command only from createOvfStore flow- commenting as it's unneeded there now + // setting the parent as the ovf store command will lead to it's endAction to be called on tasks scenario + // and to the addImageFromScratch command to be inspected as child command of the grandpa command on callback use scenario. + +// if (isExecutedAsChildCommand()) { +// parameters.setParentCommand(getParameters().getParentCommand()); +// parameters.setParentParameters(getParameters().getParentParameters()); +// } else { +// parameters.setParentCommand(VdcActionType.AddDisk); +// parameters.setParentParameters(getParameters()); +// } + + parameters.setParentCommand(VdcActionType.AddDisk); + parameters.setParentParameters(getParameters()); parameters.setEntityInfo(getParameters().getEntityInfo()); parameters.setStoragePoolId(getStorageDomain().getStoragePoolId()); @@ -462,8 +469,11 @@ runInternalActionWithTasksContext(VdcActionType.AddImageFromScratch, parameters, getLock()); - ArrayList<Guid> taskList = isExecutedAsChildCommand() ? getReturnValue().getInternalVdsmTaskIdList() : getReturnValue().getVdsmTaskIdList(); - taskList.addAll(tmpRetValue.getInternalVdsmTaskIdList()); + + // TODO: RELATED TO PREVIOUS COMMENT ON STOP USING isExecutedAsChildCommand() +// ArrayList<Guid> taskList = isExecutedAsChildCommand() ? getReturnValue().getInternalVdsmTaskIdList() : getReturnValue().getVdsmTaskIdList(); +// taskList.addAll(tmpRetValue.getInternalVdsmTaskIdList()); + getReturnValue().getVdsmTaskIdList().addAll(tmpRetValue.getInternalVdsmTaskIdList()); } else { tmpRetValue = executeCoCoCommandSyncWithTasksContext(VdcActionType.AddImageFromScratch, parameters); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddImageFromScratchCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddImageFromScratchCommand.java index aeab32b..b3e412c 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddImageFromScratchCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddImageFromScratchCommand.java @@ -34,10 +34,6 @@ } @Override - protected void insertAsyncTaskPlaceHolders() { - } - - @Override protected AsyncTaskType getTaskType() { if (isDataCenterWithoutSpm()) { return AsyncTaskType.notSupported; diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumesCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumesCommand.java index 63dcd5d..f215820 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumesCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumesCommand.java @@ -57,7 +57,7 @@ } @Override - public void performNextOperation(int completedChildren) { + public boolean performNextOperation(int completedChildren) { Guid imageId = getParameters().getImageIds().get(completedChildren); log.info("Starting child command {} of {}, image '{}'", completedChildren + 1, getParameters().getImageIds().size(), imageId); @@ -69,6 +69,8 @@ VdcActionType.CloneImageGroupVolume, parameters, cloneContextAndDetachFromParent()); + + return true; } @Override 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 9126cdac..7cdcd1b 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 @@ -581,8 +581,10 @@ List<VdcActionParametersBase> parameters = new LinkedList<>(); for (Guid id : childCommands) { CommandBase<?> command = CommandCoordinatorUtil.retrieveCommand(id); - command.getParameters().setCommandType(command.getActionType()); - parameters.add(command.getParameters()); + if (command.getParameters().isShouldBeEndedByParent()) { + command.getParameters().setCommandType(command.getActionType()); + parameters.add(command.getParameters()); + } } commandBase.getParameters().setImagesParameters(parameters); @@ -1393,8 +1395,9 @@ startPollingAsyncTasks(); } } finally { - if (!hasTasks() && !ExecutionHandler.checkIfJobHasTasks(getExecutionContext())) { + if (getCallBack() == null && !hasTasks() && !ExecutionHandler.checkIfJobHasTasks(getExecutionContext())) { ExecutionHandler.endJob(getExecutionContext(), getSucceeded()); + setCommandStatus(getSucceeded() ? CommandStatus.SUCCEEDED : CommandStatus.FAILED); } } } @@ -1935,8 +1938,8 @@ } private void freeLockExecute() { - if (releaseLocksAtEndOfExecute || !getSucceeded() || - (!hasTasks() && !(this instanceof IVdsAsyncCommand))) { + if ((releaseLocksAtEndOfExecute || !getSucceeded() || + (!hasTasks() && !(this instanceof IVdsAsyncCommand))) && CommandCoordinatorUtil.getChildCommandIds(getCommandId()).isEmpty()) { freeLock(); } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ConcurrentChildCommandsExecutionCallback.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ConcurrentChildCommandsExecutionCallback.java index 1497b6c..8a95255 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ConcurrentChildCommandsExecutionCallback.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ConcurrentChildCommandsExecutionCallback.java @@ -55,10 +55,12 @@ boolean anyFailed = false; for (Guid childCmdId : childCmdIds) { + //extended logging + CommandBase<?> child = getCommand(childCmdId); switch (CommandCoordinatorUtil.getCommandStatus(childCmdId)) { case NOT_STARTED: case ACTIVE: - log.info("Waiting on child command '{}' of '{}' (id: '{}') to complete", childCmdId, command.getActionType(), cmdId); + log.info("Waiting on child command id: '{}' type:'{}' of '{}' (id: '{}') to complete", childCmdId, child.getActionType(), command.getActionType(), cmdId); return; case FAILED: case FAILED_RESTARTED: @@ -70,7 +72,7 @@ if (cmdEntity.isCallBackNotified() || !cmdEntity.isCallBackEnabled()) { break; } else { - log.info("Waiting on child command '{}' of '{}' (id: '{}') to complete", childCmdId, command.getActionType(), cmdId); + log.info("Waiting on child command id: '{}' type:'{}' of '{}' (id: '{}') to complete", childCmdId, child.getActionType(), command.getActionType(), cmdId); return; } } @@ -78,7 +80,8 @@ command.getParameters().setTaskGroupSuccess(!anyFailed && status == CommandExecutionStatus.EXECUTED); command.setCommandStatus(command.getParameters().getTaskGroupSuccess() ? CommandStatus.SUCCEEDED : CommandStatus.FAILED); - log.info("All executed child commands of '{}' (id : '{}') have been completed, status '{}'", command.getActionType(), cmdId, command.getCommandStatus()); + log.info("Command '{}' id: '{}' child commands '{}' executions were completed, status '{}'", + command.getActionType(), cmdId, childCmdIds, command.getCommandStatus()); } private CommandBase<?> getCommand(Guid cmdId) { @@ -113,15 +116,21 @@ // //parameters.add(new Pair<>(command.getActionType(), command.getParameters())); // } - //TODO: handle case of grandpa command + //TODO: handle case of grandpa command - in case of grandpa command with the tasks framework, + // we get to the end method of the grandpa command with the parameters of the "leaf" command (the task creating command) + // and end it from the grandpa (skipping the command in the middle). we can imitate this behavior in the command base by setting to the image parameters + // the parameters of the "leaf" commands. as there are almost no scenarios like that - i prefer to fix them at the moment when using the task framework to + // use coco instead - if needed this change can be made in commandbase. // commandBase.getParameters().setCocoChildCommands(parameters); - if (commandBase.getParameters().getParentCommand() == VdcActionType.Unknown) { + if (commandBase.getParameters().getParentCommand() == VdcActionType.Unknown || !commandBase.getParameters().isShouldBeEndedByParent()) { //endaction method will set the child commands. commandBase.endAction(); // well remove the hirerchy only if there's no parent, otherwise the parent will clean // the hirerchy. #TODO: consider change to add a member to the parameters for that - CommandCoordinatorUtil.removeAllCommandsInHierarchy(commandBase.getCommandId()); + if (commandBase.getParameters().getParentCommand() == VdcActionType.Unknown) { + CommandCoordinatorUtil.removeAllCommandsInHierarchy(commandBase.getCommandId()); + } } } 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 16507a1..2ab352c 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 @@ -10,7 +10,6 @@ import org.ovirt.engine.core.common.action.AddImageFromScratchParameters; import org.ovirt.engine.core.common.action.CreateOvfStoresForStorageDomainCommandParameters; import org.ovirt.engine.core.common.action.CreateOvfVolumeForStorageDomainCommandParameters; -import org.ovirt.engine.core.common.action.ProcessOvfUpdateForStorageDomainCommandParameters; import org.ovirt.engine.core.common.action.VdcActionParametersBase; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.VdcReturnValueBase; @@ -115,25 +114,20 @@ setSucceeded(true); } - private ProcessOvfUpdateForStorageDomainCommandParameters createProcessOvfUpdateForDomainParams() { - ProcessOvfUpdateForStorageDomainCommandParameters params = new ProcessOvfUpdateForStorageDomainCommandParameters(getParameters().getStoragePoolId(), getParameters().getStorageDomainId()); - params.setSkipDomainChecks(getParameters().isSkipDomainChecks()); - params.setParentCommand(getParameters().getParentCommand()); - params.setParentParameters(getParameters().getParentParameters()); - return params; - } - public CreateOvfVolumeForStorageDomainCommandParameters createCreateOvfVolumeForStorageDomainParams() { CreateOvfVolumeForStorageDomainCommandParameters parameters = new CreateOvfVolumeForStorageDomainCommandParameters(getParameters().getStoragePoolId(), getParameters().getStorageDomainId()); parameters.setSkipDomainChecks(getParameters().isSkipDomainChecks()); - if (hasParentCommand()) { - parameters.setParentCommand(getParameters().getParentCommand()); - parameters.setParentParameters(getParameters().getParentParameters()); - } else { - parameters.setParentCommand(getActionType()); - parameters.setParentParameters(getParameters()); - } +// if (hasParentCommand()) { +// parameters.setParentCommand(getParameters().getParentCommand()); +// parameters.setParentParameters(getParameters().getParentParameters()); +// } else { +// parameters.setParentCommand(getActionType()); +// parameters.setParentParameters(getParameters()); +// } + + parameters.setParentCommand(getActionType()); + parameters.setParentParameters(getParameters()); return parameters; } 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 5536c20..88f8629 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 @@ -3,9 +3,11 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Date; +import java.util.List; import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.bll.storage.StorageDomainCommandBase; +import org.ovirt.engine.core.bll.tasks.CommandCoordinatorUtil; import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallBack; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.action.AddDiskParameters; @@ -20,6 +22,7 @@ import org.ovirt.engine.core.common.businessentities.VolumeFormat; import org.ovirt.engine.core.common.businessentities.VolumeType; import org.ovirt.engine.core.common.utils.SizeConverter; +import org.ovirt.engine.core.compat.CommandStatus; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogDirector; import org.ovirt.engine.core.dao.StorageDomainOvfInfoDao; @@ -40,26 +43,27 @@ @Override public CommandCallBack getCallBack() { - if (isDataCenterWithoutSpm()) { - return new ConcurrentChildCommandsExecutionCallback(); - } - - return super.getCallBack(); + return new ConcurrentChildCommandsExecutionCallback(); } @Override protected void executeCommand() { AddDiskParameters diskParameters = new AddDiskParameters(null, createDisk(getStorageDomainId())); diskParameters.setStorageDomainId(getStorageDomainId()); - diskParameters.setParentCommand(getParameters().getParentCommand()); - diskParameters.setParentParameters(getParameters().getParentParameters()); +// diskParameters.setParentCommand(getParameters().getParentCommand()); +// diskParameters.setParentParameters(getParameters().getParentParameters()); + diskParameters.setParentCommand(getActionType()); + diskParameters.setParentParameters(getParameters()); + diskParameters.setShouldBeEndedByParent(false); diskParameters.setShouldRemainIllegalOnFailedExecution(true); diskParameters.setSkipDomainCheck(getParameters().isSkipDomainChecks()); VdcReturnValueBase vdcReturnValueBase = - runChildActionWithTasksContextIfNeeded(VdcActionType.AddDisk, diskParameters); + executeCoCoCommandSync(VdcActionType.AddDisk, diskParameters); Guid createdId = (Guid)vdcReturnValueBase.getActionReturnValue(); if (createdId != null) { + getParameters().setCreatedDiskId(createdId); + persistCommand(getParameters().getParentCommand(), true); addStorageDomainOvfInfoToDb(createdId); } @@ -110,4 +114,42 @@ protected StorageDomainOvfInfoDao getStorageDomainOvfInfoDao() { return getDbFacade().getStorageDomainOvfInfoDao(); } + + @Override + protected void endSuccessfully() { + endCommandOperations(); + } + + @Override + protected void endWithFailure() { + endCommandOperations(); + } + + private void endCommandOperations() { + if (getParameters().getCreatedDiskId() == null) { + return; + } + Guid diskId = getParameters().getCreatedDiskId(); + List<Guid> childCmdIds = CommandCoordinatorUtil.getChildCommandIds(getCommandId()); + boolean childCmdSuccess = !childCmdIds.isEmpty() ? CommandCoordinatorUtil.getCommandStatus(childCmdIds.get(0)) == CommandStatus.SUCCEEDED : false; + + if (childCmdSuccess) { + StorageDomainOvfInfo storageDomainOvfInfoDb = + getStorageDomainOvfInfoDao() + .get(diskId); + + if (storageDomainOvfInfoDb == null + || storageDomainOvfInfoDb.getStatus() != StorageDomainOvfInfoStatus.DISABLED) { + return; + } + + storageDomainOvfInfoDb.setStatus(StorageDomainOvfInfoStatus.OUTDATED); + getStorageDomainOvfInfoDao().update(storageDomainOvfInfoDb); + } else { + addCustomValue("DiskId", diskId.toString()); + AuditLogDirector.log(this, AuditLogType.CREATE_OVF_STORE_FOR_STORAGE_DOMAIN_FAILED); + } + + setSucceeded(true); + } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImageSpmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImageSpmCommand.java index fd63cee..da6da52 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImageSpmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImageSpmCommand.java @@ -29,11 +29,6 @@ return lockProperties.withScope(Scope.Execution); } - @Override - protected void insertAsyncTaskPlaceHolders() { - persistAsyncTaskPlaceHolder(getParameters().getParentCommand()); - } - private Guid getPoolSpmId() { if (cachedSpmId == null) { cachedSpmId = getStoragePool().getspm_vds_id(); @@ -79,16 +74,27 @@ @Override protected void executeCommand() { + if (isDataCenterWithSpm()) { + persistAsyncTaskPlaceHolder(getParameters().getParentCommand()); + } VDSReturnValue vdsReturnValue = executeVdsCommand(); if (vdsReturnValue.getSucceeded()) { - Guid taskId = getAsyncTaskId(); - getReturnValue().getInternalVdsmTaskIdList().add(createTask(taskId, - vdsReturnValue.getCreationInfo(), - getParameters().getParentCommand(), - VdcObjectType.Storage, - getParameters().getStorageDomainId(), - getParameters().getDestinationImageId())); + if (isDataCenterWithSpm()) { + Guid taskId = getAsyncTaskId(); +// getReturnValue().getVdsmTaskIdList().add(createTask(taskId, +// vdsReturnValue.getCreationInfo(), +// getActionType(), +// VdcObjectType.Storage, +// getParameters().getStorageDomainId(), +// getParameters().getDestinationImageId())); + getReturnValue().getInternalVdsmTaskIdList().add(createTask(taskId, + vdsReturnValue.getCreationInfo(), + getParameters().getParentCommand(), + VdcObjectType.Storage, + getParameters().getStorageDomainId(), + getParameters().getDestinationImageId())); + } setSucceeded(true); } 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 a6dba74..ca0ea19 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,13 +19,15 @@ 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.CommandCoordinatorUtil; 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; +import org.ovirt.engine.core.common.action.CreateOvfVolumeForStorageDomainCommandParameters; import org.ovirt.engine.core.common.action.LockProperties; import org.ovirt.engine.core.common.action.LockProperties.Scope; import org.ovirt.engine.core.common.action.ProcessOvfUpdateForStorageDomainCommandParameters; +import org.ovirt.engine.core.common.action.TempParentCommandForTasksParameters; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.VdcReturnValueBase; import org.ovirt.engine.core.common.businessentities.DiskImage; @@ -61,6 +63,7 @@ private String postUpdateDescription; private Date updateDate; private List<Guid> failedOvfDisks; + private Integer missingDiskCount; public ProcessOvfUpdateForStorageDomainCommand(T parameters) { this(parameters, null); @@ -79,12 +82,16 @@ @Override public CommandCallBack getCallBack() { - return new SerialChildCommandsExecutionCallback(); + if (getMissingDiskCount() > 0) { + return new SerialChildCommandsExecutionCallback(); + } + + return super.getCallBack(); } @Override protected LockProperties applyLockProperties(LockProperties lockProperties) { - return lockProperties.withScope(Scope.Execution); + return lockProperties.withScope(Scope.Command); } @Override @@ -289,11 +296,13 @@ storageDomainOvfInfo.setStoredOvfIds(null); try { - setOvfVolumeDescription(storagePoolId, - storageDomainId, - diskId, - volumeId, - generateOvfStoreDescription(storageDomainOvfInfo.getLastUpdated(), false, null)); + if (isDataCenterWithSpm()) { + setOvfVolumeDescription(storagePoolId, + storageDomainId, + diskId, + volumeId, + generateOvfStoreDescription(storageDomainOvfInfo.getLastUpdated(), false, null)); + } getStorageDomainOvfInfoDao().update(storageDomainOvfInfo); @@ -306,28 +315,33 @@ diskId, volumeId, byteArrayInputStream, size); - if (hasParentCommand()) { - uploadStreamParameters.setParentCommand(getParameters().getParentCommand()); - uploadStreamParameters.setParentParameters(getParameters().getParentParameters()); - } else { - uploadStreamParameters.setParentCommand(getActionType()); - uploadStreamParameters.setParentParameters(getParameters()); - } + uploadStreamParameters.setParentCommand(getActionType()); + uploadStreamParameters.setParentParameters(getParameters()); + uploadStreamParameters.setShouldBeEndedByParent(false); - VdcReturnValueBase vdcReturnValueBase = - runInternalActionWithTasksContext(VdcActionType.UploadStream, uploadStreamParameters); - if (vdcReturnValueBase.getSucceeded()) { + boolean succeeded = true; + VdcReturnValueBase vdcReturnValueBase = null; + if (isDataCenterWithSpm()) { +// vdcReturnValueBase = +// executeCoCoCommandSync(VdcActionType.UploadStream, uploadStreamParameters); + TempParentCommandForTasksParameters tempParams = new TempParentCommandForTasksParameters(VdcActionType.UploadStream, uploadStreamParameters); + tempParams.setParentCommand(getActionType()); + tempParams.setParentParameters(getParameters()); + vdcReturnValueBase = + executeCoCoCommandSync(VdcActionType.TempParentCommandForTasks, new TempParentCommandForTasksParameters(VdcActionType.UploadStream, uploadStreamParameters)); + succeeded = vdcReturnValueBase.getSucceeded(); + } + //TODO: restore old code + + if (succeeded) { storageDomainOvfInfo.setStatus(StorageDomainOvfInfoStatus.UPDATED); storageDomainOvfInfo.setStoredOvfIds(vmAndTemplatesIds); storageDomainOvfInfo.setLastUpdated(updateDate); - setOvfVolumeDescription(storagePoolId, storageDomainId, - diskId, volumeId, getPostUpdateOvfStoreDescription(size)); - getStorageDomainOvfInfoDao().update(storageDomainOvfInfo); - if (hasParentCommand()) { - getReturnValue().getInternalVdsmTaskIdList().addAll(vdcReturnValueBase.getInternalVdsmTaskIdList()); - } else { - getReturnValue().getVdsmTaskIdList().addAll(vdcReturnValueBase.getInternalVdsmTaskIdList()); + if (isDataCenterWithSpm()) { + setOvfVolumeDescription(storagePoolId, storageDomainId, + diskId, volumeId, getPostUpdateOvfStoreDescription(size)); } + getStorageDomainOvfInfoDao().update(storageDomainOvfInfo); return true; } } catch (VdcBLLException e) { @@ -339,7 +353,11 @@ } private int getMissingDiskCount() { - return Config.<Integer> getValue(ConfigValues.StorageDomainOvfStoreCount) - ovfDiskCount; + if (missingDiskCount == null) { + missingDiskCount = Config.<Integer>getValue(ConfigValues.StorageDomainOvfStoreCount) - ovfDiskCount; + } + + return missingDiskCount; } @Override @@ -364,38 +382,54 @@ // } if (getMissingDiskCount() == 0) { - getParameters().setChildCount(1); - } else { - getParameters().setChildCount(2); + updateOvfStoreContent(); } - - 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()); +// parameters.setShouldBeEndedByParent(false); +// VdcReturnValueBase returnValueBase = executeCoCoCommandSync(VdcActionType.CreateOvfStoresForStorageDomain, +// parameters); +// if (hasParentCommand()) { +// getReturnValue().getInternalVdsmTaskIdList().addAll(returnValueBase.getInternalVdsmTaskIdList()); +// } else { +// getReturnValue().getVdsmTaskIdList().addAll(returnValueBase.getInternalVdsmTaskIdList()); +// } +// } 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()); + for (int i = 0; i < missingDiskCount; i++) { + CreateOvfVolumeForStorageDomainCommandParameters parameters = createCreateOvfVolumeForStorageDomainParams(); + CommandCoordinatorUtil.executeAsyncCommand(VdcActionType.CreateOvfVolumeForStorageDomain, parameters, getContext().clone()); } } + public CreateOvfVolumeForStorageDomainCommandParameters createCreateOvfVolumeForStorageDomainParams() { + CreateOvfVolumeForStorageDomainCommandParameters parameters = new CreateOvfVolumeForStorageDomainCommandParameters(getParameters().getStoragePoolId(), + getParameters().getStorageDomainId()); + parameters.setSkipDomainChecks(getParameters().isSkipDomainChecks()); + parameters.setParentCommand(getActionType()); + parameters.setParentParameters(getParameters()); + parameters.setShouldBeEndedByParent(false); + return parameters; + } + @Override - public void performNextOperation(int completedChildCount) { - if (completedChildCount == 0) { + public boolean performNextOperation(int completedChildCount) { + if (getMissingDiskCount() > 0) { createOvfStoreDisks(getMissingDiskCount()); - return; + return true; } + updateOvfStoreContent(); + return false; } protected Set<Guid> buildFilesForOvfs(List<Pair<Guid, String>> ovfs, InMemoryTar inMemoryTar) throws Exception { @@ -434,16 +468,6 @@ } return lockMap; - } - - @Override - protected void endSuccessfully() { - setSucceeded(true); - } - - @Override - protected void endWithFailure() { - setSucceeded(true); } @Override diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SerialChildCommandsExecutionCallback.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SerialChildCommandsExecutionCallback.java index 7eb9752..93058ca 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SerialChildCommandsExecutionCallback.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SerialChildCommandsExecutionCallback.java @@ -4,6 +4,7 @@ import org.ovirt.engine.core.bll.tasks.CommandCoordinatorUtil; import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallBack; +import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.CommandEntity; import org.ovirt.engine.core.compat.CommandStatus; import org.ovirt.engine.core.compat.Guid; @@ -20,10 +21,11 @@ int completedChildren = 0; CommandBase<?> command = getCommand(cmdId); for (Guid childCmdId : childCmdIds) { + CommandBase<?> child = getCommand(childCmdId); switch (CommandCoordinatorUtil.getCommandStatus(childCmdId)) { case NOT_STARTED: case ACTIVE: - log.info("Waiting on child commands of command '{}' id: '{}' to complete", command.getActionType(), cmdId); + log.info("Waiting on child command id: '{}' type:'{}' of '{}' (id: '{}') to complete", childCmdId, child.getActionType(), command.getActionType(), cmdId); return; case FAILED: case FAILED_RESTARTED: @@ -32,26 +34,35 @@ break; default: CommandEntity cmdEntity = CommandCoordinatorUtil.getCommandEntity(childCmdId); - if (cmdEntity.isCallBackNotified()) { + if (cmdEntity.isCallBackNotified() || !cmdEntity.isCallBackEnabled()) { ++completedChildren; break; } else { - log.info("Waiting on child commands of command '{}' id: '{}' to complete", command.getActionType(), cmdId); + //log.info("command '{}' id: '{}' is waiting for child command(s) '{}' to complete", command.getActionType(), cmdId, childCmdIds); + log.info("Waiting on child command id: '{}' type:'{}' of '{}' (id: '{}') to complete", childCmdId, child.getActionType(), command.getActionType(), cmdId); return; } } } SerialChildExecutingCommand serialChildExecutingCommand = (SerialChildExecutingCommand) command; - if (!anyFailed && completedChildren < serialChildExecutingCommand.getChildCount()) { - serialChildExecutingCommand.performNextOperation(completedChildren); - return; + if (!anyFailed) { + try { + boolean endCommand = !serialChildExecutingCommand.performNextOperation(completedChildren); + if (!endCommand) { + return; + } + } catch (Exception e) { + log.info("Command '{}' id: '{}' failed when attepting to perform the next operation, marking as FAILED '{}'", + command.getActionType(), cmdId, childCmdIds, command.getCommandStatus()); + anyFailed = true; + } } command.getParameters().setTaskGroupSuccess(!anyFailed); command.setCommandStatus(command.getParameters().getTaskGroupSuccess() ? CommandStatus.SUCCEEDED : CommandStatus.FAILED); - log.info("All child commands of command '{}' id: '{}' executions were completed, status '{}'", - command.getActionType(), cmdId, command.getCommandStatus()); + log.info("Command '{}' id: '{}' child commands '{}' executions were completed, status '{}'", + command.getActionType(), cmdId, childCmdIds, command.getCommandStatus()); } private CommandBase<?> getCommand(Guid cmdId) { @@ -84,4 +95,45 @@ // commandBase.getParameters().setTaskGroupSuccess(false); // getCommand(cmdId).endAction(); // } + + private void endAction(CommandBase<?> commandBase, List<Guid> childCmdIds) { + //List<Pair<VdcActionType, VdcActionParametersBase>> parameters = new LinkedList<>(); +// List<VdcActionParametersBase> parameters = new LinkedList<>(); +// for (Guid id : childCmdIds) { +// CommandBase<?> command = getCommand(id); +// command.getParameters().setCommandType(command.getActionType()); +// parameters.add(command.getParameters()); +// //parameters.add(new Pair<>(command.getActionType(), command.getParameters())); +// } + + //TODO: handle case of grandpa command +// commandBase.getParameters().setCocoChildCommands(parameters); + + if (commandBase.getParameters().getParentCommand() == VdcActionType.Unknown || !commandBase.getParameters().isShouldBeEndedByParent()) { + //endaction method will set the child commands. + commandBase.endAction(); + // well remove the hirerchy only if there's no parent, otherwise the parent will clean + // the hirerchy. #TODO: consider change to add a member to the parameters for that + if (commandBase.getParameters().getParentCommand() == VdcActionType.Unknown) { + CommandCoordinatorUtil.removeAllCommandsInHierarchy(commandBase.getCommandId()); + } + } + } + + @Override + public void onSucceeded(Guid cmdId, List<Guid> childCmdIds) { +// endAction(cmdId, childCmdIds); + endAction(getCommand(cmdId), childCmdIds); + } + + @Override + public void onFailed(Guid cmdId, List<Guid> childCmdIds) { + CommandBase<?> commandBase = getCommand(cmdId); + //This should be removed as soon as infra bug will be fixed and failed execution will reach endWithFailure + commandBase.getParameters().setTaskGroupSuccess(false); + + endAction(commandBase, childCmdIds); + +// endAction(cmdId, childCmdIds); + } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SerialChildExecutingCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SerialChildExecutingCommand.java index 39ed325..cc1fd15 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SerialChildExecutingCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SerialChildExecutingCommand.java @@ -1,7 +1,7 @@ package org.ovirt.engine.core.bll; public interface SerialChildExecutingCommand { - public void performNextOperation(int completedChildCount); + public boolean performNextOperation(int completedChildCount); public int getChildCount(); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/TempParentCommandForTasksCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/TempParentCommandForTasksCommand.java new file mode 100644 index 0000000..93c7b14 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/TempParentCommandForTasksCommand.java @@ -0,0 +1,39 @@ +package org.ovirt.engine.core.bll; + +import java.util.Collections; +import java.util.List; + +import org.ovirt.engine.core.bll.context.CommandContext; +import org.ovirt.engine.core.bll.utils.PermissionSubject; +import org.ovirt.engine.core.common.action.TempParentCommandForTasksParameters; +import org.ovirt.engine.core.common.action.VdcReturnValueBase; + +@NonTransactiveCommandAttribute(forceCompensation = true) +public class TempParentCommandForTasksCommand<T extends TempParentCommandForTasksParameters> extends CommandBase<T>{ + + public TempParentCommandForTasksCommand(T parameters, CommandContext cmdContext) { + super(parameters, cmdContext); + } + + public TempParentCommandForTasksCommand(T parameters) { + this(parameters, null); + } + + @Override + protected void executeCommand() { + getParameters().getParametersBase().setParentParameters(getParameters()); + getParameters().getParametersBase().setParentCommand(getActionType()); + VdcReturnValueBase vdcReturnValueBase = runInternalAction(getParameters().getVdcActionType(), getParameters().getParametersBase(), getContext()); + if (vdcReturnValueBase.getSucceeded()) { + getReturnValue().getVdsmTaskIdList().addAll(vdcReturnValueBase.getInternalVdsmTaskIdList()); + } + + setSucceeded(vdcReturnValueBase.getSucceeded()); + } + + @Override + public List<PermissionSubject> getPermissionCheckSubjects() { + return Collections.emptyList(); + } + +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DeactivateStorageDomainWithOvfUpdateCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DeactivateStorageDomainWithOvfUpdateCommand.java index 7937ef1..c93d4af 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DeactivateStorageDomainWithOvfUpdateCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DeactivateStorageDomainWithOvfUpdateCommand.java @@ -1,34 +1,25 @@ package org.ovirt.engine.core.bll.storage; -import java.util.LinkedList; -import java.util.List; -import java.util.concurrent.TimeUnit; - import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute; +import org.ovirt.engine.core.bll.SerialChildCommandsExecutionCallback; +import org.ovirt.engine.core.bll.SerialChildExecutingCommand; import org.ovirt.engine.core.bll.context.CommandContext; -import org.ovirt.engine.core.bll.context.CompensationContext; -import org.ovirt.engine.core.bll.tasks.CommandCoordinatorUtil; +import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallBack; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.FeatureSupported; -import org.ovirt.engine.core.common.action.CreateOvfStoresForStorageDomainCommandParameters; import org.ovirt.engine.core.common.action.LockProperties; import org.ovirt.engine.core.common.action.ProcessOvfUpdateForStorageDomainCommandParameters; import org.ovirt.engine.core.common.action.StorageDomainPoolParametersBase; import org.ovirt.engine.core.common.action.StoragePoolParametersBase; -import org.ovirt.engine.core.common.action.VdcActionParametersBase; import org.ovirt.engine.core.common.action.VdcActionType; -import org.ovirt.engine.core.common.action.VdcReturnValueBase; import org.ovirt.engine.core.common.businessentities.StorageDomainStatus; -import org.ovirt.engine.core.common.businessentities.StorageDomainType; import org.ovirt.engine.core.common.businessentities.StoragePoolIsoMap; import org.ovirt.engine.core.common.businessentities.StoragePoolIsoMapId; import org.ovirt.engine.core.compat.Guid; -import org.ovirt.engine.core.compat.backendcompat.CommandExecutionStatus; -import org.ovirt.engine.core.utils.threadpool.ThreadPoolUtil; @NonTransactiveCommandAttribute(forceCompensation = true) public class DeactivateStorageDomainWithOvfUpdateCommand<T extends StorageDomainPoolParametersBase> extends - DeactivateStorageDomainCommand<T> { + DeactivateStorageDomainCommand<T> implements SerialChildExecutingCommand { public DeactivateStorageDomainWithOvfUpdateCommand(T parameters) { this(parameters, null); @@ -37,6 +28,15 @@ public DeactivateStorageDomainWithOvfUpdateCommand(T parameters, CommandContext commandContext) { super(parameters, commandContext); setCommandShouldBeLogged(false); + } + + @Override + public CommandCallBack getCallBack() { + if (shouldPerformOvfUpdate()) { + return new SerialChildCommandsExecutionCallback(); + } + + return super.getCallBack(); } @@ -59,23 +59,18 @@ if (shouldPerformOvfUpdate()) { runInternalAction(VdcActionType.ProcessOvfUpdateForStoragePool, new StoragePoolParametersBase(getStoragePoolId()), null); - VdcReturnValueBase tmpRetValue = runInternalActionWithTasksContext(VdcActionType.ProcessOvfUpdateForStorageDomain, + executeCoCoCommandSyncWithTasksContext(VdcActionType.ProcessOvfUpdateForStorageDomain, createProcessOvfUpdateForDomainParams(), null); - - getReturnValue().getVdsmTaskIdList().addAll(tmpRetValue.getInternalVdsmTaskIdList()); - } - - if (getReturnValue().getVdsmTaskIdList().isEmpty()) { - executeDeactivateCommnad(true); } else { - setCommandShouldBeLogged(false); + executeDeactivateCommnad(true); } setSucceeded(true); } protected boolean shouldPerformOvfUpdate() { - return !getParameters().isInactive() && ovfOnAnyDomainSupported() && getStorageDomain().getStatus() == StorageDomainStatus.Active + return !getParameters().isInactive() && ovfOnAnyDomainSupported() && + getStorageDomain().getStatus() == StorageDomainStatus.Active && getStorageDomain().getStorageDomainType().isDataDomain(); } @@ -85,8 +80,9 @@ private ProcessOvfUpdateForStorageDomainCommandParameters createProcessOvfUpdateForDomainParams() { ProcessOvfUpdateForStorageDomainCommandParameters params = new ProcessOvfUpdateForStorageDomainCommandParameters(getStoragePoolId(), getStorageDomainId()); - params.setParentCommand(getActionType()); + params.setShouldBeEndedByParent(false); params.setParentParameters(getParameters()); + params.setParentCommand(getActionType()); params.setSkipDomainChecks(true); return params; } @@ -96,59 +92,6 @@ (new StoragePoolIsoMapId(getParameters().getStorageDomainId(), getParameters().getStoragePoolId())); } - - @Override - protected void endSuccessfully() { - endCommand(); - setSucceeded(true); - } - - @Override - protected void endWithFailure() { - endCommand(); - setSucceeded(true); - } - - public boolean hasExecutionEnded() { - return CommandCoordinatorUtil.getCommandExecutionStatus(getParameters().getCommandId()) == CommandExecutionStatus.EXECUTED; - } - - private void endCommand() { - if (!hasExecutionEnded()) { - return; - } - - List<Guid> createdTasks = new LinkedList<>(); - - for (VdcActionParametersBase parametersBase : getParameters().getImagesParameters()) { - if (parametersBase.getCommandType() == VdcActionType.AddImageFromScratch) { - CreateOvfStoresForStorageDomainCommandParameters parameters = new CreateOvfStoresForStorageDomainCommandParameters(getParameters().getStoragePoolId(), - getParameters().getStorageDomainId(), 0); - parameters.getImagesParameters().addAll(getParameters().getImagesParameters()); - parameters.setParentParameters(getParameters()); - parameters.setParentCommand(getActionType()); - parameters.setSkipDomainChecks(true); - VdcReturnValueBase vdsReturnValue = getBackend().endAction(VdcActionType.CreateOvfStoresForStorageDomain, parameters, cloneContext().withoutLock()); - createdTasks.addAll(vdsReturnValue.getInternalVdsmTaskIdList()); - break; - } - createdTasks.addAll(getBackend().endAction(parametersBase.getCommandType(), parametersBase, null).getInternalVdsmTaskIdList()); - } - - if (!createdTasks.isEmpty()) { - // if there are created tasks, avoid release the memory lock. - setLock(null); - setSucceeded(true); - startPollingAsyncTasks(createdTasks); - return; - } - - super.startFinalizingStep(); - - deactivateStorageDomainAfterTaskExecution(); - } - - protected void startFinalizingStep() {} public AuditLogType getAuditLogTypeValue() { return AuditLogType.UNASSIGNED; @@ -168,47 +111,57 @@ return lockProperties.withScope(LockProperties.Scope.Command); } - protected void deactivateStorageDomainAfterTaskExecution() { - final StorageDomainPoolParametersBase params = new StorageDomainPoolParametersBase(getStorageDomainId(), getStoragePoolId()); - params.setSkipChecks(true); - boolean newThread = getStorageDomain().getStorageDomainType() == StorageDomainType.Master && getNewMaster(false) == null; - if (newThread) { - StoragePoolIsoMap map = loadStoragePoolIsoMap(); - // The creation of the compensation context is needed in case of an engine restart between the tasks clearance and the - // execution of the deactivate command from the new thread. If the compensation context won't be created and the tasks - // will be cleared, when the engine start there's nothing to start the thread (as the end method won't be called as there - // are no tasks) and the domain will remain locked. - final CompensationContext ctx = createDefaultCompensationContext(Guid.newGuid()); - changeDomainStatusWithCompensation(map, StorageDomainStatus.Unknown, StorageDomainStatus.Locked, ctx); - ThreadPoolUtil.execute(new Runnable() { - @Override - public void run() { - try { - waitForTasksToBeCleared(); - executeDeactivateCommnad(false); - ctx.resetCompensation(); - } catch (Exception e) { - log.error("Error when attempting to deactivate storage domain {}", getStorageDomainId(), e); - compensate(); - } - } - }); - } else { - executeDeactivateCommnad(false); - } + @Override + public boolean performNextOperation(int completedChildCount) { + executeDeactivateCommnad(false); + return false; } - protected void waitForTasksToBeCleared() throws InterruptedException { - log.info("waiting for all tasks related to domain {} to be cleared (if exist) before attempting to deactivate", getStorageDomainId()); - while (true) { - TimeUnit.SECONDS.sleep(3); - List<Guid> tasks = getDbFacade().getAsyncTaskDao().getAsyncTaskIdsByEntity(getStorageDomainId()); - if (tasks.isEmpty()) { - log.info("no tasks for the deactivated domain {}, proceeding with deactivation", getStorageDomainId()); - return; - } else { - log.info("tasks {} were found for domain {}, waiting before attempting to deactivate", tasks, getStorageDomainId()); - } - } + @Override + public int getChildCount() { + return 0; } + +// protected void deactivateStorageDomainAfterTaskExecution() { +// final StorageDomainPoolParametersBase params = new StorageDomainPoolParametersBase(getStorageDomainId(), getStoragePoolId()); +// params.setSkipChecks(true); +// boolean newThread = getStorageDomain().getStorageDomainType() == StorageDomainType.Master && getNewMaster(false) == null; +// if (newThread) { +// StoragePoolIsoMap map = loadStoragePoolIsoMap(); +// // The creation of the compensation context is needed in case of an engine restart between the tasks clearance and the +// // execution of the deactivate command from the new thread. If the compensation context won't be created and the tasks +// // will be cleared, when the engine start there's nothing to start the thread (as the end method won't be called as there +// // are no tasks) and the domain will remain locked. +// final CompensationContext ctx = createDefaultCompensationContext(Guid.newGuid()); +// changeDomainStatusWithCompensation(map, StorageDomainStatus.Unknown, StorageDomainStatus.Locked, ctx); +// ThreadPoolUtil.execute(new Runnable() { +// @Override +// public void run() { +// try { +// waitForTasksToBeCleared(); +// executeDeactivateCommnad(false); +// ctx.resetCompensation(); +// } catch (Exception e) { +// log.error("Error when attempting to deactivate storage domain {}", getStorageDomainId(), e); +// compensate(); +// } +// } +// }); +// } else { +// } +// } + +// protected void waitForTasksToBeCleared() throws InterruptedException { +// log.info("waiting for all tasks related to domain {} to be cleared (if exist) before attempting to deactivate", getStorageDomainId()); +// while (true) { +// TimeUnit.SECONDS.sleep(3); +// List<Guid> tasks = getDbFacade().getAsyncTaskDao().getAsyncTaskIdsByEntity(getStorageDomainId()); +// if (tasks.isEmpty()) { +// log.info("no tasks for the deactivated domain {}, proceeding with deactivation", getStorageDomainId()); +// return; +// } else { +// log.info("tasks {} were found for domain {}, waiting before attempting to deactivate", tasks, getStorageDomainId()); +// } +// } +// } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CoCoAsyncTaskHelper.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CoCoAsyncTaskHelper.java index b696d86..6348aed 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CoCoAsyncTaskHelper.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CoCoAsyncTaskHelper.java @@ -199,8 +199,9 @@ int retVal = DbFacade.getInstance().getAsyncTaskDao().remove(taskId); if (asyncTask != null && !Guid.isNullOrEmpty(asyncTask.getCommandId())) { CommandEntity cmdEntity = coco.getCommandEntity(asyncTask.getCommandId()); - if (cmdEntity != null && !cmdEntity.isCallBackEnabled()) { + if (cmdEntity != null && !cmdEntity.isCallBackEnabled()&& coco.getCommandEntity(asyncTask.getRootCommandId()) == null) { coco.removeCommand(asyncTask.getCommandId()); + // not sure if this is needed if (!coco.hasCommandEntitiesWithRootCommandId(asyncTask.getRootCommandId())) { coco.removeCommand(asyncTask.getRootCommandId()); } @@ -229,7 +230,8 @@ int retVal = DbFacade.getInstance().getAsyncTaskDao().removeByVdsmTaskId(vdsmTaskId); if (asyncTask != null && !Guid.isNullOrEmpty(asyncTask.getCommandId())) { CommandEntity cmdEntity = coco.getCommandEntity(asyncTask.getCommandId()); - if (cmdEntity != null && !cmdEntity.isCallBackEnabled()) { + // TODO: maybe need to also check here that the command id is different from the root command id. + if (cmdEntity != null && !cmdEntity.isCallBackEnabled() && coco.getCommandEntity(asyncTask.getRootCommandId()) == null) { coco.removeCommand(asyncTask.getCommandId()); if (!coco.hasCommandEntitiesWithRootCommandId(asyncTask.getRootCommandId())) { coco.removeCommand(asyncTask.getRootCommandId()); diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorImpl.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorImpl.java index 3f83177..95462c8 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorImpl.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorImpl.java @@ -136,6 +136,17 @@ return cmdEntities; } + + public List<CommandEntity> getCommands() { + List<CommandEntity> cmdEntities = new ArrayList<>(); + CommandEntity cmdEntity; + for (Guid cmdId : commandsCache.keySet()) { + cmdEntity = commandsCache.get(cmdId); + cmdEntities.add(cmdEntity); + } + return cmdEntities; + } + @Override public CommandBase<?> retrieveCommand(Guid commandId) { return buildCommand(commandsCache.get(commandId), contextsCache.get(commandId)); @@ -233,7 +244,7 @@ synchronized(LOCK) { if (!childHierarchyInitialized) { childHierarchy.clear(); - for (CommandEntity cmd : getCommandsWithCallBackEnabled()) { + for (CommandEntity cmd : getCommands()) { buildCmdHierarchy(cmd); } } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CreateOvfVolumeForStorageDomainCommandParameters.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CreateOvfVolumeForStorageDomainCommandParameters.java index 4ee644f..f349367 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CreateOvfVolumeForStorageDomainCommandParameters.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CreateOvfVolumeForStorageDomainCommandParameters.java @@ -4,6 +4,7 @@ public class CreateOvfVolumeForStorageDomainCommandParameters extends StorageDomainParametersBase { private boolean skipDomainChecks; + private Guid createdDiskId; public CreateOvfVolumeForStorageDomainCommandParameters() { super(); @@ -20,4 +21,12 @@ public void setSkipDomainChecks(boolean skipDomainChecks) { this.skipDomainChecks = skipDomainChecks; } + + public Guid getCreatedDiskId() { + return createdDiskId; + } + + public void setCreatedDiskId(Guid createdDiskId) { + this.createdDiskId = createdDiskId; + } } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/TempParentCommandForTasksParameters.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/TempParentCommandForTasksParameters.java new file mode 100644 index 0000000..74a5b90 --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/TempParentCommandForTasksParameters.java @@ -0,0 +1,30 @@ +package org.ovirt.engine.core.common.action; + +public class TempParentCommandForTasksParameters extends VdcActionParametersBase { + private VdcActionType vdcActionType; + private VdcActionParametersBase parametersBase; + + public TempParentCommandForTasksParameters() { + } + + public TempParentCommandForTasksParameters(VdcActionType vdcActionType, VdcActionParametersBase parametersBase) { + this.vdcActionType = vdcActionType; + this.parametersBase = parametersBase; + } + + public VdcActionType getVdcActionType() { + return vdcActionType; + } + + public void setVdcActionType(VdcActionType vdcActionType) { + this.vdcActionType = vdcActionType; + } + + public VdcActionParametersBase getParametersBase() { + return parametersBase; + } + + public void setParametersBase(VdcActionParametersBase parametersBase) { + this.parametersBase = parametersBase; + } +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionParametersBase.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionParametersBase.java index ddd7f14..917bf99 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionParametersBase.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionParametersBase.java @@ -56,6 +56,8 @@ private List<Pair<VdcActionType, VdcActionParametersBase>> cocoChildCommands; + private boolean shouldBeEndedByParent = true; + /** * A cross system identifier of the executed action */ @@ -298,4 +300,12 @@ builder.append(getCommandType()); return builder.toString(); } + + public boolean isShouldBeEndedByParent() { + return shouldBeEndedByParent; + } + + public void setShouldBeEndedByParent(boolean shouldBeEndedByParent) { + this.shouldBeEndedByParent = shouldBeEndedByParent; + } } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java index da28982..92d5072 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java @@ -393,7 +393,8 @@ // Mac Pool AddMacPool(3100, ActionGroup.CREATE_MAC_POOL, false, QuotaDependency.NONE), UpdateMacPool(3101, ActionGroup.EDIT_MAC_POOL, false, QuotaDependency.NONE), - RemoveMacPool(3102, ActionGroup.DELETE_MAC_POOL, false, QuotaDependency.NONE); + RemoveMacPool(3102, ActionGroup.DELETE_MAC_POOL, false, QuotaDependency.NONE), + TempParentCommandForTasks(3103, QuotaDependency.NONE); private int intValue; private ActionGroup actionGroup; diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/StorageDomainMetadataCommand.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/StorageDomainMetadataCommand.java index 3624935..8826991 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/StorageDomainMetadataCommand.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/StorageDomainMetadataCommand.java @@ -92,7 +92,7 @@ selectHost(); initVdsBroker(getParameters().getVdsId()); try { - executeDomainCommand(); + executeVdsBrokerCommand(); } catch (UndeclaredThrowableException ex) { getVDSReturnValue().setExceptionString(ex.toString()); @@ -153,8 +153,8 @@ } private EngineLock buildLock(Guid id, LockingGroup lockingGroup) { - return new EngineLock(null, - Collections.singletonMap(id.toString(), new Pair<>(lockingGroup.toString(), VdcBllMessages.ACTION_TYPE_FAILED_OBJECT_LOCKED.toString()))); + return new EngineLock( + Collections.singletonMap(id.toString(), new Pair<>(lockingGroup.toString(), VdcBllMessages.ACTION_TYPE_FAILED_OBJECT_LOCKED.toString())), null); } private List<VDS> getHostsForOperation() { -- To view, visit https://gerrit.ovirt.org/39542 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I5b5bb672c5027c262619691007593a16875024aa Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Liron Aravot <lara...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches