You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ro...@apache.org on 2022/05/21 17:54:16 UTC

[iotdb] 03/04: mv service package

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

rong pushed a commit to branch iotdb-3250
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit f40c95f9422893de9873f38a398c70e4d03ed6f0
Author: Steve Yurong Su <ro...@apache.org>
AuthorDate: Sun May 22 01:29:39 2022 +0800

    mv service package
---
 .../IoTDBSyntaxConventionStringLiteralIT.java      |  4 +-
 .../iotdb/db/integration/IoTDBUDFManagementIT.java | 12 +--
 .../commons/udf/api/exception/UDFException.java    |  2 +-
 .../api}/exception/UDFRegistrationException.java   |  6 +-
 .../udf/builtin/BuiltinAggregationFunction.java    | 59 ++++++++++++++
 ...va => BuiltinTimeSeriesGeneratingFunction.java} |  4 +-
 .../iotdb/commons}/udf/service/UDFClassLoader.java |  4 +-
 .../udf/service/UDFClassLoaderManager.java         | 30 +++----
 .../iotdb/commons}/udf/service/UDFLogWriter.java   |  2 +-
 .../udf/service/UDFRegistrationInformation.java    |  2 +-
 .../udf/service/UDFRegistrationService.java        | 91 +++++++++++-----------
 .../operator/process/TransformOperator.java        |  4 +-
 .../plan/expression/multi/FunctionExpression.java  |  8 +-
 .../db/mpp/transformation/dag/udf/UDTFContext.java |  2 +-
 .../mpp/transformation/dag/udf/UDTFExecutor.java   |  2 +-
 .../transformation/dag/udf/UDTFTypeInferrer.java   |  2 +-
 .../apache/iotdb/db/qp/constant/SQLConstant.java   | 31 +-------
 .../apache/iotdb/db/qp/executor/PlanExecutor.java  | 17 ++--
 .../apache/iotdb/db/query/dataset/UDTFDataSet.java |  4 +-
 .../java/org/apache/iotdb/db/service/DataNode.java | 16 +++-
 .../java/org/apache/iotdb/db/service/IoTDB.java    | 16 +++-
 .../iotdb/db/qp/physical/PhysicalPlanTest.java     |  2 +-
 .../apache/iotdb/db/utils/EnvironmentUtils.java    |  4 +-
 23 files changed, 188 insertions(+), 136 deletions(-)

diff --git a/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBSyntaxConventionStringLiteralIT.java b/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBSyntaxConventionStringLiteralIT.java
index 957c967453..06e7390c94 100644
--- a/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBSyntaxConventionStringLiteralIT.java
+++ b/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBSyntaxConventionStringLiteralIT.java
@@ -18,7 +18,7 @@
  */
 package org.apache.iotdb.db.integration;
 
-import org.apache.iotdb.commons.udf.builtin.BuiltinFunction;
+import org.apache.iotdb.commons.udf.builtin.BuiltinTimeSeriesGeneratingFunction;
 import org.apache.iotdb.integration.env.EnvFactory;
 import org.apache.iotdb.itbase.category.ClusterTest;
 import org.apache.iotdb.itbase.category.LocalStandaloneTest;
@@ -448,7 +448,7 @@ public class IoTDBSyntaxConventionStringLiteralIT {
         }
         ++count;
       }
-      Assert.assertEquals(1 + BuiltinFunction.values().length, count);
+      Assert.assertEquals(1 + BuiltinTimeSeriesGeneratingFunction.values().length, count);
       resultSet.close();
       statement.execute("drop function udf");
 
diff --git a/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBUDFManagementIT.java b/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBUDFManagementIT.java
index 84c1920805..8957bb4a8a 100644
--- a/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBUDFManagementIT.java
+++ b/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBUDFManagementIT.java
@@ -20,9 +20,9 @@
 package org.apache.iotdb.db.integration;
 
 import org.apache.iotdb.commons.path.PartialPath;
-import org.apache.iotdb.commons.udf.builtin.BuiltinFunction;
-import org.apache.iotdb.db.qp.constant.SQLConstant;
-import org.apache.iotdb.db.query.udf.service.UDFRegistrationService;
+import org.apache.iotdb.commons.udf.builtin.BuiltinAggregationFunction;
+import org.apache.iotdb.commons.udf.builtin.BuiltinTimeSeriesGeneratingFunction;
+import org.apache.iotdb.commons.udf.service.UDFRegistrationService;
 import org.apache.iotdb.db.service.IoTDB;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
 import org.apache.iotdb.itbase.category.LocalStandaloneTest;
@@ -53,8 +53,10 @@ import static org.junit.Assert.fail;
 @Category({LocalStandaloneTest.class})
 public class IoTDBUDFManagementIT {
 
-  private static final int NATIVE_FUNCTIONS_COUNT = SQLConstant.getNativeFunctionNames().size();
-  private static final int BUILTIN_FUNCTIONS_COUNT = BuiltinFunction.values().length;
+  private static final int NATIVE_FUNCTIONS_COUNT =
+      BuiltinAggregationFunction.getNativeFunctionNames().size();
+  private static final int BUILTIN_FUNCTIONS_COUNT =
+      BuiltinTimeSeriesGeneratingFunction.values().length;
 
   @Before
   public void setUp() throws Exception {
diff --git a/node-commons/src/main/java/org/apache/iotdb/commons/udf/api/exception/UDFException.java b/node-commons/src/main/java/org/apache/iotdb/commons/udf/api/exception/UDFException.java
index c4a974cd34..8c21d7f51d 100644
--- a/node-commons/src/main/java/org/apache/iotdb/commons/udf/api/exception/UDFException.java
+++ b/node-commons/src/main/java/org/apache/iotdb/commons/udf/api/exception/UDFException.java
@@ -19,7 +19,7 @@
 
 package org.apache.iotdb.commons.udf.api.exception;
 
-public class UDFException extends Exception {
+public class UDFException extends RuntimeException {
 
   public UDFException(String message) {
     super(message);
diff --git a/server/src/main/java/org/apache/iotdb/db/exception/UDFRegistrationException.java b/node-commons/src/main/java/org/apache/iotdb/commons/udf/api/exception/UDFRegistrationException.java
similarity index 85%
rename from server/src/main/java/org/apache/iotdb/db/exception/UDFRegistrationException.java
rename to node-commons/src/main/java/org/apache/iotdb/commons/udf/api/exception/UDFRegistrationException.java
index 82527e989d..d02d1851d9 100644
--- a/server/src/main/java/org/apache/iotdb/db/exception/UDFRegistrationException.java
+++ b/node-commons/src/main/java/org/apache/iotdb/commons/udf/api/exception/UDFRegistrationException.java
@@ -17,11 +17,9 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.exception;
+package org.apache.iotdb.commons.udf.api.exception;
 
-import org.apache.iotdb.db.exception.query.QueryProcessException;
-
-public class UDFRegistrationException extends QueryProcessException {
+public class UDFRegistrationException extends UDFException {
 
   public UDFRegistrationException(String message, Throwable cause) {
     super(message);
diff --git a/node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/BuiltinAggregationFunction.java b/node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/BuiltinAggregationFunction.java
new file mode 100644
index 0000000000..5f855c60fd
--- /dev/null
+++ b/node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/BuiltinAggregationFunction.java
@@ -0,0 +1,59 @@
+/*
+ * 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.iotdb.commons.udf.builtin;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+public enum BuiltinAggregationFunction {
+  MIN_TIME("min_time"),
+  MAX_TIME("max_value"),
+  MAX_VALUE("max_value"),
+  MIN_VALUE("min_value"),
+  EXTREME("extreme"),
+  FIRST_VALUE("first_value"),
+  LAST_VALUE("last_value"),
+  COUNT("count"),
+  AVG("avg"),
+  SUM("sum"),
+  ;
+
+  private final String functionName;
+
+  BuiltinAggregationFunction(String functionName) {
+    this.functionName = functionName;
+  }
+
+  public String getFunctionName() {
+    return functionName;
+  }
+
+  private static final Set<String> NATIVE_FUNCTION_NAMES =
+      new HashSet<>(
+          Arrays.stream(BuiltinAggregationFunction.values())
+              .map(BuiltinAggregationFunction::getFunctionName)
+              .collect(Collectors.toList()));
+
+  public static Set<String> getNativeFunctionNames() {
+    return NATIVE_FUNCTION_NAMES;
+  }
+}
diff --git a/node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/BuiltinFunction.java b/node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/BuiltinTimeSeriesGeneratingFunction.java
similarity index 96%
rename from node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/BuiltinFunction.java
rename to node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/BuiltinTimeSeriesGeneratingFunction.java
index ed8bc85d33..4208735bcb 100644
--- a/node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/BuiltinFunction.java
+++ b/node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/BuiltinTimeSeriesGeneratingFunction.java
@@ -20,7 +20,7 @@
 package org.apache.iotdb.commons.udf.builtin;
 
 /** All built-in UDFs need to register their function names and classes here. */
-public enum BuiltinFunction {
+public enum BuiltinTimeSeriesGeneratingFunction {
   CONST("CONST", UDTFConst.class),
   E("E", UDTFConstE.class),
   PI("PI", UDTFConstPi.class),
@@ -72,7 +72,7 @@ public enum BuiltinFunction {
   private final Class<?> functionClass;
   private final String className;
 
-  BuiltinFunction(String functionName, Class<?> functionClass) {
+  BuiltinTimeSeriesGeneratingFunction(String functionName, Class<?> functionClass) {
     this.functionName = functionName;
     this.functionClass = functionClass;
     this.className = functionClass.getName();
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/service/UDFClassLoader.java b/node-commons/src/main/java/org/apache/iotdb/commons/udf/service/UDFClassLoader.java
similarity index 95%
rename from server/src/main/java/org/apache/iotdb/db/query/udf/service/UDFClassLoader.java
rename to node-commons/src/main/java/org/apache/iotdb/commons/udf/service/UDFClassLoader.java
index d877713a53..ebbe4d65b8 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/service/UDFClassLoader.java
+++ b/node-commons/src/main/java/org/apache/iotdb/commons/udf/service/UDFClassLoader.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.query.udf.service;
+package org.apache.iotdb.commons.udf.service;
 
 import org.apache.iotdb.commons.file.SystemFileFactory;
 
@@ -46,7 +46,7 @@ public class UDFClassLoader extends URLClassLoader {
    */
   private volatile boolean deprecated;
 
-  UDFClassLoader(String libRoot) throws IOException {
+  public UDFClassLoader(String libRoot) throws IOException {
     super(new URL[0]);
     this.libRoot = libRoot;
     activeQueriesCount = new AtomicLong(0);
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/service/UDFClassLoaderManager.java b/node-commons/src/main/java/org/apache/iotdb/commons/udf/service/UDFClassLoaderManager.java
similarity index 85%
rename from server/src/main/java/org/apache/iotdb/db/query/udf/service/UDFClassLoaderManager.java
rename to node-commons/src/main/java/org/apache/iotdb/commons/udf/service/UDFClassLoaderManager.java
index 99cf877d3e..230f3c222c 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/service/UDFClassLoaderManager.java
+++ b/node-commons/src/main/java/org/apache/iotdb/commons/udf/service/UDFClassLoaderManager.java
@@ -17,13 +17,12 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.query.udf.service;
+package org.apache.iotdb.commons.udf.service;
 
 import org.apache.iotdb.commons.exception.StartupException;
 import org.apache.iotdb.commons.file.SystemFileFactory;
 import org.apache.iotdb.commons.service.IService;
 import org.apache.iotdb.commons.service.ServiceType;
-import org.apache.iotdb.db.conf.IoTDBDescriptor;
 
 import org.apache.commons.io.FileUtils;
 import org.slf4j.Logger;
@@ -36,7 +35,7 @@ import java.util.concurrent.ConcurrentHashMap;
 
 public class UDFClassLoaderManager implements IService {
 
-  private static final Logger logger = LoggerFactory.getLogger(UDFClassLoaderManager.class);
+  private static final Logger LOGGER = LoggerFactory.getLogger(UDFClassLoaderManager.class);
 
   private final String libRoot;
 
@@ -50,9 +49,9 @@ public class UDFClassLoaderManager implements IService {
    */
   private volatile UDFClassLoader activeClassLoader;
 
-  UDFClassLoaderManager() {
-    libRoot = IoTDBDescriptor.getInstance().getConfig().getUdfDir();
-    logger.info("UDF lib root: {}", libRoot);
+  private UDFClassLoaderManager(String libRoot) {
+    this.libRoot = libRoot;
+    LOGGER.info("UDF lib root: {}", libRoot);
     queryIdToUDFClassLoaderMap = new ConcurrentHashMap<>();
     activeClassLoader = null;
   }
@@ -67,7 +66,7 @@ public class UDFClassLoaderManager implements IService {
     try {
       classLoader.release();
     } catch (IOException e) {
-      logger.warn(
+      LOGGER.warn(
           "Failed to close UDFClassLoader (queryId: {}), because {}", queryId, e.toString());
     }
   }
@@ -111,14 +110,17 @@ public class UDFClassLoaderManager implements IService {
     return ServiceType.UDF_CLASSLOADER_MANAGER_SERVICE;
   }
 
-  public static UDFClassLoaderManager getInstance() {
-    return UDFClassLoaderManager.UDFClassLoaderManagerHelper.INSTANCE;
-  }
-
-  private static class UDFClassLoaderManagerHelper {
+  private static UDFClassLoaderManager INSTANCE = null;
 
-    private static final UDFClassLoaderManager INSTANCE = new UDFClassLoaderManager();
+  public static synchronized UDFClassLoaderManager setupAndGetInstance(String libRoot) {
+    if (INSTANCE == null) {
+      INSTANCE = new UDFClassLoaderManager(libRoot);
+      return INSTANCE;
+    }
+    throw new UnsupportedOperationException();
+  }
 
-    private UDFClassLoaderManagerHelper() {}
+  public static UDFClassLoaderManager getInstance() {
+    return UDFClassLoaderManager.INSTANCE;
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/service/UDFLogWriter.java b/node-commons/src/main/java/org/apache/iotdb/commons/udf/service/UDFLogWriter.java
similarity index 97%
rename from server/src/main/java/org/apache/iotdb/db/query/udf/service/UDFLogWriter.java
rename to node-commons/src/main/java/org/apache/iotdb/commons/udf/service/UDFLogWriter.java
index 03d2fa70df..51068cf99b 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/service/UDFLogWriter.java
+++ b/node-commons/src/main/java/org/apache/iotdb/commons/udf/service/UDFLogWriter.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.query.udf.service;
+package org.apache.iotdb.commons.udf.service;
 
 import org.apache.iotdb.commons.file.SystemFileFactory;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/service/UDFRegistrationInformation.java b/node-commons/src/main/java/org/apache/iotdb/commons/udf/service/UDFRegistrationInformation.java
similarity index 97%
rename from server/src/main/java/org/apache/iotdb/db/query/udf/service/UDFRegistrationInformation.java
rename to node-commons/src/main/java/org/apache/iotdb/commons/udf/service/UDFRegistrationInformation.java
index 729629c0b2..a4997ead0b 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/service/UDFRegistrationInformation.java
+++ b/node-commons/src/main/java/org/apache/iotdb/commons/udf/service/UDFRegistrationInformation.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.query.udf.service;
+package org.apache.iotdb.commons.udf.service;
 
 import org.apache.iotdb.commons.udf.api.UDTF;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/service/UDFRegistrationService.java b/node-commons/src/main/java/org/apache/iotdb/commons/udf/service/UDFRegistrationService.java
similarity index 84%
rename from server/src/main/java/org/apache/iotdb/db/query/udf/service/UDFRegistrationService.java
rename to node-commons/src/main/java/org/apache/iotdb/commons/udf/service/UDFRegistrationService.java
index 6c890da7f2..0133f227d8 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/service/UDFRegistrationService.java
+++ b/node-commons/src/main/java/org/apache/iotdb/commons/udf/service/UDFRegistrationService.java
@@ -17,18 +17,17 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.query.udf.service;
+package org.apache.iotdb.commons.udf.service;
 
 import org.apache.iotdb.commons.exception.StartupException;
 import org.apache.iotdb.commons.file.SystemFileFactory;
 import org.apache.iotdb.commons.service.IService;
 import org.apache.iotdb.commons.service.ServiceType;
 import org.apache.iotdb.commons.udf.api.UDF;
-import org.apache.iotdb.commons.udf.builtin.BuiltinFunction;
+import org.apache.iotdb.commons.udf.api.exception.UDFRegistrationException;
+import org.apache.iotdb.commons.udf.builtin.BuiltinAggregationFunction;
+import org.apache.iotdb.commons.udf.builtin.BuiltinTimeSeriesGeneratingFunction;
 import org.apache.iotdb.commons.utils.TestOnly;
-import org.apache.iotdb.db.conf.IoTDBDescriptor;
-import org.apache.iotdb.db.exception.UDFRegistrationException;
-import org.apache.iotdb.db.qp.constant.SQLConstant;
 import org.apache.iotdb.tsfile.fileSystem.FSFactoryProducer;
 
 import org.apache.commons.io.FileUtils;
@@ -48,15 +47,11 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 public class UDFRegistrationService implements IService {
 
-  private static final Logger logger = LoggerFactory.getLogger(UDFRegistrationService.class);
+  private static final Logger LOGGER = LoggerFactory.getLogger(UDFRegistrationService.class);
 
-  private static final String ULOG_FILE_DIR =
-      IoTDBDescriptor.getInstance().getConfig().getSystemDir()
-          + File.separator
-          + "udf"
-          + File.separator;
-  private static final String LOG_FILE_NAME = ULOG_FILE_DIR + "ulog.txt";
-  private static final String TEMPORARY_LOG_FILE_NAME = LOG_FILE_NAME + ".tmp";
+  private final String ulogFileDir;
+  private final String logFileName;
+  private final String temporaryLogFileName;
 
   private final ReentrantLock registrationLock;
   private final ConcurrentHashMap<String, UDFRegistrationInformation> registrationInformation;
@@ -64,7 +59,11 @@ public class UDFRegistrationService implements IService {
   private final ReentrantReadWriteLock logWriterLock;
   private UDFLogWriter logWriter;
 
-  private UDFRegistrationService() {
+  private UDFRegistrationService(String ulogFileDir) {
+    this.ulogFileDir = ulogFileDir;
+    logFileName = ulogFileDir + "ulog.txt";
+    temporaryLogFileName = logFileName + ".tmp";
+
     registrationLock = new ReentrantLock();
     registrationInformation = new ConcurrentHashMap<>();
     logWriterLock = new ReentrantReadWriteLock();
@@ -89,7 +88,7 @@ public class UDFRegistrationService implements IService {
 
   private static void validateFunctionName(String functionName, String className)
       throws UDFRegistrationException {
-    if (!SQLConstant.getNativeFunctionNames().contains(functionName.toLowerCase())) {
+    if (!BuiltinAggregationFunction.getNativeFunctionNames().contains(functionName.toLowerCase())) {
       return;
     }
 
@@ -98,7 +97,7 @@ public class UDFRegistrationService implements IService {
             "Failed to register UDF %s(%s), because the given function name conflicts with the built-in function name",
             functionName, className);
 
-    logger.warn(errorMessage);
+    LOGGER.warn(errorMessage);
     throw new UDFRegistrationException(errorMessage);
   }
 
@@ -129,7 +128,7 @@ public class UDFRegistrationService implements IService {
       }
     }
 
-    logger.warn(errorMessage);
+    LOGGER.warn(errorMessage);
     throw new UDFRegistrationException(errorMessage);
   }
 
@@ -155,7 +154,7 @@ public class UDFRegistrationService implements IService {
           String.format(
               "Failed to register UDF %s(%s), because its instance can not be constructed successfully. Exception: %s",
               functionName, className, e);
-      logger.warn(errorMessage);
+      LOGGER.warn(errorMessage);
       throw new UDFRegistrationException(errorMessage);
     } finally {
       releaseRegistrationLock();
@@ -177,7 +176,7 @@ public class UDFRegistrationService implements IService {
           String.format(
               "Failed to append UDF log when registering UDF %s(%s), because %s",
               functionName, className, e);
-      logger.error(errorMessage);
+      LOGGER.error(errorMessage);
       throw new UDFRegistrationException(errorMessage, e);
     }
   }
@@ -196,14 +195,14 @@ public class UDFRegistrationService implements IService {
     UDFRegistrationInformation information = registrationInformation.get(functionName);
     if (information == null) {
       String errorMessage = String.format("UDF %s does not exist.", functionName);
-      logger.warn(errorMessage);
+      LOGGER.warn(errorMessage);
       throw new UDFRegistrationException(errorMessage);
     }
 
     if (information.isBuiltin()) {
       String errorMessage =
           String.format("Built-in function %s can not be deregistered.", functionName);
-      logger.error(errorMessage);
+      LOGGER.error(errorMessage);
       throw new UDFRegistrationException(errorMessage);
     }
 
@@ -214,7 +213,7 @@ public class UDFRegistrationService implements IService {
       String errorMessage =
           String.format(
               "Failed to append UDF log when deregistering UDF %s, because %s", functionName, e);
-      logger.error(errorMessage);
+      LOGGER.error(errorMessage);
       throw new UDFRegistrationException(errorMessage, e);
     }
   }
@@ -245,7 +244,7 @@ public class UDFRegistrationService implements IService {
           String.format(
               "Failed to reflect UDF instance, because UDF %s has not been registered.",
               functionName);
-      logger.warn(errorMessage);
+      LOGGER.warn(errorMessage);
       throw new RuntimeException(errorMessage);
     }
 
@@ -264,7 +263,7 @@ public class UDFRegistrationService implements IService {
           String.format(
               "Failed to reflect UDF %s(%s) instance, because %s",
               functionName, information.getClassName(), e);
-      logger.warn(errorMessage);
+      LOGGER.warn(errorMessage);
       throw new RuntimeException(errorMessage);
     }
   }
@@ -276,30 +275,31 @@ public class UDFRegistrationService implements IService {
   @Override
   public void start() throws StartupException {
     try {
-      registerBuiltinFunctions();
+      registerBuiltinTimeSeriesGeneratingFunctions();
       makeDirIfNecessary();
       doRecovery();
-      logWriter = new UDFLogWriter(LOG_FILE_NAME);
+      logWriter = new UDFLogWriter(logFileName);
     } catch (Exception e) {
       throw new StartupException(e);
     }
   }
 
-  private void registerBuiltinFunctions() {
-    for (BuiltinFunction builtinFunction : BuiltinFunction.values()) {
-      String functionName = builtinFunction.getFunctionName();
+  private void registerBuiltinTimeSeriesGeneratingFunctions() {
+    for (BuiltinTimeSeriesGeneratingFunction builtinTimeSeriesGeneratingFunction :
+        BuiltinTimeSeriesGeneratingFunction.values()) {
+      String functionName = builtinTimeSeriesGeneratingFunction.getFunctionName();
       registrationInformation.put(
           functionName,
           new UDFRegistrationInformation(
               functionName,
-              builtinFunction.getClassName(),
+              builtinTimeSeriesGeneratingFunction.getClassName(),
               true,
-              builtinFunction.getFunctionClass()));
+              builtinTimeSeriesGeneratingFunction.getFunctionClass()));
     }
   }
 
   private void makeDirIfNecessary() throws IOException {
-    File file = SystemFileFactory.INSTANCE.getFile(ULOG_FILE_DIR);
+    File file = SystemFileFactory.INSTANCE.getFile(ulogFileDir);
     if (file.exists() && file.isDirectory()) {
       return;
     }
@@ -307,8 +307,8 @@ public class UDFRegistrationService implements IService {
   }
 
   private void doRecovery() throws IOException {
-    File temporaryLogFile = SystemFileFactory.INSTANCE.getFile(TEMPORARY_LOG_FILE_NAME);
-    File logFile = SystemFileFactory.INSTANCE.getFile(LOG_FILE_NAME);
+    File temporaryLogFile = SystemFileFactory.INSTANCE.getFile(temporaryLogFileName);
+    File logFile = SystemFileFactory.INSTANCE.getFile(logFileName);
 
     if (temporaryLogFile.exists()) {
       if (logFile.exists()) {
@@ -356,8 +356,8 @@ public class UDFRegistrationService implements IService {
       logWriter.close();
       logWriter.deleteLogFile();
 
-      File temporaryLogFile = SystemFileFactory.INSTANCE.getFile(TEMPORARY_LOG_FILE_NAME);
-      File logFile = SystemFileFactory.INSTANCE.getFile(LOG_FILE_NAME);
+      File temporaryLogFile = SystemFileFactory.INSTANCE.getFile(temporaryLogFileName);
+      File logFile = SystemFileFactory.INSTANCE.getFile(logFileName);
       FSFactoryProducer.getFSFactory().moveFile(temporaryLogFile, logFile);
     } catch (IOException ignored) {
       // ignored
@@ -365,7 +365,7 @@ public class UDFRegistrationService implements IService {
   }
 
   private void writeTemporaryLogFile() throws IOException {
-    UDFLogWriter temporaryLogFile = new UDFLogWriter(TEMPORARY_LOG_FILE_NAME);
+    UDFLogWriter temporaryLogFile = new UDFLogWriter(temporaryLogFileName);
     for (UDFRegistrationInformation information : registrationInformation.values()) {
       if (information.isBuiltin()) {
         continue;
@@ -404,14 +404,17 @@ public class UDFRegistrationService implements IService {
     return ServiceType.UDF_REGISTRATION_SERVICE;
   }
 
-  public static UDFRegistrationService getInstance() {
-    return UDFRegistrationService.UDFRegistrationServiceHelper.INSTANCE;
-  }
-
-  private static class UDFRegistrationServiceHelper {
+  private static UDFRegistrationService INSTANCE = null;
 
-    private static final UDFRegistrationService INSTANCE = new UDFRegistrationService();
+  public static synchronized UDFRegistrationService setupAndGetInstance(String ulogFileDir) {
+    if (INSTANCE == null) {
+      INSTANCE = new UDFRegistrationService(ulogFileDir);
+      return INSTANCE;
+    }
+    throw new UnsupportedOperationException();
+  }
 
-    private UDFRegistrationServiceHelper() {}
+  public static UDFRegistrationService getInstance() {
+    return UDFRegistrationService.INSTANCE;
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/process/TransformOperator.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/process/TransformOperator.java
index ed0dbb0f86..c66d3d3c98 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/process/TransformOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/process/TransformOperator.java
@@ -19,6 +19,8 @@
 
 package org.apache.iotdb.db.mpp.execution.operator.process;
 
+import org.apache.iotdb.commons.udf.service.UDFClassLoaderManager;
+import org.apache.iotdb.commons.udf.service.UDFRegistrationService;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.mpp.execution.operator.Operator;
@@ -31,8 +33,6 @@ import org.apache.iotdb.db.mpp.transformation.dag.builder.EvaluationDAGBuilder;
 import org.apache.iotdb.db.mpp.transformation.dag.input.QueryDataSetInputLayer;
 import org.apache.iotdb.db.mpp.transformation.dag.input.TsBlockInputDataSet;
 import org.apache.iotdb.db.mpp.transformation.dag.udf.UDTFContext;
-import org.apache.iotdb.db.query.udf.service.UDFClassLoaderManager;
-import org.apache.iotdb.db.query.udf.service.UDFRegistrationService;
 import org.apache.iotdb.db.utils.datastructure.TimeSelector;
 import org.apache.iotdb.tsfile.exception.write.UnSupportedDataTypeException;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/multi/FunctionExpression.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/multi/FunctionExpression.java
index 8dbe67c10d..61a2b45dbf 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/multi/FunctionExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/multi/FunctionExpression.java
@@ -22,6 +22,7 @@ package org.apache.iotdb.db.mpp.plan.expression.multi;
 import org.apache.iotdb.commons.conf.IoTDBConstant;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.commons.udf.api.customizer.strategy.AccessStrategy;
+import org.apache.iotdb.commons.udf.builtin.BuiltinAggregationFunction;
 import org.apache.iotdb.db.exception.query.LogicalOptimizeException;
 import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.exception.sql.SemanticException;
@@ -44,7 +45,6 @@ import org.apache.iotdb.db.mpp.transformation.dag.transformer.unary.TransparentT
 import org.apache.iotdb.db.mpp.transformation.dag.udf.UDTFContext;
 import org.apache.iotdb.db.mpp.transformation.dag.udf.UDTFExecutor;
 import org.apache.iotdb.db.mpp.transformation.dag.udf.UDTFTypeInferrer;
-import org.apache.iotdb.db.qp.constant.SQLConstant;
 import org.apache.iotdb.db.qp.physical.crud.UDTFPlan;
 import org.apache.iotdb.db.qp.strategy.optimizer.ConcatPathOptimizer;
 import org.apache.iotdb.db.utils.TypeInferenceUtils;
@@ -93,7 +93,7 @@ public class FunctionExpression extends Expression {
     expressions = new ArrayList<>();
 
     isBuiltInAggregationFunctionExpression =
-        SQLConstant.getNativeFunctionNames().contains(functionName.toLowerCase());
+        BuiltinAggregationFunction.getNativeFunctionNames().contains(functionName.toLowerCase());
     isConstantOperandCache = true;
   }
 
@@ -104,7 +104,7 @@ public class FunctionExpression extends Expression {
     this.expressions = expressions;
 
     isBuiltInAggregationFunctionExpression =
-        SQLConstant.getNativeFunctionNames().contains(functionName.toLowerCase());
+        BuiltinAggregationFunction.getNativeFunctionNames().contains(functionName.toLowerCase());
     isConstantOperandCache = expressions.stream().anyMatch(Expression::isConstantOperand);
     isUserDefinedAggregationFunctionExpression =
         expressions.stream()
@@ -124,7 +124,7 @@ public class FunctionExpression extends Expression {
     }
 
     isBuiltInAggregationFunctionExpression =
-        SQLConstant.getNativeFunctionNames().contains(functionName);
+        BuiltinAggregationFunction.getNativeFunctionNames().contains(functionName);
     isConstantOperandCache = expressions.stream().anyMatch(Expression::isConstantOperand);
     isUserDefinedAggregationFunctionExpression =
         expressions.stream()
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/transformation/dag/udf/UDTFContext.java b/server/src/main/java/org/apache/iotdb/db/mpp/transformation/dag/udf/UDTFContext.java
index 1876756d85..e1ea0ced1f 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/transformation/dag/udf/UDTFContext.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/transformation/dag/udf/UDTFContext.java
@@ -19,10 +19,10 @@
 
 package org.apache.iotdb.db.mpp.transformation.dag.udf;
 
+import org.apache.iotdb.commons.udf.service.UDFClassLoaderManager;
 import org.apache.iotdb.db.mpp.plan.expression.Expression;
 import org.apache.iotdb.db.mpp.plan.expression.ResultColumn;
 import org.apache.iotdb.db.mpp.plan.expression.multi.FunctionExpression;
-import org.apache.iotdb.db.query.udf.service.UDFClassLoaderManager;
 
 import java.time.ZoneId;
 import java.util.HashMap;
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/transformation/dag/udf/UDTFExecutor.java b/server/src/main/java/org/apache/iotdb/db/mpp/transformation/dag/udf/UDTFExecutor.java
index dd03c7e06c..3b58b5a386 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/transformation/dag/udf/UDTFExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/transformation/dag/udf/UDTFExecutor.java
@@ -26,8 +26,8 @@ import org.apache.iotdb.commons.udf.api.access.RowWindow;
 import org.apache.iotdb.commons.udf.api.customizer.config.UDTFConfigurations;
 import org.apache.iotdb.commons.udf.api.customizer.parameter.UDFParameterValidator;
 import org.apache.iotdb.commons.udf.api.customizer.parameter.UDFParameters;
+import org.apache.iotdb.commons.udf.service.UDFRegistrationService;
 import org.apache.iotdb.db.mpp.transformation.datastructure.tv.ElasticSerializableTVList;
-import org.apache.iotdb.db.query.udf.service.UDFRegistrationService;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
 import org.slf4j.Logger;
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/transformation/dag/udf/UDTFTypeInferrer.java b/server/src/main/java/org/apache/iotdb/db/mpp/transformation/dag/udf/UDTFTypeInferrer.java
index 4e3342c202..70818c6a2e 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/transformation/dag/udf/UDTFTypeInferrer.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/transformation/dag/udf/UDTFTypeInferrer.java
@@ -24,8 +24,8 @@ import org.apache.iotdb.commons.udf.api.UDTF;
 import org.apache.iotdb.commons.udf.api.customizer.config.UDTFConfigurations;
 import org.apache.iotdb.commons.udf.api.customizer.parameter.UDFParameterValidator;
 import org.apache.iotdb.commons.udf.api.customizer.parameter.UDFParameters;
+import org.apache.iotdb.commons.udf.service.UDFRegistrationService;
 import org.apache.iotdb.db.exception.sql.SemanticException;
-import org.apache.iotdb.db.query.udf.service.UDFRegistrationService;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
 import org.slf4j.Logger;
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/constant/SQLConstant.java b/server/src/main/java/org/apache/iotdb/db/qp/constant/SQLConstant.java
index d731bfee89..5551f4d817 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/constant/SQLConstant.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/constant/SQLConstant.java
@@ -20,14 +20,11 @@ package org.apache.iotdb.db.qp.constant;
 
 import org.apache.iotdb.commons.path.PartialPath;
 
-import java.util.Arrays;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Map;
-import java.util.Set;
 
 /** this class contains several constants used in SQL. */
-@SuppressWarnings("unused") // some fields are for future features
+// some fields are for future features
 public class SQLConstant {
 
   public SQLConstant() throws InstantiationException {
@@ -57,36 +54,16 @@ public class SQLConstant {
   // names of aggregations
   public static final String MIN_TIME = "min_time";
   public static final String MAX_TIME = "max_time";
-
   public static final String MAX_VALUE = "max_value";
   public static final String MIN_VALUE = "min_value";
-
   public static final String EXTREME = "extreme";
-
   public static final String FIRST_VALUE = "first_value";
   public static final String LAST_VALUE = "last_value";
-
-  public static final String LAST = "last";
-
   public static final String COUNT = "count";
   public static final String AVG = "avg";
   public static final String SUM = "sum";
 
-  public static final String ALL = "all";
-
-  private static final Set<String> NATIVE_FUNCTION_NAMES =
-      new HashSet<>(
-          Arrays.asList(
-              MIN_TIME,
-              MAX_TIME,
-              MIN_VALUE,
-              MAX_VALUE,
-              EXTREME,
-              FIRST_VALUE,
-              LAST_VALUE,
-              COUNT,
-              SUM,
-              AVG));
+  public static final String LAST = "last";
 
   public static final int TOK_WHERE = 23;
   public static final int TOK_INSERT = 24;
@@ -321,8 +298,4 @@ public class SQLConstant {
   public static boolean isNotReservedPath(PartialPath pathStr) {
     return !pathStr.equals(TIME_PATH);
   }
-
-  public static Set<String> getNativeFunctionNames() {
-    return NATIVE_FUNCTION_NAMES;
-  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java b/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
index 9df6492e14..491b0f6d74 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
@@ -31,6 +31,10 @@ import org.apache.iotdb.commons.conf.IoTDBConstant;
 import org.apache.iotdb.commons.exception.IllegalPathException;
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.commons.udf.api.exception.UDFRegistrationException;
+import org.apache.iotdb.commons.udf.builtin.BuiltinAggregationFunction;
+import org.apache.iotdb.commons.udf.service.UDFRegistrationInformation;
+import org.apache.iotdb.commons.udf.service.UDFRegistrationService;
 import org.apache.iotdb.commons.utils.AuthUtils;
 import org.apache.iotdb.db.auth.AuthorityChecker;
 import org.apache.iotdb.db.auth.AuthorizerManager;
@@ -51,7 +55,6 @@ import org.apache.iotdb.db.exception.QueryIdNotExsitException;
 import org.apache.iotdb.db.exception.StorageEngineException;
 import org.apache.iotdb.db.exception.TriggerExecutionException;
 import org.apache.iotdb.db.exception.TriggerManagementException;
-import org.apache.iotdb.db.exception.UDFRegistrationException;
 import org.apache.iotdb.db.exception.WriteProcessException;
 import org.apache.iotdb.db.exception.metadata.PathNotExistException;
 import org.apache.iotdb.db.exception.metadata.StorageGroupAlreadySetException;
@@ -64,7 +67,6 @@ import org.apache.iotdb.db.metadata.mnode.IMeasurementMNode;
 import org.apache.iotdb.db.metadata.mnode.IStorageGroupMNode;
 import org.apache.iotdb.db.metadata.path.MeasurementPath;
 import org.apache.iotdb.db.metadata.utils.MetaUtils;
-import org.apache.iotdb.db.qp.constant.SQLConstant;
 import org.apache.iotdb.db.qp.logical.Operator;
 import org.apache.iotdb.db.qp.logical.sys.AuthorOperator;
 import org.apache.iotdb.db.qp.logical.sys.AuthorOperator.AuthorType;
@@ -152,8 +154,6 @@ import org.apache.iotdb.db.query.dataset.ShowTimeseriesDataSet;
 import org.apache.iotdb.db.query.dataset.SingleDataSet;
 import org.apache.iotdb.db.query.executor.IQueryRouter;
 import org.apache.iotdb.db.query.executor.QueryRouter;
-import org.apache.iotdb.db.query.udf.service.UDFRegistrationInformation;
-import org.apache.iotdb.db.query.udf.service.UDFRegistrationService;
 import org.apache.iotdb.db.service.IoTDB;
 import org.apache.iotdb.db.service.SettleService;
 import org.apache.iotdb.db.sync.receiver.ReceiverService;
@@ -1090,7 +1090,6 @@ public class PlanExecutor implements IPlanExecutor {
     return listDataSet;
   }
 
-  @SuppressWarnings("squid:S3776")
   private void appendUDFs(ListDataSet listDataSet, ShowFunctionsPlan showPlan)
       throws QueryProcessException {
     for (UDFRegistrationInformation info :
@@ -1245,7 +1244,7 @@ public class PlanExecutor implements IPlanExecutor {
   private void appendNativeFunctions(ListDataSet listDataSet, ShowFunctionsPlan showPlan) {
     final Binary functionType = Binary.valueOf(FUNCTION_TYPE_NATIVE);
     final Binary className = Binary.valueOf("");
-    for (String functionName : SQLConstant.getNativeFunctionNames()) {
+    for (String functionName : BuiltinAggregationFunction.getNativeFunctionNames()) {
       RowRecord rowRecord = new RowRecord(0); // ignore timestamp
       rowRecord.addField(Binary.valueOf(functionName.toUpperCase()), TSDataType.TEXT);
       rowRecord.addField(functionType, TSDataType.TEXT);
@@ -1520,7 +1519,7 @@ public class PlanExecutor implements IPlanExecutor {
     }
   }
 
-  @SuppressWarnings("squid:S3776") // Suppress high Cognitive Complexity warning
+  // Suppress high Cognitive Complexity warning
   private void createSchemaAutomatically(
       List<ChunkGroupMetadata> chunkGroupMetadataList,
       Map<Path, IMeasurementSchema> knownSchemas,
@@ -2012,7 +2011,7 @@ public class PlanExecutor implements IPlanExecutor {
     return true;
   }
 
-  @SuppressWarnings("squid:S3776") // high Cognitive Complexity
+  // high Cognitive Complexity
   private boolean createMultiTimeSeries(CreateMultiTimeSeriesPlan multiPlan)
       throws BatchProcessException {
     int dataTypeIdx = 0;
@@ -2385,7 +2384,7 @@ public class PlanExecutor implements IPlanExecutor {
     }
   }
 
-  @SuppressWarnings("unused") // for the distributed version
+  // for the distributed version
   protected void loadConfiguration(LoadConfigurationPlan plan) throws QueryProcessException {
     IoTDBDescriptor.getInstance().loadHotModifiedProps();
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/dataset/UDTFDataSet.java b/server/src/main/java/org/apache/iotdb/db/query/dataset/UDTFDataSet.java
index 1f816f1a2a..fdefb63b26 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/dataset/UDTFDataSet.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/dataset/UDTFDataSet.java
@@ -20,6 +20,8 @@
 package org.apache.iotdb.db.query.dataset;
 
 import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.commons.udf.service.UDFClassLoaderManager;
+import org.apache.iotdb.commons.udf.service.UDFRegistrationService;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.mpp.transformation.api.LayerPointReader;
@@ -29,8 +31,6 @@ import org.apache.iotdb.db.qp.physical.crud.UDTFPlan;
 import org.apache.iotdb.db.query.context.QueryContext;
 import org.apache.iotdb.db.query.reader.series.IReaderByTimestamp;
 import org.apache.iotdb.db.query.reader.series.ManagedSeriesReader;
-import org.apache.iotdb.db.query.udf.service.UDFClassLoaderManager;
-import org.apache.iotdb.db.query.udf.service.UDFRegistrationService;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
 import org.apache.iotdb.tsfile.read.query.timegenerator.TimeGenerator;
diff --git a/server/src/main/java/org/apache/iotdb/db/service/DataNode.java b/server/src/main/java/org/apache/iotdb/db/service/DataNode.java
index d2333c674b..05ad28efcf 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/DataNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/DataNode.java
@@ -29,6 +29,8 @@ import org.apache.iotdb.commons.exception.StartupException;
 import org.apache.iotdb.commons.service.JMXService;
 import org.apache.iotdb.commons.service.RegisterManager;
 import org.apache.iotdb.commons.service.StartupChecks;
+import org.apache.iotdb.commons.udf.service.UDFClassLoaderManager;
+import org.apache.iotdb.commons.udf.service.UDFRegistrationService;
 import org.apache.iotdb.confignode.rpc.thrift.TDataNodeRegisterReq;
 import org.apache.iotdb.confignode.rpc.thrift.TDataNodeRegisterResp;
 import org.apache.iotdb.db.client.ConfigNodeClient;
@@ -49,8 +51,6 @@ import org.apache.iotdb.db.mpp.execution.datatransfer.DataBlockService;
 import org.apache.iotdb.db.mpp.execution.schedule.DriverScheduler;
 import org.apache.iotdb.db.protocol.influxdb.meta.InfluxDBMetaManager;
 import org.apache.iotdb.db.protocol.rest.RestService;
-import org.apache.iotdb.db.query.udf.service.UDFClassLoaderManager;
-import org.apache.iotdb.db.query.udf.service.UDFRegistrationService;
 import org.apache.iotdb.db.service.basic.ServiceProvider;
 import org.apache.iotdb.db.service.basic.StandaloneServiceProvider;
 import org.apache.iotdb.db.service.metrics.MetricsService;
@@ -64,6 +64,7 @@ import org.apache.thrift.TException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
@@ -277,8 +278,15 @@ public class DataNode implements DataNodeMBean {
         .setRpcImplClassName(DataNodeTSIServiceImpl.class.getName());
 
     registerManager.register(TemporaryQueryDataFileService.getInstance());
-    registerManager.register(UDFClassLoaderManager.getInstance());
-    registerManager.register(UDFRegistrationService.getInstance());
+    registerManager.register(
+        UDFClassLoaderManager.setupAndGetInstance(
+            IoTDBDescriptor.getInstance().getConfig().getUdfDir()));
+    registerManager.register(
+        UDFRegistrationService.setupAndGetInstance(
+            IoTDBDescriptor.getInstance().getConfig().getSystemDir()
+                + File.separator
+                + "udf"
+                + File.separator));
     registerManager.register(ReceiverService.getInstance());
     registerManager.register(MetricsService.getInstance());
 
diff --git a/server/src/main/java/org/apache/iotdb/db/service/IoTDB.java b/server/src/main/java/org/apache/iotdb/db/service/IoTDB.java
index ced6730c57..5ec6baf6a6 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/IoTDB.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/IoTDB.java
@@ -25,6 +25,8 @@ import org.apache.iotdb.commons.exception.StartupException;
 import org.apache.iotdb.commons.service.JMXService;
 import org.apache.iotdb.commons.service.RegisterManager;
 import org.apache.iotdb.commons.service.StartupChecks;
+import org.apache.iotdb.commons.udf.service.UDFClassLoaderManager;
+import org.apache.iotdb.commons.udf.service.UDFRegistrationService;
 import org.apache.iotdb.db.conf.IoTDBConfig;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.conf.IoTDBStartCheck;
@@ -44,8 +46,6 @@ import org.apache.iotdb.db.mpp.execution.datatransfer.DataBlockService;
 import org.apache.iotdb.db.mpp.execution.schedule.DriverScheduler;
 import org.apache.iotdb.db.protocol.influxdb.meta.InfluxDBMetaManager;
 import org.apache.iotdb.db.protocol.rest.RestService;
-import org.apache.iotdb.db.query.udf.service.UDFClassLoaderManager;
-import org.apache.iotdb.db.query.udf.service.UDFRegistrationService;
 import org.apache.iotdb.db.rescon.PrimitiveArrayManager;
 import org.apache.iotdb.db.rescon.SystemInfo;
 import org.apache.iotdb.db.service.basic.ServiceProvider;
@@ -59,6 +59,7 @@ import org.apache.iotdb.db.wal.WALManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.File;
 import java.io.IOException;
 
 public class IoTDB implements IoTDBMBean {
@@ -169,8 +170,15 @@ public class IoTDB implements IoTDBMBean {
     }
 
     registerManager.register(TemporaryQueryDataFileService.getInstance());
-    registerManager.register(UDFClassLoaderManager.getInstance());
-    registerManager.register(UDFRegistrationService.getInstance());
+    registerManager.register(
+        UDFClassLoaderManager.setupAndGetInstance(
+            IoTDBDescriptor.getInstance().getConfig().getUdfDir()));
+    registerManager.register(
+        UDFRegistrationService.setupAndGetInstance(
+            IoTDBDescriptor.getInstance().getConfig().getSystemDir()
+                + File.separator
+                + "udf"
+                + File.separator));
     registerManager.register(ReceiverService.getInstance());
     registerManager.register(MetricsService.getInstance());
 
diff --git a/server/src/test/java/org/apache/iotdb/db/qp/physical/PhysicalPlanTest.java b/server/src/test/java/org/apache/iotdb/db/qp/physical/PhysicalPlanTest.java
index f23086ba8b..bc25d7b75b 100644
--- a/server/src/test/java/org/apache/iotdb/db/qp/physical/PhysicalPlanTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/qp/physical/PhysicalPlanTest.java
@@ -21,6 +21,7 @@ package org.apache.iotdb.db.qp.physical;
 import org.apache.iotdb.commons.exception.IllegalPathException;
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.commons.udf.service.UDFRegistrationService;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.engine.trigger.executor.TriggerEvent;
 import org.apache.iotdb.db.exception.StorageEngineException;
@@ -62,7 +63,6 @@ import org.apache.iotdb.db.qp.physical.sys.StartTriggerPlan;
 import org.apache.iotdb.db.qp.physical.sys.StopPipeServerPlan;
 import org.apache.iotdb.db.qp.physical.sys.StopTriggerPlan;
 import org.apache.iotdb.db.query.executor.fill.PreviousFill;
-import org.apache.iotdb.db.query.udf.service.UDFRegistrationService;
 import org.apache.iotdb.db.service.IoTDB;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
 import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
diff --git a/server/src/test/java/org/apache/iotdb/db/utils/EnvironmentUtils.java b/server/src/test/java/org/apache/iotdb/db/utils/EnvironmentUtils.java
index d012c9c65e..ffcef8d826 100644
--- a/server/src/test/java/org/apache/iotdb/db/utils/EnvironmentUtils.java
+++ b/server/src/test/java/org/apache/iotdb/db/utils/EnvironmentUtils.java
@@ -19,6 +19,8 @@
 package org.apache.iotdb.db.utils;
 
 import org.apache.iotdb.commons.auth.AuthException;
+import org.apache.iotdb.commons.udf.api.exception.UDFRegistrationException;
+import org.apache.iotdb.commons.udf.service.UDFRegistrationService;
 import org.apache.iotdb.db.auth.AuthorizerManager;
 import org.apache.iotdb.db.conf.IoTDBConfig;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
@@ -34,7 +36,6 @@ import org.apache.iotdb.db.engine.trigger.service.TriggerRegistrationService;
 import org.apache.iotdb.db.exception.ContinuousQueryException;
 import org.apache.iotdb.db.exception.StorageEngineException;
 import org.apache.iotdb.db.exception.TriggerManagementException;
-import org.apache.iotdb.db.exception.UDFRegistrationException;
 import org.apache.iotdb.db.metadata.idtable.IDTableManager;
 import org.apache.iotdb.db.metadata.idtable.entry.DeviceIDFactory;
 import org.apache.iotdb.db.query.context.QueryContext;
@@ -42,7 +43,6 @@ import org.apache.iotdb.db.query.control.FileReaderManager;
 import org.apache.iotdb.db.query.control.QueryResourceManager;
 import org.apache.iotdb.db.query.control.QueryTimeManager;
 import org.apache.iotdb.db.query.executor.LastQueryExecutor;
-import org.apache.iotdb.db.query.udf.service.UDFRegistrationService;
 import org.apache.iotdb.db.rescon.MemTableManager;
 import org.apache.iotdb.db.rescon.PrimitiveArrayManager;
 import org.apache.iotdb.db.rescon.SystemInfo;