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

morningman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-doris.git


The following commit(s) were added to refs/heads/master by this push:
     new d57c234  [MemTracker] Refactored the hierarchical structure of 
memtracker (#5956)
d57c234 is described below

commit d57c2344e1a2cac20b37e9f00a060b5027a3f3e1
Author: Mingyu Chen <[email protected]>
AuthorDate: Wed Jun 16 09:44:24 2021 +0800

    [MemTracker] Refactored the hierarchical structure of memtracker (#5956)
    
    To avoid showing too many memtracker on BE web pages.
    The MemTracker level now has 3 levels: OVERVIEW, TASK and VERBOSE.
    
    OVERVIEW Mainly used for main memory consumption module such as 
Query/Load/Metadata.
    TASK is mainly used to record the memory overhead of a single task such as 
a single query, load, and compaction task.
    VERBOSE is used for other more detailed memtrackers.
---
 be/src/exec/olap_scanner.cpp                       |  2 +-
 be/src/http/action/compaction_action.h             |  2 +-
 be/src/http/default_path_handlers.cpp              | 12 +++--
 be/src/olap/compaction.cpp                         |  4 +-
 be/src/olap/fs/file_block_manager.cpp              |  4 +-
 be/src/olap/lru_cache.cpp                          |  2 +-
 be/src/olap/page_cache.cpp                         |  2 +-
 be/src/olap/rowset/beta_rowset.cpp                 |  2 +-
 be/src/olap/rowset/beta_rowset_reader.cpp          |  2 +-
 be/src/olap/rowset/segment_reader.cpp              |  2 +-
 be/src/olap/rowset/segment_v2/segment.cpp          | 22 ++++++---
 be/src/olap/rowset/segment_v2/segment.h            |  9 ++--
 be/src/olap/rowset/segment_v2/segment_iterator.cpp |  6 +--
 be/src/olap/schema_change.cpp                      |  4 +-
 be/src/olap/storage_engine.cpp                     |  8 ++--
 be/src/olap/storage_engine.h                       |  4 ++
 be/src/olap/tablet_manager.cpp                     |  2 +-
 be/src/runtime/buffered_block_mgr2.cc              |  2 -
 be/src/runtime/exec_env.h                          |  3 ++
 be/src/runtime/exec_env_init.cpp                   |  4 +-
 be/src/runtime/load_channel.cpp                    |  2 +-
 be/src/runtime/load_channel_mgr.cpp                |  2 +-
 be/src/runtime/mem_tracker.cpp                     |  4 +-
 be/src/runtime/mem_tracker.h                       |  6 +--
 be/src/runtime/plan_fragment_executor.cpp          |  2 +-
 be/test/olap/rowset/segment_v2/segment_test.cpp    | 52 +++++++++++-----------
 26 files changed, 94 insertions(+), 72 deletions(-)

diff --git a/be/src/exec/olap_scanner.cpp b/be/src/exec/olap_scanner.cpp
index 1f719c9..e97d3ce 100644
--- a/be/src/exec/olap_scanner.cpp
+++ b/be/src/exec/olap_scanner.cpp
@@ -53,7 +53,7 @@ OlapScanner::OlapScanner(RuntimeState* runtime_state, 
OlapScanNode* parent, bool
           _version(-1),
           _mem_tracker(MemTracker::CreateTracker(
                   runtime_state->fragment_mem_tracker()->limit(), 
"OlapScanner",
-                  runtime_state->fragment_mem_tracker(), true, true, 
MemTrackerLevel::DEBUG)) {
+                  runtime_state->fragment_mem_tracker(), true, true, 
MemTrackerLevel::VERBOSE)) {
     _rows_read_counter = parent->rows_read_counter();
     _rows_pushed_cond_filtered_counter = 
parent->_rows_pushed_cond_filtered_counter;
 }
diff --git a/be/src/http/action/compaction_action.h 
b/be/src/http/action/compaction_action.h
index 5a7b936..57513de 100644
--- a/be/src/http/action/compaction_action.h
+++ b/be/src/http/action/compaction_action.h
@@ -42,7 +42,7 @@ public:
     CompactionAction(CompactionActionType type)
             : _type(type) {
               _compaction_mem_tracker = type == RUN_COMPACTION ?
-                  MemTracker::CreateTracker(-1, "ManualCompaction") : nullptr;
+                  MemTracker::CreateTracker(-1, "ManualCompaction", nullptr, 
false, false, MemTrackerLevel::TASK) : nullptr;
     }
 
     virtual ~CompactionAction() {}
diff --git a/be/src/http/default_path_handlers.cpp 
b/be/src/http/default_path_handlers.cpp
index d11991d..d841697 100644
--- a/be/src/http/default_path_handlers.cpp
+++ b/be/src/http/default_path_handlers.cpp
@@ -129,7 +129,8 @@ void mem_tracker_handler(const WebPageHandler::ArgumentMap& 
args, std::stringstr
                  "       data-search='true' "
                  "       class='table table-striped'>\n";
     (*output) << "<thead><tr>"
-                 "<th>Id</th>"
+                 "<th data-sortable='true' "
+                 ">Id</th>"
                  "<th>Parent</th>"
                  "<th>Limit</th>"
                  "<th data-sorter='bytesSorter' "
@@ -137,7 +138,9 @@ void mem_tracker_handler(const WebPageHandler::ArgumentMap& 
args, std::stringstr
                  ">Current Consumption</th>"
                  "<th data-sorter='bytesSorter' "
                  "    data-sortable='true' "
-                 ">Peak Consumption</th>";
+                 ">Peak Consumption</th>"
+                 "<th data-sortable='true' "
+                 ">Use Count</th></tr></thead>";
     (*output) << "<tbody>\n";
 
     std::vector<shared_ptr<MemTracker>> trackers;
@@ -147,10 +150,11 @@ void mem_tracker_handler(const 
WebPageHandler::ArgumentMap& args, std::stringstr
         string limit_str = tracker->limit() == -1 ? "none" : 
ItoaKMGT(tracker->limit());
         string current_consumption_str = ItoaKMGT(tracker->consumption());
         string peak_consumption_str = ItoaKMGT(tracker->peak_consumption());
+        int64_t use_count = tracker.use_count();
         (*output) << strings::Substitute(
                 "<tr><td>$0</td><td>$1</td><td>$2</td>" // id, parent, limit
-                "<td>$3</td><td>$4</td></tr>\n",        // current, peak
-                tracker->label(), parent, limit_str, current_consumption_str, 
peak_consumption_str);
+                "<td>$3</td><td>$4</td><td>$5</td></tr>\n",        // current, 
peak
+                tracker->label(), parent, limit_str, current_consumption_str, 
peak_consumption_str, use_count);
     }
     (*output) << "</tbody></table>\n";
 }
diff --git a/be/src/olap/compaction.cpp b/be/src/olap/compaction.cpp
index 383ae9c..f735be8 100644
--- a/be/src/olap/compaction.cpp
+++ b/be/src/olap/compaction.cpp
@@ -28,7 +28,7 @@ namespace doris {
 
 Compaction::Compaction(TabletSharedPtr tablet, const std::string& label,
                        const std::shared_ptr<MemTracker>& parent_tracker)
-        : _mem_tracker(MemTracker::CreateTracker(-1, label, parent_tracker, 
true, false)),
+        : _mem_tracker(MemTracker::CreateTracker(-1, label, parent_tracker, 
true, false, MemTrackerLevel::TASK)),
           _readers_tracker(MemTracker::CreateTracker(-1, 
"CompactionReaderTracker:" + std::to_string(tablet->tablet_id()), _mem_tracker,
                   true, false)),
           _writer_tracker(MemTracker::CreateTracker(-1, 
"CompationWriterTracker:" + std::to_string(tablet->tablet_id()), _mem_tracker,
@@ -177,7 +177,7 @@ OLAPStatus Compaction::construct_input_rowset_readers() {
         RETURN_NOT_OK(rowset->create_reader(
                 MemTracker::CreateTracker(
                         -1, "Compaction:RowsetReader:" + 
rowset->rowset_id().to_string(),
-                        _readers_tracker, true, true, MemTrackerLevel::DEBUG),
+                        _readers_tracker, true, true),
                 &rs_reader));
         _input_rs_readers.push_back(std::move(rs_reader));
     }
diff --git a/be/src/olap/fs/file_block_manager.cpp 
b/be/src/olap/fs/file_block_manager.cpp
index 2f49136..f62f95d 100644
--- a/be/src/olap/fs/file_block_manager.cpp
+++ b/be/src/olap/fs/file_block_manager.cpp
@@ -368,8 +368,8 @@ Status FileReadableBlock::readv(uint64_t offset, const 
Slice* results, size_t re
 FileBlockManager::FileBlockManager(Env* env, BlockManagerOptions opts)
         : _env(DCHECK_NOTNULL(env)),
           _opts(std::move(opts)),
-          _mem_tracker(
-                  MemTracker::CreateTracker(-1, "FileBlockManager", 
_opts.parent_mem_tracker)) {
+          _mem_tracker(MemTracker::CreateTracker(-1, "FileBlockManager", 
_opts.parent_mem_tracker,
+                    false, false, MemTrackerLevel::OVERVIEW)) {
     if (_opts.enable_metric) {
         _metrics.reset(new internal::BlockManagerMetrics());
     }
diff --git a/be/src/olap/lru_cache.cpp b/be/src/olap/lru_cache.cpp
index f420cc5..b591909 100644
--- a/be/src/olap/lru_cache.cpp
+++ b/be/src/olap/lru_cache.cpp
@@ -412,7 +412,7 @@ uint32_t ShardedLRUCache::_shard(uint32_t hash) {
 
 ShardedLRUCache::ShardedLRUCache(const std::string& name, size_t 
total_capacity, std::shared_ptr<MemTracker> parent)
         : _name(name), _last_id(1),
-        _mem_tracker(MemTracker::CreateTracker(-1, name, parent, true, false)) 
{
+        _mem_tracker(MemTracker::CreateTracker(-1, name, parent, true, false, 
MemTrackerLevel::OVERVIEW)) {
     const size_t per_shard = (total_capacity + (kNumShards - 1)) / kNumShards;
     for (int s = 0; s < kNumShards; s++) {
         _shards[s].set_capacity(per_shard);
diff --git a/be/src/olap/page_cache.cpp b/be/src/olap/page_cache.cpp
index 6ce9fab..056ad63 100644
--- a/be/src/olap/page_cache.cpp
+++ b/be/src/olap/page_cache.cpp
@@ -29,7 +29,7 @@ void StoragePageCache::create_global_cache(size_t capacity, 
int32_t index_cache_
 
 StoragePageCache::StoragePageCache(size_t capacity, int32_t 
index_cache_percentage)
         : _index_cache_percentage(index_cache_percentage),
-          _mem_tracker(MemTracker::CreateTracker(capacity, "StorgePageCache")) 
{
+          _mem_tracker(MemTracker::CreateTracker(capacity, "StorgePageCache", 
nullptr, true, true, MemTrackerLevel::OVERVIEW)) {
     if (index_cache_percentage == 0) {
         _data_page_cache = 
std::unique_ptr<Cache>(new_lru_cache("DataPageCache", capacity, _mem_tracker));
     } else if (index_cache_percentage == 100) {
diff --git a/be/src/olap/rowset/beta_rowset.cpp 
b/be/src/olap/rowset/beta_rowset.cpp
index fc03a7c..a7a7dcb 100644
--- a/be/src/olap/rowset/beta_rowset.cpp
+++ b/be/src/olap/rowset/beta_rowset.cpp
@@ -50,7 +50,7 @@ OLAPStatus BetaRowset::do_load(bool /*use_cache*/, 
std::shared_ptr<MemTracker> p
     for (int seg_id = 0; seg_id < num_segments(); ++seg_id) {
         std::string seg_path = segment_file_path(_rowset_path, rowset_id(), 
seg_id);
         std::shared_ptr<segment_v2::Segment> segment;
-        auto s = segment_v2::Segment::open(seg_path, seg_id, _schema, parent, 
&segment);
+        auto s = segment_v2::Segment::open(seg_path, seg_id, _schema, 
&segment);
         if (!s.ok()) {
             LOG(WARNING) << "failed to open segment " << seg_path << " under 
rowset " << unique_id()
                          << " : " << s.to_string();
diff --git a/be/src/olap/rowset/beta_rowset_reader.cpp 
b/be/src/olap/rowset/beta_rowset_reader.cpp
index d0e7496..ee13dad 100644
--- a/be/src/olap/rowset/beta_rowset_reader.cpp
+++ b/be/src/olap/rowset/beta_rowset_reader.cpp
@@ -91,7 +91,7 @@ OLAPStatus BetaRowsetReader::init(RowsetReaderContext* 
read_context) {
     std::vector<std::unique_ptr<RowwiseIterator>> seg_iterators;
     for (auto& seg_ptr : _rowset->_segments) {
         std::unique_ptr<RowwiseIterator> iter;
-        auto s = seg_ptr->new_iterator(schema, read_options, &iter);
+        auto s = seg_ptr->new_iterator(schema, read_options, _parent_tracker, 
&iter);
         if (!s.ok()) {
             LOG(WARNING) << "failed to create iterator[" << seg_ptr->id() << 
"]: " << s.to_string();
             return OLAP_ERR_ROWSET_READER_INIT;
diff --git a/be/src/olap/rowset/segment_reader.cpp 
b/be/src/olap/rowset/segment_reader.cpp
index 38d3d1f..8314d0a 100644
--- a/be/src/olap/rowset/segment_reader.cpp
+++ b/be/src/olap/rowset/segment_reader.cpp
@@ -58,7 +58,7 @@ SegmentReader::SegmentReader(const std::string file, 
SegmentGroup* segment_group
           _is_using_mmap(false),
           _is_data_loaded(false),
           _buffer_size(0),
-          _tracker(MemTracker::CreateTracker(-1, "SegmentReader:" + file, 
parent_tracker)),
+          _tracker(MemTracker::CreateTracker(-1, "SegmentReader:" + file, 
parent_tracker, false)),
           _mem_pool(new MemPool(_tracker.get())),
           _shared_buffer(NULL),
           _lru_cache(lru_cache),
diff --git a/be/src/olap/rowset/segment_v2/segment.cpp 
b/be/src/olap/rowset/segment_v2/segment.cpp
index 992d8c4..fbfd52f 100644
--- a/be/src/olap/rowset/segment_v2/segment.cpp
+++ b/be/src/olap/rowset/segment_v2/segment.cpp
@@ -27,6 +27,7 @@
 #include "olap/rowset/segment_v2/page_io.h"
 #include "olap/rowset/segment_v2/segment_iterator.h"
 #include "olap/rowset/segment_v2/segment_writer.h" // k_segment_magic_length
+#include "olap/storage_engine.h"
 #include "olap/tablet_schema.h"
 #include "util/crc32c.h"
 #include "util/slice.h" // Slice
@@ -37,16 +38,22 @@ namespace segment_v2 {
 using strings::Substitute;
 
 Status Segment::open(std::string filename, uint32_t segment_id, const 
TabletSchema* tablet_schema,
-                     std::shared_ptr<MemTracker> parent, 
std::shared_ptr<Segment>* output) {
-    std::shared_ptr<Segment> segment(new Segment(std::move(filename), 
segment_id, tablet_schema, std::move(parent)));
+                     std::shared_ptr<Segment>* output) {
+    std::shared_ptr<Segment> segment(new Segment(std::move(filename), 
segment_id, tablet_schema));
     RETURN_IF_ERROR(segment->_open());
     output->swap(segment);
     return Status::OK();
 }
 
-Segment::Segment(std::string fname, uint32_t segment_id, const TabletSchema* 
tablet_schema, std::shared_ptr<MemTracker> parent)
+Segment::Segment(std::string fname, uint32_t segment_id, const TabletSchema* 
tablet_schema)
         : _fname(std::move(fname)), _segment_id(segment_id),
-          _tablet_schema(tablet_schema), 
_mem_tracker(MemTracker::CreateTracker(-1, "Segment", std::move(parent), false, 
true)) {}
+          _tablet_schema(tablet_schema) {
+#ifndef BE_TEST
+    _mem_tracker = MemTracker::CreateTracker(-1, "Segment", 
StorageEngine::instance()->tablet_mem_tracker(), false);
+#else
+    _mem_tracker = MemTracker::CreateTracker(-1, "Segment", nullptr, false);
+#endif
+}
 
 Segment::~Segment() {
     _mem_tracker->Release(_mem_tracker->consumption());
@@ -59,6 +66,7 @@ Status Segment::_open() {
 }
 
 Status Segment::new_iterator(const Schema& schema, const StorageReadOptions& 
read_options,
+                             std::shared_ptr<MemTracker> parent,
                              std::unique_ptr<RowwiseIterator>* iter) {
     DCHECK_NOTNULL(read_options.stats);
     read_options.stats->total_segment_number++;
@@ -80,7 +88,7 @@ Status Segment::new_iterator(const Schema& schema, const 
StorageReadOptions& rea
     }
 
     RETURN_IF_ERROR(_load_index());
-    iter->reset(new SegmentIterator(this->shared_from_this(), schema, 
_mem_tracker));
+    iter->reset(new SegmentIterator(this->shared_from_this(), schema, parent));
     iter->get()->init(read_options);
     return Status::OK();
 }
@@ -188,7 +196,7 @@ Status Segment::_create_column_readers() {
     return Status::OK();
 }
 
-Status Segment::new_column_iterator(uint32_t cid, ColumnIterator** iter) {
+Status Segment::new_column_iterator(uint32_t cid, std::shared_ptr<MemTracker> 
parent, ColumnIterator** iter) {
     if (_column_readers[cid] == nullptr) {
         const TabletColumn& tablet_column = _tablet_schema->column(cid);
         if (!tablet_column.has_default_value() && 
!tablet_column.is_nullable()) {
@@ -200,7 +208,7 @@ Status Segment::new_column_iterator(uint32_t cid, 
ColumnIterator** iter) {
                         tablet_column.has_default_value(), 
tablet_column.default_value(),
                         tablet_column.is_nullable(), type_info, 
tablet_column.length()));
         ColumnIteratorOptions iter_opts;
-        iter_opts.mem_tracker = MemTracker::CreateTracker(-1, 
"DefaultColumnIterator", _mem_tracker, false);
+        iter_opts.mem_tracker = MemTracker::CreateTracker(-1, 
"DefaultColumnIterator", parent, false);
 
         RETURN_IF_ERROR(default_value_iter->init(iter_opts));
         *iter = default_value_iter.release();
diff --git a/be/src/olap/rowset/segment_v2/segment.h 
b/be/src/olap/rowset/segment_v2/segment.h
index cc883b1..0cfd408 100644
--- a/be/src/olap/rowset/segment_v2/segment.h
+++ b/be/src/olap/rowset/segment_v2/segment.h
@@ -60,18 +60,19 @@ using SegmentSharedPtr = std::shared_ptr<Segment>;
 class Segment : public std::enable_shared_from_this<Segment> {
 public:
     static Status open(std::string filename, uint32_t segment_id, const 
TabletSchema* tablet_schema,
-                       std::shared_ptr<MemTracker> parent, 
std::shared_ptr<Segment>* output);
+                       std::shared_ptr<Segment>* output);
 
     ~Segment();
 
     Status new_iterator(const Schema& schema, const StorageReadOptions& 
read_options,
+                        std::shared_ptr<MemTracker> parent,
                         std::unique_ptr<RowwiseIterator>* iter);
 
     uint64_t id() const { return _segment_id; }
 
     uint32_t num_rows() const { return _footer.num_rows(); }
 
-    Status new_column_iterator(uint32_t cid, ColumnIterator** iter);
+    Status new_column_iterator(uint32_t cid, std::shared_ptr<MemTracker> 
parent, ColumnIterator** iter);
 
     Status new_bitmap_index_iterator(uint32_t cid, BitmapIndexIterator** iter);
 
@@ -104,7 +105,7 @@ public:
 
 private:
     DISALLOW_COPY_AND_ASSIGN(Segment);
-    Segment(std::string fname, uint32_t segment_id, const TabletSchema* 
tablet_schema, std::shared_ptr<MemTracker> parent);
+    Segment(std::string fname, uint32_t segment_id, const TabletSchema* 
tablet_schema);
     // open segment file and read the minimum amount of necessary information 
(footer)
     Status _open();
     Status _parse_footer();
@@ -119,6 +120,8 @@ private:
     uint32_t _segment_id;
     const TabletSchema* _tablet_schema;
 
+    // This mem tracker is only for tracking memory use by segment meta data 
such as footer or index page.
+    // The memory consumed by querying is tracked in segment iterator.
     std::shared_ptr<MemTracker> _mem_tracker;
     SegmentFooterPB _footer;
 
diff --git a/be/src/olap/rowset/segment_v2/segment_iterator.cpp 
b/be/src/olap/rowset/segment_v2/segment_iterator.cpp
index 859cca5..50e8feb 100644
--- a/be/src/olap/rowset/segment_v2/segment_iterator.cpp
+++ b/be/src/olap/rowset/segment_v2/segment_iterator.cpp
@@ -99,7 +99,7 @@ SegmentIterator::SegmentIterator(std::shared_ptr<Segment> 
segment, const Schema&
           _lazy_materialization_read(false),
           _inited(false) {
     // use for count the mem use of ColumnIterator
-    _mem_tracker = MemTracker::CreateTracker(-1, "SegmentIterator", 
std::move(parent), 0);
+    _mem_tracker = MemTracker::CreateTracker(-1, "SegmentIterator", 
std::move(parent), false);
 }
 
 SegmentIterator::~SegmentIterator() {
@@ -194,7 +194,7 @@ Status SegmentIterator::_prepare_seek(const 
StorageReadOptions::KeyRange& key_ra
     // create used column iterator
     for (auto cid : _seek_schema->column_ids()) {
         if (_column_iterators[cid] == nullptr) {
-            RETURN_IF_ERROR(_segment->new_column_iterator(cid, 
&_column_iterators[cid]));
+            RETURN_IF_ERROR(_segment->new_column_iterator(cid, _mem_tracker, 
&_column_iterators[cid]));
             ColumnIteratorOptions iter_opts;
             iter_opts.stats = _opts.stats;
             iter_opts.rblock = _rblock.get();
@@ -322,7 +322,7 @@ Status SegmentIterator::_init_return_column_iterators() {
     }
     for (auto cid : _schema.column_ids()) {
         if (_column_iterators[cid] == nullptr) {
-            RETURN_IF_ERROR(_segment->new_column_iterator(cid, 
&_column_iterators[cid]));
+            RETURN_IF_ERROR(_segment->new_column_iterator(cid, _mem_tracker, 
&_column_iterators[cid]));
             ColumnIteratorOptions iter_opts;
             iter_opts.stats = _opts.stats;
             iter_opts.use_page_cache = _opts.use_page_cache;
diff --git a/be/src/olap/schema_change.cpp b/be/src/olap/schema_change.cpp
index 7d69f60..70b5d15 100644
--- a/be/src/olap/schema_change.cpp
+++ b/be/src/olap/schema_change.cpp
@@ -1361,7 +1361,7 @@ bool 
SchemaChangeWithSorting::_external_sorting(vector<RowsetSharedPtr>& src_row
 }
 
 SchemaChangeHandler::SchemaChangeHandler()
-        : _mem_tracker(MemTracker::CreateTracker(-1, "SchemaChange")) {
+        : _mem_tracker(MemTracker::CreateTracker(-1, "SchemaChange", 
StorageEngine::instance()->schema_change_mem_tracker())) {
     REGISTER_HOOK_METRIC(schema_change_mem_consumption,
                          [this]() { return _mem_tracker->consumption(); });
 }
@@ -1474,7 +1474,7 @@ OLAPStatus 
SchemaChangeHandler::_do_process_alter_tablet_v2(const TAlterTabletRe
     reader_context.seek_columns = &return_columns;
 
     auto mem_tracker = MemTracker::CreateTracker(-1, "AlterTablet:" + 
std::to_string(base_tablet->tablet_id()) + "-"
-        + std::to_string(new_tablet->tablet_id()), _mem_tracker, true, false, 
MemTrackerLevel::DEBUG);
+        + std::to_string(new_tablet->tablet_id()), _mem_tracker, true, false, 
MemTrackerLevel::TASK);
 
     do {
         // get history data to be converted and it will check if there is hold 
in base tablet
diff --git a/be/src/olap/storage_engine.cpp b/be/src/olap/storage_engine.cpp
index e5eaf71..fd20d31 100644
--- a/be/src/olap/storage_engine.cpp
+++ b/be/src/olap/storage_engine.cpp
@@ -113,7 +113,9 @@ StorageEngine::StorageEngine(const EngineOptions& options)
           _index_stream_lru_cache(NULL),
           _file_cache(nullptr),
           _compaction_mem_tracker(
-                  MemTracker::CreateTracker(-1, "AutoCompaction")),
+                  MemTracker::CreateTracker(-1, "AutoCompaction", nullptr, 
false, false, MemTrackerLevel::OVERVIEW)),
+          _tablet_mem_tracker(
+                  MemTracker::CreateTracker(-1, "TabletHeader", nullptr, 
false, false, MemTrackerLevel::OVERVIEW)),
           _stop_background_threads_latch(1),
           _tablet_manager(new TabletManager(config::tablet_map_shard_size)),
           _txn_manager(new TxnManager(config::txn_map_shard_size, 
config::txn_shard_size)),
@@ -1028,14 +1030,14 @@ bool 
StorageEngine::check_rowset_id_in_unused_rowsets(const RowsetId& rowset_id)
 
 void StorageEngine::create_cumulative_compaction(
         TabletSharedPtr best_tablet, std::shared_ptr<CumulativeCompaction>& 
cumulative_compaction) {
-    std::string tracker_label = "StorageEngine:CumulativeCompaction:" + 
std::to_string(syscall(__NR_gettid));
+    std::string tracker_label = "StorageEngine:CumulativeCompaction:" + 
std::to_string(best_tablet->tablet_id());
     cumulative_compaction.reset(
             new CumulativeCompaction(best_tablet, tracker_label, 
_compaction_mem_tracker));
 }
 
 void StorageEngine::create_base_compaction(TabletSharedPtr best_tablet,
                                            std::shared_ptr<BaseCompaction>& 
base_compaction) {
-    std::string tracker_label = "StorageEngine:BaseCompaction:" + 
std::to_string(syscall(__NR_gettid));
+    std::string tracker_label = "StorageEngine:BaseCompaction:" + 
std::to_string(best_tablet->tablet_id());
     base_compaction.reset(new BaseCompaction(best_tablet, tracker_label, 
_compaction_mem_tracker));
 }
 
diff --git a/be/src/olap/storage_engine.h b/be/src/olap/storage_engine.h
index 8980e82..26afb53 100644
--- a/be/src/olap/storage_engine.h
+++ b/be/src/olap/storage_engine.h
@@ -179,6 +179,9 @@ public:
 
     Status get_compaction_status_json(std::string* result);
 
+    std::shared_ptr<MemTracker> tablet_mem_tracker() { return 
_tablet_mem_tracker; }
+    std::shared_ptr<MemTracker> schema_change_mem_tracker() { return 
_schema_change_mem_tracker; }
+
 private:
     // Instance should be inited from `static open()`
     // MUST NOT be called in other circumstances.
@@ -306,6 +309,7 @@ private:
     std::unordered_map<std::string, RowsetSharedPtr> _unused_rowsets;
 
     std::shared_ptr<MemTracker> _compaction_mem_tracker;
+    std::shared_ptr<MemTracker> _tablet_mem_tracker;
     std::shared_ptr<MemTracker> _schema_change_mem_tracker;
 
     CountDownLatch _stop_background_threads_latch;
diff --git a/be/src/olap/tablet_manager.cpp b/be/src/olap/tablet_manager.cpp
index b1e7cf3..09a9e87 100644
--- a/be/src/olap/tablet_manager.cpp
+++ b/be/src/olap/tablet_manager.cpp
@@ -71,7 +71,7 @@ static bool _cmp_tablet_by_create_time(const TabletSharedPtr& 
a, const TabletSha
 }
 
 TabletManager::TabletManager(int32_t tablet_map_lock_shard_size)
-        : _mem_tracker(MemTracker::CreateTracker(-1, "TabletManager", nullptr, 
false)),
+        : _mem_tracker(MemTracker::CreateTracker(-1, "TabletMeta", nullptr, 
false, false, MemTrackerLevel::OVERVIEW)),
           _tablets_shards_size(tablet_map_lock_shard_size),
           _tablets_shards_mask(tablet_map_lock_shard_size - 1),
           _last_update_stat_ms(0) {
diff --git a/be/src/runtime/buffered_block_mgr2.cc 
b/be/src/runtime/buffered_block_mgr2.cc
index 9621092..48d4a76 100644
--- a/be/src/runtime/buffered_block_mgr2.cc
+++ b/be/src/runtime/buffered_block_mgr2.cc
@@ -1288,8 +1288,6 @@ void BufferedBlockMgr2::init(DiskIoMgr* io_mgr, 
RuntimeProfile* parent_profile,
     _integrity_check_timer = ADD_TIMER(_profile.get(), 
"TotalIntegrityCheckTime");
 
     // Create a new mem_tracker and allocate buffers.
-    // _mem_tracker.reset(new MemTracker(
-    //             profile(), mem_limit, -1, "Block Manager", parent_tracker));
     _mem_tracker = MemTracker::CreateTracker(mem_limit, "BufferedBlockMgr2", 
parent_tracker);
 
     _initialized = true;
diff --git a/be/src/runtime/exec_env.h b/be/src/runtime/exec_env.h
index 5968a8e..2fcf901 100644
--- a/be/src/runtime/exec_env.h
+++ b/be/src/runtime/exec_env.h
@@ -140,6 +140,9 @@ public:
 
     PluginMgr* plugin_mgr() { return _plugin_mgr; }
 
+    // The root tracker should be set before calling ExecEnv::init();
+    void set_root_mem_tracker(std::shared_ptr<MemTracker> root_tracker);
+
 private:
     Status _init(const std::vector<StorePath>& store_paths);
     void _destroy();
diff --git a/be/src/runtime/exec_env_init.cpp b/be/src/runtime/exec_env_init.cpp
index 7bd31a3..63095d5 100644
--- a/be/src/runtime/exec_env_init.cpp
+++ b/be/src/runtime/exec_env_init.cpp
@@ -185,8 +185,8 @@ Status ExecEnv::_init_mem_tracker() {
         return Status::InternalError(ss.str());
     }
 
-    _mem_tracker = MemTracker::CreateTracker(bytes_limit, "Query", 
MemTracker::GetRootTracker(),
-                    false, false);
+    _mem_tracker = MemTracker::CreateTracker(bytes_limit, "Process", 
MemTracker::GetRootTracker(),
+                    false, false, MemTrackerLevel::OVERVIEW);
 
     LOG(INFO) << "Using global memory limit: " << 
PrettyPrinter::print(bytes_limit, TUnit::BYTES);
     RETURN_IF_ERROR(_disk_io_mgr->init(_mem_tracker));
diff --git a/be/src/runtime/load_channel.cpp b/be/src/runtime/load_channel.cpp
index d6ade09..43f8a88 100644
--- a/be/src/runtime/load_channel.cpp
+++ b/be/src/runtime/load_channel.cpp
@@ -27,7 +27,7 @@ LoadChannel::LoadChannel(const UniqueId& load_id, int64_t 
mem_limit, int64_t tim
                          const std::shared_ptr<MemTracker>& mem_tracker)
         : _load_id(load_id), _timeout_s(timeout_s) {
     _mem_tracker = MemTracker::CreateTracker(
-            mem_limit, "LoadChannel:" + _load_id.to_string(), mem_tracker, 
true, false);
+            mem_limit, "LoadChannel:" + _load_id.to_string(), mem_tracker, 
true, false, MemTrackerLevel::TASK);
     // _last_updated_time should be set before being inserted to
     // _load_channels in load_channel_mgr, or it may be erased
     // immediately by gc thread.
diff --git a/be/src/runtime/load_channel_mgr.cpp 
b/be/src/runtime/load_channel_mgr.cpp
index 15e2c08..f0110aa 100644
--- a/be/src/runtime/load_channel_mgr.cpp
+++ b/be/src/runtime/load_channel_mgr.cpp
@@ -85,7 +85,7 @@ LoadChannelMgr::~LoadChannelMgr() {
 
 Status LoadChannelMgr::init(int64_t process_mem_limit) {
     int64_t load_mem_limit = calc_process_max_load_memory(process_mem_limit);
-    _mem_tracker = MemTracker::CreateTracker(load_mem_limit, "Load");
+    _mem_tracker = MemTracker::CreateTracker(load_mem_limit, "LoadChannelMgr", 
nullptr, true, false, MemTrackerLevel::OVERVIEW);
     REGISTER_HOOK_METRIC(load_mem_consumption, [this]() {
         return _mem_tracker->consumption();
     });
diff --git a/be/src/runtime/mem_tracker.cpp b/be/src/runtime/mem_tracker.cpp
index 9177e72..ea0a169 100644
--- a/be/src/runtime/mem_tracker.cpp
+++ b/be/src/runtime/mem_tracker.cpp
@@ -72,7 +72,7 @@ static std::shared_ptr<MemTracker> root_tracker;
 static GoogleOnceType root_tracker_once = GOOGLE_ONCE_INIT;
 
 void MemTracker::CreateRootTracker() {
-    root_tracker.reset(new MemTracker(-1, "Root"));
+    root_tracker.reset(new MemTracker(nullptr, -1, "Root", nullptr, true, 
MemTrackerLevel::OVERVIEW));
     root_tracker->Init();
 }
 
@@ -143,7 +143,7 @@ std::shared_ptr<MemTracker> 
MemTracker::CreateTracker(int64_t byte_limit, const
 }
 
 MemTracker::MemTracker(int64_t byte_limit, const std::string& label)
-        : MemTracker(nullptr, byte_limit, label, 
std::shared_ptr<MemTracker>(), true, MemTrackerLevel::RELEASE) {}
+        : MemTracker(nullptr, byte_limit, label, 
std::shared_ptr<MemTracker>(), true, MemTrackerLevel::VERBOSE) {}
 
 MemTracker::MemTracker(RuntimeProfile* profile, int64_t byte_limit, const 
string& label,
                        const std::shared_ptr<MemTracker>& parent, bool 
log_usage_if_zero, MemTrackerLevel level)
diff --git a/be/src/runtime/mem_tracker.h b/be/src/runtime/mem_tracker.h
index 142e611..b938f6e 100644
--- a/be/src/runtime/mem_tracker.h
+++ b/be/src/runtime/mem_tracker.h
@@ -42,7 +42,7 @@ enum class MemLimit { HARD, SOFT };
 
 /// The Level use to decide whether to show it in web page
 /// each MemTracker have a Level equals to parent, only be set explicit
-enum class MemTrackerLevel {RELEASE = 0, DEBUG};
+enum class MemTrackerLevel {OVERVIEW = 0, TASK, VERBOSE};
 
 class ObjectPool;
 class MemTracker;
@@ -92,11 +92,11 @@ public:
     static std::shared_ptr<MemTracker> CreateTracker(
             int64_t byte_limit = -1, const std::string& label = std::string(),
             std::shared_ptr<MemTracker> parent = std::shared_ptr<MemTracker>(),
-            bool log_usage_if_zero = true, bool reset_label_name = true, 
MemTrackerLevel level = MemTrackerLevel::RELEASE);
+            bool log_usage_if_zero = true, bool reset_label_name = true, 
MemTrackerLevel level = MemTrackerLevel::VERBOSE);
 
     static std::shared_ptr<MemTracker> CreateTracker(
             RuntimeProfile* profile, int64_t byte_limit, const std::string& 
label = std::string(),
-            const std::shared_ptr<MemTracker>& parent = 
std::shared_ptr<MemTracker>(), bool reset_label_name = true, MemTrackerLevel 
level = MemTrackerLevel::RELEASE);
+            const std::shared_ptr<MemTracker>& parent = 
std::shared_ptr<MemTracker>(), bool reset_label_name = true, MemTrackerLevel 
level = MemTrackerLevel::VERBOSE);
 
     // this is used for creating an orphan mem tracker, or for unit test.
     // If a mem tracker has parent, it should be created by `CreateTracker()`
diff --git a/be/src/runtime/plan_fragment_executor.cpp 
b/be/src/runtime/plan_fragment_executor.cpp
index 3bd8a1b..2df18a5 100644
--- a/be/src/runtime/plan_fragment_executor.cpp
+++ b/be/src/runtime/plan_fragment_executor.cpp
@@ -132,7 +132,7 @@ Status PlanFragmentExecutor::prepare(const 
TExecPlanFragmentParams& request,
     _mem_tracker = MemTracker::CreateTracker(bytes_limit,
                                              "PlanFragmentExecutor:" + 
print_id(_query_id) + ":" +
                                                      
print_id(params.fragment_instance_id),
-                                             _exec_env->process_mem_tracker(), 
true, false);
+                                             _exec_env->process_mem_tracker(), 
true, false, MemTrackerLevel::TASK);
     _runtime_state->set_fragment_mem_tracker(_mem_tracker);
 
     LOG(INFO) << "Using query memory limit: " << 
PrettyPrinter::print(bytes_limit, TUnit::BYTES);
diff --git a/be/test/olap/rowset/segment_v2/segment_test.cpp 
b/be/test/olap/rowset/segment_v2/segment_test.cpp
index 2efb213..cbb3ac8 100644
--- a/be/test/olap/rowset/segment_v2/segment_test.cpp
+++ b/be/test/olap/rowset/segment_v2/segment_test.cpp
@@ -136,7 +136,7 @@ protected:
         ASSERT_TRUE(st.ok());
         ASSERT_TRUE(wblock->close().ok());
 
-        st = Segment::open(filename, 0, &query_schema, 
MemTracker::CreateTracker(-1, "Segment", nullptr, false), res);
+        st = Segment::open(filename, 0, &query_schema, res);
         ASSERT_TRUE(st.ok());
         ASSERT_EQ(nrows, (*res)->num_rows());
     }
@@ -164,7 +164,7 @@ TEST_F(SegmentReaderWriterTest, normal) {
             StorageReadOptions read_opts;
             read_opts.stats = &stats;
             std::unique_ptr<RowwiseIterator> iter;
-            segment->new_iterator(schema, read_opts, &iter);
+            segment->new_iterator(schema, read_opts, nullptr, &iter);
 
             RowBlockV2 block(schema, 1024);
 
@@ -220,7 +220,7 @@ TEST_F(SegmentReaderWriterTest, normal) {
             read_opts.stats = &stats;
             read_opts.key_ranges.emplace_back(lower_bound.get(), false, 
upper_bound.get(), true);
             std::unique_ptr<RowwiseIterator> iter;
-            segment->new_iterator(schema, read_opts, &iter);
+            segment->new_iterator(schema, read_opts, nullptr, &iter);
 
             RowBlockV2 block(schema, 100);
             ASSERT_TRUE(iter->next_batch(&block).ok());
@@ -246,7 +246,7 @@ TEST_F(SegmentReaderWriterTest, normal) {
             read_opts.stats = &stats;
             read_opts.key_ranges.emplace_back(lower_bound.get(), false, 
nullptr, false);
             std::unique_ptr<RowwiseIterator> iter;
-            segment->new_iterator(schema, read_opts, &iter);
+            segment->new_iterator(schema, read_opts, nullptr, &iter);
 
             RowBlockV2 block(schema, 100);
             ASSERT_TRUE(iter->next_batch(&block).is_end_of_file());
@@ -275,7 +275,7 @@ TEST_F(SegmentReaderWriterTest, normal) {
             read_opts.stats = &stats;
             read_opts.key_ranges.emplace_back(lower_bound.get(), false, 
upper_bound.get(), false);
             std::unique_ptr<RowwiseIterator> iter;
-            segment->new_iterator(schema, read_opts, &iter);
+            segment->new_iterator(schema, read_opts, nullptr, &iter);
 
             RowBlockV2 block(schema, 100);
             ASSERT_TRUE(iter->next_batch(&block).is_end_of_file());
@@ -312,7 +312,7 @@ TEST_F(SegmentReaderWriterTest, LazyMaterialization) {
             read_opts.stats = &stats;
 
             std::unique_ptr<RowwiseIterator> iter;
-            ASSERT_TRUE(segment->new_iterator(read_schema, read_opts, 
&iter).ok());
+            ASSERT_TRUE(segment->new_iterator(read_schema, read_opts, nullptr, 
&iter).ok());
 
             RowBlockV2 block(read_schema, 1024);
             ASSERT_TRUE(iter->next_batch(&block).ok());
@@ -336,7 +336,7 @@ TEST_F(SegmentReaderWriterTest, LazyMaterialization) {
             read_opts.stats = &stats;
 
             std::unique_ptr<RowwiseIterator> iter;
-            ASSERT_TRUE(segment->new_iterator(read_schema, read_opts, 
&iter).ok());
+            ASSERT_TRUE(segment->new_iterator(read_schema, read_opts, nullptr, 
&iter).ok());
 
             RowBlockV2 block(read_schema, 1024);
             ASSERT_TRUE(iter->next_batch(&block).ok());
@@ -356,7 +356,7 @@ TEST_F(SegmentReaderWriterTest, LazyMaterialization) {
             read_opts.stats = &stats;
 
             std::unique_ptr<RowwiseIterator> iter;
-            ASSERT_TRUE(segment->new_iterator(read_schema, read_opts, 
&iter).ok());
+            ASSERT_TRUE(segment->new_iterator(read_schema, read_opts, nullptr, 
&iter).ok());
 
             RowBlockV2 block(read_schema, 1024);
             ASSERT_TRUE(iter->next_batch(&block).ok());
@@ -388,7 +388,7 @@ TEST_F(SegmentReaderWriterTest, LazyMaterialization) {
             read_opts.stats = &stats;
 
             std::unique_ptr<RowwiseIterator> iter;
-            ASSERT_TRUE(segment->new_iterator(read_schema, read_opts, 
&iter).ok());
+            ASSERT_TRUE(segment->new_iterator(read_schema, read_opts, nullptr, 
&iter).ok());
 
             RowBlockV2 block(read_schema, 1024);
             ASSERT_TRUE(iter->next_batch(&block).ok());
@@ -450,7 +450,7 @@ TEST_F(SegmentReaderWriterTest, TestIndex) {
             read_opts.conditions = conditions.get();
 
             std::unique_ptr<RowwiseIterator> iter;
-            segment->new_iterator(schema, read_opts, &iter);
+            segment->new_iterator(schema, read_opts, nullptr, &iter);
 
             RowBlockV2 block(schema, 1);
 
@@ -473,7 +473,7 @@ TEST_F(SegmentReaderWriterTest, TestIndex) {
             read_opts.conditions = conditions.get();
 
             std::unique_ptr<RowwiseIterator> iter;
-            segment->new_iterator(schema, read_opts, &iter);
+            segment->new_iterator(schema, read_opts, nullptr, &iter);
 
             RowBlockV2 block(schema, 1024);
 
@@ -533,7 +533,7 @@ TEST_F(SegmentReaderWriterTest, TestIndex) {
             read_opts.delete_conditions.push_back(delete_conditions.get());
 
             std::unique_ptr<RowwiseIterator> iter;
-            segment->new_iterator(schema, read_opts, &iter);
+            segment->new_iterator(schema, read_opts, nullptr, &iter);
 
             RowBlockV2 block(schema, 1024);
 
@@ -581,7 +581,7 @@ TEST_F(SegmentReaderWriterTest, TestIndex) {
             ASSERT_EQ(OLAP_SUCCESS, conditions->append_condition(condition));
             read_opts.conditions = conditions.get();
             std::unique_ptr<RowwiseIterator> iter;
-            segment->new_iterator(schema, read_opts, &iter);
+            segment->new_iterator(schema, read_opts, nullptr, &iter);
 
             RowBlockV2 block(schema, 1024);
             ASSERT_TRUE(iter->next_batch(&block).is_end_of_file());
@@ -674,7 +674,7 @@ TEST_F(SegmentReaderWriterTest, TestDefaultValueColumn) {
             StorageReadOptions read_opts;
             read_opts.stats = &stats;
             std::unique_ptr<RowwiseIterator> iter;
-            segment->new_iterator(schema, read_opts, &iter);
+            segment->new_iterator(schema, read_opts, nullptr, &iter);
 
             RowBlockV2 block(schema, 1024);
 
@@ -724,7 +724,7 @@ TEST_F(SegmentReaderWriterTest, TestDefaultValueColumn) {
             StorageReadOptions read_opts;
             read_opts.stats = &stats;
             std::unique_ptr<RowwiseIterator> iter;
-            segment->new_iterator(schema, read_opts, &iter);
+            segment->new_iterator(schema, read_opts, nullptr, &iter);
 
             RowBlockV2 block(schema, 1024);
 
@@ -817,7 +817,7 @@ TEST_F(SegmentReaderWriterTest, TestStringDict) {
 
     {
         std::shared_ptr<Segment> segment;
-        st = Segment::open(fname, 0, tablet_schema.get(), 
MemTracker::CreateTracker(-1, "Segment", nullptr, false), &segment);
+        st = Segment::open(fname, 0, tablet_schema.get(), &segment);
         ASSERT_TRUE(st.ok());
         ASSERT_EQ(4096, segment->num_rows());
         Schema schema(*tablet_schema);
@@ -827,7 +827,7 @@ TEST_F(SegmentReaderWriterTest, TestStringDict) {
             StorageReadOptions read_opts;
             read_opts.stats = &stats;
             std::unique_ptr<RowwiseIterator> iter;
-            segment->new_iterator(schema, read_opts, &iter);
+            segment->new_iterator(schema, read_opts, nullptr, &iter);
 
             RowBlockV2 block(schema, 1024);
 
@@ -880,7 +880,7 @@ TEST_F(SegmentReaderWriterTest, TestStringDict) {
             read_opts.stats = &stats;
             read_opts.key_ranges.emplace_back(lower_bound.get(), false, 
nullptr, false);
             std::unique_ptr<RowwiseIterator> iter;
-            segment->new_iterator(schema, read_opts, &iter);
+            segment->new_iterator(schema, read_opts, nullptr, &iter);
 
             RowBlockV2 block(schema, 100);
             st = iter->next_batch(&block);
@@ -913,7 +913,7 @@ TEST_F(SegmentReaderWriterTest, TestStringDict) {
             read_opts.stats = &stats;
             read_opts.key_ranges.emplace_back(lower_bound.get(), false, 
upper_bound.get(), false);
             std::unique_ptr<RowwiseIterator> iter;
-            segment->new_iterator(schema, read_opts, &iter);
+            segment->new_iterator(schema, read_opts, nullptr, &iter);
 
             RowBlockV2 block(schema, 100);
             st = iter->next_batch(&block);
@@ -937,7 +937,7 @@ TEST_F(SegmentReaderWriterTest, TestStringDict) {
             read_opts.conditions = conditions.get();
 
             std::unique_ptr<RowwiseIterator> iter;
-            segment->new_iterator(schema, read_opts, &iter);
+            segment->new_iterator(schema, read_opts, nullptr, &iter);
 
             RowBlockV2 block(schema, 1024);
             int left = 4 * 1024;
@@ -994,7 +994,7 @@ TEST_F(SegmentReaderWriterTest, TestStringDict) {
             read_opts.conditions = conditions.get();
 
             std::unique_ptr<RowwiseIterator> iter;
-            segment->new_iterator(schema, read_opts, &iter);
+            segment->new_iterator(schema, read_opts, nullptr, &iter);
 
             RowBlockV2 block(schema, 1024);
 
@@ -1033,7 +1033,7 @@ TEST_F(SegmentReaderWriterTest, TestBitmapPredicate) {
             read_opts.stats = &stats;
 
             std::unique_ptr<RowwiseIterator> iter;
-            segment->new_iterator(schema, read_opts, &iter);
+            segment->new_iterator(schema, read_opts, nullptr, &iter);
 
             RowBlockV2 block(schema, 1024);
             ASSERT_TRUE(iter->next_batch(&block).ok());
@@ -1055,7 +1055,7 @@ TEST_F(SegmentReaderWriterTest, TestBitmapPredicate) {
             read_opts.stats = &stats;
 
             std::unique_ptr<RowwiseIterator> iter;
-            segment->new_iterator(schema, read_opts, &iter);
+            segment->new_iterator(schema, read_opts, nullptr, &iter);
 
             RowBlockV2 block(schema, 1024);
             ASSERT_TRUE(iter->next_batch(&block).ok());
@@ -1077,7 +1077,7 @@ TEST_F(SegmentReaderWriterTest, TestBitmapPredicate) {
             read_opts.stats = &stats;
 
             std::unique_ptr<RowwiseIterator> iter;
-            segment->new_iterator(schema, read_opts, &iter);
+            segment->new_iterator(schema, read_opts, nullptr, &iter);
 
             RowBlockV2 block(schema, 1024);
             ASSERT_FALSE(iter->next_batch(&block).ok());
@@ -1101,7 +1101,7 @@ TEST_F(SegmentReaderWriterTest, TestBitmapPredicate) {
             read_opts.stats = &stats;
 
             std::unique_ptr<RowwiseIterator> iter;
-            segment->new_iterator(schema, read_opts, &iter);
+            segment->new_iterator(schema, read_opts, nullptr, &iter);
 
             RowBlockV2 block(schema, 1024);
             ASSERT_TRUE(iter->next_batch(&block).ok());
@@ -1124,7 +1124,7 @@ TEST_F(SegmentReaderWriterTest, TestBitmapPredicate) {
             read_opts.stats = &stats;
 
             std::unique_ptr<RowwiseIterator> iter;
-            segment->new_iterator(schema, read_opts, &iter);
+            segment->new_iterator(schema, read_opts, nullptr, &iter);
 
             RowBlockV2 block(schema, 1024);
 

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

Reply via email to