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

zhangchen 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 293b8094018 [Opt](log) Add more delete bitmap log for merge-on-write 
table (#48930)
293b8094018 is described below

commit 293b8094018e3e441f6d8452694a171688fcdc0f
Author: bobhan1 <bao...@selectdb.com>
AuthorDate: Wed Mar 12 16:24:47 2025 +0800

    [Opt](log) Add more delete bitmap log for merge-on-write table (#48930)
    
    Add more delete bitmap log for merge-on-write table
---
 be/src/cloud/cloud_txn_delete_bitmap_cache.cpp | 13 ++++++++-
 be/src/olap/base_tablet.cpp                    |  6 ++--
 be/src/olap/data_dir.cpp                       | 38 ++++++++++++++++++++++----
 be/src/olap/rowset/beta_rowset_writer.cpp      |  2 ++
 be/src/olap/rowset_builder.cpp                 | 10 +++----
 5 files changed, 55 insertions(+), 14 deletions(-)

diff --git a/be/src/cloud/cloud_txn_delete_bitmap_cache.cpp 
b/be/src/cloud/cloud_txn_delete_bitmap_cache.cpp
index 9a8b669e0ae..681cbbc8bf0 100644
--- a/be/src/cloud/cloud_txn_delete_bitmap_cache.cpp
+++ b/be/src/cloud/cloud_txn_delete_bitmap_cache.cpp
@@ -169,7 +169,9 @@ void CloudTxnDeleteBitmapCache::set_tablet_txn_info(
             .tag("txn_id", transaction_id)
             .tag("expiration", txn_expiration)
             .tag("tablet_id", tablet_id)
-            .tag("delete_bitmap_size", charge);
+            .tag("delete_bitmap_size", charge)
+            .tag("delete_bitmap_count", 
delete_bitmap->get_delete_bitmap_count())
+            .tag("delete_bitmap_cardinality", delete_bitmap->cardinality());
 }
 
 Status CloudTxnDeleteBitmapCache::update_tablet_txn_info(TTransactionId 
transaction_id,
@@ -205,6 +207,15 @@ Status 
CloudTxnDeleteBitmapCache::update_tablet_txn_info(TTransactionId transact
     // must call release handle to reduce the reference count,
     // otherwise there will be memory leak
     release(handle);
+    if (config::enable_mow_verbose_log) {
+        LOG_INFO("update txn related delete bitmap")
+                .tag("txn_id", transaction_id)
+                .tag("tablt_id", tablet_id)
+                .tag("delete_bitmap_size", charge)
+                .tag("delete_bitmap_count", 
delete_bitmap->get_delete_bitmap_count())
+                .tag("delete_bitmap_cardinality", delete_bitmap->cardinality())
+                .tag("publish_status", static_cast<int>(publish_status));
+    }
     return Status::OK();
 }
 
diff --git a/be/src/olap/base_tablet.cpp b/be/src/olap/base_tablet.cpp
index db27c55a28d..8b2e566b9b1 100644
--- a/be/src/olap/base_tablet.cpp
+++ b/be/src/olap/base_tablet.cpp
@@ -824,7 +824,8 @@ Status 
BaseTablet::calc_segment_delete_bitmap(RowsetSharedPtr rowset,
                       << " rows: " << seg->num_rows() << " conflict rows: " << 
conflict_rows
                       << " filtered rows: " << rids_be_overwritten.size()
                       << " new generated rows: " << new_generated_rows
-                      << " bimap num: " << delete_bitmap->delete_bitmap.size()
+                      << " bitmap num: " << 
delete_bitmap->get_delete_bitmap_count()
+                      << " bitmap cardinality: " << 
delete_bitmap->cardinality()
                       << " cost: " << cost_us << "(us)";
         }
         return Status::OK();
@@ -835,7 +836,8 @@ Status 
BaseTablet::calc_segment_delete_bitmap(RowsetSharedPtr rowset,
                   << " rowset: " << rowset_id << " seg_id: " << seg->id()
                   << " dummy_version: " << end_version + 1 << " rows: " << 
seg->num_rows()
                   << " conflict rows: " << conflict_rows
-                  << " bitmap num: " << delete_bitmap->delete_bitmap.size() << 
" cost: " << cost_us
+                  << " bitmap num: " << 
delete_bitmap->get_delete_bitmap_count()
+                  << " bitmap cardinality: " << delete_bitmap->cardinality() 
<< " cost: " << cost_us
                   << "(us)";
     }
     return Status::OK();
diff --git a/be/src/olap/data_dir.cpp b/be/src/olap/data_dir.cpp
index 5a773a0a6ad..323288678d5 100644
--- a/be/src/olap/data_dir.cpp
+++ b/be/src/olap/data_dir.cpp
@@ -403,12 +403,15 @@ Status DataDir::load() {
         dir_rowset_metas.push_back(rowset_meta);
         return true;
     };
+    MonotonicStopWatch rs_timer;
+    rs_timer.start();
     Status load_rowset_status = 
RowsetMetaManager::traverse_rowset_metas(_meta, load_rowset_func);
-
+    rs_timer.stop();
     if (!load_rowset_status) {
         LOG(WARNING) << "errors when load rowset meta from meta env, skip this 
data dir:" << _path;
     } else {
-        LOG(INFO) << "load rowset from meta finished, data dir: " << _path;
+        LOG(INFO) << "load rowset from meta finished, cost: "
+                  << rs_timer.elapsed_time_milliseconds() << " ms, data dir: " 
<< _path;
     }
 
     // load tablet
@@ -445,7 +448,10 @@ Status DataDir::load() {
         }
         return true;
     };
+    MonotonicStopWatch tablet_timer;
+    tablet_timer.start();
     Status load_tablet_status = TabletMetaManager::traverse_headers(_meta, 
load_tablet_func);
+    tablet_timer.stop();
     if (!failed_tablet_ids.empty()) {
         LOG(WARNING) << "load tablets from header failed"
                      << ", loaded tablet: " << tablet_ids.size()
@@ -462,7 +468,9 @@ Status DataDir::load() {
     } else {
         LOG(INFO) << "load tablet from meta finished"
                   << ", loaded tablet: " << tablet_ids.size()
-                  << ", error tablet: " << failed_tablet_ids.size() << ", 
path: " << _path;
+                  << ", error tablet: " << failed_tablet_ids.size()
+                  << ", cost: " << tablet_timer.elapsed_time_milliseconds()
+                  << " ms, path: " << _path;
     }
 
     for (int64_t tablet_id : tablet_ids) {
@@ -486,8 +494,13 @@ Status DataDir::load() {
                                               
pending_publish_info_pb.transaction_id(), true);
                 return true;
             };
+    MonotonicStopWatch pending_publish_timer;
+    pending_publish_timer.start();
     RETURN_IF_ERROR(
             TabletMetaManager::traverse_pending_publish(_meta, 
load_pending_publish_info_func));
+    pending_publish_timer.stop();
+    LOG(INFO) << "load pending publish task from meta finished, cost: "
+              << pending_publish_timer.elapsed_time_milliseconds() << " ms, 
data dir: " << _path;
 
     int64_t rowset_partition_id_eq_0_num = 0;
     for (auto rowset_meta : dir_rowset_metas) {
@@ -590,8 +603,11 @@ Status DataDir::load() {
         }
     }
 
-    auto load_delete_bitmap_func = [this](int64_t tablet_id, int64_t version,
-                                          std::string_view val) {
+    int64_t dbm_cnt {0};
+    int64_t unknown_dbm_cnt {0};
+    auto load_delete_bitmap_func = [this, &dbm_cnt, &unknown_dbm_cnt](int64_t 
tablet_id,
+                                                                      int64_t 
version,
+                                                                      
std::string_view val) {
         TabletSharedPtr tablet = 
_engine.tablet_manager()->get_tablet(tablet_id);
         if (!tablet) {
             return true;
@@ -614,8 +630,10 @@ Status DataDir::load() {
             rst_id.init(delete_bitmap_pb.rowset_ids(i));
             // only process the rowset in _rs_metas
             if (rowset_ids.find(rst_id) == rowset_ids.end()) {
+                ++unknown_dbm_cnt;
                 continue;
             }
+            ++dbm_cnt;
             auto seg_id = delete_bitmap_pb.segment_ids(i);
             auto iter = 
tablet->tablet_meta()->delete_bitmap().delete_bitmap.find(
                     {rst_id, seg_id, version});
@@ -629,14 +647,22 @@ Status DataDir::load() {
         }
         return true;
     };
+    MonotonicStopWatch dbm_timer;
+    dbm_timer.start();
     RETURN_IF_ERROR(TabletMetaManager::traverse_delete_bitmap(_meta, 
load_delete_bitmap_func));
+    dbm_timer.stop();
+
+    LOG(INFO) << "load delete bitmap from meta finished, cost: "
+              << dbm_timer.elapsed_time_milliseconds() << " ms, data dir: " << 
_path;
 
     // At startup, we only count these invalid rowset, but do not actually 
delete it.
     // The actual delete operation is in 
StorageEngine::_clean_unused_rowset_metas,
     // which is cleaned up uniformly by the background cleanup thread.
     LOG(INFO) << "finish to load tablets from " << _path
               << ", total rowset meta: " << dir_rowset_metas.size()
-              << ", invalid rowset num: " << invalid_rowset_counter;
+              << ", invalid rowset num: " << invalid_rowset_counter
+              << ", visible/stale rowsets' delete bitmap count: " << dbm_cnt
+              << ", invalid rowsets' delete bitmap count: " << unknown_dbm_cnt;
 
     return Status::OK();
 }
diff --git a/be/src/olap/rowset/beta_rowset_writer.cpp 
b/be/src/olap/rowset/beta_rowset_writer.cpp
index d4f10b8078a..edca329e31f 100644
--- a/be/src/olap/rowset/beta_rowset_writer.cpp
+++ b/be/src/olap/rowset/beta_rowset_writer.cpp
@@ -344,6 +344,8 @@ Status 
BaseBetaRowsetWriter::_generate_delete_bitmap(int32_t segment_id) {
               << ", cur max_version: " << _context.mow_context->max_version
               << ", transaction_id: " << _context.mow_context->txn_id << ", 
delete_bitmap_count: "
               << 
_context.tablet->tablet_meta()->delete_bitmap().get_delete_bitmap_count()
+              << ", delete_bitmap_cardinality: "
+              << _context.tablet->tablet_meta()->delete_bitmap().cardinality()
               << ", cost: " << watch.get_elapse_time_us() << "(us), total 
rows: " << total_rows;
     return Status::OK();
 }
diff --git a/be/src/olap/rowset_builder.cpp b/be/src/olap/rowset_builder.cpp
index c7a0444c0a8..f7295e76217 100644
--- a/be/src/olap/rowset_builder.cpp
+++ b/be/src/olap/rowset_builder.cpp
@@ -299,13 +299,13 @@ Status 
BaseRowsetBuilder::submit_calc_delete_bitmap_task() {
         // we print it's summarize logs here before commit.
         LOG(INFO) << fmt::format(
                 "{} calc delete bitmap summary before commit: tablet({}), 
txn_id({}), "
-                "rowset_ids({}), cur max_version({}), bitmap num({}), num rows 
updated({}), num "
-                "rows new added({}), num rows deleted({}), total rows({})",
+                "rowset_ids({}), cur max_version({}), bitmap num({}), 
bitmap_cardinality({}), num "
+                "rows updated({}), num rows new added({}), num rows 
deleted({}), total rows({})",
                 _partial_update_info->partial_update_mode_str(), 
tablet()->tablet_id(), _req.txn_id,
                 _rowset_ids.size(), 
rowset_writer()->context().mow_context->max_version,
-                _delete_bitmap->delete_bitmap.size(), 
rowset_writer()->num_rows_updated(),
-                rowset_writer()->num_rows_new_added(), 
rowset_writer()->num_rows_deleted(),
-                rowset_writer()->num_rows());
+                _delete_bitmap->get_delete_bitmap_count(), 
_delete_bitmap->cardinality(),
+                rowset_writer()->num_rows_updated(), 
rowset_writer()->num_rows_new_added(),
+                rowset_writer()->num_rows_deleted(), 
rowset_writer()->num_rows());
         return Status::OK();
     }
 


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

Reply via email to