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
