From 8e85257577ee4d7d49e59f048852d9d4ac6f8172 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Thu, 7 Jul 2016 01:39:36 +0000 Subject: inbox: cleanup and consolidate object weakening 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 | 16 ---------------- lib/PublicInbox/Inbox.pm | 37 +++++++++++++++++++++++++++++++++---- lib/PublicInbox/NNTP.pm | 17 ----------------- lib/PublicInbox/WWW.pm | 2 -- 4 files changed, 33 insertions(+), 39 deletions(-) (limited to 'lib') 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; -- cgit v1.2.3-24-ge0c7