From 6b392cbe58bc3f197428e7d686f34da636f16f93 Mon Sep 17 00:00:00 2001 From: "zhenshan.cao" <zhenshan.cao@zilliz.com> Date: Tue, 23 Feb 2021 14:35:00 +0800 Subject: [PATCH] Fix memory leak Signed-off-by: zhenshan.cao <zhenshan.cao@zilliz.com> --- internal/core/src/indexbuilder/index_c.cpp | 10 +++++++++ internal/core/unittest/CMakeLists.txt | 26 +++++++++++----------- internal/indexnode/index.go | 2 +- internal/indexnode/task.go | 1 + 4 files changed, 25 insertions(+), 14 deletions(-) diff --git a/internal/core/src/indexbuilder/index_c.cpp b/internal/core/src/indexbuilder/index_c.cpp index 43cb59627..e97ea26cc 100644 --- a/internal/core/src/indexbuilder/index_c.cpp +++ b/internal/core/src/indexbuilder/index_c.cpp @@ -90,6 +90,8 @@ SerializeToSlicedBuffer(CIndex index, CBinary* c_binary) { try { auto cIndex = (milvus::indexbuilder::IndexWrapper*)index; auto binary = cIndex->Serialize(); + std::cout << "[SerializeToSlicedBuffer] binary data size: " << binary->data.size() << std::endl; + std::cout << "[SerializeToSlicedBuffer] binary data[0]: " << binary->data[0] << std::endl; *c_binary = binary.release(); status.error_code = Success; status.error_msg = ""; @@ -103,6 +105,8 @@ SerializeToSlicedBuffer(CIndex index, CBinary* c_binary) { int64_t GetCBinarySize(CBinary c_binary) { auto cBinary = (milvus::indexbuilder::IndexWrapper::Binary*)c_binary; + std::cout << "[GetCBinarySize] binary data size: " << cBinary->data.size() << std::endl; + std::cout << "[GetCBinarySize] binary data[0]: " << cBinary->data[0] << std::endl; return cBinary->data.size(); } @@ -110,12 +114,18 @@ GetCBinarySize(CBinary c_binary) { void GetCBinaryData(CBinary c_binary, void* data) { auto cBinary = (milvus::indexbuilder::IndexWrapper::Binary*)c_binary; + std::cout << "[GetCBinaryData] binary data size: " << cBinary->data.size() << std::endl; + std::cout << "[GetCBinaryData] binary data[0]: " << cBinary->data[0] << std::endl; memcpy(data, cBinary->data.data(), cBinary->data.size()); } void DeleteCBinary(CBinary c_binary) { + std::cout << "[DeleteCBinary] enter here ......" << std::endl; auto cBinary = (milvus::indexbuilder::IndexWrapper::Binary*)c_binary; + std::cout << "[DeleteCBinary] pointer cast done ........" << std::endl; + std::cout << "[DeleteCBinary] binary data size: " << cBinary->data.size() << std::endl; + std::cout << "[DeleteCBinary] binary data[0]: " << cBinary->data[0] << std::endl; delete cBinary; } diff --git a/internal/core/unittest/CMakeLists.txt b/internal/core/unittest/CMakeLists.txt index 8229c30e4..bfc06eea7 100644 --- a/internal/core/unittest/CMakeLists.txt +++ b/internal/core/unittest/CMakeLists.txt @@ -25,19 +25,19 @@ add_executable(all_tests ) # check if memory leak exists in index builder -# set(INDEX_BUILDER_TEST_FILES -# test_index_wrapper.cpp) -# add_executable(index_builder_test -# ${INDEX_BUILDER_TEST_FILES} -# ) -# target_link_libraries(index_builder_test -# gtest -# gtest_main -# milvus_segcore -# milvus_indexbuilder -# log -# pthread -# ) +set(INDEX_BUILDER_TEST_FILES + test_index_wrapper.cpp) +add_executable(index_builder_test + ${INDEX_BUILDER_TEST_FILES} + ) +target_link_libraries(index_builder_test + gtest + gtest_main + milvus_segcore + milvus_indexbuilder + log + pthread + ) target_link_libraries(all_tests gtest diff --git a/internal/indexnode/index.go b/internal/indexnode/index.go index c70f05d02..e677d0ab5 100644 --- a/internal/indexnode/index.go +++ b/internal/indexnode/index.go @@ -131,9 +131,9 @@ type CIndex struct { func (index *CIndex) Serialize() ([]*Blob, error) { var cBinary C.CBinary - defer C.DeleteCBinary(cBinary) status := C.SerializeToSlicedBuffer(index.indexPtr, &cBinary) + defer C.DeleteCBinary(cBinary) errorCode := status.error_code if errorCode != 0 { errorMsg := C.GoString(status.error_msg) diff --git a/internal/indexnode/task.go b/internal/indexnode/task.go index 34a350358..cce59b1c0 100644 --- a/internal/indexnode/task.go +++ b/internal/indexnode/task.go @@ -233,6 +233,7 @@ func (it *IndexBuildTask) Execute(ctx context.Context) error { storageBlobs := getStorageBlobs(blobs) var insertCodec storage.InsertCodec + defer insertCodec.Close() partitionID, segmentID, insertData, err2 := insertCodec.Deserialize(storageBlobs) //fmt.Println("IndexBuilder for segmentID,", segmentID) if err2 != nil { -- GitLab