[exo-jcr-commits] exo-jcr SVN: r783 - in jcr/branches/1.12.0-JBC/component/core/src: main/java/org/exoplatform/services/jcr/impl/core/lock and 1 other directories.
do-not-reply at jboss.org
do-not-reply at jboss.org
Fri Nov 20 03:28:45 EST 2009
Author: nzamosenchuk
Date: 2009-11-20 03:28:44 -0500 (Fri, 20 Nov 2009)
New Revision: 783
Added:
jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockRemover.java
jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/PersistentLockManager.java
Modified:
jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryContainer.java
jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockData.java
jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/SessionLockManager.java
jcr/branches/1.12.0-JBC/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/lock/TestSessionLockManager.java
Log:
EXOJCR-243: Added lock removing logic on timeout. This added through persistent lock manager, that creates worker thread to remove locks.
Modified: jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryContainer.java
===================================================================
--- jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryContainer.java 2009-11-19 16:19:28 UTC (rev 782)
+++ jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryContainer.java 2009-11-20 08:28:44 UTC (rev 783)
@@ -40,6 +40,7 @@
import org.exoplatform.services.jcr.impl.core.SessionRegistry;
import org.exoplatform.services.jcr.impl.core.WorkspaceInitializer;
import org.exoplatform.services.jcr.impl.core.access.DefaultAccessManagerImpl;
+import org.exoplatform.services.jcr.impl.core.lock.PersistentLockManager;
import org.exoplatform.services.jcr.impl.core.nodetype.NodeTypeDataManagerImpl;
import org.exoplatform.services.jcr.impl.core.nodetype.NodeTypeManagerImpl;
import org.exoplatform.services.jcr.impl.core.nodetype.registration.JcrNodeTypeDataPersister;
@@ -286,6 +287,10 @@
}
}
+ // persistent lock manager
+
+ workspaceContainer.registerComponentImplementation(PersistentLockManager.class);
+
// initializer
Class<?> initilizerType;
if (wsConfig.getInitializer() != null && wsConfig.getInitializer().getType() != null)
Modified: jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockData.java
===================================================================
--- jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockData.java 2009-11-19 16:19:28 UTC (rev 782)
+++ jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockData.java 2009-11-20 08:28:44 UTC (rev 783)
@@ -89,6 +89,7 @@
* @param sessionScoped
* @param owner
* @param timeOut
+ * is seconds!
*/
public LockData(String nodeIdentifier, String lockToken, boolean deep, boolean sessionScoped, String owner,
long timeOut)
Added: jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockRemover.java
===================================================================
--- jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockRemover.java (rev 0)
+++ jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockRemover.java 2009-11-20 08:28:44 UTC (rev 783)
@@ -0,0 +1,62 @@
+package org.exoplatform.services.jcr.impl.core.lock;
+
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+import org.exoplatform.services.jcr.impl.proccess.WorkerThread;
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+
+/**
+ * Created by The eXo Platform SAS.
+ *
+ * @author <a href="mailto:Sergey.Kabashnyuk at gmail.com">Sergey Kabashnyuk</a>
+ * @version $Id$
+ */
+public class LockRemover extends WorkerThread
+{
+
+ private final Log log = ExoLogger.getLogger("jcr.lock.LockRemover");
+
+ public static final long DEFAULT_THREAD_TIMEOUT = 30000; // 30
+
+ private final PersistentLockManager persistentLockManager;
+
+ public LockRemover(PersistentLockManager persistentLockManager)
+ {
+ this(persistentLockManager, DEFAULT_THREAD_TIMEOUT);
+ }
+
+ private LockRemover(PersistentLockManager persistentLockManager, long timeout)
+ {
+ super(timeout);
+ this.persistentLockManager = persistentLockManager;
+ setName("LockRemover " + getId());
+ setDaemon(true);
+ start();
+ if (log.isDebugEnabled())
+ log.debug("LockRemover instantiated name= " + getName() + " timeout= " + timeout);
+ }
+
+ @Override
+ protected void callPeriodically() throws Exception
+ {
+ persistentLockManager.removeExpired();
+ }
+}
Property changes on: jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockRemover.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Added: jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/PersistentLockManager.java
===================================================================
--- jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/PersistentLockManager.java (rev 0)
+++ jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/PersistentLockManager.java 2009-11-20 08:28:44 UTC (rev 783)
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.impl.core.lock;
+
+import org.exoplatform.services.jcr.access.SystemIdentity;
+import org.exoplatform.services.jcr.dataflow.ItemState;
+import org.exoplatform.services.jcr.dataflow.PlainChangesLog;
+import org.exoplatform.services.jcr.dataflow.PlainChangesLogImpl;
+import org.exoplatform.services.jcr.datamodel.ItemData;
+import org.exoplatform.services.jcr.datamodel.NodeData;
+import org.exoplatform.services.jcr.datamodel.QPathEntry;
+import org.exoplatform.services.jcr.impl.Constants;
+import org.exoplatform.services.jcr.impl.dataflow.persistent.WorkspacePersistentDataManager;
+import org.exoplatform.services.jcr.observation.ExtendedEvent;
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+import org.picocontainer.Startable;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.jcr.RepositoryException;
+
+/**
+ * This is a persistent lock manager, that currently is responsible for removing expired locks
+ *
+ * @author <a href="mailto:nikolazius at gmail.com">Nikolay Zamosenchuk</a>
+ * @version $Id$
+ *
+ */
+public class PersistentLockManager implements Startable
+{
+ private final Log log = ExoLogger.getLogger(this.getClass().getName());
+
+ /**
+ * Lock remover thread.
+ */
+ private LockRemover lockRemover;
+
+ /**
+ * Workspace data manager
+ */
+ WorkspacePersistentDataManager dataManager;
+
+ /**
+ * creates persistent lock manager
+ */
+ public PersistentLockManager(WorkspacePersistentDataManager dataManager)
+ {
+ this.dataManager = dataManager;
+ }
+
+ /**
+ * @see org.picocontainer.Startable#start()
+ */
+ public void start()
+ {
+ lockRemover = new LockRemover(this);
+ }
+
+ /**
+ * @see org.picocontainer.Startable#stop()
+ */
+ public void stop()
+ {
+ lockRemover.halt();
+ lockRemover.interrupt();
+ }
+
+ /**
+ * Removes all expired locks
+ */
+ protected void removeExpired()
+ {
+ List<LockData> lockDatas;
+ try
+ {
+ lockDatas = dataManager.getLocksData();
+ }
+ catch (RepositoryException e)
+ {
+ // exception getting list of locks, return
+ log.error(e.getMessage(), e);
+ return;
+ }
+
+ if (lockDatas != null)
+ {
+ for (LockData lockData : lockDatas)
+ {
+ System.out.println(" found sucg lock: " + lockData.getNodeIdentifier());
+ System.out.println(" it's expir time: " + lockData.getTimeToDeath());
+ if (lockData.getTimeToDeath() < 0)
+ {
+ // try to remove node, if unsuccessful then, at least, try to remove other expired locks
+ try
+ {
+ NodeData node = (NodeData)dataManager.getItemData(lockData.getNodeIdentifier());
+
+ PlainChangesLog changesLog =
+ new PlainChangesLogImpl(new ArrayList<ItemState>(), SystemIdentity.SYSTEM, ExtendedEvent.UNLOCK);
+ ItemData lockOwner = dataManager.getItemData(node, new QPathEntry(Constants.JCR_LOCKOWNER, 0));
+ changesLog.add(ItemState.createDeletedState(lockOwner));
+ ItemData lockIsDeep = dataManager.getItemData(node, new QPathEntry(Constants.JCR_LOCKISDEEP, 0));
+ changesLog.add(ItemState.createDeletedState(lockIsDeep));
+
+ dataManager.save(changesLog);
+ }
+ catch (RepositoryException e)
+ {
+ log.error("Error removing expired lock from node : " + lockData.getNodeIdentifier());
+ }
+ }
+ }
+ }
+ }
+}
Property changes on: jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/PersistentLockManager.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Modified: jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/SessionLockManager.java
===================================================================
--- jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/SessionLockManager.java 2009-11-19 16:19:28 UTC (rev 782)
+++ jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/SessionLockManager.java 2009-11-20 08:28:44 UTC (rev 783)
@@ -61,7 +61,7 @@
/**
* Default lock time out. 30min
*/
- public static final long DEFAULT_LOCK_TIMEOUT = 1000 * 60 * 30;
+ public static final long DEFAULT_LOCK_TIMEOUT = 60 * 30;
/**
* Search lockData for given node
Modified: jcr/branches/1.12.0-JBC/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/lock/TestSessionLockManager.java
===================================================================
--- jcr/branches/1.12.0-JBC/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/lock/TestSessionLockManager.java 2009-11-19 16:19:28 UTC (rev 782)
+++ jcr/branches/1.12.0-JBC/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/lock/TestSessionLockManager.java 2009-11-20 08:28:44 UTC (rev 783)
@@ -173,8 +173,7 @@
public void testRemoveByTimeOut() throws RepositoryException
{
- int REMOVER_SCHEDULE_TIME = 10000; // 10s?! need to place correct value
- int lockTimeOut = 2000;
+ int lockTimeOut = 2;
NodeImpl node1 = (NodeImpl)testRoot.addNode("testRemoveByTimeOut");
node1.addMixin("mix:lockable");
session.save();
@@ -183,7 +182,7 @@
try
{
// sleep for Remover period time + lockTimeOut + 1s for stability
- Thread.sleep(REMOVER_SCHEDULE_TIME + lockTimeOut + 1000);
+ Thread.sleep(LockRemover.DEFAULT_THREAD_TIMEOUT + lockTimeOut * 1000 + 5000);
}
catch (InterruptedException e)
{
More information about the exo-jcr-commits
mailing list