From: Eric Wong <e@80x24.org> To: meta@public-inbox.org Subject: [PATCH 2/4] pkt_op: favor level-triggered epoll for fairness Date: Sat, 16 Oct 2021 09:29:51 +0000 [thread overview] Message-ID: <20211016092953.32649-3-e@80x24.org> (raw) In-Reply-To: <20211016092953.32649-1-e@80x24.org> Sigfd->event_step needs priority over PktOp (and everything else). We'll also add ECONNRESET checking, here, since it could see bidirectional use in the future. This is unlikely to have any sort of performance difference since this is only for small, occasional packets, but the code reduction is nice. --- lib/PublicInbox/PktOp.pm | 53 ++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 29 deletions(-) diff --git a/lib/PublicInbox/PktOp.pm b/lib/PublicInbox/PktOp.pm index fd2569badd74..4c434566d31f 100644 --- a/lib/PublicInbox/PktOp.pm +++ b/lib/PublicInbox/PktOp.pm @@ -9,8 +9,8 @@ package PublicInbox::PktOp; use strict; use v5.10.1; use parent qw(PublicInbox::DS); -use Errno qw(EAGAIN EINTR); -use PublicInbox::Syscall qw(EPOLLIN EPOLLET); +use Errno qw(EAGAIN ECONNRESET); +use PublicInbox::Syscall qw(EPOLLIN); use Socket qw(AF_UNIX MSG_EOR SOCK_SEQPACKET); use PublicInbox::IPC qw(ipc_freeze ipc_thaw); use Scalar::Util qw(blessed); @@ -19,7 +19,7 @@ sub new { my ($cls, $r) = @_; my $self = bless { sock => $r }, $cls; $r->blocking(0); - $self->SUPER::new($r, EPOLLIN|EPOLLET); + $self->SUPER::new($r, EPOLLIN); } # returns a blessed objects as the consumer and producer @@ -38,33 +38,28 @@ sub pkt_do { # for the producer to trigger event_step in consumer sub event_step { my ($self) = @_; my $c = $self->{sock}; - my $msg; - while (1) { - my $n = recv($c, $msg, 4096, 0); - unless (defined $n) { - return if $! == EAGAIN; - next if $! == EINTR; - $self->close; - die "recv: $!"; - } - my ($cmd, @pargs); - if (index($msg, "\0") > 0) { - ($cmd, my $pargs) = split(/\0/, $msg, 2); - @pargs = @{ipc_thaw($pargs)}; - } else { - # for compatibility with the script/lei in client mode, - # it doesn't load Sereal||Storable for startup speed - ($cmd, @pargs) = split(/ /, $msg); - } - my $op = $self->{ops}->{$cmd //= $msg}; - if ($op) { - my ($obj, @args) = (@$op, @pargs); - blessed($obj) ? $obj->$cmd(@args) : $obj->(@args); - } elsif ($msg ne '') { - die "BUG: unknown message: `$cmd'"; - } - return $self->close if $msg eq ''; # close on EOF + my $n = recv($c, my $msg, 4096, 0); + unless (defined $n) { + return if $! == EAGAIN; + die "recv: $!" if $! != ECONNRESET; # we may be bidirectional } + my ($cmd, @pargs); + if (index($msg, "\0") > 0) { + ($cmd, my $pargs) = split(/\0/, $msg, 2); + @pargs = @{ipc_thaw($pargs)}; + } else { + # for compatibility with the script/lei in client mode, + # it doesn't load Sereal||Storable for startup speed + ($cmd, @pargs) = split(/ /, $msg); + } + my $op = $self->{ops}->{$cmd //= $msg}; + if ($op) { + my ($obj, @args) = (@$op, @pargs); + blessed($obj) ? $obj->$cmd(@args) : $obj->(@args); + } elsif ($msg ne '') { + die "BUG: unknown message: `$cmd'"; + } + $self->close if $msg eq ''; # close on EOF } 1;
next prev parent reply other threads:[~2021-10-16 9:29 UTC|newest] Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-10-16 9:29 [PATCH 0/4] lei: prioritize signals Eric Wong 2021-10-16 9:29 ` [PATCH 1/4] wqworker: favor level-triggered epoll for fairness Eric Wong 2021-10-16 9:29 ` Eric Wong [this message] 2021-10-16 9:29 ` [PATCH 3/4] input_pipe: do not loop in ->event_step " Eric Wong 2021-10-16 9:29 ` [PATCH 4/4] lei sockets: favor level-triggered epoll " Eric Wong
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style List information: https://public-inbox.org/README * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20211016092953.32649-3-e@80x24.org \ --to=e@80x24.org \ --cc=meta@public-inbox.org \ --subject='Re: [PATCH 2/4] pkt_op: favor level-triggered epoll for fairness' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Code repositories for project(s) associated with this inbox: https://80x24.org/public-inbox.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).