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())