DatabaseModifiedError, how to handle it correctly when searching?
Yuan Fu
casouri at gmail.com
Tue Aug 31 04:31:19 BST 2021
> On Aug 30, 2021, at 7:15 PM, Olly Betts <olly at survex.com> wrote:
>
> On Mon, Aug 30, 2021 at 06:50:48PM -0700, Yuan Fu wrote:
>> int try_count = 0;
>> while (true)
>> {
>> try
>> {
>> (do stuff)
>> break;
>> }
>> catch (Xapian::DatabaseModifiedError &e)
>> {
>> if (try_count > 0) throw e;
>> database.reopen();
>> try_count++;
>> }
>> }
>
> You should never get DatabaseModifiedError for a database you have a
> write lock on - i.e. a WritableDatabase (because what
> DatabaseModifiedError means is that a writer has committed modifications
> to the database underneath you in such a way that the operation you
> asked for can't be performed, and Xapian doesn't support concurrent
> writers so if you are the current writer this can't happen).
>
> Also, note that if the writer is making a series of small commits in
> quick succession you could need to retry more than once.
>
> It also often makes sense to retry a group of operations - e.g. if you
> perform a search and hit DatabaseModifiedError reading the documents
> in the results, you probably want to retry the search starting from
> get_mset() (even though that part worked) so that your results are from
> a consistent database state (this is the main reason that there isn't an
> auto-retry in this situation). DatabaseModifiedError should be a rare
> occurrence so redoing extra in response to it shouldn't be costly.
>
> There is a longer term plan to allow databases to keep old revisions
> which readers are using around, which will eventually provide a way to
> prevent this exception.
Thanks, that’s very helpful!
Yuan
More information about the Xapian-discuss
mailing list