From 1181a7e6a853841f2d9fe8a9131aa05ad6d7e9d7 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Fri, 1 Oct 2021 09:54:38 +0000 Subject: listener: switch to level-triggered epoll On second thought, the ->requeue + accept retry code path isn't worth the userspace complexity and overhead. Level-triggered epoll has always annoyed me since it takes an inefficient code path in the kernel; but taking our less-efficient code path in Perl seems even worse. We also need to take load distribution into account for multi-worker systems. --- lib/PublicInbox/Listener.pm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/PublicInbox/Listener.pm b/lib/PublicInbox/Listener.pm index 64bba5b0..09f1f2e5 100644 --- a/lib/PublicInbox/Listener.pm +++ b/lib/PublicInbox/Listener.pm @@ -7,7 +7,7 @@ use strict; use parent 'PublicInbox::DS'; use Socket qw(SOL_SOCKET SO_KEEPALIVE IPPROTO_TCP TCP_NODELAY); use IO::Handle; -use PublicInbox::Syscall qw(EPOLLIN EPOLLEXCLUSIVE EPOLLET); +use PublicInbox::Syscall qw(EPOLLIN EPOLLEXCLUSIVE); use Errno qw(EAGAIN ECONNABORTED EPERM); # Warn on transient errors, mostly resource limitations. @@ -22,7 +22,7 @@ sub new ($$$) { setsockopt($s, IPPROTO_TCP, TCP_NODELAY, 1); # ignore errors on non-TCP listen($s, 2**31 - 1); # kernel will clamp my $self = bless { post_accept => $cb }, $class; - $self->SUPER::new($s, EPOLLIN|EPOLLET|EPOLLEXCLUSIVE); + $self->SUPER::new($s, EPOLLIN|EPOLLEXCLUSIVE); } sub event_step { @@ -38,7 +38,6 @@ sub event_step { IO::Handle::blocking($c, 0); # no accept4 :< eval { $self->{post_accept}->($c, $addr, $sock) }; warn "E: $@\n" if $@; - $self->requeue; } elsif ($! == EAGAIN || $! == ECONNABORTED || $! == EPERM) { # EAGAIN is common and likely # ECONNABORTED is common with bad connections -- cgit v1.2.3-24-ge0c7