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 ch...@apache.org on 2014/07/15 14:04:58 UTC
svn commit: r1610666 - in /jackrabbit/oak/branches/1.0: ./
oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java
oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/QueryHintTest.java
oak-doc/
Author: chetanm
Date: Tue Jul 15 12:04:57 2014
New Revision: 1610666
URL: http://svn.apache.org/r1610666
Log:
OAK-1966 - Add Hint for selecting more performant index in MongoDocumentStore#query
Merged rev 1610664 from trunk
Added:
jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/QueryHintTest.java
- copied unchanged from r1610664, jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/QueryHintTest.java
Modified:
jackrabbit/oak/branches/1.0/ (props changed)
jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java
jackrabbit/oak/branches/1.0/oak-doc/ (props changed)
Propchange: jackrabbit/oak/branches/1.0/
------------------------------------------------------------------------------
Merged /jackrabbit/oak/trunk:r1610664
Modified: jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java?rev=1610666&r1=1610665&r2=1610666&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java (original)
+++ jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java Tue Jul 15 12:04:57 2014
@@ -139,6 +139,13 @@ public class MongoDocumentStore implemen
private final long maxReplicationLagMillis;
+ /**
+ * Duration in seconds under which queries would use index on _modified field
+ * If set to -1 then modifiedTime index would not be used
+ */
+ private final long maxDeltaForModTimeIdxSecs =
+ Long.getLong("oak.mongo.maxDeltaForModTimeIdxSecs",120);
+
private String lastReadWriteMode;
public MongoDocumentStore(DB db, DocumentMK.Builder builder) {
@@ -193,6 +200,8 @@ public class MongoDocumentStore implemen
cacheStats = new CacheStats(nodesCache, "Document-Documents", builder.getWeigher(),
builder.getDocumentCacheSize());
+ LOG.info("Configuration maxReplicationLagMillis {}, " +
+ "maxDeltaForModTimeIdxSecs {}",maxReplicationLagMillis, maxDeltaForModTimeIdxSecs);
}
private static void checkVersion(DB db) {
@@ -408,16 +417,24 @@ public class MongoDocumentStore implemen
QueryBuilder queryBuilder = QueryBuilder.start(Document.ID);
queryBuilder.greaterThan(fromKey);
queryBuilder.lessThan(toKey);
+
+ DBObject hint = new BasicDBObject(NodeDocument.ID, 1);
+
if (indexedProperty != null) {
queryBuilder.and(indexedProperty);
queryBuilder.greaterThanEquals(startValue);
+
+ if (NodeDocument.MODIFIED_IN_SECS.equals(indexedProperty)
+ && canUseModifiedTimeIdx(startValue)) {
+ hint = new BasicDBObject(NodeDocument.MODIFIED_IN_SECS, -1);
+ }
}
DBObject query = queryBuilder.get();
String parentId = Utils.getParentIdFromLowerLimit(fromKey);
TreeLock lock = acquireExclusive(parentId != null ? parentId : "");
long start = start();
try {
- DBCursor cursor = dbCollection.find(query).sort(BY_ID_ASC);
+ DBCursor cursor = dbCollection.find(query).sort(BY_ID_ASC).hint(hint);
ReadPreference readPreference =
getMongoReadPreference(collection, parentId, getDefaultReadPreference(collection));
@@ -467,6 +484,13 @@ public class MongoDocumentStore implemen
}
}
+ boolean canUseModifiedTimeIdx(long modifiedTimeInSecs) {
+ if (maxDeltaForModTimeIdxSecs < 0) {
+ return false;
+ }
+ return (NodeDocument.getModifiedInSecs(getTime()) - modifiedTimeInSecs) <= maxDeltaForModTimeIdxSecs;
+ }
+
@Override
public <T extends Document> void remove(Collection<T> collection, String key) {
log("remove", key);
@@ -835,6 +859,10 @@ public class MongoDocumentStore implemen
return cacheStats;
}
+ long getMaxDeltaForModTimeIdxSecs() {
+ return maxDeltaForModTimeIdxSecs;
+ }
+
Iterable<? extends Map.Entry<CacheValue, ? extends CachedNodeDocument>> getCacheEntries() {
if (nodesCache instanceof OffHeapCache) {
return Iterables.concat(nodesCache.asMap().entrySet(),
Propchange: jackrabbit/oak/branches/1.0/oak-doc/
------------------------------------------------------------------------------
Merged /jackrabbit/oak/trunk/oak-doc:r1610664