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/09/08 11:56:18 UTC

svn commit: r994955 - /jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/session/SessionState.java

Author: jukka
Date: Wed Sep  8 09:56:18 2010
New Revision: 994955

URL: http://svn.apache.org/viewvc?rev=994955&view=rev
Log:
JCR-2741: Improved logging for session operations

Detect and warn about concurrent writes using the same session

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

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/session/SessionState.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/session/SessionState.java?rev=994955&r1=994954&r2=994955&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/session/SessionState.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/session/SessionState.java Wed Sep  8 09:56:18 2010
@@ -63,6 +63,12 @@ public class SessionState {
     private final Lock lock = new ReentrantLock();
 
     /**
+     * Flag to indicate that the current operation is a write operation.
+     * Used to detect concurrent writes.
+     */
+    private volatile boolean isWriteOperation = false;
+
+    /**
      * Flag to indicate a closed session. When <code>null</code>, the session
      * is still alive. And when the session is closed, this reference is set
      * to an exception that contains the stack trace of where the session was
@@ -71,6 +77,11 @@ public class SessionState {
      */
     private volatile Exception closed = null;
 
+    /**
+     * Creates a state instance for a session.
+     *
+     * @param context component context of this session
+     */
     public SessionState(SessionContext context) {
         this.context = context;
     }
@@ -148,17 +159,29 @@ public class SessionState {
     private <T> T internalPerform(SessionOperation<T> operation)
             throws RepositoryException {
         if (!lock.tryLock()) {
-            log.debug("Attempt to perform {} while another thread is"
-                    + " concurrently accessing the session. Blocking until"
-                    + " the other thread is finished using this session.",
-                    operation);
+            if (isWriteOperation && operation instanceof SessionWriteOperation) {
+                log.warn("Attempt to perform {} while another thread is"
+                        + " concurrently modifying the session. Blocking until"
+                        + " the other thread is finished using this session.",
+                        operation);
+            } else {
+                log.debug("Attempt to perform {} while another thread is"
+                        + " concurrently accessing the session. Blocking until"
+                        + " the other thread is finished using this session.",
+                        operation);
+            }
             lock.lock();
         }
+        boolean wasWriteOperation = isWriteOperation;
+        if (!wasWriteOperation && operation instanceof SessionWriteOperation) {
+            isWriteOperation = true;
+        }
         try {
             checkAlive();
             log.debug("Performing {}", operation);
             return operation.perform(context);
         } finally {
+            isWriteOperation = wasWriteOperation;
             lock.unlock();
         }
     }