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

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

commit ffffe4f723c59b54778d11e7f0b4eb40d7d4d8a4
Author: Steve Yurong Su <[email protected]>
AuthorDate: Tue May 24 12:19:35 2022 +0800

    data node: create function
---
 .../java/org/apache/iotdb/db/conf/IoTDBConfig.java |  9 ++++++
 .../java/org/apache/iotdb/db/service/DataNode.java | 34 +++++++++++++++-------
 .../service/thrift/impl/InternalServiceImpl.java   | 18 ++++++++++--
 3 files changed, 49 insertions(+), 12 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java 
b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
index 7e651bae80..58dedbee7a 100644
--- a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
+++ b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
@@ -249,6 +249,10 @@ public class IoTDBConfig {
   private String udfDir =
       IoTDBConstant.EXT_FOLDER_NAME + File.separator + 
IoTDBConstant.UDF_FOLDER_NAME;
 
+  /** External temporary lib directory for storing downloaded JAR files */
+  private String temporaryLibDir =
+      IoTDBConstant.EXT_FOLDER_NAME + File.separator + 
IoTDBConstant.TMP_FOLDER_NAME;
+
   /** External lib directory for trigger, stores user-uploaded JAR files */
   private String triggerDir =
       IoTDBConstant.EXT_FOLDER_NAME + File.separator + 
IoTDBConstant.TRIGGER_FOLDER_NAME;
@@ -984,6 +988,7 @@ public class IoTDBConfig {
     indexRootFolder = addHomeDir(indexRootFolder);
     extDir = addHomeDir(extDir);
     udfDir = addHomeDir(udfDir);
+    temporaryLibDir = addHomeDir(temporaryLibDir);
     triggerDir = addHomeDir(triggerDir);
     mqttDir = addHomeDir(mqttDir);
     for (int i = 0; i < walDirs.length; i++) {
@@ -1177,6 +1182,10 @@ public class IoTDBConfig {
     return udfDir;
   }
 
+  public String getTemporaryLibDir() {
+    return temporaryLibDir;
+  }
+
   public void setUdfDir(String udfDir) {
     this.udfDir = udfDir;
   }
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 05ad28efcf..6629c2bd05 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
@@ -30,6 +30,7 @@ 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.UDFExecutableManager;
 import org.apache.iotdb.commons.udf.service.UDFRegistrationService;
 import org.apache.iotdb.confignode.rpc.thrift.TDataNodeRegisterReq;
 import org.apache.iotdb.confignode.rpc.thrift.TDataNodeRegisterResp;
@@ -277,16 +278,8 @@ public class DataNode implements DataNodeMBean {
         .getConfig()
         .setRpcImplClassName(DataNodeTSIServiceImpl.class.getName());
 
-    registerManager.register(TemporaryQueryDataFileService.getInstance());
-    registerManager.register(
-        UDFClassLoaderManager.setupAndGetInstance(
-            IoTDBDescriptor.getInstance().getConfig().getUdfDir()));
-    registerManager.register(
-        UDFRegistrationService.setupAndGetInstance(
-            IoTDBDescriptor.getInstance().getConfig().getSystemDir()
-                + File.separator
-                + "udf"
-                + File.separator));
+    initUdfServices();
+
     registerManager.register(ReceiverService.getInstance());
     registerManager.register(MetricsService.getInstance());
 
@@ -328,6 +321,27 @@ public class DataNode implements DataNodeMBean {
     logger.info("Congratulation, IoTDB DataNode is set up successfully. Now, 
enjoy yourself!");
   }
 
+  private void initUdfServices() throws StartupException {
+    try {
+      UDFExecutableManager.setupAndGetInstance(
+          IoTDBDescriptor.getInstance().getConfig().getTemporaryLibDir(),
+          IoTDBDescriptor.getInstance().getConfig().getUdfDir());
+    } catch (Exception e) {
+      throw new StartupException(e);
+    }
+
+    registerManager.register(TemporaryQueryDataFileService.getInstance());
+    registerManager.register(
+        UDFClassLoaderManager.setupAndGetInstance(
+            IoTDBDescriptor.getInstance().getConfig().getUdfDir()));
+    registerManager.register(
+        UDFRegistrationService.setupAndGetInstance(
+            IoTDBDescriptor.getInstance().getConfig().getSystemDir()
+                + File.separator
+                + "udf"
+                + File.separator));
+  }
+
   private void initConfigManager() {
     long time = System.currentTimeMillis();
     IoTDB.configManager.init();
diff --git 
a/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/InternalServiceImpl.java
 
b/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/InternalServiceImpl.java
index 805b4846ed..1c9721d091 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/InternalServiceImpl.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/InternalServiceImpl.java
@@ -32,6 +32,8 @@ import org.apache.iotdb.commons.consensus.SchemaRegionId;
 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.UDFExecutableManager;
+import org.apache.iotdb.commons.udf.service.UDFRegistrationService;
 import org.apache.iotdb.consensus.IConsensus;
 import org.apache.iotdb.consensus.common.Peer;
 import org.apache.iotdb.consensus.common.request.ByteBufferConsensusRequest;
@@ -345,8 +347,20 @@ public class InternalServiceImpl implements 
InternalService.Iface {
   }
 
   @Override
-  public TSStatus createFunction(TCreateFunctionRequest req) throws TException 
{
-    throw new NotImplementedException();
+  public TSStatus createFunction(TCreateFunctionRequest request) throws 
TException {
+    try {
+      UDFRegistrationService.getInstance()
+          .register(
+              request.getUdfName(),
+              request.getClassName(),
+              request.getUris(),
+              UDFExecutableManager.getInstance(),
+              true);
+      return new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode());
+    } catch (Exception e) {
+      return new TSStatus(TSStatusCode.EXECUTE_STATEMENT_ERROR.getStatusCode())
+          .setMessage(e.getMessage());
+    }
   }
 
   public void handleClientExit() {}

Reply via email to