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 th...@apache.org on 2022/08/09 16:35:06 UTC

[jackrabbit-oak] branch OAK-9893 created (now 2103704cdb)

This is an automated email from the ASF dual-hosted git repository.

thomasm pushed a change to branch OAK-9893
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git


      at 2103704cdb OAK-9893 Prefetch for queries

This branch includes the following new commits:

     new 2103704cdb OAK-9893 Prefetch for queries

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[jackrabbit-oak] 01/01: OAK-9893 Prefetch for queries

Posted by th...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

thomasm pushed a commit to branch OAK-9893
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git

commit 2103704cdb08d250499c388f7221fb6e520df4f1
Author: Thomas Mueller <th...@apache.org>
AuthorDate: Tue Aug 9 18:34:54 2022 +0200

    OAK-9893 Prefetch for queries
---
 .../main/java/org/apache/jackrabbit/oak/Oak.java   |  3 ++
 .../jackrabbit/oak/query/QueryEngineSettings.java  | 16 +++++++++-
 .../oak/query/QueryEngineSettingsServiceTest.java  | 36 +++++++++++++++++++++-
 3 files changed, 53 insertions(+), 2 deletions(-)

diff --git a/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java b/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java
index 5e80033d00..1e97faec23 100644
--- a/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java
+++ b/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java
@@ -125,6 +125,7 @@ import org.apache.jackrabbit.oak.spi.state.Clusterable;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
+import org.apache.jackrabbit.oak.spi.toggle.Feature;
 import org.apache.jackrabbit.oak.spi.whiteboard.CompositeRegistration;
 import org.apache.jackrabbit.oak.spi.whiteboard.DefaultWhiteboard;
 import org.apache.jackrabbit.oak.spi.whiteboard.Registration;
@@ -576,6 +577,8 @@ public class Oak {
             newSettings.setLimitReads(this.queryEngineSettings.getLimitReads());
             this.queryEngineSettings = new AnnotatedQueryEngineSettings(newSettings);
         }
+        Feature prefetchFeature = Feature.newFeature(QueryEngineSettings.FT_NAME_PREFETCH_FOR_QUERIES, whiteboard);
+        queryEngineSettings.setPrefetchFeature(prefetchFeature);
 
         return this;
     }
diff --git a/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineSettings.java b/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineSettings.java
index 4719ddc1f5..b15953961d 100644
--- a/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineSettings.java
+++ b/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineSettings.java
@@ -26,8 +26,10 @@ import org.apache.jackrabbit.oak.query.stats.QueryStatsMBean;
 import org.apache.jackrabbit.oak.query.stats.QueryStatsMBeanImpl;
 import org.apache.jackrabbit.oak.query.stats.QueryStatsReporter;
 import org.apache.jackrabbit.oak.spi.query.QueryLimits;
+import org.apache.jackrabbit.oak.spi.toggle.Feature;
 import org.apache.jackrabbit.oak.stats.StatisticsProvider;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 /**
  * Settings of the query engine.
@@ -59,7 +61,9 @@ public class QueryEngineSettings implements QueryEngineSettingsMBean, QueryLimit
 
     public static final String OAK_QUERY_PREFETCH_COUNT = "oak.prefetchCount";
 
-    public static final int DEFAULT_PREFETCH_COUNT = Integer.getInteger(OAK_QUERY_PREFETCH_COUNT, 0);
+    public static final String FT_NAME_PREFETCH_FOR_QUERIES = "FT_PREFETCH_OAK-9893";
+
+    public static final int DEFAULT_PREFETCH_COUNT = Integer.getInteger(OAK_QUERY_PREFETCH_COUNT, -1);
 
     public static final String OAK_QUERY_FAIL_TRAVERSAL = "oak.queryFailTraversal";
     private static final boolean DEFAULT_FAIL_TRAVERSAL =
@@ -106,6 +110,8 @@ public class QueryEngineSettings implements QueryEngineSettingsMBean, QueryLimit
     private final long queryLengthWarnLimit = Long.getLong(OAK_QUERY_LENGTH_WARN_LIMIT, 1024 * 1024); // 1 MB
     private final long queryLengthErrorLimit = Long.getLong(OAK_QUERY_LENGTH_ERROR_LIMIT, 100 * 1024 * 1024); //100MB
 
+    private Feature prefetchFeature;
+
     private String autoOptionsMappingJson = "{}";
     private QueryOptions.AutomaticQueryOptionsMapping autoOptionsMapping = new QueryOptions.AutomaticQueryOptionsMapping(autoOptionsMappingJson);
 
@@ -125,6 +131,10 @@ public class QueryEngineSettings implements QueryEngineSettingsMBean, QueryLimit
         this.statisticsProvider = statisticsProvider;
     }
 
+    public void setPrefetchFeature(@Nullable Feature prefetch) {
+        this.prefetchFeature = prefetch;
+    }
+
     @Override
     public long getLimitInMemory() {
         return limitInMemory;
@@ -152,6 +162,10 @@ public class QueryEngineSettings implements QueryEngineSettingsMBean, QueryLimit
 
     @Override
     public int getPrefetchCount() {
+        if (prefetchCount == -1) {
+            return prefetchFeature != null && prefetchFeature.isEnabled() ?
+                    20 : 0;
+        }
         return prefetchCount;
     }
 
diff --git a/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryEngineSettingsServiceTest.java b/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryEngineSettingsServiceTest.java
index a8665e3e59..618acd651e 100644
--- a/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryEngineSettingsServiceTest.java
+++ b/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryEngineSettingsServiceTest.java
@@ -19,18 +19,24 @@
 
 package org.apache.jackrabbit.oak.query;
 
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Maps;
 import org.apache.jackrabbit.oak.api.jmx.QueryEngineSettingsMBean;
+import org.apache.jackrabbit.oak.osgi.OsgiWhiteboard;
+import org.apache.jackrabbit.oak.spi.toggle.Feature;
+import org.apache.jackrabbit.oak.spi.toggle.FeatureToggle;
+import org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUtils;
 import org.apache.sling.testing.mock.osgi.junit.OsgiContext;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 
+import static org.apache.jackrabbit.oak.spi.toggle.Feature.newFeature;
 import static org.junit.Assert.*;
 
 public class QueryEngineSettingsServiceTest {
@@ -41,7 +47,8 @@ public class QueryEngineSettingsServiceTest {
     private final Set<String> sysPropNames = ImmutableSet.of(
             QueryEngineSettings.OAK_QUERY_LIMIT_IN_MEMORY,
             QueryEngineSettings.OAK_QUERY_LIMIT_READS,
-            QueryEngineSettings.OAK_QUERY_FAIL_TRAVERSAL
+            QueryEngineSettings.OAK_QUERY_FAIL_TRAVERSAL,
+            QueryEngineSettings.OAK_QUERY_PREFETCH_COUNT
     );
 
     private QueryEngineSettingsService settingsService = new QueryEngineSettingsService();
@@ -80,6 +87,33 @@ public class QueryEngineSettingsServiceTest {
         assertEquals(142, settings.getLimitInMemory());
         assertTrue(settings.getFailTraversal());
         assertTrue(settings.isFastQuerySize());
+        assertEquals(0, settings.getPrefetchCount());
+    }
+
+    @Test
+    public void prefetchDefault() {
+        QueryEngineSettings settings = new QueryEngineSettings();
+        assertEquals(0, settings.getPrefetchCount());
+    }
+
+    @Test
+    public void prefetchWithFeature() {
+        QueryEngineSettings settings = new QueryEngineSettings();
+        OsgiContext context = new OsgiContext();
+        OsgiWhiteboard whiteboard = new OsgiWhiteboard(context.bundleContext());
+        try (Feature feature = newFeature(QueryEngineSettings.FT_NAME_PREFETCH_FOR_QUERIES, whiteboard)) {
+            assertFalse(feature.isEnabled());
+            List<FeatureToggle> toggles = WhiteboardUtils.getServices(whiteboard, FeatureToggle.class);
+            assertEquals(1, toggles.size());
+            FeatureToggle toggle = toggles.get(0);
+            assertEquals(QueryEngineSettings.FT_NAME_PREFETCH_FOR_QUERIES, toggle.getName());
+            assertEquals(0, settings.getPrefetchCount());
+            toggle.setEnabled(true);
+            settings.setPrefetchFeature(feature);
+            assertEquals(20, settings.getPrefetchCount());
+            toggle.setEnabled(false);
+            assertEquals(0, settings.getPrefetchCount());
+        }
     }
 
     @Test