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

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


The following commit(s) were added to refs/heads/branch-3.1 by this push:
     new 7711586c2d8 branch-3.1: [enhance](variant) Add some metrics for 
querying variant in the profile #55941 (#56506)
7711586c2d8 is described below

commit 7711586c2d8320e80316bff52fee9990ccd1a081
Author: Sun Chenyang <[email protected]>
AuthorDate: Mon Sep 29 14:37:03 2025 +0800

    branch-3.1: [enhance](variant) Add some metrics for querying variant in the 
profile #55941 (#56506)
    
    pick from master #55941
---
 be/src/exec/rowid_fetcher.cpp                      | 10 +++++++---
 be/src/olap/olap_common.h                          |  8 ++++++++
 be/src/olap/rowset/segment_v2/segment.cpp          | 19 ++++++++----------
 be/src/olap/rowset/segment_v2/segment.h            |  3 ++-
 .../variant/hierarchical_data_iterator.cpp         |  8 ++++++--
 .../variant/hierarchical_data_iterator.h           |  9 +++++++--
 .../variant/sparse_column_extract_iterator.h       | 23 ++++++++++++++--------
 .../segment_v2/variant/variant_column_reader.cpp   |  7 ++++++-
 be/src/pipeline/exec/olap_scan_operator.cpp        | 14 +++++++++++++
 be/src/pipeline/exec/olap_scan_operator.h          | 16 +++++++++++++++
 be/src/service/point_query_executor.cpp            |  6 +++++-
 be/src/vec/exec/scan/new_olap_scanner.cpp          | 16 ++++++++++++++-
 .../variant_column_writer_reader_test.cpp          | 23 ++++++++++++++++------
 13 files changed, 126 insertions(+), 36 deletions(-)

diff --git a/be/src/exec/rowid_fetcher.cpp b/be/src/exec/rowid_fetcher.cpp
index e0b81283df1..60b0e4b22ef 100644
--- a/be/src/exec/rowid_fetcher.cpp
+++ b/be/src/exec/rowid_fetcher.cpp
@@ -324,6 +324,8 @@ struct IteratorItem {
     std::unique_ptr<ColumnIterator> iterator;
     // for holding the reference of segment to avoid use after release
     SegmentSharedPtr segment;
+    // for holding the reference of storage read options to avoid use after 
release
+    StorageReadOptions storage_read_options;
 };
 
 Status RowIdStorageReader::read_by_rowids(const PMultiGetRequest& request,
@@ -440,12 +442,14 @@ Status RowIdStorageReader::read_by_rowids(const 
PMultiGetRequest& request,
             if (iterator_item.segment == nullptr) {
                 // hold the reference
                 iterator_map[iterator_key].segment = segment;
+                iterator_item.storage_read_options.stats = &stats;
+                iterator_item.storage_read_options.io_ctx.reader_type = 
ReaderType::READER_QUERY;
             }
             segment = iterator_item.segment;
             try {
-                
RETURN_IF_ERROR(segment->seek_and_read_by_rowid(full_read_schema, 
desc.slots()[x],
-                                                                row_id, 
column, stats,
-                                                                
iterator_item.iterator));
+                RETURN_IF_ERROR(segment->seek_and_read_by_rowid(
+                        full_read_schema, desc.slots()[x], row_id, column,
+                        iterator_item.storage_read_options, 
iterator_item.iterator));
             } catch (const Exception& e) {
                 return Status::Error<false>(e.code(), "Row id fetch failed 
because {}", e.what());
             }
diff --git a/be/src/olap/olap_common.h b/be/src/olap/olap_common.h
index e8cc1e02198..07c6a6525fc 100644
--- a/be/src/olap/olap_common.h
+++ b/be/src/olap/olap_common.h
@@ -419,6 +419,14 @@ struct OlapReaderStatistics {
 
     int64_t segment_create_column_readers_timer_ns = 0;
     int64_t segment_load_index_timer_ns = 0;
+
+    int64_t variant_scan_sparse_column_timer_ns = 0;
+    int64_t variant_scan_sparse_column_bytes = 0;
+    int64_t variant_fill_path_from_sparse_column_timer_ns = 0;
+    int64_t variant_subtree_default_iter_count = 0;
+    int64_t variant_subtree_leaf_iter_count = 0;
+    int64_t variant_subtree_hierarchical_iter_count = 0;
+    int64_t variant_subtree_sparse_iter_count = 0;
 };
 
 using ColumnId = uint32_t;
diff --git a/be/src/olap/rowset/segment_v2/segment.cpp 
b/be/src/olap/rowset/segment_v2/segment.cpp
index dba2030f0bb..3091a8141d2 100644
--- a/be/src/olap/rowset/segment_v2/segment.cpp
+++ b/be/src/olap/rowset/segment_v2/segment.cpp
@@ -957,17 +957,15 @@ bool Segment::same_with_storage_type(int32_t cid, const 
Schema& schema, bool rea
 
 Status Segment::seek_and_read_by_rowid(const TabletSchema& schema, 
SlotDescriptor* slot,
                                        uint32_t row_id, 
vectorized::MutableColumnPtr& result,
-                                       OlapReaderStatistics& stats,
+                                       StorageReadOptions& 
storage_read_options,
                                        std::unique_ptr<ColumnIterator>& 
iterator_hint) {
-    StorageReadOptions storage_read_opt;
-    storage_read_opt.stats = &stats;
-    storage_read_opt.io_ctx.reader_type = ReaderType::READER_QUERY;
     segment_v2::ColumnIteratorOptions opt {
             .use_page_cache = !config::disable_storage_page_cache,
             .file_reader = file_reader().get(),
-            .stats = &stats,
+            .stats = storage_read_options.stats,
             .io_ctx = io::IOContext {.reader_type = ReaderType::READER_QUERY,
-                                     .file_cache_stats = 
&stats.file_cache_stats},
+                                     .file_cache_stats =
+                                             
&storage_read_options.stats->file_cache_stats},
     };
     std::vector<segment_v2::rowid_t> single_row_loc {row_id};
     if (!slot->column_paths().empty()) {
@@ -976,14 +974,14 @@ Status Segment::seek_and_read_by_rowid(const 
TabletSchema& schema, SlotDescripto
                 slot->col_unique_id(), slot->type().max_subcolumns_count());
         // here need create column readers to make sure column reader is 
created before seek_and_read_by_rowid
         // if segment cache miss, column reader will be created to make sure 
the variant column result not coredump
-        RETURN_IF_ERROR(_create_column_meta_once(&stats));
+        RETURN_IF_ERROR(_create_column_meta_once(storage_read_options.stats));
 
         auto storage_type = get_data_type_of(column, false);
         vectorized::MutableColumnPtr file_storage_column = 
storage_type->create_column();
         DCHECK(storage_type != nullptr);
 
         if (iterator_hint == nullptr) {
-            RETURN_IF_ERROR(new_column_iterator(column, &iterator_hint, 
&storage_read_opt));
+            RETURN_IF_ERROR(new_column_iterator(column, &iterator_hint, 
&storage_read_options));
             RETURN_IF_ERROR(iterator_hint->init(opt));
         }
         RETURN_IF_ERROR(
@@ -999,10 +997,9 @@ Status Segment::seek_and_read_by_rowid(const TabletSchema& 
schema, SlotDescripto
                << ", field_name_to_index=" << schema.get_all_field_names();
             return Status::InternalError(ss.str());
         }
-        storage_read_opt.io_ctx.reader_type = ReaderType::READER_QUERY;
         if (iterator_hint == nullptr) {
-            RETURN_IF_ERROR(
-                    new_column_iterator(schema.column(index), &iterator_hint, 
&storage_read_opt));
+            RETURN_IF_ERROR(new_column_iterator(schema.column(index), 
&iterator_hint,
+                                                &storage_read_options));
             RETURN_IF_ERROR(iterator_hint->init(opt));
         }
         RETURN_IF_ERROR(iterator_hint->read_by_rowids(single_row_loc.data(), 
1, result));
diff --git a/be/src/olap/rowset/segment_v2/segment.h 
b/be/src/olap/rowset/segment_v2/segment.h
index d6d516b83e8..532a7e313ee 100644
--- a/be/src/olap/rowset/segment_v2/segment.h
+++ b/be/src/olap/rowset/segment_v2/segment.h
@@ -145,7 +145,8 @@ public:
     Status read_key_by_rowid(uint32_t row_id, std::string* key);
 
     Status seek_and_read_by_rowid(const TabletSchema& schema, SlotDescriptor* 
slot, uint32_t row_id,
-                                  vectorized::MutableColumnPtr& result, 
OlapReaderStatistics& stats,
+                                  vectorized::MutableColumnPtr& result,
+                                  StorageReadOptions& storage_read_options,
                                   std::unique_ptr<ColumnIterator>& 
iterator_hint);
 
     Status load_index(OlapReaderStatistics* stats);
diff --git 
a/be/src/olap/rowset/segment_v2/variant/hierarchical_data_iterator.cpp 
b/be/src/olap/rowset/segment_v2/variant/hierarchical_data_iterator.cpp
index 96e31010de8..7b728a377c8 100644
--- a/be/src/olap/rowset/segment_v2/variant/hierarchical_data_iterator.cpp
+++ b/be/src/olap/rowset/segment_v2/variant/hierarchical_data_iterator.cpp
@@ -44,7 +44,7 @@ Status HierarchicalDataIterator::create(ColumnIteratorUPtr* 
reader, int32_t col_
                                         ColumnReaderCache* column_reader_cache,
                                         OlapReaderStatistics* stats) {
     // None leave node need merge with root
-    auto stream_iter = std::make_unique<HierarchicalDataIterator>(path);
+    std::unique_ptr<HierarchicalDataIterator> stream_iter(new 
HierarchicalDataIterator(path));
     if (node != nullptr) {
         std::vector<const SubcolumnColumnMetaInfo::Node*> leaves;
         vectorized::PathsInData leaves_paths;
@@ -62,6 +62,7 @@ Status HierarchicalDataIterator::create(ColumnIteratorUPtr* 
reader, int32_t col_
     stream_iter->_root_reader = std::move(root_column_reader);
     // need read from sparse column if not null
     stream_iter->_sparse_column_reader = std::move(sparse_reader);
+    stream_iter->_stats = stats;
     *reader = std::move(stream_iter);
 
     return Status::OK();
@@ -291,8 +292,11 @@ Status 
HierarchicalDataIterator::_init_container(vectorized::MutableColumnPtr& c
     RETURN_IF_ERROR(_process_sub_columns(container_variant, 
non_nested_subcolumns));
 
     RETURN_IF_ERROR(_process_nested_columns(container_variant, 
nested_subcolumns, nrows));
+    {
+        
SCOPED_RAW_TIMER(&_stats->variant_fill_path_from_sparse_column_timer_ns);
+        RETURN_IF_ERROR(_process_sparse_column(container_variant, nrows));
+    }
 
-    RETURN_IF_ERROR(_process_sparse_column(container_variant, nrows));
     container_variant.set_num_rows(nrows);
     return Status::OK();
 }
diff --git a/be/src/olap/rowset/segment_v2/variant/hierarchical_data_iterator.h 
b/be/src/olap/rowset/segment_v2/variant/hierarchical_data_iterator.h
index 87892673233..36889e64267 100644
--- a/be/src/olap/rowset/segment_v2/variant/hierarchical_data_iterator.h
+++ b/be/src/olap/rowset/segment_v2/variant/hierarchical_data_iterator.h
@@ -67,8 +67,6 @@ public:
     // Currently two types of read, merge sparse columns with root columns, or 
read directly
     enum class ReadType { MERGE_ROOT, READ_DIRECT };
 
-    HierarchicalDataIterator(const vectorized::PathInData& path) : _path(path) 
{}
-
     static Status create(ColumnIteratorUPtr* reader, int32_t col_uid, 
vectorized::PathInData path,
                          const SubcolumnColumnMetaInfo::Node* target_node,
                          std::unique_ptr<SubstreamIterator>&& sparse_reader,
@@ -97,6 +95,9 @@ private:
     std::unique_ptr<SubstreamIterator> _sparse_column_reader;
     size_t _rows_read = 0;
     vectorized::PathInData _path;
+    OlapReaderStatistics* _stats = nullptr;
+
+    HierarchicalDataIterator(const vectorized::PathInData& path) : _path(path) 
{}
 
     template <typename NodeFunction>
     Status tranverse(NodeFunction&& node_func) {
@@ -156,7 +157,11 @@ private:
 
         // read sparse column
         if (_sparse_column_reader) {
+            SCOPED_RAW_TIMER(&_stats->variant_scan_sparse_column_timer_ns);
+            int64_t curr_size = _sparse_column_reader->column->byte_size();
             RETURN_IF_ERROR(read_func(*_sparse_column_reader, {}, nullptr));
+            _stats->variant_scan_sparse_column_bytes +=
+                    _sparse_column_reader->column->byte_size() - curr_size;
         }
 
         MutableColumnPtr container;
diff --git 
a/be/src/olap/rowset/segment_v2/variant/sparse_column_extract_iterator.h 
b/be/src/olap/rowset/segment_v2/variant/sparse_column_extract_iterator.h
index 3ba87ea7259..de25018712c 100644
--- a/be/src/olap/rowset/segment_v2/variant/sparse_column_extract_iterator.h
+++ b/be/src/olap/rowset/segment_v2/variant/sparse_column_extract_iterator.h
@@ -57,7 +57,7 @@ protected:
     vectorized::MutableColumnPtr _sparse_column;
     StorageReadOptions* _read_opts; // Shared cache pointer
     std::unique_ptr<ColumnIterator> _sparse_column_reader;
-    const TabletColumn& _col;
+    int32_t _col_uid;
     // Pure virtual method for data processing when encounter existing sparse 
columns(to be implemented by subclasses)
     virtual void 
_process_data_with_existing_sparse_column(vectorized::MutableColumnPtr& dst,
                                                            size_t num_rows) = 
0;
@@ -69,7 +69,9 @@ protected:
 public:
     BaseSparseColumnProcessor(std::unique_ptr<ColumnIterator>&& reader, 
StorageReadOptions* opts,
                               const TabletColumn& col)
-            : _read_opts(opts), _sparse_column_reader(std::move(reader)), 
_col(col) {
+            : _read_opts(opts),
+              _sparse_column_reader(std::move(reader)),
+              _col_uid(col.parent_unique_id()) {
         _sparse_column = vectorized::ColumnObject::create_sparse_column_fn();
     }
 
@@ -83,7 +85,7 @@ public:
     // So we need to cache the sparse column and reuse it.
     // The cache is only used when the compaction reader is used.
     bool has_sparse_column_cache() const {
-        return _read_opts && 
_read_opts->sparse_column_cache[_col.parent_unique_id()] &&
+        return _read_opts && _read_opts->sparse_column_cache[_col_uid] &&
                
ColumnReader::is_compaction_reader_type(_read_opts->io_ctx.reader_type);
     }
 
@@ -107,18 +109,23 @@ public:
                           vectorized::MutableColumnPtr& dst) {
         // Cache check and population logic
         if (has_sparse_column_cache()) {
-            _sparse_column =
-                    
_read_opts->sparse_column_cache[_col.parent_unique_id()]->assume_mutable();
+            _sparse_column = 
_read_opts->sparse_column_cache[_col_uid]->assume_mutable();
         } else {
             _sparse_column->clear();
-            RETURN_IF_ERROR(read_method());
+            {
+                
SCOPED_RAW_TIMER(&_read_opts->stats->variant_scan_sparse_column_timer_ns);
+                int64_t before_size = 
_read_opts->stats->uncompressed_bytes_read;
+                RETURN_IF_ERROR(read_method());
+                _read_opts->stats->variant_scan_sparse_column_bytes +=
+                        _read_opts->stats->uncompressed_bytes_read - 
before_size;
+            }
 
             // cache the sparse column
             if (_read_opts) {
-                _read_opts->sparse_column_cache[_col.parent_unique_id()] =
-                        _sparse_column->get_ptr();
+                _read_opts->sparse_column_cache[_col_uid] = 
_sparse_column->get_ptr();
             }
         }
+        
SCOPED_RAW_TIMER(&_read_opts->stats->variant_fill_path_from_sparse_column_timer_ns);
 
         const auto& offsets =
                 assert_cast<const 
vectorized::ColumnMap&>(*_sparse_column).get_offsets();
diff --git a/be/src/olap/rowset/segment_v2/variant/variant_column_reader.cpp 
b/be/src/olap/rowset/segment_v2/variant/variant_column_reader.cpp
index f4a1431bcfe..e41159a0330 100644
--- a/be/src/olap/rowset/segment_v2/variant/variant_column_reader.cpp
+++ b/be/src/olap/rowset/segment_v2/variant/variant_column_reader.cpp
@@ -114,6 +114,7 @@ Status 
VariantColumnReader::_create_hierarchical_reader(ColumnIteratorUPtr* read
                                                         const 
SubcolumnColumnMetaInfo::Node* root,
                                                         ColumnReaderCache* 
column_reader_cache,
                                                         OlapReaderStatistics* 
stats) {
+    stats->variant_subtree_hierarchical_iter_count++;
     // Node contains column with children columns or has correspoding sparse 
columns
     // Create reader with hirachical data.
     std::unique_ptr<SubstreamIterator> sparse_iter;
@@ -372,7 +373,9 @@ Status 
VariantColumnReader::new_iterator(ColumnIteratorUPtr* iterator,
         DCHECK(opt);
         // Sparse column exists or reached sparse size limit, read sparse 
column
         *iterator = std::make_unique<SparseColumnExtractIterator>(
-                relative_path.get_path(), std::move(inner_iter), nullptr, 
*target_col);
+                relative_path.get_path(), std::move(inner_iter),
+                const_cast<StorageReadOptions*>(opt), *target_col);
+        opt->stats->variant_subtree_sparse_iter_count++;
         return Status::OK();
     }
 
@@ -386,6 +389,7 @@ Status 
VariantColumnReader::new_iterator(ColumnIteratorUPtr* iterator,
             RETURN_IF_ERROR(column_reader_cache->get_path_column_reader(
                     col_uid, node->path, &column_reader, opt->stats, node));
             RETURN_IF_ERROR(column_reader->new_iterator(iterator, nullptr));
+            opt->stats->variant_subtree_leaf_iter_count++;
         } else {
             RETURN_IF_ERROR(_create_hierarchical_reader(iterator, col_uid, 
relative_path, node,
                                                         root, 
column_reader_cache, opt->stats));
@@ -393,6 +397,7 @@ Status 
VariantColumnReader::new_iterator(ColumnIteratorUPtr* iterator,
     } else {
         // Sparse column not exists and not reached stats limit, then the 
target path is not exist, get a default iterator
         RETURN_IF_ERROR(Segment::new_default_iterator(*target_col, iterator));
+        opt->stats->variant_subtree_default_iter_count++;
     }
     return Status::OK();
 }
diff --git a/be/src/pipeline/exec/olap_scan_operator.cpp 
b/be/src/pipeline/exec/olap_scan_operator.cpp
index 9f38f77b3d9..97fecc2a432 100644
--- a/be/src/pipeline/exec/olap_scan_operator.cpp
+++ b/be/src/pipeline/exec/olap_scan_operator.cpp
@@ -245,6 +245,20 @@ Status OlapScanLocalState::_init_profile() {
     _index_filter_profile = std::make_unique<RuntimeProfile>("IndexFilter");
     _scanner_profile->add_child(_index_filter_profile.get(), true, nullptr);
 
+    _variant_scan_sparse_column_timer = ADD_TIMER(_segment_profile, 
"VariantScanSparseColumnTimer");
+    _variant_scan_sparse_column_bytes =
+            ADD_COUNTER(_segment_profile, "VariantScanSparseColumnBytes", 
TUnit::BYTES);
+    _variant_fill_path_from_sparse_column_timer =
+            ADD_TIMER(_segment_profile, 
"VariantFillPathFromSparseColumnTimer");
+    _variant_subtree_default_iter_count =
+            ADD_COUNTER(_segment_profile, "VariantSubtreeDefaultIterCount", 
TUnit::UNIT);
+    _variant_subtree_leaf_iter_count =
+            ADD_COUNTER(_segment_profile, "VariantSubtreeLeafIterCount", 
TUnit::UNIT);
+    _variant_subtree_hierarchical_iter_count =
+            ADD_COUNTER(_segment_profile, 
"VariantSubtreeHierarchicalIterCount", TUnit::UNIT);
+    _variant_subtree_sparse_iter_count =
+            ADD_COUNTER(_segment_profile, "VariantSubtreeSparseIterCount", 
TUnit::UNIT);
+
     return Status::OK();
 }
 
diff --git a/be/src/pipeline/exec/olap_scan_operator.h 
b/be/src/pipeline/exec/olap_scan_operator.h
index 5c3d0f38b84..cfeb43c3e4b 100644
--- a/be/src/pipeline/exec/olap_scan_operator.h
+++ b/be/src/pipeline/exec/olap_scan_operator.h
@@ -247,6 +247,22 @@ private:
     RuntimeProfile::Counter* _segment_load_index_timer = nullptr;
 
     std::mutex _profile_mtx;
+    // total uncompressed bytes read when scanning sparse columns in variant
+    RuntimeProfile::Counter* _variant_scan_sparse_column_bytes = nullptr;
+
+    // total time spent scanning sparse subcolumns
+    RuntimeProfile::Counter* _variant_scan_sparse_column_timer = nullptr;
+    // time to build/resolve subcolumn paths from the sparse column
+    RuntimeProfile::Counter* _variant_fill_path_from_sparse_column_timer = 
nullptr;
+    // Variant subtree: times falling back to default iterator due to missing 
path
+    RuntimeProfile::Counter* _variant_subtree_default_iter_count = nullptr;
+    // Variant subtree: times selecting leaf iterator (target subcolumn is a 
leaf)
+    RuntimeProfile::Counter* _variant_subtree_leaf_iter_count = nullptr;
+    // Variant subtree: times selecting hierarchical iterator (node has 
children and sparse columns)
+    RuntimeProfile::Counter* _variant_subtree_hierarchical_iter_count = 
nullptr;
+    // Variant subtree: times selecting sparse iterator (iterate over sparse 
subcolumn)
+    RuntimeProfile::Counter* _variant_subtree_sparse_iter_count = nullptr;
+
     std::vector<TabletWithVersion> _tablets;
     std::vector<TabletReadSource> _read_sources;
 };
diff --git a/be/src/service/point_query_executor.cpp 
b/be/src/service/point_query_executor.cpp
index 4377e26fafd..ee923b27d64 100644
--- a/be/src/service/point_query_executor.cpp
+++ b/be/src/service/point_query_executor.cpp
@@ -503,8 +503,12 @@ Status PointQueryExecutor::_lookup_row_data() {
                         
_result_block->get_by_position(pos).column->assume_mutable();
                 std::unique_ptr<ColumnIterator> iter;
                 SlotDescriptor* slot = _reusable->tuple_desc()->slots()[pos];
+                StorageReadOptions storage_read_options;
+                storage_read_options.stats = &_read_stats;
+                storage_read_options.io_ctx.reader_type = 
ReaderType::READER_QUERY;
                 
RETURN_IF_ERROR(segment->seek_and_read_by_rowid(*_tablet->tablet_schema(), slot,
-                                                                row_id, 
column, _read_stats, iter));
+                                                                row_id, column,
+                                                                
storage_read_options, iter));
                 if (_tablet->tablet_schema()
                             ->column_by_uid(slot->col_unique_id())
                             .has_char_type()) {
diff --git a/be/src/vec/exec/scan/new_olap_scanner.cpp 
b/be/src/vec/exec/scan/new_olap_scanner.cpp
index ddb17471e08..7711fd5e3ed 100644
--- a/be/src/vec/exec/scan/new_olap_scanner.cpp
+++ b/be/src/vec/exec/scan/new_olap_scanner.cpp
@@ -701,7 +701,21 @@ void NewOlapScanner::_collect_profile_before_close() {
     COUNTER_UPDATE(Parent->_output_index_result_column_timer,                  
                  \
                    stats.output_index_result_column_timer);                    
                  \
     COUNTER_UPDATE(Parent->_filtered_segment_counter, 
stats.filtered_segment_number);            \
-    COUNTER_UPDATE(Parent->_total_segment_counter, stats.total_segment_number);
+    COUNTER_UPDATE(Parent->_total_segment_counter, 
stats.total_segment_number);                  \
+    COUNTER_UPDATE(Parent->_variant_scan_sparse_column_timer,                  
                  \
+                   stats.variant_scan_sparse_column_timer_ns);                 
                  \
+    COUNTER_UPDATE(Parent->_variant_scan_sparse_column_bytes,                  
                  \
+                   stats.variant_scan_sparse_column_bytes);                    
                  \
+    COUNTER_UPDATE(Parent->_variant_fill_path_from_sparse_column_timer,        
                  \
+                   stats.variant_fill_path_from_sparse_column_timer_ns);       
                  \
+    COUNTER_UPDATE(Parent->_variant_subtree_default_iter_count,                
                  \
+                   stats.variant_subtree_default_iter_count);                  
                  \
+    COUNTER_UPDATE(Parent->_variant_subtree_leaf_iter_count,                   
                  \
+                   stats.variant_subtree_leaf_iter_count);                     
                  \
+    COUNTER_UPDATE(Parent->_variant_subtree_hierarchical_iter_count,           
                  \
+                   stats.variant_subtree_hierarchical_iter_count);             
                  \
+    COUNTER_UPDATE(Parent->_variant_subtree_sparse_iter_count,                 
                  \
+                   stats.variant_subtree_sparse_iter_count);
 
     // Update counters for NewOlapScanner
     // Update counters from tablet reader's stats
diff --git 
a/be/test/olap/rowset/segment_v2/variant_column_writer_reader_test.cpp 
b/be/test/olap/rowset/segment_v2/variant_column_writer_reader_test.cpp
index 117fc0579b5..1608ab9a6e6 100644
--- a/be/test/olap/rowset/segment_v2/variant_column_writer_reader_test.cpp
+++ b/be/test/olap/rowset/segment_v2/variant_column_writer_reader_test.cpp
@@ -294,13 +294,14 @@ TEST_F(VariantColumnWriterReaderTest, 
test_write_data_normal) {
     ColumnIteratorUPtr it;
     TabletColumn parent_column = _tablet_schema->column(0);
     StorageReadOptions storage_read_opts;
+    OlapReaderStatistics stats;
     storage_read_opts.io_ctx.reader_type = ReaderType::READER_QUERY;
+    storage_read_opts.stats = &stats;
     st = variant_column_reader->new_iterator(&it, &parent_column, 
&storage_read_opts,
                                              &column_reader_cache);
     EXPECT_TRUE(st.ok()) << st.msg();
     EXPECT_TRUE(assert_cast<HierarchicalDataIterator*>(it.get()) != nullptr);
     ColumnIteratorOptions column_iter_opts;
-    OlapReaderStatistics stats;
     column_iter_opts.stats = &stats;
     column_iter_opts.file_reader = file_reader.get();
     st = it->init(column_iter_opts);
@@ -399,6 +400,7 @@ TEST_F(VariantColumnWriterReaderTest, 
test_write_data_normal) {
             // read with opt
             auto* iter = assert_cast<SparseColumnExtractIterator*>(it.get());
             StorageReadOptions storage_read_opts1;
+            storage_read_opts1.stats = &stats;
             storage_read_opts1.io_ctx.reader_type = ReaderType::READER_QUERY;
             iter->_read_opts = &storage_read_opts1;
             st = iter->next_batch(&nrows, new_column_object, nullptr);
@@ -830,12 +832,13 @@ TEST_F(VariantColumnWriterReaderTest, 
test_write_data_advanced) {
     TabletColumn parent_column = _tablet_schema->column(0);
     StorageReadOptions storage_read_opts;
     storage_read_opts.io_ctx.reader_type = ReaderType::READER_QUERY;
+    OlapReaderStatistics stats;
+    storage_read_opts.stats = &stats;
     st = variant_column_reader->new_iterator(&it, &parent_column, 
&storage_read_opts,
                                              &column_reader_cache);
     EXPECT_TRUE(st.ok()) << st.msg();
     EXPECT_TRUE(assert_cast<HierarchicalDataIterator*>(it.get()) != nullptr);
     ColumnIteratorOptions column_iter_opts;
-    OlapReaderStatistics stats;
     column_iter_opts.stats = &stats;
     column_iter_opts.file_reader = file_reader.get();
     st = it->init(column_iter_opts);
@@ -1118,13 +1121,14 @@ TEST_F(VariantColumnWriterReaderTest, 
test_write_data_nullable) {
     ColumnIteratorUPtr it;
     TabletColumn parent_column = _tablet_schema->column(0);
     StorageReadOptions storage_read_opts;
+    OlapReaderStatistics stats;
+    storage_read_opts.stats = &stats;
     storage_read_opts.io_ctx.reader_type = ReaderType::READER_QUERY;
     st = variant_column_reader->new_iterator(&it, &parent_column, 
&storage_read_opts,
                                              &column_reader_cache);
     EXPECT_TRUE(st.ok()) << st.msg();
     EXPECT_TRUE(assert_cast<HierarchicalDataIterator*>(it.get()) != nullptr);
     ColumnIteratorOptions column_iter_opts;
-    OlapReaderStatistics stats;
     column_iter_opts.stats = &stats;
     column_iter_opts.file_reader = file_reader.get();
     st = it->init(column_iter_opts);
@@ -1691,6 +1695,8 @@ TEST_F(VariantColumnWriterReaderTest, 
test_no_sub_in_sparse_column) {
     // 10. test hierarchical reader with empty statistics
     ColumnIteratorUPtr iterator;
     StorageReadOptions read_opts;
+    OlapReaderStatistics stats;
+    read_opts.stats = &stats;
     st = variant_reader->new_iterator(&iterator, &column, &read_opts, 
&column_reader_cache);
     EXPECT_TRUE(st.ok()) << st.msg();
     EXPECT_TRUE(iterator != nullptr);
@@ -1833,6 +1839,8 @@ TEST_F(VariantColumnWriterReaderTest, 
test_prefix_in_sub_and_sparse) {
     // 10. test hierarchical reader with empty statistics
     ColumnIteratorUPtr iterator;
     StorageReadOptions read_opts;
+    OlapReaderStatistics stats;
+    read_opts.stats = &stats;
     st = variant_reader->new_iterator(&iterator, &column, &read_opts, 
&column_reader_cache);
     EXPECT_TRUE(st.ok()) << st.msg();
     EXPECT_TRUE(iterator != nullptr);
@@ -2150,6 +2158,8 @@ TEST_F(VariantColumnWriterReaderTest, test_nested_iter) {
 
     StorageReadOptions storageReadOptions;
     storageReadOptions.io_ctx.reader_type = ReaderType::READER_QUERY;
+    OlapReaderStatistics stats;
+    storageReadOptions.stats = &stats;
 
     ColumnIteratorUPtr nested_column_iter;
     st = variant_column_reader->new_iterator(&nested_column_iter, 
&_tablet_schema->column(0),
@@ -2159,7 +2169,6 @@ TEST_F(VariantColumnWriterReaderTest, test_nested_iter) {
     auto* nested_iter = 
assert_cast<HierarchicalDataIterator*>(nested_column_iter.get());
     EXPECT_TRUE(nested_iter != nullptr);
     ColumnIteratorOptions column_iter_opts;
-    OlapReaderStatistics stats;
     column_iter_opts.stats = &stats;
     column_iter_opts.file_reader = file_reader.get();
     st = nested_iter->init(column_iter_opts);
@@ -2304,6 +2313,8 @@ TEST_F(VariantColumnWriterReaderTest, 
test_nested_iter_nullable) {
 
     StorageReadOptions storageReadOptions;
     storageReadOptions.io_ctx.reader_type = ReaderType::READER_QUERY;
+    OlapReaderStatistics stats;
+    storageReadOptions.stats = &stats;
 
     MockColumnReaderCache column_reader_cache(footer, file_reader, 
_tablet_schema);
 
@@ -2315,7 +2326,6 @@ TEST_F(VariantColumnWriterReaderTest, 
test_nested_iter_nullable) {
     auto* nested_iter = 
assert_cast<HierarchicalDataIterator*>(nested_column_iter.get());
     EXPECT_TRUE(nested_iter != nullptr);
     ColumnIteratorOptions column_iter_opts;
-    OlapReaderStatistics stats;
     column_iter_opts.stats = &stats;
     column_iter_opts.file_reader = file_reader.get();
     st = nested_iter->init(column_iter_opts);
@@ -2470,6 +2480,8 @@ TEST_F(VariantColumnWriterReaderTest, 
test_read_with_checksum) {
     subcolumn.set_is_nullable(true);
     _tablet_schema->append_column(subcolumn);
     storage_read_opts.io_ctx.reader_type = ReaderType::READER_QUERY;
+    OlapReaderStatistics stats;
+    storage_read_opts.stats = &stats;
     ColumnIteratorUPtr hierarchical_it;
 
     MockColumnReaderCache column_reader_cache(footer, file_reader, 
_tablet_schema);
@@ -2485,7 +2497,6 @@ TEST_F(VariantColumnWriterReaderTest, 
test_read_with_checksum) {
     EXPECT_TRUE(st.ok()) << st.msg();
     EXPECT_TRUE(dynamic_cast<FileColumnIterator*>(it.get()) != nullptr);
     ColumnIteratorOptions column_iter_opts;
-    OlapReaderStatistics stats;
     column_iter_opts.stats = &stats;
     column_iter_opts.file_reader = file_reader.get();
     st = it->init(column_iter_opts);


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

Reply via email to