From 49cdaf51d56d6d2100dcf3356c35f631f089030d Mon Sep 17 00:00:00 2001 From: hiddenbomb Date: Fri, 30 Jul 2021 17:45:45 +0800 Subject: [PATCH] retry io_getevents if we meet EINTR due to interruption from pstack/obstack --- deps/oblib/src/lib/io/ob_io_common.cpp | 25 ++++++++++++++++--------- deps/oblib/src/lib/io/ob_io_common.h | 3 +++ 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/deps/oblib/src/lib/io/ob_io_common.cpp b/deps/oblib/src/lib/io/ob_io_common.cpp index 2ab5e4e17a..82cb57be31 100644 --- a/deps/oblib/src/lib/io/ob_io_common.cpp +++ b/deps/oblib/src/lib/io/ob_io_common.cpp @@ -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); diff --git a/deps/oblib/src/lib/io/ob_io_common.h b/deps/oblib/src/lib/io/ob_io_common.h index c37a0dcafb..ccdce39c7f 100644 --- a/deps/oblib/src/lib/io/ob_io_common.h +++ b/deps/oblib/src/lib/io/ob_io_common.h @@ -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 { -- GitLab