This is an automated email from the ASF dual-hosted git repository. morningman pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-doris.git
The following commit(s) were added to refs/heads/master by this push: new fb6e22f [Fix] fix memory leak in be unit test (#7857) fb6e22f is described below commit fb6e22f4ca97d5b945bf49a3c0a785bb9311db6d Author: zhangstar333 <87313068+zhangstar...@users.noreply.github.com> AuthorDate: Sat Jan 29 01:00:38 2022 +0800 [Fix] fix memory leak in be unit test (#7857) 1. fix be unit test memory leak 2. ignore mindump test with ASAN test --- be/CMakeLists.txt | 1 + be/src/util/sm3.cpp | 4 ++ be/src/util/sm3.h | 2 +- be/src/vec/functions/function.h | 4 ++ .../segment_v2/column_reader_writer_test.cpp | 73 ++++++++++++++-------- be/test/runtime/CMakeLists.txt | 2 +- be/test/vec/aggregate_functions/agg_test.cpp | 3 + be/test/vec/exprs/vexpr_test.cpp | 12 ++++ be/test/vec/function/function_bitmap_test.cpp | 21 +++++++ run-be-ut.sh | 2 +- 10 files changed, 96 insertions(+), 28 deletions(-) diff --git a/be/CMakeLists.txt b/be/CMakeLists.txt index cfe4a46..15f8466 100644 --- a/be/CMakeLists.txt +++ b/be/CMakeLists.txt @@ -826,6 +826,7 @@ if (${MAKE_TEST} STREQUAL "ON") add_subdirectory(${TEST_DIR}/udf) add_subdirectory(${TEST_DIR}/util) add_subdirectory(${TEST_DIR}/vec/core) + add_subdirectory(${TEST_DIR}/vec/exec) add_subdirectory(${TEST_DIR}/vec/exprs) add_subdirectory(${TEST_DIR}/vec/function) add_subdirectory(${TEST_DIR}/vec/runtime) diff --git a/be/src/util/sm3.cpp b/be/src/util/sm3.cpp index c2a6f8e..c124a99 100644 --- a/be/src/util/sm3.cpp +++ b/be/src/util/sm3.cpp @@ -27,6 +27,10 @@ SM3Digest::SM3Digest() { EVP_DigestInit_ex(_ctx, _md, NULL); } +SM3Digest::~SM3Digest() { + EVP_MD_CTX_free(_ctx); +} + void SM3Digest::update(const void* data, size_t length) { EVP_DigestUpdate(_ctx, data, length); } diff --git a/be/src/util/sm3.h b/be/src/util/sm3.h index 9108410..d2e9398 100644 --- a/be/src/util/sm3.h +++ b/be/src/util/sm3.h @@ -28,7 +28,7 @@ namespace doris { class SM3Digest { public: SM3Digest(); - + ~SM3Digest(); void update(const void* data, size_t length); void digest(); diff --git a/be/src/vec/functions/function.h b/be/src/vec/functions/function.h index cf00c08..0ea494a0 100644 --- a/be/src/vec/functions/function.h +++ b/be/src/vec/functions/function.h @@ -491,6 +491,10 @@ public: return function->prepare(context, scope); } + Status close(FunctionContext* context, FunctionContext::FunctionStateScope scope) override { + return function->close(context, scope); + } + bool is_suitable_for_constant_folding() const override { return function->is_suitable_for_constant_folding(); } diff --git a/be/test/olap/rowset/segment_v2/column_reader_writer_test.cpp b/be/test/olap/rowset/segment_v2/column_reader_writer_test.cpp index 10eaf63..7045708 100644 --- a/be/test/olap/rowset/segment_v2/column_reader_writer_test.cpp +++ b/be/test/olap/rowset/segment_v2/column_reader_writer_test.cpp @@ -126,31 +126,31 @@ void test_nullable_data(uint8_t* src_data, uint8_t* src_is_null, int num_rows, const TypeInfo* type_info = get_scalar_type_info(type); // read and check { - // read and check - ColumnReaderOptions reader_opts; - FilePathDesc path_desc; - path_desc.filepath = fname; - std::unique_ptr<ColumnReader> reader; - auto st = ColumnReader::create(reader_opts, meta, num_rows, path_desc, &reader); - ASSERT_TRUE(st.ok()); - - ColumnIterator* iter = nullptr; - st = reader->new_iterator(&iter); - ASSERT_TRUE(st.ok()); - std::unique_ptr<fs::ReadableBlock> rblock; - fs::BlockManager* block_manager = fs::fs_util::block_manager(TStorageMedium::HDD); - block_manager->open_block(path_desc, &rblock); - - ASSERT_TRUE(st.ok()); - ColumnIteratorOptions iter_opts; - OlapReaderStatistics stats; - iter_opts.stats = &stats; - iter_opts.rblock = rblock.get(); - iter_opts.mem_tracker = std::make_shared<MemTracker>(); - st = iter->init(iter_opts); - ASSERT_TRUE(st.ok()); // sequence read { + ColumnReaderOptions reader_opts; + FilePathDesc path_desc; + path_desc.filepath = fname; + std::unique_ptr<ColumnReader> reader; + auto st = ColumnReader::create(reader_opts, meta, num_rows, path_desc, &reader); + ASSERT_TRUE(st.ok()); + + ColumnIterator* iter = nullptr; + st = reader->new_iterator(&iter); + ASSERT_TRUE(st.ok()); + std::unique_ptr<fs::ReadableBlock> rblock; + fs::BlockManager* block_manager = fs::fs_util::block_manager(TStorageMedium::HDD); + block_manager->open_block(path_desc, &rblock); + + ASSERT_TRUE(st.ok()); + ColumnIteratorOptions iter_opts; + OlapReaderStatistics stats; + iter_opts.stats = &stats; + iter_opts.rblock = rblock.get(); + iter_opts.mem_tracker = std::make_shared<MemTracker>(); + st = iter->init(iter_opts); + ASSERT_TRUE(st.ok()); + st = iter->seek_to_first(); ASSERT_TRUE(st.ok()) << st.to_string(); @@ -185,9 +185,33 @@ void test_nullable_data(uint8_t* src_data, uint8_t* src_is_null, int num_rows, break; } } + delete iter; } { + ColumnReaderOptions reader_opts; + FilePathDesc path_desc; + path_desc.filepath = fname; + std::unique_ptr<ColumnReader> reader; + auto st = ColumnReader::create(reader_opts, meta, num_rows, path_desc, &reader); + ASSERT_TRUE(st.ok()); + + ColumnIterator* iter = nullptr; + st = reader->new_iterator(&iter); + ASSERT_TRUE(st.ok()); + std::unique_ptr<fs::ReadableBlock> rblock; + fs::BlockManager* block_manager = fs::fs_util::block_manager(TStorageMedium::HDD); + block_manager->open_block(path_desc, &rblock); + + ASSERT_TRUE(st.ok()); + ColumnIteratorOptions iter_opts; + OlapReaderStatistics stats; + iter_opts.stats = &stats; + iter_opts.rblock = rblock.get(); + iter_opts.mem_tracker = std::make_shared<MemTracker>(); + st = iter->init(iter_opts); + ASSERT_TRUE(st.ok()); + auto tracker = std::make_shared<MemTracker>(); MemPool pool(tracker.get()); std::unique_ptr<ColumnVectorBatch> cvb; @@ -219,9 +243,8 @@ void test_nullable_data(uint8_t* src_data, uint8_t* src_is_null, int num_rows, idx++; } } + delete iter; } - - delete iter; } } diff --git a/be/test/runtime/CMakeLists.txt b/be/test/runtime/CMakeLists.txt index 4f54556..28eff33 100644 --- a/be/test/runtime/CMakeLists.txt +++ b/be/test/runtime/CMakeLists.txt @@ -63,4 +63,4 @@ ADD_BE_TEST(memory/chunk_allocator_test) ADD_BE_TEST(memory/system_allocator_test) ADD_BE_TEST(cache/partition_cache_test) ADD_BE_TEST(collection_value_test) -ADD_BE_TEST(minidump_test) +#ADD_BE_TEST(minidump_test) diff --git a/be/test/vec/aggregate_functions/agg_test.cpp b/be/test/vec/aggregate_functions/agg_test.cpp index 9bf9f8f..33e6c43 100644 --- a/be/test/vec/aggregate_functions/agg_test.cpp +++ b/be/test/vec/aggregate_functions/agg_test.cpp @@ -52,6 +52,9 @@ TEST(AggTest, basic_test) { } ASSERT_EQ(ans, *(int32_t*)place); agg_function->destroy(place); + if(place) { + free(place); + } } } // namespace doris::vectorized diff --git a/be/test/vec/exprs/vexpr_test.cpp b/be/test/vec/exprs/vexpr_test.cpp index d9a5e4d..c0d7bcc 100644 --- a/be/test/vec/exprs/vexpr_test.cpp +++ b/be/test/vec/exprs/vexpr_test.cpp @@ -79,6 +79,12 @@ TEST(TEST_VEXPR, ABSTEST) { auto block = row_batch.convert_to_vec_block(); int ts = -1; context->execute(&block, &ts); + + FunctionContext* fun_ct = context->fn_context(0); + context->close(&runtime_stat); + if(fun_ct) { + delete fun_ct; + } } TEST(TEST_VEXPR, ABSTEST2) { @@ -124,6 +130,12 @@ TEST(TEST_VEXPR, ABSTEST2) { auto block = row_batch.convert_to_vec_block(); int ts = -1; context->execute(&block, &ts); + + FunctionContext* fun_ct = context->fn_context(0); + context->close(&runtime_stat); + if(fun_ct) { + delete fun_ct; + } } namespace doris { diff --git a/be/test/vec/function/function_bitmap_test.cpp b/be/test/vec/function/function_bitmap_test.cpp index 7a2c3c8..12d10c6 100644 --- a/be/test/vec/function/function_bitmap_test.cpp +++ b/be/test/vec/function/function_bitmap_test.cpp @@ -35,6 +35,9 @@ TEST(function_bitmap_test, function_bitmap_min_test) { {{Null()}, Null()}}; check_function<DataTypeInt64, true>(func_name, input_types, data_set); + delete bitmap1; + delete bitmap2; + delete empty_bitmap; } TEST(function_bitmap_test, function_bitmap_max_test) { std::string func_name = "bitmap_max"; @@ -49,6 +52,9 @@ TEST(function_bitmap_test, function_bitmap_max_test) { {{Null()}, Null()}}; check_function<DataTypeInt64, true>(func_name, input_types, data_set); + delete bitmap1; + delete bitmap2; + delete empty_bitmap; } TEST(function_bitmap_test, function_bitmap_to_string_test) { @@ -64,6 +70,9 @@ TEST(function_bitmap_test, function_bitmap_to_string_test) { {{Null()}, Null()}}; check_function<DataTypeString, true>(func_name, input_types, data_set); + delete bitmap1; + delete bitmap2; + delete empty_bitmap; } TEST(function_bitmap_test, function_bitmap_and_count) { @@ -77,6 +86,9 @@ TEST(function_bitmap_test, function_bitmap_and_count) { {{bitmap1, bitmap2}, (int64_t)1}}; check_function<DataTypeInt64, true>(func_name, input_types, data_set); + delete bitmap1; + delete bitmap2; + delete empty_bitmap; } TEST(function_bitmap_test, function_bitmap_or_count) { @@ -91,6 +103,10 @@ TEST(function_bitmap_test, function_bitmap_or_count) { {{bitmap1, bitmap3}, (int64_t)3}}; check_function<DataTypeInt64, true>(func_name, input_types, data_set); + delete bitmap1; + delete bitmap2; + delete bitmap3; + delete empty_bitmap; } TEST(function_bitmap_test, function_bitmap_xor_count) { @@ -106,6 +122,11 @@ TEST(function_bitmap_test, function_bitmap_xor_count) { {{bitmap1, bitmap4}, (int64_t)2}}; check_function<DataTypeInt64, true>(func_name, input_types, data_set); + delete bitmap1; + delete bitmap2; + delete bitmap3; + delete bitmap4; + delete empty_bitmap; } } // namespace doris::vectorized diff --git a/run-be-ut.sh b/run-be-ut.sh index 4cd603f..66b4b67 100755 --- a/run-be-ut.sh +++ b/run-be-ut.sh @@ -127,7 +127,7 @@ else fi cd ${CMAKE_BUILD_DIR} -${CMAKE_CMD} -DCMAKE_MAKE_PROGRAM="${BUILD_SYSTEM}" ../ -DWITH_MYSQL=OFF -DMAKE_TEST=ON -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} \ +${CMAKE_CMD} -G "${GENERATOR}" ../ -DWITH_MYSQL=OFF -DMAKE_TEST=ON -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} \ -DGLIBC_COMPATIBILITY=${GLIBC_COMPATIBILITY} ${CMAKE_USE_CCACHE} ${BUILD_SYSTEM} -j ${PARALLEL} $RUN_FILE --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org