[Date Prev][Date Next] [Chronological] [Thread] [Top]

Re: (ITS#7774) LMDB assertion failure during Postfix cache cleanup



Hallvard Breien Furuseth:
> On 2014-01-08 18:23, Howard Chu wrote:
> > Wietse Venema wrote:
> >> Hallvard Breien Furuseth:
> >>> Process A may see garbage data.
> > 
> > This is wrong. The fcntl locks will definitely prevent two processes
> > from interfering with each other. The reason this bug occurs is
> > because fcntl locks cannot prevent two transactions within a single
> > process from stomping on each other.
> 
> Hmm. OK, after some discussion with Howard:
> 
> This was so with Howard's original code, it wrapped each mdb_get() in
> a transaction.  postfix-2.11-20131228/src/util/slmdb.c breaks this by
> preserving the read transaction until an error happens which is bad
> enough for the code to notice.

The Postfix first/next iterator has always used a long-term read
transaction, ever since the first LMDB patch for Postfix. This broke
with the switch to MDB_NOLOCK.

> Locks around cursors are pointless as well as insufficient from
> lmdb's point of view.  It is transactions which must be protected.

With MDB_NOLOCK the cursor's read transaction must be protected,
and it must be closed before returning the (key, value) to the
caller.

	Wietse