about summary refs log tree commit homepage
path: root/lib/PublicInbox/Search.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2021-09-23 00:46:25 +0000
committerEric Wong <e@80x24.org>2021-09-23 04:52:09 +0000
commit63d7b8ceee55a34cde983e8548d5ce61050d2891 (patch)
treeb893451f9164ce2c7c8f48664ca00865427e24c7 /lib/PublicInbox/Search.pm
parent356439a571c536eaa487031802b436d087113f4f (diff)
downloadpublic-inbox-63d7b8ceee55a34cde983e8548d5ce61050d2891.tar.gz
Neither Inboxes nor ExtSearch objects were retrying correctly
when there are live git processes, but the inboxes were getting
rescanned for search or other reasons.  Ensure the scan retries
eventually if there's live processes.

We also need to update the cleanup task to detect Xapian shard
count changes, since Xapian ->reopen is enough to detect any
other Xapian changes.  Otherwise, we just issue an inexpensive
->reopen call and let Xapian check whether there's anything
worth reopening.

This also lets us eliminate the Devel::Peek dependency.
Diffstat (limited to 'lib/PublicInbox/Search.pm')
-rw-r--r--lib/PublicInbox/Search.pm16
1 files changed, 15 insertions, 1 deletions
diff --git a/lib/PublicInbox/Search.pm b/lib/PublicInbox/Search.pm
index 1d1cd2f5..d285c11c 100644
--- a/lib/PublicInbox/Search.pm
+++ b/lib/PublicInbox/Search.pm
@@ -199,7 +199,7 @@ sub xdb_shards_flat ($) {
         my (@xdb, $slow_phrase);
         load_xapian();
         $self->{qp_flags} //= $QP_FLAGS;
-        if ($xpfx =~ m/xapian${\SCHEMA_VERSION}\z/) {
+        if ($xpfx =~ m!/xapian[0-9]+\z!) {
                 @xdb = ($X{Database}->new($xpfx));
                 $self->{qp_flags} |= FLAG_PHRASE() if !-f "$xpfx/iamchert";
         } else {
@@ -243,6 +243,20 @@ sub xdb ($) {
         };
 }
 
+# returns true if a future rescan is desired
+sub cleanup_shards {
+        my ($self) = @_;
+        return unless exists($self->{xdb});
+        my $xpfx = $self->{xpfx};
+        return reopen($self) if $xpfx =~ m!/xapian[0-9]+\z!; # true
+        opendir(my $dh, $xpfx) or return warn("$xpfx gone: $!\n"); # true
+        my $nr = grep(/\A[0-9]+\z/, readdir($dh)) or
+                return warn("$xpfx has no shards\n"); # true
+        return reopen($self) if $nr == ($self->{nshard} // -1);
+        delete($self->{xdb});
+        undef;
+}
+
 sub new {
         my ($class, $ibx) = @_;
         ref $ibx or die "BUG: expected PublicInbox::Inbox object: $ibx";