diff --git a/postfix/HISTORY b/postfix/HISTORY index 6a75cbb04..c01254ea9 100644 --- a/postfix/HISTORY +++ b/postfix/HISTORY @@ -18288,3 +18288,13 @@ Apologies for any names omitted. 20130318 Portability: botched #ifdef. File: util/dict_lmdb.c. + +20130319 + + Postfix support for LMDB databases is withdrawn due to the + existence of a hard limit (an "out of storage" failure mode + that cannot be resolved by increasing the database size). + + Postfix may support LMDB again when without exceptions all + "out of storage" failure modes are resolved by increasing + the database size. diff --git a/postfix/README_FILES/DATABASE_README b/postfix/README_FILES/DATABASE_README index ceb661b7d..a9fe9b06a 100644 --- a/postfix/README_FILES/DATABASE_README +++ b/postfix/README_FILES/DATABASE_README @@ -210,12 +210,11 @@ To find out what database types your Postfix system supports, use the "ppooss iinntteerrnnaall A non-shared, in-memory hash table. Its content are lost when a process terminates. - llmmddbb + llmmddbb (unsupported) The OpenLDAP LMDB database (a memory-mapped, persistent file). Database files are created with the postmap(1) or postalias(1) command. The database name as used in "lmdb:table" is the database file name without - the ".lmdb" suffix. This database type has unexpected limitations and - is therefore not part of the stable Postfix release. + the ".lmdb" suffix. llddaapp (read-only) Perform lookups using the LDAP protocol. Configuration details are given in the ldap_table(5). diff --git a/postfix/README_FILES/LMDB_README b/postfix/README_FILES/LMDB_README index e39d2777d..da1be827d 100644 --- a/postfix/README_FILES/LMDB_README +++ b/postfix/README_FILES/LMDB_README @@ -4,6 +4,14 @@ PPoossttffiixx OOppeennLLDDAAPP LLMMDDBB HHoowwttoo IInnttrroodduuccttiioonn +Note: + Postfix support for LMDB databases is withdrawn due to the existence of a + hard limit (an "out of storage" failure mode that cannot be resolved by + increasing the database size). + + Postfix may support LMDB again when without exception all "out of storage" + failure modes are resolved by increasing the database size. + Postfix uses databases of various kinds to store and look up information. Postfix databases are specified as "type:name". OpenLDAP LMDB implements the Postfix database type "lmdb". The name of a Postfix OpenLDAP LMDB database is @@ -70,6 +78,20 @@ that don't exist with other Postfix databases. UUnneexxppeecctteedd ppoossttmmaapp((11))//ppoossttaalliiaass((11)) ""ddaattaabbaassee ffuullll"" eerrrroorrss.. +Problem: + The "postmap lmdb:filename" command fails with an MDB_TXN_FULL error. This + problem does not exist with other Postfix databases. + +Background: + The LMDB implementation has a hard limit on the total transaction size. + This limit is independent of the LMDB database size. Therefore, the problem + cannot be resolved by increasing the lmdb_map_size value. + + This symptom is indicative of a flawed design. All LMDB data structures + should share the same storage pool so that they can scale with the database + size, and so that all "out of storage" errors are resolved by increasing + the database size. + Problem: The "postmap lmdb:filename" command fails with an MDB_MAP_FULL error. This problem does not exist with other Postfix databases. diff --git a/postfix/RELEASE_NOTES b/postfix/RELEASE_NOTES index ef167571b..6a9e1a782 100644 --- a/postfix/RELEASE_NOTES +++ b/postfix/RELEASE_NOTES @@ -14,6 +14,16 @@ specifies the release date of a stable release or snapshot release. If you upgrade from Postfix 2.9 or earlier, read RELEASE_NOTES-2.10 before proceeding. +Major changes with snapshot 20130319 +==================================== + +Postfix support for LMDB databases is withdrawn due to the existence +of a hard limit (an "out of storage" failure mode that cannot be +resolved by increasing the database size). + +Postfix may support LMDB again when without exception all "out of +storage" failure modes are resolved by increasing the database size. + Major changes with snapshot 20130315 ==================================== diff --git a/postfix/html/DATABASE_README.html b/postfix/html/DATABASE_README.html index 0c1169d99..775db1445 100644 --- a/postfix/html/DATABASE_README.html +++ b/postfix/html/DATABASE_README.html @@ -311,14 +311,12 @@ name as used in "hash:table" is the database file name without the
A non-shared, in-memory hash table. Its content are lost when a process terminates.
-
lmdb
+
lmdb (unsupported)
The OpenLDAP LMDB database (a memory-mapped, persistent file). Database files are created with the postmap(1) or postalias(1) command. The database name as used in "lmdb:table" is the database -file name without the ".lmdb" suffix. This database type has -unexpected limitations and is therefore not part of the stable -Postfix release. +file name without the ".lmdb" suffix.
ldap (read-only)
diff --git a/postfix/html/LMDB_README.html b/postfix/html/LMDB_README.html index 4b3368145..f26210325 100644 --- a/postfix/html/LMDB_README.html +++ b/postfix/html/LMDB_README.html @@ -19,6 +19,13 @@

Introduction

+
Note:

Postfix support for LMDB databases +is withdrawn due to the existence of a hard limit (an "out of +storage" failure mode that cannot be resolved by increasing the +database size).

Postfix may support LMDB again when without +exception all "out of storage" failure modes are resolved by +increasing the database size.

+

Postfix uses databases of various kinds to store and look up information. Postfix databases are specified as "type:name". OpenLDAP LMDB implements the Postfix database type "lmdb". @@ -120,6 +127,24 @@ errors.

+
Problem:

The "postmap lmdb:filename" command +fails with an MDB_TXN_FULL error. This problem does not exist with +other Postfix databases.

+ +
Background:
+ +
+ +

The LMDB implementation has a hard limit on the total transaction +size. This limit is independent of the LMDB database size. Therefore, +the problem cannot be resolved by increasing the lmdb_map_size +value.

+ +

This symptom is indicative of a flawed design. All LMDB data +structures should share the same storage pool so that they can scale +with the database size, and so that all "out of storage" errors are +resolved by increasing the database size.

+
Problem:

The "postmap lmdb:filename" command fails with an MDB_MAP_FULL error. This problem does not exist with other Postfix databases.

diff --git a/postfix/html/postconf.1.html b/postfix/html/postconf.1.html index 309215529..e411e8c22 100644 --- a/postfix/html/postconf.1.html +++ b/postfix/html/postconf.1.html @@ -195,8 +195,12 @@ POSTCONF(1) POSTCONF(1) A non-shared, in-memory hash table. Its con- tent are lost when a process terminates. + lmdb (unsupported) + The OpenLDAP LMDB database (a memory-mapped, + persistent file). + ldap (read-only) - Perform lookups using the LDAP protocol. + Perform lookups using the LDAP protocol. This is described in ldap_table(5). memcache @@ -204,156 +208,156 @@ POSTCONF(1) POSTCONF(1) This is described in memcache_table(5). mysql (read-only) - Perform lookups using the MYSQL protocol. + Perform lookups using the MYSQL protocol. This is described in mysql_table(5). pcre (read-only) A lookup table based on Perl Compatible Reg- - ular Expressions. The file format is + ular Expressions. The file format is described in pcre_table(5). pgsql (read-only) - Perform lookups using the PostgreSQL proto- + Perform lookups using the PostgreSQL proto- col. This is described in pgsql_table(5). - proxy A lookup table that is implemented via the - Postfix proxymap(8) service. The table name + proxy A lookup table that is implemented via the + Postfix proxymap(8) service. The table name syntax is type:name. regexp (read-only) A lookup table based on regular expressions. - The file format is described in regexp_ta- + The file format is described in regexp_ta- ble(5). sdbm An indexed file type based on hashing. This - is available on systems with support for + is available on systems with support for SDBM databases. socketmap (read-only) Query a Sendmail-style socketmap server. The - name of the table specifies - inet:host:port:socketmap-name for a TCP- + name of the table specifies + inet:host:port:socketmap-name for a TCP- based server, or unix:pathname:socketmap- name for a UNIX-domain server. In both - cases, socketmap-name is the name of the + cases, socketmap-name is the name of the socketmap. sqlite (read-only) - Perform lookups from SQLite database files. + Perform lookups from SQLite database files. This is described in sqlite_table(5). static (read-only) - A table that always returns its name as - lookup result. For example, static:foobar - always returns the string foobar as lookup + A table that always returns its name as + lookup result. For example, static:foobar + always returns the string foobar as lookup result. tcp (read-only) Perform lookups using a simple request-reply - protocol that is described in tcp_table(5). + protocol that is described in tcp_table(5). texthash (read-only) - Produces similar results as hash: files, + Produces similar results as hash: files, except that you don't need to run the - postmap(1) command before you can use the - file, and that it does not detect changes + postmap(1) command before you can use the + file, and that it does not detect changes after the file is read. unix (read-only) - A limited way to query the UNIX authentica- + A limited way to query the UNIX authentica- tion database. The following tables are implemented: unix:passwd.byname - The table is the UNIX password data- - base. The key is a login name. The - result is a password file entry in + The table is the UNIX password data- + base. The key is a login name. The + result is a password file entry in passwd(5) format. unix:group.byname The table is the UNIX group database. - The key is a group name. The result - is a group file entry in group(5) + The key is a group name. The result + is a group file entry in group(5) format. - Other table types may exist depending on how Post- + Other table types may exist depending on how Post- fix was built. - -M Show master.cf file contents instead of main.cf - file contents. Specify -Mf to fold long lines for + -M Show master.cf file contents instead of main.cf + file contents. Specify -Mf to fold long lines for human readability. If service ... is specified, only the matching ser- - vices will be output. For example, "postconf -Mf - inet" will output all services that listen on the + vices will be output. For example, "postconf -Mf + inet" will output all services that listen on the network. - Specify zero or more arguments, each with a ser- - vice-type name (inet, unix, fifo, or pass) or with - a service-name.service-type pair, where service- + Specify zero or more arguments, each with a ser- + vice-type name (inet, unix, fifo, or pass) or with + a service-name.service-type pair, where service- name is the first field of a master.cf entry. - This feature is available with Postfix 2.9 and + This feature is available with Postfix 2.9 and later. - -n Show only configuration parameters that have - explicit name=value settings in main.cf. Specify + -n Show only configuration parameters that have + explicit name=value settings in main.cf. Specify -nf to fold long lines for human readability (Post- fix 2.9 and later). -o name=value Override main.cf parameter settings. - This feature is available with Postfix 2.10 and + This feature is available with Postfix 2.10 and later. -t [template_file] - Display the templates for text that appears at the - beginning of delivery status notification (DSN) + Display the templates for text that appears at the + beginning of delivery status notification (DSN) messages, without expanding $name expressions. - To override the built-in templates, specify a tem- - plate file name at the end of the postconf(1) com- - mand line, or specify a file name in main.cf with + To override the built-in templates, specify a tem- + plate file name at the end of the postconf(1) com- + mand line, or specify a file name in main.cf with the bounce_template_file parameter. To force selection of the built-in templates, spec- - ify an empty template file name on the postconf(1) + ify an empty template file name on the postconf(1) command line (in shell language: ""). - This feature is available with Postfix 2.3 and + This feature is available with Postfix 2.3 and later. -v Enable verbose logging for debugging purposes. Mul- - tiple -v options make the software increasingly + tiple -v options make the software increasingly verbose. -x Expand $name in main.cf or master.cf parameter val- ues. The expansion is recursive. - This feature is available with Postfix 2.10 and + This feature is available with Postfix 2.10 and later. -X Edit the main.cf configuration file, and remove the - parameters named on the postconf(1) command line. + parameters named on the postconf(1) command line. The file is copied to a temporary file then renamed into place. Specify a list of parameter names, not - "name=value" pairs. There is no postconf(1) com- + "name=value" pairs. There is no postconf(1) com- mand to perform the reverse operation. - This feature is available with Postfix 2.10 and + This feature is available with Postfix 2.10 and later. - -# Edit the main.cf configuration file, and comment + -# Edit the main.cf configuration file, and comment out the parameters named on the postconf(1) command - line, so that those parameters revert to their - default values. The file is copied to a temporary - file then renamed into place. Specify a list of - parameter names, not "name=value" pairs. There is + line, so that those parameters revert to their + default values. The file is copied to a temporary + file then renamed into place. Specify a list of + parameter names, not "name=value" pairs. There is no postconf(1) command to perform the reverse oper- ation. - This feature is available with Postfix 2.6 and + This feature is available with Postfix 2.6 and later. DIAGNOSTICS @@ -364,18 +368,18 @@ POSTCONF(1) POSTCONF(1) Directory with Postfix configuration files. CONFIGURATION PARAMETERS - The following main.cf parameters are especially relevant + The following main.cf parameters are especially relevant to this program. - The text below provides only a parameter summary. See + The text below provides only a parameter summary. See postconf(5) for more details including examples. config_directory (see 'postconf -d' output) - The default location of the Postfix main.cf and + The default location of the Postfix main.cf and master.cf configuration files. bounce_template_file (empty) - Pathname of a configuration file with bounce mes- + Pathname of a configuration file with bounce mes- sage templates. FILES @@ -391,7 +395,7 @@ POSTCONF(1) POSTCONF(1) DATABASE_README, Postfix lookup table overview LICENSE - The Secure Mailer license must be distributed with this + The Secure Mailer license must be distributed with this software. AUTHOR(S) diff --git a/postfix/man/man1/postconf.1 b/postfix/man/man1/postconf.1 index 9cbd7518c..080087767 100644 --- a/postfix/man/man1/postconf.1 +++ b/postfix/man/man1/postconf.1 @@ -183,6 +183,9 @@ databases. .IP \fBinternal\fR A non-shared, in-memory hash table. Its content are lost when a process terminates. +.IP "\fBlmdb\fR (unsupported)" +The OpenLDAP LMDB database (a memory-mapped, persistent +file). .IP "\fBldap\fR (read-only)" Perform lookups using the LDAP protocol. This is described in \fBldap_table\fR(5). diff --git a/postfix/proto/DATABASE_README.html b/postfix/proto/DATABASE_README.html index 0de4f55a2..591cf0d02 100644 --- a/postfix/proto/DATABASE_README.html +++ b/postfix/proto/DATABASE_README.html @@ -311,14 +311,12 @@ name as used in "hash:table" is the database file name without the
A non-shared, in-memory hash table. Its content are lost when a process terminates.
-
lmdb
+
lmdb (unsupported)
The OpenLDAP LMDB database (a memory-mapped, persistent file). Database files are created with the postmap(1) or postalias(1) command. The database name as used in "lmdb:table" is the database -file name without the ".lmdb" suffix. This database type has -unexpected limitations and is therefore not part of the stable -Postfix release. +file name without the ".lmdb" suffix.
ldap (read-only)
diff --git a/postfix/proto/LMDB_README.html b/postfix/proto/LMDB_README.html index 4220785dd..df47dc431 100644 --- a/postfix/proto/LMDB_README.html +++ b/postfix/proto/LMDB_README.html @@ -19,6 +19,13 @@

Introduction

+
Note:

Postfix support for LMDB databases +is withdrawn due to the existence of a hard limit (an "out of +storage" failure mode that cannot be resolved by increasing the +database size).

Postfix may support LMDB again when without +exception all "out of storage" failure modes are resolved by +increasing the database size.

+

Postfix uses databases of various kinds to store and look up information. Postfix databases are specified as "type:name". OpenLDAP LMDB implements the Postfix database type "lmdb". @@ -120,6 +127,24 @@ errors.

+
Problem:

The "postmap lmdb:filename" command +fails with an MDB_TXN_FULL error. This problem does not exist with +other Postfix databases.

+ +
Background:
+ +
+ +

The LMDB implementation has a hard limit on the total transaction +size. This limit is independent of the LMDB database size. Therefore, +the problem cannot be resolved by increasing the lmdb_map_size +value.

+ +

This symptom is indicative of a flawed design. All LMDB data +structures should share the same storage pool so that they can scale +with the database size, and so that all "out of storage" errors are +resolved by increasing the database size.

+
Problem:

The "postmap lmdb:filename" command fails with an MDB_MAP_FULL error. This problem does not exist with other Postfix databases.

diff --git a/postfix/src/postconf/postconf.c b/postfix/src/postconf/postconf.c index 95bea1702..9b0344c69 100644 --- a/postfix/src/postconf/postconf.c +++ b/postfix/src/postconf/postconf.c @@ -177,6 +177,9 @@ /* .IP \fBinternal\fR /* A non-shared, in-memory hash table. Its content are lost /* when a process terminates. +/* .IP "\fBlmdb\fR (unsupported)" +/* The OpenLDAP LMDB database (a memory-mapped, persistent +/* file). /* .IP "\fBldap\fR (read-only)" /* Perform lookups using the LDAP protocol. This is described /* in \fBldap_table\fR(5). diff --git a/postfix/src/util/dict_lmdb.c b/postfix/src/util/dict_lmdb.c index 62d882a3a..3b692facb 100644 --- a/postfix/src/util/dict_lmdb.c +++ b/postfix/src/util/dict_lmdb.c @@ -22,11 +22,11 @@ /* size the table can grow to, so it must be set large enough /* to accomodate the largest tables in use. /* -/* As a safety measure, when Postfix opens an LMDB database it -/* will set the memory size limit to at least 3x the -/* ".lmdb" file size, so that there is room for the file to -/* grow. This ensures continued availability of Postfix daemon -/* processes. +/* As a safety measure, when Postfix opens an LMDB database +/* it will set the memory map size to at least 3x the ".lmdb" +/* file size, so that there is room for the file to grow. This +/* ensures that a process can recover from a "table full" error +/* with a simple terminate-and-restart. /* DIAGNOSTICS /* Fatal errors: cannot open file, file write error, out of memory. /* SEE ALSO @@ -472,11 +472,11 @@ DICT *dict_lmdb_open(const char *path, int open_flags, int dict_flags) /* * Try to ensure that the LMDB size limit is at least 3x the current LMDB - * file size. This should be sufficient to ensure that short-lived - * Postfix daemon processes can recover from a "table full" error. + * file size. This ensures that Postfix daemon processes can recover from + * a "table full" error with a simple terminate-and-restart. * - * Note: readers must increase their LMDB size limit, too, otherwise they - * won't be able to continue reading a table after grows. + * Note: read-only applications must increase their LMDB size limit, too, + * otherwise they won't be able to read a table after it grows. */ #ifndef SIZE_T_MAX #define SIZE_T_MAX __MAXINT__(size_t)