This is an automated email from the ASF dual-hosted git repository.
dataroaring 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 8d36de3377 [fix](max_version) protect max_version by meta lock (#21948)
8d36de3377 is described below
commit 8d36de3377106a27a08e732fa4926060dbb54cb1
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 1728fe1818..73766b7090 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 e53661dce8..8723a9fa00 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]