From 66938d14e8d61d18e234a9aec826b7d4310ae8eb Mon Sep 17 00:00:00 2001 From: hnwyllmm Date: Mon, 12 Aug 2024 09:41:53 +0000 Subject: [PATCH] fix load data file reader memory leak --- src/sql/engine/cmd/ob_load_data_direct_impl.cpp | 7 +++++-- src/sql/engine/cmd/ob_load_data_file_reader.cpp | 7 +++++++ src/sql/engine/cmd/ob_load_data_file_reader.h | 1 + src/sql/engine/cmd/ob_load_data_impl.cpp | 7 +++++-- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/sql/engine/cmd/ob_load_data_direct_impl.cpp b/src/sql/engine/cmd/ob_load_data_direct_impl.cpp index a36552935..751c56999 100644 --- a/src/sql/engine/cmd/ob_load_data_direct_impl.cpp +++ b/src/sql/engine/cmd/ob_load_data_direct_impl.cpp @@ -466,7 +466,7 @@ ObLoadDataDirectImpl::DataReader::DataReader() ObLoadDataDirectImpl::DataReader::~DataReader() { if (OB_NOT_NULL(file_reader_)) { - file_reader_->~ObFileReader(); + ObFileReader::destroy(file_reader_); file_reader_ = nullptr; } } @@ -502,7 +502,10 @@ int ObLoadDataDirectImpl::DataReader::init(const DataAccessParam &data_access_pa file_read_param.filename_ = data_desc.filename_; file_read_param.compression_format_ = data_access_param.compression_format_; file_read_param.access_info_ = data_access_param.access_info_; - file_read_param.packet_handle_ = &execute_ctx.exec_ctx_.get_session_info()->get_pl_query_sender()->get_packet_sender(); + file_read_param.packet_handle_ = nullptr; + if (OB_NOT_NULL(execute_ctx.exec_ctx_.get_session_info()) && OB_NOT_NULL(execute_ctx.exec_ctx_.get_session_info()->get_pl_query_sender())) { + file_read_param.packet_handle_ = &execute_ctx.exec_ctx_.get_session_info()->get_pl_query_sender()->get_packet_sender(); + } file_read_param.session_ = execute_ctx.exec_ctx_.get_session_info(); file_read_param.timeout_ts_ = THIS_WORKER.get_timeout_ts(); diff --git a/src/sql/engine/cmd/ob_load_data_file_reader.cpp b/src/sql/engine/cmd/ob_load_data_file_reader.cpp index 32861094e..ac9384871 100644 --- a/src/sql/engine/cmd/ob_load_data_file_reader.cpp +++ b/src/sql/engine/cmd/ob_load_data_file_reader.cpp @@ -132,6 +132,13 @@ int ObFileReader::open(const ObFileReadParam ¶m, ObIAllocator &allocator, Ob return ret; } +void ObFileReader::destroy(ObFileReader *file_reader) +{ + if (OB_NOT_NULL(file_reader)) { + OB_DELETE(ObFileReader, MEMORY_ATTR, file_reader); + } +} + int ObFileReader::open_decompress_reader(const ObFileReadParam ¶m, ObIAllocator &allocator, ObFileReader *source_reader, diff --git a/src/sql/engine/cmd/ob_load_data_file_reader.h b/src/sql/engine/cmd/ob_load_data_file_reader.h index 506b17c3e..b95050285 100644 --- a/src/sql/engine/cmd/ob_load_data_file_reader.h +++ b/src/sql/engine/cmd/ob_load_data_file_reader.h @@ -92,6 +92,7 @@ public: * A file reader factory */ static int open(const ObFileReadParam ¶m, ObIAllocator &allocator, ObFileReader *& file_reader); + static void destroy(ObFileReader *file_reader); private: static int open_decompress_reader(const ObFileReadParam ¶m, diff --git a/src/sql/engine/cmd/ob_load_data_impl.cpp b/src/sql/engine/cmd/ob_load_data_impl.cpp index 472ca6c73..89c37364d 100644 --- a/src/sql/engine/cmd/ob_load_data_impl.cpp +++ b/src/sql/engine/cmd/ob_load_data_impl.cpp @@ -2468,7 +2468,7 @@ int ObLoadDataSPImpl::ToolBox::release_resources() //release file reader if (OB_NOT_NULL(file_reader)) { - file_reader->~ObFileReader(); + ObFileReader::destroy(file_reader); file_reader = NULL; } @@ -2776,7 +2776,10 @@ int ObLoadDataSPImpl::ToolBox::init(ObExecContext &ctx, ObLoadDataStmt &load_stm file_read_param.filename_ = load_args.file_name_; file_read_param.compression_format_ = load_args.compression_format_; file_read_param.access_info_ = load_args.access_info_; - file_read_param.packet_handle_ = &ctx.get_my_session()->get_pl_query_sender()->get_packet_sender(); + file_read_param.packet_handle_ = nullptr; + if (OB_NOT_NULL(ctx.get_my_session()) && OB_NOT_NULL(ctx.get_my_session()->get_pl_query_sender())) { + file_read_param.packet_handle_ = &ctx.get_my_session()->get_pl_query_sender()->get_packet_sender(); + } file_read_param.session_ = ctx.get_my_session(); file_read_param.timeout_ts_ = THIS_WORKER.get_timeout_ts();