You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2010/06/22 15:56:14 UTC

svn commit: r956898 - /jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/session/ActiveSessionState.java

Author: jukka
Date: Tue Jun 22 13:56:13 2010
New Revision: 956898

URL: http://svn.apache.org/viewvc?rev=956898&view=rev
Log:
JCR-890: concurrent read-only access to a session

Use an explicit lock instead of Java synchronization to be able to log warnings about concurrent session use.

Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/session/ActiveSessionState.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/session/ActiveSessionState.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/session/ActiveSessionState.java?rev=956898&r1=956897&r2=956898&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/session/ActiveSessionState.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/session/ActiveSessionState.java Tue Jun 22 13:56:13 2010
@@ -16,11 +16,31 @@
  */
 package org.apache.jackrabbit.core.session;
 
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
 import javax.jcr.RepositoryException;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 public class ActiveSessionState implements SessionState {
 
     /**
+     * Logger instance.
+     */
+    private static final Logger log =
+        LoggerFactory.getLogger(ActiveSessionState.class);
+
+    /**
+     * The lock used to guarantee synchronized execution of repository
+     * operations. An explicit lock is used instead of normal Java
+     * synchronization in order to be able to log attempts to concurrently
+     * use a session. TODO: Check if this is a performance issue!
+     */
+    private final Lock lock = new ReentrantLock();
+
+    /**
      * Returns <code>true</code>; the session is alive.
      *
      * @return <code>true</code>
@@ -34,9 +54,16 @@ public class ActiveSessionState implemen
      *
      * @throws RepositoryException if the operation fails
      */
-    public synchronized void perform(SessionOperation operation)
-            throws RepositoryException {
-        operation.perform();
+    public void perform(SessionOperation operation) throws RepositoryException {
+        if (!lock.tryLock()) {
+            log.warn("Attempt to concurrently access a single session");
+            lock.lock();
+        }
+        try {
+            operation.perform();
+        } finally {
+            lock.unlock();
+        }
     }
 
 }