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;
}