提交 49cdaf51 编写于 作者: H hiddenbomb 提交者: wangzelin.wzl

retry io_getevents if we meet EINTR due to interruption from pstack/obstack

上级 a331dec5
......@@ -95,22 +95,22 @@ int ob_io_getevents(io_context_t ctx_id, long min_nr, long nr, struct io_event*
#ifdef ERRSIM
ret = E(EventTable::EN_IO_GETEVENTS) OB_SUCCESS;
if (OB_SUCC(ret)) {
ret = io_getevents(ctx_id, min_nr, nr, events, timeout);
ret = io_getevents_with_retry(ctx_id, min_nr, nr, events, timeout);
} else {
if (OB_IO_ERROR == ret) {
ret = io_getevents(ctx_id, min_nr, nr, events, timeout);
ret = io_getevents_with_retry(ctx_id, min_nr, nr, events, timeout);
for (int64_t i = 0; i < ret; ++i) {
events[i].res = 1;
}
} else if (OB_TIMEOUT == ret) {
sleep(1);
ret = io_getevents(ctx_id, min_nr, nr, events, timeout);
ret = io_getevents_with_retry(ctx_id, min_nr, nr, events, timeout);
} else if (OB_AIO_TIMEOUT == ret) {
// ignore real return
io_getevents(ctx_id, min_nr, nr, events, timeout);
ret = io_getevents_with_retry(ctx_id, min_nr, nr, events, timeout);
ret = 0;
} else if (OB_EAGAIN == ret) {
ret = io_getevents(ctx_id, min_nr, nr, events, timeout);
ret = io_getevents_with_retry(ctx_id, min_nr, nr, events, timeout);
if (ret >= 1) {
// random make 1 event fail
int64_t idx = common::ObRandom::rand(1, ret) - 1;
......@@ -118,20 +118,27 @@ int ob_io_getevents(io_context_t ctx_id, long min_nr, long nr, struct io_event*
}
} else if (OB_RESOURCE_OUT == ret) {
// OB_CS_OUTOF_DISK_SPACE is not defined in lib/ob_errno.h, use OB_RESOURCE_OUT to represent
ret = io_getevents(ctx_id, min_nr, nr, events, timeout);
ret = io_getevents_with_retry(ctx_id, min_nr, nr, events, timeout);
for (int64_t i = 0; i < ret; ++i) {
events[i].res2 = -ENOSPC;
}
}
}
#else
// ignore EINTR and retry
while ((ret = io_getevents(ctx_id, min_nr, nr, events, timeout)) < 0 && -EINTR == ret)
;
ret = io_getevents_with_retry(ctx_id, min_nr, nr, events, timeout);
#endif
return ret;
}
int io_getevents_with_retry(
io_context_t ctx_id, long min_nr, long nr, struct io_event* events, struct timespec* timeout)
{
int ret = 0;
// ignore EINTR and retry
while ((ret = io_getevents(ctx_id, min_nr, nr, events, timeout)) < 0 && -EINTR == ret) {}
return ret;
}
void align_offset_size(const int64_t offset, const int64_t size, int64_t& align_offset, int64_t& align_size)
{
align_offset = lower_align(offset, DIO_READ_ALIGN_SIZE);
......
......@@ -50,6 +50,9 @@ extern int ob_io_cancel(io_context_t ctx, struct iocb* iocb, struct io_event* ev
extern int ob_io_getevents(
io_context_t ctx_id, long min_nr, long nr, struct io_event* events, struct timespec* timeout);
int io_getevents_with_retry(
io_context_t ctx_id, long min_nr, long nr, struct io_event* events, struct timespec* timeout);
void align_offset_size(const int64_t offset, const int64_t size, int64_t& align_offset, int64_t& align_size);
enum ObIOMode {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册