You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ja...@apache.org on 2022/10/29 06:07:02 UTC

[iotdb] branch master updated: [IOTDB-4787] Make Using clause in CREATE FUNCTION optional (ConfigNode) (#7785)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 69582de2b5 [IOTDB-4787] Make Using clause in CREATE FUNCTION optional (ConfigNode) (#7785)
69582de2b5 is described below

commit 69582de2b59a85babd2611976d425a9d70d6bffc
Author: Weihao Li <60...@users.noreply.github.com>
AuthorDate: Sat Oct 29 14:06:56 2022 +0800

    [IOTDB-4787] Make Using clause in CREATE FUNCTION optional (ConfigNode) (#7785)
---
 .../org/apache/iotdb/confignode/manager/UDFManager.java   | 11 ++++++-----
 .../org/apache/iotdb/confignode/persistence/UDFInfo.java  | 12 +++++++-----
 .../resources/confignode1conf/iotdb-confignode.properties |  1 +
 .../resources/confignode2conf/iotdb-confignode.properties |  1 +
 .../resources/confignode3conf/iotdb-confignode.properties |  1 +
 .../iotdb/commons/executable/ExecutableManager.java       |  4 ++++
 .../java/org/apache/iotdb/commons/udf/UDFInformation.java | 15 +++++++++++----
 .../iotdb/commons/udf/service/UDFManagementService.java   |  2 +-
 .../config/executor/ClusterConfigTaskExecutor.java        |  2 +-
 9 files changed, 33 insertions(+), 16 deletions(-)

diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/manager/UDFManager.java b/confignode/src/main/java/org/apache/iotdb/confignode/manager/UDFManager.java
index 299b2c8466..848acef942 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/manager/UDFManager.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/manager/UDFManager.java
@@ -69,14 +69,15 @@ public class UDFManager {
   public TSStatus createFunction(TCreateFunctionReq req) {
     udfInfo.acquireUDFTableLock();
     try {
+      final boolean isUsingURI = req.isIsUsingURI();
       final String udfName = req.udfName.toUpperCase(),
-          jarName = req.getJarName(),
-          jarMD5 = req.jarMD5;
+          jarMD5 = req.getJarMD5(),
+          jarName = req.getJarName();
       final byte[] jarFile = req.getJarFile();
       udfInfo.validate(udfName, jarName, jarMD5);
 
       final UDFInformation udfInformation =
-          new UDFInformation(udfName, req.getClassName(), false, true, jarName, jarMD5);
+          new UDFInformation(udfName, req.getClassName(), false, isUsingURI, jarName, jarMD5);
 
       LOGGER.info("Start to create UDF [{}] on Data Nodes", udfName);
 
@@ -87,7 +88,7 @@ public class UDFManager {
         return dataNodesStatus;
       }
 
-      final boolean needToSaveJar = udfInfo.needToSaveJar(jarName);
+      final boolean needToSaveJar = isUsingURI && udfInfo.needToSaveJar(jarName);
 
       LOGGER.info(
           "Start to add UDF [{}] in UDF_Table on Config Nodes, needToSaveJar[{}]",
@@ -112,7 +113,7 @@ public class UDFManager {
     final Map<Integer, TDataNodeLocation> dataNodeLocationMap =
         configManager.getNodeManager().getRegisteredDataNodeLocations();
     final TCreateFunctionInstanceReq req =
-        new TCreateFunctionInstanceReq(udfInformation.serialize());
+        new TCreateFunctionInstanceReq(udfInformation.serialize()).setJarFile(jarFile);
     AsyncClientHandler<TCreateFunctionInstanceReq, TSStatus> clientHandler =
         new AsyncClientHandler<>(DataNodeRequestType.CREATE_FUNCTION, req, dataNodeLocationMap);
     AsyncDataNodeClientPool.getInstance().sendAsyncRequestToDataNodeWithRetry(clientHandler);
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/persistence/UDFInfo.java b/confignode/src/main/java/org/apache/iotdb/confignode/persistence/UDFInfo.java
index 22e04a1132..c8a3f9dbaf 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/persistence/UDFInfo.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/persistence/UDFInfo.java
@@ -115,10 +115,12 @@ public class UDFInfo implements SnapshotProcessor {
     try {
       final UDFInformation udfInformation = physicalPlan.getUdfInformation();
       udfTable.addUDFInformation(udfInformation.getFunctionName(), udfInformation);
-      existedJarToMD5.put(udfInformation.getJarName(), udfInformation.getJarMD5());
-      if (physicalPlan.getJarFile() != null) {
-        udfExecutableManager.saveToLibDir(
-            ByteBuffer.wrap(physicalPlan.getJarFile().getValues()), udfInformation.getJarName());
+      if (udfInformation.isUsingURI()) {
+        existedJarToMD5.put(udfInformation.getJarName(), udfInformation.getJarMD5());
+        if (physicalPlan.getJarFile() != null) {
+          udfExecutableManager.saveToInstallDir(
+              ByteBuffer.wrap(physicalPlan.getJarFile().getValues()), udfInformation.getJarName());
+        }
       }
       return new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode());
     } catch (Exception e) {
@@ -144,7 +146,7 @@ public class UDFInfo implements SnapshotProcessor {
       for (String jarName : physicalPlan.getJarNames()) {
         jarList.add(
             ExecutableManager.transferToBytebuffer(
-                UDFExecutableManager.getInstance().getFileStringUnderLibRootByName(jarName)));
+                UDFExecutableManager.getInstance().getFileStringUnderInstallByName(jarName)));
       }
     } catch (Exception e) {
       LOGGER.error("Get UDF_Jar failed", e);
diff --git a/confignode/src/test/resources/confignode1conf/iotdb-confignode.properties b/confignode/src/test/resources/confignode1conf/iotdb-confignode.properties
index 28dfa895a4..bf1706fda7 100644
--- a/confignode/src/test/resources/confignode1conf/iotdb-confignode.properties
+++ b/confignode/src/test/resources/confignode1conf/iotdb-confignode.properties
@@ -29,6 +29,7 @@ data_replication_factor=3
 system_dir=target/confignode1/system
 data_dirs=target/confignode1/data
 consensus_dir=target/confignode1/consensus
+udf_lib_dir=target/confignode1/ext/udf
 trigger_lib_dir=target/confignode1/ext/trigger
 proc_wal_dir=target/confignode1/proc
 partition_region_ratis_log_appender_buffer_size_max = 14194304
\ No newline at end of file
diff --git a/confignode/src/test/resources/confignode2conf/iotdb-confignode.properties b/confignode/src/test/resources/confignode2conf/iotdb-confignode.properties
index b4b54e981c..ca328db04c 100644
--- a/confignode/src/test/resources/confignode2conf/iotdb-confignode.properties
+++ b/confignode/src/test/resources/confignode2conf/iotdb-confignode.properties
@@ -28,6 +28,7 @@ data_replication_factor=3
 system_dir=target/confignode2/system
 data_dirs=target/confignode2/data
 consensus_dir=target/confignode2/consensus
+udf_lib_dir=target/confignode2/ext/udf
 trigger_lib_dir=target/confignode2/ext/trigger
 proc_wal_dir=target/confignode2/proc
 partition_region_ratis_log_appender_buffer_size_max = 14194304
\ No newline at end of file
diff --git a/confignode/src/test/resources/confignode3conf/iotdb-confignode.properties b/confignode/src/test/resources/confignode3conf/iotdb-confignode.properties
index 229def86cb..4b1f760984 100644
--- a/confignode/src/test/resources/confignode3conf/iotdb-confignode.properties
+++ b/confignode/src/test/resources/confignode3conf/iotdb-confignode.properties
@@ -28,6 +28,7 @@ data_replication_factor=3
 system_dir=target/confignode3/system
 data_dirs=target/confignode3/data
 consensus_dir=target/confignode3/consensus
+udf_lib_dir=target/confignode3/ext/udf
 trigger_lib_dir=target/confignode3/ext/trigger
 proc_wal_dir=target/confignode3/proc
 partition_region_ratis_log_appender_buffer_size_max = 14194304
diff --git a/node-commons/src/main/java/org/apache/iotdb/commons/executable/ExecutableManager.java b/node-commons/src/main/java/org/apache/iotdb/commons/executable/ExecutableManager.java
index 9106c8db86..058a370ce7 100644
--- a/node-commons/src/main/java/org/apache/iotdb/commons/executable/ExecutableManager.java
+++ b/node-commons/src/main/java/org/apache/iotdb/commons/executable/ExecutableManager.java
@@ -190,6 +190,10 @@ public class ExecutableManager {
     return libRoot + File.separator + name;
   }
 
+  public String getFileStringUnderInstallByName(String name) {
+    return libRoot + File.separator + INSTALL_DIR + File.separator + name;
+  }
+
   private File getFileByFullPath(String path) {
     return FSFactoryProducer.getFSFactory().getFile(path);
   }
diff --git a/node-commons/src/main/java/org/apache/iotdb/commons/udf/UDFInformation.java b/node-commons/src/main/java/org/apache/iotdb/commons/udf/UDFInformation.java
index 8e62817c8d..c2abaccb1c 100644
--- a/node-commons/src/main/java/org/apache/iotdb/commons/udf/UDFInformation.java
+++ b/node-commons/src/main/java/org/apache/iotdb/commons/udf/UDFInformation.java
@@ -126,8 +126,11 @@ public class UDFInformation {
     ReadWriteIOUtils.write(functionName, outputStream);
     ReadWriteIOUtils.write(className, outputStream);
     ReadWriteIOUtils.write(isBuiltin, outputStream);
-    ReadWriteIOUtils.write(jarName, outputStream);
-    ReadWriteIOUtils.write(jarMD5, outputStream);
+    ReadWriteIOUtils.write(isUsingURI, outputStream);
+    if (isUsingURI) {
+      ReadWriteIOUtils.write(jarName, outputStream);
+      ReadWriteIOUtils.write(jarMD5, outputStream);
+    }
   }
 
   public static UDFInformation deserialize(ByteBuffer byteBuffer) {
@@ -135,8 +138,12 @@ public class UDFInformation {
     udfInformation.setFunctionName(ReadWriteIOUtils.readString(byteBuffer));
     udfInformation.setClassName(ReadWriteIOUtils.readString(byteBuffer));
     udfInformation.setBuiltin(ReadWriteIOUtils.readBool(byteBuffer));
-    udfInformation.setJarName(ReadWriteIOUtils.readString(byteBuffer));
-    udfInformation.setJarMD5(ReadWriteIOUtils.readString(byteBuffer));
+    boolean isUsingURI = ReadWriteIOUtils.readBool(byteBuffer);
+    udfInformation.setUsingURI(isUsingURI);
+    if (isUsingURI) {
+      udfInformation.setJarName(ReadWriteIOUtils.readString(byteBuffer));
+      udfInformation.setJarMD5(ReadWriteIOUtils.readString(byteBuffer));
+    }
     return udfInformation;
   }
 }
diff --git a/node-commons/src/main/java/org/apache/iotdb/commons/udf/service/UDFManagementService.java b/node-commons/src/main/java/org/apache/iotdb/commons/udf/service/UDFManagementService.java
index 2212a0c930..3e03f2d604 100644
--- a/node-commons/src/main/java/org/apache/iotdb/commons/udf/service/UDFManagementService.java
+++ b/node-commons/src/main/java/org/apache/iotdb/commons/udf/service/UDFManagementService.java
@@ -186,7 +186,7 @@ public class UDFManagementService {
 
   private void saveJarFile(String jarName, ByteBuffer byteBuffer) throws IOException {
     if (byteBuffer != null) {
-      UDFExecutableManager.getInstance().saveToLibDir(byteBuffer, jarName);
+      UDFExecutableManager.getInstance().saveToInstallDir(byteBuffer, jarName);
     }
   }
 
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java
index 3ead0fb787..88aa45b0cd 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java
@@ -291,7 +291,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor {
       String jarMd5;
       if (createFunctionStatement.isUsingURI()) {
         String uriString = createFunctionStatement.getUriString();
-        jarFileName = uriString.substring(uriString.lastIndexOf("/") + 1);
+        jarFileName = new File(createFunctionStatement.getUriString()).getName();
         if (!new URI(uriString).getScheme().equals("file")) {
           try {
             // download executable