diff --git a/src/main/java/org/olat/commons/coordinate/cluster/_spring/coordinateContext.xml b/src/main/java/org/olat/commons/coordinate/cluster/_spring/coordinateContext.xml index 96b2423896f4f66d92efd82c1bc32b9128847356..55ed8fc7a98ad67c16984a124274101ff7535a8d 100644 --- a/src/main/java/org/olat/commons/coordinate/cluster/_spring/coordinateContext.xml +++ b/src/main/java/org/olat/commons/coordinate/cluster/_spring/coordinateContext.xml @@ -32,7 +32,6 @@ <bean id="clusterLocker" class="org.olat.commons.coordinate.cluster.lock.ClusterLocker" init-method="init"> <constructor-arg index="0" ref="clusterLockManager" /> - <property name="pessimisticLockManager" ref="lockManager"/> <property name="persistentLockManager" ref="persistentLockManager"/> <property name="syncer" ref="org.olat.commons.coordinate.cluster.ClusterSyncer" /> <property name="eventBus" ref="org.olat.commons.coordinate.cluster.jms.ClusterEventBus" /> diff --git a/src/main/java/org/olat/commons/coordinate/cluster/lock/ClusterLockManager.java b/src/main/java/org/olat/commons/coordinate/cluster/lock/ClusterLockManager.java index b7ca02b281ebd65574bcc344f0ee4d6da9aec2bf..e40ff96051bab40e2704470116a993a2edd78855 100644 --- a/src/main/java/org/olat/commons/coordinate/cluster/lock/ClusterLockManager.java +++ b/src/main/java/org/olat/commons/coordinate/cluster/lock/ClusterLockManager.java @@ -26,6 +26,7 @@ package org.olat.commons.coordinate.cluster.lock; import java.util.List; +import org.olat.basesecurity.IdentityRef; import org.olat.core.commons.persistence.DB; import org.olat.core.id.Identity; import org.olat.core.logging.OLog; @@ -88,19 +89,28 @@ public class ClusterLockManager { dbInstance.getCurrentEntityManager().persist(alock); log.info("saveLock: "+alock+" END"); } - - void deleteLock(LockImpl li) { - log.info("deleteLock: "+li+" START"); - dbInstance.getCurrentEntityManager().remove(li); - dbInstance.commit();//prevent stale object by logout login - log.info("deleteLock: "+li+" END"); + + int deleteLock(String asset, IdentityRef owner) { + log.info("deleteLock: "+ asset + " owner: " + owner +" START"); + String sb = "delete from org.olat.commons.coordinate.cluster.lock.LockImpl alock where alock.owner.key=:ownerKey and alock.asset=:asset"; + int locks = dbInstance.getCurrentEntityManager() + .createQuery(sb) + .setParameter("ownerKey", owner.getKey()) + .setParameter("asset", asset) + .executeUpdate(); + log.info("deleteLock: "+ asset + " owner: " + owner +" END"); + if(locks > 0) { + dbInstance.commit(); + } + return locks; } List<LockImpl> getAllLocks() { log.info("getAllLocks START"); - StringBuilder sb = new StringBuilder(); - sb.append("select alock from org.olat.commons.coordinate.cluster.lock.LockImpl as alock inner join fetch alock.owner"); - List<LockImpl> res = dbInstance.getCurrentEntityManager().createQuery(sb.toString(), LockImpl.class).getResultList(); + String sb = "select alock from org.olat.commons.coordinate.cluster.lock.LockImpl as alock inner join fetch alock.owner"; + List<LockImpl> res = dbInstance.getCurrentEntityManager() + .createQuery(sb.toString(), LockImpl.class) + .getResultList(); log.info("getAllLocks END. res.length:"+ (res==null ? "null" : res.size())); return res; } @@ -110,8 +120,7 @@ public class ClusterLockManager { */ public void releaseAllLocksFor(Long identityKey) { log.info("releaseAllLocksFor: " + identityKey + " START"); - StringBuilder sb = new StringBuilder(); - sb.append("delete from org.olat.commons.coordinate.cluster.lock.LockImpl alock where alock.owner.key=:ownerKey"); + String sb = "delete from org.olat.commons.coordinate.cluster.lock.LockImpl alock where alock.owner.key=:ownerKey"; int locks = dbInstance.getCurrentEntityManager().createQuery(sb.toString()) .setParameter("ownerKey", identityKey) .executeUpdate(); diff --git a/src/main/java/org/olat/commons/coordinate/cluster/lock/ClusterLocker.java b/src/main/java/org/olat/commons/coordinate/cluster/lock/ClusterLocker.java index 0fff2897b4b2d45f41ffa01f042de2cabf145364..debb3497b40e04b76e9c50e38edbefa8dfac15e2 100644 --- a/src/main/java/org/olat/commons/coordinate/cluster/lock/ClusterLocker.java +++ b/src/main/java/org/olat/commons/coordinate/cluster/lock/ClusterLocker.java @@ -28,11 +28,9 @@ import java.util.ArrayList; import java.util.List; import org.olat.core.commons.persistence.DBFactory; -import org.olat.core.commons.services.lock.pessimistic.PessimisticLockManager; import org.olat.core.gui.control.Event; import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; -import org.olat.core.logging.AssertException; import org.olat.core.logging.DBRuntimeException; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; @@ -67,7 +65,6 @@ public class ClusterLocker implements Locker, GenericEventListener { private EventBus eventBus; private ClusterLockManager clusterLockManager; private PersistentLockManager persistentLockManager; - private PessimisticLockManager pessimisticLockManager; /** * [used by spring] * @@ -97,19 +94,13 @@ public class ClusterLocker implements Locker, GenericEventListener { public void setPersistentLockManager(PersistentLockManager persistentLockManager) { this.persistentLockManager = persistentLockManager; } - - /** - * [used by Spring] - * @param pessimisticLockManager - */ - public void setPessimisticLockManager(PessimisticLockManager pessimisticLockManager) { - this.pessimisticLockManager = pessimisticLockManager; - } + @Override public LockResult acquireLock(final OLATResourceable ores, final Identity requestor, final String locksubkey) { final String asset = OresHelper.createStringRepresenting(ores, locksubkey); LockResult res = syncer.doInSync(ores, new SyncerCallback<LockResult>(){ + @Override public LockResult execute() { LockResultImpl lres; LockImpl li = clusterLockManager.findLock(asset); @@ -141,6 +132,7 @@ public class ClusterLocker implements Locker, GenericEventListener { * * @see org.olat.core.util.event.GenericEventListener#event(org.olat.core.gui.control.Event) */ + @Override public void event(Event event) { SignOnOffEvent se = (SignOnOffEvent) event; if (!se.isSignOn() && se.isEventOnThisNode()) { @@ -199,10 +191,10 @@ public class ClusterLocker implements Locker, GenericEventListener { public void releaseLockEntry(LockEntry lockEntry) { String asset = lockEntry.getKey(); Identity releaseRequestor = lockEntry.getOwner(); - + clusterLockManager.deleteLock(asset, releaseRequestor); // cluster:: change to useage with syncer, but we don't have the olatresourceable yet - pessimisticLockManager.findOrPersistPLock(asset); + /*pessimisticLockManager.findOrPersistPLock(asset); LockImpl li = clusterLockManager.findLock(asset); if (li == null) { @@ -217,7 +209,7 @@ public class ClusterLocker implements Locker, GenericEventListener { throw new AssertException("cannot release lock since the requestor of the release ("+ releaseRequestor.getName()+") is not the owner ("+ownwer.getName()+") of the lock ("+asset+")"); } - } + }*/ } public List<LockEntry> adminOnlyGetLockEntries() { diff --git a/src/test/java/org/olat/commons/coordinate/cluster/lock/LockTest.java b/src/test/java/org/olat/commons/coordinate/cluster/lock/LockTest.java index 448a872b9f264ae90efa1f37919912801f458369..1026b81e4a42447420125381ff758214c456ca15 100644 --- a/src/test/java/org/olat/commons/coordinate/cluster/lock/LockTest.java +++ b/src/test/java/org/olat/commons/coordinate/cluster/lock/LockTest.java @@ -117,8 +117,9 @@ public class LockTest extends OlatTestCase { assertEquals(li.getKey(), l2.getKey()); // delete it - clusterLockManager.deleteLock(l2); + int deletedLock = clusterLockManager.deleteLock(asset, ident); dbInstance.closeSession(); + Assert.assertEquals(1, deletedLock); // may not find it again LockImpl l3 = clusterLockManager.findLock(asset);