Postfix OpenLDAP LMDB Howto


Postfix uses databases of various kinds to store and look up information. Postfix databases are specified as "type:name". OpenLDAP LMDB (called "LMDB" from here on) implements the Postfix database type "lmdb". The name of a Postfix LMDB database is the name of the database file without the ".lmdb" suffix.

This document describes:

Building Postfix with LMDB support

Postfix normally does not enable LMDB support. To build Postfix with LMDB support, use something like:

% make makefiles CCARGS="-DHAS_LMDB -I/usr/local/include" \
    AUXLIBS_LMDB="-L/usr/local/lib -llmdb"
% make

If your LMDB shared library is in a directory that the RUN-TIME linker does not know about, add a "-Wl,-R,/path/to/directory" option after "-llmdb".

Postfix versions before 3.0 use AUXLIBS instead of AUXLIBS_LMDB. With Postfix 3.0 and later, the old AUXLIBS variable still supports building a statically-loaded LMDB database client, but only the new AUXLIBS_LMDB variable supports building a dynamically-loaded or statically-loaded LMDB database client.

Failure to use the AUXLIBS_LMDB variable will defeat the purpose of dynamic database client loading. Every Postfix executable file will have LMDB database library dependencies. And that was exactly what dynamic database client loading was meant to avoid.

Solaris may need this:

% make makefiles CCARGS="-DHAS_LMDB -I/usr/local/include" \
    AUXLIBS_LMDB="-R/usr/local/lib -L/usr/local/lib -llmdb"
% make

The exact pathnames depend on how LMDB was installed.

When building Postfix fails with:

undefined reference to `pthread_mutexattr_destroy'
undefined reference to `pthread_mutexattr_init'
undefined reference to `pthread_mutex_lock'

Add the "-lpthread" library to the "make makefiles" command.

% make makefiles .... AUXLIBS_LMDB="... -lpthread"

Configuring LMDB settings

Postfix provides one configuration parameter that controls LMDB database behavior.

Using LMDB maps with non-Postfix programs

Programs that use LMDB's built-in locking protocol will corrupt a Postfix LMDB database or will read garbage.

Postfix does not use LMDB's built-in locking protocol, because that would require world-writable lockfiles, and would violate Postfix security policy. Instead, Postfix uses external locks based on fcntl(2) to prevent writers from corrupting the database, and to prevent readers from receiving garbage.

See lmdb_table(5) for a detailed description of the locking protocol that all programs must use when they access a Postfix LMDB database.

Required minimum LMDB patchlevel

Currently, Postfix requires LMDB 0.9.11 or later. The required minimum LMDB patchlevel has evolved over time, as the result of Postfix deployment experience: