提交 327e04ad 编写于 作者: O obdev 提交者: ob-robot

[CP] [FIX] Fix problem of memory leak in RCTE when encounter large memory allocation

上级 dcf8d2d9
......@@ -526,6 +526,7 @@ int ObBreadthFirstSearchBulkOp::reuse()
void ObBreadthFirstSearchBulkOp::destroy()
{
free_input_rows_mem();
free_last_iter_mem();
if (OB_NOT_NULL(mem_context_)) {
DESTROY_CONTEXT(mem_context_);
......@@ -812,6 +813,22 @@ int ObBreadthFirstSearchBulkOp::init_mem_context()
return ret;
}
//RCTE operator may encounter -4013 memory problem when it want to allocate a very large memory for a new round of iteration data
//at that time, memory is stored in input_rows_, so we have to free them before reset allocator
void ObBreadthFirstSearchBulkOp::free_input_rows_mem()
{
if (OB_ISNULL(malloc_allocator_)) {
// do nothing
} else {
for (int64_t i = 0; i < input_rows_.size(); ++i) {
if (OB_NOT_NULL(input_rows_.at(i))) {
malloc_allocator_->free(input_rows_.at(i));
}
}
input_rows_.reset();
}
}
void ObBreadthFirstSearchBulkOp::free_last_iter_mem()
{
if (OB_ISNULL(malloc_allocator_)) {
......
......@@ -333,6 +333,7 @@ public:
int sort_result_output_nodes(int64_t rows_cnt);
int add_row(const ObIArray<ObExpr *> &exprs, ObEvalCtx &eval_ctx);
int init_mem_context();
void free_input_rows_mem();
void free_last_iter_mem();
private:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册