[FEAT MERGE] del_tenant_memleak branch

Co-authored-by: HaHaJeff <jeffzhouhhh@gmail.com>
This commit is contained in:
obdev
2023-01-28 19:29:23 +08:00
committed by ob-robot
parent e3b89cd741
commit ba19ba90e0
179 changed files with 3235 additions and 2291 deletions

View File

@ -13,11 +13,11 @@
#include "observer/virtual_table/ob_virtual_sql_plan_statistics.h"
#include "common/object/ob_object.h"
#include "sql/plan_cache/ob_plan_cache.h"
#include "sql/plan_cache/ob_plan_cache_manager.h"
#include "observer/ob_server_utils.h"
#include "observer/ob_server_struct.h"
#include "observer/ob_req_time_service.h"
#include "share/inner_table/ob_inner_table_schema.h"
#include "sql/plan_cache/ob_ps_cache.h"
using namespace oceanbase;
using namespace sql;
@ -79,8 +79,7 @@ struct ObGetAllOperatorStatOp
common::ObIArray<ObOperatorStat> *key_array_;
};
ObVirtualSqlPlanStatistics::ObVirtualSqlPlanStatistics()
:pcm_(NULL),
ObVirtualSqlPlanStatistics::ObVirtualSqlPlanStatistics() :
tenant_id_array_(),
operator_stat_array_(),
tenant_id_(0),
@ -103,50 +102,45 @@ void ObVirtualSqlPlanStatistics::reset()
int ObVirtualSqlPlanStatistics::inner_open()
{
int ret = OB_SUCCESS;
if (OB_ISNULL(pcm_)) {
ret = OB_INVALID_ARGUMENT;
SERVER_LOG(WARN, "invalid argument", K(ret));
uint64_t start_tenant_id = 0;
uint64_t end_tenant_id = 0;
if (key_ranges_.count() < 1) {
ret = OB_ERR_UNEXPECTED;
SERVER_LOG(WARN, "invalid key range", K(ret), K(key_ranges_.count()));
} else {
uint64_t start_tenant_id = 0;
uint64_t end_tenant_id = 0;
if (key_ranges_.count() < 1) {
ObNewRange &range = key_ranges_.at(0);
if (OB_UNLIKELY(range.get_start_key().get_obj_cnt() != 5
|| range.get_end_key().get_obj_cnt() != 5)) {
ret = OB_ERR_UNEXPECTED;
SERVER_LOG(WARN, "invalid key range", K(ret), K(key_ranges_.count()));
SERVER_LOG(WARN, "unexpected # of rowkey columns",
K(ret),
"size of start key", range.get_start_key().get_obj_cnt(),
"size of end key", range.get_end_key().get_obj_cnt());
} else {
ObNewRange &range = key_ranges_.at(0);
if (OB_UNLIKELY(range.get_start_key().get_obj_cnt() != 5
|| range.get_end_key().get_obj_cnt() != 5)) {
ObObj tenant_id_low = range.get_start_key().get_obj_ptr()[0];
ObObj tenant_id_high = range.get_end_key().get_obj_ptr()[0];
if (tenant_id_low.is_min_value()
&& tenant_id_high.is_max_value()) {
start_tenant_id = OB_SYS_TENANT_ID;
end_tenant_id = OB_SYS_TENANT_ID;
} else if (tenant_id_low.get_type() != ObIntType
|| tenant_id_high.get_type() != ObIntType) {
ret = OB_ERR_UNEXPECTED;
SERVER_LOG(WARN, "unexpected # of rowkey columns",
K(ret),
"size of start key", range.get_start_key().get_obj_cnt(),
"size of end key", range.get_end_key().get_obj_cnt());
SERVER_LOG(WARN, "invalid tenant id", K(ret), K(tenant_id_low), K(tenant_id_high));
} else {
ObObj tenant_id_low = range.get_start_key().get_obj_ptr()[0];
ObObj tenant_id_high = range.get_end_key().get_obj_ptr()[0];
if (tenant_id_low.is_min_value()
&& tenant_id_high.is_max_value()) {
start_tenant_id = OB_SYS_TENANT_ID;
end_tenant_id = OB_SYS_TENANT_ID;
} else if (tenant_id_low.get_type() != ObIntType
|| tenant_id_high.get_type() != ObIntType) {
start_tenant_id = tenant_id_low.get_int();
end_tenant_id = tenant_id_high.get_int();
if (start_tenant_id != end_tenant_id) {
ret = OB_ERR_UNEXPECTED;
SERVER_LOG(WARN, "invalid tenant id", K(ret), K(tenant_id_low), K(tenant_id_high));
} else {
start_tenant_id = tenant_id_low.get_int();
end_tenant_id = tenant_id_high.get_int();
if (start_tenant_id != end_tenant_id) {
ret = OB_ERR_UNEXPECTED;
SERVER_LOG(WARN, "invalid tenant id range, can only search one tenant",
K(ret), K(start_tenant_id), K(end_tenant_id));
} else if (OB_SYS_TENANT_ID == start_tenant_id) {
//查询租户为系统租户,可以查询所有的plan cache
if (OB_FAIL(get_all_tenant_id())) {
SERVER_LOG(WARN, "fail to get all tenant id", K(ret));
}
} else if (OB_FAIL(tenant_id_array_.push_back(start_tenant_id))) {
SERVER_LOG(WARN, "fail to push back tenent id", K(ret));
SERVER_LOG(WARN, "invalid tenant id range, can only search one tenant",
K(ret), K(start_tenant_id), K(end_tenant_id));
} else if (OB_SYS_TENANT_ID == start_tenant_id) {
//查询租户为系统租户,可以查询所有的plan cache
if (OB_FAIL(get_all_tenant_id())) {
SERVER_LOG(WARN, "fail to get all tenant id", K(ret));
}
} else if (OB_FAIL(tenant_id_array_.push_back(start_tenant_id))) {
SERVER_LOG(WARN, "fail to push back tenent id", K(ret));
}
}
}
@ -157,12 +151,8 @@ int ObVirtualSqlPlanStatistics::inner_open()
int ObVirtualSqlPlanStatistics::get_all_tenant_id()
{
int ret = OB_SUCCESS;
ObPlanCacheManager::ObGetAllCacheKeyOp op(&tenant_id_array_);
if (OB_UNLIKELY(NULL == pcm_)) {
ret = OB_NOT_INIT;
SERVER_LOG(WARN, "pcm_ is NULL", K(ret));
} else if (OB_FAIL(pcm_->get_plan_cache_map().foreach_refactored(op))) {
SERVER_LOG(WARN, "fail to traverse pcm", K(ret));
if (OB_FAIL(GCTX.omt_->get_mtl_tenant_ids(tenant_id_array_))) {
SERVER_LOG(WARN, "failed to add tenant id", K(ret));
}
return ret;
}
@ -175,21 +165,14 @@ 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_)) {
if (OB_UNLIKELY(NULL == pcm_)) {
ret = OB_NOT_INIT;
SERVER_LOG(WARN, "pcm_ is NULL", K(ret));
} else if (OB_UNLIKELY(NULL == (plan_cache = pcm_->get_plan_cache(tenant_id)))) {
operator_stat_array_idx_ = 0;
SERVER_LOG(WARN, "plan cache is null", K(ret));
} else {
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->dec_ref_count();
plan_cache = NULL;
}
}
if (OB_SUCC(ret)) {