This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch branch-1.2-lts
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-1.2-lts by this push:
new 594f56245a [bugfix](vexprcontext) expr context not closed if scanner
prepare failed (#18520)
594f56245a is described below
commit 594f56245a86270cc4ba7c359bbd593fe4c5c1dd
Author: yiguolei <[email protected]>
AuthorDate: Tue Apr 11 09:05:47 2023 +0800
[bugfix](vexprcontext) expr context not closed if scanner prepare failed
(#18520)
---------
Co-authored-by: yiguolei <[email protected]>
---
be/src/vec/exec/scan/new_es_scan_node.cpp | 7 ++++++-
be/src/vec/exec/scan/new_jdbc_scan_node.cpp | 7 ++++++-
be/src/vec/exec/scan/new_olap_scan_node.cpp | 10 +++++++---
be/src/vec/exprs/vexpr_context.cpp | 5 ++++-
4 files changed, 23 insertions(+), 6 deletions(-)
diff --git a/be/src/vec/exec/scan/new_es_scan_node.cpp
b/be/src/vec/exec/scan/new_es_scan_node.cpp
index e53ffe6c5b..fe352a9e1d 100644
--- a/be/src/vec/exec/scan/new_es_scan_node.cpp
+++ b/be/src/vec/exec/scan/new_es_scan_node.cpp
@@ -205,7 +205,12 @@ Status NewEsScanNode::_init_scanners(std::list<VScanner*>*
scanners) {
_docvalue_context, doc_value_mode,
_state->runtime_profile());
_scanner_pool.add(scanner);
- RETURN_IF_ERROR(scanner->prepare(_state, _vconjunct_ctx_ptr.get()));
+ Status st = scanner->prepare(_state, _vconjunct_ctx_ptr.get());
+ if (!st.ok()) {
+ // during prepare, scanner already cloned vexpr_context, should
call close to release it.
+ scanner->close(_state);
+ return st;
+ }
scanners->push_back(static_cast<VScanner*>(scanner));
}
return Status::OK();
diff --git a/be/src/vec/exec/scan/new_jdbc_scan_node.cpp
b/be/src/vec/exec/scan/new_jdbc_scan_node.cpp
index 19fd93b9d3..4812f0c788 100644
--- a/be/src/vec/exec/scan/new_jdbc_scan_node.cpp
+++ b/be/src/vec/exec/scan/new_jdbc_scan_node.cpp
@@ -53,7 +53,12 @@ Status NewJdbcScanNode::_init_scanners(std::list<VScanner*>*
scanners) {
new NewJdbcScanner(_state, this, _limit_per_scanner, _tuple_id,
_query_string,
_table_type, _state->runtime_profile());
_scanner_pool.add(scanner);
- RETURN_IF_ERROR(scanner->prepare(_state, _vconjunct_ctx_ptr.get()));
+ Status st = scanner->prepare(_state, _vconjunct_ctx_ptr.get());
+ if (!st.ok()) {
+ // during prepare, scanner already cloned vexpr_context, should call
close to release it.
+ scanner->close(_state);
+ return st;
+ }
scanners->push_back(static_cast<VScanner*>(scanner));
return Status::OK();
}
diff --git a/be/src/vec/exec/scan/new_olap_scan_node.cpp
b/be/src/vec/exec/scan/new_olap_scan_node.cpp
index 950926eb8b..56a320f088 100644
--- a/be/src/vec/exec/scan/new_olap_scan_node.cpp
+++ b/be/src/vec/exec/scan/new_olap_scan_node.cpp
@@ -398,9 +398,13 @@ Status
NewOlapScanNode::_init_scanners(std::list<VScanner*>* scanners) {
// add scanner to pool before doing prepare.
// so that scanner can be automatically deconstructed if prepare
failed.
_scanner_pool.add(scanner);
- RETURN_IF_ERROR(scanner->prepare(*scan_range, scanner_ranges,
_vconjunct_ctx_ptr.get(),
- _olap_filters, _filter_predicates,
- _push_down_functions));
+ Status st = scanner->prepare(*scan_range, scanner_ranges,
_vconjunct_ctx_ptr.get(),
+ _olap_filters, _filter_predicates,
_push_down_functions);
+ if (!st.ok()) {
+ // during prepare, scanner already cloned vexpr_context,
should call close to release it.
+ scanner->close(_state);
+ return st;
+ }
scanners->push_back((VScanner*)scanner);
disk_set.insert(scanner->scan_disk());
}
diff --git a/be/src/vec/exprs/vexpr_context.cpp
b/be/src/vec/exprs/vexpr_context.cpp
index 9033245202..89af8d8073 100644
--- a/be/src/vec/exprs/vexpr_context.cpp
+++ b/be/src/vec/exprs/vexpr_context.cpp
@@ -32,7 +32,10 @@ VExprContext::VExprContext(VExpr* expr)
_stale(false) {}
VExprContext::~VExprContext() {
- DCHECK(!_prepared || _closed) << get_stack_trace();
+ // Should not use dcheck, should log fatal here, because maybe memory leak
online.
+ DCHECK(!_prepared || _closed) << "could not deconstruct vexprcontext
normally! _prepared="
+ << _prepared << ", _closed=" << _closed <<
", _opened=" << _opened
+ << ", _stale=" << _stale << ",_is_clone=" <<
_is_clone;
for (int i = 0; i < _fn_contexts.size(); ++i) {
delete _fn_contexts[i];
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]