Skip to content
Snippets Groups Projects
Commit 9eec490e authored by srosse's avatar srosse
Browse files

OO-2416: use a simple delete statement to remove the locks

parent 68d30ca8
No related branches found
No related tags found
No related merge requests found
...@@ -32,7 +32,6 @@ ...@@ -32,7 +32,6 @@
<bean id="clusterLocker" class="org.olat.commons.coordinate.cluster.lock.ClusterLocker" init-method="init"> <bean id="clusterLocker" class="org.olat.commons.coordinate.cluster.lock.ClusterLocker" init-method="init">
<constructor-arg index="0" ref="clusterLockManager" /> <constructor-arg index="0" ref="clusterLockManager" />
<property name="pessimisticLockManager" ref="lockManager"/>
<property name="persistentLockManager" ref="persistentLockManager"/> <property name="persistentLockManager" ref="persistentLockManager"/>
<property name="syncer" ref="org.olat.commons.coordinate.cluster.ClusterSyncer" /> <property name="syncer" ref="org.olat.commons.coordinate.cluster.ClusterSyncer" />
<property name="eventBus" ref="org.olat.commons.coordinate.cluster.jms.ClusterEventBus" /> <property name="eventBus" ref="org.olat.commons.coordinate.cluster.jms.ClusterEventBus" />
......
...@@ -26,6 +26,7 @@ package org.olat.commons.coordinate.cluster.lock; ...@@ -26,6 +26,7 @@ package org.olat.commons.coordinate.cluster.lock;
import java.util.List; import java.util.List;
import org.olat.basesecurity.IdentityRef;
import org.olat.core.commons.persistence.DB; import org.olat.core.commons.persistence.DB;
import org.olat.core.id.Identity; import org.olat.core.id.Identity;
import org.olat.core.logging.OLog; import org.olat.core.logging.OLog;
...@@ -88,19 +89,28 @@ public class ClusterLockManager { ...@@ -88,19 +89,28 @@ public class ClusterLockManager {
dbInstance.getCurrentEntityManager().persist(alock); dbInstance.getCurrentEntityManager().persist(alock);
log.info("saveLock: "+alock+" END"); log.info("saveLock: "+alock+" END");
} }
void deleteLock(LockImpl li) { int deleteLock(String asset, IdentityRef owner) {
log.info("deleteLock: "+li+" START"); log.info("deleteLock: "+ asset + " owner: " + owner +" START");
dbInstance.getCurrentEntityManager().remove(li); String sb = "delete from org.olat.commons.coordinate.cluster.lock.LockImpl alock where alock.owner.key=:ownerKey and alock.asset=:asset";
dbInstance.commit();//prevent stale object by logout login int locks = dbInstance.getCurrentEntityManager()
log.info("deleteLock: "+li+" END"); .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() { List<LockImpl> getAllLocks() {
log.info("getAllLocks START"); log.info("getAllLocks START");
StringBuilder sb = new StringBuilder(); String sb = "select alock from org.olat.commons.coordinate.cluster.lock.LockImpl as alock inner join fetch alock.owner";
sb.append("select alock from org.olat.commons.coordinate.cluster.lock.LockImpl as alock inner join fetch alock.owner"); List<LockImpl> res = dbInstance.getCurrentEntityManager()
List<LockImpl> res = dbInstance.getCurrentEntityManager().createQuery(sb.toString(), LockImpl.class).getResultList(); .createQuery(sb.toString(), LockImpl.class)
.getResultList();
log.info("getAllLocks END. res.length:"+ (res==null ? "null" : res.size())); log.info("getAllLocks END. res.length:"+ (res==null ? "null" : res.size()));
return res; return res;
} }
...@@ -110,8 +120,7 @@ public class ClusterLockManager { ...@@ -110,8 +120,7 @@ public class ClusterLockManager {
*/ */
public void releaseAllLocksFor(Long identityKey) { public void releaseAllLocksFor(Long identityKey) {
log.info("releaseAllLocksFor: " + identityKey + " START"); log.info("releaseAllLocksFor: " + identityKey + " START");
StringBuilder sb = new StringBuilder(); String sb = "delete from org.olat.commons.coordinate.cluster.lock.LockImpl alock where alock.owner.key=:ownerKey";
sb.append("delete from org.olat.commons.coordinate.cluster.lock.LockImpl alock where alock.owner.key=:ownerKey");
int locks = dbInstance.getCurrentEntityManager().createQuery(sb.toString()) int locks = dbInstance.getCurrentEntityManager().createQuery(sb.toString())
.setParameter("ownerKey", identityKey) .setParameter("ownerKey", identityKey)
.executeUpdate(); .executeUpdate();
......
...@@ -28,11 +28,9 @@ import java.util.ArrayList; ...@@ -28,11 +28,9 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.olat.core.commons.persistence.DBFactory; 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.gui.control.Event;
import org.olat.core.id.Identity; import org.olat.core.id.Identity;
import org.olat.core.id.OLATResourceable; import org.olat.core.id.OLATResourceable;
import org.olat.core.logging.AssertException;
import org.olat.core.logging.DBRuntimeException; import org.olat.core.logging.DBRuntimeException;
import org.olat.core.logging.OLog; import org.olat.core.logging.OLog;
import org.olat.core.logging.Tracing; import org.olat.core.logging.Tracing;
...@@ -67,7 +65,6 @@ public class ClusterLocker implements Locker, GenericEventListener { ...@@ -67,7 +65,6 @@ public class ClusterLocker implements Locker, GenericEventListener {
private EventBus eventBus; private EventBus eventBus;
private ClusterLockManager clusterLockManager; private ClusterLockManager clusterLockManager;
private PersistentLockManager persistentLockManager; private PersistentLockManager persistentLockManager;
private PessimisticLockManager pessimisticLockManager;
/** /**
* [used by spring] * [used by spring]
* *
...@@ -97,19 +94,13 @@ public class ClusterLocker implements Locker, GenericEventListener { ...@@ -97,19 +94,13 @@ public class ClusterLocker implements Locker, GenericEventListener {
public void setPersistentLockManager(PersistentLockManager persistentLockManager) { public void setPersistentLockManager(PersistentLockManager persistentLockManager) {
this.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) { public LockResult acquireLock(final OLATResourceable ores, final Identity requestor, final String locksubkey) {
final String asset = OresHelper.createStringRepresenting(ores, locksubkey); final String asset = OresHelper.createStringRepresenting(ores, locksubkey);
LockResult res = syncer.doInSync(ores, new SyncerCallback<LockResult>(){ LockResult res = syncer.doInSync(ores, new SyncerCallback<LockResult>(){
@Override
public LockResult execute() { public LockResult execute() {
LockResultImpl lres; LockResultImpl lres;
LockImpl li = clusterLockManager.findLock(asset); LockImpl li = clusterLockManager.findLock(asset);
...@@ -141,6 +132,7 @@ public class ClusterLocker implements Locker, GenericEventListener { ...@@ -141,6 +132,7 @@ public class ClusterLocker implements Locker, GenericEventListener {
* *
* @see org.olat.core.util.event.GenericEventListener#event(org.olat.core.gui.control.Event) * @see org.olat.core.util.event.GenericEventListener#event(org.olat.core.gui.control.Event)
*/ */
@Override
public void event(Event event) { public void event(Event event) {
SignOnOffEvent se = (SignOnOffEvent) event; SignOnOffEvent se = (SignOnOffEvent) event;
if (!se.isSignOn() && se.isEventOnThisNode()) { if (!se.isSignOn() && se.isEventOnThisNode()) {
...@@ -199,10 +191,10 @@ public class ClusterLocker implements Locker, GenericEventListener { ...@@ -199,10 +191,10 @@ public class ClusterLocker implements Locker, GenericEventListener {
public void releaseLockEntry(LockEntry lockEntry) { public void releaseLockEntry(LockEntry lockEntry) {
String asset = lockEntry.getKey(); String asset = lockEntry.getKey();
Identity releaseRequestor = lockEntry.getOwner(); Identity releaseRequestor = lockEntry.getOwner();
clusterLockManager.deleteLock(asset, releaseRequestor);
// cluster:: change to useage with syncer, but we don't have the olatresourceable yet // 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); LockImpl li = clusterLockManager.findLock(asset);
if (li == null) { if (li == null) {
...@@ -217,7 +209,7 @@ public class ClusterLocker implements Locker, GenericEventListener { ...@@ -217,7 +209,7 @@ public class ClusterLocker implements Locker, GenericEventListener {
throw new AssertException("cannot release lock since the requestor of the release ("+ throw new AssertException("cannot release lock since the requestor of the release ("+
releaseRequestor.getName()+") is not the owner ("+ownwer.getName()+") of the lock ("+asset+")"); releaseRequestor.getName()+") is not the owner ("+ownwer.getName()+") of the lock ("+asset+")");
} }
} }*/
} }
public List<LockEntry> adminOnlyGetLockEntries() { public List<LockEntry> adminOnlyGetLockEntries() {
......
...@@ -117,8 +117,9 @@ public class LockTest extends OlatTestCase { ...@@ -117,8 +117,9 @@ public class LockTest extends OlatTestCase {
assertEquals(li.getKey(), l2.getKey()); assertEquals(li.getKey(), l2.getKey());
// delete it // delete it
clusterLockManager.deleteLock(l2); int deletedLock = clusterLockManager.deleteLock(asset, ident);
dbInstance.closeSession(); dbInstance.closeSession();
Assert.assertEquals(1, deletedLock);
// may not find it again // may not find it again
LockImpl l3 = clusterLockManager.findLock(asset); LockImpl l3 = clusterLockManager.findLock(asset);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment