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 7390d6acfc4 Ensure DruidMeta is closed properly. (#18431)
7390d6acfc4 is described below

commit 7390d6acfc45e2a9a8440bb8ee0c9361d60758d3
Author: Gian Merlino <[email protected]>
AuthorDate: Mon Aug 25 09:18:27 2025 -0700

    Ensure DruidMeta is closed properly. (#18431)
    
    * Ensure DruidMeta is closed properly.
    
    DruidMeta owns an executor service, which spawns a thread that retains
    a reference to it. This service must be shut down for the DruidMeta to
    be garbage-collectable, which is important when DruidAvaticaTestDriver
    is closed. Otherwise, any segments retained by the DruidMeta will stick
    around.
    
    This fix includes a `@LifecycleStop` so the same shutdown happens when
    an actual server is shutting down. It seems like good hygiene.
    
    * Add LifecycleModule.
---
 .../org/apache/druid/sql/avatica/DruidMeta.java    | 16 ++++++++++++++--
 .../druid/quidem/DruidAvaticaTestDriver.java       | 22 +---------------------
 .../druid/sql/avatica/DruidAvaticaHandlerTest.java |  2 ++
 3 files changed, 17 insertions(+), 23 deletions(-)

diff --git a/sql/src/main/java/org/apache/druid/sql/avatica/DruidMeta.java 
b/sql/src/main/java/org/apache/druid/sql/avatica/DruidMeta.java
index efe367958fc..0410326687b 100644
--- a/sql/src/main/java/org/apache/druid/sql/avatica/DruidMeta.java
+++ b/sql/src/main/java/org/apache/druid/sql/avatica/DruidMeta.java
@@ -36,11 +36,12 @@ import org.apache.calcite.avatica.QueryState;
 import org.apache.calcite.avatica.remote.AvaticaRuntimeException;
 import org.apache.calcite.avatica.remote.Service.ErrorResponse;
 import org.apache.calcite.avatica.remote.TypedValue;
-import org.apache.druid.guice.LazySingleton;
+import org.apache.druid.guice.ManageLifecycle;
 import org.apache.druid.guice.annotations.NativeQuery;
 import org.apache.druid.java.util.common.DateTimes;
 import org.apache.druid.java.util.common.ISE;
 import org.apache.druid.java.util.common.UOE;
+import org.apache.druid.java.util.common.lifecycle.LifecycleStop;
 import org.apache.druid.java.util.common.logger.Logger;
 import org.apache.druid.query.DefaultQueryConfig;
 import org.apache.druid.query.QueryContexts;
@@ -70,9 +71,11 @@ import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 
-@LazySingleton
+@ManageLifecycle
 public class DruidMeta extends MetaImpl
 {
+  private static final Logger log = new Logger(DruidMeta.class);
+
   /**
    * Logs any throwable and string format message with args at the error level.
    *
@@ -189,6 +192,15 @@ public class DruidMeta extends MetaImpl
     this.fetcherFactory = fetcherFactory;
   }
 
+  @LifecycleStop
+  public void stop() throws InterruptedException
+  {
+    exec.shutdownNow();
+    if (!exec.awaitTermination(1, TimeUnit.MINUTES)) {
+      log.warn("Timed out waiting for executor to shut down.");
+    }
+  }
+
   @Override
   public void openConnection(final ConnectionHandle ch, final Map<String, 
String> info)
   {
diff --git 
a/sql/src/test/java/org/apache/druid/quidem/DruidAvaticaTestDriver.java 
b/sql/src/test/java/org/apache/druid/quidem/DruidAvaticaTestDriver.java
index 85a86863046..f832ec80655 100644
--- a/sql/src/test/java/org/apache/druid/quidem/DruidAvaticaTestDriver.java
+++ b/sql/src/test/java/org/apache/druid/quidem/DruidAvaticaTestDriver.java
@@ -27,7 +27,6 @@ import com.google.inject.name.Named;
 import org.apache.calcite.avatica.server.AbstractAvaticaHandler;
 import org.apache.druid.guice.LazySingleton;
 import org.apache.druid.initialization.DruidModule;
-import org.apache.druid.java.util.common.FileUtils;
 import org.apache.druid.java.util.common.StringUtils;
 import org.apache.druid.java.util.common.io.Closer;
 import org.apache.druid.server.DruidNode;
@@ -46,7 +45,6 @@ import org.apache.http.client.utils.URIBuilder;
 import org.eclipse.jetty.server.Server;
 
 import java.io.Closeable;
-import java.io.File;
 import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.sql.Connection;
@@ -179,6 +177,7 @@ public class DruidAvaticaTestDriver implements Driver
     {
       druidMeta.closeAllConnections();
       try {
+        druidMeta.stop();
         server.stop();
       }
       catch (Exception e) {
@@ -223,25 +222,6 @@ public class DruidAvaticaTestDriver implements Driver
     }
   }
 
-  protected File createTempFolder(String prefix)
-  {
-    File tempDir = FileUtils.createTempDir(prefix);
-    Runtime.getRuntime().addShutdownHook(new Thread()
-    {
-      @Override
-      public void run()
-      {
-        try {
-          FileUtils.deleteDirectory(tempDir);
-        }
-        catch (IOException ex) {
-          ex.printStackTrace();
-        }
-      }
-    });
-    return tempDir;
-  }
-
   private void register()
   {
     try {
diff --git 
a/sql/src/test/java/org/apache/druid/sql/avatica/DruidAvaticaHandlerTest.java 
b/sql/src/test/java/org/apache/druid/sql/avatica/DruidAvaticaHandlerTest.java
index 0aa4193c89a..287f216d3aa 100644
--- 
a/sql/src/test/java/org/apache/druid/sql/avatica/DruidAvaticaHandlerTest.java
+++ 
b/sql/src/test/java/org/apache/druid/sql/avatica/DruidAvaticaHandlerTest.java
@@ -41,6 +41,7 @@ import org.apache.calcite.avatica.MissingResultsException;
 import org.apache.calcite.avatica.NoSuchStatementException;
 import org.apache.calcite.avatica.server.AbstractAvaticaHandler;
 import org.apache.druid.guice.LazySingleton;
+import org.apache.druid.guice.LifecycleModule;
 import org.apache.druid.guice.StartupInjectorBuilder;
 import org.apache.druid.guice.security.PolicyModule;
 import org.apache.druid.initialization.CoreInjectorBuilder;
@@ -269,6 +270,7 @@ public class DruidAvaticaHandlerTest extends CalciteTestBase
     testRequestLogger = new TestRequestLogger();
 
     injector = new CoreInjectorBuilder(new StartupInjectorBuilder().build())
+        .addModule(new LifecycleModule())
         .addModule(
             binder -> {
               
binder.bindConstant().annotatedWith(Names.named("serviceName")).to("test");


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

Reply via email to