about summary refs log tree commit homepage
diff options
context:
space:
mode:
-rw-r--r--lib/PublicInbox/HTTP.pm16
-rw-r--r--lib/PublicInbox/Inbox.pm37
-rw-r--r--lib/PublicInbox/NNTP.pm17
-rw-r--r--lib/PublicInbox/WWW.pm2
4 files changed, 33 insertions, 39 deletions
diff --git a/lib/PublicInbox/HTTP.pm b/lib/PublicInbox/HTTP.pm
index e19c592c..abf648f9 100644
--- a/lib/PublicInbox/HTTP.pm
+++ b/lib/PublicInbox/HTTP.pm
@@ -25,15 +25,6 @@ use constant {
         CHUNK_MAX_HDR => 256,
 };
 
-# FIXME: duplicated code with NNTP.pm, layering violation
-my $WEAKEN = {}; # string(inbox) -> inbox
-my $weakt;
-sub weaken_task () {
-        $weakt = undef;
-        $_->weaken_all for values %$WEAKEN;
-        $WEAKEN = {};
-}
-
 my $pipelineq = [];
 my $pipet;
 sub process_pipelineq () {
@@ -252,13 +243,6 @@ sub response_done ($$) {
         $self->{env} = undef;
         $self->write("0\r\n\r\n") if $alive == 2;
         $self->write(sub { $alive ? next_request($self) : $self->close });
-
-        # FIXME: layering violation
-        if (my $obj = $env->{'pi-httpd.inbox'}) {
-                # grace period for reaping resources
-                $WEAKEN->{"$obj"} = $obj;
-                PublicInbox::EvCleanup::later(*weaken_task);
-        }
 }
 
 sub getline_response {
diff --git a/lib/PublicInbox/Inbox.pm b/lib/PublicInbox/Inbox.pm
index 728caa0c..dc9980b7 100644
--- a/lib/PublicInbox/Inbox.pm
+++ b/lib/PublicInbox/Inbox.pm
@@ -9,6 +9,26 @@ use Scalar::Util qw(weaken isweak);
 use PublicInbox::Git;
 use PublicInbox::MID qw(mid2path);
 
+my $weakt;
+eval {
+        $weakt = 'disabled';
+        require PublicInbox::EvCleanup;
+        $weakt = undef; # OK if we get here
+};
+
+my $WEAKEN = {}; # string(inbox) -> inbox
+sub weaken_task () {
+        $weakt = undef;
+        _weaken_fields($_) for values %$WEAKEN;
+        $WEAKEN = {};
+}
+
+sub _weaken_later ($) {
+        my ($self) = @_;
+        $weakt ||= PublicInbox::EvCleanup::later(*weaken_task);
+        $WEAKEN->{"$self"} = $self;
+}
+
 sub new {
         my ($class, $opts) = @_;
         my $v = $opts->{address} ||= 'public-inbox@example.com';
@@ -17,7 +37,7 @@ sub new {
         bless $opts, $class;
 }
 
-sub weaken_all {
+sub _weaken_fields {
         my ($self) = @_;
         foreach my $f (qw(git mm search)) {
                 isweak($self->{$f}) or weaken($self->{$f});
@@ -26,17 +46,26 @@ sub weaken_all {
 
 sub git {
         my ($self) = @_;
-        $self->{git} ||= eval { PublicInbox::Git->new($self->{mainrepo}) };
+        $self->{git} ||= eval {
+                _weaken_later($self);
+                PublicInbox::Git->new($self->{mainrepo});
+        };
 }
 
 sub mm {
         my ($self) = @_;
-        $self->{mm} ||= eval { PublicInbox::Msgmap->new($self->{mainrepo}) };
+        $self->{mm} ||= eval {
+                _weaken_later($self);
+                PublicInbox::Msgmap->new($self->{mainrepo});
+        };
 }
 
 sub search {
         my ($self) = @_;
-        $self->{search} ||= eval { PublicInbox::Search->new($self->{mainrepo}) };
+        $self->{search} ||= eval {
+                _weaken_later($self);
+                PublicInbox::Search->new($self->{mainrepo});
+        };
 }
 
 sub try_cat {
diff --git a/lib/PublicInbox/NNTP.pm b/lib/PublicInbox/NNTP.pm
index 56d08385..0b30d43a 100644
--- a/lib/PublicInbox/NNTP.pm
+++ b/lib/PublicInbox/NNTP.pm
@@ -38,8 +38,6 @@ my %DISABLED; # = map { $_ => 1 } qw(xover list_overview_fmt newnews xhdr);
 my $EXPMAP; # fd -> [ idle_time, $self ]
 my $expt;
 our $EXPTIME = 180; # 3 minutes
-my $WEAKEN = {}; # string(nntpd) -> nntpd
-my $weakt;
 my $nextt;
 
 my $nextq = [];
@@ -64,16 +62,6 @@ sub update_idle_time ($) {
         defined $fd and $EXPMAP->{$fd} = [ now(), $self ];
 }
 
-# reduce FD pressure by closing some "git cat-file --batch" processes
-# and unused FDs for msgmap and Xapian indices
-sub weaken_groups () {
-        $weakt = undef;
-        foreach my $nntpd (values %$WEAKEN) {
-                $_->weaken_all foreach (@{$nntpd->{grouplist}});
-        }
-        $WEAKEN = {};
-}
-
 sub expire_old () {
         my $now = now();
         my $exp = $EXPTIME;
@@ -92,15 +80,11 @@ sub expire_old () {
         $EXPMAP = \%new;
         if ($nr) {
                 $expt = PublicInbox::EvCleanup::later(*expire_old);
-                weaken_groups();
         } else {
                 $expt = undef;
                 # noop to kick outselves out of the loop ASAP so descriptors
                 # really get closed
                 PublicInbox::EvCleanup::asap(sub {});
-
-                # grace period for reaping resources
-                $weakt ||= PublicInbox::EvCleanup::later(*weaken_groups);
         }
 }
 
@@ -113,7 +97,6 @@ sub new ($$$) {
         $self->{rbuf} = '';
         $self->watch_read(1);
         update_idle_time($self);
-        $WEAKEN->{"$nntpd"} = $nntpd;
         $expt ||= PublicInbox::EvCleanup::later(*expire_old);
         $self;
 }
diff --git a/lib/PublicInbox/WWW.pm b/lib/PublicInbox/WWW.pm
index 54253086..5de5ffee 100644
--- a/lib/PublicInbox/WWW.pm
+++ b/lib/PublicInbox/WWW.pm
@@ -148,8 +148,6 @@ sub invalid_inbox {
         if (defined $obj) {
                 $ctx->{git_dir} = $obj->{mainrepo};
                 $ctx->{git} = $obj->git;
-                # for PublicInbox::HTTP::weaken_task:
-                $ctx->{env}->{'pi-httpd.inbox'} = $obj;
                 $ctx->{-inbox} = $obj;
                 $ctx->{inbox} = $inbox;
                 return;