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 3E7DF1F9F3 for ; Sat, 16 Oct 2021 09:29:53 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 1/4] wqworker: favor level-triggered epoll for fairness Date: Sat, 16 Oct 2021 09:29:50 +0000 Message-Id: <20211016092953.32649-2-e@80x24.org> In-Reply-To: <20211016092953.32649-1-e@80x24.org> References: <20211016092953.32649-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: Sigfd->event_step needs priority over WQWorkers (and everything else). Do that by running once per event_loop iteration rather than looping inside event_step. This lowers throughput since it requires more syscalls, but that's the price of fairness. --- lib/PublicInbox/WQWorker.pm | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/PublicInbox/WQWorker.pm b/lib/PublicInbox/WQWorker.pm index 48b901bb139f..950bd17052a5 100644 --- a/lib/PublicInbox/WQWorker.pm +++ b/lib/PublicInbox/WQWorker.pm @@ -6,7 +6,7 @@ package PublicInbox::WQWorker; use strict; use v5.10.1; use parent qw(PublicInbox::DS); -use PublicInbox::Syscall qw(EPOLLIN EPOLLEXCLUSIVE EPOLLET); +use PublicInbox::Syscall qw(EPOLLIN EPOLLEXCLUSIVE); use Errno qw(EAGAIN ECONNRESET); use IO::Handle (); # blocking @@ -14,19 +14,19 @@ sub new { my ($cls, $wq, $sock) = @_; $sock->blocking(0); my $self = bless { sock => $sock, wq => $wq }, $cls; - $self->SUPER::new($sock, EPOLLEXCLUSIVE|EPOLLIN|EPOLLET); + $self->SUPER::new($sock, EPOLLEXCLUSIVE|EPOLLIN); $self; } sub event_step { my ($self) = @_; - my $n; - do { - $n = $self->{wq}->recv_and_run($self->{sock}); - } while ($n); - return if !defined($n) && $! == EAGAIN; # likely - warn "wq worker error: $!\n" if !defined($n) && $! != ECONNRESET; - $self->{wq}->wq_atexit_child if $self->{sock} == $self->{wq}->{-wq_s2}; + my $n = $self->{wq}->recv_and_run($self->{sock}) and return; + unless (defined $n) { + return if $! == EAGAIN; + warn "recvmsg: $!" if $! != ECONNRESET; + } + $self->{sock} == $self->{wq}->{-wq_s2} and + $self->{wq}->wq_atexit_child; $self->close; # PublicInbox::DS::close }