From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.0 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 3C0C220710 for ; Thu, 7 Jul 2016 01:50:21 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 3/4] inbox: cleanup and consolidate object weakening Date: Thu, 7 Jul 2016 01:50:18 +0000 Message-Id: <20160707015019.16974-4-e@80x24.org> In-Reply-To: <20160707015019.16974-1-e@80x24.org> References: <20160707015019.16974-1-e@80x24.org> List-Id: 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(-) diff --git a/lib/PublicInbox/HTTP.pm b/lib/PublicInbox/HTTP.pm index e19c592..abf648f 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 728caa0..dc9980b 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 56d0838..0b30d43 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 5425308..5de5ffe 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; -- EW