源码疑似缺陷:ObPartitionSchema::get_all_partition_num逻辑问题

【 使用环境 】
【 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的老师交流下这个函数的逻辑是否确有问题。

1 个赞

先点赞一下

收到, 我们内部研究一下, 这2天就确认一下

1 个赞

q1.为什么check_dropped_partition为false依然会去遍历dropped_partition_array呢?
a1.dropped_(sub)partition是涉及到3.x的分区延迟删除功能,这个功能在最初定义的时候,没有明确对于一个二级分区表,当其一个一级分区处于延迟删除状态时,它的二级分区一定也都是延迟删除状态。因此在这里进行计数时并没有根据check_dropped_partition去过滤dropped_partition_array的遍历。
q2.对于二级分区表,这个接口返回的数量是否会不符合预期?
a2.是符合预期的,这个接口计算二级分区表的分区数量是不会计算一级分区数的,因为这个时候所谓一级分区只是一个逻辑概念了。具体就你所疑惑的这段代码而言,在遍历dropped_partition_array的过程中,也只是对它的subpartition_num进行计数。

1 个赞

非常感谢老师的解惑!