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 ju...@apache.org on 2013/07/02 18:13:16 UTC

svn commit: r1498995 - in /jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr: ItemImpl.java SessionImpl.java delegate/SessionDelegate.java delegate/SessionOperation.java version/VersionManagerImpl.java

Author: jukka
Date: Tue Jul  2 16:13:15 2013
New Revision: 1498995

URL: http://svn.apache.org/r1498995
Log:
OAK-663: oak-jcr performance optimization

Only check for staleness after there has been some transient or persisted update

Modified:
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/ItemImpl.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.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/delegate/SessionOperation.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/VersionManagerImpl.java

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/ItemImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/ItemImpl.java?rev=1498995&r1=1498994&r2=1498995&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/ItemImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/ItemImpl.java Tue Jul  2 16:13:15 2013
@@ -67,10 +67,13 @@ abstract class ItemImpl<T extends ItemDe
     protected final T dlg;
     protected final SessionDelegate sessionDelegate;
 
+    private long updateCount;
+
     protected ItemImpl(T itemDelegate, SessionContext sessionContext) {
         this.sessionContext = sessionContext;
         this.dlg = itemDelegate;
         this.sessionDelegate = sessionContext.getSessionDelegate();
+        this.updateCount = sessionDelegate.getUpdateCount();
     }
 
     protected abstract class ItemReadOperation<U> extends SessionOperation<U> {
@@ -81,6 +84,9 @@ abstract class ItemImpl<T extends ItemDe
     }
 
     protected abstract class ItemWriteOperation<U> extends SessionOperation<U> {
+        protected ItemWriteOperation() {
+            super(true);
+        }
         @Override
         protected void checkPreconditions() throws RepositoryException {
             checkAlive();
@@ -274,9 +280,13 @@ abstract class ItemImpl<T extends ItemDe
      * @throws RepositoryException if this item has been rendered invalid for some reason
      * or the associated session has been logged out.
      */
-    void checkAlive() throws RepositoryException {
+    synchronized void checkAlive() throws RepositoryException {
         sessionDelegate.checkAlive();
-        dlg.checkNotStale();
+        long count = sessionDelegate.getUpdateCount();
+        if (updateCount != count) {
+            dlg.checkNotStale();
+            updateCount = count;
+        }
     }
 
     void checkProtected() throws RepositoryException {

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java?rev=1498995&r1=1498994&r2=1498995&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java Tue Jul  2 16:13:15 2013
@@ -92,15 +92,26 @@ public class SessionImpl implements Jack
         }
     }
 
-    private abstract class CheckedSessionOperation<T> extends SessionOperation<T> {
+    private abstract class ReadOperation<T> extends SessionOperation<T> {
         @Override
         protected void checkPreconditions() throws RepositoryException {
             sd.checkAlive();
         }
     }
 
+    private abstract class WriteOperation<T> extends SessionOperation<T> {
+        @Override
+        protected void checkPreconditions() throws RepositoryException {
+            sd.checkAlive();
+        }
+        @Override
+        public boolean isUpdate() {
+            return true;
+        }
+    }
+
     @CheckForNull
-    private <T> T perform(@Nonnull CheckedSessionOperation<T> op) throws RepositoryException {
+    private <T> T perform(@Nonnull SessionOperation<T> op) throws RepositoryException {
         return sd.perform(op);
     }
 
@@ -146,7 +157,7 @@ public class SessionImpl implements Jack
      */
     @CheckForNull
     public Node getNodeOrNull(final String absPath) throws RepositoryException {
-        return perform(new CheckedSessionOperation<Node>() {
+        return perform(new ReadOperation<Node>() {
             @Override
             public Node perform() throws RepositoryException {
                 return sessionContext.createNodeOrNull(sd.getNode(getOakPathOrThrow(absPath)));
@@ -167,7 +178,7 @@ public class SessionImpl implements Jack
         if (absPath.equals("/")) {
             return null;
         } else {
-            return perform(new CheckedSessionOperation<Property>() {
+            return perform(new ReadOperation<Property>() {
                 @Override
                 public Property perform() throws RepositoryException {
                     return createPropertyOrNull(sd.getProperty(getOakPathOrThrow(absPath)));
@@ -187,7 +198,7 @@ public class SessionImpl implements Jack
      */
     @CheckForNull
     public Item getItemOrNull(final String absPath) throws RepositoryException {
-        return perform(new CheckedSessionOperation<Item>() {
+        return perform(new ReadOperation<Item>() {
             @Override
             public Item perform() throws RepositoryException {
                 return getItemInternal(getOakPathOrThrow(absPath));
@@ -243,7 +254,7 @@ public class SessionImpl implements Jack
     @Override
     @Nonnull
     public Node getRootNode() throws RepositoryException {
-        return perform(new CheckedSessionOperation<Node>() {
+        return perform(new ReadOperation<Node>() {
             @Override
             protected Node perform() throws AccessDeniedException, RepositoryException {
                 NodeDelegate nd = sd.getRootNode();
@@ -271,7 +282,7 @@ public class SessionImpl implements Jack
 
     @Nonnull
     private Node getNodeById(final String id) throws RepositoryException {
-        return perform(new CheckedSessionOperation<Node>() {
+        return perform(new ReadOperation<Node>() {
             @Override
             public Node perform() throws ItemNotFoundException, RepositoryException {
                 NodeDelegate nd = sd.getNodeByIdentifier(id);
@@ -325,7 +336,7 @@ public class SessionImpl implements Jack
 
     @Override
     public void move(final String srcAbsPath, final String destAbsPath) throws RepositoryException {
-        sd.perform(new CheckedSessionOperation<Void>() {
+        sd.perform(new WriteOperation<Void>() {
             @Override
             protected void checkPreconditions() throws RepositoryException {
                 super.checkPreconditions();
@@ -347,7 +358,7 @@ public class SessionImpl implements Jack
 
     @Override
     public void removeItem(final String absPath) throws RepositoryException {
-        perform(new CheckedSessionOperation<Void>() {
+        perform(new WriteOperation<Void>() {
             @Override
             protected Void perform() throws RepositoryException {
                 String oakPath = getOakPathOrThrowNotFound(absPath);
@@ -365,7 +376,7 @@ public class SessionImpl implements Jack
 
     @Override
     public void save() throws RepositoryException {
-        perform(new CheckedSessionOperation<Void>() {
+        perform(new WriteOperation<Void>() {
             @Override
             protected Void perform() throws RepositoryException {
                 sd.save();
@@ -377,7 +388,7 @@ public class SessionImpl implements Jack
 
     @Override
     public void refresh(final boolean keepChanges) throws RepositoryException {
-        perform(new CheckedSessionOperation<Void>() {
+        perform(new WriteOperation<Void>() {
             @Override
             protected Void perform() throws RepositoryException {
                 sd.refresh(keepChanges);
@@ -548,7 +559,7 @@ public class SessionImpl implements Jack
 
     @Override
     public boolean hasPermission(final String absPath, final String actions) throws RepositoryException {
-        return perform(new CheckedSessionOperation<Boolean>() {
+        return perform(new ReadOperation<Boolean>() {
             @Override
             protected Boolean perform() throws RepositoryException {
                 String oakPath = getOakPathOrThrow(absPath);

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=1498995&r1=1498994&r2=1498995&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 Tue Jul  2 16:13:15 2013
@@ -64,6 +64,7 @@ public class SessionDelegate {
 
     private boolean isAlive = true;
     private int sessionOpCount;
+    private long updateCount = 0;
 
     private long lastAccessed = System.currentTimeMillis();
 
@@ -73,7 +74,7 @@ public class SessionDelegate {
         this.idManager = new IdentifierManager(root);
     }
 
-    public void refreshAtNextAccess() {
+    public synchronized void refreshAtNextAccess() {
         lastAccessed = -1;
     }
 
@@ -96,6 +97,7 @@ public class SessionDelegate {
             long now = System.currentTimeMillis();
             if (now > lastAccessed + AUTO_REFRESH_INTERVAL) {
                 refresh(true);
+                updateCount++;
             }
             lastAccessed = now;
 
@@ -106,6 +108,9 @@ public class SessionDelegate {
             return sessionOperation.perform();
         } finally {
             sessionOpCount--;
+            if (sessionOperation.isUpdate()) {
+                updateCount++;
+            }
         }
     }
 
@@ -134,6 +139,14 @@ public class SessionDelegate {
         }
     }
 
+    /**
+     * @return session update counter
+     */
+    public long getUpdateCount() {
+        return updateCount;
+    }
+
+
     @Nonnull
     public AuthInfo getAuthInfo() {
         return contentSession.getAuthInfo();

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionOperation.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionOperation.java?rev=1498995&r1=1498994&r2=1498995&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionOperation.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionOperation.java Tue Jul  2 16:13:15 2013
@@ -24,6 +24,26 @@ import javax.jcr.RepositoryException;
  * A {@code SessionOperation} provides an execution context for executing session scoped operations.
  */
 public abstract class SessionOperation<T> {
+
+    private final boolean update;
+
+    protected SessionOperation(boolean update) {
+        this.update = update;
+    }
+
+    protected SessionOperation() {
+        this(false);
+    }
+
+    /**
+     * Returns {@code true} if this operation updates the the transient
+     * @return
+     */
+    public boolean isUpdate() {
+        return update;
+    }
+
     protected void checkPreconditions() throws RepositoryException {}
     protected abstract T perform() throws RepositoryException;
+
 }

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/VersionManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/VersionManagerImpl.java?rev=1498995&r1=1498994&r2=1498995&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/VersionManagerImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/VersionManagerImpl.java Tue Jul  2 16:13:15 2013
@@ -81,7 +81,7 @@ public class VersionManagerImpl implemen
                         final boolean removeExisting)
             throws RepositoryException {
         final SessionDelegate sessionDelegate = sessionContext.getSessionDelegate();
-        sessionDelegate.perform(new SessionOperation<Void>() {
+        sessionDelegate.perform(new SessionOperation<Void>(true) {
             @Override
             public Void perform() throws RepositoryException {
                 String oakPath = getOakPathOrThrowNotFound(absPath);
@@ -169,7 +169,7 @@ public class VersionManagerImpl implemen
             throw new VersionException("Restore of root version not possible");
         }
         final SessionDelegate sessionDelegate = sessionContext.getSessionDelegate();
-        sessionDelegate.perform(new SessionOperation<Void>() {
+        sessionDelegate.perform(new SessionOperation<Void>(true) {
             @Override
             public Void perform() throws RepositoryException {
                 // check for pending changes
@@ -332,7 +332,7 @@ public class VersionManagerImpl implemen
     @Override
     public void checkout(final String absPath) throws RepositoryException {
         final SessionDelegate sessionDelegate = sessionContext.getSessionDelegate();
-        sessionDelegate.perform(new SessionOperation<Void>() {
+        sessionDelegate.perform(new SessionOperation<Void>(true) {
             @Override
             public Void perform() throws RepositoryException {
                 String oakPath = getOakPathOrThrowNotFound(absPath);
@@ -350,7 +350,7 @@ public class VersionManagerImpl implemen
     @Override
     public Version checkin(final String absPath) throws RepositoryException {
         final SessionDelegate sessionDelegate = sessionContext.getSessionDelegate();
-        return sessionDelegate.perform(new SessionOperation<Version>() {
+        return sessionDelegate.perform(new SessionOperation<Version>(true) {
             @Override
             public Version perform() throws RepositoryException {
                 String oakPath = getOakPathOrThrowNotFound(absPath);