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-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.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 55E601F9F3 for ; Sat, 25 Sep 2021 22:16:46 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 2/2] search: avoid setting undef hashtable entries Date: Sat, 25 Sep 2021 22:16:45 +0000 Message-Id: <20210925221645.13443-3-e@80x24.org> In-Reply-To: <20210925221645.13443-1-e@80x24.org> References: <20210925221645.13443-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: `undef' entries still take up a slot in the hash table, and cause the `exists' check to false-positive in ->cleanup_shards. This should fully fix the (innocuous) messages introduced in commit 63d7b8ce (daemons: revamp periodic cleanup task, 2021-09-23) --- lib/PublicInbox/AdminEdit.pm | 5 +++-- lib/PublicInbox/Inbox.pm | 15 +++++++-------- lib/PublicInbox/Search.pm | 12 ++++++------ 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/lib/PublicInbox/AdminEdit.pm b/lib/PublicInbox/AdminEdit.pm index 2f6707d8..c8c3d3e8 100644 --- a/lib/PublicInbox/AdminEdit.pm +++ b/lib/PublicInbox/AdminEdit.pm @@ -27,8 +27,9 @@ sub check_editable ($) { # Make sure it's purged in that case: $ibx->over or die "no over.sqlite3 in $ibx->{inboxdir}\n"; - # $ibx->{search} is populated by $ibx->over call - my $xdir_ro = $ibx->{search}->xdir(1); + require PublicInbox::Search; + my $xdir_ro = PublicInbox::Search->new($ibx)->xdir(1); + my $nshard = 0; foreach my $shard (<$xdir_ro/*>) { if (-d $shard && $shard =~ m!/[0-9]+\z!) { diff --git a/lib/PublicInbox/Inbox.pm b/lib/PublicInbox/Inbox.pm index c0962af9..3ba92c99 100644 --- a/lib/PublicInbox/Inbox.pm +++ b/lib/PublicInbox/Inbox.pm @@ -167,12 +167,12 @@ sub mm { sub search { my ($self) = @_; - my $srch = $self->{search} //= eval { + $self->{search} // eval { _cleanup_later($self); require PublicInbox::Search; - PublicInbox::Search->new($self); + my $srch = PublicInbox::Search->new($self); + (eval { $srch->xdb }) ? ($self->{search} = $srch) : undef; }; - (eval { $srch->xdb }) ? $srch : undef; } # isrch is preferred for read-only interfaces if available since it @@ -181,15 +181,14 @@ sub isrch { $_[0]->{isrch} // search($_[0]) } sub over { my ($self, $req) = @_; - $self->{over} //= eval { - my $srch = $self->{search} //= do { - _cleanup_later($self); + $self->{over} // eval { + my $srch = $self->{search} // do { require PublicInbox::Search; PublicInbox::Search->new($self); }; my $over = PublicInbox::Over->new("$srch->{xpfx}/over.sqlite3"); $over->dbh; # may fail - $over; + $self->{over} = $over; } // ($req ? croak("E: $@") : undef); } @@ -293,7 +292,7 @@ sub imap_url { $_[0]->{-imap_url} //= _x_url($_[0], 'imap', $_[1]) } sub nntp_usable { my ($self) = @_; my $ret = mm($self) && over($self); - $self->{mm} = $self->{over} = $self->{search} = undef; + delete @$self{qw(mm over search)}; $ret; } diff --git a/lib/PublicInbox/Search.pm b/lib/PublicInbox/Search.pm index d285c11c..17e202e1 100644 --- a/lib/PublicInbox/Search.pm +++ b/lib/PublicInbox/Search.pm @@ -234,12 +234,12 @@ sub mset_to_artnums { sub xdb ($) { my ($self) = @_; - $self->{xdb} //= do { + $self->{xdb} // do { my @xdb = $self->xdb_shards_flat or return; $self->{nshard} = scalar(@xdb); my $xdb = shift @xdb; $xdb->add_database($_) for @xdb; - $xdb; + $self->{xdb} = $xdb; }; } @@ -261,10 +261,10 @@ sub new { my ($class, $ibx) = @_; ref $ibx or die "BUG: expected PublicInbox::Inbox object: $ibx"; my $xap = $ibx->version > 1 ? 'xap' : 'public-inbox/xapian'; - bless { - xpfx => "$ibx->{inboxdir}/$xap" . SCHEMA_VERSION, - altid => $ibx->{altid}, - }, $class; + my $xpfx = "$ibx->{inboxdir}/$xap".SCHEMA_VERSION; + my $self = bless { xpfx => $xpfx }, $class; + $self->{altid} = $ibx->{altid} if defined($ibx->{altid}); + $self; } sub reopen {