From fd3d7d13a30104d6ab348c6bf040a5dd24e6c973 Mon Sep 17 00:00:00 2001 From: "jiadebinmary@gmail.com" Date: Fri, 15 Sep 2023 05:10:06 +0000 Subject: [PATCH] Fix tenant_mutil_allcator memory leak issue. --- .../allocator/ob_tenant_mutil_allocator.cpp | 20 +++++++++++++++++++ .../allocator/ob_tenant_mutil_allocator.h | 4 ++-- .../ob_tenant_mutil_allocator_mgr.cpp | 5 +++++ 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/share/allocator/ob_tenant_mutil_allocator.cpp b/src/share/allocator/ob_tenant_mutil_allocator.cpp index 19ba39795..07691ea6c 100644 --- a/src/share/allocator/ob_tenant_mutil_allocator.cpp +++ b/src/share/allocator/ob_tenant_mutil_allocator.cpp @@ -61,6 +61,26 @@ ObTenantMutilAllocator::ObTenantMutilAllocator(uint64_t tenant_id) } } +ObTenantMutilAllocator::~ObTenantMutilAllocator() +{ + OB_LOG(INFO, "~ObTenantMutilAllocator", K(tenant_id_)); + destroy(); +} + +void ObTenantMutilAllocator::destroy() +{ + OB_LOG(INFO, "ObTenantMutilAllocator destroy", K(tenant_id_)); + clog_ge_alloc_.destroy(); + log_io_flush_log_task_alloc_.destroy(); + log_io_truncate_log_task_alloc_.destroy(); + log_io_flush_meta_task_alloc_.destroy(); + log_io_truncate_prefix_blocks_task_alloc_.destroy(); + log_io_flashback_task_alloc_.destroy(); + log_io_purge_throttling_task_alloc_.destroy(); + palf_fetch_log_task_alloc_.destroy(); + replay_log_task_alloc_.destroy(); +} + int ObTenantMutilAllocator::choose_blk_size(int obj_size) { static const int MIN_SLICE_CNT = 64; diff --git a/src/share/allocator/ob_tenant_mutil_allocator.h b/src/share/allocator/ob_tenant_mutil_allocator.h index 9ba9ccc54..422092e06 100644 --- a/src/share/allocator/ob_tenant_mutil_allocator.h +++ b/src/share/allocator/ob_tenant_mutil_allocator.h @@ -95,8 +95,8 @@ public: public: explicit ObTenantMutilAllocator(uint64_t tenant_id); - ~ObTenantMutilAllocator() - {} + ~ObTenantMutilAllocator(); + void destroy(); // update nway when tenant's max_cpu changed void set_nway(const int32_t nway); // update limit when tenant's memory_limit changed diff --git a/src/share/allocator/ob_tenant_mutil_allocator_mgr.cpp b/src/share/allocator/ob_tenant_mutil_allocator_mgr.cpp index b2eeecf95..1e4cafa7e 100644 --- a/src/share/allocator/ob_tenant_mutil_allocator_mgr.cpp +++ b/src/share/allocator/ob_tenant_mutil_allocator_mgr.cpp @@ -252,8 +252,11 @@ int ObTenantMutilAllocatorMgr::delete_tenant_mutil_allocator_(const uint64_t ten if (NULL != (tma_allocator = ATOMIC_LOAD(&tma_array_[tenant_id]))) { if (NULL != tma_allocator->get_next()) { OB_LOG(INFO, "next_ ptr is not NULL, skip deleting this allocator", K(ret), K(tenant_id)); + // Purge cached blocks of this allocator. + tma_allocator->try_purge(); } else { tma_array_[tenant_id] = NULL; + // destroy tma object tma_allocator->~TMA(); ob_free(tma_allocator); tma_allocator = NULL; @@ -276,6 +279,8 @@ int ObTenantMutilAllocatorMgr::delete_tenant_mutil_allocator_(const uint64_t ten OB_ASSERT(prev != cur); prev->get_next() = cur->get_next(); cur->get_next() = NULL; + // destroy tma object + cur->~TMA(); ob_free(cur); cur = NULL; }