From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: 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.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id EF5EA1FC0B for ; Fri, 27 Nov 2020 09:52:54 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 02/12] nntpd: share {groups} hash with {-by_newsgroup} in Config Date: Fri, 27 Nov 2020 09:52:44 +0000 Message-Id: <20201127095254.21624-3-e@80x24.org> In-Reply-To: <20201127095254.21624-1-e@80x24.org> References: <20201127095254.21624-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: There's no need to duplicate a potentially large hash, but we can keep the inexpensive shortcut to it. We may eventually drop the {groups} shortcut if it's no longer useful. --- lib/PublicInbox/Config.pm | 4 +++- lib/PublicInbox/NNTPD.pm | 23 +++++++++++------------ 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/lib/PublicInbox/Config.pm b/lib/PublicInbox/Config.pm index 251008a3..e7aea99b 100644 --- a/lib/PublicInbox/Config.pm +++ b/lib/PublicInbox/Config.pm @@ -438,7 +438,9 @@ EOF } } if (my $ng = $ibx->{newsgroup}) { - $self->{-by_newsgroup}->{$ng} = $ibx; + # PublicInbox::NNTPD does stricter (and more expensive checks), + # keep this lean for startup speed + $self->{-by_newsgroup}->{$ng} = $ibx unless ref($ng); } $self->{-by_name}->{$name} = $ibx; if ($ibx->{obfuscate}) { diff --git a/lib/PublicInbox/NNTPD.pm b/lib/PublicInbox/NNTPD.pm index 6b762d89..13b0f678 100644 --- a/lib/PublicInbox/NNTPD.pm +++ b/lib/PublicInbox/NNTPD.pm @@ -36,11 +36,10 @@ sub new { sub refresh_groups { my ($self, $sig) = @_; my $pi_config = $sig ? PublicInbox::Config->new : $self->{pi_config}; - my $new = {}; - my @list; + my $groups = $pi_config->{-by_newsgroup}; # filled during each_inbox $pi_config->each_inbox(sub { - my ($ng) = @_; - my $ngname = $ng->{newsgroup} or return; + my ($ibx) = @_; + my $ngname = $ibx->{newsgroup} or return; if (ref $ngname) { warn 'multiple newsgroups not supported: '. join(', ', @$ngname). "\n"; @@ -50,21 +49,21 @@ sub refresh_groups { # '|', '<', '>', ';', '#', '$', '&', } elsif ($ngname =~ m![^A-Za-z0-9/_\.\-\~\@\+\=:]!) { warn "newsgroup name invalid: `$ngname'\n"; - } elsif ($ng->nntp_usable) { + delete $groups->{$ngname}; + } elsif ($ibx->nntp_usable) { # Only valid if msgmap and search works - $new->{$ngname} = $ng; - push @list, $ng; # preload to avoid fragmentation: - $ng->description; - $ng->base_url; + $ibx->description; + $ibx->base_url; + } else { + delete $groups->{$ngname}; } }); - @list = sort { $a->{newsgroup} cmp $b->{newsgroup} } @list; - $self->{grouplist} = \@list; + $self->{grouplist} = [ map { $groups->{$_} } sort(keys %$groups) ]; $self->{pi_config} = $pi_config; # this will destroy old groups that got deleted - %{$self->{groups}} = %$new; + $self->{groups} = $groups; } sub idler_start {