From f855bdd4244f2dc423569e5d8972fe075d96bf4c Mon Sep 17 00:00:00 2001 From: bobhan1 Date: Thu, 9 Jan 2025 14:22:03 +0800 Subject: [PATCH] update --- be/src/common/config.cpp | 2 ++ be/src/common/config.h | 2 ++ be/src/olap/tablet.cpp | 24 ++++++++++++++++++++++++ be/src/olap/tablet.h | 2 ++ be/src/olap/tablet_manager.cpp | 6 ++++++ be/src/olap/tablet_meta.cpp | 20 ++++++++++++++++++++ be/src/olap/tablet_meta.h | 4 ++++ 7 files changed, 60 insertions(+) diff --git a/be/src/common/config.cpp b/be/src/common/config.cpp index 29158c56bb5070..935c0c33f85985 100644 --- a/be/src/common/config.cpp +++ b/be/src/common/config.cpp @@ -1407,6 +1407,8 @@ DEFINE_mBool(enable_sleep_between_delete_cumu_compaction, "false"); DEFINE_mInt32(compaction_num_per_round, "1"); +DEFINE_mBool(enable_remove_useless_delete_bitmaps, "true"); + // clang-format off #ifdef BE_TEST // test s3 diff --git a/be/src/common/config.h b/be/src/common/config.h index 6c84d89fabac50..519c0e31a0c33d 100644 --- a/be/src/common/config.h +++ b/be/src/common/config.h @@ -1494,6 +1494,8 @@ DECLARE_mBool(enable_sleep_between_delete_cumu_compaction); DECLARE_mInt32(compaction_num_per_round); +DECLARE_mBool(enable_remove_useless_delete_bitmaps); + #ifdef BE_TEST // test s3 DECLARE_String(test_s3_resource); diff --git a/be/src/olap/tablet.cpp b/be/src/olap/tablet.cpp index 1758166e76edee..f54882c6fdb831 100644 --- a/be/src/olap/tablet.cpp +++ b/be/src/olap/tablet.cpp @@ -710,6 +710,30 @@ void Tablet::_delete_stale_rowset_by_version(const Version& version) { VLOG_NOTICE << "delete stale rowset. tablet=" << tablet_id() << ", version=" << version; } +void Tablet::remove_useless_delete_bitmaps() { + std::vector useless_rowsets; + { + // hold read lock to find out delete bitmaps to remove + std::shared_lock rlock {_meta_lock}; + _tablet_meta->delete_bitmap().traverse_rowset_id_prefix([&](const RowsetId& rowset_id) { + if (!_contains_rowset(rowset_id)) { + // delete bitmaps on these rowsets will never be used + useless_rowsets.emplace_back(rowset_id); + } + }); + } + + { + // hold write lock to remove useless delete bitmaps + std::lock_guard wlock {_meta_lock}; + for (const auto& rowset_id : useless_rowsets) { + _tablet_meta->delete_bitmap().remove_by_rowset_prefix(rowset_id); + } + } + LOG_WARNING("removed useless delete bitmaps on {} rowsets, tablet_id={}", + useless_rowsets.size(), tablet_id()); +} + void Tablet::delete_expired_stale_rowset() { int64_t now = UnixSeconds(); // hold write lock while processing stable rowset diff --git a/be/src/olap/tablet.h b/be/src/olap/tablet.h index afe043bf15195b..ce06698fb1aaae 100644 --- a/be/src/olap/tablet.h +++ b/be/src/olap/tablet.h @@ -182,6 +182,8 @@ class Tablet final : public BaseTablet { /// need to delete flag. void delete_expired_stale_rowset(); + void remove_useless_delete_bitmaps(); + // Given spec_version, find a continuous version path and store it in version_path. // If quiet is true, then only "does this path exist" is returned. // If skip_missing_version is true, return ok even there are missing versions. diff --git a/be/src/olap/tablet_manager.cpp b/be/src/olap/tablet_manager.cpp index 18e317cb12d1e0..764f8103aa1ac3 100644 --- a/be/src/olap/tablet_manager.cpp +++ b/be/src/olap/tablet_manager.cpp @@ -1136,6 +1136,12 @@ Status TabletManager::start_trash_sweep() { for_each_tablet([](const TabletSharedPtr& tablet) { tablet->delete_expired_stale_rowset(); }, filter_all_tablets); + if (config::enable_remove_useless_delete_bitmaps) { + for_each_tablet( + [](const TabletSharedPtr& tablet) { tablet->remove_useless_delete_bitmaps(); }, + filter_all_tablets); + } + std::list::iterator last_it; { std::shared_lock rdlock(_shutdown_tablets_lock); diff --git a/be/src/olap/tablet_meta.cpp b/be/src/olap/tablet_meta.cpp index e2f17730973b8d..2ad4bc9ac459da 100644 --- a/be/src/olap/tablet_meta.cpp +++ b/be/src/olap/tablet_meta.cpp @@ -27,6 +27,7 @@ #include #include +#include #include #include #include @@ -1261,6 +1262,25 @@ uint64_t DeleteBitmap::get_delete_bitmap_count() { return count; } +void DeleteBitmap::traverse_rowset_id_prefix( + const std::function& func) const { + auto it = delete_bitmap.cbegin(); + while (it != delete_bitmap.cend()) { + RowsetId rowset_id = std::get<0>(it->first); + func(rowset_id); + // find next rowset id + it = delete_bitmap.upper_bound({rowset_id, std::numeric_limits::max(), + std::numeric_limits::max()}); + } +} + +void DeleteBitmap::remove_by_rowset_prefix(const RowsetId& rowset_id) { + BitmapKey start {rowset_id, 0, 0}; + BitmapKey end {rowset_id, std::numeric_limits::max(), + std::numeric_limits::max()}; + remove(start, end); +} + // We cannot just copy the underlying memory to construct a string // due to equivalent objects may have different padding bytes. // Reading padding bytes is undefined behavior, neither copy nor diff --git a/be/src/olap/tablet_meta.h b/be/src/olap/tablet_meta.h index 0cbc106c135610..3df91f6cabe293 100644 --- a/be/src/olap/tablet_meta.h +++ b/be/src/olap/tablet_meta.h @@ -546,6 +546,10 @@ class DeleteBitmap { uint64_t get_delete_bitmap_count(); + void traverse_rowset_id_prefix(const std::function& func) const; + + void remove_by_rowset_prefix(const RowsetId& rowset_id); + class AggCachePolicy : public LRUCachePolicy { public: AggCachePolicy(size_t capacity)