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

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


The following commit(s) were added to refs/heads/master by this push:
     new ef2130de57 [improvement](memory) fix possible memory leak of vcollect 
iterator (#16822)
ef2130de57 is described below

commit ef2130de5763a3f22edcbba7b0cb365b26fb166c
Author: TengJianPing <18241664+jackte...@users.noreply.github.com>
AuthorDate: Fri Feb 17 14:40:15 2023 +0800

    [improvement](memory) fix possible memory leak of vcollect iterator (#16822)
    
    Logic in function VCollectIterator::build_heap is not robust, which may 
cause memory leak:
    
                Level1Iterator* cumu_iter = new Level1Iterator(
                        cumu_children, _reader, cumu_children.size() > 1, 
_is_reverse, _skip_same);
                RETURN_IF_NOT_EOF_AND_OK(cumu_iter->init());
                std::list<LevelIterator*> children;
                children.push_back(*base_reader_child);
                children.push_back(cumu_iter);
                _inner_iter.reset(
                        new Level1Iterator(children, _reader, _merge, 
_is_reverse, _skip_same));
    cumu_iter will be leaked if cumu_iter->init()); is not success.
---
 be/src/vec/olap/vcollect_iterator.cpp | 26 +++++++++++++++-----------
 be/src/vec/olap/vcollect_iterator.h   |  2 +-
 2 files changed, 16 insertions(+), 12 deletions(-)

diff --git a/be/src/vec/olap/vcollect_iterator.cpp 
b/be/src/vec/olap/vcollect_iterator.cpp
index b7313210e4..7231ad1453 100644
--- a/be/src/vec/olap/vcollect_iterator.cpp
+++ b/be/src/vec/olap/vcollect_iterator.cpp
@@ -136,18 +136,21 @@ Status 
VCollectIterator::build_heap(std::vector<RowsetReaderSharedPtr>& rs_reade
                 }
                 ++i;
             }
-            Level1Iterator* cumu_iter = new Level1Iterator(
-                    cumu_children, _reader, cumu_children.size() > 1, 
_is_reverse, _skip_same);
+            bool is_merge = cumu_children.size() > 1;
+            auto cumu_iter = 
std::make_unique<Level1Iterator>(std::move(cumu_children), _reader,
+                                                              is_merge, 
_is_reverse, _skip_same);
             RETURN_IF_NOT_EOF_AND_OK(cumu_iter->init());
             std::list<LevelIterator*> children;
             children.push_back(*base_reader_child);
-            children.push_back(cumu_iter);
-            _inner_iter.reset(
-                    new Level1Iterator(children, _reader, _merge, _is_reverse, 
_skip_same));
+            children.push_back(cumu_iter.get());
+            auto level1_iter = new Level1Iterator(std::move(children), 
_reader, _merge, _is_reverse,
+                                                  _skip_same);
+            cumu_iter.release();
+            _inner_iter.reset(level1_iter);
         } else {
             // _children.size() == 1
-            _inner_iter.reset(
-                    new Level1Iterator(_children, _reader, _merge, 
_is_reverse, _skip_same));
+            _inner_iter.reset(new Level1Iterator(std::move(_children), 
_reader, _merge, _is_reverse,
+                                                 _skip_same));
         }
     } else {
         bool have_multiple_child = false;
@@ -166,7 +169,8 @@ Status 
VCollectIterator::build_heap(std::vector<RowsetReaderSharedPtr>& rs_reade
                 ++iter;
             }
         }
-        _inner_iter.reset(new Level1Iterator(_children, _reader, _merge, 
_is_reverse, _skip_same));
+        _inner_iter.reset(
+                new Level1Iterator(std::move(_children), _reader, _merge, 
_is_reverse, _skip_same));
     }
     RETURN_IF_NOT_EOF_AND_OK(_inner_iter->init());
     // Clear _children earlier to release any related references
@@ -524,10 +528,10 @@ Status 
VCollectIterator::Level0Iterator::current_block_row_locations(
 }
 
 VCollectIterator::Level1Iterator::Level1Iterator(
-        const std::list<VCollectIterator::LevelIterator*>& children, 
TabletReader* reader,
-        bool merge, bool is_reverse, bool skip_same)
+        std::list<VCollectIterator::LevelIterator*>&& children, TabletReader* 
reader, bool merge,
+        bool is_reverse, bool skip_same)
         : LevelIterator(reader),
-          _children(children),
+          _children(std::move(children)),
           _reader(reader),
           _merge(merge),
           _is_reverse(is_reverse),
diff --git a/be/src/vec/olap/vcollect_iterator.h 
b/be/src/vec/olap/vcollect_iterator.h
index 3018768d4a..c859fca7a5 100644
--- a/be/src/vec/olap/vcollect_iterator.h
+++ b/be/src/vec/olap/vcollect_iterator.h
@@ -244,7 +244,7 @@ private:
     // Iterate from LevelIterators (maybe Level0Iterators or Level1Iterator or 
mixed)
     class Level1Iterator : public LevelIterator {
     public:
-        Level1Iterator(const std::list<LevelIterator*>& children, 
TabletReader* reader, bool merge,
+        Level1Iterator(std::list<LevelIterator*>&& children, TabletReader* 
reader, bool merge,
                        bool is_reverse, bool skip_same);
 
         Status init(bool get_data_by_ref = false) override;


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to