This is an automated email from the ASF dual-hosted git repository.

dataroaring pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new eb7ac1688ad [Opt](mow) Calc delete bitmaps between segments 
concurrently in commit phase (#50106)
eb7ac1688ad is described below

commit eb7ac1688adf429d6f8ae78c2242484e69aa6907
Author: bobhan1 <bao...@selectdb.com>
AuthorDate: Mon Apr 28 12:22:41 2025 +0800

    [Opt](mow) Calc delete bitmaps between segments concurrently in commit 
phase (#50106)
    
    ### What problem does this PR solve?
    
    This PR make the calculation of delete bitmaps between segments in
    commit phase and the calculation of delete bitmaps of current load's
    rowsets with incremental historical data in commit phase concurrently
    for all tablets under one load channel. We use the initial load time(no
    historical data) of large dataset which can produce multi segments to
    evaluate the effectiveness of this PR.
    
    test:
    
    ||210GB origin data files, 2 varchar(2000) as keys, cloud mode, 1 * FE
    4C 16GB, 2 * BE 16C 128GB,PL2 ESSD*2, before|210GB origin data files, 2
    varchar(2000) as keys, cloud mode, 1 * FE 4C 16GB, 2 * BE 16C 128GB,PL2
    ESSD*2, with this PR|
    |---|---|---|
    |total time(s)|9 min 40 s|6 min 2 s|
    |one load channel from beginning to last memtable flush|3 min 58 s|4 min
    29 s|
    |one load channel from last memtable flush to load channel close|5 min
    40 s|1 min 25 s|
    
    note that when calculating delete bitmaps between segments concurrently
    in commit phase, it requires high read iops and throughput
    
    with this pr:
    
    
![image](https://github.com/user-attachments/assets/785355bc-dbf5-4ca2-b90c-270817dc4314)
    
    without this pr:
    
    
![image](https://github.com/user-attachments/assets/676314ce-85cc-49a4-a393-b5de2781a838)
    
    ### Release note
    
    None
    
    ### Check List (For Author)
    
    - Test <!-- At least one of them must be included. -->
        - [ ] Regression test
        - [ ] Unit Test
        - [x] Manual test (add detailed scripts or steps below)
        - [ ] No need to test or manual test. Explain why:
    - [ ] This is a refactor/code format and no logic has been changed.
            - [ ] Previous test can cover this change.
            - [ ] No code files have been changed.
            - [ ] Other reason <!-- Add your reason?  -->
    
    - Behavior changed:
        - [x] No.
        - [ ] Yes. <!-- Explain the behavior change -->
    
    - Does this need documentation?
        - [x] No.
    - [ ] Yes. <!-- Add document PR link here. eg:
    https://github.com/apache/doris-website/pull/1214 -->
    
    ### Check List (For Reviewer who merge this PR)
    
    - [ ] Confirm the release note
    - [ ] Confirm test cases
    - [ ] Confirm document
    - [ ] Add branch pick label <!-- Add branch pick label that this PR
    should merge into -->
---
 be/src/common/config.cpp                    |  2 ++
 be/src/common/config.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 +++++++--
 5 files changed, 40 insertions(+), 2 deletions(-)

diff --git a/be/src/common/config.cpp b/be/src/common/config.cpp
index 35b7f5f3463..61a72d25e5e 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 fb0153c47e7..918d18bf3ef 100644
--- a/be/src/common/config.h
+++ b/be/src/common/config.h
@@ -1564,6 +1564,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/calc_delete_bitmap_executor.cpp 
b/be/src/olap/calc_delete_bitmap_executor.cpp
index 57960693ea2..dfb91d09b25 100644
--- a/be/src/olap/calc_delete_bitmap_executor.cpp
+++ b/be/src/olap/calc_delete_bitmap_executor.cpp
@@ -60,6 +60,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);
+        _resource_ctx = thread_context()->resource_ctx();
+    }
+    return _thread_token->submit_func([=, this]() {
+        SCOPED_ATTACH_TASK(_resource_ctx);
+        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 708e7fd21bf..9d42ec6a178 100644
--- a/be/src/olap/calc_delete_bitmap_executor.h
+++ b/be/src/olap/calc_delete_bitmap_executor.h
@@ -49,12 +49,18 @@ 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,
                   DeleteBitmapPtr tablet_delete_bitmap);
 
+    // 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 41953baba3d..235ef837169 100644
--- a/be/src/olap/rowset_builder.cpp
+++ b/be/src/olap/rowset_builder.cpp
@@ -278,8 +278,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->rowset_id(),
 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.


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to