From 222794f9a1f1da592b803607b61dbfc28e6e9add Mon Sep 17 00:00:00 2001 From: ryanzryu Date: Thu, 2 Nov 2023 19:31:00 +0800 Subject: [PATCH] [fix](thrift)limit be and fe thrift server max pkg size,avoid accepting error or too large package causing OOM --- be/src/common/config.cpp | 4 ++++ be/src/common/config.h | 4 ++++ be/src/util/thrift_server.cpp | 5 +++++ docs/zh-CN/docs/admin-manual/config/be-config.md | 6 ++++++ docs/zh-CN/docs/admin-manual/config/fe-config.md | 11 +++++++++++ .../src/main/java/org/apache/doris/common/Config.java | 6 ++++++ .../java/org/apache/doris/common/ThriftServer.java | 6 +++--- 7 files changed, 39 insertions(+), 3 deletions(-) diff --git a/be/src/common/config.cpp b/be/src/common/config.cpp index deda8d3d6ff97f..b3408a7c480e0c 100644 --- a/be/src/common/config.cpp +++ b/be/src/common/config.cpp @@ -1121,6 +1121,10 @@ DEFINE_String(default_tzfiles_path, "${DORIS_HOME}/zoneinfo"); // Max size(bytes) of group commit queues, used for mem back pressure. DEFINE_Int32(group_commit_max_queue_size, "65536"); +// the max package bytes be thrift server can receive +// avoid accepting error or too large package causing OOM,default 20000000(20M) +DEFINE_Int32(be_thrift_max_pkg_bytes, "20000000"); + // clang-format off #ifdef BE_TEST // test s3 diff --git a/be/src/common/config.h b/be/src/common/config.h index 4c18f5e001db1a..301ec9fa1fbc82 100644 --- a/be/src/common/config.h +++ b/be/src/common/config.h @@ -1191,6 +1191,10 @@ DECLARE_String(default_tzfiles_path); // Max size(bytes) of group commit queues, used for mem back pressure. DECLARE_Int32(group_commit_max_queue_size); +// the max package bytes be thrift server can receive +// avoid accepting error or too large package causing OOM,default 20000000(20M) +DECLARE_Int32(be_thrift_max_pkg_bytes); + #ifdef BE_TEST // test s3 DECLARE_String(test_s3_resource); diff --git a/be/src/util/thrift_server.cpp b/be/src/util/thrift_server.cpp index 06e5996313057d..51624325d7548a 100644 --- a/be/src/util/thrift_server.cpp +++ b/be/src/util/thrift_server.cpp @@ -308,6 +308,11 @@ Status ThriftServer::start() { DCHECK(!_started); std::shared_ptr protocol_factory( new apache::thrift::protocol::TBinaryProtocolFactory()); + // add binary_protocal_factory to call TBinaryProtocolFactory's member function:setStringSizeLimit + std::shared_ptr binary_protocal_factory = + std::dynamic_pointer_cast( + protocol_factory); + binary_protocal_factory->setStringSizeLimit(config::be_thrift_max_pkg_bytes); std::shared_ptr thread_mgr; std::shared_ptr thread_factory = std::make_shared(); diff --git a/docs/zh-CN/docs/admin-manual/config/be-config.md b/docs/zh-CN/docs/admin-manual/config/be-config.md index 36dd0a345c9787..1b09280c9c0b25 100644 --- a/docs/zh-CN/docs/admin-manual/config/be-config.md +++ b/docs/zh-CN/docs/admin-manual/config/be-config.md @@ -1529,3 +1529,9 @@ load tablets from header failed, failed tablets size: xxx, path=xxx * Description: BE 是否开启使用java-jni,开启后允许 c++ 与 java 之间的相互调用。目前已经支持hudi、java-udf、jdbc、max-compute、paimon、preload、avro * Default value: true + + +#### `be_thrift_max_pkg_bytes` + +* 描述: be节点thrift端口最大接收包大小(字节) +* 默认值: 20000000 diff --git a/docs/zh-CN/docs/admin-manual/config/fe-config.md b/docs/zh-CN/docs/admin-manual/config/fe-config.md index a04f6545d2656d..6a92b828af5267 100644 --- a/docs/zh-CN/docs/admin-manual/config/fe-config.md +++ b/docs/zh-CN/docs/admin-manual/config/fe-config.md @@ -2780,3 +2780,14 @@ show data (其他用法:HELP SHOW DATA) Default: mysql Doris 为了兼用 mysql 周边工具生态,会内置一个名为 mysql 的数据库,如果该数据库与用户自建数据库冲突,请修改这个字段,为 doris 内置的 mysql database 更换一个名字 + + +#### `fe_thrift_max_pkg_bytes` + +默认值:20000000 + +是否可以动态配置:false + +是否为 Master FE 节点独有的配置项:false + +用于限制fe节点thrift端口可以接收的最大包长度,避免接收到过大或者错误的包导致OOM \ No newline at end of file diff --git a/fe/fe-common/src/main/java/org/apache/doris/common/Config.java b/fe/fe-common/src/main/java/org/apache/doris/common/Config.java index 0daa863f8fc21d..5c076893c88261 100644 --- a/fe/fe-common/src/main/java/org/apache/doris/common/Config.java +++ b/fe/fe-common/src/main/java/org/apache/doris/common/Config.java @@ -2285,4 +2285,10 @@ public class Config extends ConfigBase { @ConfField(mutable = true, masterOnly = true) public static int publish_topic_info_interval_ms = 30000; // 30s + + @ConfField(description = { + "限制fe节点thrift server可以接收的最大包大小,默认20M,设置为-1表示不限制", + "the max package size fe thrift server can receive,avoid accepting error" + + "or too large package causing OOM,default 20000000(20M),set -1 for unlimited. "}) + public static int fe_thrift_max_pkg_bytes = 20000000; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/ThriftServer.java b/fe/fe-core/src/main/java/org/apache/doris/common/ThriftServer.java index 2396dc95074cda..45c4bcb64f00c5 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/common/ThriftServer.java +++ b/fe/fe-core/src/main/java/org/apache/doris/common/ThriftServer.java @@ -92,14 +92,14 @@ public ThriftServerType getType() { private void createSimpleServer() throws TTransportException { TServer.Args args = new TServer.Args(new TServerSocket(port)).protocolFactory( - new TBinaryProtocol.Factory()).processor(processor); + new TBinaryProtocol.Factory(Config.fe_thrift_max_pkg_bytes, -1)).processor(processor); server = new TSimpleServer(args); } private void createThreadedServer() throws TTransportException { TThreadedSelectorServer.Args args = new TThreadedSelectorServer.Args( new TNonblockingServerSocket(port, Config.thrift_client_timeout_ms)).protocolFactory( - new TBinaryProtocol.Factory()).processor(processor); + new TBinaryProtocol.Factory(Config.fe_thrift_max_pkg_bytes, -1)).processor(processor); ThreadPoolExecutor threadPoolExecutor = ThreadPoolManager.newDaemonCacheThreadPool( Config.thrift_server_max_worker_threads, "thrift-server-pool", true); args.executorService(threadPoolExecutor); @@ -123,7 +123,7 @@ private void createThreadPoolServer() throws TTransportException { TThreadPoolServer.Args serverArgs = new TThreadPoolServer.Args(new TServerSocket(socketTransportArgs)).protocolFactory( - new TBinaryProtocol.Factory()).processor(processor); + new TBinaryProtocol.Factory(Config.fe_thrift_max_pkg_bytes, -1)).processor(processor); ThreadPoolExecutor threadPoolExecutor = ThreadPoolManager.newDaemonCacheThreadPool( Config.thrift_server_max_worker_threads, "thrift-server-pool", true); serverArgs.executorService(threadPoolExecutor);