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

gian pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git


The following commit(s) were added to refs/heads/master by this push:
     new 6b6d73b5d44 Use min of scheduler threads and server threads for 
subquery guardrails. (#15295)
6b6d73b5d44 is described below

commit 6b6d73b5d4447f21bbdacd7106fcd7c1c2c48d5d
Author: Gian Merlino <[email protected]>
AuthorDate: Wed Nov 1 22:34:53 2023 -0700

    Use min of scheduler threads and server threads for subquery guardrails. 
(#15295)
    
    * Use min of scheduler threads and server threads for subquery guardrails.
    
    This allows more memory to be used for subqueries when the query scheduler
    is configured to limit queries below the number of server threads. The patch
    also refactors the code so SubqueryGuardrailHelper is provided by a Guice
    Provider rather than being created by ClientQuerySegmentWalker, to achieve
    better separation of concerns.
    
    * Exclude provider from coverage.
---
 .../movingaverage/MovingAverageQueryTest.java      |  4 +-
 server/pom.xml                                     |  2 +
 .../druid/server/ClientQuerySegmentWalker.java     | 13 ++---
 .../druid/server/SubqueryGuardrailHelper.java      | 10 ++--
 .../server/SubqueryGuardrailHelperProvider.java    | 68 ++++++++++++++++++++++
 .../druid/server/ClientQuerySegmentWalkerTest.java |  3 +-
 .../org/apache/druid/server/QueryStackTests.java   |  6 +-
 .../main/java/org/apache/druid/cli/CliBroker.java  |  3 +
 .../util/SpecificSegmentsQuerySegmentWalker.java   |  3 +-
 9 files changed, 90 insertions(+), 22 deletions(-)

diff --git 
a/extensions-contrib/moving-average-query/src/test/java/org/apache/druid/query/movingaverage/MovingAverageQueryTest.java
 
b/extensions-contrib/moving-average-query/src/test/java/org/apache/druid/query/movingaverage/MovingAverageQueryTest.java
index 522e00a37d7..90dbcecf370 100644
--- 
a/extensions-contrib/moving-average-query/src/test/java/org/apache/druid/query/movingaverage/MovingAverageQueryTest.java
+++ 
b/extensions-contrib/moving-average-query/src/test/java/org/apache/druid/query/movingaverage/MovingAverageQueryTest.java
@@ -72,11 +72,13 @@ import 
org.apache.druid.query.timeseries.TimeseriesResultValue;
 import org.apache.druid.segment.join.MapJoinableFactory;
 import org.apache.druid.server.ClientQuerySegmentWalker;
 import org.apache.druid.server.QueryStackTests;
+import org.apache.druid.server.SubqueryGuardrailHelper;
 import org.apache.druid.server.initialization.ServerConfig;
 import org.apache.druid.server.metrics.NoopServiceEmitter;
 import org.apache.druid.server.metrics.SubqueryCountStatsProvider;
 import org.apache.druid.testing.InitializedNullHandlingTest;
 import org.apache.druid.timeline.TimelineLookup;
+import org.apache.druid.utils.JvmUtils;
 import org.hamcrest.core.IsInstanceOf;
 import org.joda.time.Interval;
 import org.junit.Assert;
@@ -388,7 +390,7 @@ public class MovingAverageQueryTest extends 
InitializedNullHandlingTest
         serverConfig,
         null,
         new CacheConfig(),
-        null,
+        new SubqueryGuardrailHelper(null, 
JvmUtils.getRuntimeInfo().getMaxHeapSizeBytes(), 1),
         new SubqueryCountStatsProvider()
     );
 
diff --git a/server/pom.xml b/server/pom.xml
index c2b8269cf2a..e3748b8c599 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -443,6 +443,8 @@
                       <!-- Tested in the SQL layer, but, oddly, not in this 
module. -->
                         
<exclude>org/apache/druid/server/QueryResponse.class</exclude>
                         
<exclude>org/apache/druid/curator/CuratorModule.class</exclude>
+                        <!-- Guice providers where unit tests would be 
tightly-coupled and not useful -->
+                        
<exclude>org/apache/druid/server/SubqueryGuardrailHelperProvider.class</exclude>
                     </excludes>
                 </configuration>
             </plugin>
diff --git 
a/server/src/main/java/org/apache/druid/server/ClientQuerySegmentWalker.java 
b/server/src/main/java/org/apache/druid/server/ClientQuerySegmentWalker.java
index 0e086881362..80c6d0a86af 100644
--- a/server/src/main/java/org/apache/druid/server/ClientQuerySegmentWalker.java
+++ b/server/src/main/java/org/apache/druid/server/ClientQuerySegmentWalker.java
@@ -58,7 +58,6 @@ import org.apache.druid.query.RetryQueryRunnerConfig;
 import org.apache.druid.query.SegmentDescriptor;
 import org.apache.druid.query.TableDataSource;
 import org.apache.druid.query.context.ResponseContext;
-import org.apache.druid.query.lookup.LookupExtractorFactoryContainerProvider;
 import org.apache.druid.query.planning.DataSourceAnalysis;
 import org.apache.druid.segment.column.RowSignature;
 import org.apache.druid.segment.join.JoinableFactory;
@@ -120,7 +119,7 @@ public class ClientQuerySegmentWalker implements 
QuerySegmentWalker
       ServerConfig serverConfig,
       Cache cache,
       CacheConfig cacheConfig,
-      LookupExtractorFactoryContainerProvider lookupManager,
+      SubqueryGuardrailHelper subqueryGuardrailHelper,
       SubqueryCountStatsProvider subqueryStatsProvider
   )
   {
@@ -134,11 +133,7 @@ public class ClientQuerySegmentWalker implements 
QuerySegmentWalker
     this.serverConfig = serverConfig;
     this.cache = cache;
     this.cacheConfig = cacheConfig;
-    this.subqueryGuardrailHelper = new SubqueryGuardrailHelper(
-        lookupManager,
-        Runtime.getRuntime().maxMemory(),
-        serverConfig.getNumThreads()
-    );
+    this.subqueryGuardrailHelper = subqueryGuardrailHelper;
     this.subqueryStatsProvider = subqueryStatsProvider;
   }
 
@@ -154,7 +149,7 @@ public class ClientQuerySegmentWalker implements 
QuerySegmentWalker
       ServerConfig serverConfig,
       Cache cache,
       CacheConfig cacheConfig,
-      LookupExtractorFactoryContainerProvider lookupManager,
+      SubqueryGuardrailHelper subqueryGuardrailHelper,
       SubqueryCountStatsProvider subqueryStatsProvider
   )
   {
@@ -169,7 +164,7 @@ public class ClientQuerySegmentWalker implements 
QuerySegmentWalker
         serverConfig,
         cache,
         cacheConfig,
-        lookupManager,
+        subqueryGuardrailHelper,
         subqueryStatsProvider
     );
   }
diff --git 
a/server/src/main/java/org/apache/druid/server/SubqueryGuardrailHelper.java 
b/server/src/main/java/org/apache/druid/server/SubqueryGuardrailHelper.java
index 88845ef955e..faa97a802e6 100644
--- a/server/src/main/java/org/apache/druid/server/SubqueryGuardrailHelper.java
+++ b/server/src/main/java/org/apache/druid/server/SubqueryGuardrailHelper.java
@@ -48,11 +48,11 @@ public class SubqueryGuardrailHelper
   public SubqueryGuardrailHelper(
       final LookupExtractorFactoryContainerProvider lookupManager,
       final long maxMemoryInJvm,
-      final int brokerNumHttpConnections
+      final int maxConcurrentQueries
   )
   {
     final DateTime start = DateTimes.nowUtc();
-    autoLimitBytes = computeLimitBytesForAuto(lookupManager, maxMemoryInJvm, 
brokerNumHttpConnections);
+    autoLimitBytes = computeLimitBytesForAuto(lookupManager, maxMemoryInJvm, 
maxConcurrentQueries);
     final long startupTimeMs = new Interval(start, 
DateTimes.nowUtc()).toDurationMillis();
 
     log.info("Took [%d] ms to initialize the SubqueryGuardrailHelper.", 
startupTimeMs);
@@ -114,13 +114,13 @@ public class SubqueryGuardrailHelper
   private static long computeLimitBytesForAuto(
       final LookupExtractorFactoryContainerProvider lookupManager,
       final long maxMemoryInJvm,
-      final int brokerNumHttpConnections
+      final int maxConcurrentQueries
   )
   {
     long memoryInJvmWithoutLookups = maxMemoryInJvm - 
computeLookupFootprint(lookupManager);
     long memoryInJvmForSubqueryResultsInlining = (long) 
(memoryInJvmWithoutLookups * SUBQUERY_MEMORY_BYTES_FRACTION);
-    long memoryInJvmForSubqueryResultsInliningPerQuery = 
memoryInJvmForSubqueryResultsInlining
-                                                         / 
brokerNumHttpConnections;
+    long memoryInJvmForSubqueryResultsInliningPerQuery =
+        memoryInJvmForSubqueryResultsInlining / maxConcurrentQueries;
     return Math.max(memoryInJvmForSubqueryResultsInliningPerQuery, 1L);
   }
 
diff --git 
a/server/src/main/java/org/apache/druid/server/SubqueryGuardrailHelperProvider.java
 
b/server/src/main/java/org/apache/druid/server/SubqueryGuardrailHelperProvider.java
new file mode 100644
index 00000000000..ddbc0790084
--- /dev/null
+++ 
b/server/src/main/java/org/apache/druid/server/SubqueryGuardrailHelperProvider.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.druid.server;
+
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import org.apache.druid.guice.LazySingleton;
+import org.apache.druid.query.lookup.LookupExtractorFactoryContainerProvider;
+import org.apache.druid.server.initialization.ServerConfig;
+import org.apache.druid.utils.JvmUtils;
+
+public class SubqueryGuardrailHelperProvider implements 
Provider<SubqueryGuardrailHelper>
+{
+  private final LookupExtractorFactoryContainerProvider 
lookupExtractorFactoryContainerProvider;
+  private final ServerConfig serverConfig;
+  private final QuerySchedulerConfig querySchedulerConfig;
+
+  @Inject
+  public SubqueryGuardrailHelperProvider(
+      LookupExtractorFactoryContainerProvider 
lookupExtractorFactoryContainerProvider,
+      ServerConfig serverConfig,
+      QuerySchedulerConfig querySchedulerConfig
+  )
+  {
+    this.lookupExtractorFactoryContainerProvider = 
lookupExtractorFactoryContainerProvider;
+    this.serverConfig = serverConfig;
+    this.querySchedulerConfig = querySchedulerConfig;
+  }
+
+  @Override
+  @LazySingleton
+  public SubqueryGuardrailHelper get()
+  {
+    final int maxConcurrentQueries;
+
+    if (querySchedulerConfig.getNumThreads() > 0) {
+      maxConcurrentQueries = Math.min(
+          querySchedulerConfig.getNumThreads(),
+          serverConfig.getNumThreads()
+      );
+    } else {
+      maxConcurrentQueries = serverConfig.getNumThreads();
+    }
+
+    return new SubqueryGuardrailHelper(
+        lookupExtractorFactoryContainerProvider,
+        JvmUtils.getRuntimeInfo().getMaxHeapSizeBytes(),
+        maxConcurrentQueries
+    );
+  }
+}
diff --git 
a/server/src/test/java/org/apache/druid/server/ClientQuerySegmentWalkerTest.java
 
b/server/src/test/java/org/apache/druid/server/ClientQuerySegmentWalkerTest.java
index 112275860e4..140b96da558 100644
--- 
a/server/src/test/java/org/apache/druid/server/ClientQuerySegmentWalkerTest.java
+++ 
b/server/src/test/java/org/apache/druid/server/ClientQuerySegmentWalkerTest.java
@@ -1507,8 +1507,7 @@ public class ClientQuerySegmentWalkerTest
         ),
         conglomerate,
         joinableFactory,
-        serverConfig,
-        null
+        serverConfig
     );
   }
 
diff --git a/server/src/test/java/org/apache/druid/server/QueryStackTests.java 
b/server/src/test/java/org/apache/druid/server/QueryStackTests.java
index fd8839d9cab..2301a9ace39 100644
--- a/server/src/test/java/org/apache/druid/server/QueryStackTests.java
+++ b/server/src/test/java/org/apache/druid/server/QueryStackTests.java
@@ -83,6 +83,7 @@ import 
org.apache.druid.server.metrics.SubqueryCountStatsProvider;
 import org.apache.druid.server.scheduling.ManualQueryPrioritizationStrategy;
 import org.apache.druid.server.scheduling.NoQueryLaningStrategy;
 import org.apache.druid.timeline.VersionedIntervalTimeline;
+import org.apache.druid.utils.JvmUtils;
 import org.junit.Assert;
 
 import javax.annotation.Nullable;
@@ -117,8 +118,7 @@ public class QueryStackTests
       final QuerySegmentWalker localWalker,
       final QueryRunnerFactoryConglomerate conglomerate,
       final JoinableFactory joinableFactory,
-      final ServerConfig serverConfig,
-      final LookupExtractorFactoryContainerProvider lookupManager
+      final ServerConfig serverConfig
   )
   {
     return new ClientQuerySegmentWalker(
@@ -164,7 +164,7 @@ public class QueryStackTests
             return false;
           }
         },
-        lookupManager,
+        new SubqueryGuardrailHelper(null, 
JvmUtils.getRuntimeInfo().getMaxHeapSizeBytes(), 1),
         new SubqueryCountStatsProvider()
     );
   }
diff --git a/services/src/main/java/org/apache/druid/cli/CliBroker.java 
b/services/src/main/java/org/apache/druid/cli/CliBroker.java
index 1de8a0f1d47..50adb9b9ef7 100644
--- a/services/src/main/java/org/apache/druid/cli/CliBroker.java
+++ b/services/src/main/java/org/apache/druid/cli/CliBroker.java
@@ -61,6 +61,8 @@ import org.apache.druid.server.ClientInfoResource;
 import org.apache.druid.server.ClientQuerySegmentWalker;
 import org.apache.druid.server.ResponseContextConfig;
 import org.apache.druid.server.SegmentManager;
+import org.apache.druid.server.SubqueryGuardrailHelper;
+import org.apache.druid.server.SubqueryGuardrailHelperProvider;
 import org.apache.druid.server.coordination.ServerType;
 import org.apache.druid.server.coordination.ZkCoordinator;
 import org.apache.druid.server.http.BrokerResource;
@@ -146,6 +148,7 @@ public class CliBroker extends ServerRunnable
 
           binder.bind(BrokerQueryResource.class).in(LazySingleton.class);
           Jerseys.addResource(binder, BrokerQueryResource.class);
+          
binder.bind(SubqueryGuardrailHelper.class).toProvider(SubqueryGuardrailHelperProvider.class);
           
binder.bind(QueryCountStatsProvider.class).to(BrokerQueryResource.class).in(LazySingleton.class);
           binder.bind(SubqueryCountStatsProvider.class).toInstance(new 
SubqueryCountStatsProvider());
           Jerseys.addResource(binder, BrokerResource.class);
diff --git 
a/sql/src/test/java/org/apache/druid/sql/calcite/util/SpecificSegmentsQuerySegmentWalker.java
 
b/sql/src/test/java/org/apache/druid/sql/calcite/util/SpecificSegmentsQuerySegmentWalker.java
index a47bbcf9577..b43a6515956 100644
--- 
a/sql/src/test/java/org/apache/druid/sql/calcite/util/SpecificSegmentsQuerySegmentWalker.java
+++ 
b/sql/src/test/java/org/apache/druid/sql/calcite/util/SpecificSegmentsQuerySegmentWalker.java
@@ -116,8 +116,7 @@ public class SpecificSegmentsQuerySegmentWalker implements 
QuerySegmentWalker, C
         ),
         conglomerate,
         joinableFactoryWrapper.getJoinableFactory(),
-        new ServerConfig(),
-        LOOKUP_EXTRACTOR_FACTORY_CONTAINER_PROVIDER
+        new ServerConfig()
     );
   }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to