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) {