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