From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id CB7B71F9F3 for ; Fri, 1 Oct 2021 09:54:45 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 2/9] listener: switch to level-triggered epoll Date: Fri, 1 Oct 2021 09:54:38 +0000 Message-Id: <20211001095445.9326-3-e@80x24.org> In-Reply-To: <20211001095445.9326-1-e@80x24.org> References: <20211001095445.9326-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: 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(-) diff --git a/lib/PublicInbox/Listener.pm b/lib/PublicInbox/Listener.pm index 64bba5b0fd7c..09f1f2e5fabd 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