From b06c76337f8aa8c97db6f91781b13ec688e99514 Mon Sep 17 00:00:00 2001 From: Charles0429 Date: Fri, 25 Oct 2024 04:48:10 +0000 Subject: [PATCH] fix split partition invalid argument --- .../test_auto_partition_split_range.cpp | 3 ++- src/share/ob_partition_split_query.cpp | 18 ++++++++++-------- src/share/ob_partition_split_query.h | 6 ++++-- src/storage/access/ob_table_scan_range.cpp | 4 +++- src/storage/ob_partition_range_spliter.cpp | 8 ++++++-- 5 files changed, 25 insertions(+), 14 deletions(-) diff --git a/mittest/mtlenv/storage/test_auto_partition_split_range.cpp b/mittest/mtlenv/storage/test_auto_partition_split_range.cpp index 53487fbeb..d4da69f65 100644 --- a/mittest/mtlenv/storage/test_auto_partition_split_range.cpp +++ b/mittest/mtlenv/storage/test_auto_partition_split_range.cpp @@ -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)); } } diff --git a/src/share/ob_partition_split_query.cpp b/src/share/ob_partition_split_query.cpp index 93e2e5f9c..268ca535e 100644 --- a/src/share/ob_partition_split_query.cpp +++ b/src/share/ob_partition_split_query.cpp @@ -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; } diff --git a/src/share/ob_partition_split_query.h b/src/share/ob_partition_split_query.h index 155777db2..a63d53bf1 100644 --- a/src/share/ob_partition_split_query.h +++ b/src/share/ob_partition_split_query.h @@ -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 &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, diff --git a/src/storage/access/ob_table_scan_range.cpp b/src/storage/access/ob_table_scan_range.cpp index 82ce5c393..d5c4d3d77 100644 --- a/src/storage/access/ob_table_scan_range.cpp +++ b/src/storage/access/ob_table_scan_range.cpp @@ -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)); } diff --git a/src/storage/ob_partition_range_spliter.cpp b/src/storage/ob_partition_range_spliter.cpp index 733a68442..c02020c68 100644 --- a/src/storage/ob_partition_range_spliter.cpp +++ b/src/storage/ob_partition_range_spliter.cpp @@ -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;