diff --git a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java
index eddf486..7ecffcc 100644
--- a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java
+++ b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java
@@ -28,6 +28,7 @@ import java.util.Map.Entry;
 import java.util.TreeMap;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.regex.Matcher;
@@ -150,6 +151,18 @@ public class MongoDocumentStore implements DocumentStore {
     private final long maxDeltaForModTimeIdxSecs =
             Long.getLong("oak.mongo.maxDeltaForModTimeIdxSecs",-1);
 
+    /**
+     * Duration in milliseconds after which a mongo query will be terminated.
+     * <p>
+     * If this value is -1 no timeout is being set at all, if it is 1 or greater
+     * this translated to mongo's maxTimeNS being set accordingly.
+     * <p>
+     * Default is -1.
+     * @see http://mongodb.github.io/node-mongodb-native/driver-articles/anintroductionto1_4_and_2_6.html#maxtimems
+     */
+    private final long maxQueryTimeMS =
+            Long.getLong("oak.mongo.maxQueryTimeMS",-1);
+    
     private String lastReadWriteMode;
 
     public MongoDocumentStore(DB db, DocumentMK.Builder builder) {
@@ -447,6 +460,13 @@ public class MongoDocumentStore implements DocumentStore {
         final long start = PERFLOG.start();
         try {
             DBCursor cursor = dbCollection.find(query).sort(BY_ID_ASC).hint(hint);
+            if (maxQueryTimeMS>0) {
+                // OAK-2617: if 'oak.mongo.maxQueryTimeMS' is configured >0, then 
+                // set this on the query - should avoid never-ending (inefficient)
+                // queries and let them fail instead of preventing system from
+                // being usable for anything else
+                cursor.maxTime(maxQueryTimeMS, TimeUnit.MILLISECONDS);
+            }
             ReadPreference readPreference =
                     getMongoReadPreference(collection, parentId, getDefaultReadPreference(collection));
 
