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.pm15
1 files changed, 10 insertions, 5 deletions
diff --git a/lib/PublicInbox/Search.pm b/lib/PublicInbox/Search.pm
index 5e6bfc68..24cb2667 100644
--- a/lib/PublicInbox/Search.pm
+++ b/lib/PublicInbox/Search.pm
@@ -166,22 +166,27 @@ sub get_thread {
         _do_enquire($self, $qtid, $opts);
 }
 
-sub _do_enquire {
-        my ($self, $query, $opts) = @_;
+sub retry_reopen {
+        my ($self, $cb) = @_;
         my $ret;
         for (1..10) {
-                eval { $ret = _enquire_once($self, $query, $opts) };
+                eval { $ret = $cb->() };
                 return $ret unless $@;
                 # Exception: The revision being read has been discarded -
                 # you should call Xapian::Database::reopen()
-                if (index($@, 'Xapian::Database::reopen') >= 0) {
+                if (ref($@) eq 'Search::Xapian::DatabaseModifiedError') {
                         reopen($self);
                 } else {
-                        die $@;
+                        die;
                 }
         }
 }
 
+sub _do_enquire {
+        my ($self, $query, $opts) = @_;
+        retry_reopen($self, sub { _enquire_once($self, $query, $opts) });
+}
+
 sub _enquire_once {
         my ($self, $query, $opts) = @_;
         my $enquire = $self->enquire;