Fix tmp file parallel read cause infinite loop

This commit is contained in:
obdev 2022-12-19 06:37:54 +00:00 committed by ob-robot
parent 647e99b338
commit 0575caf883
2 changed files with 32 additions and 7 deletions

View File

@ -588,6 +588,7 @@ ObTmpFile::ObTmpFile()
last_extent_id_(0),
last_extent_min_offset_(0),
last_extent_max_offset_(INT64_MAX),
extent_idx_lock_(common::ObLatchIds::TMP_FILE_LOCK),
lock_(common::ObLatchIds::TMP_FILE_LOCK),
is_inited_(false)
{
@ -662,6 +663,26 @@ int64_t ObTmpFile::find_first_extent(const int64_t offset)
return first_extent;
}
void ObTmpFile::update_extent_idx_cache(const int64_t last_extent_id,
const int64_t last_extent_min_offset,
const int64_t last_extent_max_offset)
{
SpinWLockGuard guard(extent_idx_lock_);
last_extent_id_ = last_extent_id;
last_extent_min_offset_ = last_extent_min_offset;
last_extent_max_offset_ = last_extent_max_offset;
}
int64_t ObTmpFile::get_extent_idx_from_cache(const int64_t offset) const
{
SpinRLockGuard guard(extent_idx_lock_);
int64_t ith_extent = -1;
if (offset >= last_extent_min_offset_ && offset < last_extent_max_offset_) {
ith_extent = last_extent_id_;
}
return ith_extent;
}
int ObTmpFile::aio_read_without_lock(const ObTmpFileIOInfo &io_info,
int64_t &offset, ObTmpFileIOHandle &handle)
{
@ -731,13 +752,11 @@ int ObTmpFile::once_aio_read_batch_without_lock(
char *buf = io_info.buf_ + handle.get_data_size();
int64_t remain_size = io_info.size_ - handle.get_data_size();
int64_t read_size = 0;
int64_t ith_extent = 0;
ObTmpFileExtent *tmp = nullptr;
common::ObIArray<ObTmpFileExtent *> &extents = file_meta_.get_extents();
if (offset >= last_extent_min_offset_ && offset_ <= last_extent_max_offset_) {
ith_extent = last_extent_id_;
} else {
int64_t ith_extent = get_extent_idx_from_cache(offset);
if (OB_UNLIKELY(-1 == ith_extent)) {
ith_extent = find_first_extent(offset);
}
@ -761,13 +780,14 @@ int ObTmpFile::once_aio_read_batch_without_lock(
buf += read_size;
one_batch_read_size += read_size;
handle.add_data_size(read_size);
last_extent_id_ = ith_extent;
last_extent_min_offset_ = tmp->get_global_start();
last_extent_max_offset_ = tmp->get_global_end();
}
}
++ith_extent;
}
if (OB_SUCC(ret) && OB_NOT_NULL(tmp) && OB_LIKELY(ith_extent > 0)) {
update_extent_idx_cache(ith_extent - 1, tmp->get_global_start(), tmp->get_global_end());
}
return ret;
}

View File

@ -269,6 +269,10 @@ private:
int64_t small_file_prealloc_size();
int64_t big_file_prealloc_size();
int64_t find_first_extent(const int64_t offset);
void update_extent_idx_cache(const int64_t last_extent_id,
const int64_t last_extent_min_offset,
const int64_t last_extent_max_offset);
int64_t get_extent_idx_from_cache(const int64_t offset) const;
private:
// NOTE:
@ -286,6 +290,7 @@ private:
int64_t last_extent_id_;
int64_t last_extent_min_offset_;
int64_t last_extent_max_offset_;
common::SpinRWLock extent_idx_lock_;
common::SpinRWLock lock_;
bool is_inited_;