From c351eb24f1c110807baa14a77d521eea1198f2bc Mon Sep 17 00:00:00 2001 From: Rongqi Sun Date: Tue, 21 May 2024 09:16:14 +0000 Subject: [PATCH] ec: free plugin memory when it destructs When sanitizer is enabled, unittest_erasure_code_shec_thread shows, ``` ================================================================= ==737674==ERROR: LeakSanitizer: detected memory leaks Direct leak of 1360 byte(s) in 5 object(s) allocated from: #0 0xaaaadddffb08 in operator new(unsigned long) (/root/ceph/build/bin/unittest_erasure_code_shec_thread+0x1bfb08) (BuildId: 187a0067c45bf30f4d0bd2df83a32e0127ef03a1) #1 0xffff800bb004 in __erasure_code_init /root/ceph/src/erasure-code/shec/ErasureCodePluginShec.cc:81:36 #2 0xaaaadde08de0 in thread1(void*) /root/ceph/src/test/erasure-code/TestErasureCodeShec_thread.cc:100:5 #3 0xffff7f45d5c4 in start_thread nptl/./nptl/pthread_create.c:442:8 #4 0xffff7f4c5ed8 misc/../sysdeps/unix/sysv/linux/aarch64/clone.S:79 SUMMARY: AddressSanitizer: 1360 byte(s) leaked in 5 allocation(s). ``` When the plugin destructed, memory should be freed without unloading the dynamic library. Signed-off-by: Rongqi Sun --- src/erasure-code/ErasureCodePlugin.cc | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/erasure-code/ErasureCodePlugin.cc b/src/erasure-code/ErasureCodePlugin.cc index f189b91fdfe35..82e4f1b198bbf 100644 --- a/src/erasure-code/ErasureCodePlugin.cc +++ b/src/erasure-code/ErasureCodePlugin.cc @@ -15,6 +15,7 @@ * */ +#include #include #include "ceph_ver.h" @@ -39,15 +40,14 @@ ErasureCodePluginRegistry::ErasureCodePluginRegistry() = default; ErasureCodePluginRegistry::~ErasureCodePluginRegistry() { - if (disable_dlclose) - return; - - for (std::map::iterator i = plugins.begin(); - i != plugins.end(); - ++i) { - void *library = i->second->library; - delete i->second; - dlclose(library); + for (auto& name_plugin : plugins) { + auto *plugin = name_plugin.second; + assert(plugin); + void *library = plugin->library; + delete plugin; + if (!disable_dlclose) { + dlclose(library); + } } }