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