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

liyang-kylin pushed a commit to branch kylin5
in repository https://gitbox.apache.org/repos/asf/kylin.git

commit f8943c59c05cd62327b71911d24038e1e71353de
Author: Li Yang <[email protected]>
AuthorDate: Sat Nov 7 16:22:37 2026 +0800

    KYLIN-6127 close replaced JDBC pushdown pools
---
 .../pushdown/JdbcPushDownConnectionManager.java    |  5 +-
 .../JdbcPushDownConnectionManagerTest.java         | 81 ++++++++++++++++++++++
 2 files changed, 85 insertions(+), 1 deletion(-)

diff --git 
a/src/spark-project/sparder/src/main/java/org/apache/kylin/query/pushdown/JdbcPushDownConnectionManager.java
 
b/src/spark-project/sparder/src/main/java/org/apache/kylin/query/pushdown/JdbcPushDownConnectionManager.java
index 40d1b57376..3a615e4ee1 100644
--- 
a/src/spark-project/sparder/src/main/java/org/apache/kylin/query/pushdown/JdbcPushDownConnectionManager.java
+++ 
b/src/spark-project/sparder/src/main/java/org/apache/kylin/query/pushdown/JdbcPushDownConnectionManager.java
@@ -38,7 +38,10 @@ public class JdbcPushDownConnectionManager {
             synchronized (JdbcPushDownConnectionManager.class) {
                 if (needUpdateProjectConnectionManager(manager, 
newDataSourceConfig)) {
                     manager = new JdbcPushDownConnectionManager(config, 
newDataSourceConfig);
-                    managerMap.put(project, manager);
+                    JdbcPushDownConnectionManager previousManager = 
managerMap.put(project, manager);
+                    if (previousManager != null) {
+                        previousManager.close();
+                    }
                 }
             }
         }
diff --git 
a/src/spark-project/sparder/src/test/java/org/apache/kylin/query/pushdown/JdbcPushDownConnectionManagerTest.java
 
b/src/spark-project/sparder/src/test/java/org/apache/kylin/query/pushdown/JdbcPushDownConnectionManagerTest.java
new file mode 100644
index 0000000000..5b105f9332
--- /dev/null
+++ 
b/src/spark-project/sparder/src/test/java/org/apache/kylin/query/pushdown/JdbcPushDownConnectionManagerTest.java
@@ -0,0 +1,81 @@
+/*
+ * 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.kylin.query.pushdown;
+
+import java.sql.Connection;
+import java.util.Map;
+import java.util.UUID;
+
+import org.apache.kylin.common.KylinConfig;
+import org.apache.kylin.common.KylinConfigExt;
+import org.apache.kylin.common.util.NLocalFileMetadataTestCase;
+import org.apache.kylin.guava30.shaded.common.collect.Maps;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class JdbcPushDownConnectionManagerTest extends 
NLocalFileMetadataTestCase {
+
+    @Before
+    public void setup() {
+        createTestMetadata();
+    }
+
+    @After
+    public void tearDown() {
+        cleanupTestMetadata();
+    }
+
+    @Test
+    public void testReplacedConnectionManagerIsClosed() throws Exception {
+        String project = "pushdown-pool-" + UUID.randomUUID();
+        Map<String, String> overrides = pushdownOverrides("2");
+        KylinConfig config = 
KylinConfigExt.createInstance(KylinConfig.getInstanceFromEnv(), overrides);
+
+        JdbcPushDownConnectionManager manager = 
JdbcPushDownConnectionManager.getConnectionManager(config, project);
+        try (Connection ignored = manager.getConnection()) {
+            Assert.assertNotNull(ignored);
+        }
+
+        overrides.put("kylin.query.pushdown.jdbc.pool-max-total", "3");
+        KylinConfig changedConfig = 
KylinConfigExt.createInstance(KylinConfig.getInstanceFromEnv(), overrides);
+        JdbcPushDownConnectionManager changedManager = 
JdbcPushDownConnectionManager.getConnectionManager(
+                changedConfig, project);
+
+        Assert.assertNotSame(manager, changedManager);
+        Assert.assertThrows(RuntimeException.class, manager::getConnection);
+        try (Connection ignored = changedManager.getConnection()) {
+            Assert.assertNotNull(ignored);
+        } finally {
+            changedManager.close();
+        }
+    }
+
+    private Map<String, String> pushdownOverrides(String maxTotal) {
+        Map<String, String> overrides = Maps.newHashMap();
+        overrides.put("kylin.query.pushdown.jdbc.url",
+                "jdbc:h2:mem:pushdown_pool_reload;DB_CLOSE_DELAY=-1");
+        overrides.put("kylin.query.pushdown.jdbc.driver", "org.h2.Driver");
+        overrides.put("kylin.query.pushdown.jdbc.username", "sa");
+        overrides.put("kylin.query.pushdown.jdbc.password", "");
+        overrides.put("kylin.query.pushdown.jdbc.pool-max-total", maxTotal);
+        return overrides;
+    }
+}

Reply via email to