fix split partition invalid argument

This commit is contained in:
Charles0429 2024-10-25 04:48:10 +00:00 committed by ob-robot
parent ce0877a2c1
commit b06c76337f
5 changed files with 25 additions and 14 deletions

View File

@ -198,7 +198,8 @@ int FakeObTableScanRange::do_split_datum_range(int64_t split_start_val, int64_t
}
if (OB_SUCC(ret)) {
if (OB_FAIL(split_query_.get_tablet_split_range(*tablet_handle_.get_obj(), datum_utils_, split_info_, allocator_, datum_range_))) {
bool is_empty_range = false;
if (OB_FAIL(split_query_.get_tablet_split_range(*tablet_handle_.get_obj(), datum_utils_, split_info_, allocator_, datum_range_, is_empty_range))) {
STORAGE_LOG(WARN, "fail to do split range", K(ret));
}
}

View File

@ -66,7 +66,8 @@ int ObPartitionSplitQuery::get_tablet_split_range(
const blocksstable::ObStorageDatumUtils &datum_utils,
const storage::ObTabletSplitTscInfo &split_info,
ObIAllocator &allocator,
blocksstable::ObDatumRange &src_range)
blocksstable::ObDatumRange &src_range,
bool &is_empty_range)
{
int ret = OB_SUCCESS;
int compare_ret = 0;
@ -75,12 +76,12 @@ int ObPartitionSplitQuery::get_tablet_split_range(
ret = OB_INVALID_ARGUMENT;
LOG_WARN("fail to split range, invalid argument", K(ret), K(src_range), K(split_info));
} else {
is_empty_range = false;
if (split_info.split_type_ == ObTabletSplitType::RANGE && split_info.partkey_is_rowkey_prefix_) {
const ObDatumRowkey &split_start_key = split_info.start_partkey_;
const ObDatumRowkey &split_end_key = split_info.end_partkey_;
const ObDatumRowkey &src_start_key = src_range.get_start_key();
const ObDatumRowkey &src_end_key = src_range.get_end_key();
bool is_empty_range = false;
// ObDatumRowkey
if (OB_FAIL(split_start_key.compare(split_end_key, datum_utils, compare_ret))) {
LOG_WARN("fail to split range, compare error.", K(ret), K(split_info));
@ -222,6 +223,7 @@ int ObPartitionSplitQuery::get_tablet_split_ranges(
tablet_handle_.get_obj()->get_rowkey_read_info().get_datum_utils();
const ObColDescIArray &col_descs =
tablet_handle_.get_obj()->get_rowkey_read_info().get_columns_desc();
bool is_empty_range = false;
for (int64_t i = 0; OB_SUCC(ret) && i < ori_ranges.count(); i++) {
tmp_range.reset();
@ -229,8 +231,10 @@ int ObPartitionSplitQuery::get_tablet_split_ranges(
LOG_WARN("Fail to deep copy src range", K(ret), K(ori_ranges.at(i)));
} else if (OB_FAIL(datum_range.from_range(tmp_range, allocator))) {
LOG_WARN("Failed to transfer store range", K(ret), K(tmp_range));
} else if (OB_FAIL(get_tablet_split_range(*tablet_handle_.get_obj(), datum_utils, split_info_, allocator, datum_range))) {
} else if (OB_FAIL(get_tablet_split_range(*tablet_handle_.get_obj(), datum_utils, split_info_, allocator, datum_range, is_empty_range))) {
LOG_WARN("Fail to get tabelt split range", K(ret), K(split_info_));
} else if (is_empty_range) {
LOG_INFO("Range after split is empty", K(ori_ranges.at(i)));
} else if (OB_FAIL(datum_range.to_store_range(col_descs, allocator, tmp_range))) {
LOG_WARN("fail to transfer to store range", K(ret), K(datum_range));
} else if (OB_FALSE_IT(tmp_range.set_table_id(ori_ranges.at(i).get_table_id()))) {
@ -246,7 +250,8 @@ int ObPartitionSplitQuery::get_tablet_split_ranges(
int ObPartitionSplitQuery::get_split_datum_range(
const blocksstable::ObStorageDatumUtils *datum_utils,
ObIAllocator &allocator,
blocksstable::ObDatumRange &datum_range)
blocksstable::ObDatumRange &datum_range,
bool &is_empty_range)
{
int ret = OB_SUCCESS;
if (tablet_handle_.is_valid() && split_info_.is_valid()) {
@ -254,7 +259,7 @@ int ObPartitionSplitQuery::get_split_datum_range(
datum_utils = &tablet_handle_.get_obj()->get_rowkey_read_info().get_datum_utils();
}
if (OB_FAIL(ret)) {
} else if (OB_FAIL(get_tablet_split_range(*tablet_handle_.get_obj(), *datum_utils, split_info_, allocator, datum_range))) {
} else if (OB_FAIL(get_tablet_split_range(*tablet_handle_.get_obj(), *datum_utils, split_info_, allocator, datum_range, is_empty_range))) {
STORAGE_LOG(WARN, "Failed to split range", K(ret), K(split_info_));
}
}
@ -338,9 +343,6 @@ int ObPartitionSplitQuery::split_multi_ranges_if_need(
} else if (OB_FAIL(get_tablet_split_ranges(src_ranges, new_ranges, allocator))) {
LOG_INFO("get tablet split new ranges err, maybe no spilitng is happening",
K(ret), K(src_ranges), K(new_ranges));
} else if (new_ranges.count() != src_ranges.count()) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("fail to get tablet split range.", K(ret));
} else {
is_splited_range = true;
}

View File

@ -58,7 +58,8 @@ public:
const blocksstable::ObStorageDatumUtils &datum_utils,
const storage::ObTabletSplitTscInfo &split_info,
ObIAllocator &allocator,
blocksstable::ObDatumRange &src_range);
blocksstable::ObDatumRange &src_range,
bool &is_empty_range);
int get_tablet_split_ranges(
const common::ObIArray<common::ObStoreRange> &ori_ranges,
@ -68,7 +69,8 @@ public:
int get_split_datum_range(
const blocksstable::ObStorageDatumUtils *datum_utils,
ObIAllocator &allocator,
blocksstable::ObDatumRange &datum_range);
blocksstable::ObDatumRange &datum_range,
bool &is_empty_range);
int get_tablet_split_info(
const ObTabletID &tablet_id,

View File

@ -328,8 +328,10 @@ int ObTableScanRange::init_ranges(
} else if (is_tablet_spliting && OB_FAIL(split_query.get_split_datum_range(
datum_utils,
*allocator_,
datum_range))) {
datum_range,
is_false))) {
STORAGE_LOG(WARN, "Failed to get split datum range", K(ret), K(tablet_id), K(ls_id));
} else if (is_false) {
} else if (OB_FAIL(ranges_.push_back(datum_range))) {
STORAGE_LOG(WARN, "Failed to push back datum range", K(ret));
}

View File

@ -1243,10 +1243,12 @@ int ObPartitionMultiRangeSpliter::get_multi_range_size(
total_size = 0;
int64_t estimate_size = 0, range_size = 0;
if (OB_UNLIKELY(0 == table_iter.count() || range_array.empty())) {
if (OB_UNLIKELY(0 == table_iter.count())) {
ret = OB_INVALID_ARGUMENT;
STORAGE_LOG(WARN, "Invalid argument to get multi range size", K(ret), K(table_iter),
K(range_array));
} else if (0 == range_array.count()) {
total_size = estimate_size;
} else if (OB_FAIL(get_split_tables(table_iter, tables))) {
STORAGE_LOG(WARN, "Failed to get all sstables", K(ret), K(table_iter));
} else if (OB_FAIL(try_estimate_range_size(range_array, tables, estimate_size))) {
@ -1542,10 +1544,12 @@ int ObPartitionMultiRangeSpliter::get_split_multi_ranges(
int64_t fast_range_array_cnt = 0;
multi_range_split_array.reset();
if (OB_UNLIKELY(0 == table_iter.count() || range_array.empty() || expected_task_count <= 0)) {
if (OB_UNLIKELY(0 == table_iter.count() || expected_task_count <= 0)) {
ret = OB_INVALID_ARGUMENT;
STORAGE_LOG(WARN, "Invalid argument to get split multi ranges", K(ret), K(table_iter),
K(range_array), K(expected_task_count));
} else if (range_array.empty()) {
// do nothing
} else if (OB_UNLIKELY(expected_task_count == 1)) {
STORAGE_LOG(DEBUG, "Unexpected only one split task", K(expected_task_count), K(range_array));
fast_range_array_cnt = 1;