Liron Ar has uploaded a new change for review. Change subject: core: ImagesHandler - lock multiple disks snapshots in one transaction ......................................................................
core: ImagesHandler - lock multiple disks snapshots in one transaction this patch adds support and usage of locking the snapshots of multiple disks in one transaction (including support for using compensation) Change-Id: If873e23983757e9e9bb41a760d07779fc1512cd4 Related To Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=1028768 Signed-off-by: Liron Aravot <lara...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImagesHandler.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveSnapshotTaskHandler.java 2 files changed, 33 insertions(+), 14 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/26/21326/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImagesHandler.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImagesHandler.java index 740e5be..2400324 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImagesHandler.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImagesHandler.java @@ -3,6 +3,7 @@ import java.io.File; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -654,29 +655,48 @@ DbFacade.getInstance().getImageDao().updateStatus(imageId, imageStatus); } - protected static void updateAllDiskImageSnapshotsStatusWithCompensation(final Guid diskId, + public static void updateAllDiskImageSnapshotsStatusWithCompensation(final Guid diskId, final ImageStatus status, ImageStatus statusForCompensation, final CompensationContext compensationContext) { + updateAllDiskImagesSnapshotsStatusInTransactionWithCompensation(Collections.singletonList(diskId), status, statusForCompensation, compensationContext); + } + public static void updateAllDiskImagesSnapshotsStatusInTransactionWithCompensation(final Collection<Guid> diskIds, + final ImageStatus status, + ImageStatus statusForCompensation, + final CompensationContext compensationContext) { if (compensationContext != null) { - List<DiskImage> diskSnapshots = - DbFacade.getInstance().getDiskImageDao().getAllSnapshotsForImageGroup(diskId); - for (DiskImage diskSnapshot : diskSnapshots) { - diskSnapshot.setImageStatus(statusForCompensation); - compensationContext.snapshotEntityStatus(diskSnapshot.getImage()); + for (Guid diskId : diskIds) { + List<DiskImage> diskSnapshots = + DbFacade.getInstance().getDiskImageDao().getAllSnapshotsForImageGroup(diskId); + for (DiskImage diskSnapshot : diskSnapshots) { + diskSnapshot.setImageStatus(statusForCompensation); + compensationContext.snapshotEntityStatus(diskSnapshot.getImage()); + } } TransactionSupport.executeInScope(TransactionScopeOption.Required, new TransactionMethod<Void>() { @Override public Void runInTransaction() { - DbFacade.getInstance().getImageDao().updateStatusOfImagesByImageGroupId(diskId, status); + for (Guid diskId : diskIds) { + DbFacade.getInstance().getImageDao().updateStatusOfImagesByImageGroupId(diskId, status); + } compensationContext.stateChanged(); return null; } }); } else { - updateAllDiskImageSnapshotsStatus(diskId, status); + + TransactionSupport.executeInScope(TransactionScopeOption.Required, new TransactionMethod<Void>() { + @Override + public Void runInTransaction() { + for (Guid diskId : diskIds) { + updateAllDiskImageSnapshotsStatus(diskId, status); + } + return null; + } + }); } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveSnapshotTaskHandler.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveSnapshotTaskHandler.java index d890f5c..18e6c03 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveSnapshotTaskHandler.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveSnapshotTaskHandler.java @@ -42,12 +42,11 @@ @Override public void execute() { - for (Guid movedDiskId : getMovedDiskIds()) { - ImagesHandler.updateAllDiskImageSnapshotsStatusWithCompensation(movedDiskId, - ImageStatus.LOCKED, - ImageStatus.OK, - enclosingCommand.getCompensationContext()); - } + ImagesHandler.updateAllDiskImagesSnapshotsStatusInTransactionWithCompensation(getMovedDiskIds(), + ImageStatus.LOCKED, + ImageStatus.OK, + enclosingCommand.getCompensationContext()); + if (enclosingCommand.getParameters().getTaskGroupSuccess()) { VdcReturnValueBase vdcReturnValue = Backend.getInstance().runInternalAction(VdcActionType.CreateAllSnapshotsFromVm, -- To view, visit http://gerrit.ovirt.org/21326 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: If873e23983757e9e9bb41a760d07779fc1512cd4 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Liron Ar <lara...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches