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 dp...@apache.org on 2012/04/26 11:32:51 UTC

svn commit: r1330732 - in /jackrabbit/oak/trunk/oak-mk/src: main/java/org/apache/jackrabbit/mk/store/DefaultRevisionStore.java test/java/org/apache/jackrabbit/mk/store/DefaultRevisionStoreTest.java

Author: dpfister
Date: Thu Apr 26 09:32:51 2012
New Revision: 1330732

URL: http://svn.apache.org/viewvc?rev=1330732&view=rev
Log:
GC for revisions
- support branch & merge (WiP)

Modified:
    jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/store/DefaultRevisionStore.java
    jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/store/DefaultRevisionStoreTest.java

Modified: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/store/DefaultRevisionStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/store/DefaultRevisionStore.java?rev=1330732&r1=1330731&r2=1330732&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/store/DefaultRevisionStore.java (original)
+++ jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/store/DefaultRevisionStore.java Thu Apr 26 09:32:51 2012
@@ -62,8 +62,8 @@ public class DefaultRevisionStore extend
     private final Persistence pm;
     protected final GCPersistence gcpm;
 
-    /* avoid synthetic accessor */int initialCacheSize;
-    /* avoid synthetic accessor */Map<Id, Object> cache;
+    /* avoid synthetic accessor */ int initialCacheSize;
+    /* avoid synthetic accessor */ Map<Id, Object> cache;
 
     /**
      * GC run state constants.
@@ -467,28 +467,10 @@ public class DefaultRevisionStore extend
             return;
         }
 
-        // Mark all nodes that belong to currently active puts
-        markLock.writeLock().lock();
-
         try {
-            gcpm.start();
-            gcState.set(MARKING);
-
-            for (PutTokenImpl token : putTokens.keySet()) {
-                markNode(token.getLastModified());
-            }
-
-        } catch (Exception e) {
-            /* unable to perform GC */
-            gcState.set(NOT_ACTIVE);
-            e.printStackTrace();
-            return;
-        } finally {
-            markLock.writeLock().unlock();
-        }
-
-        try {
-            doMark();
+            markUncommittedPuts();
+            markBranches();
+            markCommits();
         } catch (Exception e) {
             /* unable to perform GC */
             gcState.set(NOT_ACTIVE);
@@ -506,8 +488,39 @@ public class DefaultRevisionStore extend
             gcState.set(NOT_ACTIVE);
         }
     }
+    
+    /**
+     * Mark uncommitted puts.
+     * 
+     * @throws Exception
+     *             if an error occurs
+     */
+    private void markUncommittedPuts() throws Exception {
+        markLock.writeLock().lock();
+
+        try {
+            gcpm.start();
+            gcState.set(MARKING);
+
+            for (PutTokenImpl token : putTokens.keySet()) {
+                markNode(token.getLastModified());
+            }
+        } finally {
+            markLock.writeLock().unlock();
+        }
+    }
 
     /**
+     * Mark branches.
+     * 
+     * @throws Exception
+     *             if an error occurs
+     */
+    private void markBranches() throws Exception {
+        // TODO
+    }
+    
+    /**
      * Mark all commits and nodes in a garbage collection cycle. Can be
      * customized by subclasses. If this method throws an exception, the cycle
      * will be stopped without sweeping.
@@ -515,7 +528,7 @@ public class DefaultRevisionStore extend
      * @throws Exception
      *             if an error occurs
      */
-    protected void doMark() throws Exception {
+    protected void markCommits() throws Exception {
         StoredCommit commit = getHeadCommit();
         long tsLimit = commit.getCommitTS() - (60 * 60 * 1000);
 

Modified: jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/store/DefaultRevisionStoreTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/store/DefaultRevisionStoreTest.java?rev=1330732&r1=1330731&r2=1330732&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/store/DefaultRevisionStoreTest.java (original)
+++ jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/store/DefaultRevisionStoreTest.java Thu Apr 26 09:32:51 2012
@@ -34,6 +34,7 @@ import org.apache.jackrabbit.mk.persiste
 import org.apache.jackrabbit.mk.persistence.InMemPersistence;
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 
 /**
@@ -48,7 +49,7 @@ public class DefaultRevisionStoreTest {
     public void setup() throws Exception {
         rs = new DefaultRevisionStore(createPersistence()) {
             @Override
-            protected void doMark() throws Exception {
+            protected void markCommits() throws Exception {
                 StoredCommit commit = getHeadCommit();
                 
                 // Keep head commit only
@@ -100,6 +101,26 @@ public class DefaultRevisionStoreTest {
     }
 
     /**
+     * Verify branch and merge works with garbage collection.
+     * 
+     * @throws Exception if an error occurs
+     */
+    @Ignore
+    @Test
+    public void testBranchMerge() throws Exception {
+        mk.commit("/", "+\"a\" : { \"b\":{}, \"c\":{} }", mk.getHeadRevision(), null);
+        String branchRevisionId = mk.branch(mk.getHeadRevision());
+
+        mk.commit("/a", "+\"d\" : {}", mk.getHeadRevision(), null);
+        branchRevisionId = mk.commit("/a", "+\"e\" : {}", branchRevisionId, null);
+        
+        rs.gc();
+
+        branchRevisionId = mk.commit("/a", "+\"f\" : {}", branchRevisionId, null);
+        mk.merge(branchRevisionId, null);
+    }
+    
+    /**
      * Verify garbage collection can run concurrently with commits.
      * 
      * @throws Exception if an error occurs