From 2575431176b3a1b9ce71acd543a9a05a3b822782 Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Tue, 3 Mar 2020 01:47:56 +0300 Subject: [PATCH] Fix EPOLLET race on Linux 5.5+ --- osd.cpp | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/osd.cpp b/osd.cpp index a1b38b1a..46667ac4 100644 --- a/osd.cpp +++ b/osd.cpp @@ -180,6 +180,22 @@ void osd_t::loop() void osd_t::handle_epoll_events() { + io_uring_sqe *sqe = ringloop->get_sqe(); + if (!sqe) + { + throw std::runtime_error("can't get SQE, will fall out of sync with EPOLLET"); + } + ring_data_t *data = ((ring_data_t*)sqe->user_data); + my_uring_prep_poll_add(sqe, epoll_fd, POLLIN); + data->callback = [this](ring_data_t *data) + { + if (data->res < 0) + { + throw std::runtime_error(std::string("epoll failed: ") + strerror(-data->res)); + } + handle_epoll_events(); + }; + ringloop->submit(); int nfds; epoll_event events[MAX_EPOLL_EVENTS]; restart: @@ -251,21 +267,6 @@ restart: { goto restart; } - io_uring_sqe *sqe = ringloop->get_sqe(); - if (!sqe) - { - throw std::runtime_error("can't get SQE, will fall out of sync with EPOLLET"); - } - ring_data_t *data = ((ring_data_t*)sqe->user_data); - my_uring_prep_poll_add(sqe, epoll_fd, POLLIN); - data->callback = [this](ring_data_t *data) - { - if (data->res < 0) - { - throw std::runtime_error(std::string("epoll failed: ") + strerror(-data->res)); - } - handle_epoll_events(); - }; } void osd_t::cancel_osd_ops(osd_client_t & cl)