This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.1 by this push:
new afaab7ff98c branch-2.1-pick: [Opt](log) Add and fix logs for delete
bitmaps (#50060)
afaab7ff98c is described below
commit afaab7ff98c5583e77e296d0d0df51200e365ba4
Author: bobhan1 <[email protected]>
AuthorDate: Wed Apr 16 16:45:11 2025 +0800
branch-2.1-pick: [Opt](log) Add and fix logs for delete bitmaps (#50060)
pick https://github.com/apache/doris/pull/48523,
https://github.com/apache/doris/pull/48930
---
be/src/olap/data_dir.cpp | 39 ++++++++++++++++++----
be/src/olap/rowset/beta_rowset_writer.cpp | 5 ++-
be/src/olap/rowset_builder.cpp | 10 +++---
be/src/olap/tablet.cpp | 8 ++---
be/src/olap/tablet_meta.cpp | 11 ++++++
be/src/olap/tablet_meta.h | 2 ++
.../unique/test_unique_auto_inc_concurrent.groovy | 1 -
7 files changed, 57 insertions(+), 19 deletions(-)
diff --git a/be/src/olap/data_dir.cpp b/be/src/olap/data_dir.cpp
index 13238a6dc1e..cab61925ec4 100644
--- a/be/src/olap/data_dir.cpp
+++ b/be/src/olap/data_dir.cpp
@@ -422,12 +422,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
@@ -464,8 +467,11 @@ Status DataDir::load() {
}
return true;
};
+ MonotonicStopWatch tablet_timer;
+ tablet_timer.start();
Status load_tablet_status = TabletMetaManager::traverse_headers(_meta,
load_tablet_func);
- if (failed_tablet_ids.size() != 0) {
+ tablet_timer.stop();
+ if (!failed_tablet_ids.empty()) {
LOG(WARNING) << "load tablets from header failed"
<< ", loaded tablet: " << tablet_ids.size()
<< ", error tablet: " << failed_tablet_ids.size() << ",
path: " << _path;
@@ -480,7 +486,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) {
@@ -504,8 +512,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) {
@@ -612,7 +625,11 @@ Status DataDir::load() {
}
}
- auto load_delete_bitmap_func = [this](int64_t tablet_id, int64_t version,
const string& 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,
const string& val) {
TabletSharedPtr tablet = _tablet_manager->get_tablet(tablet_id);
if (!tablet) {
return true;
@@ -635,8 +652,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});
@@ -650,14 +669,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 e2e0255d9a1..f64afad9b22 100644
--- a/be/src/olap/rowset/beta_rowset_writer.cpp
+++ b/be/src/olap/rowset/beta_rowset_writer.cpp
@@ -192,7 +192,10 @@ Status BetaRowsetWriter::_generate_delete_bitmap(int32_t
segment_id) {
LOG(INFO) << "[Memtable Flush] construct delete bitmap tablet: " <<
_context.tablet->tablet_id()
<< ", rowset_ids: " << _context.mow_context->rowset_ids.size()
<< ", cur max_version: " << _context.mow_context->max_version
- << ", transaction_id: " << _context.mow_context->txn_id
+ << ", 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 ddb55775965..cc56e2f78a7 100644
--- a/be/src/olap/rowset_builder.cpp
+++ b/be/src/olap/rowset_builder.cpp
@@ -280,13 +280,13 @@ Status RowsetBuilder::submit_calc_delete_bitmap_task() {
// we print it's summarize logs here before commit.
LOG(INFO) << fmt::format(
"partial update 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({})",
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();
}
diff --git a/be/src/olap/tablet.cpp b/be/src/olap/tablet.cpp
index 0bb318bdabb..674006d99df 100644
--- a/be/src/olap/tablet.cpp
+++ b/be/src/olap/tablet.cpp
@@ -3179,11 +3179,6 @@ Status
Tablet::calc_segment_delete_bitmap(RowsetSharedPtr rowset,
rsid_to_rowset, &block));
RETURN_IF_ERROR(sort_block(block, ordered_block));
RETURN_IF_ERROR(rowset_writer->flush_single_block(&ordered_block));
- if (new_generated_rows != rowset_writer->num_rows()) {
- LOG(WARNING) << "partial update correctness warning: conflict new
generated rows ("
- << new_generated_rows << ") not equal to the new
flushed rows ("
- << rowset_writer->num_rows() << "), tablet: " <<
tablet_id();
- }
LOG(INFO) << "calc segment delete bitmap for partial update, tablet: "
<< tablet_id()
<< " rowset: " << rowset_id << " seg_id: " << seg->id()
<< " dummy_version: " << end_version + 1 << " rows: " <<
seg->num_rows()
@@ -3724,7 +3719,8 @@ Status Tablet::update_delete_bitmap(TabletTxnInfo*
txn_info, int64_t txn_id) {
segments.begin(), segments.end(), 0,
[](size_t sum, const segment_v2::SegmentSharedPtr& s) { return sum
+= s->num_rows(); });
LOG(INFO) << "[Publish] construct delete bitmap tablet: " << tablet_id()
- << ", rowset_ids to add: " << rowset_ids_to_add.size()
+ << ", rowset_ids to add: "
+ << (specified_rowsets.size() + rowsets_skip_alignment.size())
<< ", rowset_ids to del: " << rowset_ids_to_del.size()
<< ", cur version: " << cur_version << ", transaction_id: " <<
txn_id << ","
<< ss.str() << " , total rows: " << total_rows;
diff --git a/be/src/olap/tablet_meta.cpp b/be/src/olap/tablet_meta.cpp
index bfeb9dbac84..b3360537e9a 100644
--- a/be/src/olap/tablet_meta.cpp
+++ b/be/src/olap/tablet_meta.cpp
@@ -1074,6 +1074,17 @@ uint64_t DeleteBitmap::cardinality() const {
return res;
}
+uint64_t DeleteBitmap::get_delete_bitmap_count() const {
+ std::shared_lock l(lock);
+ uint64_t count = 0;
+ for (auto it = delete_bitmap.begin(); it != delete_bitmap.end(); it++) {
+ if (std::get<1>(it->first) != DeleteBitmap::INVALID_SEGMENT_ID) {
+ count++;
+ }
+ }
+ return count;
+}
+
bool DeleteBitmap::contains_agg_without_cache(const BitmapKey& bmk, uint32_t
row_id) const {
std::shared_lock l(lock);
DeleteBitmap::BitmapKey start {std::get<0>(bmk), std::get<1>(bmk), 0};
diff --git a/be/src/olap/tablet_meta.h b/be/src/olap/tablet_meta.h
index 77581b4f4ef..7767e6d2184 100644
--- a/be/src/olap/tablet_meta.h
+++ b/be/src/olap/tablet_meta.h
@@ -439,6 +439,8 @@ public:
*/
uint64_t cardinality() const;
+ uint64_t get_delete_bitmap_count() const;
+
/**
* Sets the bitmap of specific segment, it's may be insertion or
replacement
*
diff --git
a/regression-test/suites/data_model_p0/unique/test_unique_auto_inc_concurrent.groovy
b/regression-test/suites/data_model_p0/unique/test_unique_auto_inc_concurrent.groovy
index 4793fb52343..66a87707a6f 100644
---
a/regression-test/suites/data_model_p0/unique/test_unique_auto_inc_concurrent.groovy
+++
b/regression-test/suites/data_model_p0/unique/test_unique_auto_inc_concurrent.groovy
@@ -55,6 +55,5 @@ suite("test_unique_table_auto_inc_concurrent") {
run_test(15, 100000, 1)
run_test(5, 30000, 10)
- sql "drop table if exists ${table1};"
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]