[CP] [FIX] Fix problem of memory leak in RCTE when encounter large memory allocation
This commit is contained in:
		@ -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:
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user