Author: chetanm
Date: Mon Nov  7 15:23:16 2016
New Revision: 1768531

URL: http://svn.apache.org/viewvc?rev=1768531&view=rev
Log:
OAK-4139 - Idle session warnings for observation sessions

Modified:
    
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java
    
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java
    
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/RefreshStrategy.java
    
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java?rev=1768531&r1=1768530&r2=1768531&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java
 Mon Nov  7 15:23:16 2016
@@ -367,7 +367,7 @@ public class ObservationManagerImpl impl
     }
 
     @Override
-    public EventListenerIterator getRegisteredEventListeners() throws 
RepositoryException {
+    public EventListenerIterator getRegisteredEventListeners() {
         return new EventListenerIteratorAdapter(processors.keySet());
     }
 

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java?rev=1768531&r1=1768530&r2=1768531&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java
 Mon Nov  7 15:23:16 2016
@@ -42,6 +42,7 @@ import javax.jcr.SimpleCredentials;
 import javax.jcr.Value;
 import javax.security.auth.login.LoginException;
 
+import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableMap;
 
 import org.apache.commons.io.IOUtils;
@@ -274,8 +275,9 @@ public class RepositoryImpl implements J
             }
             boolean relaxedLocking = getRelaxedLocking(attributes);
 
+            RefreshPredicate predicate = new RefreshPredicate();
             RefreshStrategy refreshStrategy = refreshInterval == null
-                ? new RefreshStrategy.LogOnce(60)
+                ? new RefreshStrategy.ConditionalRefreshStrategy(new 
RefreshStrategy.LogOnce(60), predicate)
                 : new RefreshStrategy.Timed(refreshInterval);
             ContentSession contentSession = 
contentRepository.login(credentials, workspaceName);
             SessionDelegate sessionDelegate = 
createSessionDelegate(refreshStrategy, contentSession);
@@ -283,6 +285,7 @@ public class RepositoryImpl implements J
                     statisticManager, securityProvider,
                     createAttributes(refreshInterval, relaxedLocking),
                     sessionDelegate, observationQueueLength, 
commitRateLimiter);
+            predicate.setSessionContext(context);
             return context.getSession();
         } catch (LoginException e) {
             throw new javax.jcr.LoginException(e.getMessage(), e);
@@ -506,6 +509,26 @@ public class RepositoryImpl implements J
         }
     }
 
+    /**
+     * Predicate which ensures that refresh strategy is invoked only
+     * if there is no event listeners registered with the session
+     */
+    private static class RefreshPredicate implements Predicate<Long>{
+        private SessionContext sessionContext;
+
+        @Override
+        public boolean apply(@Nullable Long input) {
+            if (sessionContext == null){
+                return true;
+            }
+            return !sessionContext.hasEventListeners();
+        }
+
+        public void setSessionContext(SessionContext sessionContext) {
+            this.sessionContext = sessionContext;
+        }
+    }
+
     private static class RegistrationTask implements Runnable {
         private final SessionStats sessionStats;
         private final Whiteboard whiteboard;

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/RefreshStrategy.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/RefreshStrategy.java?rev=1768531&r1=1768530&r2=1768531&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/RefreshStrategy.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/RefreshStrategy.java
 Mon Nov  7 15:23:16 2016
@@ -25,6 +25,7 @@ import static java.util.concurrent.TimeU
 
 import java.util.ArrayList;
 
+import com.google.common.base.Predicate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -207,4 +208,30 @@ public interface RefreshStrategy {
         }
     }
 
+    /**
+     * This strategy conditionally invokes the delegated strategy based on the 
passed predicate
+     */
+    class ConditionalRefreshStrategy implements RefreshStrategy {
+        private final RefreshStrategy delegate;
+        private final Predicate<Long> condition;
+
+        public ConditionalRefreshStrategy(RefreshStrategy delegate, 
Predicate<Long> condition) {
+            this.delegate = delegate;
+            this.condition = condition;
+        }
+
+        @Override
+        public boolean needsRefresh(long secondsSinceLastAccess) {
+            if (condition.apply(secondsSinceLastAccess)){
+                return delegate.needsRefresh(secondsSinceLastAccess);
+            }
+            return false;
+        }
+
+        @Override
+        public void refreshed() {
+            delegate.refreshed();
+        }
+    }
+
 }

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java?rev=1768531&r1=1768530&r2=1768531&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java
 Mon Nov  7 15:23:16 2016
@@ -295,6 +295,13 @@ public class SessionContext implements N
         return observationManager;
     }
 
+    public boolean hasEventListeners(){
+        if (observationManager != null){
+            return observationManager.getRegisteredEventListeners().hasNext();
+        }
+        return false;
+    }
+
     public Set<String> getOpenScopedLocks() {
         return openScopedLocks;
     }


Reply via email to