【 使用环境 】
【 OB】
【 使用版本 】开源314
【问题描述】
阅读源码过程中,觉得ObPartitionSchema::get_all_partition_num函数存在逻辑问题。函数代码如下,疑问点见函数中注释
int ObPartitionSchema::get_all_partition_num(bool check_dropped_partition /* = false */, int64_t& part_num) const
{
int ret = OB_SUCCESS;
part_num = 1;
switch (part_level_) {
case PARTITION_LEVEL_ZERO: {
break;
}
case PARTITION_LEVEL_ONE: {
part_num = get_first_part_num();
if (check_dropped_partition) {
part_num += get_dropped_partition_num();
}
break;
}
case PARTITION_LEVEL_TWO: {
if (is_sub_part_template()) {
part_num = get_first_part_num() * get_def_sub_part_num();
if (check_dropped_partition) {
part_num += get_dropped_partition_num() * get_def_sub_part_num();
}
} else {
part_num = 0;
for (int64_t i = 0; OB_SUCC(ret) && i < get_partition_num(); i++) {
const ObPartition* part = get_part_array()[i];
if (OB_ISNULL(part)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("partition is null", KR(ret), K(i));
} else {
part_num += part->get_subpartition_num();
if (check_dropped_partition) {
part_num += part->get_dropped_subpartition_num();
}
}
}
/*
疑问点:
当入参check_dropped_partition为false时,
预期逻辑是不计算dropped_partition_array中的分区数。
但是这里虽然没有计算二级分区的数量,却计算了dropped_partition_array的数量,
不符合预期。
*/
for (int64_t i = 0; OB_SUCC(ret) && i < get_dropped_partition_num(); i++) {
const ObPartition* part = get_dropped_part_array()[i];
if (OB_ISNULL(part)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("partition is null", KR(ret), K(i));
} else {
part_num += part->get_subpartition_num();
if (check_dropped_partition) {
part_num += part->get_dropped_subpartition_num();
}
}
}
}
break;
}
default: {
LOG_WARN("invalid partition level", K_(part_level));
break;
}
}
return ret;
}
希望可以和OB的老师交流下这个函数的逻辑是否确有问题。