# Postfix OpenLDAP LMDB Howto

## Introduction

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.

- Configuring LMDB settings.

- Supported minimum LMDB patchlevel.

## 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="-L/usr/local/lib -llmdb"
>     % make

Solaris may need this:

>     % make makefiles CCARGS="-DHAS_LMDB -I/usr/local/include" \
>         AUXLIBS="-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="... -lpthread"

## Configuring LMDB settings

Postfix provides one configuration parameter that controls LMDB database behavior.

- lmdb_map_size (default: 16777216). This setting specifies the initial LMDB database size limit in bytes. Each time a database becomes full, its size limit is doubled. The maximum size is the largest signed integer value of "long".

## Supported minimum LMDB patchlevel

Currently, Postfix supports LMDB 0.9.11 or later. The supported minimum LMDB patchlevel has evolved over time, as the result of deployment experience with Postfix.

- LMDB 0.9.11 allows Postfix daemons to log an LMDB error message, instead of falling out of the sky without any notification.

- LMDB 0.9.10 closes an information leak where LMDB was writing up to 4kbyte-chunks of uninitialized heap memory to the database, persisting information that was not meant to be persisted, or sharing information that was not meant to be shared.

- LMDB 0.9.8 allows Postfix to use external (fcntl()-based) locks, instead of having to use world-writable LMDB lock files.

- LMDB 0.9.8 allows an application to recover from a "database full" error without having to close the database, by adding support to update the database size limit on-the-fly; and it adds support for an application to adopt someone elses change to the database size limit, without having to close the database.

- LMDB 0.9.7 allows the postmap and postalias commands to use a bulk-mode transaction larger than the amount of physical memory. This is necessary because LMDB supports databases larger than physical memory.