Fix tmp file parallel read cause infinite loop
This commit is contained in:
parent
647e99b338
commit
0575caf883
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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_;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user