[Date Prev][Date Next]
[Chronological]
[Thread]
[Top]
Re: (ITS#7774) LMDB assertion failure during Postfix cache cleanup
Hallvard Breien Furuseth:
> Wietse Venema writes:
> > (...) what happens when the two above activities happen
> > in different processes? That is, process A (opens the database with
> > MDB_NOLOCK. opens a cursor, and walks the database without making
> > any changes to it), while process B opens the same database with
> > MDB_NOLOCK and performs the delete transactions.
> >
> > Will the process A cursor read transaction trigger an assertion due
> > to the process B delete transactions? If not, why not?
>
> Process A may see garbage data. This can result in an assert(), a
> segfault or other misbehavior. Just like if you had process A == B.
> With MDB_NOLOCK, after a write transaction commits you need to
> end existing read-only transactions before starting a new writer.
> (Well, it's a bit looser than that, but that's a simple rule.)
Thanks for confirming my suspicion. I think that the correct option
then is to use only short-lived cursor read transactions within
fcntl()-protected blocks and to save/restore the previous cursor
key where applicable.
Wietse