From edf6d6f8974a608df83f7f702f460cfbf722f4a6 Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Sun, 12 Apr 2020 02:08:00 +0300 Subject: [PATCH] Fix http_request --- osd.cpp | 2 +- osd_cluster.cpp | 27 ++++++++++++++++++--------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/osd.cpp b/osd.cpp index e69136ab..ca0b9401 100644 --- a/osd.cpp +++ b/osd.cpp @@ -276,7 +276,7 @@ restart: else { auto & cb = epoll_handlers[events[i].data.fd]; - cb(events[i].events, events[i].data.fd); + cb(events[i].data.fd, events[i].events); } } } diff --git a/osd_cluster.cpp b/osd_cluster.cpp index 69459a8e..08d848c6 100644 --- a/osd_cluster.cpp +++ b/osd_cluster.cpp @@ -80,6 +80,7 @@ void http_co_t::resume() int r; if ((r = inet_pton(AF_INET, host.c_str(), &addr.sin_addr)) != 1) { + code = ENXIO; delete this; return; } @@ -88,6 +89,7 @@ void http_co_t::resume() peer_fd = socket(AF_INET, SOCK_STREAM, 0); if (peer_fd < 0) { + code = errno; delete this; return; } @@ -95,6 +97,7 @@ void http_co_t::resume() r = connect(peer_fd, (sockaddr*)&addr, sizeof(addr)); if (r < 0 && errno != EINPROGRESS) { + code = errno; delete this; return; } @@ -105,14 +108,17 @@ void http_co_t::resume() ev.events = EPOLLOUT | EPOLLIN | EPOLLRDHUP | EPOLLET; if (epoll_ctl(osd->epoll_fd, EPOLL_CTL_ADD, peer_fd, &ev) < 0) { - throw std::runtime_error(std::string("epoll_ctl: ") + strerror(errno)); + code = errno; + delete this; + return; } + epoll_events = 0; st = 1; return; } if (st == 1) { - if (epoll_events & EPOLLOUT) + if (epoll_events & (EPOLLOUT | EPOLLERR)) { int result = 0; socklen_t result_len = sizeof(result); @@ -122,6 +128,7 @@ void http_co_t::resume() } if (result != 0) { + code = result; delete this; return; } @@ -133,7 +140,9 @@ void http_co_t::resume() ev.events = EPOLLIN | EPOLLRDHUP | EPOLLET; if (epoll_ctl(osd->epoll_fd, EPOLL_CTL_MOD, peer_fd, &ev) < 0) { - throw std::runtime_error(std::string("epoll_ctl: ") + strerror(errno)); + code = errno; + delete this; + return; } st = 2; epoll_events = 0; @@ -192,7 +201,12 @@ void http_co_t::resume() // Read response if (st == 5) { - if (epoll_events & EPOLLIN) + if (epoll_events & (EPOLLRDHUP|EPOLLERR)) + { + delete this; + return; + } + else if (epoll_events & EPOLLIN) { response.resize(received + 9000); io_uring_sqe *sqe = osd->ringloop->get_sqe(); @@ -212,11 +226,6 @@ void http_co_t::resume() st = 6; epoll_events = 0; } - else if (epoll_events & EPOLLRDHUP) - { - delete this; - return; - } } if (st == 6) {