about summary refs log tree commit homepage
path: root/lib/PublicInbox/Search.pm
diff options
context:
space:
mode:
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";