From 8c9bd898fd6532c72962eee8903b075a7d673169 Mon Sep 17 00:00:00 2001 From: JiahuaChen Date: Fri, 3 Nov 2023 09:40:03 +0000 Subject: [PATCH] Fix ObMultipleMerge not refreshed during ObTableScanIterator::rescan --- src/storage/access/ob_multiple_merge.cpp | 1 + src/storage/access/ob_table_scan_iterator.cpp | 27 +++++++++++++++++++ src/storage/access/ob_table_scan_iterator.h | 1 + src/storage/meta_mem/ob_tablet_handle.h | 9 +++++-- 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/storage/access/ob_multiple_merge.cpp b/src/storage/access/ob_multiple_merge.cpp index 7dd33026c9..01437f99f2 100644 --- a/src/storage/access/ob_multiple_merge.cpp +++ b/src/storage/access/ob_multiple_merge.cpp @@ -1239,6 +1239,7 @@ int ObMultipleMerge::refresh_tablet_iter() false/*allow_not_ready*/))) { LOG_WARN("failed to refresh tablet iterator", K(ret), K_(get_table_param), KP_(access_param)); } else { + get_table_param_->refreshed_merge_ = this; access_param_->iter_param_.rowkey_read_info_ = &(get_table_param_->tablet_iter_.get_tablet_handle().get_obj()->get_rowkey_read_info()); } diff --git a/src/storage/access/ob_table_scan_iterator.cpp b/src/storage/access/ob_table_scan_iterator.cpp index 6e9d44a9d9..fc38dadda2 100755 --- a/src/storage/access/ob_table_scan_iterator.cpp +++ b/src/storage/access/ob_table_scan_iterator.cpp @@ -205,6 +205,8 @@ int ObTableScanIterator::rescan(ObTableScanParam &scan_param) LOG_WARN("Failed to rescan reuse", K(ret)); } else if (OB_FAIL(table_scan_range_.init(*scan_param_))) { STORAGE_LOG(WARN, "Failed to init table scan range", K(ret)); + } else if (OB_FAIL(rescan_for_iter())) { + STORAGE_LOG(WARN, "Failed to switch param for iter", K(ret), K(*this)); } else if (OB_FAIL(open_iter())) { STORAGE_LOG(WARN, "fail to open iter", K(ret)); } else { @@ -281,6 +283,31 @@ int ObTableScanIterator::switch_param(ObTableScanParam &scan_param, const ObTabl return ret; } +int ObTableScanIterator::rescan_for_iter() +{ +#define RESET_NOT_REFRESHED_ITER(refreshed_iter, iter) \ + if (refreshed_iter != (void*)iter) { \ + reset_scan_iter(iter); \ + } \ + + int ret = OB_SUCCESS; + if (OB_LIKELY(nullptr == get_table_param_.refreshed_merge_)) { + // do nothing + } else { + RESET_NOT_REFRESHED_ITER(get_table_param_.refreshed_merge_, single_merge_); + RESET_NOT_REFRESHED_ITER(get_table_param_.refreshed_merge_, get_merge_); + RESET_NOT_REFRESHED_ITER(get_table_param_.refreshed_merge_, scan_merge_); + RESET_NOT_REFRESHED_ITER(get_table_param_.refreshed_merge_, multi_scan_merge_); + RESET_NOT_REFRESHED_ITER(get_table_param_.refreshed_merge_, skip_scan_merge_); + RESET_NOT_REFRESHED_ITER(get_table_param_.refreshed_merge_, memtable_row_sample_iterator_); + RESET_NOT_REFRESHED_ITER(get_table_param_.refreshed_merge_, row_sample_iterator_); + RESET_NOT_REFRESHED_ITER(get_table_param_.refreshed_merge_, block_sample_iterator_); + get_table_param_.refreshed_merge_ = nullptr; + } +#undef RESET_NOT_REFRESHED_ITER + return ret; +} + int ObTableScanIterator::switch_param_for_iter() { #define SWITCH_PARAM_FOR_ITER(iter, ret) \ diff --git a/src/storage/access/ob_table_scan_iterator.h b/src/storage/access/ob_table_scan_iterator.h index e03186149d..5fd55ce0b4 100644 --- a/src/storage/access/ob_table_scan_iterator.h +++ b/src/storage/access/ob_table_scan_iterator.h @@ -75,6 +75,7 @@ private: template void reset_scan_iter(T *&iter); int switch_scan_param(ObMultipleMerge &iter); void reuse_row_iters(); + int rescan_for_iter(); int switch_param_for_iter(); int open_iter(); diff --git a/src/storage/meta_mem/ob_tablet_handle.h b/src/storage/meta_mem/ob_tablet_handle.h index 6e9a931e19..74db482a03 100644 --- a/src/storage/meta_mem/ob_tablet_handle.h +++ b/src/storage/meta_mem/ob_tablet_handle.h @@ -103,10 +103,10 @@ private: ObTabletHandle *transfer_src_handle_; }; -struct ObGetTableParam +struct ObGetTableParam final { public: - ObGetTableParam() : frozen_version_(-1), sample_info_(), tablet_iter_() {} + ObGetTableParam() : frozen_version_(-1), sample_info_(), tablet_iter_(), refreshed_merge_(nullptr) {} ~ObGetTableParam() { reset(); } bool is_valid() const { return tablet_iter_.is_valid(); } void reset() @@ -114,12 +114,17 @@ public: frozen_version_ = -1; sample_info_.reset(); tablet_iter_.reset(); + refreshed_merge_ = nullptr; } TO_STRING_KV(K_(frozen_version), K_(sample_info), K_(tablet_iter)); public: int64_t frozen_version_; common::SampleInfo sample_info_; ObTabletTableIterator tablet_iter_; + + // when tablet has been refreshed, to notify other ObMultipleMerge in ObTableScanIterator re-inited + // before rescan. + void *refreshed_merge_; DISALLOW_COPY_AND_ASSIGN(ObGetTableParam); };