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/18 11:10:31 UTC
svn commit: r1524345 - in
/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk:
MongoMK.java NodeDocument.java
Author: mreutegg
Date: Wed Sep 18 09:10:31 2013
New Revision: 1524345
URL: http://svn.apache.org/r1524345
Log:
OAK-926: MongoMK: split documents when they are too large
- Speed up and simplify evaluation of deleted status of a node
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoMK.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/NodeDocument.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoMK.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoMK.java?rev=1524345&r1=1524344&r2=1524345&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoMK.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoMK.java Wed Sep 18 09:10:31 2013
@@ -572,11 +572,11 @@ public class MongoMK implements MicroKer
Iterable<NodeDocument> docs;
Children c = new Children();
int rawLimit = limit;
+ Set<Revision> validRevisions = new HashSet<Revision>();
do {
c.children.clear();
c.hasMore = true;
docs = readChildren(path, rawLimit);
- Set<Revision> validRevisions = new HashSet<Revision>();
int numReturned = 0;
for (NodeDocument doc : docs) {
numReturned++;
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=1524345&r1=1524344&r2=1524345&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 Wed Sep 18 09:10:31 2013
@@ -384,7 +384,8 @@ public class NodeDocument extends Docume
*/
@CheckForNull
public Node getNodeAtRevision(RevisionContext context, Revision readRevision) {
- Revision min = getLiveRevision(context, readRevision, new HashSet<Revision>());
+ Set<Revision> validRevisions = new HashSet<Revision>();
+ Revision min = getLiveRevision(context, readRevision, validRevisions);
if (min == null) {
// deleted
return null;
@@ -396,13 +397,16 @@ public class NodeDocument extends Docume
continue;
}
// first check local map, which contains most recent values
- String value = getLatestValue(context, getLocalMap(key), min, readRevision);
+ Value value = getLatestValue(context, getLocalMap(key),
+ min, readRevision, validRevisions);
if (value == null) {
// check complete revision history
- value = getLatestValue(context, getValueMap(key), min, readRevision);
+ value = getLatestValue(context, getValueMap(key),
+ min, readRevision, validRevisions);
}
String propertyName = Utils.unescapePropertyName(key);
- n.setProperty(propertyName, value);
+ String v = value != null ? value.value : null;
+ n.setProperty(propertyName, v);
}
// when was this node last modified?
@@ -463,27 +467,7 @@ public class NodeDocument extends Docume
public boolean isDeleted(RevisionContext context,
Revision readRevision,
Set<Revision> validRevisions) {
- Map<String, String> valueMap = getDeleted();
- if (valueMap.isEmpty()) {
- return false;
- }
- Revision mostRecent = null;
- boolean deleted = false;
- for (Map.Entry<String, String> entry : valueMap.entrySet()) {
- Revision r = Revision.fromString(entry.getKey());
- if (isRevisionNewer(context, r, readRevision)) {
- // ignore -> newer than readRevision
- continue;
- }
- if (mostRecent != null && isRevisionNewer(context, mostRecent, r)) {
- continue;
- }
- if (isValidRevision(context, r, readRevision, validRevisions)) {
- mostRecent = r;
- deleted = "true".equals(entry.getValue());
- }
- }
- return mostRecent == null || deleted;
+ return getLiveRevision(context, readRevision, validRevisions) == null;
}
/**
@@ -500,50 +484,15 @@ public class NodeDocument extends Docume
@CheckForNull
public Revision getLiveRevision(RevisionContext context, Revision maxRev,
Set<Revision> validRevisions) {
- Map<String, String> valueMap = getDeleted();
- if (valueMap.isEmpty()) {
- return null;
- }
- // first, search the newest deleted revision
- Revision deletedRev = null;
- for (String r : valueMap.keySet()) {
- String value = valueMap.get(r);
- if (!"true".equals(value)) {
- // only look at deleted revisions now
- continue;
- }
- Revision propRev = Revision.fromString(r);
- if (isRevisionNewer(context, propRev, maxRev)
- || !isValidRevision(context, propRev, maxRev, validRevisions)) {
- continue;
- }
- if (deletedRev == null || isRevisionNewer(context, propRev, deletedRev)) {
- deletedRev = propRev;
- }
- }
- // now search the oldest non-deleted revision that is newer than the
- // newest deleted revision
- Revision liveRev = null;
- for (String r : valueMap.keySet()) {
- String value = valueMap.get(r);
- if ("true".equals(value)) {
- // ignore deleted revisions
- continue;
- }
- Revision propRev = Revision.fromString(r);
- if (deletedRev != null && isRevisionNewer(context, deletedRev, propRev)) {
- // the node was deleted later on
- continue;
- }
- if (isRevisionNewer(context, propRev, maxRev)
- || !isValidRevision(context, propRev, maxRev, validRevisions)) {
- continue;
- }
- if (liveRev == null || isRevisionNewer(context, liveRev, propRev)) {
- liveRev = propRev;
- }
+ // check local deleted map first
+ Value value = getLatestValue(context, getLocalDeleted(),
+ null, maxRev, validRevisions);
+ if (value == null) {
+ // need to check complete map
+ value = getLatestValue(context, getDeleted(),
+ null, maxRev, validRevisions);
}
- return liveRev;
+ return value != null && value.value.equals("false") ? value.revision : null;
}
/**
@@ -997,34 +946,37 @@ public class NodeDocument extends Docume
/**
* Get the latest property value that is larger or equal the min revision,
- * and smaller or equal the max revision.
+ * and smaller or equal the readRevision revision.
*
* @param valueMap the revision-value map
* @param min the minimum revision (null meaning unlimited)
- * @param max the maximum revision
+ * @param readRevision the maximum revision
+ * @param validRevisions set of revision considered valid against the given
+ * readRevision.
* @return the value, or null if not found
*/
@CheckForNull
- private static String getLatestValue(@Nonnull RevisionContext context,
- @Nonnull Map<String, String> valueMap,
- @Nullable Revision min,
- @Nonnull Revision max) {
+ private Value getLatestValue(@Nonnull RevisionContext context,
+ @Nonnull Map<String, String> valueMap,
+ @Nullable Revision min,
+ @Nonnull Revision readRevision,
+ @Nonnull Set<Revision> validRevisions) {
String value = null;
Revision latestRev = null;
- for (String r : valueMap.keySet()) {
- Revision propRev = Revision.fromString(r);
+ for (Map.Entry<String, String> entry : valueMap.entrySet()) {
+ Revision propRev = Revision.fromString(entry.getKey());
if (min != null && isRevisionNewer(context, min, propRev)) {
continue;
}
if (latestRev != null && !isRevisionNewer(context, propRev, latestRev)) {
continue;
}
- if (includeRevision(context, propRev, max)) {
+ if (isValidRevision(context, propRev, readRevision, validRevisions)) {
latestRev = propRev;
- value = valueMap.get(r);
+ value = entry.getValue();
}
}
- return value;
+ return value != null ? new Value(value, latestRev) : null;
}
@Nonnull
@@ -1036,4 +988,15 @@ public class NodeDocument extends Docume
private Map<String, String> getCommitRoot() {
return ValueMap.create(this, COMMIT_ROOT);
}
+
+ private static final class Value {
+
+ final String value;
+ final Revision revision;
+
+ Value(@Nonnull String value, @Nonnull Revision revision) {
+ this.value = checkNotNull(value);
+ this.revision = checkNotNull(revision);
+ }
+ }
}