Yair Zaslavsky has uploaded a new change for review.

Change subject: core: order collections at updateAllInTransaction
......................................................................

core: order collections at updateAllInTransaction

This patch sorts all collections at UpdateAllInTransaction in order
to prevent dead lock during updates (see for example updateAllInTransaction
for vmStatistics and the code at ResourceManager.init).

Change-Id: I979cb7d2273c2eaaa2866dcb4a5f760f9266e11a
signed-off-by: Yair Zaslavsky <yzasl...@redhat.com>
---
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/DiskImageDynamic.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmDynamic.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmNetworkStatistics.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmStatistics.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VdsUpdateRunTimeInfo.java
5 files changed, 29 insertions(+), 9 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/73/8273/1

diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/DiskImageDynamic.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/DiskImageDynamic.java
index e68dbf7..55afb6c 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/DiskImageDynamic.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/DiskImageDynamic.java
@@ -17,7 +17,7 @@
 @Entity
 @Table(name = "disk_image_dynamic")
 @TypeDef(name = "guid", typeClass = GuidType.class)
-public class DiskImageDynamic implements 
INotifyPropertyChanged,BusinessEntity<Guid> {
+public class DiskImageDynamic implements 
INotifyPropertyChanged,BusinessEntity<Guid>,Comparable<DiskImageDynamic> {
     private static final long serialVersionUID = 6357763045419255853L;
     private Guid id;
 
@@ -167,4 +167,9 @@
     public void setId(Guid id) {
         this.id = id;
     }
+
+    @Override
+    public int compareTo(DiskImageDynamic o) {
+        return getId().compareTo(o.getId());
+    }
 }
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmDynamic.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmDynamic.java
index 054641f..2d005ab 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmDynamic.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmDynamic.java
@@ -19,7 +19,7 @@
 @Entity
 @Table(name = "vm_dynamic")
 @TypeDef(name = "guid", typeClass = GuidType.class)
-public class VmDynamic implements BusinessEntity<Guid> {
+public class VmDynamic implements BusinessEntity<Guid>, Comparable<VmDynamic> {
     private static final long serialVersionUID = 521748509912037953L;
 
     @Id
@@ -722,4 +722,9 @@
     public VmPauseStatus getPauseStatus() {
         return this.pauseStatus;
     }
+
+    @Override
+    public int compareTo(VmDynamic o) {
+        return getId().compareTo(o.getId());
+    }
 }
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmNetworkStatistics.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmNetworkStatistics.java
index 9ffef9e..25f4d7f 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmNetworkStatistics.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmNetworkStatistics.java
@@ -7,7 +7,7 @@
  * {@link VmNetworkInterface}.
  *
  */
-public class VmNetworkStatistics extends NetworkStatistics {
+public class VmNetworkStatistics extends NetworkStatistics implements 
Comparable<VmNetworkStatistics> {
     private static final long serialVersionUID = -423834938475712247L;
 
     private NGuid vmId;
@@ -30,4 +30,9 @@
     public NGuid getVmId() {
         return vmId;
     }
+
+    @Override
+    public int compareTo(VmNetworkStatistics o) {
+        return getId().compareTo(o.getId());
+    }
 }
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmStatistics.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmStatistics.java
index 334b1b3..6b75841 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmStatistics.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmStatistics.java
@@ -4,7 +4,7 @@
 
 import org.ovirt.engine.core.compat.Guid;
 
-public class VmStatistics implements BusinessEntity<Guid> {
+public class VmStatistics implements 
BusinessEntity<Guid>,Comparable<VmStatistics> {
     private static final long serialVersionUID = -7480866662740734452L;
 
     public VmStatistics() {
@@ -252,4 +252,9 @@
         this.vm_guidField = id;
     }
 
+    @Override
+    public int compareTo(VmStatistics o) {
+        return getId().compareTo(o.getId());
+    }
+
 }
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VdsUpdateRunTimeInfo.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VdsUpdateRunTimeInfo.java
index 4bc20db..59ddb4c 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VdsUpdateRunTimeInfo.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VdsUpdateRunTimeInfo.java
@@ -158,9 +158,7 @@
     }
 
     private void saveVmDevicesToDb() {
-        List<VmDevice> list = new ArrayList<VmDevice>(vmDeviceToSave.values());
-        Collections.sort(list);
-        updateAllInTransaction("UpdateVmDeviceRuntimeInfo", list, 
getDbFacade().getVmDeviceDao());
+        updateAllInTransaction("UpdateVmDeviceRuntimeInfo", 
vmDeviceToSave.values(), getDbFacade().getVmDeviceDao());
 
         if (!removedDeviceIds.isEmpty()) {
             TransactionSupport.executeInScope(TransactionScopeOption.Required,
@@ -197,7 +195,7 @@
      * @param dao
      *            The DAO used for updating.
      */
-    private static <T extends BusinessEntity<?>, ID extends Serializable> void 
updateAllInTransaction
+    private static <T extends BusinessEntity<?> & Comparable<T>, ID extends 
Serializable> void updateAllInTransaction
             (final Collection<T> entities, final MassOperationsDao<T, ID> dao) 
{
         updateAllInTransaction(null, entities,dao);
     }
@@ -216,8 +214,10 @@
      *            The DAO used for updating.
      */
 
-    private static <T extends BusinessEntity<?>, ID extends Serializable> void 
updateAllInTransaction
+    private static <T extends BusinessEntity<?> & Comparable<T>, ID extends 
Serializable> void updateAllInTransaction
         (final String procedureName, final Collection<T> entities, final 
MassOperationsDao<T, ID> dao) {
+    List<T> sortedList = new ArrayList<T>(entities);
+    Collections.sort(sortedList);
     if (!entities.isEmpty()) {
         TransactionSupport.executeInScope(TransactionScopeOption.Required,
             new TransactionMethod<Void>() {


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

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

Reply via email to