about summary refs log tree commit homepage
path: root/lib/PublicInbox
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2020-11-27 09:52:44 +0000
committerEric Wong <e@80x24.org>2020-11-28 04:53:12 +0000
commitfb7d0067dc55fa8336dab96c07807fc7b28a1b20 (patch)
tree5689c92894a93a385a49abd898ea2c08197a6f58 /lib/PublicInbox
parent98ff501233ee371c98519bf96394ef8085c3b076 (diff)
downloadpublic-inbox-fb7d0067dc55fa8336dab96c07807fc7b28a1b20.tar.gz
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.
Diffstat (limited to 'lib/PublicInbox')
-rw-r--r--lib/PublicInbox/Config.pm4
-rw-r--r--lib/PublicInbox/NNTPD.pm23
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 {