]> Sergey Matveev's repositories - public-inbox.git/commitdiff
inbox: cleanup and consolidate object weakening
authorEric Wong <e@80x24.org>
Thu, 7 Jul 2016 01:39:36 +0000 (01:39 +0000)
committerEric Wong <e@80x24.org>
Thu, 7 Jul 2016 01:41:03 +0000 (01:41 +0000)
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.

lib/PublicInbox/HTTP.pm
lib/PublicInbox/Inbox.pm
lib/PublicInbox/NNTP.pm
lib/PublicInbox/WWW.pm

index e19c592c99612ae29960676e5112166d5f5642eb..abf648f923179be7e6de904f7899f7ad2a003391 100644 (file)
@@ -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 {
index 728caa0c3f9e059da3a42ecf4019fbb8b66c881c..dc9980b77c62b0db75b09b58897c40a17f1e0e16 100644 (file)
@@ -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 {
index 56d08385da0f6a4b924e07ffb01662ad288f0715..0b30d43a174562328df2a78d767c6c3d6b18f0d1 100644 (file)
@@ -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;
 }
index 542530862600bd59a911228f2c73cbbc01558a54..5de5ffee1467857c2c020b955c4b3b79d030cc31 100644 (file)
@@ -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;