This is an automated email from the ASF dual-hosted git repository.

eldenmoon pushed a commit to branch branch-3.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-3.0 by this push:
     new b098f80837e branch-3.0: fix(variant) resolve thread-safety issue 
caused by concurrent access to `_sub_column_tree` (#55916)
b098f80837e is described below

commit b098f80837eb95a387cb40c3b7fd868a0cf2a522
Author: lihangyu <[email protected]>
AuthorDate: Thu Sep 11 21:38:24 2025 +0800

    branch-3.0: fix(variant) resolve thread-safety issue caused by concurrent 
access to `_sub_column_tree` (#55916)
    
    This bug only in branch-3.0 and branch-2.1
---
 be/src/olap/rowset/segment_v2/segment.cpp | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/be/src/olap/rowset/segment_v2/segment.cpp 
b/be/src/olap/rowset/segment_v2/segment.cpp
index e29ec890814..e0f21e4be2c 100644
--- a/be/src/olap/rowset/segment_v2/segment.cpp
+++ b/be/src/olap/rowset/segment_v2/segment.cpp
@@ -235,7 +235,9 @@ Status Segment::new_iterator(SchemaSPtr schema, const 
StorageReadOptions& read_o
         if (col.is_extracted_column()) {
             auto relative_path = col.path_info_ptr()->copy_pop_front();
             int32_t unique_id = col.unique_id() > 0 ? col.unique_id() : 
col.parent_unique_id();
-            const auto* node = 
_sub_column_tree[unique_id].find_exact(relative_path);
+            const auto* node = _sub_column_tree.contains(unique_id)
+                                       ? 
_sub_column_tree.at(unique_id).find_exact(relative_path)
+                                       : nullptr;
             reader = node != nullptr ? node->data.reader.get() : nullptr;
         } else {
             reader = _column_readers.contains(col.unique_id())
@@ -747,9 +749,9 @@ Status Segment::new_column_iterator_with_path(const 
TabletColumn& tablet_column,
         return Status::OK();
     }
     auto relative_path = tablet_column.path_info_ptr()->copy_pop_front();
-    const auto* root = _sub_column_tree[unique_id].get_root();
+    const auto* root = _sub_column_tree.at(unique_id).get_root();
     const auto* node = tablet_column.has_path_info()
-                               ? 
_sub_column_tree[unique_id].find_exact(relative_path)
+                               ? 
_sub_column_tree.at(unique_id).find_exact(relative_path)
                                : nullptr;
     const auto* sparse_node =
             tablet_column.has_path_info() && 
_sparse_column_tree.contains(unique_id)
@@ -769,7 +771,7 @@ Status Segment::new_column_iterator_with_path(const 
TabletColumn& tablet_column,
     auto new_default_iter_with_same_nested = [&](const TabletColumn& 
tablet_column,
                                                  
std::unique_ptr<ColumnIterator>* iter) {
         // We find node that represents the same Nested type as path.
-        const auto* parent = 
_sub_column_tree[unique_id].find_best_match(relative_path);
+        const auto* parent = 
_sub_column_tree.at(unique_id).find_best_match(relative_path);
         VLOG_DEBUG << "find with path " << 
tablet_column.path_info_ptr()->get_path() << " parent "
                    << (parent ? parent->path.get_path() : "nullptr") << ", 
type "
                    << ", parent is nested " << (parent ? parent->is_nested() : 
false) << ", "
@@ -804,7 +806,7 @@ Status Segment::new_column_iterator_with_path(const 
TabletColumn& tablet_column,
     if (opt != nullptr && type_to_read_flat_leaves(opt->io_ctx.reader_type)) {
         // compaction need to read flat leaves nodes data to prevent from 
amplification
         const auto* node = tablet_column.has_path_info()
-                                   ? 
_sub_column_tree[unique_id].find_leaf(relative_path)
+                                   ? 
_sub_column_tree.at(unique_id).find_leaf(relative_path)
                                    : nullptr;
         if (!node) {
             // sparse_columns have this path, read from root
@@ -831,7 +833,7 @@ Status Segment::new_column_iterator_with_path(const 
TabletColumn& tablet_column,
         if (node->is_leaf_node() && sparse_node == nullptr) {
             // Node contains column without any child sub columns and no 
corresponding sparse columns
             // Direct read extracted columns
-            const auto* node = 
_sub_column_tree[unique_id].find_leaf(relative_path);
+            const auto* node = 
_sub_column_tree.at(unique_id).find_leaf(relative_path);
             ColumnIterator* it;
             RETURN_IF_ERROR(node->data.reader->new_iterator(&it));
             iter->reset(it);
@@ -916,8 +918,11 @@ ColumnReader* Segment::_get_column_reader(const 
TabletColumn& col) {
     if (col.has_path_info() || col.is_variant_type()) {
         auto relative_path = col.path_info_ptr()->copy_pop_front();
         int32_t unique_id = col.unique_id() > 0 ? col.unique_id() : 
col.parent_unique_id();
+        if (!_sub_column_tree.contains(unique_id)) {
+            return nullptr;
+        }
         const auto* node = col.has_path_info()
-                                   ? 
_sub_column_tree[unique_id].find_exact(relative_path)
+                                   ? 
_sub_column_tree.at(unique_id).find_exact(relative_path)
                                    : nullptr;
         if (node != nullptr) {
             return node->data.reader.get();


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to