[CP] Fix the problem of still performing hard parsing when the SQL current limit reaches 0
This commit is contained in:
		@ -692,7 +692,9 @@ int ObPhysicalPlan::inc_concurrent_num()
 | 
				
			|||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    while(OB_SUCC(ret) && false == is_succ) {
 | 
					    while(OB_SUCC(ret) && false == is_succ) {
 | 
				
			||||||
      concurrent_num = ATOMIC_LOAD(&concurrent_num_);
 | 
					      concurrent_num = ATOMIC_LOAD(&concurrent_num_);
 | 
				
			||||||
      if (concurrent_num >= max_concurrent_num_) {
 | 
					      if (0 == max_concurrent_num_) {
 | 
				
			||||||
 | 
					        ret = OB_REACH_MAX_CONCURRENT_NUM;
 | 
				
			||||||
 | 
					      } else if (concurrent_num >= max_concurrent_num_) {
 | 
				
			||||||
        ret = OB_REACH_MAX_CONCURRENT_NUM;
 | 
					        ret = OB_REACH_MAX_CONCURRENT_NUM;
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
        new_num = concurrent_num + 1;
 | 
					        new_num = concurrent_num + 1;
 | 
				
			||||||
 | 
				
			|||||||
@ -4329,6 +4329,9 @@ int ObSql::pc_add_plan(ObPlanCacheCtx &pc_ctx,
 | 
				
			|||||||
      ret = plan_cache->add_plan(phy_plan, pc_ctx);
 | 
					      ret = plan_cache->add_plan(phy_plan, pc_ctx);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    plan_added = (OB_SUCCESS == ret);
 | 
					    plan_added = (OB_SUCCESS == ret);
 | 
				
			||||||
 | 
					    if (pc_ctx.is_max_curr_limit_) {
 | 
				
			||||||
 | 
					      ret = OB_REACH_MAX_CONCURRENT_NUM;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (is_batch_exec) {
 | 
					    if (is_batch_exec) {
 | 
				
			||||||
      // Batch optimization cannot continue for errors other than OB_SQL_PC_PLAN_DUPLICATE.
 | 
					      // Batch optimization cannot continue for errors other than OB_SQL_PC_PLAN_DUPLICATE.
 | 
				
			||||||
 | 
				
			|||||||
@ -386,7 +386,8 @@ struct ObPlanCacheCtx : public ObILibCacheCtx
 | 
				
			|||||||
      dynamic_param_info_list_(allocator),
 | 
					      dynamic_param_info_list_(allocator),
 | 
				
			||||||
      tpl_sql_const_cons_(allocator),
 | 
					      tpl_sql_const_cons_(allocator),
 | 
				
			||||||
      need_retry_add_plan_(true),
 | 
					      need_retry_add_plan_(true),
 | 
				
			||||||
      insert_batch_opt_info_(allocator)
 | 
					      insert_batch_opt_info_(allocator),
 | 
				
			||||||
 | 
					      is_max_curr_limit_(false)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    fp_result_.pc_key_.mode_ = mode_;
 | 
					    fp_result_.pc_key_.mode_ = mode_;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@ -459,7 +460,8 @@ struct ObPlanCacheCtx : public ObILibCacheCtx
 | 
				
			|||||||
    K(is_original_ps_mode_),
 | 
					    K(is_original_ps_mode_),
 | 
				
			||||||
    K(new_raw_sql_),
 | 
					    K(new_raw_sql_),
 | 
				
			||||||
    K(need_retry_add_plan_),
 | 
					    K(need_retry_add_plan_),
 | 
				
			||||||
    K(insert_batch_opt_info_)
 | 
					    K(insert_batch_opt_info_),
 | 
				
			||||||
 | 
					    K(is_max_curr_limit_)
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
  PlanCacheMode mode_; //control use which variables to do match
 | 
					  PlanCacheMode mode_; //control use which variables to do match
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -521,6 +523,7 @@ struct ObPlanCacheCtx : public ObILibCacheCtx
 | 
				
			|||||||
  // when schema version of cache node is old, whether remove this node and retry add cache obj.
 | 
					  // when schema version of cache node is old, whether remove this node and retry add cache obj.
 | 
				
			||||||
  bool need_retry_add_plan_;
 | 
					  bool need_retry_add_plan_;
 | 
				
			||||||
  ObInsertBatchOptInfo insert_batch_opt_info_;
 | 
					  ObInsertBatchOptInfo insert_batch_opt_info_;
 | 
				
			||||||
 | 
					  bool is_max_curr_limit_;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct ObPlanCacheStat
 | 
					struct ObPlanCacheStat
 | 
				
			||||||
 | 
				
			|||||||
@ -1206,7 +1206,18 @@ int ObSqlPlanSet::add_plan(ObPhysicalPlan &plan,
 | 
				
			|||||||
                                       candi_table_locs))) {
 | 
					                                       candi_table_locs))) {
 | 
				
			||||||
    LOG_WARN("fail to get physical locations", K(ret));
 | 
					    LOG_WARN("fail to get physical locations", K(ret));
 | 
				
			||||||
  } else if (OB_FAIL(set_concurrent_degree(outline_param_idx, plan))) {
 | 
					  } else if (OB_FAIL(set_concurrent_degree(outline_param_idx, plan))) {
 | 
				
			||||||
 | 
					    if (OB_REACH_MAX_CONCURRENT_NUM == ret && 0 == plan.get_max_concurrent_num()) {
 | 
				
			||||||
 | 
					      pc_ctx.is_max_curr_limit_ = true;
 | 
				
			||||||
 | 
					      ret = OB_SUCCESS;
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
      LOG_WARN("fail to check concurrent degree", K(ret));
 | 
					      LOG_WARN("fail to check concurrent degree", K(ret));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    // do nothing
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (OB_FAIL(ret)) {
 | 
				
			||||||
 | 
					    // do nothing
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    if (pc_ctx.exec_ctx_.get_physical_plan_ctx()->get_or_expand_transformed()) {
 | 
					    if (pc_ctx.exec_ctx_.get_physical_plan_ctx()->get_or_expand_transformed()) {
 | 
				
			||||||
      need_try_plan_ |= TRY_PLAN_OR_EXPAND;
 | 
					      need_try_plan_ |= TRY_PLAN_OR_EXPAND;
 | 
				
			||||||
@ -1308,7 +1319,6 @@ int ObSqlPlanSet::add_plan(ObPhysicalPlan &plan,
 | 
				
			|||||||
   //   }
 | 
					   //   }
 | 
				
			||||||
   // }
 | 
					   // }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  return ret;
 | 
					  return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user