From a5c2b4a24f4b40681d9e27c8d7c3013014a42665 Mon Sep 17 00:00:00 2001 From: "Alan M. Carroll" Date: Mon, 10 May 2021 13:50:10 -0500 Subject: [PATCH] EPoll error capture - store in NetEvent for later processing. --- iocore/net/NetEvent.h | 1 + iocore/net/UnixNet.cc | 20 +++++++++++--------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/iocore/net/NetEvent.h b/iocore/net/NetEvent.h index 94e96fedda9..de5ed5f1e7f 100644 --- a/iocore/net/NetEvent.h +++ b/iocore/net/NetEvent.h @@ -91,6 +91,7 @@ class NetEvent struct { unsigned int got_local_addr : 1; unsigned int shutdown : 2; + unsigned int epoll_error : 1; } f; }; }; diff --git a/iocore/net/UnixNet.cc b/iocore/net/UnixNet.cc index 19ea5aee750..5356d49f5ef 100644 --- a/iocore/net/UnixNet.cc +++ b/iocore/net/UnixNet.cc @@ -507,27 +507,29 @@ NetHandler::waitForActivity(ink_hrtime timeout) if (cop_list.in(ne)) { cop_list.remove(ne); } - if (get_ev_events(pd, x) & (EVENTIO_READ | EVENTIO_ERROR)) { + auto flags = get_ev_events(pd, x); + ne->f.epoll_error = (0 != (flags & EVENTIO_ERROR)); + if (flags & (EVENTIO_READ | EVENTIO_ERROR)) { ne->read.triggered = 1; if (!read_ready_list.in(ne)) { read_ready_list.enqueue(ne); - } else if (get_ev_events(pd, x) & EVENTIO_ERROR) { + } else if (flags & EVENTIO_ERROR) { // check for unhandled epoll events that should be handled - Debug("iocore_net_main", "Unhandled epoll event on read: 0x%04x read.enabled=%d closed=%d read.netready_queue=%d", - get_ev_events(pd, x), ne->read.enabled, ne->closed, read_ready_list.in(ne)); + Debug("iocore_net_main", "Unhandled epoll event on read: 0x%04x read.enabled=%d closed=%d read.netready_queue=%d", flags, + ne->read.enabled, ne->closed, read_ready_list.in(ne)); } } - if (get_ev_events(pd, x) & (EVENTIO_WRITE | EVENTIO_ERROR)) { + if (flags & (EVENTIO_WRITE | EVENTIO_ERROR)) { ne->write.triggered = 1; if (!write_ready_list.in(ne)) { write_ready_list.enqueue(ne); - } else if (get_ev_events(pd, x) & EVENTIO_ERROR) { + } else if (flags & EVENTIO_ERROR) { // check for unhandled epoll events that should be handled Debug("iocore_net_main", "Unhandled epoll event on write: 0x%04x write.enabled=%d closed=%d write.netready_queue=%d", - get_ev_events(pd, x), ne->write.enabled, ne->closed, write_ready_list.in(ne)); + flags, ne->write.enabled, ne->closed, write_ready_list.in(ne)); } - } else if (!(get_ev_events(pd, x) & EVENTIO_READ)) { - Debug("iocore_net_main", "Unhandled epoll event: 0x%04x", get_ev_events(pd, x)); + } else if (!(flags & EVENTIO_READ)) { + Debug("iocore_net_main", "Unhandled epoll event: 0x%04x", flags); } } else if (epd->type == EVENTIO_DNS_CONNECTION) { if (epd->data.dnscon != nullptr) {