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