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]