This is an automated email from the ASF dual-hosted git repository.
dataroaring 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 c5b8626b968 branch-4.0: [Opt](cloud) use unordered_map to reduce meta
lock held time in `delete_expired_stale_rowsets` #53467 (#56475)
c5b8626b968 is described below
commit c5b8626b9683d3413c464ebc59c602ee7a62a725
Author: github-actions[bot]
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Fri Sep 26 15:29:10 2025 +0800
branch-4.0: [Opt](cloud) use unordered_map to reduce meta lock held time in
`delete_expired_stale_rowsets` #53467 (#56475)
Cherry-picked from #53467
Co-authored-by: bobhan1 <[email protected]>
---
be/src/agent/task_worker_pool.cpp | 8 +-
be/src/cloud/cloud_meta_mgr.cpp | 2 +-
be/src/cloud/cloud_schema_change_job.cpp | 14 +-
be/src/cloud/cloud_snapshot_mgr.cpp | 2 +-
be/src/cloud/cloud_tablet.cpp | 11 +-
.../exec/schema_scanner/schema_tablets_scanner.cpp | 11 +-
be/src/olap/base_tablet.cpp | 27 +--
be/src/olap/cumulative_compaction_policy.cpp | 8 +-
be/src/olap/cumulative_compaction_policy.h | 5 +-
.../cumulative_compaction_time_series_policy.cpp | 8 +-
.../cumulative_compaction_time_series_policy.h | 3 +-
be/src/olap/data_dir.cpp | 4 +-
be/src/olap/olap_server.cpp | 2 +-
be/src/olap/rowset/rowset_meta.h | 3 +-
be/src/olap/tablet.cpp | 25 ++-
be/src/olap/tablet.h | 2 +-
be/src/olap/tablet_meta.cpp | 107 ++++------
be/src/olap/tablet_meta.h | 36 ++--
be/src/olap/task/engine_clone_task.cpp | 2 +-
be/src/olap/version_graph.cpp | 199 +-----------------
be/src/olap/version_graph.h | 225 ++++++++++++++++++++-
be/test/cloud/cloud_meta_mgr_test.cpp | 22 +-
.../compaction_delete_bitmap_calculator_test.cpp | 4 +-
be/test/olap/delete_handler_test.cpp | 2 +-
24 files changed, 369 insertions(+), 363 deletions(-)
diff --git a/be/src/agent/task_worker_pool.cpp
b/be/src/agent/task_worker_pool.cpp
index e3ca1a4b473..4f623124e47 100644
--- a/be/src/agent/task_worker_pool.cpp
+++ b/be/src/agent/task_worker_pool.cpp
@@ -895,7 +895,7 @@ void update_tablet_meta_callback(StorageEngine& engine,
const TAgentTaskRequest&
tablet->tablet_meta()->mutable_tablet_schema()->set_is_in_memory(
tablet_meta_info.is_in_memory);
std::shared_lock rlock(tablet->get_header_lock());
- for (auto& rowset_meta :
tablet->tablet_meta()->all_mutable_rs_metas()) {
+ for (auto& [_, rowset_meta] :
tablet->tablet_meta()->all_mutable_rs_metas()) {
rowset_meta->tablet_schema()->set_is_in_memory(tablet_meta_info.is_in_memory);
}
tablet->tablet_schema_unlocked()->set_is_in_memory(tablet_meta_info.is_in_memory);
@@ -993,7 +993,7 @@ void update_tablet_meta_callback(StorageEngine& engine,
const TAgentTaskRequest&
std::shared_lock rlock(tablet->get_header_lock());
tablet->tablet_meta()->mutable_tablet_schema()->set_enable_single_replica_compaction(
tablet_meta_info.enable_single_replica_compaction);
- for (auto& rowset_meta :
tablet->tablet_meta()->all_mutable_rs_metas()) {
+ for (auto& [_, rowset_meta] :
tablet->tablet_meta()->all_mutable_rs_metas()) {
rowset_meta->tablet_schema()->set_enable_single_replica_compaction(
tablet_meta_info.enable_single_replica_compaction);
}
@@ -1005,7 +1005,7 @@ void update_tablet_meta_callback(StorageEngine& engine,
const TAgentTaskRequest&
std::shared_lock rlock(tablet->get_header_lock());
tablet->tablet_meta()->mutable_tablet_schema()->set_disable_auto_compaction(
tablet_meta_info.disable_auto_compaction);
- for (auto& rowset_meta :
tablet->tablet_meta()->all_mutable_rs_metas()) {
+ for (auto& [_, rowset_meta] :
tablet->tablet_meta()->all_mutable_rs_metas()) {
rowset_meta->tablet_schema()->set_disable_auto_compaction(
tablet_meta_info.disable_auto_compaction);
}
@@ -1018,7 +1018,7 @@ void update_tablet_meta_callback(StorageEngine& engine,
const TAgentTaskRequest&
std::shared_lock rlock(tablet->get_header_lock());
tablet->tablet_meta()->mutable_tablet_schema()->set_skip_write_index_on_load(
tablet_meta_info.skip_write_index_on_load);
- for (auto& rowset_meta :
tablet->tablet_meta()->all_mutable_rs_metas()) {
+ for (auto& [_, rowset_meta] :
tablet->tablet_meta()->all_mutable_rs_metas()) {
rowset_meta->tablet_schema()->set_skip_write_index_on_load(
tablet_meta_info.skip_write_index_on_load);
}
diff --git a/be/src/cloud/cloud_meta_mgr.cpp b/be/src/cloud/cloud_meta_mgr.cpp
index bedac44b67a..cc2440e1b2e 100644
--- a/be/src/cloud/cloud_meta_mgr.cpp
+++ b/be/src/cloud/cloud_meta_mgr.cpp
@@ -2035,7 +2035,7 @@ Status CloudMetaMgr::fill_version_holes(CloudTablet*
tablet, int64_t max_version
}
Versions existing_versions;
- for (const auto& rs : tablet->tablet_meta()->all_rs_metas()) {
+ for (const auto& [_, rs] : tablet->tablet_meta()->all_rs_metas()) {
existing_versions.emplace_back(rs->version());
}
diff --git a/be/src/cloud/cloud_schema_change_job.cpp
b/be/src/cloud/cloud_schema_change_job.cpp
index 6af55f7e507..7b78033b8e3 100644
--- a/be/src/cloud/cloud_schema_change_job.cpp
+++ b/be/src/cloud/cloud_schema_change_job.cpp
@@ -490,12 +490,14 @@ Status
CloudSchemaChangeJob::_process_delete_bitmap(int64_t alter_version,
tmp_meta->delete_bitmap().delete_bitmap.clear();
// Keep only version [0-1] rowset, other rowsets will be added in
_output_rowsets
auto& rs_metas = tmp_meta->all_mutable_rs_metas();
- rs_metas.erase(std::remove_if(rs_metas.begin(), rs_metas.end(),
- [](const RowsetMetaSharedPtr& rs_meta) {
- return !(rs_meta->version().first == 0 &&
- rs_meta->version().second == 1);
- }),
- rs_metas.end());
+ for (auto it = rs_metas.begin(); it != rs_metas.end();) {
+ const auto& rs_meta = it->second;
+ if (rs_meta->version().first == 0 && rs_meta->version().second == 1) {
+ ++it;
+ } else {
+ it = rs_metas.erase(it);
+ }
+ }
std::shared_ptr<CloudTablet> tmp_tablet =
std::make_shared<CloudTablet>(_cloud_storage_engine, tmp_meta);
diff --git a/be/src/cloud/cloud_snapshot_mgr.cpp
b/be/src/cloud/cloud_snapshot_mgr.cpp
index 5ceac0700a9..c943f6b55fb 100644
--- a/be/src/cloud/cloud_snapshot_mgr.cpp
+++ b/be/src/cloud/cloud_snapshot_mgr.cpp
@@ -83,7 +83,7 @@ Status CloudSnapshotMgr::make_snapshot(int64_t
target_tablet_id, StorageResource
if (tablet_meta.all_rs_metas().size() > 0) {
tablet_meta_pb.mutable_inc_rs_metas()->Reserve(
cast_set<int>(tablet_meta.all_rs_metas().size()));
- for (auto& rs : tablet_meta.all_rs_metas()) {
+ for (auto& [_, rs] : tablet_meta.all_rs_metas()) {
rs->to_rowset_pb(tablet_meta_pb.add_rs_metas());
}
}
diff --git a/be/src/cloud/cloud_tablet.cpp b/be/src/cloud/cloud_tablet.cpp
index 6e5db7257ce..f1f02ecc38d 100644
--- a/be/src/cloud/cloud_tablet.cpp
+++ b/be/src/cloud/cloud_tablet.cpp
@@ -297,10 +297,11 @@ Status
CloudTablet::capture_rs_readers_with_freshness_tolerance(
return ret;
};
// use std::views::concat after C++26
- bool should_fallback = std::ranges::any_of(_tablet_meta->all_rs_metas(),
-
should_be_visible_but_not_warmed_up) ||
-
std::ranges::any_of(_tablet_meta->all_stale_rs_metas(),
-
should_be_visible_but_not_warmed_up);
+ bool should_fallback =
+
std::ranges::any_of(std::views::values(_tablet_meta->all_rs_metas()),
+ should_be_visible_but_not_warmed_up) ||
+
std::ranges::any_of(std::views::values(_tablet_meta->all_stale_rs_metas()),
+ should_be_visible_but_not_warmed_up);
if (should_fallback) {
rlock.unlock();
g_capture_with_freshness_tolerance_fallback_count << 1;
@@ -983,7 +984,7 @@ int64_t CloudTablet::get_cloud_base_compaction_score()
const {
bool has_delete = false;
int64_t point = cumulative_layer_point();
std::shared_lock<std::shared_mutex> rlock(_meta_lock);
- for (const auto& rs_meta : _tablet_meta->all_rs_metas()) {
+ for (const auto& [_, rs_meta] : _tablet_meta->all_rs_metas()) {
if (rs_meta->start_version() >= point) {
continue;
}
diff --git a/be/src/exec/schema_scanner/schema_tablets_scanner.cpp
b/be/src/exec/schema_scanner/schema_tablets_scanner.cpp
index 3ba1339596a..957ce370b8b 100644
--- a/be/src/exec/schema_scanner/schema_tablets_scanner.cpp
+++ b/be/src/exec/schema_scanner/schema_tablets_scanner.cpp
@@ -161,8 +161,8 @@ Status
SchemaTabletsScanner::_fill_block_impl(vectorized::Block* block) {
[&tablet]() {
auto rs_metas = tablet->tablet_meta()->all_rs_metas();
return std::accumulate(rs_metas.begin(), rs_metas.end(), 0,
- [](int64_t val,
RowsetMetaSharedPtr& rs_meta) {
- return val +
rs_meta->num_segments();
+ [](int64_t val, const auto& it) {
+ return val +
it.second->num_segments();
});
}(),
block);
@@ -214,10 +214,9 @@ Status
SchemaTabletsScanner::_fill_block_impl(vectorized::Block* block) {
17,
[&tablet]() {
const auto& rs_metas =
tablet->tablet_meta()->all_rs_metas();
- return std::any_of(rs_metas.begin(), rs_metas.end(),
- [](const RowsetMetaSharedPtr& rs_meta) {
- return
rs_meta->is_segments_overlapping();
- });
+ return std::any_of(rs_metas.begin(), rs_metas.end(),
[](const auto& it) {
+ return it.second->is_segments_overlapping();
+ });
}(),
block);
}
diff --git a/be/src/olap/base_tablet.cpp b/be/src/olap/base_tablet.cpp
index 28cb02b99b2..b919db8d92b 100644
--- a/be/src/olap/base_tablet.cpp
+++ b/be/src/olap/base_tablet.cpp
@@ -131,11 +131,14 @@ BaseTablet::BaseTablet(TabletMetaSharedPtr tablet_meta) :
_tablet_meta(std::move
// Before doris 1.2 version, rowset metas don't have tablet schema.
// And when upgrade to doris 1.2 version,
// all rowset metas will be set the tablet schmea from tablet meta.
- if (_tablet_meta->all_rs_metas().empty() ||
!_tablet_meta->all_rs_metas()[0]->tablet_schema()) {
+ if (_tablet_meta->all_rs_metas().empty() ||
+ !_tablet_meta->all_rs_metas().begin()->second->tablet_schema()) {
_max_version_schema = _tablet_meta->tablet_schema();
} else {
- _max_version_schema =
-
tablet_schema_with_merged_max_schema_version(_tablet_meta->all_rs_metas());
+ std::vector<RowsetMetaSharedPtr>
rowset_metas(_tablet_meta->all_rs_metas().size());
+ std::transform(_tablet_meta->all_rs_metas().begin(),
_tablet_meta->all_rs_metas().end(),
+ rowset_metas.begin(), [](const auto& it) { return
it.second; });
+ _max_version_schema =
tablet_schema_with_merged_max_schema_version(rowset_metas);
}
DCHECK(_max_version_schema);
g_total_tablet_num << 1;
@@ -149,8 +152,7 @@ BaseTablet::~BaseTablet() {
TabletSchemaSPtr BaseTablet::tablet_schema_with_merged_max_schema_version(
const std::vector<RowsetMetaSharedPtr>& rowset_metas) {
RowsetMetaSharedPtr max_schema_version_rs = *std::max_element(
- rowset_metas.begin(), rowset_metas.end(),
- [](const RowsetMetaSharedPtr& a, const RowsetMetaSharedPtr& b) {
+ rowset_metas.begin(), rowset_metas.end(), [](const auto& a, const
auto& b) -> bool {
return !a->tablet_schema()
? true
: (!b->tablet_schema()
@@ -182,10 +184,9 @@ void BaseTablet::update_max_version_schema(const
TabletSchemaSPtr& tablet_schema
uint32_t BaseTablet::get_real_compaction_score() const {
std::shared_lock l(_meta_lock);
const auto& rs_metas = _tablet_meta->all_rs_metas();
- return std::accumulate(rs_metas.begin(), rs_metas.end(), 0,
- [](uint32_t score, const RowsetMetaSharedPtr&
rs_meta) {
- return score + rs_meta->get_compaction_score();
- });
+ return std::accumulate(rs_metas.begin(), rs_metas.end(), 0, [](uint32_t
score, const auto& it) {
+ return score + it.second->get_compaction_score();
+ });
}
Status BaseTablet::capture_rs_readers_unlocked(const Versions& version_path,
@@ -291,8 +292,8 @@ Versions BaseTablet::get_missed_versions(int64_t
spec_version) const {
Versions existing_versions;
{
std::shared_lock rdlock(_meta_lock);
- for (const auto& rs : _tablet_meta->all_rs_metas()) {
- existing_versions.emplace_back(rs->version());
+ for (const auto& [ver, _] : _tablet_meta->all_rs_metas()) {
+ existing_versions.emplace_back(ver);
}
}
return calc_missed_versions(spec_version, std::move(existing_versions));
@@ -302,8 +303,8 @@ Versions BaseTablet::get_missed_versions_unlocked(int64_t
spec_version) const {
DCHECK(spec_version > 0) << "invalid spec_version: " << spec_version;
Versions existing_versions;
- for (const auto& rs : _tablet_meta->all_rs_metas()) {
- existing_versions.emplace_back(rs->version());
+ for (const auto& [ver, _] : _tablet_meta->all_rs_metas()) {
+ existing_versions.emplace_back(ver);
}
return calc_missed_versions(spec_version, std::move(existing_versions));
}
diff --git a/be/src/olap/cumulative_compaction_policy.cpp
b/be/src/olap/cumulative_compaction_policy.cpp
index b7666ef1e20..6f74f86bf9d 100644
--- a/be/src/olap/cumulative_compaction_policy.cpp
+++ b/be/src/olap/cumulative_compaction_policy.cpp
@@ -43,8 +43,8 @@
SizeBasedCumulativeCompactionPolicy::SizeBasedCumulativeCompactionPolicy(
_compaction_min_size(compaction_min_size) {}
void SizeBasedCumulativeCompactionPolicy::calculate_cumulative_point(
- Tablet* tablet, const std::vector<RowsetMetaSharedPtr>& all_metas,
- int64_t current_cumulative_point, int64_t* ret_cumulative_point) {
+ Tablet* tablet, const RowsetMetaMapContainer& all_metas, int64_t
current_cumulative_point,
+ int64_t* ret_cumulative_point) {
*ret_cumulative_point = Tablet::K_INVALID_CUMULATIVE_POINT;
if (current_cumulative_point != Tablet::K_INVALID_CUMULATIVE_POINT) {
// only calculate the point once.
@@ -57,7 +57,7 @@ void
SizeBasedCumulativeCompactionPolicy::calculate_cumulative_point(
}
std::list<RowsetMetaSharedPtr> existing_rss;
- for (auto& rs : all_metas) {
+ for (const auto& [_, rs] : all_metas) {
existing_rss.emplace_back(rs);
}
@@ -182,7 +182,7 @@ uint32_t
SizeBasedCumulativeCompactionPolicy::calc_cumulative_compaction_score(T
// NOTE: tablet._meta_lock is hold
auto& rs_metas = tablet->tablet_meta()->all_rs_metas();
// check the base rowset and collect the rowsets of cumulative part
- for (auto& rs_meta : rs_metas) {
+ for (const auto& [_, rs_meta] : rs_metas) {
if (rs_meta->start_version() < first_version) {
first_version = rs_meta->start_version();
first_meta = rs_meta;
diff --git a/be/src/olap/cumulative_compaction_policy.h
b/be/src/olap/cumulative_compaction_policy.h
index c7dea00562e..1da0689f4aa 100644
--- a/be/src/olap/cumulative_compaction_policy.h
+++ b/be/src/olap/cumulative_compaction_policy.h
@@ -92,7 +92,7 @@ public:
/// param current_cumulative_point, current cumulative position
/// return cumulative_point, the result of calculating cumulative point
position
virtual void calculate_cumulative_point(Tablet* tablet,
- const
std::vector<RowsetMetaSharedPtr>& all_rowsets,
+ const RowsetMetaMapContainer&
all_rowsets,
int64_t current_cumulative_point,
int64_t* cumulative_point) = 0;
@@ -128,8 +128,7 @@ public:
/// SizeBased cumulative compaction policy implements calculate cumulative
point function.
/// When the first time the tablet does compact, this calculation is
executed. Its main policy is to find first rowset
/// which does not satisfied the promotion conditions.
- void calculate_cumulative_point(Tablet* tablet,
- const std::vector<RowsetMetaSharedPtr>&
all_rowsets,
+ void calculate_cumulative_point(Tablet* tablet, const
RowsetMetaMapContainer& all_rowsets,
int64_t current_cumulative_point,
int64_t* cumulative_point) override;
diff --git a/be/src/olap/cumulative_compaction_time_series_policy.cpp
b/be/src/olap/cumulative_compaction_time_series_policy.cpp
index 8cb7f0f9eaf..ef4872837dc 100644
--- a/be/src/olap/cumulative_compaction_time_series_policy.cpp
+++ b/be/src/olap/cumulative_compaction_time_series_policy.cpp
@@ -58,7 +58,7 @@ uint32_t
TimeSeriesCumulativeCompactionPolicy::calc_cumulative_compaction_score(
// NOTE: tablet._meta_lock is hold
auto& rs_metas = tablet->tablet_meta()->all_rs_metas();
// check the base rowset and collect the rowsets of cumulative part
- for (auto& rs_meta : rs_metas) {
+ for (const auto& [_, rs_meta] : rs_metas) {
int64_t start_version = rs_meta->start_version();
int64_t end_version = rs_meta->end_version();
if (start_version < first_version) {
@@ -169,8 +169,8 @@ uint32_t
TimeSeriesCumulativeCompactionPolicy::calc_cumulative_compaction_score(
}
void TimeSeriesCumulativeCompactionPolicy::calculate_cumulative_point(
- Tablet* tablet, const std::vector<RowsetMetaSharedPtr>& all_metas,
- int64_t current_cumulative_point, int64_t* ret_cumulative_point) {
+ Tablet* tablet, const RowsetMetaMapContainer& all_metas, int64_t
current_cumulative_point,
+ int64_t* ret_cumulative_point) {
*ret_cumulative_point = Tablet::K_INVALID_CUMULATIVE_POINT;
if (current_cumulative_point != Tablet::K_INVALID_CUMULATIVE_POINT) {
// only calculate the point once.
@@ -183,7 +183,7 @@ void
TimeSeriesCumulativeCompactionPolicy::calculate_cumulative_point(
}
std::list<RowsetMetaSharedPtr> existing_rss;
- for (auto& rs : all_metas) {
+ for (const auto& [_, rs] : all_metas) {
existing_rss.emplace_back(rs);
}
diff --git a/be/src/olap/cumulative_compaction_time_series_policy.h
b/be/src/olap/cumulative_compaction_time_series_policy.h
index a18cbd85ffb..c71faeb2782 100644
--- a/be/src/olap/cumulative_compaction_time_series_policy.h
+++ b/be/src/olap/cumulative_compaction_time_series_policy.h
@@ -42,8 +42,7 @@ public:
/// When the first time the tablet does compact, this calculation is
executed. Its main policy is to find first rowset
/// which does not satisfied the _compaction_goal_size * 0.8.
/// The result of compaction may be slightly smaller than the
_compaction_goal_size.
- void calculate_cumulative_point(Tablet* tablet,
- const std::vector<RowsetMetaSharedPtr>&
all_rowsets,
+ void calculate_cumulative_point(Tablet* tablet, const
RowsetMetaMapContainer& all_rowsets,
int64_t current_cumulative_point,
int64_t* cumulative_point) override;
diff --git a/be/src/olap/data_dir.cpp b/be/src/olap/data_dir.cpp
index c5e7edcf6f3..8e3c4a9d915 100644
--- a/be/src/olap/data_dir.cpp
+++ b/be/src/olap/data_dir.cpp
@@ -615,9 +615,9 @@ Status DataDir::load() {
if (!tablet) {
return true;
}
- const std::vector<RowsetMetaSharedPtr>& all_rowsets =
tablet->tablet_meta()->all_rs_metas();
+ const auto& all_rowsets = tablet->tablet_meta()->all_rs_metas();
RowsetIdUnorderedSet rowset_ids;
- for (auto& rowset_meta : all_rowsets) {
+ for (const auto& [_, rowset_meta] : all_rowsets) {
rowset_ids.insert(rowset_meta->rowset_id());
}
diff --git a/be/src/olap/olap_server.cpp b/be/src/olap/olap_server.cpp
index 836652d183c..906cffc9a42 100644
--- a/be/src/olap/olap_server.cpp
+++ b/be/src/olap/olap_server.cpp
@@ -1411,7 +1411,7 @@ void StorageEngine::do_remove_unused_remote_files() {
UniqueId cooldown_meta_id;
{
std::shared_lock rlock(t->get_header_lock());
- for (auto&& rs_meta : t->tablet_meta()->all_rs_metas()) {
+ for (const auto& [_, rs_meta] : t->tablet_meta()->all_rs_metas()) {
if (!rs_meta->is_local()) {
cooldowned_rowsets.insert(rs_meta->rowset_id());
}
diff --git a/be/src/olap/rowset/rowset_meta.h b/be/src/olap/rowset/rowset_meta.h
index 6d536d5c2a2..4cd346ce414 100644
--- a/be/src/olap/rowset/rowset_meta.h
+++ b/be/src/olap/rowset/rowset_meta.h
@@ -446,8 +446,9 @@ private:
std::atomic<int64_t> _stale_at_s {0};
};
-#include "common/compile_check_end.h"
+using RowsetMetaMapContainer = std::unordered_map<Version,
RowsetMetaSharedPtr, HashOfVersion>;
+#include "common/compile_check_end.h"
} // namespace doris
#endif // DORIS_BE_SRC_OLAP_ROWSET_ROWSET_META_H
diff --git a/be/src/olap/tablet.cpp b/be/src/olap/tablet.cpp
index ff71371f1bf..69791626ab8 100644
--- a/be/src/olap/tablet.cpp
+++ b/be/src/olap/tablet.cpp
@@ -273,7 +273,7 @@ Tablet::Tablet(StorageEngine& engine, TabletMetaSharedPtr
tablet_meta, DataDir*
bool Tablet::set_tablet_schema_into_rowset_meta() {
bool flag = false;
- for (auto&& rowset_meta : _tablet_meta->all_mutable_rs_metas()) {
+ for (auto& [_, rowset_meta] : _tablet_meta->all_mutable_rs_metas()) {
if (!rowset_meta->tablet_schema()) {
rowset_meta->set_tablet_schema(_tablet_meta->tablet_schema());
flag = true;
@@ -294,7 +294,7 @@ Status Tablet::_init_once_action() {
_tablet_meta->compaction_policy());
#endif
- for (const auto& rs_meta : _tablet_meta->all_rs_metas()) {
+ for (const auto& [_, rs_meta] : _tablet_meta->all_rs_metas()) {
Version version = rs_meta->version();
RowsetSharedPtr rowset;
res = create_rowset(rs_meta, &rowset);
@@ -309,7 +309,7 @@ Status Tablet::_init_once_action() {
// init stale rowset
int64_t now = ::time(nullptr);
- for (const auto& stale_rs_meta : _tablet_meta->all_stale_rs_metas()) {
+ for (const auto& [_, stale_rs_meta] : _tablet_meta->all_stale_rs_metas()) {
Version version = stale_rs_meta->version();
if (!stale_rs_meta->has_stale_at()) {
@@ -1108,7 +1108,7 @@ uint32_t Tablet::calc_cold_data_compaction_score() const {
int64_t max_delete_version = 0;
{
std::shared_lock rlock(_meta_lock);
- for (auto& rs_meta : _tablet_meta->all_rs_metas()) {
+ for (const auto& [_, rs_meta] : _tablet_meta->all_rs_metas()) {
if (!rs_meta->is_local()) {
cooldowned_rowsets.push_back(rs_meta);
if (rs_meta->has_delete_predicate() &&
@@ -1152,7 +1152,7 @@ uint32_t Tablet::_calc_base_compaction_score() const {
const int64_t point = cumulative_layer_point();
bool base_rowset_exist = false;
bool has_delete = false;
- for (auto& rs_meta : _tablet_meta->all_rs_metas()) {
+ for (const auto& [_, rs_meta] : _tablet_meta->all_rs_metas()) {
if (rs_meta->start_version() == 0) {
base_rowset_exist = true;
}
@@ -1186,8 +1186,8 @@ void
Tablet::_max_continuous_version_from_beginning_unlocked(Version* version, V
bool*
has_version_cross) const {
std::vector<Version> existing_versions;
*has_version_cross = false;
- for (auto& rs : _tablet_meta->all_rs_metas()) {
- existing_versions.emplace_back(rs->version());
+ for (const auto& [ver, _] : _tablet_meta->all_rs_metas()) {
+ existing_versions.emplace_back(ver);
}
// sort the existing versions in ascending order
@@ -1557,7 +1557,7 @@ bool Tablet::do_tablet_meta_checkpoint() {
save_meta();
// if save meta successfully, then should remove the rowset meta existing
in tablet
// meta from rowset meta store
- for (auto& rs_meta : _tablet_meta->all_rs_metas()) {
+ for (const auto& [_, rs_meta] : _tablet_meta->all_rs_metas()) {
// If we delete it from rowset manager's meta explicitly in previous
checkpoint, just skip.
if (rs_meta->is_remove_from_rowset_meta()) {
continue;
@@ -1573,7 +1573,7 @@ bool Tablet::do_tablet_meta_checkpoint() {
}
// check _stale_rs_version_map to remove meta from rowset meta store
- for (auto& rs_meta : _tablet_meta->all_stale_rs_metas()) {
+ for (const auto& [_, rs_meta] : _tablet_meta->all_stale_rs_metas()) {
// If we delete it from rowset manager's meta explicitly in previous
checkpoint, just skip.
if (rs_meta->is_remove_from_rowset_meta()) {
continue;
@@ -2262,7 +2262,7 @@ Status Tablet::write_cooldown_meta() {
UniqueId cooldown_meta_id;
{
std::shared_lock meta_rlock(_meta_lock);
- for (auto& rs_meta : _tablet_meta->all_rs_metas()) {
+ for (const auto& [_, rs_meta] : _tablet_meta->all_rs_metas()) {
if (!rs_meta->is_local()) {
cooldowned_rs_metas.push_back(rs_meta);
}
@@ -2558,7 +2558,7 @@ void Tablet::record_unused_remote_rowset(const RowsetId&
rowset_id, const std::s
Status Tablet::remove_all_remote_rowsets() {
DCHECK(tablet_state() == TABLET_SHUTDOWN);
std::set<std::string> resource_ids;
- for (auto& rs_meta : _tablet_meta->all_rs_metas()) {
+ for (const auto& [_, rs_meta] : _tablet_meta->all_rs_metas()) {
if (!rs_meta->is_local()) {
resource_ids.insert(rs_meta->resource_id());
}
@@ -2831,8 +2831,7 @@ void Tablet::check_table_size_correctness() {
if (!config::enable_table_size_correctness_check) {
return;
}
- const std::vector<RowsetMetaSharedPtr>& all_rs_metas =
_tablet_meta->all_rs_metas();
- for (const auto& rs_meta : all_rs_metas) {
+ for (const auto& [_, rs_meta] : _tablet_meta->all_rs_metas()) {
int64_t total_segment_size = get_segment_file_size(rs_meta);
int64_t total_inverted_index_size =
get_inverted_index_file_size(rs_meta);
if (rs_meta->data_disk_size() != total_segment_size ||
diff --git a/be/src/olap/tablet.h b/be/src/olap/tablet.h
index 28139a64f20..1b7e809eec3 100644
--- a/be/src/olap/tablet.h
+++ b/be/src/olap/tablet.h
@@ -735,7 +735,7 @@ inline Version Tablet::max_version() const {
inline uint64_t Tablet::segment_count() const {
std::shared_lock rdlock(_meta_lock);
uint64_t segment_nums = 0;
- for (const auto& rs_meta : _tablet_meta->all_rs_metas()) {
+ for (const auto& [_, rs_meta] : _tablet_meta->all_rs_metas()) {
segment_nums += rs_meta->num_segments();
}
return segment_nums;
diff --git a/be/src/olap/tablet_meta.cpp b/be/src/olap/tablet_meta.cpp
index d150351cd92..60585a45359 100644
--- a/be/src/olap/tablet_meta.cpp
+++ b/be/src/olap/tablet_meta.cpp
@@ -751,7 +751,7 @@ void TabletMeta::init_from_pb(const TabletMetaPB&
tablet_meta_pb) {
for (auto& it : tablet_meta_pb.rs_metas()) {
RowsetMetaSharedPtr rs_meta(new RowsetMeta());
rs_meta->init_from_pb(it);
- _rs_metas.push_back(std::move(rs_meta));
+ _rs_metas.emplace(rs_meta->version(), rs_meta);
}
// For mow table, delete bitmap of stale rowsets has not been persisted.
@@ -761,7 +761,7 @@ void TabletMeta::init_from_pb(const TabletMetaPB&
tablet_meta_pb) {
for (auto& it : tablet_meta_pb.stale_rs_metas()) {
RowsetMetaSharedPtr rs_meta(new RowsetMeta());
rs_meta->init_from_pb(it);
- _stale_rs_metas.push_back(std::move(rs_meta));
+ _stale_rs_metas.emplace(rs_meta->version(), rs_meta);
}
}
@@ -848,10 +848,10 @@ void TabletMeta::to_meta_pb(TabletMetaPB* tablet_meta_pb)
{
// RowsetMetaPB is separated from TabletMetaPB
if (!config::is_cloud_mode()) {
- for (auto& rs : _rs_metas) {
+ for (const auto& [_, rs] : _rs_metas) {
rs->to_rowset_pb(tablet_meta_pb->add_rs_metas());
}
- for (auto rs : _stale_rs_metas) {
+ for (const auto& [_, rs] : _stale_rs_metas) {
rs->to_rowset_pb(tablet_meta_pb->add_stale_rs_metas());
}
}
@@ -875,7 +875,7 @@ void TabletMeta::to_meta_pb(TabletMetaPB* tablet_meta_pb) {
if (_enable_unique_key_merge_on_write) {
std::set<RowsetId> stale_rs_ids;
- for (const auto& rowset : _stale_rs_metas) {
+ for (const auto& [_, rowset] : _stale_rs_metas) {
stale_rs_ids.insert(rowset->rowset_id());
}
DeleteBitmapPB* delete_bitmap_pb =
tablet_meta_pb->mutable_delete_bitmap();
@@ -916,7 +916,7 @@ void TabletMeta::to_json(string* json_string,
json2pb::Pb2JsonOptions& options)
Version TabletMeta::max_version() const {
Version max_version = {-1, 0};
- for (auto& rs_meta : _rs_metas) {
+ for (const auto& [_, rs_meta] : _rs_metas) {
if (rs_meta->end_version() > max_version.second) {
max_version = rs_meta->version();
}
@@ -926,7 +926,7 @@ Version TabletMeta::max_version() const {
size_t TabletMeta::version_count_cross_with_range(const Version& range) const {
size_t count = 0;
- for (const auto& rs_meta : _rs_metas) {
+ for (const auto& [_, rs_meta] : _rs_metas) {
if (!(range.first > rs_meta->version().second || range.second <
rs_meta->version().first)) {
count++;
}
@@ -936,7 +936,7 @@ size_t TabletMeta::version_count_cross_with_range(const
Version& range) const {
Status TabletMeta::add_rs_meta(const RowsetMetaSharedPtr& rs_meta) {
// check RowsetMeta is valid
- for (auto& rs : _rs_metas) {
+ for (const auto& [_, rs] : _rs_metas) {
if (rs->version() == rs_meta->version()) {
if (rs->rowset_id() != rs_meta->rowset_id()) {
return Status::Error<PUSH_VERSION_ALREADY_EXIST>(
@@ -948,34 +948,29 @@ Status TabletMeta::add_rs_meta(const RowsetMetaSharedPtr&
rs_meta) {
}
}
}
- _rs_metas.push_back(rs_meta);
+ _rs_metas.emplace(rs_meta->version(), rs_meta);
return Status::OK();
}
void TabletMeta::add_rowsets_unchecked(const std::vector<RowsetSharedPtr>&
to_add) {
for (const auto& rs : to_add) {
- _rs_metas.push_back(rs->rowset_meta());
+ _rs_metas.emplace(rs->rowset_meta()->version(), rs->rowset_meta());
}
}
void TabletMeta::delete_rs_meta_by_version(const Version& version,
std::vector<RowsetMetaSharedPtr>*
deleted_rs_metas) {
size_t rowset_cache_version_size = 0;
- auto it = _rs_metas.begin();
- while (it != _rs_metas.end()) {
- if ((*it)->version() == version) {
- if (deleted_rs_metas != nullptr) {
- deleted_rs_metas->push_back(*it);
- }
- _rs_metas.erase(it);
- if (_enable_unique_key_merge_on_write) {
- rowset_cache_version_size =
-
_delete_bitmap->remove_rowset_cache_version((*it)->rowset_id());
- }
- return;
- } else {
- ++it;
+ if (auto it = _rs_metas.find(version); it != _rs_metas.end()) {
+ if (deleted_rs_metas != nullptr) {
+ deleted_rs_metas->push_back(it->second);
}
+ auto rowset_id = it->second->rowset_id();
+ _rs_metas.erase(it);
+ if (_enable_unique_key_merge_on_write) {
+ rowset_cache_version_size =
_delete_bitmap->remove_rowset_cache_version(rowset_id);
+ }
+ return;
}
_check_mow_rowset_cache_version_size(rowset_cache_version_size);
}
@@ -986,28 +981,25 @@ void TabletMeta::modify_rs_metas(const
std::vector<RowsetMetaSharedPtr>& to_add,
size_t rowset_cache_version_size = 0;
// Remove to_delete rowsets from _rs_metas
for (auto rs_to_del : to_delete) {
- auto it = _rs_metas.begin();
- while (it != _rs_metas.end()) {
- if (rs_to_del->version() == (*it)->version()) {
- _rs_metas.erase(it);
- if (_enable_unique_key_merge_on_write) {
- rowset_cache_version_size =
-
_delete_bitmap->remove_rowset_cache_version((*it)->rowset_id());
- }
- // there should be only one rowset match the version
- break;
- } else {
- ++it;
+ if (auto it = _rs_metas.find(rs_to_del->version()); it !=
_rs_metas.end()) {
+ auto rowset_id = it->second->rowset_id();
+ _rs_metas.erase(it);
+ if (_enable_unique_key_merge_on_write) {
+ rowset_cache_version_size =
_delete_bitmap->remove_rowset_cache_version(rowset_id);
}
}
}
if (!same_version) {
// put to_delete rowsets in _stale_rs_metas.
- _stale_rs_metas.insert(_stale_rs_metas.end(), to_delete.begin(),
to_delete.end());
+ for (auto rs_to_del : to_delete) {
+ _stale_rs_metas.emplace(rs_to_del->version(), rs_to_del);
+ }
}
// put to_add rowsets in _rs_metas.
- _rs_metas.insert(_rs_metas.end(), to_add.begin(), to_add.end());
+ for (auto rs_to_add : to_add) {
+ _rs_metas.emplace(rs_to_add->version(), rs_to_add);
+ }
_check_mow_rowset_cache_version_size(rowset_cache_version_size);
}
@@ -1018,7 +1010,10 @@ void TabletMeta::modify_rs_metas(const
std::vector<RowsetMetaSharedPtr>& to_add,
void TabletMeta::revise_rs_metas(std::vector<RowsetMetaSharedPtr>&& rs_metas) {
{
std::lock_guard<std::shared_mutex> wrlock(_meta_lock);
- _rs_metas = std::move(rs_metas);
+ _rs_metas.clear();
+ for (auto& rs_meta : rs_metas) {
+ _rs_metas.emplace(rs_meta->version(), rs_meta);
+ }
_stale_rs_metas.clear();
}
if (_enable_unique_key_merge_on_write) {
@@ -1033,13 +1028,13 @@ void
TabletMeta::revise_rs_metas(std::vector<RowsetMetaSharedPtr>&& rs_metas) {
// TabletMeta's _meta_lock
void TabletMeta::revise_delete_bitmap_unlocked(const DeleteBitmap&
delete_bitmap) {
_delete_bitmap = std::make_unique<DeleteBitmap>(tablet_id());
- for (auto rs : _rs_metas) {
+ for (const auto& [_, rs] : _rs_metas) {
DeleteBitmap rs_bm(tablet_id());
delete_bitmap.subset({rs->rowset_id(), 0, 0}, {rs->rowset_id(),
UINT32_MAX, INT64_MAX},
&rs_bm);
_delete_bitmap->merge(rs_bm);
}
- for (auto rs : _stale_rs_metas) {
+ for (const auto& [_, rs] : _stale_rs_metas) {
DeleteBitmap rs_bm(tablet_id());
delete_bitmap.subset({rs->rowset_id(), 0, 0}, {rs->rowset_id(),
UINT32_MAX, INT64_MAX},
&rs_bm);
@@ -1048,30 +1043,19 @@ void TabletMeta::revise_delete_bitmap_unlocked(const
DeleteBitmap& delete_bitmap
}
void TabletMeta::delete_stale_rs_meta_by_version(const Version& version) {
- auto it = _stale_rs_metas.begin();
- while (it != _stale_rs_metas.end()) {
- if ((*it)->version() == version) {
- it = _stale_rs_metas.erase(it);
- } else {
- it++;
- }
- }
+ _stale_rs_metas.erase(version);
}
RowsetMetaSharedPtr TabletMeta::acquire_rs_meta_by_version(const Version&
version) const {
- for (auto it : _rs_metas) {
- if (it->version() == version) {
- return it;
- }
+ if (auto it = _rs_metas.find(version); it != _rs_metas.end()) {
+ return it->second;
}
return nullptr;
}
RowsetMetaSharedPtr TabletMeta::acquire_stale_rs_meta_by_version(const
Version& version) const {
- for (auto it : _stale_rs_metas) {
- if (it->version() == version) {
- return it;
- }
+ if (auto it = _stale_rs_metas.find(version); it != _stale_rs_metas.end()) {
+ return it->second;
}
return nullptr;
}
@@ -1107,10 +1091,10 @@ void
TabletMeta::_check_mow_rowset_cache_version_size(size_t rowset_cache_versio
std::set<std::string> tablet_rowset_ids;
{
std::shared_lock rlock(_meta_lock);
- for (auto& rs_meta : _rs_metas) {
+ for (const auto& [_, rs_meta] : _rs_metas) {
tablet_rowset_ids.emplace(rs_meta->rowset_id().to_string());
}
- for (auto& rs_meta : _stale_rs_metas) {
+ for (const auto& [_, rs_meta] : _stale_rs_metas) {
tablet_rowset_ids.emplace(rs_meta->rowset_id().to_string());
}
}
@@ -1143,10 +1127,7 @@ bool operator==(const TabletMeta& a, const TabletMeta&
b) {
if (a._tablet_type != b._tablet_type) return false;
if (a._tablet_state != b._tablet_state) return false;
if (*a._schema != *b._schema) return false;
- if (a._rs_metas.size() != b._rs_metas.size()) return false;
- for (int i = 0; i < a._rs_metas.size(); ++i) {
- if (a._rs_metas[i] != b._rs_metas[i]) return false;
- }
+ if (a._rs_metas != b._rs_metas) return false;
if (a._in_restore_mode != b._in_restore_mode) return false;
if (a._preferred_rowset_type != b._preferred_rowset_type) return false;
if (a._storage_policy_id != b._storage_policy_id) return false;
diff --git a/be/src/olap/tablet_meta.h b/be/src/olap/tablet_meta.h
index d858d577bc3..a8f35520782 100644
--- a/be/src/olap/tablet_meta.h
+++ b/be/src/olap/tablet_meta.h
@@ -193,8 +193,8 @@ public:
TabletSchema* mutable_tablet_schema();
- const std::vector<RowsetMetaSharedPtr>& all_rs_metas() const;
- std::vector<RowsetMetaSharedPtr>& all_mutable_rs_metas();
+ const RowsetMetaMapContainer& all_rs_metas() const;
+ RowsetMetaMapContainer& all_mutable_rs_metas();
Status add_rs_meta(const RowsetMetaSharedPtr& rs_meta);
void delete_rs_meta_by_version(const Version& version,
std::vector<RowsetMetaSharedPtr>*
deleted_rs_metas);
@@ -206,7 +206,7 @@ public:
void revise_rs_metas(std::vector<RowsetMetaSharedPtr>&& rs_metas);
void revise_delete_bitmap_unlocked(const DeleteBitmap& delete_bitmap);
- const std::vector<RowsetMetaSharedPtr>& all_stale_rs_metas() const;
+ const RowsetMetaMapContainer& all_stale_rs_metas() const;
RowsetMetaSharedPtr acquire_rs_meta_by_version(const Version& version)
const;
void delete_stale_rs_meta_by_version(const Version& version);
RowsetMetaSharedPtr acquire_stale_rs_meta_by_version(const Version&
version) const;
@@ -336,11 +336,11 @@ private:
TabletSchemaSPtr _schema;
Cache::Handle* _handle = nullptr;
- std::vector<RowsetMetaSharedPtr> _rs_metas;
+ RowsetMetaMapContainer _rs_metas;
// This variable _stale_rs_metas is used to record these rowsets‘ meta
which are be compacted.
// These stale rowsets meta are been removed when rowsets' pathVersion is
expired,
// this policy is judged and computed by TimestampedVersionTracker.
- std::vector<RowsetMetaSharedPtr> _stale_rs_metas;
+ RowsetMetaMapContainer _stale_rs_metas;
bool _in_restore_mode = false;
RowsetTypePB _preferred_rowset_type = BETA_ROWSET;
@@ -670,7 +670,7 @@ inline void TabletMeta::set_cumulative_layer_point(int64_t
new_point) {
inline size_t TabletMeta::num_rows() const {
size_t num_rows = 0;
- for (auto& rs : _rs_metas) {
+ for (const auto& [_, rs] : _rs_metas) {
num_rows += rs->num_rows();
}
return num_rows;
@@ -678,7 +678,7 @@ inline size_t TabletMeta::num_rows() const {
inline size_t TabletMeta::tablet_footprint() const {
size_t total_size = 0;
- for (auto& rs : _rs_metas) {
+ for (const auto& [_, rs] : _rs_metas) {
total_size += rs->total_disk_size();
}
return total_size;
@@ -686,7 +686,7 @@ inline size_t TabletMeta::tablet_footprint() const {
inline size_t TabletMeta::tablet_local_size() const {
size_t total_size = 0;
- for (auto& rs : _rs_metas) {
+ for (const auto& [_, rs] : _rs_metas) {
if (rs->is_local()) {
total_size += rs->total_disk_size();
}
@@ -696,7 +696,7 @@ inline size_t TabletMeta::tablet_local_size() const {
inline size_t TabletMeta::tablet_remote_size() const {
size_t total_size = 0;
- for (auto& rs : _rs_metas) {
+ for (const auto& [_, rs] : _rs_metas) {
if (!rs->is_local()) {
total_size += rs->total_disk_size();
}
@@ -706,7 +706,7 @@ inline size_t TabletMeta::tablet_remote_size() const {
inline size_t TabletMeta::tablet_local_index_size() const {
size_t total_size = 0;
- for (auto& rs : _rs_metas) {
+ for (const auto& [_, rs] : _rs_metas) {
if (rs->is_local()) {
total_size += rs->index_disk_size();
}
@@ -716,7 +716,7 @@ inline size_t TabletMeta::tablet_local_index_size() const {
inline size_t TabletMeta::tablet_local_segment_size() const {
size_t total_size = 0;
- for (auto& rs : _rs_metas) {
+ for (const auto& [_, rs] : _rs_metas) {
if (rs->is_local()) {
total_size += rs->data_disk_size();
}
@@ -726,7 +726,7 @@ inline size_t TabletMeta::tablet_local_segment_size() const
{
inline size_t TabletMeta::tablet_remote_index_size() const {
size_t total_size = 0;
- for (auto& rs : _rs_metas) {
+ for (const auto& [_, rs] : _rs_metas) {
if (!rs->is_local()) {
total_size += rs->index_disk_size();
}
@@ -736,7 +736,7 @@ inline size_t TabletMeta::tablet_remote_index_size() const {
inline size_t TabletMeta::tablet_remote_segment_size() const {
size_t total_size = 0;
- for (auto& rs : _rs_metas) {
+ for (const auto& [_, rs] : _rs_metas) {
if (!rs->is_local()) {
total_size += rs->data_disk_size();
}
@@ -776,25 +776,25 @@ inline TabletSchema* TabletMeta::mutable_tablet_schema() {
return _schema.get();
}
-inline const std::vector<RowsetMetaSharedPtr>& TabletMeta::all_rs_metas()
const {
+inline const RowsetMetaMapContainer& TabletMeta::all_rs_metas() const {
return _rs_metas;
}
-inline std::vector<RowsetMetaSharedPtr>& TabletMeta::all_mutable_rs_metas() {
+inline RowsetMetaMapContainer& TabletMeta::all_mutable_rs_metas() {
return _rs_metas;
}
-inline const std::vector<RowsetMetaSharedPtr>&
TabletMeta::all_stale_rs_metas() const {
+inline const RowsetMetaMapContainer& TabletMeta::all_stale_rs_metas() const {
return _stale_rs_metas;
}
inline bool TabletMeta::all_beta() const {
- for (auto& rs : _rs_metas) {
+ for (const auto& [_, rs] : _rs_metas) {
if (rs->rowset_type() != RowsetTypePB::BETA_ROWSET) {
return false;
}
}
- for (auto& rs : _stale_rs_metas) {
+ for (const auto& [_, rs] : _stale_rs_metas) {
if (rs->rowset_type() != RowsetTypePB::BETA_ROWSET) {
return false;
}
diff --git a/be/src/olap/task/engine_clone_task.cpp
b/be/src/olap/task/engine_clone_task.cpp
index db0ad79f51f..a3d6c5acb66 100644
--- a/be/src/olap/task/engine_clone_task.cpp
+++ b/be/src/olap/task/engine_clone_task.cpp
@@ -960,7 +960,7 @@ Status EngineCloneTask::_finish_full_clone(Tablet* tablet,
}
to_add.reserve(cloned_tablet_meta->all_rs_metas().size());
- for (auto& rs_meta : cloned_tablet_meta->all_rs_metas()) {
+ for (const auto& [_, rs_meta] : cloned_tablet_meta->all_rs_metas()) {
RowsetSharedPtr rs;
RETURN_IF_ERROR(tablet->create_rowset(rs_meta, &rs));
to_add.push_back(std::move(rs));
diff --git a/be/src/olap/version_graph.cpp b/be/src/olap/version_graph.cpp
index 1894e0953d3..8c10dfe2ee8 100644
--- a/be/src/olap/version_graph.cpp
+++ b/be/src/olap/version_graph.cpp
@@ -27,6 +27,7 @@
#include <memory>
#include <optional>
#include <ostream>
+#include <ranges>
#include <utility>
#include "common/logging.h"
@@ -36,146 +37,14 @@ namespace doris {
using namespace ErrorCode;
-void TimestampedVersionTracker::_construct_versioned_tracker(
- const std::vector<RowsetMetaSharedPtr>& rs_metas) {
- int64_t max_version = 0;
-
- // construct the rowset graph
- _version_graph.reconstruct_version_graph(rs_metas, &max_version);
-}
-
void TimestampedVersionTracker::construct_versioned_tracker(
- const std::vector<RowsetMetaSharedPtr>& rs_metas) {
- if (rs_metas.empty()) {
- VLOG_NOTICE << "there is no version in the header.";
- return;
- }
- _stale_version_path_map.clear();
- _next_path_id = 1;
- _construct_versioned_tracker(rs_metas);
+ const RowsetMetaMapContainer& rs_metas) {
+ construct_versioned_tracker(std::views::values(rs_metas));
}
void TimestampedVersionTracker::construct_versioned_tracker(
- const std::vector<RowsetMetaSharedPtr>& rs_metas,
- const std::vector<RowsetMetaSharedPtr>& stale_metas) {
- if (rs_metas.empty()) {
- VLOG_NOTICE << "there is no version in the header.";
- return;
- }
- _stale_version_path_map.clear();
- _next_path_id = 1;
- _construct_versioned_tracker(rs_metas);
-
- // Init `_stale_version_path_map`.
- _init_stale_version_path_map(rs_metas, stale_metas);
-}
-
-void TimestampedVersionTracker::_init_stale_version_path_map(
- const std::vector<RowsetMetaSharedPtr>& rs_metas,
- const std::vector<RowsetMetaSharedPtr>& stale_metas) {
- if (stale_metas.empty()) {
- return;
- }
-
- // Sort stale meta by version diff (second version - first version).
- std::list<RowsetMetaSharedPtr> sorted_stale_metas;
- for (auto& rs : stale_metas) {
- sorted_stale_metas.emplace_back(rs);
- }
-
- // 1. sort the existing rowsets by version in ascending order.
- sorted_stale_metas.sort([](const RowsetMetaSharedPtr& a, const
RowsetMetaSharedPtr& b) {
- // Compare by version diff between `version.first` and
`version.second`.
- int64_t a_diff = a->version().second - a->version().first;
- int64_t b_diff = b->version().second - b->version().first;
-
- int64_t diff = a_diff - b_diff;
- if (diff < 0) {
- return true;
- } else if (diff > 0) {
- return false;
- }
- // When the version diff is equal, compare the rowset`s stale time
- return a->stale_at() < b->stale_at();
- });
-
- // first_version -> (second_version -> rowset_meta)
- std::unordered_map<int64_t, std::unordered_map<int64_t,
RowsetMetaSharedPtr>> stale_map;
-
- // 2. generate stale path from stale_metas. traverse sorted_stale_metas
and each time add stale_meta to stale_map.
- // when a stale path in stale_map can replace stale_meta in
sorted_stale_metas, stale_map remove rowset_metas of a stale path
- // and add the path to `_stale_version_path_map`.
- for (auto& stale_meta : sorted_stale_metas) {
- std::vector<RowsetMetaSharedPtr> stale_path;
- // 2.1 find a path in `stale_map` can replace current `stale_meta`
version.
- bool r = _find_path_from_stale_map(stale_map,
stale_meta->start_version(),
- stale_meta->end_version(),
&stale_path);
-
- // 2.2 add version to `version_graph`.
- Version stale_meta_version = stale_meta->version();
- add_version(stale_meta_version);
-
- // 2.3 find the path.
- if (r) {
- // Add the path to `_stale_version_path_map`.
- add_stale_path_version(stale_path);
- // Remove `stale_path` from `stale_map`.
- for (auto stale_item : stale_path) {
-
stale_map[stale_item->start_version()].erase(stale_item->end_version());
-
- if (stale_map[stale_item->start_version()].empty()) {
- stale_map.erase(stale_item->start_version());
- }
- }
- }
-
- // 2.4 add `stale_meta` to `stale_map`.
- auto start_iter = stale_map.find(stale_meta->start_version());
- if (start_iter != stale_map.end()) {
- start_iter->second[stale_meta->end_version()] = stale_meta;
- } else {
- std::unordered_map<int64_t, RowsetMetaSharedPtr> item;
- item[stale_meta->end_version()] = stale_meta;
- stale_map[stale_meta->start_version()] = std::move(item);
- }
- }
-
- // 3. generate stale path from `rs_metas`.
- for (auto& stale_meta : rs_metas) {
- std::vector<RowsetMetaSharedPtr> stale_path;
- // 3.1 find a path in stale_map can replace current `stale_meta`
version.
- bool r = _find_path_from_stale_map(stale_map,
stale_meta->start_version(),
- stale_meta->end_version(),
&stale_path);
-
- // 3.2 find the path.
- if (r) {
- // Add the path to `_stale_version_path_map`.
- add_stale_path_version(stale_path);
- // Remove `stale_path` from `stale_map`.
- for (auto stale_item : stale_path) {
-
stale_map[stale_item->start_version()].erase(stale_item->end_version());
-
- if (stale_map[stale_item->start_version()].empty()) {
- stale_map.erase(stale_item->start_version());
- }
- }
- }
- }
-
- // 4. process remain stale `rowset_meta` in `stale_map`.
- auto map_iter = stale_map.begin();
- while (map_iter != stale_map.end()) {
- auto second_iter = map_iter->second.begin();
- while (second_iter != map_iter->second.end()) {
- // Each remain stale `rowset_meta` generate a stale path.
- std::vector<RowsetMetaSharedPtr> stale_path;
- stale_path.push_back(second_iter->second);
- add_stale_path_version(stale_path);
-
- second_iter++;
- }
- map_iter++;
- }
+ const RowsetMetaMapContainer& rs_metas, const RowsetMetaMapContainer&
stale_metas) {
+ construct_versioned_tracker(std::views::values(rs_metas),
std::views::values(stale_metas));
}
bool TimestampedVersionTracker::_find_path_from_stale_map(
@@ -451,64 +320,14 @@ std::vector<TimestampedVersionSharedPtr>&
TimestampedVersionPathContainer::times
return _timestamped_versions_container;
}
-void VersionGraph::construct_version_graph(const
std::vector<RowsetMetaSharedPtr>& rs_metas,
+void VersionGraph::construct_version_graph(const RowsetMetaMapContainer&
rs_metas,
int64_t* max_version) {
- if (rs_metas.empty()) {
- VLOG_NOTICE << "there is no version in the header.";
- return;
- }
-
- // Distill vertex values from versions in TabletMeta.
- std::vector<int64_t> vertex_values;
- vertex_values.reserve(2 * rs_metas.size());
-
- for (size_t i = 0; i < rs_metas.size(); ++i) {
- vertex_values.push_back(rs_metas[i]->start_version());
- vertex_values.push_back(rs_metas[i]->end_version() + 1);
- if (max_version != nullptr and *max_version <
rs_metas[i]->end_version()) {
- *max_version = rs_metas[i]->end_version();
- }
- }
- std::sort(vertex_values.begin(), vertex_values.end());
-
- // Items in `vertex_values` are sorted, but not unique.
- // we choose unique items in `vertex_values` to create vertexes.
- int64_t last_vertex_value = -1;
- for (size_t i = 0; i < vertex_values.size(); ++i) {
- if (i != 0 && vertex_values[i] == last_vertex_value) {
- continue;
- }
-
- // Add vertex to graph.
- _add_vertex_to_graph(vertex_values[i]);
- last_vertex_value = vertex_values[i];
- }
- // Create edges for version graph according to TabletMeta's versions.
- for (size_t i = 0; i < rs_metas.size(); ++i) {
- // Versions in header are unique.
- // We ensure `_vertex_index_map` has its `start_version`.
- int64_t start_vertex_index =
_vertex_index_map[rs_metas[i]->start_version()];
- int64_t end_vertex_index =
_vertex_index_map[rs_metas[i]->end_version() + 1];
- // Add one edge from `start_version` to `end_version`.
- _version_graph[start_vertex_index].edges.push_front(end_vertex_index);
- // Add reverse edge from `end_version` to `start_version`.
- _version_graph[end_vertex_index].edges.push_front(start_vertex_index);
- }
-
- // Sort edges by version in descending order.
- for (auto& vertex : _version_graph) {
- vertex.edges.sort([this](const int& vertex_idx_a, const int&
vertex_idx_b) {
- return _version_graph[vertex_idx_a].value >
_version_graph[vertex_idx_b].value;
- });
- }
+ construct_version_graph(std::views::values(rs_metas), max_version);
}
-void VersionGraph::reconstruct_version_graph(const
std::vector<RowsetMetaSharedPtr>& rs_metas,
+void VersionGraph::reconstruct_version_graph(const RowsetMetaMapContainer&
rs_metas,
int64_t* max_version) {
- _version_graph.clear();
- _vertex_index_map.clear();
-
- construct_version_graph(rs_metas, max_version);
+ reconstruct_version_graph(std::views::values(rs_metas), max_version);
}
void VersionGraph::add_version_to_graph(const Version& version) {
diff --git a/be/src/olap/version_graph.h b/be/src/olap/version_graph.h
index 4c65d920861..a61a7446add 100644
--- a/be/src/olap/version_graph.h
+++ b/be/src/olap/version_graph.h
@@ -32,6 +32,10 @@
#include "olap/rowset/rowset_meta.h"
namespace doris {
+
+template <typename R>
+concept RowsetMetaSPtrRange = std::same_as<std::ranges::range_value_t<R>,
RowsetMetaSharedPtr> &&
+ std::ranges::sized_range<R> &&
std::ranges::forward_range<R>;
/// VersionGraph class which is implemented to build and maintain total
versions of rowsets.
/// This class use adjacency-matrix represent rowsets version and links. A
vertex is a version
/// and a link is the _version object of a rowset (from start version to end
version + 1).
@@ -41,11 +45,11 @@ class VersionGraph {
public:
/// Use rs_metas to construct the graph including vertex and edges, and
return the
/// max_version in metas.
- void construct_version_graph(const std::vector<RowsetMetaSharedPtr>&
rs_metas,
- int64_t* max_version);
+ void construct_version_graph(RowsetMetaSPtrRange auto&& rs_metas, int64_t*
max_version);
+ void construct_version_graph(const RowsetMetaMapContainer& rs_metas,
int64_t* max_version);
/// Reconstruct the graph, begin construction the vertex vec and edges
list will be cleared.
- void reconstruct_version_graph(const std::vector<RowsetMetaSharedPtr>&
rs_metas,
- int64_t* max_version);
+ void reconstruct_version_graph(RowsetMetaSPtrRange auto&&, int64_t*
max_version);
+ void reconstruct_version_graph(const RowsetMetaMapContainer& rs_metas,
int64_t* max_version);
/// Add a version to this graph, graph will add the version and edge in
version.
void add_version_to_graph(const Version& version);
/// Delete a version from graph. Notice that this del operation only
remove this edges and
@@ -171,11 +175,14 @@ using PathVersionListSharedPtr =
std::shared_ptr<TimestampedVersionPathContainer
class TimestampedVersionTracker {
public:
/// Construct rowsets version tracker by main path rowset meta.
- void construct_versioned_tracker(const std::vector<RowsetMetaSharedPtr>&
rs_metas);
+ void construct_versioned_tracker(RowsetMetaSPtrRange auto&& rs_metas);
+ void construct_versioned_tracker(const RowsetMetaMapContainer& rs_metas);
/// Construct rowsets version tracker by main path rowset meta and stale
rowset meta.
- void construct_versioned_tracker(const std::vector<RowsetMetaSharedPtr>&
rs_metas,
- const std::vector<RowsetMetaSharedPtr>&
stale_metas);
+ void construct_versioned_tracker(RowsetMetaSPtrRange auto&& rs_metas,
+ RowsetMetaSPtrRange auto&& stale_metas);
+ void construct_versioned_tracker(const RowsetMetaMapContainer& rs_metas,
+ const RowsetMetaMapContainer&
stale_metas);
/// Recover rowsets version tracker from stale version path map. When
delete operation fails, the
/// tracker can be recovered from deleted stale_version_path_map.
@@ -258,11 +265,11 @@ public:
private:
/// Construct rowsets version tracker with main path rowset meta.
- void _construct_versioned_tracker(const std::vector<RowsetMetaSharedPtr>&
rs_metas);
+ void _construct_versioned_tracker(RowsetMetaSPtrRange auto&& rs_metas);
/// init stale_version_path_map by main path rowset meta and stale rowset
meta.
- void _init_stale_version_path_map(const std::vector<RowsetMetaSharedPtr>&
rs_metas,
- const std::vector<RowsetMetaSharedPtr>&
stale_metas);
+ void _init_stale_version_path_map(RowsetMetaSPtrRange auto&& rs_metas,
+ RowsetMetaSPtrRange auto&& stale_metas);
/// find a path in stale_map from first_version to second_version,
stale_path is used as result.
bool _find_path_from_stale_map(
@@ -283,4 +290,202 @@ private:
VersionGraph _version_graph;
};
+void VersionGraph::reconstruct_version_graph(RowsetMetaSPtrRange auto&&
rs_metas,
+ int64_t* max_version) {
+ _version_graph.clear();
+ _vertex_index_map.clear();
+
+ construct_version_graph(rs_metas, max_version);
+}
+
+void VersionGraph::construct_version_graph(RowsetMetaSPtrRange auto&& rs_metas,
+ int64_t* max_version) {
+ if (std::ranges::empty(rs_metas)) {
+ VLOG_NOTICE << "there is no version in the header.";
+ return;
+ }
+
+ // Distill vertex values from versions in TabletMeta.
+ std::vector<int64_t> vertex_values;
+ vertex_values.reserve(2 * std::ranges::size(rs_metas));
+
+ for (const auto& rs : rs_metas) {
+ vertex_values.push_back(rs->start_version());
+ vertex_values.push_back(rs->end_version() + 1);
+ if (max_version != nullptr and *max_version < rs->end_version()) {
+ *max_version = rs->end_version();
+ }
+ }
+ std::sort(vertex_values.begin(), vertex_values.end());
+
+ // Items in `vertex_values` are sorted, but not unique.
+ // we choose unique items in `vertex_values` to create vertexes.
+ int64_t last_vertex_value = -1;
+ for (size_t i = 0; i < vertex_values.size(); ++i) {
+ if (i != 0 && vertex_values[i] == last_vertex_value) {
+ continue;
+ }
+
+ // Add vertex to graph.
+ _add_vertex_to_graph(vertex_values[i]);
+ last_vertex_value = vertex_values[i];
+ }
+ // Create edges for version graph according to TabletMeta's versions.
+ for (const auto& rs : rs_metas) {
+ // Versions in header are unique.
+ // We ensure `_vertex_index_map` has its `start_version`.
+ int64_t start_vertex_index = _vertex_index_map[rs->start_version()];
+ int64_t end_vertex_index = _vertex_index_map[rs->end_version() + 1];
+ // Add one edge from `start_version` to `end_version`.
+ _version_graph[start_vertex_index].edges.push_front(end_vertex_index);
+ // Add reverse edge from `end_version` to `start_version`.
+ _version_graph[end_vertex_index].edges.push_front(start_vertex_index);
+ }
+
+ // Sort edges by version in descending order.
+ for (auto& vertex : _version_graph) {
+ vertex.edges.sort([this](const int& vertex_idx_a, const int&
vertex_idx_b) {
+ return _version_graph[vertex_idx_a].value >
_version_graph[vertex_idx_b].value;
+ });
+ }
+}
+
+void
TimestampedVersionTracker::_construct_versioned_tracker(RowsetMetaSPtrRange
auto&& rs_metas) {
+ int64_t max_version = 0;
+
+ // construct the rowset graph
+ _version_graph.reconstruct_version_graph(rs_metas, &max_version);
+}
+
+void
TimestampedVersionTracker::construct_versioned_tracker(RowsetMetaSPtrRange
auto&& rs_metas) {
+ if (std::ranges::empty(rs_metas)) {
+ VLOG_NOTICE << "there is no version in the header.";
+ return;
+ }
+ _stale_version_path_map.clear();
+ _next_path_id = 1;
+ _construct_versioned_tracker(rs_metas);
+}
+
+void TimestampedVersionTracker::construct_versioned_tracker(
+ RowsetMetaSPtrRange auto&& rs_metas, RowsetMetaSPtrRange auto&&
stale_metas) {
+ if (std::ranges::empty(rs_metas)) {
+ VLOG_NOTICE << "there is no version in the header.";
+ return;
+ }
+ _stale_version_path_map.clear();
+ _next_path_id = 1;
+ _construct_versioned_tracker(rs_metas);
+
+ // Init `_stale_version_path_map`.
+ _init_stale_version_path_map(rs_metas, stale_metas);
+}
+
+void TimestampedVersionTracker::_init_stale_version_path_map(
+ RowsetMetaSPtrRange auto&& rs_metas, RowsetMetaSPtrRange auto&&
stale_metas) {
+ if (std::ranges::empty(stale_metas)) {
+ return;
+ }
+
+ // Sort stale meta by version diff (second version - first version).
+ std::list<RowsetMetaSharedPtr> sorted_stale_metas;
+ for (const auto& rs : stale_metas) {
+ sorted_stale_metas.emplace_back(rs);
+ }
+
+ // 1. sort the existing rowsets by version in ascending order.
+ sorted_stale_metas.sort([](const RowsetMetaSharedPtr& a, const
RowsetMetaSharedPtr& b) {
+ // Compare by version diff between `version.first` and
`version.second`.
+ int64_t a_diff = a->version().second - a->version().first;
+ int64_t b_diff = b->version().second - b->version().first;
+
+ int64_t diff = a_diff - b_diff;
+ if (diff < 0) {
+ return true;
+ } else if (diff > 0) {
+ return false;
+ }
+ // When the version diff is equal, compare the rowset`s stale time
+ return a->stale_at() < b->stale_at();
+ });
+
+ // first_version -> (second_version -> rowset_meta)
+ std::unordered_map<int64_t, std::unordered_map<int64_t,
RowsetMetaSharedPtr>> stale_map;
+
+ // 2. generate stale path from stale_metas. traverse sorted_stale_metas
and each time add stale_meta to stale_map.
+ // when a stale path in stale_map can replace stale_meta in
sorted_stale_metas, stale_map remove rowset_metas of a stale path
+ // and add the path to `_stale_version_path_map`.
+ for (auto& stale_meta : sorted_stale_metas) {
+ std::vector<RowsetMetaSharedPtr> stale_path;
+ // 2.1 find a path in `stale_map` can replace current `stale_meta`
version.
+ bool r = _find_path_from_stale_map(stale_map,
stale_meta->start_version(),
+ stale_meta->end_version(),
&stale_path);
+
+ // 2.2 add version to `version_graph`.
+ Version stale_meta_version = stale_meta->version();
+ add_version(stale_meta_version);
+
+ // 2.3 find the path.
+ if (r) {
+ // Add the path to `_stale_version_path_map`.
+ add_stale_path_version(stale_path);
+ // Remove `stale_path` from `stale_map`.
+ for (auto stale_item : stale_path) {
+
stale_map[stale_item->start_version()].erase(stale_item->end_version());
+
+ if (stale_map[stale_item->start_version()].empty()) {
+ stale_map.erase(stale_item->start_version());
+ }
+ }
+ }
+
+ // 2.4 add `stale_meta` to `stale_map`.
+ auto start_iter = stale_map.find(stale_meta->start_version());
+ if (start_iter != stale_map.end()) {
+ start_iter->second[stale_meta->end_version()] = stale_meta;
+ } else {
+ std::unordered_map<int64_t, RowsetMetaSharedPtr> item;
+ item[stale_meta->end_version()] = stale_meta;
+ stale_map[stale_meta->start_version()] = std::move(item);
+ }
+ }
+
+ // 3. generate stale path from `rs_metas`.
+ for (const auto& stale_meta : rs_metas) {
+ std::vector<RowsetMetaSharedPtr> stale_path;
+ // 3.1 find a path in stale_map can replace current `stale_meta`
version.
+ bool r = _find_path_from_stale_map(stale_map,
stale_meta->start_version(),
+ stale_meta->end_version(),
&stale_path);
+
+ // 3.2 find the path.
+ if (r) {
+ // Add the path to `_stale_version_path_map`.
+ add_stale_path_version(stale_path);
+ // Remove `stale_path` from `stale_map`.
+ for (auto stale_item : stale_path) {
+
stale_map[stale_item->start_version()].erase(stale_item->end_version());
+
+ if (stale_map[stale_item->start_version()].empty()) {
+ stale_map.erase(stale_item->start_version());
+ }
+ }
+ }
+ }
+
+ // 4. process remain stale `rowset_meta` in `stale_map`.
+ auto map_iter = stale_map.begin();
+ while (map_iter != stale_map.end()) {
+ auto second_iter = map_iter->second.begin();
+ while (second_iter != map_iter->second.end()) {
+ // Each remain stale `rowset_meta` generate a stale path.
+ std::vector<RowsetMetaSharedPtr> stale_path;
+ stale_path.push_back(second_iter->second);
+ add_stale_path_version(stale_path);
+
+ second_iter++;
+ }
+ map_iter++;
+ }
+}
+
} // namespace doris
diff --git a/be/test/cloud/cloud_meta_mgr_test.cpp
b/be/test/cloud/cloud_meta_mgr_test.cpp
index 39e21105d2b..df3df147959 100644
--- a/be/test/cloud/cloud_meta_mgr_test.cpp
+++ b/be/test/cloud/cloud_meta_mgr_test.cpp
@@ -145,7 +145,7 @@ TEST_F(CloudMetaMgrTest, test_fill_version_holes_no_holes) {
// Verify tablet still has the same number of rowsets (no holes to fill)
EXPECT_EQ(tablet->tablet_meta()->all_rs_metas().size(), 5);
// Verify rows number is correct
- for (const auto& rs_meta : tablet->tablet_meta()->all_rs_metas()) {
+ for (const auto& [_, rs_meta] : tablet->tablet_meta()->all_rs_metas()) {
EXPECT_EQ(rs_meta->num_rows(), 100);
}
}
@@ -203,7 +203,7 @@ TEST_F(CloudMetaMgrTest,
test_fill_version_holes_with_holes) {
// Verify all versions are present
auto rs_metas = tablet->tablet_meta()->all_rs_metas();
std::set<int64_t> found_versions;
- for (const auto& rs_meta : rs_metas) {
+ for (const auto& [_, rs_meta] : rs_metas) {
found_versions.insert(rs_meta->version().first);
}
EXPECT_EQ(found_versions.size(), 5);
@@ -214,7 +214,7 @@ TEST_F(CloudMetaMgrTest,
test_fill_version_holes_with_holes) {
EXPECT_TRUE(found_versions.contains(4));
// Verify the hole rowsets (versions 1 and 3) are empty
- for (const auto& rs_meta : rs_metas) {
+ for (const auto& [_, rs_meta] : rs_metas) {
if (rs_meta->version().first == 1 || rs_meta->version().first == 3) {
EXPECT_TRUE(rs_meta->empty());
EXPECT_EQ(rs_meta->num_rows(), 0);
@@ -379,7 +379,7 @@ TEST_F(CloudMetaMgrTest,
test_fill_version_holes_trailing_holes) {
// Verify all versions are present
auto rs_metas = tablet->tablet_meta()->all_rs_metas();
std::set<int64_t> found_versions;
- for (const auto& rs_meta : rs_metas) {
+ for (const auto& [_, rs_meta] : rs_metas) {
found_versions.insert(rs_meta->version().first);
}
EXPECT_EQ(found_versions.size(), 6);
@@ -388,7 +388,7 @@ TEST_F(CloudMetaMgrTest,
test_fill_version_holes_trailing_holes) {
}
// Verify the trailing hole rowsets (versions 3, 4, 5) are empty
- for (const auto& rs_meta : rs_metas) {
+ for (const auto& [_, rs_meta] : rs_metas) {
if (rs_meta->version().first >= 3) {
EXPECT_TRUE(rs_meta->empty())
<< "Version " << rs_meta->version().first << " should be
empty";
@@ -454,7 +454,7 @@ TEST_F(CloudMetaMgrTest,
test_fill_version_holes_single_hole) {
// Verify all versions are present
auto rs_metas = tablet->tablet_meta()->all_rs_metas();
std::set<int64_t> found_versions;
- for (const auto& rs_meta : rs_metas) {
+ for (const auto& [_, rs_meta] : rs_metas) {
found_versions.insert(rs_meta->version().first);
}
EXPECT_EQ(found_versions.size(), 3);
@@ -463,7 +463,7 @@ TEST_F(CloudMetaMgrTest,
test_fill_version_holes_single_hole) {
EXPECT_TRUE(found_versions.contains(2));
// Verify the hole rowset (version 1) is empty
- for (const auto& rs_meta : rs_metas) {
+ for (const auto& [_, rs_meta] : rs_metas) {
if (rs_meta->version().first == 1) {
EXPECT_TRUE(rs_meta->empty());
EXPECT_EQ(rs_meta->num_rows(), 0);
@@ -527,7 +527,7 @@ TEST_F(CloudMetaMgrTest,
test_fill_version_holes_multiple_consecutive_holes) {
// Verify all versions are present
auto rs_metas = tablet->tablet_meta()->all_rs_metas();
std::set<int64_t> found_versions;
- for (const auto& rs_meta : rs_metas) {
+ for (const auto& [_, rs_meta] : rs_metas) {
found_versions.insert(rs_meta->version().first);
}
EXPECT_EQ(found_versions.size(), 6);
@@ -536,7 +536,7 @@ TEST_F(CloudMetaMgrTest,
test_fill_version_holes_multiple_consecutive_holes) {
}
// Verify the hole rowsets (versions 1, 2, 3, 4) are empty
- for (const auto& rs_meta : rs_metas) {
+ for (const auto& [_, rs_meta] : rs_metas) {
if (rs_meta->version().first >= 1 && rs_meta->version().first <= 4) {
EXPECT_TRUE(rs_meta->empty())
<< "Version " << rs_meta->version().first << " should be
empty";
@@ -602,7 +602,7 @@ TEST_F(CloudMetaMgrTest,
test_fill_version_holes_mixed_holes) {
// Verify all versions are present
auto rs_metas = tablet->tablet_meta()->all_rs_metas();
std::set<int64_t> found_versions;
- for (const auto& rs_meta : rs_metas) {
+ for (const auto& [_, rs_meta] : rs_metas) {
found_versions.insert(rs_meta->version().first);
}
EXPECT_EQ(found_versions.size(), 9);
@@ -613,7 +613,7 @@ TEST_F(CloudMetaMgrTest,
test_fill_version_holes_mixed_holes) {
// Verify the hole rowsets (versions 1, 3, 4, 7, 8) are empty
std::set<int64_t> original_versions = {0, 2, 5, 6};
std::set<int64_t> hole_versions = {1, 3, 4, 7, 8};
- for (const auto& rs_meta : rs_metas) {
+ for (const auto& [_, rs_meta] : rs_metas) {
int64_t version = rs_meta->version().first;
if (hole_versions.contains(version)) {
EXPECT_TRUE(rs_meta->empty()) << "Version " << version << " should
be empty";
diff --git a/be/test/olap/compaction_delete_bitmap_calculator_test.cpp
b/be/test/olap/compaction_delete_bitmap_calculator_test.cpp
index f20609a6d03..7f6c79595be 100644
--- a/be/test/olap/compaction_delete_bitmap_calculator_test.cpp
+++ b/be/test/olap/compaction_delete_bitmap_calculator_test.cpp
@@ -240,7 +240,7 @@ TEST_F(CompactionDeleteBitmapCalculatorTest, test) {
// publish rowset 1
DeleteBitmapPtr delete_bitmap =
std::make_shared<DeleteBitmap>(_tablet->tablet_id());
RowsetIdUnorderedSet set;
- set.insert(_tablet_meta->all_rs_metas()[0]->rowset_id());
+ set.insert(_rowset1->rowset_id());
engine_ref->txn_manager()->set_txn_related_delete_bitmap(partition_id, 1,
_tablet->tablet_id(),
_tablet->tablet_uid(), true,
delete_bitmap,
set, nullptr);
@@ -254,7 +254,7 @@ TEST_F(CompactionDeleteBitmapCalculatorTest, test) {
status = engine_ref->txn_manager()->commit_txn(_meta, partition_id, 2,
tablet_id, _tablet_uid,
load_id, _rowset2, {},
false);
EXPECT_TRUE(status == Status::OK());
- set.insert(_tablet_meta->all_rs_metas()[1]->rowset_id());
+ set.insert(_rowset2->rowset_id());
engine_ref->txn_manager()->set_txn_related_delete_bitmap(
partition_id, 2, tablet_id, _tablet_uid, true, delete_bitmap, set,
nullptr);
diff --git a/be/test/olap/delete_handler_test.cpp
b/be/test/olap/delete_handler_test.cpp
index d615be62bc4..c9d94a36b61 100644
--- a/be/test/olap/delete_handler_test.cpp
+++ b/be/test/olap/delete_handler_test.cpp
@@ -1037,7 +1037,7 @@ protected:
std::vector<RowsetMetaSharedPtr> get_delete_predicates() {
std::vector<RowsetMetaSharedPtr> delete_preds;
- for (auto&& rs_meta : tablet->tablet_meta()->_rs_metas) {
+ for (auto&& [_, rs_meta] : tablet->tablet_meta()->_rs_metas) {
if (rs_meta->has_delete_predicate()) {
delete_preds.push_back(rs_meta);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]