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

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


The following commit(s) were added to refs/heads/branch-4.0 by this push:
     new 1bd31dfa335 branch-4.0: [fix](mow) delete bitmap is not deleted if 
commit compaction job failed #56758 (#56779)
1bd31dfa335 is described below

commit 1bd31dfa3358d49275817e0d74d9828045345e57
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Sat Oct 11 16:41:44 2025 +0800

    branch-4.0: [fix](mow) delete bitmap is not deleted if commit compaction 
job failed #56758 (#56779)
    
    Cherry-picked from #56758
    
    Co-authored-by: meiyi <[email protected]>
---
 be/src/cloud/cloud_meta_mgr.cpp |  3 +++
 cloud/src/recycler/recycler.cpp | 21 ++++++++++++++++++++-
 cloud/test/recycler_test.cpp    | 22 ++++++++++++++++++----
 3 files changed, 41 insertions(+), 5 deletions(-)

diff --git a/be/src/cloud/cloud_meta_mgr.cpp b/be/src/cloud/cloud_meta_mgr.cpp
index cc2440e1b2e..1d8d54ddcda 100644
--- a/be/src/cloud/cloud_meta_mgr.cpp
+++ b/be/src/cloud/cloud_meta_mgr.cpp
@@ -1567,6 +1567,9 @@ Status CloudMetaMgr::prepare_tablet_job(const 
TabletJobInfoPB& job, StartTabletJ
 Status CloudMetaMgr::commit_tablet_job(const TabletJobInfoPB& job, 
FinishTabletJobResponse* res) {
     VLOG_DEBUG << "commit_tablet_job: " << job.ShortDebugString();
     TEST_SYNC_POINT_RETURN_WITH_VALUE("CloudMetaMgr::commit_tablet_job", 
Status::OK(), job, res);
+    DBUG_EXECUTE_IF("CloudMetaMgr::commit_tablet_job.fail", {
+        return Status::InternalError<false>("inject 
CloudMetaMgr::commit_tablet_job.fail");
+    });
 
     FinishTabletJobRequest req;
     req.mutable_job()->CopyFrom(job);
diff --git a/cloud/src/recycler/recycler.cpp b/cloud/src/recycler/recycler.cpp
index b610331059c..4b53439959e 100644
--- a/cloud/src/recycler/recycler.cpp
+++ b/cloud/src/recycler/recycler.cpp
@@ -3786,7 +3786,21 @@ int InstanceRecycler::recycle_tmp_rowsets() {
         auto ret = txn_remove(txn_kv_.get(), dbm_start_key, dbm_end_key);
         if (ret != 0) {
             LOG(WARNING) << "failed to delete versioned delete bitmap kv, 
instance_id="
-                         << instance_id_;
+                         << instance_id_ << ", tablet_id=" << tablet_id
+                         << ", rowset_id=" << rowset_id;
+        }
+        return ret;
+    };
+
+    auto delete_delete_bitmap_kvs = [&](int64_t tablet_id, const std::string& 
rowset_id) {
+        auto delete_bitmap_start =
+                meta_delete_bitmap_key({instance_id_, tablet_id, rowset_id, 0, 
0});
+        auto delete_bitmap_end =
+                meta_delete_bitmap_key({instance_id_, tablet_id, rowset_id, 
INT64_MAX, INT64_MAX});
+        auto ret = txn_remove(txn_kv_.get(), delete_bitmap_start, 
delete_bitmap_end);
+        if (ret != 0) {
+            LOG(WARNING) << "failed to delete delete bitmap kv, instance_id=" 
<< instance_id_
+                         << ", tablet_id=" << tablet_id << ", rowset_id=" << 
rowset_id;
         }
         return ret;
     };
@@ -3811,6 +3825,11 @@ int InstanceRecycler::recycle_tmp_rowsets() {
                                  << rs.ShortDebugString();
                     return;
                 }
+                if (delete_delete_bitmap_kvs(rs.tablet_id(), 
rs.rowset_id_v2()) != 0) {
+                    LOG(WARNING) << "failed to delete delete bitmap kv, rs="
+                                 << rs.ShortDebugString();
+                    return;
+                }
             }
             if (txn_remove(txn_kv_.get(), tmp_rowset_keys_to_delete) != 0) {
                 LOG(WARNING) << "failed to tmp rowset kv, instance_id=" << 
instance_id_;
diff --git a/cloud/test/recycler_test.cpp b/cloud/test/recycler_test.cpp
index f815aa7852b..bec871b7282 100644
--- a/cloud/test/recycler_test.cpp
+++ b/cloud/test/recycler_test.cpp
@@ -1173,12 +1173,19 @@ static int get_copy_file_num(TxnKv* txn_kv, const 
std::string& stage_id, int64_t
     return 0;
 }
 
-static void check_delete_bitmap_keys_size(TxnKv* txn_kv, int64_t tablet_id, 
int expected_size) {
+static void check_delete_bitmap_keys_size(TxnKv* txn_kv, int64_t tablet_id, 
int expected_size,
+                                          int version = 2) {
     std::unique_ptr<Transaction> txn;
     ASSERT_EQ(txn_kv->create_txn(&txn), TxnErrorCode::TXN_OK);
     std::unique_ptr<RangeGetIterator> it;
-    auto dbm_start_key = versioned::meta_delete_bitmap_key({instance_id, 
tablet_id, ""});
-    std::string dbm_end_key = versioned::meta_delete_bitmap_key({instance_id, 
tablet_id + 1, ""});
+    std::string dbm_start_key, dbm_end_key;
+    if (version == 2) {
+        dbm_start_key = versioned::meta_delete_bitmap_key({instance_id, 
tablet_id, ""});
+        dbm_end_key = versioned::meta_delete_bitmap_key({instance_id, 
tablet_id + 1, ""});
+    } else if (version == 1) {
+        dbm_start_key = meta_delete_bitmap_key({instance_id, tablet_id, "", 0, 
0});
+        dbm_end_key = meta_delete_bitmap_key({instance_id, tablet_id + 1, "", 
0, 0});
+    }
     ASSERT_EQ(txn->get(dbm_start_key, dbm_end_key, &it), TxnErrorCode::TXN_OK);
     EXPECT_EQ(it->size(), expected_size);
 }
@@ -1497,16 +1504,23 @@ TEST(RecyclerTest, recycle_tmp_rowsets) {
     int64_t txn_id_base = 114115;
     int64_t tablet_id_base = 10015;
     int64_t index_id_base = 1000;
+    std::unique_ptr<Transaction> txn;
+    ASSERT_EQ(txn_kv->create_txn(&txn), TxnErrorCode::TXN_OK);
     for (int i = 0; i < 50; ++i) {
         int64_t txn_id = txn_id_base + i;
         for (int j = 0; j < 1000; ++j) {
             auto rowset = create_rowset("recycle_tmp_rowsets", tablet_id_base 
+ j,
                                         index_id_base + j, 5, schemas[i % 5], 
txn_id);
             create_tmp_rowset(txn_kv.get(), accessor.get(), rowset, i & 1, 
false, i < 50);
+            if (i < 50) {
+                create_delete_bitmaps(txn.get(), tablet_id_base + j, 
rowset.rowset_id_v2(), 0, 1);
+            }
         }
     }
+    ASSERT_EQ(txn->commit(), TxnErrorCode::TXN_OK);
     for (int j = 0; j < 20; ++j) {
         check_delete_bitmap_keys_size(txn_kv.get(), tablet_id_base + j, 50);
+        check_delete_bitmap_keys_size(txn_kv.get(), tablet_id_base + j, 100, 
1);
     }
 
     auto start = std::chrono::steady_clock::now();
@@ -1521,7 +1535,6 @@ TEST(RecyclerTest, recycle_tmp_rowsets) {
     ASSERT_EQ(0, accessor->list_directory("data/", &list_iter));
     ASSERT_FALSE(list_iter->has_next());
     // check all tmp rowset kv have been deleted
-    std::unique_ptr<Transaction> txn;
     ASSERT_EQ(txn_kv->create_txn(&txn), TxnErrorCode::TXN_OK);
     std::unique_ptr<RangeGetIterator> it;
     auto begin_key = meta_rowset_tmp_key({instance_id, 0, 0});
@@ -1539,6 +1552,7 @@ TEST(RecyclerTest, recycle_tmp_rowsets) {
     ASSERT_EQ(it->size(), 0);
     for (int j = 0; j < 20; ++j) {
         check_delete_bitmap_keys_size(txn_kv.get(), tablet_id_base + j, 0);
+        check_delete_bitmap_keys_size(txn_kv.get(), tablet_id_base + j, 0, 1);
     }
 }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to