From 5874d6355916e96a220e07bb229e090a92415afd Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 7 Jan 2017 01:44:47 +0000 Subject: inbox: describe the full key name Hopefully make this easier for future generations to understand. --- lib/PublicInbox/Inbox.pm | 1 + 1 file changed, 1 insertion(+) (limited to 'lib/PublicInbox/Inbox.pm') diff --git a/lib/PublicInbox/Inbox.pm b/lib/PublicInbox/Inbox.pm index 5503980f..008a6cf7 100644 --- a/lib/PublicInbox/Inbox.pm +++ b/lib/PublicInbox/Inbox.pm @@ -60,6 +60,7 @@ sub _set_limiter ($$$) { my ($self, $git, $pfx) = @_; my $lkey = "-${pfx}_limiter"; $git->{$lkey} = $self->{$lkey} ||= eval { + # full key is: publicinbox.$NAME.httpbackendmax my $mkey = $pfx.'max'; my $val = $self->{$mkey} or return; my $lim; -- cgit v1.2.3-24-ge0c7 From 37415497e02c3cacdd70060acddc2604342b66e5 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 7 Jan 2017 01:44:48 +0000 Subject: inbox: eliminate weaken usage entirely We can do a better job initializing the data structure so we no longer need to rely on weak references to cleanup when we ditch the config on reload. --- lib/PublicInbox/Inbox.pm | 69 ++++++++++++++++++++---------------------------- 1 file changed, 29 insertions(+), 40 deletions(-) (limited to 'lib/PublicInbox/Inbox.pm') diff --git a/lib/PublicInbox/Inbox.pm b/lib/PublicInbox/Inbox.pm index 008a6cf7..f77944f5 100644 --- a/lib/PublicInbox/Inbox.pm +++ b/lib/PublicInbox/Inbox.pm @@ -5,28 +5,27 @@ package PublicInbox::Inbox; use strict; use warnings; -use Scalar::Util qw(weaken isweak); use PublicInbox::Git; use PublicInbox::MID qw(mid2path); -my $weakt; +my $cleanup_timer; eval { - $weakt = 'disabled'; + $cleanup_timer = 'disabled'; require PublicInbox::EvCleanup; - $weakt = undef; # OK if we get here + $cleanup_timer = undef; # OK if we get here }; -my $WEAKEN = {}; # string(inbox) -> inbox -sub weaken_task () { - $weakt = undef; - _weaken_fields($_) for values %$WEAKEN; - $WEAKEN = {}; +my $CLEANUP = {}; # string(inbox) -> inbox +sub cleanup_task () { + $cleanup_timer = undef; + delete $_->{git} for values %$CLEANUP; + $CLEANUP = {}; } -sub _weaken_later ($) { +sub _cleanup_later ($) { my ($self) = @_; - $weakt ||= PublicInbox::EvCleanup::later(*weaken_task); - $WEAKEN->{"$self"} = $self; + $cleanup_timer ||= PublicInbox::EvCleanup::later(*cleanup_task); + $CLEANUP->{"$self"} = $self; } sub _set_uint ($$$) { @@ -39,27 +38,10 @@ sub _set_uint ($$$) { $opts->{$field} = $val || $default; } -sub new { - my ($class, $opts) = @_; - my $v = $opts->{address} ||= 'public-inbox@example.com'; - my $p = $opts->{-primary_address} = ref($v) eq 'ARRAY' ? $v->[0] : $v; - $opts->{domain} = ($p =~ /\@(\S+)\z/) ? $1 : 'localhost'; - _set_uint($opts, 'feedmax', 25); - weaken($opts->{-pi_config}); - bless $opts, $class; -} - -sub _weaken_fields { - my ($self) = @_; - foreach my $f (qw(git mm search)) { - isweak($self->{$f}) or weaken($self->{$f}); - } -} - sub _set_limiter ($$$) { - my ($self, $git, $pfx) = @_; + my ($self, $pi_config, $pfx) = @_; my $lkey = "-${pfx}_limiter"; - $git->{$lkey} = $self->{$lkey} ||= eval { + $self->{$lkey} ||= eval { # full key is: publicinbox.$NAME.httpbackendmax my $mkey = $pfx.'max'; my $val = $self->{$mkey} or return; @@ -68,7 +50,7 @@ sub _set_limiter ($$$) { require PublicInbox::Qspawn; $lim = PublicInbox::Qspawn::Limiter->new($val); } elsif ($val =~ /\A[a-z][a-z0-9]*\z/) { - $lim = $self->{-pi_config}->limiter($val); + $lim = $pi_config->limiter($val); warn "$mkey limiter=$val not found\n" if !$lim; } else { warn "$mkey limiter=$val not understood\n"; @@ -77,28 +59,35 @@ sub _set_limiter ($$$) { } } +sub new { + my ($class, $opts) = @_; + my $v = $opts->{address} ||= 'public-inbox@example.com'; + my $p = $opts->{-primary_address} = ref($v) eq 'ARRAY' ? $v->[0] : $v; + $opts->{domain} = ($p =~ /\@(\S+)\z/) ? $1 : 'localhost'; + my $pi_config = delete $opts->{-pi_config}; + _set_limiter($opts, $pi_config, 'httpbackend'); + _set_uint($opts, 'feedmax', 25); + $opts->{nntpserver} ||= $pi_config->{'publicinbox.nntpserver'}; + bless $opts, $class; +} + sub git { my ($self) = @_; $self->{git} ||= eval { - _weaken_later($self); my $g = PublicInbox::Git->new($self->{mainrepo}); - _set_limiter($self, $g, 'httpbackend'); + $g->{-httpbackend_limiter} = $self->{-httpbackend_limiter}; $g; }; } sub mm { my ($self) = @_; - $self->{mm} ||= eval { - _weaken_later($self); - PublicInbox::Msgmap->new($self->{mainrepo}); - }; + $self->{mm} ||= eval { PublicInbox::Msgmap->new($self->{mainrepo}) }; } sub search { my ($self) = @_; $self->{search} ||= eval { - _weaken_later($self); PublicInbox::Search->new($self->{mainrepo}, $self->{altid}); }; } @@ -164,7 +153,7 @@ sub nntp_url { $self->{-nntp_url} ||= do { # no checking for nntp_usable here, we can point entirely # to non-local servers or users run by a different user - my $ns = $self->{-pi_config}->{'publicinbox.nntpserver'}; + my $ns = $self->{nntpserver}; my $group = $self->{newsgroup}; my @urls; if ($ns && $group) { -- cgit v1.2.3-24-ge0c7 From 492910d43c179a7e1919b2d0f417aea9473f9730 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 7 Jan 2017 01:44:51 +0000 Subject: searchmsg: favor direct hash access over accessor methods This is faster, smaller, and more straighforward to me with fewer layers of indirection. --- lib/PublicInbox/Inbox.pm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'lib/PublicInbox/Inbox.pm') diff --git a/lib/PublicInbox/Inbox.pm b/lib/PublicInbox/Inbox.pm index f77944f5..aa4e141f 100644 --- a/lib/PublicInbox/Inbox.pm +++ b/lib/PublicInbox/Inbox.pm @@ -216,7 +216,8 @@ sub msg_by_smsg ($$;$) { # backwards compat to fallback to msg_by_mid # TODO: remove if we bump SCHEMA_VERSION in Search.pm: - defined(my $blob = $smsg->blob) or return msg_by_mid($self, $smsg->mid); + defined(my $blob = $smsg->{blob}) or + return msg_by_mid($self, $smsg->mid); my $str = git($self)->cat_file($blob, $ref); $$str =~ s/\A[\r\n]*From [^\r\n]*\r?\n//s if $str; -- cgit v1.2.3-24-ge0c7 From f1a38b18d9a46531e18143a7cd4c7a66fc89adbc Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 7 Jan 2017 02:10:23 +0000 Subject: inbox: properly register cleanup timer for git processes We still need to cleanup git processes occasionally, since "git cat-file --batch" does not release old packs (and git processes are fairly expensive). For SQLite and Xapian file handles, they should be capable of managing themselves without too much trouble, so lets try keeping them for the lifetime of a process. --- lib/PublicInbox/Inbox.pm | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) (limited to 'lib/PublicInbox/Inbox.pm') diff --git a/lib/PublicInbox/Inbox.pm b/lib/PublicInbox/Inbox.pm index aa4e141f..51ada0bc 100644 --- a/lib/PublicInbox/Inbox.pm +++ b/lib/PublicInbox/Inbox.pm @@ -22,12 +22,6 @@ sub cleanup_task () { $CLEANUP = {}; } -sub _cleanup_later ($) { - my ($self) = @_; - $cleanup_timer ||= PublicInbox::EvCleanup::later(*cleanup_task); - $CLEANUP->{"$self"} = $self; -} - sub _set_uint ($$$) { my ($opts, $field, $default) = @_; my $val = $opts->{$field}; @@ -76,6 +70,8 @@ sub git { $self->{git} ||= eval { my $g = PublicInbox::Git->new($self->{mainrepo}); $g->{-httpbackend_limiter} = $self->{-httpbackend_limiter}; + $cleanup_timer ||= PublicInbox::EvCleanup::later(*cleanup_task); + $CLEANUP->{"$self"} = $self; $g; }; } -- cgit v1.2.3-24-ge0c7