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 773c963a15 [IOTDB-4806] Add size limit of UDF jar when create UDF on 
ConfigNode
773c963a15 is described below

commit 773c963a1570105cfbafeaacba2b4c66b86531c7
Author: Weihao Li <[email protected]>
AuthorDate: Mon Oct 31 19:34:13 2022 +0800

    [IOTDB-4806] Add size limit of UDF jar when create UDF on ConfigNode
---
 .../consensus/request/ConfigPhysicalPlan.java      |  7 +++++++
 .../write/procedure/UpdateProcedurePlan.java       |  8 --------
 .../iotdb/confignode/manager/ProcedureManager.java |  4 ++--
 .../iotdb/confignode/manager/UDFManager.java       | 22 ++++++++++++++++++----
 4 files changed, 27 insertions(+), 14 deletions(-)

diff --git 
a/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlan.java
 
b/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlan.java
index ff814ee4d2..d69b620848 100644
--- 
a/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlan.java
+++ 
b/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlan.java
@@ -131,6 +131,13 @@ public abstract class ConfigPhysicalPlan implements 
IConsensusRequest {
 
   protected abstract void deserializeImpl(ByteBuffer buffer) throws 
IOException;
 
+  public int getSerializedSize() throws IOException {
+    PublicBAOS byteArrayOutputStream = new PublicBAOS();
+    DataOutputStream outputStream = new 
DataOutputStream(byteArrayOutputStream);
+    serializeImpl(outputStream);
+    return byteArrayOutputStream.size();
+  }
+
   public static class Factory {
 
     public static ConfigPhysicalPlan create(ByteBuffer buffer) throws 
IOException {
diff --git 
a/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/write/procedure/UpdateProcedurePlan.java
 
b/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/write/procedure/UpdateProcedurePlan.java
index 330b771cd3..d986ec2b15 100644
--- 
a/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/write/procedure/UpdateProcedurePlan.java
+++ 
b/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/write/procedure/UpdateProcedurePlan.java
@@ -23,7 +23,6 @@ import 
org.apache.iotdb.confignode.consensus.request.ConfigPhysicalPlan;
 import org.apache.iotdb.confignode.consensus.request.ConfigPhysicalPlanType;
 import org.apache.iotdb.confignode.procedure.Procedure;
 import org.apache.iotdb.confignode.procedure.store.ProcedureFactory;
-import org.apache.iotdb.tsfile.utils.PublicBAOS;
 
 import java.io.DataOutputStream;
 import java.io.IOException;
@@ -59,13 +58,6 @@ public class UpdateProcedurePlan extends ConfigPhysicalPlan {
     }
   }
 
-  public int getSerializedSize() throws IOException {
-    PublicBAOS byteArrayOutputStream = new PublicBAOS();
-    DataOutputStream outputStream = new 
DataOutputStream(byteArrayOutputStream);
-    serializeImpl(outputStream);
-    return byteArrayOutputStream.size();
-  }
-
   @Override
   protected void deserializeImpl(ByteBuffer buffer) throws IOException {
     Procedure procedure = ProcedureFactory.getInstance().create(buffer);
diff --git 
a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java
 
b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java
index 4f9fbf490b..50a290793e 100644
--- 
a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java
+++ 
b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java
@@ -361,8 +361,8 @@ public class ProcedureManager {
     final CreateTriggerProcedure createTriggerProcedure =
         new CreateTriggerProcedure(triggerInformation, jarFile);
     try {
-      final int planSize = new 
UpdateProcedurePlan(createTriggerProcedure).getSerializedSize();
-      if (planSize > planSizeLimit) {
+      if (jarFile != null
+          && new 
UpdateProcedurePlan(createTriggerProcedure).getSerializedSize() > 
planSizeLimit) {
         return new TSStatus(TSStatusCode.CREATE_TRIGGER_ERROR.getStatusCode())
             .setMessage(
                 String.format(
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 da8f9bb551..7088b47f72 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
@@ -21,10 +21,12 @@ package org.apache.iotdb.confignode.manager;
 
 import org.apache.iotdb.common.rpc.thrift.TDataNodeLocation;
 import org.apache.iotdb.common.rpc.thrift.TSStatus;
+import org.apache.iotdb.commons.conf.IoTDBConstant;
 import org.apache.iotdb.commons.udf.UDFInformation;
 import org.apache.iotdb.confignode.client.DataNodeRequestType;
 import org.apache.iotdb.confignode.client.async.AsyncDataNodeClientPool;
 import org.apache.iotdb.confignode.client.async.handlers.AsyncClientHandler;
+import org.apache.iotdb.confignode.conf.ConfigNodeDescriptor;
 import 
org.apache.iotdb.confignode.consensus.request.read.function.GetFunctionTablePlan;
 import org.apache.iotdb.confignode.consensus.request.read.udf.GetUDFJarPlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.function.CreateFunctionPlan;
@@ -57,6 +59,12 @@ public class UDFManager {
   private final ConfigManager configManager;
   private final UDFInfo udfInfo;
 
+  private final long planSizeLimit =
+      ConfigNodeDescriptor.getInstance()
+              .getConf()
+              .getPartitionRegionRatisConsensusLogAppenderBufferSize()
+          - IoTDBConstant.RAFT_LOG_BASIC_SIZE;
+
   public UDFManager(ConfigManager configManager, UDFInfo udfInfo) {
     this.configManager = configManager;
     this.udfInfo = udfInfo;
@@ -89,16 +97,22 @@ public class UDFManager {
       }
 
       final boolean needToSaveJar = isUsingURI && 
udfInfo.needToSaveJar(jarName);
+      CreateFunctionPlan createFunctionPlan =
+          new CreateFunctionPlan(udfInformation, needToSaveJar ? new 
Binary(jarFile) : null);
+      if (needToSaveJar && createFunctionPlan.getSerializedSize() > 
planSizeLimit) {
+        return new TSStatus(TSStatusCode.CREATE_TRIGGER_ERROR.getStatusCode())
+            .setMessage(
+                String.format(
+                    "Fail to create UDF[%s], the size of Jar is too large, you 
can increase the value of property 
'partition_region_ratis_log_appender_buffer_size_max' on ConfigNode",
+                    udfName));
+      }
 
       LOGGER.info(
           "Start to add UDF [{}] in UDF_Table on Config Nodes, 
needToSaveJar[{}]",
           udfName,
           needToSaveJar);
 
-      return configManager
-          .getConsensusManager()
-          .write(new CreateFunctionPlan(udfInformation, needToSaveJar ? new 
Binary(jarFile) : null))
-          .getStatus();
+      return 
configManager.getConsensusManager().write(createFunctionPlan).getStatus();
     } catch (Exception e) {
       LOGGER.warn(e.getMessage(), e);
       return new TSStatus(TSStatusCode.EXECUTE_STATEMENT_ERROR.getStatusCode())

Reply via email to