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]