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

Reply via email to