Index: oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/RepositoryManagementMBean.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/RepositoryManagementMBean.java (date 1432934056000) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/RepositoryManagementMBean.java (date 1430224439000) @@ -205,4 +205,6 @@ @Nonnull CompositeData getPropertyIndexAsyncReindexStatus(); + CompositeData refreshAllSessions(); + } Index: oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/SessionMBean.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/SessionMBean.java (date 1432934056000) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/SessionMBean.java (date 1430224439000) @@ -121,4 +121,6 @@ * @return stack trace of the last exception that occurred during a save operation */ String getLastFailedSave(); + + void refresh(); } Index: oak-core/src/main/java/org/apache/jackrabbit/oak/management/RepositoryManager.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/management/RepositoryManager.java (date 1432934056000) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/management/RepositoryManager.java (date 1430224439000) @@ -33,6 +33,7 @@ import com.google.common.base.Function; import org.apache.jackrabbit.oak.api.jmx.RepositoryManagementMBean; +import org.apache.jackrabbit.oak.api.jmx.SessionMBean; import org.apache.jackrabbit.oak.commons.jmx.AnnotatedStandardMBean; import org.apache.jackrabbit.oak.plugins.backup.FileStoreBackupRestoreMBean; import org.apache.jackrabbit.oak.plugins.blob.BlobGCMBean; @@ -80,6 +81,18 @@ } } + private Status executeAll(Class serviceType, Function operation) { + Tracker tracker = whiteboard.track(serviceType); + try { + for (T service : tracker.getServices()) { + operation.apply(service); + } + return succeeded("OK"); // TODO OAK-2954 return composite status + } finally { + tracker.stop(); + } + } + @Override public CompositeData startBackup() { return execute(FileStoreBackupRestoreMBean.class, new Function() { @@ -210,4 +223,13 @@ }).toCompositeData(); } + @Override + public CompositeData refreshAllSessions() { + return executeAll(SessionMBean.class, new Function() { + public Status apply(SessionMBean sessionMBean) { + sessionMBean.refresh(); + return succeeded("OK"); + } + }) .toCompositeData(); + } } Index: oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionDelegate.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionDelegate.java (date 1432934056000) +++ oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionDelegate.java (date 1430224439000) @@ -141,7 +141,7 @@ this.idManager = new IdentifierManager(root); this.clock = checkNotNull(clock); this.sessionStats = new SessionStats(contentSession.toString(), - contentSession.getAuthInfo(), clock, refreshStrategy); + contentSession.getAuthInfo(), clock, refreshStrategy, this); this.sessionCounters = sessionStats.getCounters(); checkNotNull(statisticManager); readCounter = statisticManager.getCounter(SESSION_READ_COUNTER); @@ -391,6 +391,7 @@ isAlive = false; // TODO + sessionStats.close(); try { contentSession.close(); } catch (IOException e) { Index: oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionStats.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionStats.java (date 1432934056000) +++ oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionStats.java (date 1430224439000) @@ -34,6 +34,8 @@ import org.apache.jackrabbit.oak.api.AuthInfo; import org.apache.jackrabbit.oak.api.jmx.SessionMBean; +import org.apache.jackrabbit.oak.jcr.delegate.SessionDelegate; +import org.apache.jackrabbit.oak.jcr.session.operation.SessionOperation; import org.apache.jackrabbit.oak.stats.Clock; public class SessionStats implements SessionMBean { @@ -48,16 +50,23 @@ private final Clock clock; private final RefreshStrategy refreshStrategy; + private volatile SessionDelegate sessionDelegate; + private Map attributes = Collections.emptyMap(); - public SessionStats(String sessionId, AuthInfo authInfo, Clock clock, RefreshStrategy refreshStrategy) { + public SessionStats(String sessionId, AuthInfo authInfo, Clock clock, RefreshStrategy refreshStrategy, SessionDelegate sessionDelegate) { this.counters = new Counters(clock); this.sessionId = sessionId; this.authInfo = authInfo; this.clock = clock; this.refreshStrategy = refreshStrategy; + this.sessionDelegate = sessionDelegate; } + public void close() { + sessionDelegate = null; + } + public static class Counters { private final Clock clock; private final long loginTime; @@ -245,6 +254,26 @@ @Override public String getLastFailedSave() { return format(lastFailedSave.get()); + } + + @Override + public void refresh() { + final SessionDelegate sd = sessionDelegate; + if (sd != null) { + sd.safePerform(new SessionOperation("MBean initiated refresh", true) { + @Override + public Void perform() { + sd.refresh(true); + return null; + } + + @Override + public void checkPreconditions() throws RepositoryException { + sd.checkAlive(); + } + }); + sd.refresh(true); + } } //------------------------------------------------------------< internal >---