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
commit 3bfaa303b06c58d6b2f3e8b7d27f7f4ead7e0e6a Author: Yongqiang YANG <[email protected]> AuthorDate: Thu Jul 20 10:35:23 2023 +0800 [fix](max_version) protect max_version by meta lock (#21948) Otherwise, the be would core dump due to non thread safe access. --- be/src/olap/olap_server.cpp | 6 +----- be/src/olap/snapshot_manager.cpp | 2 +- be/src/olap/tablet.cpp | 5 +++-- be/src/olap/tablet.h | 1 + be/src/olap/task/engine_publish_version_task.cpp | 2 +- 5 files changed, 7 insertions(+), 9 deletions(-) diff --git a/be/src/olap/olap_server.cpp b/be/src/olap/olap_server.cpp index dabf07d176..c1af281465 100644 --- a/be/src/olap/olap_server.cpp +++ b/be/src/olap/olap_server.cpp @@ -1272,11 +1272,7 @@ void StorageEngine::_async_publish_callback() { int64_t version = task_iter->first; int64_t transaction_id = task_iter->second.first; int64_t partition_id = task_iter->second.second; - int64_t max_version; - { - std::shared_lock rdlock(tablet->get_header_lock()); - max_version = tablet->max_version().second; - } + int64_t max_version = tablet->max_version().second; if (version <= max_version) { need_removed_tasks.emplace_back(tablet, version); diff --git a/be/src/olap/snapshot_manager.cpp b/be/src/olap/snapshot_manager.cpp index 829c578b9f..9de4eb9b00 100644 --- a/be/src/olap/snapshot_manager.cpp +++ b/be/src/olap/snapshot_manager.cpp @@ -530,7 +530,7 @@ Status SnapshotManager::_create_snapshot_files(const TabletSharedPtr& ref_tablet } *allow_incremental_clone = false; } else { - version = ref_tablet->max_version().second; + version = ref_tablet->max_version_unlocked().second; *allow_incremental_clone = true; } diff --git a/be/src/olap/tablet.cpp b/be/src/olap/tablet.cpp index 9a16a7c636..81f1d95b07 100644 --- a/be/src/olap/tablet.cpp +++ b/be/src/olap/tablet.cpp @@ -331,6 +331,7 @@ void Tablet::save_meta() { << ", root=" << _data_dir->path(); } +// Caller should hold _meta_lock. Status Tablet::revise_tablet_meta(const std::vector<RowsetSharedPtr>& to_add, const std::vector<RowsetSharedPtr>& to_delete, bool is_incremental_clone) { @@ -360,7 +361,7 @@ Status Tablet::revise_tablet_meta(const std::vector<RowsetSharedPtr>& to_add, // clone tablet: [7-7] [8-8] // new tablet: [0-1] [2-5] [6-6] [7-7] [8-8] [9-10] // [7-7] [8-8] [9-10] need to recalculate delete bitmap - calc_delete_bitmap_ver = Version(to_add_min_version, max_version().second); + calc_delete_bitmap_ver = Version(to_add_min_version, max_version_unlocked().second); } else { // the delete bitmap of to_add's rowsets has clone from remote when full clone. // only other rowsets in local need to recalculate the delete bitmap. @@ -370,7 +371,7 @@ Status Tablet::revise_tablet_meta(const std::vector<RowsetSharedPtr>& to_add, // new tablet: [0-1] [2-4] [5-6] [7-8] [9-10] // only [9-10] need to recalculate delete bitmap CHECK_EQ(to_add_min_version, 0) << "to_add_min_version is: " << to_add_min_version; - calc_delete_bitmap_ver = Version(to_add_max_version + 1, max_version().second); + calc_delete_bitmap_ver = Version(to_add_max_version + 1, max_version_unlocked().second); } if (calc_delete_bitmap_ver.first <= calc_delete_bitmap_ver.second) { diff --git a/be/src/olap/tablet.h b/be/src/olap/tablet.h index 9852c38a02..a406505ae3 100644 --- a/be/src/olap/tablet.h +++ b/be/src/olap/tablet.h @@ -772,6 +772,7 @@ inline int Tablet::version_count() const { } inline Version Tablet::max_version() const { + std::shared_lock rdlock(_meta_lock); return _tablet_meta->max_version(); } diff --git a/be/src/olap/task/engine_publish_version_task.cpp b/be/src/olap/task/engine_publish_version_task.cpp index bc91af6a2d..08f7fc33cc 100644 --- a/be/src/olap/task/engine_publish_version_task.cpp +++ b/be/src/olap/task/engine_publish_version_task.cpp @@ -158,7 +158,7 @@ Status EnginePublishVersionTask::finish() { TabletState tablet_state; { std::shared_lock rdlock(tablet->get_header_lock()); - max_version = tablet->max_version(); + max_version = tablet->max_version_unlocked(); tablet_state = tablet->tablet_state(); } if (tablet_state == TabletState::TABLET_RUNNING && --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
