Fix direct load merge stuck.
This commit is contained in:
@ -62,9 +62,8 @@ ObTmpFileIOHandle::ObTmpFileIOHandle()
|
|||||||
io_handles_(),
|
io_handles_(),
|
||||||
page_cache_handles_(),
|
page_cache_handles_(),
|
||||||
block_cache_handles_(),
|
block_cache_handles_(),
|
||||||
last_extent_id_(0),
|
last_fd_(OB_INVALID_FD),
|
||||||
last_extent_min_offset_(0),
|
last_extent_id_(0)
|
||||||
last_extent_max_offset_(INT64_MAX)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -95,6 +94,10 @@ int ObTmpFileIOHandle::prepare_read(
|
|||||||
expect_read_size_ = read_size;
|
expect_read_size_ = read_size;
|
||||||
last_read_offset_ = read_offset;
|
last_read_offset_ = read_offset;
|
||||||
io_flag_ = io_flag;
|
io_flag_ = io_flag;
|
||||||
|
if (last_fd_ != fd_) {
|
||||||
|
last_fd_ = fd_;
|
||||||
|
last_extent_id_ = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -243,24 +246,14 @@ bool ObTmpFileIOHandle::is_valid()
|
|||||||
&& NULL != buf_ && size_ >= 0;
|
&& NULL != buf_ && size_ >= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObTmpFileIOHandle::update_extent_idx_cache(const int64_t last_extent_id,
|
void ObTmpFileIOHandle::set_last_extent_id(const int64_t last_extent_id)
|
||||||
const int64_t last_extent_min_offset,
|
|
||||||
const int64_t last_extent_max_offset)
|
|
||||||
{
|
{
|
||||||
last_extent_id_ = last_extent_id;
|
last_extent_id_ = last_extent_id;
|
||||||
last_extent_min_offset_ = last_extent_min_offset;
|
|
||||||
last_extent_max_offset_ = last_extent_max_offset;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t ObTmpFileIOHandle::get_extent_idx_from_cache(const int64_t offset) const
|
int64_t ObTmpFileIOHandle::get_last_extent_id() const
|
||||||
{
|
{
|
||||||
int64_t ith_extent = -1;
|
return last_extent_id_;
|
||||||
if (offset >= last_extent_min_offset_ && offset < last_extent_max_offset_) {
|
|
||||||
ith_extent = last_extent_id_;
|
|
||||||
} else if (offset == last_extent_max_offset_) {
|
|
||||||
ith_extent = last_extent_id_ + 1;
|
|
||||||
}
|
|
||||||
return ith_extent;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ObTmpFileIOHandle::ObIOReadHandle::ObIOReadHandle()
|
ObTmpFileIOHandle::ObIOReadHandle::ObIOReadHandle()
|
||||||
@ -723,7 +716,8 @@ int ObTmpFile::once_aio_read_batch(
|
|||||||
ObTmpFileExtent *tmp = nullptr;
|
ObTmpFileExtent *tmp = nullptr;
|
||||||
const int64_t remain_size = io_info.size_ - handle.get_data_size();
|
const int64_t remain_size = io_info.size_ - handle.get_data_size();
|
||||||
|
|
||||||
SpinWLockGuard guard(lock_);
|
{
|
||||||
|
SpinRLockGuard guard(lock_);
|
||||||
if (IS_NOT_INIT) {
|
if (IS_NOT_INIT) {
|
||||||
ret = OB_NOT_INIT;
|
ret = OB_NOT_INIT;
|
||||||
STORAGE_LOG(WARN, "ObTmpFile has not been initialized", K(ret));
|
STORAGE_LOG(WARN, "ObTmpFile has not been initialized", K(ret));
|
||||||
@ -740,8 +734,10 @@ int ObTmpFile::once_aio_read_batch(
|
|||||||
} else {
|
} else {
|
||||||
handle.set_last_read_offset(offset);
|
handle.set_last_read_offset(offset);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (need_update_offset) {
|
if (need_update_offset) {
|
||||||
|
SpinWLockGuard guard(lock_);
|
||||||
offset_ = offset;
|
offset_ = offset;
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
@ -759,11 +755,7 @@ int ObTmpFile::once_aio_read_batch_without_lock(
|
|||||||
int64_t read_size = 0;
|
int64_t read_size = 0;
|
||||||
ObTmpFileExtent *tmp = nullptr;
|
ObTmpFileExtent *tmp = nullptr;
|
||||||
common::ObIArray<ObTmpFileExtent *> &extents = file_meta_.get_extents();
|
common::ObIArray<ObTmpFileExtent *> &extents = file_meta_.get_extents();
|
||||||
|
int64_t ith_extent = get_extent_cache(offset, handle);
|
||||||
int64_t ith_extent = handle.get_extent_idx_from_cache(offset);
|
|
||||||
if (OB_UNLIKELY(-1 == ith_extent)) {
|
|
||||||
ith_extent = find_first_extent(offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
while (OB_SUCC(ret)
|
while (OB_SUCC(ret)
|
||||||
&& ith_extent < extents.count()
|
&& ith_extent < extents.count()
|
||||||
@ -790,12 +782,32 @@ int ObTmpFile::once_aio_read_batch_without_lock(
|
|||||||
++ith_extent;
|
++ith_extent;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (OB_SUCC(ret) && OB_NOT_NULL(tmp) && OB_LIKELY(ith_extent > 0)) {
|
if (OB_SUCC(ret) && OB_LIKELY(ith_extent > 0)) {
|
||||||
handle.update_extent_idx_cache(ith_extent - 1, tmp->get_global_start(), tmp->get_global_end());
|
handle.set_last_extent_id(ith_extent - 1);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int64_t ObTmpFile::get_extent_cache(const int64_t offset, const ObTmpFileIOHandle &handle)
|
||||||
|
{
|
||||||
|
common::ObIArray<ObTmpFileExtent *> &extents = file_meta_.get_extents();
|
||||||
|
int64_t ith_extent = -1;
|
||||||
|
int64_t last_extent_id = handle.get_last_extent_id();
|
||||||
|
if (OB_UNLIKELY(last_extent_id < 0 || last_extent_id >= extents.count() - 1)) {
|
||||||
|
ith_extent = find_first_extent(offset);
|
||||||
|
} else if (OB_LIKELY(extents.at(last_extent_id)->get_global_start() <= offset
|
||||||
|
&& offset < extents.at(last_extent_id)->get_global_end())) {
|
||||||
|
ith_extent = last_extent_id;
|
||||||
|
} else if (offset == extents.at(last_extent_id)->get_global_end()
|
||||||
|
&& last_extent_id != extents.count() - 1) {
|
||||||
|
ith_extent = last_extent_id + 1;
|
||||||
|
} else {
|
||||||
|
ith_extent = find_first_extent(offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ith_extent;
|
||||||
|
}
|
||||||
|
|
||||||
int ObTmpFile::aio_read(const ObTmpFileIOInfo &io_info, ObTmpFileIOHandle &handle)
|
int ObTmpFile::aio_read(const ObTmpFileIOInfo &io_info, ObTmpFileIOHandle &handle)
|
||||||
{
|
{
|
||||||
int ret = OB_SUCCESS;
|
int ret = OB_SUCCESS;
|
||||||
|
|||||||
@ -122,10 +122,8 @@ public:
|
|||||||
return block_cache_handles_;
|
return block_cache_handles_;
|
||||||
}
|
}
|
||||||
OB_INLINE int64_t get_last_read_offset() const { return last_read_offset_; }
|
OB_INLINE int64_t get_last_read_offset() const { return last_read_offset_; }
|
||||||
int64_t get_extent_idx_from_cache(const int64_t offset) const;
|
int64_t get_last_extent_id() const;
|
||||||
void update_extent_idx_cache(const int64_t last_extent_id,
|
void set_last_extent_id(const int64_t last_extent_id);
|
||||||
const int64_t last_extent_min_offset,
|
|
||||||
const int64_t last_extent_max_offset);
|
|
||||||
|
|
||||||
TO_STRING_KV(KP_(buf), K_(size), K_(is_read), K_(has_wait), K_(expect_read_size),
|
TO_STRING_KV(KP_(buf), K_(size), K_(is_read), K_(has_wait), K_(expect_read_size),
|
||||||
K_(last_read_offset), K_(io_flag), K_(update_offset_in_file));
|
K_(last_read_offset), K_(io_flag), K_(update_offset_in_file));
|
||||||
@ -148,9 +146,8 @@ private:
|
|||||||
common::ObSEArray<ObTmpFileIOHandle::ObIOReadHandle, 1> io_handles_;
|
common::ObSEArray<ObTmpFileIOHandle::ObIOReadHandle, 1> io_handles_;
|
||||||
common::ObSEArray<ObTmpFileIOHandle::ObPageCacheHandle, 1> page_cache_handles_;
|
common::ObSEArray<ObTmpFileIOHandle::ObPageCacheHandle, 1> page_cache_handles_;
|
||||||
common::ObSEArray<ObTmpFileIOHandle::ObBlockCacheHandle, 1> block_cache_handles_;
|
common::ObSEArray<ObTmpFileIOHandle::ObBlockCacheHandle, 1> block_cache_handles_;
|
||||||
|
int64_t last_fd_;
|
||||||
int64_t last_extent_id_;
|
int64_t last_extent_id_;
|
||||||
int64_t last_extent_min_offset_;
|
|
||||||
int64_t last_extent_max_offset_;
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(ObTmpFileIOHandle);
|
DISALLOW_COPY_AND_ASSIGN(ObTmpFileIOHandle);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -275,10 +272,7 @@ private:
|
|||||||
int64_t small_file_prealloc_size();
|
int64_t small_file_prealloc_size();
|
||||||
int64_t big_file_prealloc_size();
|
int64_t big_file_prealloc_size();
|
||||||
int64_t find_first_extent(const int64_t offset);
|
int64_t find_first_extent(const int64_t offset);
|
||||||
void update_extent_idx_cache(const int64_t last_extent_id,
|
int64_t get_extent_cache(const int64_t offset, const ObTmpFileIOHandle &handle);
|
||||||
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:
|
private:
|
||||||
// NOTE:
|
// NOTE:
|
||||||
|
|||||||
Reference in New Issue
Block a user