Maor Lipchuk has uploaded a new change for review. Change subject: core: Remove image while VDSM returns not exist. ......................................................................
core: Remove image while VDSM returns not exist. If image does not exists in the storage server, VDSM returns an exception at the initiating stage of the task. If engine encounter this exception it should avoid the exception print a log message and remove the disk any how from the DB. Signed-off-by: Maor Lipchuk <mlipc...@redhat.com> Bug-Url: https://bugzilla.redhat.com/884635 Change-Id: I36915c44e65e20e3ce222683650a562603e4bb05 --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskCommand.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/RemoveTemplateSnapshotCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmCommand.java 4 files changed, 72 insertions(+), 30 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/77/12077/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskCommand.java index 7ba2c35..a8c0b87 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskCommand.java @@ -294,8 +294,14 @@ setLock(null); if (vdcReturnValue.getSucceeded()) { getParameters().getImagesParameters().add(p); - getReturnValue().getTaskIdList().addAll(vdcReturnValue.getInternalTaskIdList()); setSucceeded(vdcReturnValue.getSucceeded()); + if (vdcReturnValue.getInternalTaskIdList().isEmpty()) { + // We get here if we got imageDoesNotExistsInDomain for the disk image from VDSM. + endCommand(); + } else { + getReturnValue().getTaskIdList().addAll(vdcReturnValue.getInternalTaskIdList()); + } + } } else { removeLunDisk(); 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 899ed9a..4923b2e 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 @@ -18,6 +18,8 @@ import org.ovirt.engine.core.common.businessentities.VmDeviceId; import org.ovirt.engine.core.common.businessentities.ImageStorageDomainMapId; import org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface; +import org.ovirt.engine.core.common.errors.VdcBLLException; +import org.ovirt.engine.core.common.errors.VdcBllErrors; import org.ovirt.engine.core.common.utils.Pair; import org.ovirt.engine.core.common.vdscommands.DeleteImageGroupVDSCommandParameters; import org.ovirt.engine.core.common.vdscommands.VDSCommandType; @@ -73,12 +75,22 @@ @Override protected void executeCommand() { if (getDiskImage() != null) { - VDSReturnValue vdsReturnValue = performImageVdsmOperation(); - getReturnValue().getInternalTaskIdList().add( - createTask(vdsReturnValue.getCreationInfo(), - getParameters().getParentCommand(), - VdcObjectType.Storage, - getParameters().getStorageDomainId())); + try { + VDSReturnValue vdsReturnValue = performImageVdsmOperation(); + getReturnValue().getInternalTaskIdList().add( + createTask(vdsReturnValue.getCreationInfo(), + getParameters().getParentCommand(), + VdcObjectType.Storage, + getParameters().getStorageDomainId())); + } catch (VdcBLLException e) { + if (e.getErrorCode() == VdcBllErrors.ImageDoesNotExistInDomainError) { + log.errorFormat("Image {0} does not exists in domain {1}. Removing disk from DB only.", + getDiskImage().getId(), + getParameters().getStorageDomainId()); + } else { + throw e; + } + } if (getParameters().isRemoveDuringExecution() && getParameters().getParentCommand() != VdcActionType.RemoveVmFromImportExport diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveTemplateSnapshotCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveTemplateSnapshotCommand.java index 2dd3caa..8e04bdd 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveTemplateSnapshotCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveTemplateSnapshotCommand.java @@ -4,6 +4,8 @@ import org.ovirt.engine.core.common.action.ImagesContainterParametersBase; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.asynctasks.AsyncTaskType; +import org.ovirt.engine.core.common.errors.VdcBLLException; +import org.ovirt.engine.core.common.errors.VdcBllErrors; import org.ovirt.engine.core.common.vdscommands.DeleteImageGroupVDSCommandParameters; import org.ovirt.engine.core.common.vdscommands.VDSCommandType; import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; @@ -19,23 +21,38 @@ @Override protected void executeCommand() { - VDSReturnValue vdsReturnValue = Backend - .getInstance() - .getResourceManager() - .RunVdsCommand( - VDSCommandType.DeleteImageGroup, - new DeleteImageGroupVDSCommandParameters(getParameters().getStoragePoolId(), getParameters() - .getStorageDomainId(), getParameters().getImageGroupID(), getParameters() - .getWipeAfterDelete(), false, getStoragePool().getcompatibility_version().toString())); + try { + VDSReturnValue vdsReturnValue = + Backend + .getInstance() + .getResourceManager() + .RunVdsCommand( + VDSCommandType.DeleteImageGroup, + new DeleteImageGroupVDSCommandParameters(getParameters().getStoragePoolId(), + getParameters() + .getStorageDomainId(), + getParameters().getImageGroupID(), + getParameters() + .getWipeAfterDelete(), + false, + getStoragePool().getcompatibility_version().toString())); + if (vdsReturnValue.getSucceeded()) { + getReturnValue().getInternalTaskIdList().add( + createTask(vdsReturnValue.getCreationInfo(), + VdcActionType.RemoveVmTemplate, + VdcObjectType.Storage, + getParameters().getStorageDomainId())); - if (vdsReturnValue.getSucceeded()) { - getReturnValue().getInternalTaskIdList().add( - createTask(vdsReturnValue.getCreationInfo(), - VdcActionType.RemoveVmTemplate, - VdcObjectType.Storage, - getParameters().getStorageDomainId())); - - setSucceeded(true); + setSucceeded(true); + } + } catch (VdcBLLException e) { + if (e.getErrorCode() == VdcBllErrors.ImageDoesNotExistInDomainError) { + log.errorFormat("Image {0} does not exists in domain {1}. Removing disk from DB only.", + getDiskImage().getId(), + getParameters().getStorageDomainId()); + } else { + throw e; + } } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmCommand.java index 3ef7b00..735a30d 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmCommand.java @@ -76,20 +76,27 @@ if (getParameters().isRemoveDisks() && hasImages) { if (!removeVmImages(null)) { return false; + // We get here if we got imageDoesNotExistsInDomain for all the VM disks from VDSM. + } else if (getReturnValue().getTaskIdList().isEmpty()) { + endCommandWithoutTasks(); } } else { - TransactionSupport.executeInNewTransaction(new TransactionMethod<Void>() { - @Override - public Void runInTransaction() { - removeVmFromDb(); - return null; - } - }); + endCommandWithoutTasks(); } return true; } + private void endCommandWithoutTasks() { + TransactionSupport.executeInNewTransaction(new TransactionMethod<Void>() { + @Override + public Void runInTransaction() { + removeVmFromDb(); + return null; + } + }); + } + @Override protected boolean canDoAction() { if (getVm() == null) { -- To view, visit http://gerrit.ovirt.org/12077 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I36915c44e65e20e3ce222683650a562603e4bb05 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Maor Lipchuk <mlipc...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches