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 9a82c9f7288 [fix](partial update) duplicate key occur when BE restart 
after conflict concurrent partial update  (#35739)
9a82c9f7288 is described below

commit 9a82c9f728898b184c65c4372f06476bbe50c2cf
Author: zhannngchen <48427519+zhannngc...@users.noreply.github.com>
AuthorDate: Sat Jun 1 22:59:13 2024 +0800

    [fix](partial update) duplicate key occur when BE restart after conflict 
concurrent partial update  (#35739)
    
    ## Proposed changes
    
    Issue Number: close #xxx
    
    1. In #30366 , in order to avoid that some incomplete delete bitmap left
    in `txn_info->delete_bitmap` when publish failed, we make a copy of
    `txn_info->delete_bitmap` before we start to compute the delete bitmap
    2. this copy is not updated back to `txn_info->delete_bitmap` after
    `rowset->rowset_meta()->merge_rowset_meta()` is successful
    3. `txnManager::publish_txn()` saves the contents of
    `txn_info->delete_bitmap` to RocksDB after the call to
    `update_delete_bitmap()`, due to the issue in step 2, bitmap generated
    during publish is not saved to RocksDB, so if BE restarts at this point,
    this part of the incremental delete bitmap will be lost
    4. it will result in duplicated keys on querying
---
 be/src/olap/base_tablet.cpp | 4 +++-
 be/src/olap/base_tablet.h   | 2 +-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/be/src/olap/base_tablet.cpp b/be/src/olap/base_tablet.cpp
index 21563890a40..726f47ea5b8 100644
--- a/be/src/olap/base_tablet.cpp
+++ b/be/src/olap/base_tablet.cpp
@@ -1118,7 +1118,7 @@ void 
BaseTablet::_remove_sentinel_mark_from_delete_bitmap(DeleteBitmapPtr delete
     }
 }
 
-Status BaseTablet::update_delete_bitmap(const BaseTabletSPtr& self, const 
TabletTxnInfo* txn_info,
+Status BaseTablet::update_delete_bitmap(const BaseTabletSPtr& self, 
TabletTxnInfo* txn_info,
                                         int64_t txn_id, int64_t 
txn_expiration) {
     SCOPED_BVAR_LATENCY(g_tablet_update_delete_bitmap_latency);
     RowsetIdUnorderedSet cur_rowset_ids;
@@ -1226,6 +1226,8 @@ Status BaseTablet::update_delete_bitmap(const 
BaseTabletSPtr& self, const Tablet
         RowsetSharedPtr transient_rowset;
         RETURN_IF_ERROR(transient_rs_writer->build(transient_rowset));
         
rowset->rowset_meta()->merge_rowset_meta(*transient_rowset->rowset_meta());
+        // update the shared_ptr to new bitmap, which is consistent with 
current rowset.
+        txn_info->delete_bitmap = delete_bitmap;
 
         // erase segment cache cause we will add a segment to rowset
         SegmentLoader::instance()->erase_segments(rowset->rowset_id(), 
rowset->num_segments());
diff --git a/be/src/olap/base_tablet.h b/be/src/olap/base_tablet.h
index 58b72f2ccba..8bef4860ee9 100644
--- a/be/src/olap/base_tablet.h
+++ b/be/src/olap/base_tablet.h
@@ -210,7 +210,7 @@ public:
             const Rowset& rowset, std::shared_ptr<PartialUpdateInfo> 
partial_update_info,
             int64_t txn_expiration = 0) = 0;
 
-    static Status update_delete_bitmap(const BaseTabletSPtr& self, const 
TabletTxnInfo* txn_info,
+    static Status update_delete_bitmap(const BaseTabletSPtr& self, 
TabletTxnInfo* txn_info,
                                        int64_t txn_id, int64_t txn_expiration 
= 0);
 
     virtual Status save_delete_bitmap(const TabletTxnInfo* txn_info, int64_t 
txn_id,


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

Reply via email to