You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by yi...@apache.org on 2022/07/08 00:28:45 UTC
[doris] branch master updated: [BUG] fix core dump caused by runtime filter (#10611)
This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 03296aedd5 [BUG] fix core dump caused by runtime filter (#10611)
03296aedd5 is described below
commit 03296aedd5b26f029a431ef9779ddfaa25e13065
Author: Gabriel <ga...@gmail.com>
AuthorDate: Fri Jul 8 08:28:39 2022 +0800
[BUG] fix core dump caused by runtime filter (#10611)
---
be/src/vec/exec/volap_scan_node.cpp | 16 +++++++++++-----
be/src/vec/exec/volap_scan_node.h | 3 +++
2 files changed, 14 insertions(+), 5 deletions(-)
diff --git a/be/src/vec/exec/volap_scan_node.cpp b/be/src/vec/exec/volap_scan_node.cpp
index cae48c8f55..9c2d979088 100644
--- a/be/src/vec/exec/volap_scan_node.cpp
+++ b/be/src/vec/exec/volap_scan_node.cpp
@@ -403,10 +403,6 @@ void VOlapScanNode::scanner_thread(VOlapScanner* scanner) {
scanner->set_opened();
}
- /*
- // the follow code may cause double free in VExprContext,
- // temporarily disable it to avoid it
- // TODO: fix the bug
std::vector<VExpr*> vexprs;
auto& scanner_filter_apply_marks = *scanner->mutable_runtime_filter_marks();
DCHECK(scanner_filter_apply_marks.size() == _runtime_filter_descs.size());
@@ -437,6 +433,9 @@ void VOlapScanNode::scanner_thread(VOlapScanner* scanner) {
auto last_expr =
_vconjunct_ctx_ptr ? (*_vconjunct_ctx_ptr)->root() : vexprs[0];
for (size_t j = _vconjunct_ctx_ptr ? 0 : 1; j < vexprs.size(); j++) {
+ if (_rf_vexpr_set.find(vexprs[j]) != _rf_vexpr_set.end()) {
+ continue;
+ }
TExprNode texpr_node;
texpr_node.__set_type(create_type_desc(PrimitiveType::TYPE_BOOLEAN));
texpr_node.__set_node_type(TExprNodeType::COMPOUND_PRED);
@@ -445,6 +444,7 @@ void VOlapScanNode::scanner_thread(VOlapScanner* scanner) {
new_node->add_child(last_expr);
new_node->add_child(vexprs[j]);
last_expr = new_node;
+ _rf_vexpr_set.insert(vexprs[j]);
}
auto new_vconjunct_ctx_ptr = _pool->add(new VExprContext(last_expr));
auto expr_status = new_vconjunct_ctx_ptr->prepare(state, row_desc(),
@@ -462,6 +462,9 @@ void VOlapScanNode::scanner_thread(VOlapScanner* scanner) {
vexprs.clear();
break;
}
+ if (_vconjunct_ctx_ptr) {
+ _stale_vexpr_ctxs.push_back(std::move(_vconjunct_ctx_ptr));
+ }
_vconjunct_ctx_ptr.reset(new doris::vectorized::VExprContext*);
*(_vconjunct_ctx_ptr.get()) = new_vconjunct_ctx_ptr;
_runtime_filter_ready_flag[i] = true;
@@ -476,7 +479,6 @@ void VOlapScanNode::scanner_thread(VOlapScanner* scanner) {
"Something wrong for runtime filters: ");
scanner->set_use_pushdown_conjuncts(true);
}
- */
std::vector<Block*> blocks;
@@ -1554,6 +1556,10 @@ Status VOlapScanNode::close(RuntimeState* state) {
runtime_filter->consumer_close();
}
+ for (auto& ctx : _stale_vexpr_ctxs) {
+ (*ctx)->close(state);
+ }
+
VLOG_CRITICAL << "VOlapScanNode::close()";
return ScanNode::close(state);
}
diff --git a/be/src/vec/exec/volap_scan_node.h b/be/src/vec/exec/volap_scan_node.h
index 2222390652..e863904d65 100644
--- a/be/src/vec/exec/volap_scan_node.h
+++ b/be/src/vec/exec/volap_scan_node.h
@@ -325,6 +325,9 @@ private:
int _max_materialized_blocks;
size_t _block_size = 0;
+
+ phmap::flat_hash_set<VExpr*> _rf_vexpr_set;
+ std::vector<std::unique_ptr<VExprContext*>> _stale_vexpr_ctxs;
};
} // namespace vectorized
} // namespace doris
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org