diff --git a/src/storage/blocksstable/ob_tmp_file.cpp b/src/storage/blocksstable/ob_tmp_file.cpp index 1467c55f8..26811d613 100644 --- a/src/storage/blocksstable/ob_tmp_file.cpp +++ b/src/storage/blocksstable/ob_tmp_file.cpp @@ -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 &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; } diff --git a/src/storage/blocksstable/ob_tmp_file.h b/src/storage/blocksstable/ob_tmp_file.h index af434158f..3c7301195 100644 --- a/src/storage/blocksstable/ob_tmp_file.h +++ b/src/storage/blocksstable/ob_tmp_file.h @@ -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_;