This is an automated email from the ASF dual-hosted git repository. dataroaring pushed a commit to branch branch-3.0 in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-3.0 by this push: new 48016a747e9 branch-3.0: [Opt](mow) Calc delete bitmaps between segments concurrently in commit phase (#50106) (#50495) 48016a747e9 is described below commit 48016a747e994ee1b13cbd04e499bc8b9f3f7cc0 Author: bobhan1 <bao...@selectdb.com> AuthorDate: Mon Apr 28 21:34:02 2025 +0800 branch-3.0: [Opt](mow) Calc delete bitmaps between segments concurrently in commit phase (#50106) (#50495) pick https://github.com/apache/doris/pull/50106 --- .../cloud/cloud_engine_calc_delete_bitmap_task.cpp | 4 ++-- be/src/common/config.cpp | 2 ++ be/src/common/config.h | 2 ++ be/src/olap/base_tablet.cpp | 6 +++--- be/src/olap/base_tablet.h | 2 +- be/src/olap/calc_delete_bitmap_executor.cpp | 23 ++++++++++++++++++++++ be/src/olap/calc_delete_bitmap_executor.h | 6 ++++++ be/src/olap/rowset_builder.cpp | 9 +++++++-- be/src/olap/txn_manager.cpp | 2 +- be/src/service/backend_service.cpp | 4 ++-- 10 files changed, 49 insertions(+), 11 deletions(-) diff --git a/be/src/cloud/cloud_engine_calc_delete_bitmap_task.cpp b/be/src/cloud/cloud_engine_calc_delete_bitmap_task.cpp index a55d4f42f66..07fcdf881c1 100644 --- a/be/src/cloud/cloud_engine_calc_delete_bitmap_task.cpp +++ b/be/src/cloud/cloud_engine_calc_delete_bitmap_task.cpp @@ -267,8 +267,8 @@ Status CloudTabletCalcDeleteBitmapTask::handle() const { LOG_INFO("inject error when CloudTabletCalcDeleteBitmapTask::_handle_rowset"); return Status::MemoryLimitExceeded("injected MemoryLimitExceeded error"); }); - RETURN_IF_ERROR( - tablet->calc_delete_bitmap_between_segments(rowset, segments, delete_bitmap)); + RETURN_IF_ERROR(tablet->calc_delete_bitmap_between_segments(rowset->rowset_id(), + segments, delete_bitmap)); } status = CloudTablet::update_delete_bitmap(tablet, &txn_info, _transaction_id, txn_expiration); diff --git a/be/src/common/config.cpp b/be/src/common/config.cpp index 92885c6cd89..3063e782dba 100644 --- a/be/src/common/config.cpp +++ b/be/src/common/config.cpp @@ -1490,6 +1490,8 @@ DEFINE_mInt32(load_trigger_compaction_version_percent, "66"); DEFINE_mInt64(base_compaction_interval_seconds_since_last_operation, "86400"); DEFINE_mBool(enable_compaction_pause_on_high_memory, "true"); +DEFINE_mBool(enable_calc_delete_bitmap_between_segments_concurrently, "false"); + // clang-format off #ifdef BE_TEST // test s3 diff --git a/be/src/common/config.h b/be/src/common/config.h index 43662a04842..d9a93c1f7f6 100644 --- a/be/src/common/config.h +++ b/be/src/common/config.h @@ -1568,6 +1568,8 @@ DECLARE_mInt32(load_trigger_compaction_version_percent); DECLARE_mInt64(base_compaction_interval_seconds_since_last_operation); DECLARE_mBool(enable_compaction_pause_on_high_memory); +DECLARE_mBool(enable_calc_delete_bitmap_between_segments_concurrently); + #ifdef BE_TEST // test s3 DECLARE_String(test_s3_resource); diff --git a/be/src/olap/base_tablet.cpp b/be/src/olap/base_tablet.cpp index c33043b3b64..41e8bbf16d8 100644 --- a/be/src/olap/base_tablet.cpp +++ b/be/src/olap/base_tablet.cpp @@ -359,7 +359,7 @@ void BaseTablet::generate_tablet_meta_copy_unlocked(TabletMeta& new_tablet_meta) } Status BaseTablet::calc_delete_bitmap_between_segments( - RowsetSharedPtr rowset, const std::vector<segment_v2::SegmentSharedPtr>& segments, + const RowsetId& rowset_id, const std::vector<segment_v2::SegmentSharedPtr>& segments, DeleteBitmapPtr delete_bitmap) { size_t const num_segments = segments.size(); if (num_segments < 2) { @@ -367,7 +367,6 @@ Status BaseTablet::calc_delete_bitmap_between_segments( } OlapStopWatch watch; - auto const rowset_id = rowset->rowset_id(); size_t seq_col_length = 0; if (_tablet_meta->tablet_schema()->has_sequence_col()) { auto seq_col_idx = _tablet_meta->tablet_schema()->sequence_col_idx(); @@ -1506,7 +1505,8 @@ Status BaseTablet::update_delete_bitmap_without_lock( // calculate delete bitmap between segments if necessary. DeleteBitmapPtr delete_bitmap = std::make_shared<DeleteBitmap>(self->tablet_id()); - RETURN_IF_ERROR(self->calc_delete_bitmap_between_segments(rowset, segments, delete_bitmap)); + RETURN_IF_ERROR(self->calc_delete_bitmap_between_segments(rowset->rowset_id(), segments, + delete_bitmap)); // get all base rowsets to calculate on std::vector<RowsetSharedPtr> specified_rowsets; diff --git a/be/src/olap/base_tablet.h b/be/src/olap/base_tablet.h index 40928e63729..4f4b41f11ab 100644 --- a/be/src/olap/base_tablet.h +++ b/be/src/olap/base_tablet.h @@ -176,7 +176,7 @@ public: RowsetWriter* rowset_writer); Status calc_delete_bitmap_between_segments( - RowsetSharedPtr rowset, const std::vector<segment_v2::SegmentSharedPtr>& segments, + const RowsetId& rowset_id, const std::vector<segment_v2::SegmentSharedPtr>& segments, DeleteBitmapPtr delete_bitmap); static Status commit_phase_update_delete_bitmap( diff --git a/be/src/olap/calc_delete_bitmap_executor.cpp b/be/src/olap/calc_delete_bitmap_executor.cpp index 3983dc0a986..89e668c4c94 100644 --- a/be/src/olap/calc_delete_bitmap_executor.cpp +++ b/be/src/olap/calc_delete_bitmap_executor.cpp @@ -58,6 +58,29 @@ Status CalcDeleteBitmapToken::submit(BaseTabletSPtr tablet, RowsetSharedPtr cur_ }); } +Status CalcDeleteBitmapToken::submit(BaseTabletSPtr tablet, RowsetId rowset_id, + const std::vector<segment_v2::SegmentSharedPtr>& segments, + DeleteBitmapPtr delete_bitmap) { + { + std::shared_lock rlock(_lock); + RETURN_IF_ERROR(_status); + _query_thread_context.init_unlocked(); + } + return _thread_token->submit_func([=, this]() { + SCOPED_ATTACH_TASK(_query_thread_context); + auto st = tablet->calc_delete_bitmap_between_segments(rowset_id, segments, delete_bitmap); + if (!st.ok()) { + LOG(WARNING) << "failed to calc delete bitmap between segments, tablet_id: " + << tablet->tablet_id() << " rowset: " << rowset_id + << " segments num: " << segments.size() << " error: " << st; + std::lock_guard wlock(_lock); + if (_status.ok()) { + _status = st; + } + } + }); +} + Status CalcDeleteBitmapToken::wait() { _thread_token->wait(); // all tasks complete here, don't need lock; diff --git a/be/src/olap/calc_delete_bitmap_executor.h b/be/src/olap/calc_delete_bitmap_executor.h index fa1e79b7fea..5d471e2587e 100644 --- a/be/src/olap/calc_delete_bitmap_executor.h +++ b/be/src/olap/calc_delete_bitmap_executor.h @@ -49,11 +49,17 @@ public: explicit CalcDeleteBitmapToken(std::unique_ptr<ThreadPoolToken> thread_token) : _thread_token(std::move(thread_token)), _status(Status::OK()) {} + // calculate delete bitmap of `cur_segment` to historical `target_rowsets` Status submit(BaseTabletSPtr tablet, RowsetSharedPtr cur_rowset, const segment_v2::SegmentSharedPtr& cur_segment, const std::vector<RowsetSharedPtr>& target_rowsets, int64_t end_version, DeleteBitmapPtr delete_bitmap, RowsetWriter* rowset_writer); + // calculate delete bitmap between `segments` + Status submit(BaseTabletSPtr tablet, RowsetId rowset_id, + const std::vector<segment_v2::SegmentSharedPtr>& segments, + DeleteBitmapPtr delete_bitmap); + // wait all tasks in token to be completed. Status wait(); diff --git a/be/src/olap/rowset_builder.cpp b/be/src/olap/rowset_builder.cpp index c7fc1c38d77..eb855ab1316 100644 --- a/be/src/olap/rowset_builder.cpp +++ b/be/src/olap/rowset_builder.cpp @@ -268,8 +268,13 @@ Status BaseRowsetBuilder::submit_calc_delete_bitmap_task() { RETURN_IF_ERROR(beta_rowset->load_segments(&segments)); if (segments.size() > 1) { // calculate delete bitmap between segments - RETURN_IF_ERROR( - _tablet->calc_delete_bitmap_between_segments(_rowset, segments, _delete_bitmap)); + if (config::enable_calc_delete_bitmap_between_segments_concurrently) { + RETURN_IF_ERROR(_calc_delete_bitmap_token->submit(_tablet, _rowset->rowset_id(), + segments, _delete_bitmap)); + } else { + RETURN_IF_ERROR(_tablet->calc_delete_bitmap_between_segments(_rowset->rowset_id(), + segments, _delete_bitmap)); + } } // tablet is under alter process. The delete bitmap will be calculated after conversion. diff --git a/be/src/olap/txn_manager.cpp b/be/src/olap/txn_manager.cpp index 0973511080f..f47bd776fac 100644 --- a/be/src/olap/txn_manager.cpp +++ b/be/src/olap/txn_manager.cpp @@ -549,7 +549,7 @@ Status TxnManager::publish_txn(OlapMeta* meta, TPartitionId partition_id, std::vector<segment_v2::SegmentSharedPtr> segments; RETURN_IF_ERROR(std::static_pointer_cast<BetaRowset>(rowset)->load_segments(&segments)); RETURN_IF_ERROR(tablet->calc_delete_bitmap_between_segments( - rowset, segments, tablet_txn_info->delete_bitmap)); + rowset->rowset_id(), segments, tablet_txn_info->delete_bitmap)); } RETURN_IF_ERROR( diff --git a/be/src/service/backend_service.cpp b/be/src/service/backend_service.cpp index 61f276952c2..9f6413762f0 100644 --- a/be/src/service/backend_service.cpp +++ b/be/src/service/backend_service.cpp @@ -591,8 +591,8 @@ void _ingest_binlog(StorageEngine& engine, IngestBinlogArg* arg) { } if (segments.size() > 1) { // calculate delete bitmap between segments - status = local_tablet->calc_delete_bitmap_between_segments(rowset, segments, - delete_bitmap); + status = local_tablet->calc_delete_bitmap_between_segments(rowset->rowset_id(), + segments, delete_bitmap); if (!status) { LOG(WARNING) << "failed to calculate delete bitmap" << ". tablet_id: " << local_tablet->tablet_id() --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org