user/dev discussion of public-inbox itself
 help / color / mirror / code / Atom feed
Search results ordered by [date|relevance]  view[summary|nested|Atom feed]
thread overview below | download mbox.gz: |
* [PATCH 0/4] lei: prioritize signals
@ 2021-10-16  9:29  7% Eric Wong
  2021-10-16  9:29  5% ` [PATCH 2/4] pkt_op: favor level-triggered epoll for fairness Eric Wong
  0 siblings, 1 reply; 2+ results
From: Eric Wong @ 2021-10-16  9:29 UTC (permalink / raw)
  To: meta

We drop Edge-Triggered kevent/epoll in nearly all places
to give signalfd / EVFILT_SIGNAL priority.

Eric Wong (4):
  wqworker: favor level-triggered epoll for fairness
  pkt_op: favor level-triggered epoll for fairness
  input_pipe: do not loop in ->event_step for fairness
  lei sockets: favor level-triggered epoll for fairness

 lib/PublicInbox/InputPipe.pm     | 17 +++++-----
 lib/PublicInbox/LEI.pm           | 20 +++++-------
 lib/PublicInbox/LeiSelfSocket.pm | 27 +++++++---------
 lib/PublicInbox/PktOp.pm         | 53 +++++++++++++++-----------------
 lib/PublicInbox/WQWorker.pm      | 18 +++++------
 5 files changed, 60 insertions(+), 75 deletions(-)

^ permalink raw reply	[relevance 7%]

* [PATCH 2/4] pkt_op: favor level-triggered epoll for fairness
  2021-10-16  9:29  7% [PATCH 0/4] lei: prioritize signals Eric Wong
@ 2021-10-16  9:29  5% ` Eric Wong
  0 siblings, 0 replies; 2+ results
From: Eric Wong @ 2021-10-16  9:29 UTC (permalink / raw)
  To: meta

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;

^ permalink raw reply related	[relevance 5%]

Results 1-2 of 2 | reverse | options above
-- pct% links below jump to the message on this page, permalinks otherwise --
2021-10-16  9:29  7% [PATCH 0/4] lei: prioritize signals Eric Wong
2021-10-16  9:29  5% ` [PATCH 2/4] pkt_op: favor level-triggered epoll for fairness Eric Wong

Code repositories for project(s) associated with this public 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).