diff options
author | Eric Wong <e@80x24.org> | 2023-08-31 08:38:57 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2023-09-01 06:04:14 +0000 |
commit | 36c0c299ee9a8bb9cd6a64c516e395e6f2ebe478 (patch) | |
tree | 14f34be13d954933a32f95f6db4838ddcd2f736c | |
parent | afc61ae0464000121f67414777f1feccfcce6d13 (diff) | |
download | public-inbox-36c0c299ee9a8bb9cd6a64c516e395e6f2ebe478.tar.gz |
It's possible for a long mset streaming operation to hit missing documents after a database reopen if deletes hit the DB.
-rw-r--r-- | lib/PublicInbox/XapHelper.pm | 12 | ||||
-rw-r--r-- | lib/PublicInbox/xap_helper.h | 4 |
2 files changed, 13 insertions, 3 deletions
diff --git a/lib/PublicInbox/XapHelper.pm b/lib/PublicInbox/XapHelper.pm index ef6a47a3..36266e65 100644 --- a/lib/PublicInbox/XapHelper.pm +++ b/lib/PublicInbox/XapHelper.pm @@ -37,9 +37,15 @@ sub cmd_test_inspect { } sub iter_retry_check ($) { - die unless ref($@) =~ /\bDatabaseModifiedError\b/; - $_[0]->{srch}->reopen; - undef; # retries + if (ref($@) =~ /\bDatabaseModifiedError\b/) { + $_[0]->{srch}->reopen; + undef; # retries + } elsif (ref($@) =~ /\bDocNotFoundError\b/) { + warn "doc not found: $@"; + 0; # continue to next doc + } else { + die; + } } sub dump_ibx_iter ($$$) { diff --git a/lib/PublicInbox/xap_helper.h b/lib/PublicInbox/xap_helper.h index 17085adc..871a381c 100644 --- a/lib/PublicInbox/xap_helper.h +++ b/lib/PublicInbox/xap_helper.h @@ -256,6 +256,8 @@ static enum exc_iter dump_ibx_iter(struct req *req, const char *ibx_id, } catch (const Xapian::DatabaseModifiedError & e) { req->srch->db->reopen(); return ITER_RETRY; + } catch (const Xapian::DocNotFoundError & e) { // oh well... + warnx("doc not found: %s", e.get_description().c_str()); } return ITER_OK; } @@ -456,6 +458,8 @@ static enum exc_iter dump_roots_iter(struct req *req, } catch (const Xapian::DatabaseModifiedError & e) { req->srch->db->reopen(); return ITER_RETRY; + } catch (const Xapian::DocNotFoundError & e) { // oh well... + warnx("doc not found: %s", e.get_description().c_str()); } return ITER_OK; } |