about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2016-07-07 01:39:36 +0000
committerEric Wong <e@80x24.org>2016-07-07 01:41:03 +0000
commit8e85257577ee4d7d49e59f048852d9d4ac6f8172 (patch)
tree83b62c2c283df344a6884cc45a5e16aad5c2196b /lib
parent0cdb0320181606c9b663aa8e37d69a79bff6f3a1 (diff)
downloadpublic-inbox-8e85257577ee4d7d49e59f048852d9d4ac6f8172.tar.gz
This fixes some layering violations and consolidates
the cleanup into the inbox object itself.  Keeping in
mind weakening does not work at all without our PSGI
server.
Diffstat (limited to 'lib')
-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;