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

Reply via email to