From ba235676b3ff8b75690d89e7c325aa0da8d6a931 Mon Sep 17 00:00:00 2001 From: yangqise7en <877793735@qq.com> Date: Thu, 12 Oct 2023 10:40:08 +0000 Subject: [PATCH] fix extra medium info fuse bug --- src/storage/access/ob_table_access_param.h | 2 +- .../compaction/ob_medium_list_checker.cpp | 16 ++++++++-------- src/storage/compaction/ob_medium_list_checker.h | 2 +- src/storage/tablet/ob_tablet.cpp | 7 ++----- src/storage/tablet/ob_tablet_mds_data.cpp | 3 +-- .../compaction/test_medium_list_checker.cpp | 8 ++++---- 6 files changed, 17 insertions(+), 21 deletions(-) diff --git a/src/storage/access/ob_table_access_param.h b/src/storage/access/ob_table_access_param.h index 2975441e4..fb66fe5e3 100644 --- a/src/storage/access/ob_table_access_param.h +++ b/src/storage/access/ob_table_access_param.h @@ -118,7 +118,7 @@ public: } OB_INLINE int64_t get_group_idx_col_index() const { - return (read_info_ != nullptr) ? read_info_->get_group_idx_col_index() : common::OB_INVALID_INDEX; + return (read_info_ != nullptr && read_info_ != rowkey_read_info_) ? read_info_->get_group_idx_col_index() : common::OB_INVALID_INDEX; } OB_INLINE bool need_fill_group_idx() const { return get_group_idx_col_index() != common::OB_INVALID_INDEX; } diff --git a/src/storage/compaction/ob_medium_list_checker.cpp b/src/storage/compaction/ob_medium_list_checker.cpp index 6b948a087..b1abdade0 100644 --- a/src/storage/compaction/ob_medium_list_checker.cpp +++ b/src/storage/compaction/ob_medium_list_checker.cpp @@ -18,23 +18,23 @@ namespace compaction int ObMediumListChecker::validate_medium_info_list( const ObExtraMediumInfo &extra_info, - const MediumInfoArray &medium_info_array, + const MediumInfoArray *medium_info_array, const int64_t last_major_snapshot) { int ret = OB_SUCCESS; int64_t next_medium_info_idx = 0; if (OB_FAIL(check_extra_info(extra_info, last_major_snapshot))) { LOG_WARN("failed to check extra info", KR(ret), K(last_major_snapshot), K(extra_info)); - } else if (medium_info_array.empty()) { + } else if (nullptr == medium_info_array || medium_info_array->empty()) { // do nothing - } else if (OB_FAIL(filter_finish_medium_info(medium_info_array, last_major_snapshot, next_medium_info_idx))) { + } else if (OB_FAIL(filter_finish_medium_info(*medium_info_array, last_major_snapshot, next_medium_info_idx))) { LOG_WARN("failed to filter finish medium info", KR(ret), K(last_major_snapshot), K(next_medium_info_idx)); - } else if (next_medium_info_idx >= medium_info_array.count()) { + } else if (next_medium_info_idx >= medium_info_array->count()) { // do nothing - } else if (OB_FAIL(check_continue(medium_info_array, next_medium_info_idx))) { - LOG_WARN("failed to check medium list continue", KR(ret), K(last_major_snapshot), K(medium_info_array)); - } else if (OB_FAIL(check_next_schedule_medium(medium_info_array.at(next_medium_info_idx), last_major_snapshot, false/*force_check*/))) { - LOG_WARN("failed to check next schedule medium info", KR(ret), K(last_major_snapshot), K(medium_info_array), K(next_medium_info_idx)); + } else if (OB_FAIL(check_continue(*medium_info_array, next_medium_info_idx))) { + LOG_WARN("failed to check medium list continue", KR(ret), K(last_major_snapshot), KPC(medium_info_array)); + } else if (OB_FAIL(check_next_schedule_medium(medium_info_array->at(next_medium_info_idx), last_major_snapshot, false/*force_check*/))) { + LOG_WARN("failed to check next schedule medium info", KR(ret), K(last_major_snapshot), KPC(medium_info_array), K(next_medium_info_idx)); } return ret; } diff --git a/src/storage/compaction/ob_medium_list_checker.h b/src/storage/compaction/ob_medium_list_checker.h index 62a65d3ac..07803ae99 100644 --- a/src/storage/compaction/ob_medium_list_checker.h +++ b/src/storage/compaction/ob_medium_list_checker.h @@ -23,7 +23,7 @@ public: typedef common::ObIArray MediumInfoArray; static int validate_medium_info_list( const ObExtraMediumInfo &extra_info, - const MediumInfoArray &medium_info_array, + const MediumInfoArray *medium_info_array, const int64_t last_major_snapshot); static int check_continue( const MediumInfoArray &medium_info_array, diff --git a/src/storage/tablet/ob_tablet.cpp b/src/storage/tablet/ob_tablet.cpp index 9658f71c0..58cee7899 100755 --- a/src/storage/tablet/ob_tablet.cpp +++ b/src/storage/tablet/ob_tablet.cpp @@ -4791,12 +4791,9 @@ int ObTablet::check_medium_list() const const ObTabletDumpedMediumInfo *dumped_list = nullptr; if (OB_FAIL(ObTabletMdsData::load_medium_info_list(arena_allocator, mds_data_.medium_info_list_, dumped_list))) { LOG_WARN("failed to load medium info list", K(ret), K(ls_id), K(tablet_id), K(mds_data_)); - } else if (nullptr == dumped_list) { - // do nothing - LOG_INFO("skip check medium list for empty dumped medium info list", KR(ret), K(ls_id), K(tablet_id)); } else if (OB_FAIL(ObMediumListChecker::validate_medium_info_list( mds_data_.extra_medium_info_, - dumped_list->medium_info_list_, + nullptr == dumped_list ? nullptr : &dumped_list->medium_info_list_, last_major->get_snapshot_version()))) { LOG_WARN("fail to validate medium info list", K(ret), K(ls_id), K(tablet_id), K(mds_data_), KPC(dumped_list), KPC(last_major)); } @@ -5750,7 +5747,7 @@ int ObTablet::validate_medium_info_list( } else if (OB_ISNULL(medium_info_list)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("medium info list is null", K(ret), K(ls_id), K(tablet_id), K(finish_medium_scn), KP(medium_info_list)); - } else if (OB_FAIL(ObMediumListChecker::validate_medium_info_list(extra_info, medium_info_list->medium_info_list_, finish_medium_scn))) { + } else if (OB_FAIL(ObMediumListChecker::validate_medium_info_list(extra_info, &medium_info_list->medium_info_list_, finish_medium_scn))) { LOG_WARN("failed to validate medium info list", KR(ret), K(ls_id), K(tablet_id), K(mds_data), K(finish_medium_scn)); } return ret; diff --git a/src/storage/tablet/ob_tablet_mds_data.cpp b/src/storage/tablet/ob_tablet_mds_data.cpp index 6d4470bfc..c488e1cfd 100644 --- a/src/storage/tablet/ob_tablet_mds_data.cpp +++ b/src/storage/tablet/ob_tablet_mds_data.cpp @@ -689,8 +689,7 @@ int ObTabletMdsData::init_single_complex_addr_and_extra_info( } if (OB_FAIL(ret)) { - } else if (nullptr == ptr - || finish_medium_scn < src_addr_extra_info.last_medium_scn_ + } else if (finish_medium_scn < src_addr_extra_info.last_medium_scn_ || src_addr_extra_info.last_medium_scn_ < src_data_extra_info.last_medium_scn_) { dst_extra_info.last_compaction_type_ = src_data_extra_info.last_compaction_type_; dst_extra_info.last_medium_scn_ = src_data_extra_info.last_medium_scn_; diff --git a/unittest/storage/compaction/test_medium_list_checker.cpp b/unittest/storage/compaction/test_medium_list_checker.cpp index 2ff0f451a..80115a853 100644 --- a/unittest/storage/compaction/test_medium_list_checker.cpp +++ b/unittest/storage/compaction/test_medium_list_checker.cpp @@ -108,19 +108,19 @@ TEST_F(TestMediumListChecker, test_validate_medium_info_list) ObSEArray array; ASSERT_EQ(OB_SUCCESS, construct_array("300, 400, 500", array, 10/*last_medium_scn_of_first_medium_info*/)); - ret = ObMediumListChecker::validate_medium_info_list(extra_info, array, 100/*last_major_snapshot*/); + ret = ObMediumListChecker::validate_medium_info_list(extra_info, &array, 100/*last_major_snapshot*/); ASSERT_EQ(OB_ERR_UNEXPECTED, ret); array.reset(); ASSERT_EQ(OB_SUCCESS, construct_array("200, 400, 500", array, 100/*last_medium_scn_of_first_medium_info*/)); - ret = ObMediumListChecker::validate_medium_info_list(extra_info, array, 50/*last_major_snapshot*/); + ret = ObMediumListChecker::validate_medium_info_list(extra_info, &array, 50/*last_major_snapshot*/); ASSERT_EQ(OB_ERR_UNEXPECTED, ret); - ret = ObMediumListChecker::validate_medium_info_list(extra_info, array, 100/*last_major_snapshot*/); + ret = ObMediumListChecker::validate_medium_info_list(extra_info, &array, 100/*last_major_snapshot*/); ASSERT_EQ(OB_SUCCESS, ret); extra_info.last_medium_scn_ = 1000; - ret = ObMediumListChecker::validate_medium_info_list(extra_info, array, 1000/*last_major_snapshot*/); + ret = ObMediumListChecker::validate_medium_info_list(extra_info, &array, 1000/*last_major_snapshot*/); ASSERT_EQ(OB_SUCCESS, ret); // push item without clear array