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 mr...@apache.org on 2017/03/22 10:56:57 UTC

svn commit: r1788090 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java test/java/org/apache/jackrabbit/oak/plugins/document/NodeDocumentTest.java

Author: mreutegg
Date: Wed Mar 22 10:56:57 2017
New Revision: 1788090

URL: http://svn.apache.org/viewvc?rev=1788090&view=rev
Log:
OAK-3712: Clean up old and uncommitted changes

Introduce sweep revisions

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/NodeDocumentTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java?rev=1788090&r1=1788089&r2=1788090&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java Wed Mar 22 10:56:57 2017
@@ -230,6 +230,14 @@ public final class NodeDocument extends
      */
     private static final String BRANCH_COMMITS = "_bc";
 
+    /**
+     * The revision set by the background document sweeper. The revision
+     * indicates up to which revision documents have been cleaned by the sweeper
+     * and all previous non-branch revisions by this cluster node can be
+     * considered committed.
+     */
+    private static final String SWEEP_REV = "_sweepRev";
+
     //~----------------------------< Split Document Types >
 
     /**
@@ -1699,6 +1707,24 @@ public final class NodeDocument extends
         return commitRoot.getCommitValue(revision);
     }
 
+    /**
+     * Returns the sweep revisions on this document as a {@link RevisionVector}.
+     * This method will return an empty {@link RevisionVector} if this document
+     * doesn't have any sweep revisions set.
+     *
+     * @return the sweep revisions as a {@link RevisionVector}.
+     */
+    @Nonnull
+    RevisionVector getSweepRevisions() {
+        return new RevisionVector(transform(getLocalMap(SWEEP_REV).values(),
+                new Function<String, Revision>() {
+                    @Override
+                    public Revision apply(String s) {
+                        return Revision.fromString(s);
+                    }
+                }));
+    }
+
     //-------------------------< UpdateOp modifiers >---------------------------
 
     public static void setChildrenFlag(@Nonnull UpdateOp op,
@@ -1845,6 +1871,13 @@ public final class NodeDocument extends
         checkNotNull(op).removeMapEntry(BRANCH_COMMITS, revision);
     }
 
+    public static void setSweepRevision(@Nonnull UpdateOp op,
+                                        @Nonnull Revision revision) {
+        checkNotNull(op).setMapEntry(SWEEP_REV,
+                new Revision(0, 0, revision.getClusterId()),
+                revision.toString());
+    }
+
     //----------------------------< internal >----------------------------------
 
     private void previousDocumentNotFound(String prevId, Revision rev) {

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/NodeDocumentTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/NodeDocumentTest.java?rev=1788090&r1=1788089&r2=1788090&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/NodeDocumentTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/NodeDocumentTest.java Wed Mar 22 10:56:57 2017
@@ -859,6 +859,36 @@ public class NodeDocumentTest {
         ns2.dispose();
     }
 
+    @Test
+    public void getSweepRevisions() throws Exception {
+        MemoryDocumentStore store = new MemoryDocumentStore();
+        NodeDocument doc = new NodeDocument(store);
+        RevisionVector sweepRev = doc.getSweepRevisions();
+        assertNotNull(sweepRev);
+        assertEquals(0, sweepRev.getDimensions());
+
+        Revision r1 = Revision.newRevision(1);
+        Revision r2 = Revision.newRevision(2);
+
+        UpdateOp op = new UpdateOp("id", true);
+        NodeDocument.setSweepRevision(op, r1);
+        UpdateUtils.applyChanges(doc, op);
+
+        sweepRev = doc.getSweepRevisions();
+        assertNotNull(sweepRev);
+        assertEquals(1, sweepRev.getDimensions());
+        assertEquals(new RevisionVector(r1), sweepRev);
+
+        op = new UpdateOp("id", false);
+        NodeDocument.setSweepRevision(op, r2);
+        UpdateUtils.applyChanges(doc, op);
+
+        sweepRev = doc.getSweepRevisions();
+        assertNotNull(sweepRev);
+        assertEquals(2, sweepRev.getDimensions());
+        assertEquals(new RevisionVector(r1, r2), sweepRev);
+    }
+
     private DocumentNodeStore createTestStore(int numChanges) throws Exception {
         return createTestStore(new MemoryDocumentStore(), 0, numChanges);
     }