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