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 2141fc0f39 [bugfix](memleak) expr context has memory leak during 
runtime filter (#21347)
2141fc0f39 is described below

commit 2141fc0f3993a7bab29b3ba2e516a667cb3e7e12
Author: yiguolei <[email protected]>
AuthorDate: Thu Jun 29 20:27:50 2023 +0800

    [bugfix](memleak) expr context has memory leak during runtime filter 
(#21347)
    
    
    
    ---------
    
    Co-authored-by: yiguolei <[email protected]>
---
 be/src/vec/exprs/vexpr.cpp | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/be/src/vec/exprs/vexpr.cpp b/be/src/vec/exprs/vexpr.cpp
index f584816bf3..bdda643b78 100644
--- a/be/src/vec/exprs/vexpr.cpp
+++ b/be/src/vec/exprs/vexpr.cpp
@@ -399,10 +399,17 @@ Status VExpr::init_function_context(VExprContext* context,
 
 void VExpr::close_function_context(VExprContext* context, 
FunctionContext::FunctionStateScope scope,
                                    const FunctionBasePtr& function) const {
-    if (_fn_context_index != -1 && !context->_stale) {
+    if (_fn_context_index != -1) {
         FunctionContext* fn_ctx = context->fn_context(_fn_context_index);
         function->close(fn_ctx, FunctionContext::THREAD_LOCAL);
-        if (scope == FunctionContext::FRAGMENT_LOCAL) {
+        // In doris 1.2-lts, the function state is managed by raw ptr, in 
master, it is already using shared ptr
+        // During runtime filter, scan node will clone function context and 
mark the expr context as stale.
+        // During clone function context, the clone function does not clone 
thread local state, so thread local state
+        // is not managed by the aim expr context.
+        // So we has to close the stale function context's thread local state 
here.
+        // Should not close stale's fragment local state, because the fragment 
local state is cloned during function
+        // context's clone method.
+        if (scope == FunctionContext::FRAGMENT_LOCAL && !context->_stale) {
             function->close(fn_ctx, FunctionContext::FRAGMENT_LOCAL);
         }
     }


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

Reply via email to