From efcb2d5043d5f612342f2a067b817dabe86e38f2 Mon Sep 17 00:00:00 2001 From: Yixin Luo <18810541851@163.com> Date: Wed, 3 Jan 2024 03:38:52 -0800 Subject: [PATCH] [Enhancement] reduce tablet shard read lock holding time when calc persistent index compact score (#38299) Signed-off-by: luohaha <18810541851@163.com> --- be/src/storage/olap_server.cpp | 8 +++++--- be/src/storage/tablet_manager.cpp | 18 +++++++++++------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/be/src/storage/olap_server.cpp b/be/src/storage/olap_server.cpp index c777d38db11e4..3f2755e2b89e7 100644 --- a/be/src/storage/olap_server.cpp +++ b/be/src/storage/olap_server.cpp @@ -404,9 +404,11 @@ void* StorageEngine::_pk_index_major_compaction_thread_callback(void* arg) { while (!_bg_worker_stopped.load(std::memory_order_consume)) { SLEEP_IN_BG_WORKER(1); // schedule persistent index compaction - _update_manager->get_pindex_compaction_mgr()->schedule([&]() { - return StorageEngine::instance()->tablet_manager()->pick_tablets_to_do_pk_index_major_compaction(); - }); + if (config::enable_pindex_minor_compaction) { + _update_manager->get_pindex_compaction_mgr()->schedule([&]() { + return StorageEngine::instance()->tablet_manager()->pick_tablets_to_do_pk_index_major_compaction(); + }); + } } return nullptr; diff --git a/be/src/storage/tablet_manager.cpp b/be/src/storage/tablet_manager.cpp index 50a94b72ba617..a2356673c8125 100644 --- a/be/src/storage/tablet_manager.cpp +++ b/be/src/storage/tablet_manager.cpp @@ -705,6 +705,7 @@ TabletSharedPtr TabletManager::find_best_tablet_to_compaction(CompactionType com std::vector TabletManager::pick_tablets_to_do_pk_index_major_compaction() { std::vector pick_tablets; // 1. pick valid tablet, which score is larger than 0 + std::vector tablet_ptr_list; for (const auto& tablets_shard : _tablets_shards) { std::shared_lock rlock(tablets_shard.lock); for (const auto& [tablet_id, tablet_ptr] : tablets_shard.tablet_map) { @@ -716,15 +717,18 @@ std::vector TabletManager::pick_tablets_to_do_pk_index_major_com continue; } - double score = tablet_ptr->updates()->get_pk_index_write_amp_score(); - if (score <= 0) { - // score == 0 means this tablet's pk index doesn't need major compaction - continue; - } - - pick_tablets.emplace_back(tablet_ptr, score); + tablet_ptr_list.push_back(tablet_ptr); } } + for (const auto& tablet_ptr : tablet_ptr_list) { + double score = tablet_ptr->updates()->get_pk_index_write_amp_score(); + if (score <= 0) { + // score == 0 means this tablet's pk index doesn't need major compaction + continue; + } + + pick_tablets.emplace_back(tablet_ptr, score); + } // 2. sort tablet by score, by ascending order. std::sort(pick_tablets.begin(), pick_tablets.end(), [](TabletAndScore& a, TabletAndScore& b) { // We try to compact tablet with small write amplification score first,