[CP] fix chunk store core under parallel read from disk
This commit is contained in:
committed by
ob-robot
parent
b1a9f5f204
commit
72b490a340
@ -2072,19 +2072,21 @@ int ObChunkDatumStore::read_file(
|
|||||||
CK (cur_pos >= file_size);
|
CK (cur_pos >= file_size);
|
||||||
OX (ret = OB_ITER_END);
|
OX (ret = OB_ITER_END);
|
||||||
} else {
|
} else {
|
||||||
this->set_io(size, static_cast<char *>(buf));
|
blocksstable::ObTmpFileIOInfo tmp_io = io_;
|
||||||
io_.io_desc_.set_wait_event(ObWaitEventIds::ROW_STORE_DISK_READ);
|
set_io(size, static_cast<char *>(buf), tmp_io);
|
||||||
|
tmp_io.io_desc_.set_wait_event(ObWaitEventIds::ROW_STORE_DISK_READ);
|
||||||
|
|
||||||
if (0 == read_size
|
if (0 == read_size
|
||||||
&& OB_FAIL(FILE_MANAGER_INSTANCE_V2.get_tmp_file_size(io_.fd_, tmp_file_size))) {
|
&& OB_FAIL(FILE_MANAGER_INSTANCE_V2.get_tmp_file_size(tmp_io.fd_, tmp_file_size))) {
|
||||||
LOG_WARN("failed to get tmp file size", K(ret));
|
LOG_WARN("failed to get tmp file size", K(ret));
|
||||||
} else if (OB_FAIL(FILE_MANAGER_INSTANCE_V2.pread(io_, offset, timeout_ms, handle))) {
|
} else if (OB_FAIL(FILE_MANAGER_INSTANCE_V2.pread(tmp_io, offset, timeout_ms, handle))) {
|
||||||
if (OB_ITER_END != ret) {
|
if (OB_ITER_END != ret) {
|
||||||
LOG_WARN("read form file failed", K(ret), K(io_), K(offset), K(timeout_ms));
|
LOG_WARN("read form file failed", K(ret), K(tmp_io), K(offset), K(timeout_ms));
|
||||||
}
|
}
|
||||||
} else if (handle.get_data_size() != size) {
|
} else if (handle.get_data_size() != size) {
|
||||||
ret = OB_INNER_STAT_ERROR;
|
ret = OB_INNER_STAT_ERROR;
|
||||||
LOG_WARN("read data less than expected",
|
LOG_WARN("read data less than expected",
|
||||||
K(ret), K(io_), "read_size", handle.get_data_size());
|
K(ret), K(tmp_io), "read_size", handle.get_data_size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
@ -2104,11 +2106,12 @@ int ObChunkDatumStore::aio_read_file(
|
|||||||
ret = OB_INVALID_ARGUMENT;
|
ret = OB_INVALID_ARGUMENT;
|
||||||
LOG_WARN("invalid argument", K(size), K(offset), KP(buf));
|
LOG_WARN("invalid argument", K(size), K(offset), KP(buf));
|
||||||
} else if (size > 0) {
|
} else if (size > 0) {
|
||||||
this->set_io(size, static_cast<char *>(buf));
|
blocksstable::ObTmpFileIOInfo tmp_io = io_;
|
||||||
io_.io_desc_.set_wait_event(ObWaitEventIds::ROW_STORE_DISK_READ);
|
set_io(size, static_cast<char *>(buf), tmp_io);
|
||||||
if (OB_FAIL(FILE_MANAGER_INSTANCE_V2.aio_pread(io_, offset, handle))) {
|
tmp_io.io_desc_.set_wait_event(ObWaitEventIds::ROW_STORE_DISK_READ);
|
||||||
|
if (OB_FAIL(FILE_MANAGER_INSTANCE_V2.aio_pread(tmp_io, offset, handle))) {
|
||||||
if (OB_ITER_END != ret) {
|
if (OB_ITER_END != ret) {
|
||||||
LOG_WARN("read form file failed", K(ret), K(io_), K(offset));
|
LOG_WARN("read form file failed", K(ret), K(tmp_io), K(offset));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1008,6 +1008,7 @@ private:
|
|||||||
bool need_dump(int64_t extra_size);
|
bool need_dump(int64_t extra_size);
|
||||||
BlockBuffer* new_block();
|
BlockBuffer* new_block();
|
||||||
void set_io(int64_t size, char *buf) { io_.size_ = size; io_.buf_ = buf; }
|
void set_io(int64_t size, char *buf) { io_.size_ = size; io_.buf_ = buf; }
|
||||||
|
static void set_io(int64_t size, char *buf, blocksstable::ObTmpFileIOInfo &io) { io.size_ = size; io.buf_ = buf; }
|
||||||
bool find_block_can_hold(const int64_t size, bool &need_shrink);
|
bool find_block_can_hold(const int64_t size, bool &need_shrink);
|
||||||
int get_store_row(RowIterator &it, const StoredRow *&sr);
|
int get_store_row(RowIterator &it, const StoredRow *&sr);
|
||||||
inline void callback_alloc(int64_t size) { if (callback_ != nullptr) callback_->alloc(size); }
|
inline void callback_alloc(int64_t size) { if (callback_ != nullptr) callback_->alloc(size); }
|
||||||
|
|||||||
Reference in New Issue
Block a user