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

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


The following commit(s) were added to refs/heads/branch-1.1-lts by this push:
     new 4b6a6ca8d7 (storage) Level1Iterator should release iterators in heap 
(#12592)
4b6a6ca8d7 is described below

commit 4b6a6ca8d72ed2bc1e6e3de6e552a78a6ba2b4a1
Author: Yongqiang YANG <[email protected]>
AuthorDate: Thu Sep 15 09:13:57 2022 +0800

    (storage) Level1Iterator should release iterators in heap (#12592)
    
    When there is a query with limit, e.g. select * from limit 1, scanners
    are closed by FragmentExecutor, then some scanners do not run to eof
    and mem leaks happen.
    
    We have to release iterators in the heap.
---
 be/src/vec/olap/vcollect_iterator.cpp | 24 ++++++++++++++++--------
 be/src/vec/olap/vcollect_iterator.h   |  5 +++--
 2 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/be/src/vec/olap/vcollect_iterator.cpp 
b/be/src/vec/olap/vcollect_iterator.cpp
index 0d351a55fb..efc1ecd305 100644
--- a/be/src/vec/olap/vcollect_iterator.cpp
+++ b/be/src/vec/olap/vcollect_iterator.cpp
@@ -23,7 +23,12 @@
 namespace doris {
 namespace vectorized {
 
-VCollectIterator::~VCollectIterator() {}
+VCollectIterator::VCollectIterator() {
+}
+
+VCollectIterator::~VCollectIterator() {
+    DCHECK(_children.empty());
+}
 
 #define RETURN_IF_NOT_EOF_AND_OK(stmt)                                         
         \
     do {                                                                       
         \
@@ -100,12 +105,12 @@ OLAPStatus 
VCollectIterator::build_heap(std::vector<RowsetReaderSharedPtr>& rs_r
                 }
                 ++i;
             }
-            Level1Iterator* cumu_iter = new Level1Iterator(cumu_children, 
_reader,
-                                                           
cumu_children.size() > 1, _skip_same);
+            std::unique_ptr<Level1Iterator> cumu_iter(new 
Level1Iterator(cumu_children, _reader,
+                                                         cumu_children.size() 
> 1, _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);
+            children.push_back(cumu_iter.release());
             _inner_iter.reset(new Level1Iterator(children, _reader, _merge, 
_skip_same));
         } else {
             // _children.size() == 1
@@ -251,10 +256,12 @@ VCollectIterator::Level1Iterator::Level1Iterator(
 
 VCollectIterator::Level1Iterator::~Level1Iterator() {
     for (auto child : _children) {
-        if (child != nullptr) {
-            delete child;
-            child = nullptr;
-        }
+        delete child;
+    }
+    while (_heap != nullptr && !_heap->empty()) {
+        LevelIterator* it = _heap->top();
+        delete it;
+        _heap->pop();
     }
 }
 
@@ -323,6 +330,7 @@ OLAPStatus VCollectIterator::Level1Iterator::init() {
         _cur_child = *_children.begin();
     }
     _ref = *_cur_child->current_row_ref();
+    DCHECK(_ref.row_pos != -1);
     return OLAP_SUCCESS;
 }
 
diff --git a/be/src/vec/olap/vcollect_iterator.h 
b/be/src/vec/olap/vcollect_iterator.h
index a37eb5e2c4..9ea2fa2629 100644
--- a/be/src/vec/olap/vcollect_iterator.h
+++ b/be/src/vec/olap/vcollect_iterator.h
@@ -42,6 +42,7 @@ struct IteratorRowRef {
 
 class VCollectIterator {
 public:
+    VCollectIterator();
     // Hold reader point to get reader params
     ~VCollectIterator();
 
@@ -122,7 +123,7 @@ private:
     class Level0Iterator : public LevelIterator {
     public:
         Level0Iterator(RowsetReaderSharedPtr rs_reader, TabletReader* reader);
-        ~Level0Iterator() {}
+        virtual ~Level0Iterator() {}
 
         OLAPStatus init() override;
 
@@ -154,7 +155,7 @@ private:
 
         OLAPStatus next(Block* block) override;
 
-        ~Level1Iterator();
+        virtual ~Level1Iterator();
 
     private:
         inline OLAPStatus _merge_next(IteratorRowRef* ref);


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

Reply via email to