diff options
Diffstat (limited to 'lib/PublicInbox/Search.pm')
-rw-r--r-- | lib/PublicInbox/Search.pm | 15 |
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; |