You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by md...@apache.org on 2013/07/16 16:48:01 UTC

svn commit: r1503737 - in /jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr: RepositoryImpl.java SessionImpl.java delegate/SessionDelegate.java delegate/SessionOperation.java

Author: mduerig
Date: Tue Jul 16 14:48:00 2013
New Revision: 1503737

URL: http://svn.apache.org/r1503737
Log:
OAK-803 Backwards compatibility of long-lived sessions
log warnings for access to long lived sessions that are not set to "never refresh"

Modified:
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/RepositoryImpl.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionDelegate.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionOperation.java

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/RepositoryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/RepositoryImpl.java?rev=1503737&r1=1503736&r2=1503737&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/RepositoryImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/RepositoryImpl.java Tue Jul 16 14:48:00 2013
@@ -18,6 +18,8 @@ package org.apache.jackrabbit.oak.jcr;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
+import java.util.concurrent.TimeUnit;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.jcr.Credentials;
@@ -46,6 +48,9 @@ public class RepositoryImpl implements R
      */
     private static final Logger log = LoggerFactory.getLogger(RepositoryImpl.class);
 
+    // TODO implement auto refresh configuration. See OAK-803, OAK-88
+    private static final long AUTO_REFRESH_INTERVAL = TimeUnit.SECONDS.toMillis(1);
+
     private final Descriptors descriptors = new Descriptors(new SimpleValueFactory());
     private final ContentRepository contentRepository;
     private final Whiteboard whiteboard;
@@ -125,7 +130,7 @@ public class RepositoryImpl implements R
             ContentSession contentSession =
                     contentRepository.login(credentials, workspaceName);
             SessionContext context = new SessionContext(
-                    this, whiteboard, new SessionDelegate(contentSession));
+                    this, whiteboard, new SessionDelegate(contentSession, AUTO_REFRESH_INTERVAL));
             return context.getSession();
         } catch (LoginException e) {
             throw new javax.jcr.LoginException(e.getMessage(), e);

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java?rev=1503737&r1=1503736&r2=1503737&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java Tue Jul 16 14:48:00 2013
@@ -395,6 +395,11 @@ public class SessionImpl implements Jack
                 sessionContext.refresh();
                 return null;
             }
+
+            @Override
+            public boolean isRefresh() {
+                return true;
+            }
         });
     }
 

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionDelegate.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionDelegate.java?rev=1503737&r1=1503736&r2=1503737&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionDelegate.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionDelegate.java Tue Jul 16 14:48:00 2013
@@ -17,9 +17,10 @@
 package org.apache.jackrabbit.oak.jcr.delegate;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.concurrent.TimeUnit.MINUTES;
 
 import java.io.IOException;
-import java.util.concurrent.TimeUnit;
 
 import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
@@ -51,16 +52,13 @@ import org.slf4j.LoggerFactory;
  * TODO document
  */
 public class SessionDelegate {
-
     static final Logger log = LoggerFactory.getLogger(SessionDelegate.class);
 
-    // TODO implement auto refresh configuration. See OAK-803, OAK-88
-    private static final long AUTO_REFRESH_INTERVAL =
-            TimeUnit.SECONDS.toMillis(1);
-
     private final ContentSession contentSession;
+    private final long refreshInterval;
     private final Root root;
     private final IdentifierManager idManager;
+    private final Exception initStackTrace;
 
     private boolean isAlive = true;
     private int sessionOpCount;
@@ -68,10 +66,19 @@ public class SessionDelegate {
 
     private long lastAccessed = System.currentTimeMillis();
 
-    public SessionDelegate(@Nonnull ContentSession contentSession) {
+    /**
+     * Create a new session delegate for a {@code ContentSession}. The refresh behaviour of the
+     * session is governed by the value of the {@code refreshInterval} argument: if the session
+     * has been idle longer than that value, an implicit refresh will take place.
+     * @param contentSession  the content session
+     * @param refreshInterval  refresh interval in seconds or {@code -1} for never.
+     */
+    public SessionDelegate(@Nonnull ContentSession contentSession, long refreshInterval) {
         this.contentSession = checkNotNull(contentSession);
+        this.refreshInterval = refreshInterval;
         this.root = contentSession.getLatestRoot();
         this.idManager = new IdentifierManager(root);
+        this.initStackTrace = new Exception("The session was created here:");
     }
 
     public synchronized void refreshAtNextAccess() {
@@ -95,12 +102,24 @@ public class SessionDelegate {
         if (sessionOpCount == 0) {
             // Refresh and checks only for non re-entrant session operations
             long now = System.currentTimeMillis();
-            if (now > lastAccessed + AUTO_REFRESH_INTERVAL) {
-                refresh(true);
-                updateCount++;
+            long timeElapsed = now - lastAccessed;
+            if (!sessionOperation.isRefresh()) {
+                // Don't refresh if this operation is a refresh operation itself
+                if (refreshInterval > 0 && timeElapsed > MILLISECONDS.convert(1, MINUTES)) {
+                    // Warn if the refresh interval is neither zero nor never (-1) and this
+                    // session has been idle too long
+                    log.warn("This session has been idle for " + MINUTES.convert(timeElapsed, MILLISECONDS) +
+                            " minutes and might be out of date. Consider using a fresh session or explicitly" +
+                            " refresh the session.", initStackTrace);
+                }
+                if (refreshInterval != -1 && timeElapsed >= refreshInterval) {
+                    // Refresh if the refresh interval is not never (-1) and the session
+                    // has been idle too long
+                    refresh(true);
+                    updateCount++;
+                }
             }
             lastAccessed = now;
-
             sessionOperation.checkPreconditions();
         }
         try {

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionOperation.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionOperation.java?rev=1503737&r1=1503736&r2=1503737&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionOperation.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionOperation.java Tue Jul 16 14:48:00 2013
@@ -43,6 +43,14 @@ public abstract class SessionOperation<T
         return update;
     }
 
+    /**
+     * Return {@code true} if this operation refreshed the transient space
+     * @return
+     */
+    public boolean isRefresh() {
+        return false;
+    }
+
     protected void checkPreconditions() throws RepositoryException {}
     protected abstract T perform() throws RepositoryException;