[CP] fix gather stats core caused by access invalid ptr

This commit is contained in:
wangt1xiuyi
2024-02-19 06:41:48 +00:00
committed by ob-robot
parent 2f81e754dc
commit 669eb87118
8 changed files with 31 additions and 29 deletions

View File

@ -3217,6 +3217,7 @@ int ObDbmsStats::parse_table_part_info(ObExecContext &ctx,
LOG_WARN("table schema is null", K(ret), K(table_schema), K(param.db_name_), K(param.tab_name_));
LOG_USER_ERROR(OB_TABLE_NOT_EXIST, to_cstring(param.db_name_), to_cstring(param.tab_name_));
} else if (OB_FAIL(get_table_part_infos(table_schema,
*param.allocator_,
param.part_infos_,
param.subpart_infos_))) {
LOG_WARN("failed to get table part infos", K(ret));
@ -3268,6 +3269,7 @@ int ObDbmsStats::parse_table_part_info(ObExecContext &ctx,
} else if (OB_UNLIKELY(table_schema->is_view_table())) {
ret = OB_TABLE_NOT_EXIST;
} else if (OB_FAIL(get_table_part_infos(table_schema,
*param.allocator_,
param.part_infos_,
param.subpart_infos_))) {
LOG_WARN("failed to get table part infos", K(ret));
@ -3333,6 +3335,7 @@ int ObDbmsStats::parse_index_part_info(ObExecContext &ctx,
param.data_table_name_))) {
LOG_WARN("failed to write string", K(ret));
} else if (OB_FAIL(get_table_part_infos(index_schema,
*param.allocator_,
param.part_infos_,
param.subpart_infos_))) {
LOG_WARN("failed to get table part infos", K(ret));
@ -3652,6 +3655,7 @@ int ObDbmsStats::parse_set_partition_name(ObExecContext &ctx,
ret = OB_ERR_NOT_PARTITIONED;
LOG_WARN("the target table is not partitioned", K(ret));
} else if (OB_FAIL(get_table_part_infos(table_schema,
*param.allocator_,
param.part_infos_,
param.subpart_infos_))) {
LOG_WARN("failed to get table part infos", K(ret));
@ -4658,6 +4662,7 @@ int ObDbmsStats::check_is_valid_col(const ObString &src_str,
}
int ObDbmsStats::get_table_part_infos(const share::schema::ObTableSchema *table_schema,
ObIAllocator &allocator,
ObIArray<PartInfo> &part_infos,
ObIArray<PartInfo> &subpart_infos,
OSGPartMap *part_map/*default NULL*/)
@ -4672,6 +4677,7 @@ int ObDbmsStats::get_table_part_infos(const share::schema::ObTableSchema *table_
/*do notthing*/
LOG_TRACE("table is not part table", K(table_schema->get_part_level()));
} else if (OB_FAIL(ObDbmsStatsUtils::get_part_infos(*table_schema,
allocator,
part_infos,
subpart_infos,
part_ids,
@ -4699,6 +4705,7 @@ int ObDbmsStats::get_part_ids_from_schema(const ObTableSchema *table_schema,
ObSEArray<PartInfo, 4> dummy_subpart_infos;
ObSEArray<int64_t, 4> part_ids;
ObSEArray<int64_t, 4> subpart_ids;
ObArenaAllocator tmp_alloc("GetPartIds");
if (OB_ISNULL(table_schema)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("get unexpected null", K(ret), K(table_schema));
@ -4706,6 +4713,7 @@ int ObDbmsStats::get_part_ids_from_schema(const ObTableSchema *table_schema,
/*do notthing*/
LOG_TRACE("table is not part table", K(table_schema->get_part_level()));
} else if (OB_FAIL(ObDbmsStatsUtils::get_part_infos(*table_schema,
tmp_alloc,
dummy_part_infos,
dummy_subpart_infos,
part_ids,
@ -5607,13 +5615,14 @@ int ObDbmsStats::get_user_partition_table_stale_percent(
int64_t inc_modified_count = 0;
int64_t row_cnt = 0;
ObSEArray<PartInfo, 4> partition_infos;
ObArenaAllocator tmp_alloc("GetPartStale", OB_MALLOC_NORMAL_BLOCK_SIZE, tenant_id);
if (OB_UNLIKELY(!table_schema.is_user_table() || -1 != global_part_id)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("get unexpected error", K(ret), K(table_schema.is_user_table()), K(global_part_id));
} else if (stat_table.partition_stat_infos_.empty()) {
// do not have any statistics
stat_table.stale_percent_ = -1.0;
} else if (OB_FAIL(get_table_partition_infos(table_schema, partition_infos))) {
} else if (OB_FAIL(get_table_partition_infos(table_schema, tmp_alloc, partition_infos))) {
LOG_WARN("failed to get table subpart infos", K(ret));
} else if (OB_FAIL(ObBasicStatsEstimator::estimate_stale_partition(ctx,
tenant_id,
@ -6031,12 +6040,14 @@ int ObDbmsStats::set_param_global_part_id(ObExecContext &ctx,
}
int ObDbmsStats::get_table_partition_infos(const ObTableSchema &table_schema,
ObIAllocator &allocator,
ObIArray<PartInfo> &partition_infos)
{
int ret = OB_SUCCESS;
ObSEArray<PartInfo, 4> part_infos;
ObSEArray<PartInfo, 4> subpart_infos;
if (OB_FAIL(get_table_part_infos(&table_schema,
allocator,
part_infos,
subpart_infos))) {
LOG_WARN("failed to get table part infos", K(ret));
@ -6050,25 +6061,6 @@ int ObDbmsStats::get_table_partition_infos(const ObTableSchema &table_schema,
return ret;
}
int ObDbmsStats::get_table_partition_map(const ObTableSchema &table_schema,
OSGPartMap &part_map)
{
int ret = OB_SUCCESS;
if (PARTITION_LEVEL_TWO != table_schema.get_part_level()
&& PARTITION_LEVEL_ONE != table_schema.get_part_level()) {
} else {
ObSEArray<PartInfo, 4> part_infos;
ObSEArray<PartInfo, 4> subpart_infos;
if (OB_FAIL(get_table_part_infos(&table_schema,
part_infos,
subpart_infos,
&part_map))) {
LOG_WARN("failed to get table part infos", K(ret));
}
}
return ret;
}
bool ObDbmsStats::is_func_index(const ObTableStatParam &index_param)
{
bool is_true = false;

View File

@ -383,6 +383,7 @@ public:
const MethodOptSizeConf &size_conf);
static int get_table_part_infos(const share::schema::ObTableSchema *table_schema,
ObIAllocator &allocator,
common::ObIArray<PartInfo> &part_infos,
common::ObIArray<PartInfo> &subpart_infos,
OSGPartMap *part_map = NULL);
@ -491,9 +492,6 @@ public:
share::schema::ObPartitionLevel data_table_level
= share::schema::ObPartitionLevel::PARTITION_LEVEL_ZERO);
static int get_table_partition_map(const ObTableSchema &table_schema,
OSGPartMap &part_map);
static int init_gather_task_info(ObExecContext &ctx,
ObOptStatGatherType type,
int64_t start_time,
@ -586,6 +584,7 @@ private:
ObIArray<ObAuxTableMetaInfo> &index_infos);
static int get_table_partition_infos(const ObTableSchema &table_schema,
ObIAllocator &allocator,
ObIArray<PartInfo> &partition_infos);
static int get_index_schema(sql::ObExecContext &ctx,

View File

@ -690,6 +690,7 @@ bool ObDbmsStatsUtils::is_part_id_valid(const ObTableStatParam &param,
}
int ObDbmsStatsUtils::get_part_infos(const ObTableSchema &table_schema,
ObIAllocator &allocator,
ObIArray<PartInfo> &part_infos,
ObIArray<PartInfo> &subpart_infos,
ObIArray<int64_t> &part_ids,
@ -708,10 +709,11 @@ int ObDbmsStatsUtils::get_part_infos(const ObTableSchema &table_schema,
LOG_WARN("get null partition", K(ret), K(part));
} else {
PartInfo part_info;
part_info.part_name_ = part->get_part_name();
part_info.part_id_ = part->get_part_id();
part_info.tablet_id_ = part->get_tablet_id();
if (OB_NOT_NULL(part_map)) {
if (OB_FAIL(ob_write_string(allocator, part->get_part_name(), part_info.part_name_))) {
LOG_WARN("failed to write string", K(ret));
} else if (OB_NOT_NULL(part_map)) {
OSGPartInfo part_info;
part_info.part_id_ = part->get_part_id();
part_info.tablet_id_ = part->get_tablet_id();
@ -726,7 +728,7 @@ int ObDbmsStatsUtils::get_part_infos(const ObTableSchema &table_schema,
} else if (OB_FAIL(part_ids.push_back(part_info.part_id_))) {
LOG_WARN("failed to push back part id", K(ret));
} else if (is_twopart &&
OB_FAIL(get_subpart_infos(table_schema, part, subpart_infos, subpart_ids, part_map))) {
OB_FAIL(get_subpart_infos(table_schema, part, allocator, subpart_infos, subpart_ids, part_map))) {
LOG_WARN("failed to get subpart info", K(ret));
} else {
part_infos.at(part_infos.count() - 1).subpart_cnt_ = subpart_infos.count() - origin_cnt;
@ -741,6 +743,7 @@ int ObDbmsStatsUtils::get_part_infos(const ObTableSchema &table_schema,
int ObDbmsStatsUtils::get_subpart_infos(const ObTableSchema &table_schema,
const ObPartition *part,
ObIAllocator &allocator,
ObIArray<PartInfo> &subpart_infos,
ObIArray<int64_t> &subpart_ids,
OSGPartMap *part_map/*default NULL*/)
@ -764,7 +767,9 @@ int ObDbmsStatsUtils::get_subpart_infos(const ObTableSchema &table_schema,
subpart_info.part_id_ = subpart->get_sub_part_id(); // means object_id
subpart_info.tablet_id_ = subpart->get_tablet_id();
subpart_info.first_part_id_ = part->get_part_id();
if (OB_NOT_NULL(part_map)) {
if (OB_FAIL(ob_write_string(allocator, subpart->get_part_name(), subpart_info.part_name_))) {
LOG_WARN("failed to write string", K(ret));
} else if (OB_NOT_NULL(part_map)) {
OSGPartInfo part_info;
part_info.part_id_ = part->get_part_id();
part_info.tablet_id_ = subpart->get_tablet_id();

View File

@ -115,6 +115,7 @@ public:
static bool is_part_id_valid(const ObTableStatParam &param, const ObObjectID part_id);
static int get_part_infos(const ObTableSchema &table_schema,
ObIAllocator &allocator,
ObIArray<PartInfo> &part_infos,
ObIArray<PartInfo> &subpart_infos,
ObIArray<int64_t> &part_ids,
@ -123,6 +124,7 @@ public:
static int get_subpart_infos(const share::schema::ObTableSchema &table_schema,
const share::schema::ObPartition *part,
ObIAllocator &allocator,
ObIArray<PartInfo> &subpart_infos,
ObIArray<int64_t> &subpart_ids,
OSGPartMap *part_map = NULL);

View File

@ -947,6 +947,7 @@ int ObIncrementalStatEstimator::gen_opt_stat_param_by_direct_load(ObExecContext
ret = OB_ERR_UNEXPECTED;
LOG_WARN("get unexpected error", K(ret));
} else if (OB_FAIL(ObDbmsStatsUtils::get_part_infos(*table_schema,
alloc,
param.part_infos_,
param.subpart_infos_,
part_ids,

View File

@ -824,6 +824,7 @@ int ObPxFifoReceiveOp::fetch_rows(const int64_t row_cnt)
}
} else {
LOG_WARN("fail get row from channels", K(ret));
break;
}
} while (OB_EAGAIN == ret);
}

View File

@ -1426,6 +1426,7 @@ int ObDynamicSamplingUtils::get_ds_table_part_info(ObOptimizerContext &ctx,
(is_virtual_table(ref_table_id) && !share::is_oracle_mapping_real_virtual_table(ref_table_id))) {
/*do nothing*/
} else if (OB_FAIL(ObDbmsStatsUtils::get_part_infos(*table_schema,
ctx.get_allocator(),
tmp_part_infos,
tmp_subpart_infos,
tmp_part_ids,

View File

@ -322,15 +322,16 @@ int ObAnalyzeStmtResolver::inner_resolve_partition_info(const ParseNode *part_no
bool is_subpart_name = false;
ObString &partition_name = table_info.get_partition_name();
if (OB_ISNULL(schema_checker_)) {
if (OB_ISNULL(schema_checker_) || OB_ISNULL(params_.allocator_)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("null schema checker", K(schema_checker_), K(ret));
LOG_WARN("null schema checker", K(schema_checker_), K(params_.allocator_), K(ret));
} else if (OB_FAIL(schema_checker_->get_table_schema(tenant_id, table_id, table_schema))) {
LOG_WARN("failed to get table schema", K(tenant_id), K(table_id), K(ret));
} else if (OB_ISNULL(table_schema)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("null table schema", K(ret));
} else if (OB_FAIL(ObDbmsStatsUtils::get_part_infos(*table_schema,
*params_.allocator_,
part_infos,
subpart_infos,
part_ids,