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 2015/06/03 18:36:03 UTC

svn commit: r1683389 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/ oak-core/src/main/java/org/apache/jackrabbit/oak/management/ oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/ oak-jcr/src/main/java/...

Author: mduerig
Date: Wed Jun  3 16:36:03 2015
New Revision: 1683389

URL: http://svn.apache.org/r1683389
Log:
OAK-2954: Add MBean to enforce session refresh on all open sessions
Add refresh method to SessionMBean and refreshAllSessions method to RepositoryManagmentMBean

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/RepositoryManagementMBean.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/SessionMBean.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/management/ManagementOperation.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/management/RepositoryManager.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/session/SessionStats.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/RepositoryManagementMBean.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/RepositoryManagementMBean.java?rev=1683389&r1=1683388&r2=1683389&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/RepositoryManagementMBean.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/RepositoryManagementMBean.java Wed Jun  3 16:36:03 2015
@@ -22,6 +22,7 @@ package org.apache.jackrabbit.oak.api.jm
 import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
 import javax.management.openmbean.CompositeData;
+import javax.management.openmbean.TabularData;
 
 import org.apache.jackrabbit.oak.commons.jmx.Description;
 import org.apache.jackrabbit.oak.commons.jmx.Name;
@@ -205,4 +206,11 @@ public interface RepositoryManagementMBe
     @Nonnull
     CompositeData getPropertyIndexAsyncReindexStatus();
 
+    /**
+     * Refresh all currently open sessions.
+     * <em>Warning</em>: this operation might be disruptive to the owner of the affected sessions
+     */
+    @Nonnull
+    TabularData refreshAllSessions();
+
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/SessionMBean.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/SessionMBean.java?rev=1683389&r1=1683388&r2=1683389&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/SessionMBean.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/SessionMBean.java Wed Jun  3 16:36:03 2015
@@ -121,4 +121,10 @@ public interface SessionMBean {
      * @return  stack trace of the last exception that occurred during a save operation
      */
     String getLastFailedSave();
+
+    /**
+     * Refresh this session.
+     * <em>Warning</em>: this operation might be disruptive to the owner of this session
+     */
+    void refresh();
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/management/ManagementOperation.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/management/ManagementOperation.java?rev=1683389&r1=1683388&r2=1683389&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/management/ManagementOperation.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/management/ManagementOperation.java Wed Jun  3 16:36:03 2015
@@ -22,12 +22,12 @@ package org.apache.jackrabbit.oak.manage
 import static com.google.common.base.Objects.toStringHelper;
 import static java.lang.Thread.currentThread;
 import static java.util.concurrent.TimeUnit.DAYS;
-import static java.util.concurrent.TimeUnit.NANOSECONDS;
 import static java.util.concurrent.TimeUnit.HOURS;
+import static java.util.concurrent.TimeUnit.MICROSECONDS;
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
 import static java.util.concurrent.TimeUnit.MINUTES;
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
 import static java.util.concurrent.TimeUnit.SECONDS;
-import static java.util.concurrent.TimeUnit.MILLISECONDS;
-import static java.util.concurrent.TimeUnit.MICROSECONDS;
 import static javax.management.openmbean.SimpleType.INTEGER;
 import static javax.management.openmbean.SimpleType.STRING;
 import static org.apache.jackrabbit.oak.api.jmx.RepositoryManagementMBean.StatusCode;
@@ -53,6 +53,9 @@ import javax.management.openmbean.Compos
 import javax.management.openmbean.CompositeType;
 import javax.management.openmbean.OpenDataException;
 import javax.management.openmbean.OpenType;
+import javax.management.openmbean.TabularData;
+import javax.management.openmbean.TabularDataSupport;
+import javax.management.openmbean.TabularType;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -375,6 +378,21 @@ public class ManagementOperation<R> exte
             } catch (OpenDataException e) {
                 // should never happen
                 throw new IllegalStateException(e);
+            }
+        }
+
+        public static TabularData toTabularData(Iterable<Status> statuses) {
+            try {
+                TabularDataSupport tab = new TabularDataSupport(
+                    new TabularType("Statuses", "List of statuses", ITEM_TYPES, new String[] {ITEM_ID}));
+
+                for (Status status : statuses) {
+                    tab.put(status.toCompositeData());
+                }
+                return tab;
+            } catch (OpenDataException e) {
+                // should never happen
+                throw new IllegalStateException(e);
             }
         }
 

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/management/RepositoryManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/management/RepositoryManager.java?rev=1683389&r1=1683388&r2=1683389&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/management/RepositoryManager.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/management/RepositoryManager.java Wed Jun  3 16:36:03 2015
@@ -20,19 +20,23 @@
 package org.apache.jackrabbit.oak.management;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.collect.Lists.newArrayList;
 import static org.apache.jackrabbit.oak.management.ManagementOperation.Status;
 import static org.apache.jackrabbit.oak.management.ManagementOperation.Status.failed;
 import static org.apache.jackrabbit.oak.management.ManagementOperation.Status.fromCompositeData;
 import static org.apache.jackrabbit.oak.management.ManagementOperation.Status.succeeded;
+import static org.apache.jackrabbit.oak.management.ManagementOperation.Status.toTabularData;
 import static org.apache.jackrabbit.oak.management.ManagementOperation.Status.unavailable;
 
 import java.util.List;
 
 import javax.annotation.Nonnull;
 import javax.management.openmbean.CompositeData;
+import javax.management.openmbean.TabularData;
 
 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 +84,19 @@ public class RepositoryManager extends A
         }
     }
 
+    private <T> Iterable<Status> executeAll(Class<T> serviceType, Function<T, Status> operation) {
+        Tracker<T> tracker = whiteboard.track(serviceType);
+        List<Status> statuses = newArrayList();
+        try {
+            for (T service : tracker.getServices()) {
+                statuses.add(operation.apply(service));
+            }
+            return statuses;
+        } finally {
+            tracker.stop();
+        }
+    }
+
     @Override
     public CompositeData startBackup() {
         return execute(FileStoreBackupRestoreMBean.class, new Function<FileStoreBackupRestoreMBean, Status>() {
@@ -210,4 +227,14 @@ public class RepositoryManager extends A
                 }).toCompositeData();
     }
 
+    @Override
+    public TabularData refreshAllSessions() {
+        return toTabularData(executeAll(SessionMBean.class, new Function<SessionMBean, Status>() {
+            @Override
+            public Status apply(SessionMBean sessionMBean) {
+                sessionMBean.refresh();
+                return succeeded("OK");
+            }
+        }));
+    }
 }

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=1683389&r1=1683388&r2=1683389&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 Wed Jun  3 16:36:03 2015
@@ -141,7 +141,7 @@ public class SessionDelegate {
         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 @@ public class SessionDelegate {
         isAlive = false;
         // TODO
 
+        sessionStats.close();
         try {
             contentSession.close();
         } catch (IOException e) {

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionStats.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionStats.java?rev=1683389&r1=1683388&r2=1683389&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionStats.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionStats.java Wed Jun  3 16:36:03 2015
@@ -34,6 +34,8 @@ import javax.jcr.RepositoryException;
 
 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,14 +50,22 @@ public class SessionStats implements Ses
     private final Clock clock;
     private final RefreshStrategy refreshStrategy;
 
+    private volatile SessionDelegate sessionDelegate;
+
     private Map<String, Object> 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 {
@@ -247,6 +257,26 @@ public class SessionStats implements Ses
         return format(lastFailedSave.get());
     }
 
+    @Override
+    public void refresh() {
+        final SessionDelegate sd = sessionDelegate;
+        if (sd != null) {
+            sd.safePerform(new SessionOperation<Void>("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 >---
 
     private static String formatDate(Date date) {