about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2019-01-05 21:52:57 +0000
committerEric Wong <e@80x24.org>2019-01-05 23:17:39 +0000
commit9427c808130255911dd3e4eee99b6f2c1cc42066 (patch)
tree4d3045140408eb6f475551613c07007f08b030a8 /lib
parent789ac5b0119d8d878380bbe8b3de4c7630460148 (diff)
downloadpublic-inbox-9427c808130255911dd3e4eee99b6f2c1cc42066.tar.gz
I've hit /proc/sys/fs/pipe-user-pages-* limits on some systems.
So stop hogging resources on pipes which don't benefit from
giant sizes.

Some of these can use eventfd in the future to further reduce
resource use.
Diffstat (limited to 'lib')
-rw-r--r--lib/PublicInbox/Daemon.pm5
-rw-r--r--lib/PublicInbox/EvCleanup.pm4
-rw-r--r--lib/PublicInbox/Git.pm4
-rw-r--r--lib/PublicInbox/V2Writable.pm3
4 files changed, 16 insertions, 0 deletions
diff --git a/lib/PublicInbox/Daemon.pm b/lib/PublicInbox/Daemon.pm
index 4629aadb..6d2ae81b 100644
--- a/lib/PublicInbox/Daemon.pm
+++ b/lib/PublicInbox/Daemon.pm
@@ -356,6 +356,11 @@ sub unlink_pid_file_safe_ish ($$) {
 sub master_loop {
         pipe(my ($p0, $p1)) or die "failed to create parent-pipe: $!";
         pipe(my ($r, $w)) or die "failed to create self-pipe: $!";
+
+        if ($^O eq 'linux') { # 1031: F_SETPIPE_SZ = 1031
+                fcntl($_, 1031, 4096) for ($w, $p1);
+        }
+
         IO::Handle::blocking($w, 0);
         my $set_workers = $worker_processes;
         my @caught;
diff --git a/lib/PublicInbox/EvCleanup.pm b/lib/PublicInbox/EvCleanup.pm
index 1a3a3d5e..1a2bdb29 100644
--- a/lib/PublicInbox/EvCleanup.pm
+++ b/lib/PublicInbox/EvCleanup.pm
@@ -19,7 +19,11 @@ my $laterq = [ [], undef ];
 sub once_init () {
         my $self = fields::new('PublicInbox::EvCleanup');
         my ($r, $w);
+
+        # This is a dummy pipe which is always writable so it can always
+        # fires in the next event loop iteration.
         pipe($r, $w) or die "pipe: $!";
+        fcntl($w, 1031, 4096) if $^O eq 'linux'; # 1031: F_SETPIPE_SZ
         $self->SUPER::new($w);
         $self->{rd} = $r; # never read, since we never write..
         $self;
diff --git a/lib/PublicInbox/Git.pm b/lib/PublicInbox/Git.pm
index 95df52ed..16117277 100644
--- a/lib/PublicInbox/Git.pm
+++ b/lib/PublicInbox/Git.pm
@@ -37,6 +37,10 @@ sub _bidi_pipe {
 
         pipe($in_r, $in_w) or fail($self, "pipe failed: $!");
         pipe($out_r, $out_w) or fail($self, "pipe failed: $!");
+        if ($^O eq 'linux') { # 1031: F_SETPIPE_SZ
+                fcntl($out_w, 1031, 4096);
+                fcntl($in_w, 1031, 4096) if $batch eq '--batch-check';
+        }
 
         my @cmd = ('git', "--git-dir=$self->{git_dir}", qw(cat-file), $batch);
         my $redir = { 0 => fileno($out_r), 1 => fileno($in_w) };
diff --git a/lib/PublicInbox/V2Writable.pm b/lib/PublicInbox/V2Writable.pm
index 0a304aae..fbab8f70 100644
--- a/lib/PublicInbox/V2Writable.pm
+++ b/lib/PublicInbox/V2Writable.pm
@@ -243,6 +243,9 @@ sub idx_init {
 
         if ($self->{parallel}) {
                 pipe(my ($r, $w)) or die "pipe failed: $!";
+                # pipe for barrier notifications doesn't need to be big,
+                # 1031: F_SETPIPE_SZ
+                fcntl($w, 1031, 4096) if $^O eq 'linux';
                 $self->{bnote} = [ $r, $w ];
                 $w->autoflush(1);
         }