dumping ground for random patches and texts
 help / color / mirror / Atom feed
* [PATCH] WIP-limiter-rlimit
@ 2023-11-30 19:33 Eric Wong
  0 siblings, 0 replies; only message in thread
From: Eric Wong @ 2023-11-30 19:33 UTC (permalink / raw)
  To: spew

---
 lib/PublicInbox/Limiter.pm | 15 +++++++++------
 lib/PublicInbox/Spawn.pm   | 31 ++++++++++++++++++++++++-------
 t/spawn.t                  |  7 +++++++
 3 files changed, 40 insertions(+), 13 deletions(-)

diff --git a/lib/PublicInbox/Limiter.pm b/lib/PublicInbox/Limiter.pm
index 48a2b6a3..a8d08fc3 100644
--- a/lib/PublicInbox/Limiter.pm
+++ b/lib/PublicInbox/Limiter.pm
@@ -31,14 +31,17 @@ sub setup_rlimit {
 		} elsif (scalar(@rlimit) != 2) {
 			warn "could not parse $k: $v\n";
 		}
-		eval { require BSD::Resource };
-		if ($@) {
-			warn "BSD::Resource missing for $rlim";
-			next;
-		}
+		my $inf = $v =~ /\binfinity\b/i ?
+			$PublicInbox::Spawn::RLIMITS{RLIM_INFINITY} // eval {
+				require BSD::Resource;
+				BSD::Resource::RLIM_INFINITY();
+			} // do {
+				warn "BSD::Resource missing for $rlim";
+				next;
+			} : undef;
 		for my $i (0..$#rlimit) {
 			next if $rlimit[$i] ne 'INFINITY';
-			$rlimit[$i] = BSD::Resource::RLIM_INFINITY();
+			$rlimit[$i] = $inf;
 		}
 		$self->{$rlim} = \@rlimit;
 	}
diff --git a/lib/PublicInbox/Spawn.pm b/lib/PublicInbox/Spawn.pm
index b09bb536..aed993db 100644
--- a/lib/PublicInbox/Spawn.pm
+++ b/lib/PublicInbox/Spawn.pm
@@ -21,10 +21,11 @@ use IO::Handle ();
 use Carp qw(croak);
 use PublicInbox::IO;
 our @EXPORT_OK = qw(which spawn popen_rd popen_wr run_die run_wait run_qx);
-our @RLIMITS = qw(RLIMIT_CPU RLIMIT_CORE RLIMIT_DATA);
+our (@RLIMITS, %RLIMITS);
 use autodie qw(close open pipe seek sysseek truncate);
 
 BEGIN {
+	@RLIMITS = qw(RLIMIT_CPU RLIMIT_CORE RLIMIT_DATA RLIMIT_FSIZE);
 	my $all_libc = <<'ALL_LIBC'; # all *nix systems we support
 #include <sys/resource.h>
 #include <sys/socket.h>
@@ -292,14 +293,28 @@ void recv_cmd4(PerlIO *s, SV *buf, STRLEN n)
 	Inline_Stack_Done;
 }
 #endif /* defined(CMSG_SPACE) && defined(CMSG_LEN) */
-ALL_LIBC
 
+void rlimit_map()
+{
+	Inline_Stack_Vars;
+	Inline_Stack_Reset;
+ALL_LIBC
 	my $inline_dir = $ENV{PERL_INLINE_DIRECTORY} // (
 			$ENV{XDG_CACHE_HOME} //
 			( ($ENV{HOME} // '/nonexistent').'/.cache' )
 		).'/public-inbox/inline-c';
 	undef $all_libc unless -d $inline_dir;
 	if (defined $all_libc) {
+		for (@RLIMITS, 'RLIM_INFINITY') {
+			$all_libc .= <<EOM;
+	Inline_Stack_Push(sv_2mortal(newSVpvs("$_")));
+	Inline_Stack_Push(sv_2mortal(newSViv($_)));
+EOM
+		}
+		$all_libc .= <<EOM;
+	Inline_Stack_Done;
+} // rlimit_map
+EOM
 		local $ENV{PERL_INLINE_DIRECTORY} = $inline_dir;
 		# CentOS 7.x ships Inline 0.53, 0.64+ has built-in locking
 		my $lk = PublicInbox::Lock->new($inline_dir.
@@ -325,6 +340,7 @@ ALL_LIBC
 	}
 	if (defined $all_libc) { # set for Gcf2
 		$ENV{PERL_INLINE_DIRECTORY} = $inline_dir;
+		%RLIMITS = rlimit_map();
 	} else {
 		require PublicInbox::SpawnPP;
 		*pi_fork_exec = \&PublicInbox::SpawnPP::pi_fork_exec
@@ -370,11 +386,12 @@ sub spawn ($;$$) {
 	my $rlim = [];
 	foreach my $l (@RLIMITS) {
 		my $v = $opt->{$l} // next;
-		my $r = eval "require BSD::Resource; BSD::Resource::$l();";
-		unless (defined $r) {
-			warn "$l undefined by BSD::Resource: $@\n";
-			next;
-		}
+		my $r = $RLIMITS{$l} //
+			eval "require BSD::Resource; BSD::Resource::$l();" //
+			do {
+				warn "$l undefined by BSD::Resource: $@\n";
+				next;
+			};
 		push @$rlim, $r, @$v;
 	}
 	my $cd = $opt->{'-C'} // ''; # undef => NULL mapping doesn't work?
diff --git a/t/spawn.t b/t/spawn.t
index 48f541b8..344957af 100644
--- a/t/spawn.t
+++ b/t/spawn.t
@@ -260,4 +260,11 @@ SKIP: {
 	is(readline($fh), "hihi\n", 'env+chdir SpawnPP under (faked) MOD_PERL');
 }
 
+my $rlimit_map = PublicInbox::Spawn->can('rlimit_map');
+diag $rlimit_map;
+if ($rlimit_map) {
+	my %rlim = $rlimit_map->();
+	diag explain(\%rlim);
+}
+
 done_testing();

^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2023-11-30 19:33 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-11-30 19:33 [PATCH] WIP-limiter-rlimit Eric Wong

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).