This is an automated email from the ASF dual-hosted git repository.
lide 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 4a67fdcd0fc [fix](memory leak) LikeState leak in Doris BE #30331
4a67fdcd0fc is described below
commit 4a67fdcd0fc10233b09766a8b05feebe2a553551
Author: camby <[email protected]>
AuthorDate: Thu Jan 25 19:28:49 2024 +0800
[fix](memory leak) LikeState leak in Doris BE #30331
---
be/src/vec/exec/scan/vscan_node.cpp | 49 ++++++++++++++++++++++++++++++++++---
be/src/vec/exec/scan/vscan_node.h | 1 +
2 files changed, 46 insertions(+), 4 deletions(-)
diff --git a/be/src/vec/exec/scan/vscan_node.cpp
b/be/src/vec/exec/scan/vscan_node.cpp
index 5b44c13e7f8..f1674d75cfb 100644
--- a/be/src/vec/exec/scan/vscan_node.cpp
+++ b/be/src/vec/exec/scan/vscan_node.cpp
@@ -389,6 +389,44 @@ Status VScanNode::_normalize_conjuncts() {
return Status::OK();
}
+bool _expr_inside_stale_ctx_exprs_tree(VExpr* root, VExpr* target_expr) {
+ if (root == nullptr) {
+ return false;
+ }
+ if (root == target_expr) {
+ return true;
+ }
+ for (auto& child : root->children()) {
+ if (_expr_inside_stale_ctx_exprs_tree(child, target_expr)) {
+ return true;
+ }
+ }
+ return false;
+}
+void VScanNode::_close_expr_inside_stale_ctxs(VExpr* expr, VExpr* new_root) {
+ DCHECK(expr != nullptr);
+ for (auto& ctx : _stale_vexpr_ctxs) {
+ VExpr* root = (*ctx)->root();
+ if (!_expr_inside_stale_ctx_exprs_tree(root, expr)) {
+ continue;
+ }
+
+ // if we try to replace root with nullptr, just keep it here, later
+ // VScanNode::close will call VExprContext::close to close root tree
+ if (root == expr && new_root == nullptr) {
+ continue;
+ }
+
+ // there two cases here:
+ // case1: expr is a sub tree node, just close it, the caller will
adjust the expr tree outside
+ // case2: expr is root node and new_root is not nullptr, close old
root and replace it with new_root
+ expr->close(_state, *ctx, (*ctx)->get_function_state_scope());
+ if (root == expr) {
+ (*ctx)->set_root(new_root);
+ }
+ }
+}
+
Status VScanNode::_normalize_predicate(VExpr* conjunct_expr_root, VExpr**
output_expr) {
static constexpr auto is_leaf = [](VExpr* expr) { return
!expr->is_and_expr(); };
auto in_predicate_checker = [](const std::vector<VExpr*>& children, const
VSlotRef** slot,
@@ -481,21 +519,24 @@ Status VScanNode::_normalize_predicate(VExpr*
conjunct_expr_root, VExpr** output
conjunct_expr_root->children()[0]->close(
_state, *_vconjunct_ctx_ptr,
(*_vconjunct_ctx_ptr)->get_function_state_scope());
+
_close_expr_inside_stale_ctxs(conjunct_expr_root->children()[0], nullptr);
}
if (right_child == nullptr) {
conjunct_expr_root->children()[1]->close(
_state, *_vconjunct_ctx_ptr,
(*_vconjunct_ctx_ptr)->get_function_state_scope());
+
_close_expr_inside_stale_ctxs(conjunct_expr_root->children()[1], nullptr);
}
// here only close the and expr self, do not close the child
conjunct_expr_root->set_children({});
conjunct_expr_root->close(_state, *_vconjunct_ctx_ptr,
(*_vconjunct_ctx_ptr)->get_function_state_scope());
- }
- // here do not close Expr* now
- *output_expr = left_child != nullptr ? left_child : right_child;
- return Status::OK();
+ // here do not close Expr* now
+ *output_expr = left_child != nullptr ? left_child :
right_child;
+ _close_expr_inside_stale_ctxs(conjunct_expr_root,
*output_expr);
+ return Status::OK();
+ }
}
}
*output_expr = conjunct_expr_root;
diff --git a/be/src/vec/exec/scan/vscan_node.h
b/be/src/vec/exec/scan/vscan_node.h
index d6be5adbe3e..8c4102607b9 100644
--- a/be/src/vec/exec/scan/vscan_node.h
+++ b/be/src/vec/exec/scan/vscan_node.h
@@ -264,6 +264,7 @@ private:
Status _append_rf_into_conjuncts(std::vector<VExpr*>& vexprs);
Status _normalize_conjuncts();
+ void _close_expr_inside_stale_ctxs(VExpr* expr, VExpr* new_root);
Status _normalize_predicate(VExpr* conjunct_expr_root, VExpr**
output_expr);
Status _eval_const_conjuncts(VExpr* vexpr, VExprContext* expr_ctx,
PushDownType* pdt);
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]