This is an automated email from the ASF dual-hosted git repository. kxiao pushed a commit to branch branch-2.0 in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.0 by this push: new 631dbda2f79 [Fix](compaction) Fix single compaction to get all local versions 33480 (#33524) 631dbda2f79 is described below commit 631dbda2f7973c2222c99a4af22122fe14959827 Author: Sun Chenyang <csun5...@gmail.com> AuthorDate: Mon Apr 15 08:49:58 2024 +0800 [Fix](compaction) Fix single compaction to get all local versions 33480 (#33524) --- be/src/olap/olap_server.cpp | 2 +- be/src/olap/single_replica_compaction.cpp | 2 +- be/src/olap/tablet.cpp | 11 +++++----- be/src/olap/tablet.h | 4 +++- be/test/olap/tablet_test.cpp | 35 +++++++++++++++++++++++++++++++ 5 files changed, 46 insertions(+), 8 deletions(-) diff --git a/be/src/olap/olap_server.cpp b/be/src/olap/olap_server.cpp index 2a9f911ed96..7ce25e7016d 100644 --- a/be/src/olap/olap_server.cpp +++ b/be/src/olap/olap_server.cpp @@ -788,7 +788,7 @@ void StorageEngine::get_tablet_rowset_versions(const PGetTabletVersionsRequest* response->mutable_status()->set_status_code(TStatusCode::CANCELLED); return; } - std::vector<Version> local_versions = tablet->get_all_versions(); + std::vector<Version> local_versions = tablet->get_all_local_versions(); for (const auto& local_version : local_versions) { auto version = response->add_versions(); version->set_first(local_version.first); diff --git a/be/src/olap/single_replica_compaction.cpp b/be/src/olap/single_replica_compaction.cpp index ddd6e08bfa2..9e3c1843aaa 100644 --- a/be/src/olap/single_replica_compaction.cpp +++ b/be/src/olap/single_replica_compaction.cpp @@ -193,7 +193,7 @@ Status SingleReplicaCompaction::_get_rowset_verisons_from_peer( bool SingleReplicaCompaction::_find_rowset_to_fetch(const std::vector<Version>& peer_versions, Version* proper_version) { // already sorted - std::vector<Version> local_versions = _tablet->get_all_versions(); + std::vector<Version> local_versions = _tablet->get_all_local_versions(); for (const auto& v : local_versions) { VLOG_CRITICAL << _tablet->tablet_id() << " tablet local version: " << v.first << " - " << v.second; diff --git a/be/src/olap/tablet.cpp b/be/src/olap/tablet.cpp index a8f23a760f6..ab7653684e9 100644 --- a/be/src/olap/tablet.cpp +++ b/be/src/olap/tablet.cpp @@ -1889,13 +1889,14 @@ void Tablet::execute_single_replica_compaction(SingleReplicaCompaction& compacti set_last_failure_time(this, compaction, 0); } -std::vector<Version> Tablet::get_all_versions() { +std::vector<Version> Tablet::get_all_local_versions() { std::vector<Version> local_versions; { - std::lock_guard<std::shared_mutex> wrlock(_meta_lock); - SCOPED_SIMPLE_TRACE_IF_TIMEOUT(TRACE_TABLET_LOCK_THRESHOLD); - for (const auto& it : _rs_version_map) { - local_versions.emplace_back(it.first); + std::shared_lock rlock(_meta_lock); + for (const auto& [version, rs] : _rs_version_map) { + if (rs->is_local()) { + local_versions.emplace_back(version); + } } } std::sort(local_versions.begin(), local_versions.end(), diff --git a/be/src/olap/tablet.h b/be/src/olap/tablet.h index 6c3bcb0e615..b6c01e84d5c 100644 --- a/be/src/olap/tablet.h +++ b/be/src/olap/tablet.h @@ -274,7 +274,9 @@ public: std::vector<RowsetSharedPtr> pick_candidate_rowsets_to_build_inverted_index( const std::set<int32_t>& alter_index_uids, bool is_drop_op); - std::vector<Version> get_all_versions(); + // used for single compaction to get the local versions + // Single compaction does not require remote rowsets and cannot violate the cooldown semantics + std::vector<Version> get_all_local_versions(); std::vector<RowsetSharedPtr> pick_first_consecutive_empty_rowsets(int limit); diff --git a/be/test/olap/tablet_test.cpp b/be/test/olap/tablet_test.cpp index 838db9b0d6d..951d98b1e05 100644 --- a/be/test/olap/tablet_test.cpp +++ b/be/test/olap/tablet_test.cpp @@ -142,6 +142,20 @@ public: pb1->set_tablet_schema(_tablet_meta->tablet_schema()); } + void init_rs_meta_resource(RowsetMetaSharedPtr& pb1, int64_t start, int64_t end, + bool is_local) { + RowsetMetaPB rowset_meta_pb; + json2pb::JsonToProtoMessage(_json_rowset_meta, &rowset_meta_pb); + rowset_meta_pb.set_start_version(start); + rowset_meta_pb.set_end_version(end); + rowset_meta_pb.set_creation_time(10000); + if (!is_local) { + rowset_meta_pb.set_resource_id("100"); + } + pb1->init_from_pb(rowset_meta_pb); + pb1->set_tablet_schema(_tablet_meta->tablet_schema()); + } + void init_all_rs_meta(std::vector<RowsetMetaSharedPtr>* rs_metas) { RowsetMetaSharedPtr ptr1(new RowsetMeta()); init_rs_meta(ptr1, 0, 0); @@ -392,4 +406,25 @@ TEST_F(TestTablet, cooldown_policy) { } } +TEST_F(TestTablet, get_local_versions) { + // 10 remote rowsets + for (int i = 1; i <= 10; i++) { + auto ptr = std::make_shared<RowsetMeta>(); + init_rs_meta_resource(ptr, i, i, false); + static_cast<void>(_tablet_meta->add_rs_meta(ptr)); + } + + // 20 local rowsets + for (int i = 11; i <= 30; i++) { + auto ptr = std::make_shared<RowsetMeta>(); + init_rs_meta_resource(ptr, i, i, true); + static_cast<void>(_tablet_meta->add_rs_meta(ptr)); + } + + TabletSharedPtr _tablet(new Tablet(_tablet_meta, nullptr)); + _tablet->init(); + const auto& local_versions = _tablet->get_all_local_versions(); + ASSERT_EQ(local_versions.size(), 20); +} + } // namespace doris --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org