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


Reply via email to