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