]> Sergey Matveev's repositories - public-inbox.git/commitdiff
v2writable: reuse read-only shard counting code
authorEric Wong <e@80x24.org>
Wed, 2 Sep 2020 11:04:21 +0000 (11:04 +0000)
committerEric Wong <e@80x24.org>
Thu, 3 Sep 2020 20:11:03 +0000 (20:11 +0000)
We'll also fix the read-only code to ensure we notice missing
Xapian shards, since gaps would throw off our expectation that
Xapian document IDs and NNTP article numbers are interchangeable.

lib/PublicInbox/Search.pm
lib/PublicInbox/V2Writable.pm

index b07f4ea6a7285315482ac79ec6a9d1de8f0bf8f3..fb35b74752c88531fe3ad0c2c8774dcf598d1b38 100644 (file)
@@ -7,6 +7,7 @@ package PublicInbox::Search;
 use strict;
 use parent qw(Exporter);
 our @EXPORT_OK = qw(mdocid);
+use List::Util qw(max);
 
 # values for searching, changing the numeric value breaks
 # compatibility with old indices (so don't change them it)
@@ -203,7 +204,9 @@ sub _xdb ($) {
 
                # We need numeric sorting so shard[0] is first for reading
                # Xapian metadata, if needed
-               for (sort { $a <=> $b } grep(/\A[0-9]+\z/, readdir($dh))) {
+               my $last = max(grep(/\A[0-9]+\z/, readdir($dh)));
+               return if !defined($last);
+               for (0..$last) {
                        my $shard_dir = "$dir/$_";
                        if (-d $shard_dir && -r _) {
                                push @xdb, $X{Database}->new($shard_dir);
index c8334645d3cbcff5bf0b290bda75db7bd8113022..a1f6048f3b27113b697baa1c48c41c8e4334bc10 100644 (file)
@@ -65,28 +65,11 @@ sub nproc_shards ($) {
 
 sub count_shards ($) {
        my ($self) = @_;
-       my $n = 0;
-       my $xpfx = $self->{xpfx};
-
        # always load existing shards in case core count changes:
        # Also, shard count may change while -watch is running
-       # due to "xcpdb --reshard"
-       if (-d $xpfx) {
-               my $XapianDatabase;
-               foreach my $shard (<$xpfx/*>) {
-                       -d $shard && $shard =~ m!/[0-9]+\z! or next;
-                       $XapianDatabase //= do {
-                               require PublicInbox::Search;
-                               PublicInbox::Search::load_xapian();
-                               $PublicInbox::Search::X{Database};
-                       };
-                       eval {
-                               $XapianDatabase->new($shard)->close;
-                               $n++;
-                       };
-               }
-       }
-       $n;
+       my $srch = $self->{ibx}->search or return 0;
+       delete $self->{ibx}->{search};
+       $srch->{nshard} // 0
 }
 
 sub new {