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

Reply via email to