【 使用环境 】
【 OB】
【 使用版本 】开源314
【问题描述】
阅读源码过程中,对ObSimpleTableSchemaV2::get_convert_size()函数内分区相关的逻辑产生疑问,详见函数中注释
int64_t ObSimpleTableSchemaV2::get_convert_size() const
{
...
/* 【疑问1】:
partition_array_[i]->get_convert_size()中已经调用sizeof(*this)计算了partition指针的size,
所以我理解当for循环结束后,convert_size 应当已经包含了所谓partition_array size。
为什么后面还要执行convert_size += partition_num_ * sizeof(ObPartition*)再计算一遍partition_array size */
// all part info size
for (int64_t i = 0; i < partition_num_ && NULL != partition_array_[i]; ++i) {
convert_size += partition_array_[i]->get_convert_size();
}
convert_size += partition_num_ * sizeof(ObPartition*); // partition_array size
// all dropped part info size
for (int64_t i = 0; i < dropped_partition_num_ && NULL != dropped_partition_array_[i]; ++i) {
convert_size += dropped_partition_array_[i]->get_convert_size();
}
/* 【疑问2】:
根据前面的逻辑,这里是否应当为dropped_partition_num_ * sizeof(ObPartition*)
*/
convert_size += partition_num_ * sizeof(ObPartition*); // partition_array size
/* 【疑问3】:
bindling_为true是什么含义?
*/
if (binding_) {
/*【疑问4】:
注释说这里是计算sorted_part_id_array size,首先sorted_part_id_array是int64_t数组,
其次sorted_part_id_array可能包含包括dropped partition在内的所有分区id,
所以,这里是否应当为:所有分区个数 * sizeof(int64_t)
*/
convert_size += partition_num_ * sizeof(ObPartition*); // sorted_part_id_array size;
}
// all sub part info size
for (int64_t i = 0; i < def_subpartition_num_ && NULL != def_subpartition_array_[i]; ++i) {
convert_size += def_subpartition_array_[i]->get_convert_size();
}
convert_size += def_subpartition_num_ * sizeof(ObSubPartition*); // def subpart_parray size
if (binding_) {
/* 【疑问5】:
这里是否应当为 def_subpartition_num_ * sizeof(ObSubPartition*)
*/
convert_size += partition_num_ * sizeof(ObSubPartition*); // sorted_def_sub_part_id_array size
}
...
}
期待OB的老师能帮忙看下是否存在问题,解答下疑惑,谢谢!