Liron Aravot has uploaded a new change for review.

Change subject: core: AddVdsSpmId - execute for a number of VDSs at once.
......................................................................

core: AddVdsSpmId - execute for a number of VDSs at once.

benefits:
1. When moving number of vdss - less db calls (existing mapping loaded
only once).
2. Less memory locks acquired, reduce load from the lock manager.
3. Avoid transactivity issues.

Change-Id: I9ecf9990eeda676ad2a4f9bd73d4535bd2eb3f9a
Signed-off-by: Liron Aravot <lara...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVdsCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVdsSpmIdCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ChangeVDSClusterCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVdsGroupCommand.java
4 files changed, 51 insertions(+), 19 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/12/11412/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVdsCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVdsCommand.java
index 229b59d..c7a10e9 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVdsCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVdsCommand.java
@@ -18,6 +18,7 @@
 import org.ovirt.engine.core.common.AuditLogType;
 import org.ovirt.engine.core.common.VdcObjectType;
 import org.ovirt.engine.core.common.action.AddVdsActionParameters;
+import org.ovirt.engine.core.common.action.AddVdsSpmIdParameters;
 import org.ovirt.engine.core.common.action.InstallVdsParameters;
 import org.ovirt.engine.core.common.action.RemoveVdsParameters;
 import org.ovirt.engine.core.common.action.VdcActionType;
@@ -109,7 +110,7 @@
 
         // set vds spm id
         if (getVdsGroup().getStoragePoolId() != null) {
-            VdsActionParameters tempVar = new 
VdsActionParameters(getVdsIdRef().getValue());
+            AddVdsSpmIdParameters tempVar = new 
AddVdsSpmIdParameters(Collections.singletonList(getVdsIdRef().getValue()));
             tempVar.setSessionId(getParameters().getSessionId());
             tempVar.setCompensationEnabled(true);
             CompensationContext compensationContext = getCompensationContext();
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVdsSpmIdCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVdsSpmIdCommand.java
index cd6eabf..2306351 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVdsSpmIdCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVdsSpmIdCommand.java
@@ -1,10 +1,15 @@
 package org.ovirt.engine.core.bll;
 
+import java.util.ArrayList;
 import java.util.Collections;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.Stack;
 
+import org.ovirt.engine.core.common.action.AddVdsSpmIdParameters;
 import org.ovirt.engine.core.common.action.VdsActionParameters;
+import org.ovirt.engine.core.common.businessentities.VDS;
 import org.ovirt.engine.core.common.businessentities.vds_spm_id_map;
 import org.ovirt.engine.core.common.config.Config;
 import org.ovirt.engine.core.common.config.ConfigValues;
@@ -18,7 +23,7 @@
 
 @InternalCommandAttribute
 @LockIdNameAttribute(isWait = true)
-public class AddVdsSpmIdCommand<T extends VdsActionParameters> extends 
VdsCommand<T> {
+public class AddVdsSpmIdCommand<T extends AddVdsSpmIdParameters> extends 
VdsCommand<T> {
     private List<vds_spm_id_map> vds_spm_id_mapList;
 
     /**
@@ -42,7 +47,7 @@
         }
         vds_spm_id_mapList = DbFacade.getInstance().getVdsSpmIdMapDao().getAll(
                 getVds().getStoragePoolId());
-        if (vds_spm_id_mapList.size() >= Config.<Integer> 
GetValue(ConfigValues.MaxNumberOfHostsInStoragePool)) {
+        if (vds_spm_id_mapList.size() + getParameters().getVdsIds().size() > 
Config.<Integer> GetValue(ConfigValues.MaxNumberOfHostsInStoragePool)) {
             VdcFault fault = new VdcFault();
             fault.setError(VdcBllErrors.ReachedMaxNumberOfHostsInDC);
             fault.setMessage(Backend.getInstance()
@@ -64,19 +69,32 @@
                 return vds_spm_id_map.getvds_spm_id();
             }
         });
+
+        Stack<Integer> selectedIds =  new Stack<Integer>();
         Collections.sort(list);
         for (int id : list) {
             if (selectedId == id) {
                 selectedId++;
             } else {
-                break;
+                selectedIds.add(selectedId);
+                if (selectedIds.size() == getParameters().getVdsIds().size()) {
+                    break;
+                }
             }
         }
-        vds_spm_id_map newMap = new 
vds_spm_id_map(getVds().getStoragePoolId(), getVdsId(), selectedId);
-        DbFacade.getInstance().getVdsSpmIdMapDao().save(newMap);
-        if (getParameters().isCompensationEnabled()) {
+
+        List<vds_spm_id_map> map_values = new LinkedList<vds_spm_id_map>();
+        for (Guid vdsId : getParameters().getVdsIds()) {
+            int id = selectedIds.pop();
+            vds_spm_id_map newMap = new 
vds_spm_id_map(getVdsDAO().get(vdsId).getStoragePoolId(), vdsId, id);
+            map_values.add(newMap);
             getCompensationContext().snapshotNewEntity(newMap);
-            getCompensationContext().stateChanged();
+        }
+
+        getCompensationContext().stateChanged();
+
+        for (vds_spm_id_map mapping : map_values) {
+            getVdsSpmIdMapDAO().save(mapping);
         }
 
         setSucceeded(true);
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ChangeVDSClusterCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ChangeVDSClusterCommand.java
index 9175a6e..e80151b 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ChangeVDSClusterCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ChangeVDSClusterCommand.java
@@ -10,6 +10,7 @@
 import org.ovirt.engine.core.bll.utils.PermissionSubject;
 import org.ovirt.engine.core.common.AuditLogType;
 import org.ovirt.engine.core.common.VdcObjectType;
+import org.ovirt.engine.core.common.action.AddVdsSpmIdParameters;
 import org.ovirt.engine.core.common.action.ChangeVDSClusterParameters;
 import org.ovirt.engine.core.common.action.VdcActionType;
 import org.ovirt.engine.core.common.action.VdcReturnValueBase;
@@ -130,9 +131,10 @@
 
         if (targetStoragePool != null
                 && (getSourceCluster().getStoragePoolId()== null || 
!targetStoragePool.getId().equals(getSourceCluster().getStoragePoolId().getValue())))
 {
+            AddVdsSpmIdParameters params = new 
AddVdsSpmIdParameters(Collections.singletonList(getVds().getId()));
             VdcReturnValueBase addVdsSpmIdReturn =
                     
Backend.getInstance().runInternalAction(VdcActionType.AddVdsSpmId,
-                            getParameters(),
+                            params,
                             new CommandContext(getCompensationContext()));
             if (!addVdsSpmIdReturn.getSucceeded()) {
                 setSucceeded(false);
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVdsGroupCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVdsGroupCommand.java
index bba3ac5..9c773c5 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVdsGroupCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVdsGroupCommand.java
@@ -1,11 +1,15 @@
 package org.ovirt.engine.core.bll;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.Transformer;
 import org.apache.commons.lang.StringUtils;
 import org.ovirt.engine.core.bll.utils.VersionSupport;
 import org.ovirt.engine.core.common.AuditLogType;
+import org.ovirt.engine.core.common.action.AddVdsSpmIdParameters;
 import org.ovirt.engine.core.common.action.VdcActionType;
 import org.ovirt.engine.core.common.action.VdcReturnValueBase;
 import org.ovirt.engine.core.common.action.VdsActionParameters;
@@ -60,20 +64,27 @@
                 && 
!oldGroup.getStoragePoolId().equals(getVdsGroup().getStoragePoolId()))
                 || (oldGroup.getStoragePoolId() == null
                 && getVdsGroup().getStoragePoolId() != null)) {
-            VdsActionParameters parameters = new VdsActionParameters();
-            for (VDS vds : allForVdsGroup) {
-                parameters.setVdsId(vds.getId());
-                if (getVdsGroup().getStoragePoolId() != null) {
-                    VdcReturnValueBase addVdsSpmIdReturn =
-                            
getBackend().runInternalAction(VdcActionType.AddVdsSpmId, parameters);
-                    if (!addVdsSpmIdReturn.getSucceeded()) {
-                        setSucceeded(false);
-                        
getReturnValue().setFault(addVdsSpmIdReturn.getFault());
-                        return;
+
+            if (getVdsGroup().getStoragePoolId() != null) {
+                Collection<Guid> vdsIds = 
CollectionUtils.collect(allForVdsGroup.iterator(), new Transformer() {
+
+                    @Override
+                    public Object transform(Object input) {
+                        return ((VDS)input).getId();
                     }
+                });
+
+                AddVdsSpmIdParameters parameters = new 
AddVdsSpmIdParameters(vdsIds);
+                VdcReturnValueBase addVdsSpmIdReturn =
+                        
getBackend().runInternalAction(VdcActionType.AddVdsSpmId, parameters);
+                if (!addVdsSpmIdReturn.getSucceeded()) {
+                    setSucceeded(false);
+                    getReturnValue().setFault(addVdsSpmIdReturn.getFault());
+                    return;
                 }
             }
 
+
             if (oldGroup.getStoragePoolId() != null) {
                 for (VDS vds : allForVdsGroup) {
                     getVdsSpmIdMapDAO().removeByVdsAndStoragePool(vds.getId(), 
oldGroup.getStoragePoolId().getValue());


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I9ecf9990eeda676ad2a4f9bd73d4535bd2eb3f9a
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Liron Aravot <lara...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to