Liran Zelkha has uploaded a new change for review. Change subject: core: Batch updates might create a database deadlock ......................................................................
core: Batch updates might create a database deadlock Batch updates might create a database deadlock in systems under load Sorting the batch collection by id should solve this problem Change-Id: I1f1868c7a76ea50257f40929573e36ad304c353c Bug-Url: https://bugzilla.redhat.com/1092299 Signed-off-by: lzel...@redhat.com <lzel...@redhat.com> --- M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/MassOperationsGenericDaoDbFacade.java 1 file changed, 20 insertions(+), 0 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/73/27173/1 diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/MassOperationsGenericDaoDbFacade.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/MassOperationsGenericDaoDbFacade.java index 2960e8e..e91f4f0 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/MassOperationsGenericDaoDbFacade.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/MassOperationsGenericDaoDbFacade.java @@ -1,7 +1,11 @@ package org.ovirt.engine.core.dao; import java.io.Serializable; +import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; import org.ovirt.engine.core.common.businessentities.BusinessEntity; import org.ovirt.engine.core.dal.dbbroker.MapSqlParameterMapper; @@ -49,6 +53,22 @@ protected void updateAllInBatch(String procedureName, Collection<T> paramValues, MapSqlParameterMapper<T> mapper) { + + // To overcome possible deadlocks, we need to sort the collection + List<T> sortedParamValues = new ArrayList<>(paramValues); + Collections.sort(sortedParamValues, new Comparator<T>() { + + @Override + public int compare(T o1, T o2) { + if (o1 instanceof Comparable) { + return ((Comparable)o1).compareTo(o2); + } else if (o1.getId() instanceof Comparable) { + return ((Comparable)o1.getId()).compareTo(o2.getId()); + } + return ((Integer) o1.getId().hashCode()).compareTo(o2.getId().hashCode()); + } + + }); getCallsHandler().executeStoredProcAsBatch(procedureName == null ? getProcedureNameForUpdate() : procedureName, paramValues, mapper); } -- To view, visit http://gerrit.ovirt.org/27173 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I1f1868c7a76ea50257f40929573e36ad304c353c Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Liran Zelkha <lzel...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches