From b15f3d623299ae2241a4e09691e1d79868c27f22 Mon Sep 17 00:00:00 2001 From: yujun Date: Thu, 23 Nov 2023 23:51:03 +0800 Subject: [PATCH] [improvement](drop tablet) impr gc shutdown tablet lock (#26151) (#27478) --- be/src/olap/tablet_manager.cpp | 44 ++++++++++++++++++++++++---------- be/src/olap/tablet_manager.h | 4 ++++ 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/be/src/olap/tablet_manager.cpp b/be/src/olap/tablet_manager.cpp index 28137309c0d487..f6cfb6b6dc4dac 100644 --- a/be/src/olap/tablet_manager.cpp +++ b/be/src/olap/tablet_manager.cpp @@ -638,12 +638,24 @@ TabletSharedPtr TabletManager::_get_tablet_unlocked(TTabletId tablet_id, bool in TabletSharedPtr tablet; tablet = _get_tablet_unlocked(tablet_id); if (tablet == nullptr && include_deleted) { - std::shared_lock rdlock(_shutdown_tablets_lock); - for (auto& deleted_tablet : _shutdown_tablets) { - CHECK(deleted_tablet != nullptr) << "deleted tablet is nullptr"; - if (deleted_tablet->tablet_id() == tablet_id) { - tablet = deleted_tablet; - break; + { + std::shared_lock rdlock(_shutdown_tablets_lock); + for (auto& deleted_tablet : _shutdown_tablets) { + CHECK(deleted_tablet != nullptr) << "deleted tablet is nullptr"; + if (deleted_tablet->tablet_id() == tablet_id) { + tablet = deleted_tablet; + break; + } + } + } + if (tablet == nullptr) { + std::shared_lock rdlock(_shutdown_deleting_tablets_lock); + for (auto& deleted_tablet : _shutdown_deleting_tablets) { + CHECK(deleted_tablet != nullptr) << "deleted tablet is nullptr"; + if (deleted_tablet->tablet_id() == tablet_id) { + tablet = deleted_tablet; + break; + } } } } @@ -1065,9 +1077,17 @@ Status TabletManager::start_trash_sweep() { clean_num = 0; // should get write lock here, because it will remove tablet from shut_down_tablets // and get tablet will access shut_down_tablets - std::lock_guard wrlock(_shutdown_tablets_lock); - auto it = _shutdown_tablets.begin(); - while (it != _shutdown_tablets.end()) { + { + std::lock_guard wrlock1(_shutdown_tablets_lock); + std::lock_guard wrlock2(_shutdown_deleting_tablets_lock); + for (const auto& tablet : _shutdown_tablets) { + _shutdown_deleting_tablets.push_back(tablet); + } + _shutdown_tablets.clear(); + } + std::lock_guard wrlock(_shutdown_deleting_tablets_lock); + auto it = _shutdown_deleting_tablets.begin(); + while (it != _shutdown_deleting_tablets.end()) { // check if the meta has the tablet info and its state is shutdown if (it->use_count() > 1) { // it means current tablet is referenced by other thread @@ -1086,7 +1106,7 @@ Status TabletManager::start_trash_sweep() { << " old tablet_uid=" << (*it)->tablet_uid() << " cur tablet_uid=" << tablet_meta->tablet_uid(); // remove it from list - it = _shutdown_tablets.erase(it); + it = _shutdown_deleting_tablets.erase(it); continue; } // move data to trash @@ -1115,7 +1135,7 @@ Status TabletManager::start_trash_sweep() { << "tablet_id=" << (*it)->tablet_id() << ", schema_hash=" << (*it)->schema_hash() << ", tablet_path=" << tablet_path; - it = _shutdown_tablets.erase(it); + it = _shutdown_deleting_tablets.erase(it); ++clean_num; } else { // if could not find tablet info in meta store, then check if dir existed @@ -1135,7 +1155,7 @@ Status TabletManager::start_trash_sweep() { << "tablet_id=" << (*it)->tablet_id() << ", schema_hash=" << (*it)->schema_hash() << ", tablet_path=" << tablet_path; - it = _shutdown_tablets.erase(it); + it = _shutdown_deleting_tablets.erase(it); } } diff --git a/be/src/olap/tablet_manager.h b/be/src/olap/tablet_manager.h index 4f6b3278194de0..aa7635021959d6 100644 --- a/be/src/olap/tablet_manager.h +++ b/be/src/olap/tablet_manager.h @@ -242,6 +242,10 @@ class TabletManager { std::map> _partition_tablet_map; std::vector _shutdown_tablets; + // gc thread will move _shutdown_tablets to _shutdown_deleting_tablets + std::shared_mutex _shutdown_deleting_tablets_lock; + std::list _shutdown_deleting_tablets; + std::mutex _tablet_stat_cache_mutex; std::shared_ptr> _tablet_stat_list_cache = std::make_shared>();