Roy Golan has uploaded a new change for review. Change subject: core: use local TX in AddVm flow ......................................................................
core: use local TX in AddVm flow Taking VDS calls out of TX in Add VM Pool with VMs flow so long calls to VDSM won't exceed the TX timeout. To understand the commands that are influenced by this concider this call tree: <pre> AddVmPoolWithVMsCommand | -> Lock tepmlate status | -> AddVmAndAttachToPoolCommand | -> AddVMCommand | -> save static,dynamic etc. (new TX + compensation) | -> GetImageInfo - VDSM call (out of TX) | -> set image status (new TX + compensation) | -> CreateSnapshot - VDSM call (out of TX) | -> update old|save new disk image (new TX + compensation) Change-Id: If93240cca8bee4988f28c3de574b44c9db31e8f9 Signed-off-by: Roy Golan <rgo...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmAndAttachToPoolCommand.java 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/AddVmFromScratchCommand.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/CommonVmPoolWithVmsCommand.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/utils/VmDeviceUtils.java 7 files changed, 55 insertions(+), 25 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/05/13805/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmAndAttachToPoolCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmAndAttachToPoolCommand.java index d63771a..6ae25f4 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmAndAttachToPoolCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmAndAttachToPoolCommand.java @@ -10,6 +10,7 @@ import org.ovirt.engine.core.common.businessentities.VmStatic; @InternalCommandAttribute +@NonTransactiveCommandAttribute public class AddVmAndAttachToPoolCommand<T extends AddVmAndAttachToPoolParameters> extends AddVmCommand<T> { public AddVmAndAttachToPoolCommand(T parameters) { super(parameters); 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 b1cbde1..e9b3683 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 @@ -485,27 +485,37 @@ addVmNetwork(); addVmStatistics(); addActiveSnapshot(); + addVmPermission(); getCompensationContext().stateChanged(); return null; } }); - addVmPermission(); if (addVmImages()) { - copyVmDevices(); - addDiskPermissions(newDiskImages); - addVmPayload(); - // if vm smartcard settings is different from template's - // add or remove the smartcard according to user request - if (getVm().isSmartcardEnabled() != getVmTemplate().isSmartcardEnabled()) - { - VmDeviceUtils.updateSmartcardDevice(getVm().getId(), getVm().isSmartcardEnabled()); - } - setActionReturnValue(getVm().getId()); - setSucceeded(true); + TransactionSupport.executeInNewTransaction(new TransactionMethod<Void>() { + + @Override + public Void runInTransaction() { + copyVmDevices(); + addDiskPermissions(newDiskImages); + addVmPayload(); + updateSmartCardDevices(); + setActionReturnValue(getVm().getId()); + setSucceeded(true); + return null; + } + }); } } else { log.errorFormat("Failed to add vm . The reasons are: {0}", StringUtils.join(errorMessages, ',')); + } + } + + private void updateSmartCardDevices() { + // if vm smartcard settings is different from template's + // add or remove the smartcard according to user request + if (getVm().isSmartcardEnabled() != getVmTemplate().isSmartcardEnabled()) { + VmDeviceUtils.updateSmartcardDevice(getVm().getId(), getVm().isSmartcardEnabled()); } } @@ -745,6 +755,7 @@ permissions perms = new permissions(getCurrentUser().getUserId(), PredefinedRoles.VM_OPERATOR.getId(), getVmId(), VdcObjectType.VM); MultiLevelAdministrationHandler.addPermission(perms); + getCompensationContext().snapshotNewEntity(perms); } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromScratchCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromScratchCommand.java index 3de8c4d..b483ea8 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromScratchCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromScratchCommand.java @@ -26,6 +26,7 @@ @DisableInPrepareMode @LockIdNameAttribute +@NonTransactiveCommandAttribute public class AddVmFromScratchCommand<T extends AddVmFromScratchParameters> extends AddVmCommand<T> { public AddVmFromScratchCommand(T parameters) { super(parameters); 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 cbfafee..5b97158 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 @@ -161,7 +161,7 @@ */ protected void checkImageValidity() { try { - DiskImage diskImage = getImage(); + final DiskImage diskImage = getImage(); Guid storagePoolId = diskImage.getStoragePoolId() != null ? diskImage.getStoragePoolId().getValue() : Guid.Empty; Guid storageDomainId = @@ -173,14 +173,22 @@ Guid imageGroupId = diskImage.getId() != null ? diskImage.getId().getValue() : Guid.Empty; - DiskImage image = (DiskImage) runVdsCommand( + final DiskImage image = (DiskImage) runVdsCommand( VDSCommandType.GetImageInfo, new GetImageInfoVDSCommandParameters(storagePoolId, storageDomainId, imageGroupId, getImage().getImageId())).getReturnValue(); if (image.getImageStatus() != ImageStatus.OK) { - diskImage.setImageStatus(image.getImageStatus()); - getImageDao().update(diskImage.getImage()); + TransactionSupport.executeInNewTransaction(new TransactionMethod<Void>() { + @Override + public Void runInTransaction() { + getCompensationContext().snapshotEntityStatus(diskImage, diskImage.getImageStatus()); + diskImage.setImageStatus(image.getImageStatus()); + getImageDao().update(diskImage.getImage()); + getCompensationContext().stateChanged(); + return null; + } + }); throw new VdcBLLException(VdcBllErrors.IRS_IMAGE_STATUS_ILLEGAL); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommonVmPoolWithVmsCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommonVmPoolWithVmsCommand.java index 6ad1bd8..e847b4e 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommonVmPoolWithVmsCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommonVmPoolWithVmsCommand.java @@ -85,7 +85,8 @@ protected abstract Guid getPoolId(); /** - * This operation may take much time, so transactions timeout increased to 2 minutes + * This operation may take much time so the inner commands have fine-grained TX handling which + * means they aim to make all calls to Vds commands (i.e VDSM calls) out of TX. */ @Override protected void executeCommand() { 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 c205b42..3268260 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 @@ -19,6 +19,8 @@ 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.utils.transaction.TransactionMethod; +import org.ovirt.engine.core.utils.transaction.TransactionSupport; /** * This command responsible to creating snapshot from existing image and replace it to VM, holds the image. This command @@ -26,6 +28,7 @@ */ @InternalCommandAttribute +@NonTransactiveCommandAttribute public class CreateSnapshotCommand<T extends ImagesActionsParametersBase> extends BaseImagesCommand<T> { protected DiskImage mNewCreatedDiskImage; @@ -49,13 +52,17 @@ if (canCreateSnapshot()) { VDSReturnValue vdsReturnValue = performImageVdsmOperation(); if (vdsReturnValue != null && vdsReturnValue.getSucceeded()) { - /** - * Vitaly TODO: think about transactivity in DB - */ - processOldImageFromDb(); - addDiskImageToDb(mNewCreatedDiskImage, null); - setActionReturnValue(mNewCreatedDiskImage); - setSucceeded(true); + TransactionSupport.executeInNewTransaction(new TransactionMethod<Void>() { + @Override + public Void runInTransaction() { + processOldImageFromDb(); + addDiskImageToDb(mNewCreatedDiskImage, getCompensationContext()); + setActionReturnValue(mNewCreatedDiskImage); + setSucceeded(true); + return null; + } + }); + } } @@ -134,10 +141,12 @@ * By default old image must be replaced by new one */ protected void processOldImageFromDb() { + getCompensationContext().snapshotEntity(getDiskImage().getImage()); getParameters().setOldLastModifiedValue(getDiskImage().getLastModified()); getDiskImage().setLastModified(new Date()); getDiskImage().setActive(false); getImageDao().update(getDiskImage().getImage()); + getCompensationContext().stateChanged(); } @Override diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/VmDeviceUtils.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/VmDeviceUtils.java index 908b937..9be332c 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/VmDeviceUtils.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/VmDeviceUtils.java @@ -825,4 +825,3 @@ && vmDevice.getType().equals(VmDeviceType.INTERFACE.getName())); } } - -- To view, visit http://gerrit.ovirt.org/13805 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: If93240cca8bee4988f28c3de574b44c9db31e8f9 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Roy Golan <rgo...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches