Arik Hadas has uploaded a new change for review.

Change subject: core: prevent VM creation from Template while removing its disks
......................................................................

core: prevent VM creation from Template while removing its disks

In what seems to be a hack, we set a flag for not checking template
images in some commands. the problem is that the template images might
be locked for a good reason - like in case the images are really being
removed (there's a protection for it in the UI but not in the REST).

This patch prevents it from happening for addVmFromTemplateCommand: a
locking group for images was added. in the RemoveImageCommand we take
exclusive lock for the to-be-related image for the whole command
execution. the AddVmFromTemplate now takes shared lock for each of the
template's images - thus it won't be able to acquire the locks if one of
the images is being removed.

Change-Id: I8736751bbfea927072b2ade91ee3d9511e266501
Signed-off-by: Arik Hadas <[email protected]>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromTemplateCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/LockMessagesMatchUtil.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveImageCommand.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/locks/LockingGroup.java
4 files changed, 12 insertions(+), 2 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/16/13016/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromTemplateCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromTemplateCommand.java
index 2af2328..5d7c09a 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromTemplateCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromTemplateCommand.java
@@ -46,6 +46,9 @@
         }
         locks.put(getVmTemplateId().toString(),
                 new Pair<String, String>(LockingGroup.TEMPLATE.name(), 
createTemplateSharedLockMessage()));
+        for (DiskImage image: getImagesToCheckDestinationStorageDomains()) {
+            locks.put(image.getImageId().toString(), 
LockMessagesMatchUtil.IMAGE);
+        }
         return locks;
     }
 
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/LockMessagesMatchUtil.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/LockMessagesMatchUtil.java
index 3354e8c..5cad48f 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/LockMessagesMatchUtil.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/LockMessagesMatchUtil.java
@@ -32,5 +32,6 @@
             VdcBllMessages.ACTION_TYPE_FAILED_OBJECT_LOCKED.name());
     public static final Pair<String, String> USER_VM_POOL = new Pair<String, 
String>(LockingGroup.USER_VM_POOL.name(),
             VdcBllMessages.ACTION_TYPE_FAILED_OBJECT_LOCKED.name());
-
+    public static final Pair<String, String> IMAGE = new Pair<String, 
String>(LockingGroup.IMAGE.name(),
+            VdcBllMessages.ACTION_TYPE_FAILED_OBJECT_LOCKED.name());
 }
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 fc334ca..f52aeed 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
@@ -37,6 +37,7 @@
  */
 @SuppressWarnings("serial")
 @InternalCommandAttribute
+@LockIdNameAttribute(isReleaseAtEndOfExecute = false)
 @NonTransactiveCommandAttribute(forceCompensation=true)
 public class RemoveImageCommand<T extends RemoveImageParameters> extends 
BaseImagesCommand<T> {
     private EngineLock snapshotsEngineLock;
@@ -52,6 +53,10 @@
         super(commandId);
     }
 
+    @Override
+    protected Map<String, Pair<String, String>> getExclusiveLocks() {
+        return Collections.singletonMap(getImageId().toString(), 
LockMessagesMatchUtil.IMAGE);
+    }
     protected void initImage() {
         setDiskImage(((getParameters().getDiskImage()) != null) ? 
getParameters().getDiskImage() : getImage());
     }
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/locks/LockingGroup.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/locks/LockingGroup.java
index 7c7cd40..b602643 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/locks/LockingGroup.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/locks/LockingGroup.java
@@ -15,6 +15,7 @@
     REGISTER_VDS,
     VM_SNAPSHOTS,
     GLUSTER,
-    USER_VM_POOL;
+    USER_VM_POOL,
+    IMAGE;
 
 }


--
To view, visit http://gerrit.ovirt.org/13016
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I8736751bbfea927072b2ade91ee3d9511e266501
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Arik Hadas <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to