Author: jukka
Date: Fri Feb 28 20:52:58 2014
New Revision: 1573075
URL: http://svn.apache.org/r1573075
Log:
OAK-1418: Read performance regression
Optimize the call path to ContentSessionImpl.checkLive() by turning
AbstractRoot to MutableRoot with a concrete reference to
ContentSessionImpl. This avoids some extra levels of indirection.
Added:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MutableRoot.java
(contents, props changed)
- copied, changed from r1573042,
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/AbstractRoot.java
Removed:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/AbstractRoot.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentSessionImpl.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ImmutableRoot.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MutableTree.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/SystemRoot.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentSessionImpl.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentSessionImpl.java?rev=1573075&r1=1573074&r2=1573075&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentSessionImpl.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentSessionImpl.java
Fri Feb 28 20:52:58 2014
@@ -56,7 +56,11 @@ class ContentSessionImpl implements Cont
private final QueryIndexProvider indexProvider;
private final String sessionName;
- private volatile boolean live = true;
+ /**
+ * Flag to indicate whether this session is still alive.
+ * Only accessed from synchronized methods.
+ */
+ private boolean live = true;
public ContentSessionImpl(@Nonnull LoginContext loginContext,
@Nonnull SecurityProvider securityProvider,
@@ -73,7 +77,7 @@ class ContentSessionImpl implements Cont
this.sessionName = "session-" + SESSION_COUNTER.incrementAndGet();
}
- private void checkLive() {
+ synchronized void checkLive() {
checkState(live, "This session has been closed");
}
@@ -99,26 +103,16 @@ class ContentSessionImpl implements Cont
@Override
public Root getLatestRoot() {
checkLive();
- return new AbstractRoot(store, hook, workspaceName,
loginContext.getSubject(),
- securityProvider, indexProvider) {
- @Override
- protected void checkLive() {
- ContentSessionImpl.this.checkLive();
- }
-
- @Override
- public ContentSession getContentSession() {
- return ContentSessionImpl.this;
- }
- };
+ return new MutableRoot(store, hook, workspaceName,
loginContext.getSubject(),
+ securityProvider, indexProvider, this);
}
//-----------------------------------------------------------< Closable
>---
@Override
public synchronized void close() throws IOException {
+ live = false;
try {
loginContext.logout();
- live = false;
} catch (LoginException e) {
log.error("Error during logout.", e);
}
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ImmutableRoot.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ImmutableRoot.java?rev=1573075&r1=1573074&r2=1573075&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ImmutableRoot.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ImmutableRoot.java
Fri Feb 28 20:52:58 2014
@@ -52,8 +52,8 @@ public final class ImmutableRoot impleme
}
public ImmutableRoot(@Nonnull Root root) {
- if (root instanceof AbstractRoot) {
- rootTree = new ImmutableTree(((AbstractRoot) root).getBaseState());
+ if (root instanceof MutableRoot) {
+ rootTree = new ImmutableTree(((MutableRoot) root).getBaseState());
} else if (root instanceof ImmutableRoot) {
rootTree = ((ImmutableRoot) root).getTree("/");
} else {
Copied:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MutableRoot.java
(from r1573042,
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/AbstractRoot.java)
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MutableRoot.java?p2=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MutableRoot.java&p1=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/AbstractRoot.java&r1=1573042&r2=1573075&rev=1573075&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/AbstractRoot.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MutableRoot.java
Fri Feb 28 20:52:58 2014
@@ -63,7 +63,7 @@ import org.apache.jackrabbit.oak.spi.sta
import org.apache.jackrabbit.oak.spi.state.NodeState;
import org.apache.jackrabbit.oak.spi.state.NodeStore;
-abstract class AbstractRoot implements Root {
+class MutableRoot implements Root {
/**
* The underlying store to which this root belongs
@@ -80,6 +80,8 @@ abstract class AbstractRoot implements R
private final QueryIndexProvider indexProvider;
+ private final ContentSessionImpl session;
+
/**
* Current root {@code Tree}
*/
@@ -120,7 +122,7 @@ abstract class AbstractRoot implements R
@Override
protected PermissionProvider createValue() {
return getAcConfig().getPermissionProvider(
- AbstractRoot.this,
+ MutableRoot.this,
getContentSession().getWorkspaceName(),
subject.getPrincipals());
}
@@ -136,37 +138,44 @@ abstract class AbstractRoot implements R
* @param securityProvider the security configuration.
* @param indexProvider the query index provider.
*/
- AbstractRoot(NodeStore store,
+ MutableRoot(NodeStore store,
CommitHook hook,
String workspaceName,
Subject subject,
SecurityProvider securityProvider,
- QueryIndexProvider indexProvider) {
+ QueryIndexProvider indexProvider,
+ ContentSessionImpl session) {
this.store = checkNotNull(store);
this.hook = checkNotNull(hook);
this.workspaceName = checkNotNull(workspaceName);
this.subject = checkNotNull(subject);
this.securityProvider = checkNotNull(securityProvider);
this.indexProvider = indexProvider;
+ this.session = checkNotNull(session);
builder = store.getRoot().builder();
secureBuilder = new SecureNodeBuilder(builder, permissionProvider,
getAcContext());
rootTree = new MutableTree(this, secureBuilder, lastMove);
}
-
+
/**
* Called whenever a method on this instance or on any {@code Tree}
instance
- * obtained from this {@code Root} is called. This default implementation
- * does nothing. Sub classes may override this method and throw an
exception
- * indicating that this {@code Root} instance is not live anymore (e.g.
because
- * the session has been logged out already).
+ * obtained from this {@code Root} is called. Throws an exception if this
+ * {@code Root} instance is not live anymore (e.g. because the session has
+ * been logged out already).
*/
- protected void checkLive() {
+ void checkLive() {
+ session.checkLive();
}
//---------------------------------------------------------------< Root
>---
@Override
+ public ContentSession getContentSession() {
+ return session;
+ }
+
+ @Override
public boolean move(String sourcePath, String destPath) {
if (isAncestor(checkNotNull(sourcePath), checkNotNull(destPath))) {
return false;
@@ -302,7 +311,7 @@ abstract class AbstractRoot implements R
provider, getBaseState(), getRootState());
}
return new ExecutionContext(
- getBaseState(), AbstractRoot.this, provider);
+ getBaseState(), MutableRoot.this, provider);
}
};
}
Propchange:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MutableRoot.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MutableRoot.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev URL
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MutableTree.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MutableTree.java?rev=1573075&r1=1573074&r2=1573075&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MutableTree.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MutableTree.java
Fri Feb 28 20:52:58 2014
@@ -40,7 +40,7 @@ import com.google.common.collect.Sets;
import org.apache.jackrabbit.oak.api.PropertyState;
import org.apache.jackrabbit.oak.api.Tree;
import org.apache.jackrabbit.oak.api.Type;
-import org.apache.jackrabbit.oak.core.AbstractRoot.Move;
+import org.apache.jackrabbit.oak.core.MutableRoot.Move;
import org.apache.jackrabbit.oak.plugins.memory.MultiGenericPropertyState;
import org.apache.jackrabbit.oak.plugins.memory.PropertyBuilder;
import org.apache.jackrabbit.oak.plugins.tree.AbstractTree;
@@ -52,7 +52,7 @@ class MutableTree extends AbstractTree {
/**
* Underlying {@code Root} of this {@code Tree} instance
*/
- private final AbstractRoot root;
+ private final MutableRoot root;
/**
* Parent of this tree. Null for the root.
@@ -62,13 +62,13 @@ class MutableTree extends AbstractTree {
/** Pointer into the list of pending moves */
private Move pendingMoves;
- MutableTree(AbstractRoot root, NodeBuilder builder, Move pendingMoves) {
+ MutableTree(MutableRoot root, NodeBuilder builder, Move pendingMoves) {
super("", builder);
this.root = checkNotNull(root);
this.pendingMoves = checkNotNull(pendingMoves);
}
- private MutableTree(AbstractRoot root, MutableTree parent, String name,
Move pendingMoves) {
+ private MutableTree(MutableRoot root, MutableTree parent, String name,
Move pendingMoves) {
super(name, parent.nodeBuilder.getChildNode(name));
this.root = checkNotNull(root);
this.parent = checkNotNull(parent);
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/SystemRoot.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/SystemRoot.java?rev=1573075&r1=1573074&r2=1573075&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/SystemRoot.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/SystemRoot.java
Fri Feb 28 20:52:58 2014
@@ -16,9 +16,9 @@
*/
package org.apache.jackrabbit.oak.core;
+import javax.security.auth.Subject;
+
import org.apache.jackrabbit.oak.Oak;
-import org.apache.jackrabbit.oak.api.AuthInfo;
-import org.apache.jackrabbit.oak.api.ContentSession;
import org.apache.jackrabbit.oak.api.Root;
import org.apache.jackrabbit.oak.spi.commit.CommitHook;
import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
@@ -26,45 +26,50 @@ import org.apache.jackrabbit.oak.spi.que
import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider;
import org.apache.jackrabbit.oak.spi.security.OpenSecurityProvider;
import org.apache.jackrabbit.oak.spi.security.SecurityProvider;
-import org.apache.jackrabbit.oak.spi.security.authentication.AuthInfoImpl;
+import org.apache.jackrabbit.oak.spi.security.authentication.LoginContext;
import org.apache.jackrabbit.oak.spi.security.authentication.SystemSubject;
import org.apache.jackrabbit.oak.spi.state.NodeStore;
/**
- * Internal extension of the {@link AbstractRoot} to be used
+ * Internal extension of the {@link MutableRoot} to be used
* when an usage of the system internal subject is needed.
*/
-public class SystemRoot extends AbstractRoot {
- private final ContentSession contentSession;
+public class SystemRoot extends MutableRoot {
+
+ private static final LoginContext LOGIN_CONTEXT = new LoginContext() {
+ @Override
+ public Subject getSubject() {
+ return SystemSubject.INSTANCE;
+ }
+ @Override
+ public void login() {
+ }
+ @Override
+ public void logout() {
+ }
+ };
+
+ private SystemRoot(
+ NodeStore store, CommitHook hook, String workspaceName,
+ SecurityProvider securityProvider, QueryIndexProvider
indexProvider,
+ ContentSessionImpl session) {
+ super(store, hook, workspaceName, SystemSubject.INSTANCE,
+ securityProvider, indexProvider, session);
+ }
public SystemRoot(final NodeStore store, final CommitHook hook, final
String workspaceName,
final SecurityProvider securityProvider, final QueryIndexProvider
indexProvider) {
-
- super(store, hook, workspaceName, SystemSubject.INSTANCE,
securityProvider, indexProvider);
-
- contentSession = new ContentSession() {
- private final AuthInfoImpl authInfo = new AuthInfoImpl(
- null, null, SystemSubject.INSTANCE.getPrincipals());
-
- @Override
- public void close() {
- }
-
- @Override
- public String getWorkspaceName() {
- return workspaceName;
- }
-
- @Override
- public Root getLatestRoot() {
- return new SystemRoot(store, hook, workspaceName,
securityProvider, indexProvider);
- }
-
- @Override
- public AuthInfo getAuthInfo() {
- return authInfo;
- }
- };
+ this(store, hook, workspaceName, securityProvider, indexProvider,
+ new ContentSessionImpl(
+ LOGIN_CONTEXT, securityProvider, workspaceName,
+ store, hook, indexProvider) {
+ @Override
+ public Root getLatestRoot() {
+ return new SystemRoot(
+ store, hook, workspaceName, securityProvider,
+ indexProvider, this);
+ }
+ });
}
public SystemRoot(NodeStore store) {
@@ -77,9 +82,4 @@ public class SystemRoot extends Abstract
new CompositeQueryIndexProvider());
}
- @Override
- public ContentSession getContentSession() {
- return contentSession;
- }
-
}