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

Reply via email to