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 2013/09/16 14:23:23 UTC
svn commit: r1523609 - in /jackrabbit/oak/trunk/oak-core/src:
main/java/org/apache/jackrabbit/oak/plugins/mongomk/NodeDocument.java
test/java/org/apache/jackrabbit/oak/plugins/mongomk/DocumentSplitTest.java
Author: mreutegg
Date: Mon Sep 16 12:23:22 2013
New Revision: 1523609
URL: http://svn.apache.org/r1523609
Log:
OAK-926: MongoMK: split documents when they are too large
- Parse PREVIOUS into Revision/Range on demand
- More tests
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/NodeDocument.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/mongomk/DocumentSplitTest.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/NodeDocument.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/NodeDocument.java?rev=1523609&r1=1523608&r2=1523609&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/NodeDocument.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/NodeDocument.java Mon Sep 16 12:23:22 2013
@@ -118,6 +118,11 @@ public class NodeDocument extends Docume
final DocumentStore store;
+ /**
+ * Parsed and sorted set of previous revisions.
+ */
+ private SortedMap<Revision, Range> previous;
+
private final long time = System.currentTimeMillis();
NodeDocument(@Nonnull DocumentStore store) {
@@ -151,19 +156,23 @@ public class NodeDocument extends Docume
/**
* Returns <code>true</code> if the given <code>revision</code> is marked
- * committed in <strong>this</strong> document including previous documents.
+ * committed.
*
* @param revision the revision.
* @return <code>true</code> if committed; <code>false</code> otherwise.
*/
public boolean isCommitted(@Nonnull Revision revision) {
+ NodeDocument commitRootDoc = getCommitRoot(checkNotNull(revision));
+ if (commitRootDoc == null) {
+ return false;
+ }
String rev = checkNotNull(revision).toString();
- String value = getLocalRevisions().get(rev);
+ String value = commitRootDoc.getLocalRevisions().get(rev);
if (value != null) {
return Utils.isCommitted(value);
}
// check previous docs
- for (NodeDocument prev : getPreviousDocs(revision, REVISIONS)) {
+ for (NodeDocument prev : commitRootDoc.getPreviousDocs(revision, REVISIONS)) {
if (prev.containsRevision(revision)) {
return prev.isCommitted(revision);
}
@@ -659,20 +668,26 @@ public class NodeDocument extends Docume
main.removeMapEntry(property, r);
old.setMapEntry(property, r, entry.getValue());
}
- splitOps.add(old);
- splitOps.add(main);
}
+ splitOps.add(old);
+ splitOps.add(main);
}
return splitOps;
}
- @Override
+ /**
+ * Returns previous revision ranges for this document. The revision keys are
+ * sorted descending, newest first!
+ *
+ * @return the previous ranges for this document.
+ */
@Nonnull
- protected Map<?, ?> transformAndSeal(@Nonnull Map<Object, Object> map,
- @Nullable String key,
- int level) {
- if (level == 1) {
- if (PREVIOUS.equals(key)) {
+ SortedMap<Revision, Range> getPreviousRanges() {
+ if (previous == null) {
+ Map<String, String> map = getLocalMap(PREVIOUS);
+ if (map.isEmpty()) {
+ previous = EMPTY_RANGE_MAP;
+ } else {
SortedMap<Revision, Range> transformed = new TreeMap<Revision, Range>(
new Comparator<Revision>() {
@Override
@@ -687,30 +702,14 @@ public class NodeDocument extends Docume
return c;
}
});
- for (Map.Entry<Object, Object> entry : map.entrySet()) {
- Revision high = Revision.fromString(entry.getKey().toString());
- Revision low = Revision.fromString(entry.getValue().toString());
+ for (Map.Entry<String, String> entry : map.entrySet()) {
+ Revision high = Revision.fromString(entry.getKey());
+ Revision low = Revision.fromString(entry.getValue());
transformed.put(high, new Range(high, low));
}
- return Collections.unmodifiableSortedMap(transformed);
+ previous = Collections.unmodifiableSortedMap(transformed);
}
}
- return super.transformAndSeal(map, key, level);
- }
-
- /**
- * Returns previous revision ranges for this document. The revision keys are
- * sorted descending, newest first!
- *
- * @return the previous ranges for this document.
- */
- @Nonnull
- SortedMap<Revision, Range> getPreviousRanges() {
- @SuppressWarnings("unchecked")
- SortedMap<Revision, Range> previous = (SortedMap<Revision, Range>) get(PREVIOUS);
- if (previous == null) {
- previous = EMPTY_RANGE_MAP;
- }
return previous;
}
Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/mongomk/DocumentSplitTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/mongomk/DocumentSplitTest.java?rev=1523609&r1=1523608&r2=1523609&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/mongomk/DocumentSplitTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/mongomk/DocumentSplitTest.java Mon Sep 16 12:23:22 2013
@@ -103,4 +103,29 @@ public class DocumentSplitTest extends B
assertNotNull(node);
}
}
+
+ @Test
+ public void splitCommitRoot() throws Exception {
+ DocumentStore store = mk.getDocumentStore();
+ mk.commit("/", "+\"foo\":{}+\"bar\":{}", null, null);
+ NodeDocument doc = store.find(Collection.NODES, Utils.getIdFromPath("/foo"));
+ assertNotNull(doc);
+ Set<String> commitRoots = Sets.newHashSet();
+ commitRoots.addAll(doc.getLocalCommitRoot().keySet());
+ // create nodes
+ while (commitRoots.size() <= NodeDocument.REVISIONS_SPLIT_OFF_SIZE) {
+ commitRoots.add(mk.commit("/", "^\"foo/prop\":" + commitRoots.size() +
+ "^\"bar/prop\":" + commitRoots.size(), null, null));
+ }
+ mk.runBackgroundOperations();
+ doc = store.find(Collection.NODES, Utils.getIdFromPath("/foo"));
+ assertNotNull(doc);
+ Map<String, String> commits = doc.getLocalCommitRoot();
+ // one remaining in the local commit root map
+ assertEquals(1, commits.size());
+ for (String r : commitRoots) {
+ Revision rev = Revision.fromString(r);
+ assertTrue(doc.isCommitted(rev));
+ }
+ }
}