Fix ObMultipleMerge not refreshed during ObTableScanIterator::rescan

This commit is contained in:
JiahuaChen
2023-11-03 09:40:03 +00:00
committed by ob-robot
parent 4646e5136d
commit 8c9bd898fd
4 changed files with 36 additions and 2 deletions

View File

@ -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());
}

View File

@ -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) \

View File

@ -75,6 +75,7 @@ private:
template<typename T> 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();

View File

@ -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);
};