From a22d9f38aa3233618871da8a01fe649ef5c6890a Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Tue, 23 Jun 2020 20:18:04 +0300 Subject: [PATCH] Only use EPOLLOUT while connecting --- epoll_manager.cpp | 6 +++--- epoll_manager.h | 2 +- http_client.cpp | 9 +++++++-- messenger.cpp | 9 ++++----- osd.cpp | 2 +- stub_uring_osd.cpp | 2 +- timerfd_manager.cpp | 6 +++--- timerfd_manager.h | 4 ++-- 8 files changed, 22 insertions(+), 18 deletions(-) diff --git a/epoll_manager.cpp b/epoll_manager.cpp index e8f0edad..f2c51124 100644 --- a/epoll_manager.cpp +++ b/epoll_manager.cpp @@ -16,7 +16,7 @@ epoll_manager_t::epoll_manager_t(ring_loop_t *ringloop) throw std::runtime_error(std::string("epoll_create: ") + strerror(errno)); } - tfd = new timerfd_manager_t([this](int fd, std::function handler) { set_fd_handler(fd, handler); }); + tfd = new timerfd_manager_t([this](int fd, bool wr, std::function handler) { set_fd_handler(fd, wr, handler); }); handle_epoll_events(); } @@ -31,14 +31,14 @@ epoll_manager_t::~epoll_manager_t() close(epoll_fd); } -void epoll_manager_t::set_fd_handler(int fd, std::function handler) +void epoll_manager_t::set_fd_handler(int fd, bool wr, std::function handler) { if (handler != NULL) { bool exists = epoll_handlers.find(fd) != epoll_handlers.end(); epoll_event ev; ev.data.fd = fd; - ev.events = EPOLLOUT | EPOLLIN | EPOLLRDHUP | EPOLLET; + ev.events = (wr ? EPOLLOUT : 0) | EPOLLIN | EPOLLRDHUP | EPOLLET; if (epoll_ctl(epoll_fd, exists ? EPOLL_CTL_MOD : EPOLL_CTL_ADD, fd, &ev) < 0) { throw std::runtime_error(std::string("epoll_ctl: ") + strerror(errno)); diff --git a/epoll_manager.h b/epoll_manager.h index 8d1a2185..12c1c6f5 100644 --- a/epoll_manager.h +++ b/epoll_manager.h @@ -13,7 +13,7 @@ class epoll_manager_t public: epoll_manager_t(ring_loop_t *ringloop); ~epoll_manager_t(); - void set_fd_handler(int fd, std::function handler); + void set_fd_handler(int fd, bool wr, std::function handler); void handle_epoll_events(); timerfd_manager_t *tfd; diff --git a/http_client.cpp b/http_client.cpp index a1c421ba..ae406b77 100644 --- a/http_client.cpp +++ b/http_client.cpp @@ -156,7 +156,7 @@ http_co_t::~http_co_t() } if (peer_fd >= 0) { - tfd->set_fd_handler(peer_fd, NULL); + tfd->set_fd_handler(peer_fd, false, NULL); close(peer_fd); peer_fd = -1; } @@ -223,7 +223,7 @@ void http_co_t::start_connection() end(); return; } - tfd->set_fd_handler(peer_fd, [this](int peer_fd, int epoll_events) + tfd->set_fd_handler(peer_fd, true, [this](int peer_fd, int epoll_events) { this->epoll_events |= epoll_events; handle_events(); @@ -276,6 +276,11 @@ void http_co_t::handle_connect_result() } int one = 1; setsockopt(peer_fd, SOL_TCP, TCP_NODELAY, &one, sizeof(one)); + tfd->set_fd_handler(peer_fd, false, [this](int peer_fd, int epoll_events) + { + this->epoll_events |= epoll_events; + handle_events(); + }); state = HTTP_CO_SENDING_REQUEST; submit_send(); stackout(); diff --git a/messenger.cpp b/messenger.cpp index 9d620a38..560d8489 100644 --- a/messenger.cpp +++ b/messenger.cpp @@ -120,7 +120,7 @@ void osd_messenger_t::try_connect_peer_addr(osd_num_t peer_osd, const char *peer .osd_num = peer_osd, .in_buf = malloc(receive_buffer_size), }; - tfd->set_fd_handler(peer_fd, [this](int peer_fd, int epoll_events) + tfd->set_fd_handler(peer_fd, true, [this](int peer_fd, int epoll_events) { // Either OUT (connected) or HUP handle_connect_epoll(peer_fd); @@ -151,8 +151,7 @@ void osd_messenger_t::handle_connect_epoll(int peer_fd) int one = 1; setsockopt(peer_fd, SOL_TCP, TCP_NODELAY, &one, sizeof(one)); cl.peer_state = PEER_CONNECTED; - // FIXME Disable EPOLLOUT on this fd - tfd->set_fd_handler(peer_fd, [this](int peer_fd, int epoll_events) + tfd->set_fd_handler(peer_fd, false, [this](int peer_fd, int epoll_events) { handle_peer_epoll(peer_fd, epoll_events); }); @@ -335,7 +334,7 @@ void osd_messenger_t::stop_client(int peer_fd) } } clients.erase(it); - tfd->set_fd_handler(peer_fd, NULL); + tfd->set_fd_handler(peer_fd, false, NULL); if (cl.osd_num) { osd_peer_fds.erase(cl.osd_num); @@ -394,7 +393,7 @@ void osd_messenger_t::accept_connections(int listen_fd) .in_buf = malloc(receive_buffer_size), }; // Add FD to epoll - tfd->set_fd_handler(peer_fd, [this](int peer_fd, int epoll_events) + tfd->set_fd_handler(peer_fd, false, [this](int peer_fd, int epoll_events) { handle_peer_epoll(peer_fd, epoll_events); }); diff --git a/osd.cpp b/osd.cpp index 59bee7ec..2a64bbff 100644 --- a/osd.cpp +++ b/osd.cpp @@ -169,7 +169,7 @@ void osd_t::bind_socket() fcntl(listen_fd, F_SETFL, fcntl(listen_fd, F_GETFL, 0) | O_NONBLOCK); - epmgr->set_fd_handler(listen_fd, [this](int fd, int events) + epmgr->set_fd_handler(listen_fd, false, [this](int fd, int events) { c_cli.accept_connections(listen_fd); }); diff --git a/stub_uring_osd.cpp b/stub_uring_osd.cpp index c05253e5..0dcbf6e0 100644 --- a/stub_uring_osd.cpp +++ b/stub_uring_osd.cpp @@ -38,7 +38,7 @@ int main(int narg, char *args[]) msgr->exec_op = [msgr](osd_op_t *op) { stub_exec_op(msgr, op); }; // Accept new connections int listen_fd = bind_stub("0.0.0.0", 11203); - epmgr->set_fd_handler(listen_fd, [listen_fd, msgr](int fd, int events) + epmgr->set_fd_handler(listen_fd, false, [listen_fd, msgr](int fd, int events) { msgr->accept_connections(listen_fd); }); diff --git a/timerfd_manager.cpp b/timerfd_manager.cpp index c7bc736b..fdd20edd 100644 --- a/timerfd_manager.cpp +++ b/timerfd_manager.cpp @@ -6,7 +6,7 @@ #include #include "timerfd_manager.h" -timerfd_manager_t::timerfd_manager_t(std::function)> set_fd_handler) +timerfd_manager_t::timerfd_manager_t(std::function)> set_fd_handler) { this->set_fd_handler = set_fd_handler; wait_state = 0; @@ -15,7 +15,7 @@ timerfd_manager_t::timerfd_manager_t(std::function)> set_fd_handler; + std::function)> set_fd_handler; - timerfd_manager_t(std::function)> set_fd_handler); + timerfd_manager_t(std::function)> set_fd_handler); ~timerfd_manager_t(); int set_timer(uint64_t millis, bool repeat, std::function callback); void clear_timer(int timer_id);