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

zhangchen pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.0 by this push:
     new 10ab006c7c [fix](inverted index change) better fix for update delete 
bitmap incompletely when build inverted index on mow table(#23141)
10ab006c7c is described below

commit 10ab006c7ceba9ca3421d75d22b8d7b52693bb0d
Author: YueW <45946325+tany...@users.noreply.github.com>
AuthorDate: Fri Aug 18 18:09:25 2023 +0800

    [fix](inverted index change) better fix for update delete bitmap 
incompletely when build inverted index on mow table(#23141)
    
    better fix for update delete bitmap incompletely when build inverted index 
on mow table
    
    master pr: #23047
---
 be/src/olap/task/index_builder.cpp | 41 ++++++++++++++++++--------------------
 1 file changed, 19 insertions(+), 22 deletions(-)

diff --git a/be/src/olap/task/index_builder.cpp 
b/be/src/olap/task/index_builder.cpp
index d642253d99..0f9c51a4ba 100644
--- a/be/src/olap/task/index_builder.cpp
+++ b/be/src/olap/task/index_builder.cpp
@@ -449,30 +449,27 @@ Status IndexBuilder::modify_rowsets(const 
Merger::Statistics* stats) {
 
     if (_tablet->keys_type() == KeysType::UNIQUE_KEYS &&
         _tablet->enable_unique_key_merge_on_write()) {
-        std::lock_guard<std::mutex> rwlock(_tablet->get_rowset_update_lock());
-        std::shared_lock<std::shared_mutex> wrlock(_tablet->get_header_lock());
-        RETURN_IF_ERROR(_tablet->modify_rowsets(_output_rowsets, 
_input_rowsets, true));
-
-        std::vector<RowsetSharedPtr> calc_delete_bitmap_rowsets;
-        int64_t to_add_min_version = INT64_MAX;
-        for (auto& rs : _output_rowsets) {
-            if (to_add_min_version > rs->start_version()) {
-                to_add_min_version = rs->start_version();
-            }
-        }
-        Version calc_delete_bitmap_ver =
-                Version(to_add_min_version, 
_tablet->max_version_unlocked().second);
-        if (calc_delete_bitmap_ver.first <= calc_delete_bitmap_ver.second) {
-            Status res = 
_tablet->capture_consistent_rowsets(calc_delete_bitmap_ver,
-                                                             
&calc_delete_bitmap_rowsets);
-            // Because the data in memory has been changed, can't return an 
error.
-            CHECK(res.ok()) << "fail to capture_consistent_rowsets, res: " << 
res;
-
-            for (auto rs : calc_delete_bitmap_rowsets) {
-                res = _tablet->update_delete_bitmap_without_lock(rs);
-                CHECK(res.ok()) << "fail to update_delete_bitmap_without_lock, 
res: " << res;
+        std::lock_guard<std::mutex> wlock(_tablet->get_rowset_update_lock());
+        std::shared_lock<std::shared_mutex> rlock(_tablet->get_header_lock());
+        DeleteBitmapPtr delete_bitmap = 
std::make_shared<DeleteBitmap>(_tablet->tablet_id());
+        for (auto i = 0; i < _input_rowsets.size(); ++i) {
+            RowsetId input_rowset_id = _input_rowsets[i]->rowset_id();
+            RowsetId output_rowset_id = _output_rowsets[i]->rowset_id();
+            for (const auto& [k, v] : 
_tablet->tablet_meta()->delete_bitmap().delete_bitmap) {
+                RowsetId rs_id = std::get<0>(k);
+                if (rs_id == input_rowset_id) {
+                    DeleteBitmap::BitmapKey output_rs_key = {output_rowset_id, 
std::get<1>(k),
+                                                             std::get<2>(k)};
+                    auto res = delete_bitmap->set(output_rs_key, v);
+                    DCHECK(res > 0) << "delete_bitmap set failed, res=" << res;
+                }
             }
         }
+        _tablet->tablet_meta()->delete_bitmap().merge(*delete_bitmap);
+
+        // modify_rowsets will remove the delete_bimap for input rowsets,
+        // should call it after merge delete_bitmap
+        RETURN_IF_ERROR(_tablet->modify_rowsets(_output_rowsets, 
_input_rowsets, true));
     } else {
         std::lock_guard<std::shared_mutex> wrlock(_tablet->get_header_lock());
         RETURN_IF_ERROR(_tablet->modify_rowsets(_output_rowsets, 
_input_rowsets, true));


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

Reply via email to