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

morrysnow pushed a commit to branch branch-3.1
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-3.1 by this push:
     new 4325cced4c6 branch-3.1: [refactor](plugin) unify the plugin dir #45936 
(#52921)
4325cced4c6 is described below

commit 4325cced4c688082555bec9f2f7a7369ebde52d3
Author: Mingyu Chen (Rayner) <[email protected]>
AuthorDate: Tue Jul 8 17:45:03 2025 +0800

    branch-3.1: [refactor](plugin) unify the plugin dir #45936 (#52921)
    
    bp #45936
---
 be/src/common/config.cpp                           |  4 +--
 be/src/runtime/user_function_cache.h               |  2 ++
 bin/start_be.sh                                    |  8 ++++++
 bin/start_fe.sh                                    |  8 ++++++
 build.sh                                           | 12 +++++++--
 .../trinoconnector/TrinoConnectorPluginLoader.java | 30 +++++++++++++++++++---
 .../main/java/org/apache/doris/common/Config.java  | 24 ++++++++---------
 .../apache/doris/analysis/CreateFunctionStmt.java  |  3 ---
 .../org/apache/doris/catalog/JdbcResource.java     | 25 +++++++++++++++++-
 .../trinoconnector/TrinoConnectorPluginLoader.java | 29 ++++++++++++++++++---
 .../org/apache/doris/catalog/JdbcResourceTest.java |  6 +++--
 11 files changed, 123 insertions(+), 28 deletions(-)

diff --git a/be/src/common/config.cpp b/be/src/common/config.cpp
index 3da07eb9c72..612ae7fa4e4 100644
--- a/be/src/common/config.cpp
+++ b/be/src/common/config.cpp
@@ -52,7 +52,7 @@ namespace doris::config {
 DEFINE_String(custom_config_dir, "${DORIS_HOME}/conf");
 
 // Dir of jdbc drivers
-DEFINE_String(jdbc_drivers_dir, "${DORIS_HOME}/jdbc_drivers");
+DEFINE_String(jdbc_drivers_dir, "${DORIS_HOME}/plugins/jdbc_drivers");
 
 // cluster id
 DEFINE_Int32(cluster_id, "-1");
@@ -1394,7 +1394,7 @@ DEFINE_Validator(s3_put_token_per_second, [](int64_t 
config) -> bool { return co
 
 DEFINE_mInt64(s3_put_token_limit, "0");
 
-DEFINE_String(trino_connector_plugin_dir, "${DORIS_HOME}/connectors");
+DEFINE_String(trino_connector_plugin_dir, "${DORIS_HOME}/plugins/connectors");
 
 // ca_cert_file is in this path by default, Normally no modification is 
required
 // ca cert default path is different from different OS
diff --git a/be/src/runtime/user_function_cache.h 
b/be/src/runtime/user_function_cache.h
index 93759c261e2..2537d9376ec 100644
--- a/be/src/runtime/user_function_cache.h
+++ b/be/src/runtime/user_function_cache.h
@@ -75,6 +75,8 @@ private:
     std::string _get_file_name_from_url(const std::string& url) const;
     std::vector<std::string> _split_string_by_checksum(const std::string& 
file);
 
+    std::string _check_and_return_default_driver_url(const std::string& url);
+
 private:
     std::string _lib_dir;
     void* _current_process_handle = nullptr;
diff --git a/bin/start_be.sh b/bin/start_be.sh
index 3cb25ff735f..d59c6445be6 100755
--- a/bin/start_be.sh
+++ b/bin/start_be.sh
@@ -245,12 +245,20 @@ if [[ -d "${DORIS_HOME}/lib/java_extensions/jindofs" ]]; 
then
 fi
 
 # add custom_libs to CLASSPATH
+# ATTN, custom_libs is deprecated, use plugins/java_extensions
 if [[ -d "${DORIS_HOME}/custom_lib" ]]; then
     for f in "${DORIS_HOME}/custom_lib"/*.jar; do
         DORIS_CLASSPATH="${DORIS_CLASSPATH}:${f}"
     done
 fi
 
+# add plugins/java_extensions to CLASSPATH
+if [[ -d "${DORIS_HOME}/plugins/java_extensions" ]]; then
+    for f in "${DORIS_HOME}/plugins/java_extensions"/*.jar; do
+        CLASSPATH="${CLASSPATH}:${f}"
+    done
+fi
+
 # make sure the preload-extensions-project.jar is at first order, so that some 
classed
 # with same qualified name can be loaded priority from 
preload-extensions-project.jar.
 DORIS_CLASSPATH="${DORIS_PRELOAD_JAR}:${DORIS_CLASSPATH}"
diff --git a/bin/start_fe.sh b/bin/start_fe.sh
index 56cf5523c3e..2fd0920df63 100755
--- a/bin/start_fe.sh
+++ b/bin/start_fe.sh
@@ -217,6 +217,7 @@ for f in "${DORIS_HOME}/lib"/*.jar; do
 done
 
 # add custom_libs to CLASSPATH
+# ATTN, custom_libs is deprecated, use plugins/java_extensions
 if [[ -d "${DORIS_HOME}/custom_lib" ]]; then
     for f in "${DORIS_HOME}/custom_lib"/*.jar; do
         CLASSPATH="${CLASSPATH}:${f}"
@@ -231,6 +232,13 @@ if [[ -d "${DORIS_HOME}/lib/jindofs" ]]; then
     done
 fi
 
+# add plugins/java_extensions to CLASSPATH
+if [[ -d "${DORIS_HOME}/plugins/java_extensions" ]]; then
+    for f in "${DORIS_HOME}/plugins/java_extensions"/*.jar; do
+        CLASSPATH="${CLASSPATH}:${f}"
+    done
+fi
+
 # make sure the doris-fe.jar is at first order, so that some classed
 # with same qualified name can be loaded priority from doris-fe.jar
 CLASSPATH="${DORIS_FE_JAR}:${CLASSPATH}"
diff --git a/build.sh b/build.sh
index 3104fa51655..329aa7ff3ce 100755
--- a/build.sh
+++ b/build.sh
@@ -776,7 +776,11 @@ if [[ "${BUILD_FE}" -eq 1 ]]; then
     mkdir -p "${DORIS_OUTPUT}/fe/log"
     mkdir -p "${DORIS_OUTPUT}/fe/doris-meta"
     mkdir -p "${DORIS_OUTPUT}/fe/conf/ssl"
-    mkdir -p "${DORIS_OUTPUT}/fe/connectors"
+    mkdir -p "${DORIS_OUTPUT}/fe/plugins/jdbc_drivers/"
+    mkdir -p "${DORIS_OUTPUT}/fe/plugins/java_udf/"
+    mkdir -p "${DORIS_OUTPUT}/fe/plugins/connectors/"
+    mkdir -p "${DORIS_OUTPUT}/fe/plugins/hadoop_conf/"
+    mkdir -p "${DORIS_OUTPUT}/fe/plugins/java_extensions/"
 fi
 
 if [[ "${BUILD_SPARK_DPP}" -eq 1 ]]; then
@@ -914,7 +918,11 @@ EOF
     mkdir -p "${DORIS_OUTPUT}/be/log"
     mkdir -p "${DORIS_OUTPUT}/be/log/pipe_tracing"
     mkdir -p "${DORIS_OUTPUT}/be/storage"
-    mkdir -p "${DORIS_OUTPUT}/be/connectors"
+    mkdir -p "${DORIS_OUTPUT}/be/plugins/jdbc_drivers/"
+    mkdir -p "${DORIS_OUTPUT}/be/plugins/java_udf/"
+    mkdir -p "${DORIS_OUTPUT}/be/plugins/connectors/"
+    mkdir -p "${DORIS_OUTPUT}/be/plugins/hadoop_conf/"
+    mkdir -p "${DORIS_OUTPUT}/be/plugins/java_extensions/"
 fi
 
 if [[ "${BUILD_BROKER}" -eq 1 ]]; then
diff --git 
a/fe/be-java-extensions/trino-connector-scanner/src/main/java/org/apache/doris/trinoconnector/TrinoConnectorPluginLoader.java
 
b/fe/be-java-extensions/trino-connector-scanner/src/main/java/org/apache/doris/trinoconnector/TrinoConnectorPluginLoader.java
index 6e74929df70..842c4c744ca 100644
--- 
a/fe/be-java-extensions/trino-connector-scanner/src/main/java/org/apache/doris/trinoconnector/TrinoConnectorPluginLoader.java
+++ 
b/fe/be-java-extensions/trino-connector-scanner/src/main/java/org/apache/doris/trinoconnector/TrinoConnectorPluginLoader.java
@@ -40,7 +40,7 @@ import java.util.logging.SimpleFormatter;
 public class TrinoConnectorPluginLoader {
     private static final Logger LOG = 
LogManager.getLogger(TrinoConnectorPluginLoader.class);
 
-    private static String pluginsDir = EnvUtils.getDorisHome() + "/connectors";
+    private static String pluginsDir = EnvUtils.getDorisHome() + 
"/plugins/connectors";
 
     // Suppress default constructor for noninstantiability
     private TrinoConnectorPluginLoader() {
@@ -80,7 +80,7 @@ public class TrinoConnectorPluginLoader {
                 TypeRegistry typeRegistry = new TypeRegistry(typeOperators, 
featuresConfig);
 
                 ServerPluginsProviderConfig serverPluginsProviderConfig = new 
ServerPluginsProviderConfig()
-                        .setInstalledPluginsDir(new File(pluginsDir));
+                        .setInstalledPluginsDir(new 
File(checkAndReturnPluginDir()));
                 ServerPluginsProvider serverPluginsProvider = new 
ServerPluginsProvider(serverPluginsProviderConfig,
                         MoreExecutors.directExecutor());
                 HandleResolver handleResolver = new HandleResolver();
@@ -88,7 +88,8 @@ public class TrinoConnectorPluginLoader {
                         typeRegistry, handleResolver);
                 trinoConnectorPluginManager.loadPlugins();
             } catch (Exception e) {
-                LOG.warn("Failed load trino-connector plugins from  " + 
pluginsDir + ", Exception:" + e.getMessage());
+                LOG.warn("Failed load trino-connector plugins from  " + 
checkAndReturnPluginDir()
+                        + ", Exception:" + e.getMessage(), e);
             }
         }
     }
@@ -98,6 +99,29 @@ public class TrinoConnectorPluginLoader {
         TrinoConnectorPluginLoader.pluginsDir = pluginsDir;
     }
 
+    private static String checkAndReturnPluginDir() {
+        final String defaultDir = System.getenv("DORIS_HOME") + 
"/plugins/connectors";
+        final String defaultOldDir = System.getenv("DORIS_HOME") + 
"/connectors";
+        if (TrinoConnectorPluginLoader.pluginsDir.equals(defaultDir)) {
+            // If true, which means user does not set 
`trino_connector_plugin_dir` and use the default one.
+            // Because in 2.1.8, we change the default value of 
`trino_connector_plugin_dir`
+            // from `DORIS_HOME/connectors` to `DORIS_HOME/plugins/connectors`,
+            // so we need to check the old default dir for compatibility.
+            File oldDir = new File(defaultOldDir);
+            if (oldDir.exists() && oldDir.isDirectory()) {
+                String[] contents = oldDir.list();
+                if (contents != null && contents.length > 0) {
+                    // there are contents in old dir, use old one
+                    return defaultOldDir;
+                }
+            }
+            return defaultDir;
+        } else {
+            // Return user specified dir directly.
+            return TrinoConnectorPluginLoader.pluginsDir;
+        }
+    }
+
     public static TrinoConnectorPluginManager getTrinoConnectorPluginManager() 
{
         return TrinoConnectorPluginLoad.trinoConnectorPluginManager;
     }
diff --git a/fe/fe-common/src/main/java/org/apache/doris/common/Config.java 
b/fe/fe-common/src/main/java/org/apache/doris/common/Config.java
index 5fcb5165d38..e97b9030f05 100644
--- a/fe/fe-common/src/main/java/org/apache/doris/common/Config.java
+++ b/fe/fe-common/src/main/java/org/apache/doris/common/Config.java
@@ -149,7 +149,7 @@ public class Config extends ConfigBase {
     public static long prepared_stmt_start_id = -1;
 
     @ConfField(description = {"插件的安装目录", "The installation directory of the 
plugin"})
-    public static String plugin_dir = System.getenv("DORIS_HOME") + "/plugins";
+    public static String plugin_dir =  EnvUtils.getDorisHome() + "/plugins";
 
     @ConfField(mutable = true, masterOnly = true, description = {"是否启用插件", 
"Whether to enable the plugin"})
     public static boolean plugin_enable = true;
@@ -158,7 +158,7 @@ public class Config extends ConfigBase {
             "JDBC 驱动的存放路径。在创建 JDBC Catalog 时,如果指定的驱动文件路径不是绝对路径,则会在这个目录下寻找",
             "The path to save jdbc drivers. When creating JDBC Catalog,"
                     + "if the specified driver file path is not an absolute 
path, Doris will find jars from this path"})
-    public static String jdbc_drivers_dir = System.getenv("DORIS_HOME") + 
"/jdbc_drivers";
+    public static String jdbc_drivers_dir = EnvUtils.getDorisHome() + 
"/plugins/jdbc_drivers";
 
     @ConfField(description = {"JDBC 驱动的安全路径。在创建 JDBC Catalog 
时,允许使用的文件或者网络路径,可配置多个,使用分号分隔"
             + "默认为 * 表示全部允许,如果设置为空也表示全部允许",
@@ -215,10 +215,10 @@ public class Config extends ConfigBase {
     public static int label_clean_interval_second = 1 * 3600; // 1 hours
 
     @ConfField(description = {"元数据的存储目录", "The directory to save Doris meta 
data"})
-    public static String meta_dir = System.getenv("DORIS_HOME") + 
"/doris-meta";
+    public static String meta_dir =  EnvUtils.getDorisHome() + "/doris-meta";
 
     @ConfField(description = {"临时文件的存储目录", "The directory to save Doris temp 
data"})
-    public static String tmp_dir = System.getenv("DORIS_HOME") + "/temp_dir";
+    public static String tmp_dir =  EnvUtils.getDorisHome() + "/temp_dir";
 
     @ConfField(description = {"元数据日志的存储类型。BDB: 日志存储在 BDBJE 
中。LOCAL:日志存储在本地文件中(仅用于测试)",
             "The storage type of the metadata log. BDB: Logs are stored in 
BDBJE. "
@@ -373,7 +373,7 @@ public class Config extends ConfigBase {
 
     @ConfField(description = {"FE https 服务的 key store 路径",
             "The key store path of FE https service"})
-    public static String key_store_path = System.getenv("DORIS_HOME")
+    public static String key_store_path =  EnvUtils.getDorisHome()
             + "/conf/ssl/doris_ssl_certificate.keystore";
 
     @ConfField(description = {"FE https 服务的 key store 密码",
@@ -637,7 +637,7 @@ public class Config extends ConfigBase {
 
     @ConfField(mutable = true, masterOnly = true, description = {"Spark Load 
所使用的 Spark 程序目录",
             "Spark dir for Spark Load"})
-    public static String spark_home_default_dir = System.getenv("DORIS_HOME") 
+ "/lib/spark2x";
+    public static String spark_home_default_dir =  EnvUtils.getDorisHome() + 
"/lib/spark2x";
 
     @ConfField(description = {"Spark load 所使用的依赖项目录", "Spark dependencies dir 
for Spark Load"})
     public static String spark_resource_path = "";
@@ -646,10 +646,10 @@ public class Config extends ConfigBase {
     public static String spark_launcher_log_dir = System.getenv("LOG_DIR") + 
"/spark_launcher_log";
 
     @ConfField(description = {"Yarn client 的路径", "Yarn client path"})
-    public static String yarn_client_path = System.getenv("DORIS_HOME") + 
"/lib/yarn-client/hadoop/bin/yarn";
+    public static String yarn_client_path =  EnvUtils.getDorisHome() + 
"/lib/yarn-client/hadoop/bin/yarn";
 
     @ConfField(description = {"Yarn 配置文件的路径", "Yarn config path"})
-    public static String yarn_config_dir = System.getenv("DORIS_HOME") + 
"/lib/yarn-config";
+    public static String yarn_config_dir =  EnvUtils.getDorisHome() + 
"/lib/yarn-config";
 
     @ConfField(mutable = true, masterOnly = true, description = {"Broker Load 
的最大等待 job 数量。"
             + "这个值是一个期望值。在某些情况下,比如切换 master,当前等待的 job 数量可能会超过这个值。",
@@ -1279,7 +1279,7 @@ public class Config extends ConfigBase {
      * Save small files
      */
     @ConfField
-    public static String small_file_dir = System.getenv("DORIS_HOME") + 
"/small_files";
+    public static String small_file_dir =  EnvUtils.getDorisHome() + 
"/small_files";
 
     /**
      * This will limit the max recursion depth of hash distribution pruner.
@@ -2353,14 +2353,14 @@ public class Config extends ConfigBase {
      * Default CA certificate file location for mysql ssl connection.
      */
     @ConfField(mutable = false, masterOnly = false)
-    public static String mysql_ssl_default_ca_certificate = 
System.getenv("DORIS_HOME")
+    public static String mysql_ssl_default_ca_certificate =  
EnvUtils.getDorisHome()
             + "/mysql_ssl_default_certificate/ca_certificate.p12";
 
     /**
      * Default server certificate file location for mysql ssl connection.
      */
     @ConfField(mutable = false, masterOnly = false)
-    public static String mysql_ssl_default_server_certificate = 
System.getenv("DORIS_HOME")
+    public static String mysql_ssl_default_server_certificate =  
EnvUtils.getDorisHome()
             + "/mysql_ssl_default_certificate/server_certificate.p12";
 
     /**
@@ -2907,7 +2907,7 @@ public class Config extends ConfigBase {
 
     @ConfField(mutable = true, masterOnly = false, description = {"指定 
trino-connector catalog 的插件默认加载路径",
             "Specify the default plugins loading path for the trino-connector 
catalog"})
-    public static String trino_connector_plugin_dir = EnvUtils.getDorisHome() 
+ "/connectors";
+    public static String trino_connector_plugin_dir = EnvUtils.getDorisHome() 
+ "/plugins/connectors";
 
     @ConfField(description = {
             "存放 hadoop conf 配置文件的默认目录。",
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateFunctionStmt.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateFunctionStmt.java
index 4a38d06ffe2..06cab70d7d9 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateFunctionStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateFunctionStmt.java
@@ -268,9 +268,6 @@ public class CreateFunctionStmt extends DdlStmt implements 
NotFallbackInParser {
         }
 
         userFile = properties.getOrDefault(FILE_KEY, 
properties.get(OBJECT_FILE_KEY));
-        //        if (Strings.isNullOrEmpty(userFile)) {
-        //            throw new AnalysisException("No 'file' or 'object_file' 
in properties");
-        //        }
         if (!Strings.isNullOrEmpty(userFile) && binaryType != 
TFunctionBinaryType.RPC) {
             try {
                 computeObjectChecksum();
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/catalog/JdbcResource.java 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/JdbcResource.java
index c3c8b4d49a6..2989e8859bf 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/JdbcResource.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/JdbcResource.java
@@ -21,6 +21,7 @@ package org.apache.doris.catalog;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.Config;
 import org.apache.doris.common.DdlException;
+import org.apache.doris.common.EnvUtils;
 import org.apache.doris.common.FeConstants;
 import org.apache.doris.common.proc.BaseProcResult;
 import org.apache.doris.common.util.Util;
@@ -36,6 +37,7 @@ import org.apache.commons.codec.binary.Hex;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
+import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URI;
@@ -301,7 +303,7 @@ public class JdbcResource extends Resource {
             String schema = uri.getScheme();
             checkCloudWhiteList(driverUrl);
             if (schema == null && !driverUrl.startsWith("/")) {
-                return "file://" + Config.jdbc_drivers_dir + "/" + driverUrl;
+                return checkAndReturnDefaultDriverUrl(driverUrl);
             }
 
             if ("*".equals(Config.jdbc_driver_secure_path)) {
@@ -320,6 +322,27 @@ public class JdbcResource extends Resource {
         }
     }
 
+    private static String checkAndReturnDefaultDriverUrl(String driverUrl) {
+        final String defaultDriverUrl = EnvUtils.getDorisHome() + 
"/plugins/jdbc_drivers";
+        final String defaultOldDriverUrl = EnvUtils.getDorisHome() + 
"/jdbc_drivers";
+        if (Config.jdbc_drivers_dir.equals(defaultDriverUrl)) {
+            // If true, which means user does not set `jdbc_drivers_dir` and 
use the default one.
+            // Because in new version, we change the default value of 
`jdbc_drivers_dir`
+            // from `DORIS_HOME/jdbc_drivers` to 
`DORIS_HOME/plugins/jdbc_drivers`,
+            // so we need to check the old default dir for compatibility.
+            File file = new File(defaultDriverUrl + "/" + driverUrl);
+            if (file.exists()) {
+                return "file://" + defaultDriverUrl + "/" + driverUrl;
+            } else {
+                // use old one
+                return "file://" + defaultOldDriverUrl + "/" + driverUrl;
+            }
+        } else {
+            // Return user specified driver url directly.
+            return "file://" + Config.jdbc_drivers_dir + "/" + driverUrl;
+        }
+    }
+
     public static String parseDbType(String url) throws DdlException {
         if (url.startsWith(JDBC_MYSQL) || url.startsWith(JDBC_MARIADB)) {
             return MYSQL;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/trinoconnector/TrinoConnectorPluginLoader.java
 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/trinoconnector/TrinoConnectorPluginLoader.java
index a6f42d0ae15..bc925785c57 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/trinoconnector/TrinoConnectorPluginLoader.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/trinoconnector/TrinoConnectorPluginLoader.java
@@ -76,15 +76,38 @@ public class TrinoConnectorPluginLoader {
 
                 typeRegistry = new TypeRegistry(typeOperators, featuresConfig);
                 ServerPluginsProviderConfig serverPluginsProviderConfig = new 
ServerPluginsProviderConfig()
-                        .setInstalledPluginsDir(new 
File(Config.trino_connector_plugin_dir));
+                        .setInstalledPluginsDir(new 
File(checkAndReturnPluginDir()));
                 ServerPluginsProvider serverPluginsProvider = new 
ServerPluginsProvider(serverPluginsProviderConfig,
                         MoreExecutors.directExecutor());
                 trinoConnectorPluginManager = new 
TrinoConnectorPluginManager(serverPluginsProvider,
                         typeRegistry, handleResolver);
                 trinoConnectorPluginManager.loadPlugins();
             } catch (Exception e) {
-                LOG.warn("Failed load trino-connector plugins from  " + 
Config.trino_connector_plugin_dir
-                        + ", Exception:" + e.getMessage());
+                LOG.warn("Failed load trino-connector plugins from  " + 
checkAndReturnPluginDir()
+                        + ", Exception:" + e.getMessage(), e);
+            }
+        }
+
+        private static String checkAndReturnPluginDir() {
+            final String defaultDir = System.getenv("DORIS_HOME") + 
"/plugins/connectors";
+            final String defaultOldDir = System.getenv("DORIS_HOME") + 
"/connectors";
+            if (Config.trino_connector_plugin_dir.equals(defaultDir)) {
+                // If true, which means user does not set 
`trino_connector_plugin_dir` and use the default one.
+                // Because in 2.1.8, we change the default value of 
`trino_connector_plugin_dir`
+                // from `DORIS_HOME/connectors` to 
`DORIS_HOME/plugins/connectors`,
+                // so we need to check the old default dir for compatibility.
+                File oldDir = new File(defaultOldDir);
+                if (oldDir.exists() && oldDir.isDirectory()) {
+                    String[] contents = oldDir.list();
+                    if (contents != null && contents.length > 0) {
+                        // there are contents in old dir, use old one
+                        return defaultOldDir;
+                    }
+                }
+                return defaultDir;
+            } else {
+                // Return user specified dir directly.
+                return Config.trino_connector_plugin_dir;
             }
         }
     }
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/catalog/JdbcResourceTest.java 
b/fe/fe-core/src/test/java/org/apache/doris/catalog/JdbcResourceTest.java
index 3cd8f872ce9..1417d75b2e8 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/catalog/JdbcResourceTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/catalog/JdbcResourceTest.java
@@ -22,6 +22,7 @@ import org.apache.doris.analysis.Analyzer;
 import org.apache.doris.analysis.CreateResourceStmt;
 import org.apache.doris.common.Config;
 import org.apache.doris.common.DdlException;
+import org.apache.doris.common.EnvUtils;
 import org.apache.doris.common.FeConstants;
 import org.apache.doris.common.UserException;
 import org.apache.doris.mysql.privilege.AccessControllerManager;
@@ -205,11 +206,12 @@ public class JdbcResourceTest {
     }
 
     @Test
-    public void testJdbcDriverPtah() {
+    public void testJdbcDriverPath() {
         String driverPath = "postgresql-42.5.0.jar";
         Config.jdbc_driver_secure_path = "";
+        Config.jdbc_drivers_dir = EnvUtils.getDorisHome() + 
"/plugins/jdbc_drivers";
         String fullPath = JdbcResource.getFullDriverUrl(driverPath);
-        Assert.assertEquals(fullPath, "file://" + Config.jdbc_drivers_dir + 
"/" + driverPath);
+        Assert.assertEquals("file://" + EnvUtils.getDorisHome() + 
"/jdbc_drivers/" + driverPath, fullPath);
         Config.jdbc_driver_secure_path = "file:///jdbc/;http://jdbc";;
         String driverPath2 = "file:///postgresql-42.5.0.jar";
         Exception exception = 
Assert.assertThrows(IllegalArgumentException.class, () -> {


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

Reply via email to