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]

Reply via email to