fix ps cache access out of mtl lock

This commit is contained in:
obdev 2023-02-10 07:46:00 +00:00 committed by ob-robot
parent 8d8c7bd53d
commit 6525b0514a
3 changed files with 57 additions and 55 deletions

View File

@ -40,11 +40,13 @@ int ObAllVirtualPsItemInfo::inner_get_next_row()
tenant_id_array_idx_ = 0;
} else {
uint64_t tenant_id = tenant_id_array_.at(tenant_id_array_idx_);
if (OB_FAIL(get_next_row_from_specified_tenant(tenant_id, is_sub_end))) {
SERVER_LOG(WARN, "get_next_row_from_specified_tenant failed", K(ret), K(tenant_id));
} else {
if (is_sub_end) {
++tenant_id_array_idx_;
MTL_SWITCH(tenant_id) {
if (OB_FAIL(get_next_row_from_specified_tenant(tenant_id, is_sub_end))) {
SERVER_LOG(WARN, "get_next_row_from_specified_tenant failed", K(ret), K(tenant_id));
} else {
if (is_sub_end) {
++tenant_id_array_idx_;
}
}
}
}
@ -185,16 +187,14 @@ int ObAllVirtualPsItemInfo::get_next_row_from_specified_tenant(uint64_t tenant_i
int ret = OB_SUCCESS;
is_end = false;
if (OB_INVALID_ID == stmt_id_array_idx_) {
MTL_SWITCH(tenant_id) {
ps_cache_ = MTL(ObPsCache*);
if (false == ps_cache_->is_inited()) {
is_end = true;
SERVER_LOG(DEBUG, "ps cache is not ready, ignore this", K(ret), K(ps_cache_->is_inited()));
} else if (OB_FAIL(ps_cache_->get_all_stmt_id(&stmt_id_array_))) {
SERVER_LOG(WARN, "get_all_stmt_id failed", K(ret));
} else {
stmt_id_array_idx_ = 0;
}
ps_cache_ = MTL(ObPsCache*);
if (false == ps_cache_->is_inited()) {
is_end = true;
SERVER_LOG(DEBUG, "ps cache is not ready, ignore this", K(ret), K(ps_cache_->is_inited()));
} else if (OB_FAIL(ps_cache_->get_all_stmt_id(&stmt_id_array_))) {
SERVER_LOG(WARN, "get_all_stmt_id failed", K(ret));
} else {
stmt_id_array_idx_ = 0;
}
}
if (OB_SUCCESS == ret && false == is_end) {

View File

@ -80,17 +80,15 @@ int ObGVSql::get_row_from_specified_tenant(uint64_t tenant_id, bool &is_end)
ObReqTimeGuard req_timeinfo_guard;
is_end = false;
if (OB_INVALID_ID == static_cast<uint64_t>(plan_id_array_idx_)) {
MTL_SWITCH(tenant_id) {
plan_cache_ = MTL(ObPlanCache*);
NG_TRACE(trav_ps_map_start);
ObGetAllCacheIdOp plan_id_op(&plan_id_array_);
if (OB_FAIL(plan_cache_->foreach_cache_obj(plan_id_op))) {
SERVER_LOG(WARN, "fail to traverse id2stat_map");
} else {
plan_id_array_idx_ = 0;
}
NG_TRACE(trav_ps_map_end);
plan_cache_ = MTL(ObPlanCache*);
NG_TRACE(trav_ps_map_start);
ObGetAllCacheIdOp plan_id_op(&plan_id_array_);
if (OB_FAIL(plan_cache_->foreach_cache_obj(plan_id_op))) {
SERVER_LOG(WARN, "fail to traverse id2stat_map");
} else {
plan_id_array_idx_ = 0;
}
NG_TRACE(trav_ps_map_end);
}
if (NULL == plan_cache_) {
// do nothing
@ -899,17 +897,20 @@ int ObGVSql::get_row_from_tenants()
ret = OB_ITER_END;
tenant_id_array_idx_ = 0;
} else {
if (OB_FAIL(get_row_from_specified_tenant(tenant_id_array_.at(tenant_id_array_idx_),
is_sub_end))) {
SERVER_LOG(WARN,
"fail to insert plan by tenant id",
K(ret),
"tenant id",
tenant_id_array_.at(tenant_id_array_idx_),
K(tenant_id_array_idx_));
} else {
if (is_sub_end) {
++tenant_id_array_idx_;
uint64_t tenant_id = tenant_id_array_.at(tenant_id_array_idx_);
MTL_SWITCH(tenant_id) {
if (OB_FAIL(get_row_from_specified_tenant(tenant_id,
is_sub_end))) {
SERVER_LOG(WARN,
"fail to insert plan by tenant id",
K(ret),
"tenant id",
tenant_id_array_.at(tenant_id_array_idx_),
K(tenant_id_array_idx_));
} else {
if (is_sub_end) {
++tenant_id_array_idx_;
}
}
}
}

View File

@ -165,14 +165,12 @@ int ObVirtualSqlPlanStatistics::get_row_from_specified_tenant(uint64_t tenant_id
is_end = false;
sql::ObPlanCache *plan_cache = NULL;
if (OB_INVALID_ID == static_cast<uint64_t>(operator_stat_array_idx_)) {
MTL_SWITCH(tenant_id) {
plan_cache = MTL(ObPlanCache*);
ObGetAllOperatorStatOp operator_stat_op(&operator_stat_array_);
if (OB_FAIL(plan_cache->foreach_cache_obj(operator_stat_op))) {
SERVER_LOG(WARN, "fail to traverse id2stat_map");
} else {
operator_stat_array_idx_ = 0;
}
plan_cache = MTL(ObPlanCache*);
ObGetAllOperatorStatOp operator_stat_op(&operator_stat_array_);
if (OB_FAIL(plan_cache->foreach_cache_obj(operator_stat_op))) {
SERVER_LOG(WARN, "fail to traverse id2stat_map");
} else {
operator_stat_array_idx_ = 0;
}
}
if (OB_SUCC(ret)) {
@ -310,17 +308,20 @@ int ObVirtualSqlPlanStatistics::inner_get_next_row(common::ObNewRow *&row)
ret = OB_ITER_END;
tenant_id_array_idx_ = 0;
} else {
if (OB_FAIL(get_row_from_specified_tenant(tenant_id_array_.at(tenant_id_array_idx_),
is_sub_end))) {
SERVER_LOG(WARN,
"fail to insert plan by tenant id",
K(ret),
"tenant id",
tenant_id_array_.at(tenant_id_array_idx_),
K(tenant_id_array_idx_));
} else {
if (is_sub_end) {
++tenant_id_array_idx_;
uint64_t tenant_id = tenant_id_array_.at(tenant_id_array_idx_);
MTL_SWITCH(tenant_id) {
if (OB_FAIL(get_row_from_specified_tenant(tenant_id,
is_sub_end))) {
SERVER_LOG(WARN,
"fail to insert plan by tenant id",
K(ret),
"tenant id",
tenant_id_array_.at(tenant_id_array_idx_),
K(tenant_id_array_idx_));
} else {
if (is_sub_end) {
++tenant_id_array_idx_;
}
}
}
}