Download raw body.
[update] lmdb-1.0.0 (BREAKING CHANGES)
On Fri, Jul 03, 2026 at 05:23:10PM +0200, Jeremie Courreges-Anglas wrote:
>
> The update to lmdb-1.0.0 introduces a major incompatibility. The old
> and the new formats are not compatible and the new code can't read old
> databases. So the update below also builds and packages the old
> mdb_dump-0.9 code so that people can dump their old databases to a
> textual representation that can then be fed to the new mdb_load(1)
> program.
>
> All consumers still build on arm64. I have cc'd the maintainers of
> the consumers of the lmdb port, even though I'm not sure which ports
> will need manual dump/loads. Make sure you have proper backups in
> case the migration process breaks and you need to go back to the
> previous code. I'd really love some input from anyone going who went
> from through the migration, whatever amount of actions you needed.
>
> Thanks Stuart for the heads-up and the links:
> https://marc.info/?l=postfix-users&m=178300663467720&w=2 (https://marc.info/?l=postfix-users&m=178300663467720&q=p5)
> https://github.com/LMDB/lmdb/commit/b7c68db29c33a26d92f6c0cdae7550211350b5fe
>
>
> Index: Makefile
> ===================================================================
> RCS file: /home/cvs/ports/databases/lmdb/Makefile,v
> diff -u -p -r1.18 Makefile
> --- Makefile 14 Sep 2025 16:27:47 -0000 1.18
> +++ Makefile 3 Jul 2026 12:55:21 -0000
> @@ -1,11 +1,13 @@
> COMMENT = Symas Lightning Memory-Mapped Database
>
> -VERSION = 0.9.33
> +VERSION = 1.0.0
> +OVERSION = 0.9.35
>
> DISTNAME = openldap-LMDB_${VERSION}
> PKGNAME = lmdb-${VERSION}
> +DISTFILES.old = openldap-LMDB_${OVERSION}${EXTRACT_SUFX}
>
> -SHARED_LIBS += lmdb 0.0 # 0.0
> +SHARED_LIBS += lmdb 1.0
>
> CATEGORIES = databases
>
> @@ -19,23 +21,43 @@ PERMIT_PACKAGE = Yes
> WANTLIB += c pthread
>
> SITES = https://git.openldap.org/openldap/openldap/-/archive/LMDB_${VERSION}/
> +SITES.old = https://git.openldap.org/openldap/openldap/-/archive/LMDB_${OVERSION}/
> +PORTROACH= site:https://github.com/LMDB/lmdb/archive/
>
> DEBUG_PACKAGES = ${BUILD_PACKAGES}
>
> USE_GMAKE = Yes
>
> -MAKE_FLAGS = CC="${CC}" XCFLAGS="${CFLAGS}" \
> - SHARED_VERSION_MAJOR=${LIBlmdb_VERSION:R} \
> - SHARED_VERSION_MINOR=${LIBlmdb_VERSION:E}
> +MAKE_FLAGS = CC="${CC}" OPT="${CFLAGS}" LDL="" \
> + LIBVER=${LIBlmdb_VERSION:R} \
> + ABIVER=${LIBlmdb_VERSION:E} \
> + mandir=${PREFIX}/man
>
> WRKDIST = ${WRKDIR}/openldap-LMDB_${VERSION}/libraries/liblmdb
> +OWRKDIST = ${WRKDIST}/lmdb-0.9
>
> SUBST_VARS += VERSION
>
> -# lmdb.pc: https://bugs.openldap.org/show_bug.cgi?id=10203
> +post-extract:
> + mv ${WRKDIR}/openldap-LMDB_${OVERSION}/libraries/liblmdb ${OWRKDIST}
> +
> +post-build:
> + cd ${OWRKDIST}; \
> + ${SETENV} ${MAKE_ENV} ${MAKE_PROGRAM} ${MAKE_FLAGS} \
> + -f ${MAKE_FILE} mdb_dump mtest
> +
> +post-test:
> + cd ${OWRKDIST}; \
> + mkdir -p testdb testrestore; \
> + ./mtest; \
> + ./mdb_dump testdb | ${WRKBUILD}/mdb_load testrestore
> +
> post-install:
> - ! test -e ${PREFIX}/lib/pkgconfig/lmdb.pc # fail if shipped upstream
> + ${INSTALL_DATA} ${WRKBUILD}/lmdb.pc ${PREFIX}/lib/pkgconfig/lmdb.pc
> + ${INSTALL_PROGRAM} ${OWRKDIST}/mdb_dump ${PREFIX}/bin/mdb_dump-0.9
> + ${INSTALL_DATA} ${OWRKDIST}/mdb_dump.1 ${PREFIX}/man/man1/mdb_dump-0.9.1
> ${SUBST_CMD} -c -o ${SHAREOWN} -g ${SHAREGRP} -m ${SHAREMODE} \
> ${FILESDIR}/lmdb.pc.in ${PREFIX}/lib/pkgconfig/lmdb.pc
> + -diff -u ${WRKBUILD}/lmdb.pc ${PREFIX}/lib/pkgconfig/lmdb.pc
>
> .include <bsd.port.mk>
> Index: distinfo
> ===================================================================
> RCS file: /home/cvs/ports/databases/lmdb/distinfo,v
> diff -u -p -r1.7 distinfo
> --- distinfo 14 Sep 2025 16:27:47 -0000 1.7
> +++ distinfo 3 Jul 2026 12:55:21 -0000
> @@ -1,2 +1,4 @@
> -SHA256 (openldap-LMDB_0.9.33.tar.gz) = R2gB9SOciMfeYcM5BQKl0Tll7O3vgBBbX7D8uDc9HlM=
> -SIZE (openldap-LMDB_0.9.33.tar.gz) = 149281
> +SHA256 (openldap-LMDB_0.9.35.tar.gz) = DQkManyFpPMaKrDXNFVMIQl/JHUjk6GQsOUZlrCPSMQ=
> +SHA256 (openldap-LMDB_1.0.0.tar.gz) = ph3tEr2cZwA4t3SD3aE7UGhKk6ER5TQh37l5Ykrp9y4=
> +SIZE (openldap-LMDB_0.9.35.tar.gz) = 149788
> +SIZE (openldap-LMDB_1.0.0.tar.gz) = 178085
> Index: files/lmdb.pc.in
> ===================================================================
> RCS file: /home/cvs/ports/databases/lmdb/files/lmdb.pc.in,v
> diff -u -p -r1.2 lmdb.pc.in
> --- files/lmdb.pc.in 14 Jul 2025 11:29:55 -0000 1.2
> +++ files/lmdb.pc.in 3 Jul 2026 12:55:21 -0000
> @@ -1,12 +1,12 @@
> prefix=${TRUEPREFIX}
> -exec_prefix=${prefix}
> -libdir=${prefix}/lib
> -includedir=${prefix}/include
> +exec_prefix=${TRUEPREFIX}
> +includedir=${TRUEPREFIX}/include
> +libdir=${TRUEPREFIX}/lib
>
> -Name: lmdb
> -Description: Lightning memory-mapped database: key-value data store
> -URL: https://www.symas.com/symas-embedded-database-lmdb
> +Name: lmdb (OpenLDAP)
> +Description: OpenLDAP Lightning Memory Mapped Database library
> +URL: https://www.openldap.org
> Version: ${VERSION}
> +Cflags: -pthread -I${includedir}
> Libs: -L${libdir} -llmdb
> Libs.private: -lpthread
> -Cflags: -I${includedir}
> Index: patches/patch-Makefile
> ===================================================================
> RCS file: /home/cvs/ports/databases/lmdb/patches/patch-Makefile,v
> diff -u -p -r1.2 patch-Makefile
> --- patches/patch-Makefile 10 Mar 2022 00:04:05 -0000 1.2
> +++ patches/patch-Makefile 3 Jul 2026 12:55:21 -0000
> @@ -1,7 +1,7 @@
> Index: Makefile
> --- Makefile.orig
> +++ Makefile
> -@@ -18,21 +18,22 @@
> +@@ -18,11 +18,10 @@
> # There may be other macros in mdb.c of interest. You should
> # read mdb.c before changing any of them.
> #
> @@ -12,43 +12,18 @@ Index: Makefile
> THREADS = -pthread
> -OPT = -O2 -g
> CFLAGS = $(THREADS) $(OPT) $(W) $(XCFLAGS)
> - LDLIBS =
> - SOLIBS =
> --SOEXT = .so
> --prefix = /usr/local
> -+SHARED_VERSION_MAJOR ?= 0
> -+SHARED_VERSION_MINOR ?= 0
> -+SOEXT = .so.$(SHARED_VERSION_MAJOR).$(SHARED_VERSION_MINOR)
> -+prefix = ${LOCALBASE}/
> - exec_prefix = $(prefix)
> - bindir = $(exec_prefix)/bin
> - libdir = $(exec_prefix)/lib
> - includedir = $(prefix)/include
> --datarootdir = $(prefix)/share
> -+datarootdir = $(prefix)
> - mandir = $(datarootdir)/man
> + LDFLAGS = $(THREADS)
> + LDLIBS =
> +@@ -69,11 +68,7 @@ install: $(ILIBS) $(IPROGS) $(IHDRS)
> + mkdir -p $(DESTDIR)$(mandir)/man1
> + for f in $(IPROGS); do cp $$f $(DESTDIR)$(bindir); done
> + for f in $(ILIBS); do cp $$f $(DESTDIR)$(libdir); done
> +- for f in $(ILIBS2); do cp $$f $(DESTDIR)$(libdir); \
> +- i=`basename -s .$(ABIVER) $$f`; rm -f $(DESTDIR)$(libdir)/$$i; \
> +- ln -s $$f $(DESTDIR)$(libdir)/$$i; \
> +- i=`basename -s .$(LIBVER) $$i`; rm -f $(DESTDIR)$(libdir)/$$i; \
> +- ln -s $$f $(DESTDIR)$(libdir)/$$i; done
> ++ for f in $(ILIBS2); do cp $$f $(DESTDIR)$(libdir); done
> + for f in $(IHDRS); do cp $$f $(DESTDIR)$(includedir); done
> + for f in $(IDOCS); do cp $$f $(DESTDIR)$(mandir)/man1; done
>
> - ########################################################################
> -@@ -45,14 +46,14 @@ PROGS = $(IPROGS) mtest mtest2 mtest3 mtest4 mtest5
> - all: $(ILIBS) $(PROGS)
> -
> - install: $(ILIBS) $(IPROGS) $(IHDRS)
> -- mkdir -p $(DESTDIR)$(bindir)
> -- mkdir -p $(DESTDIR)$(libdir)
> -- mkdir -p $(DESTDIR)$(includedir)
> -- mkdir -p $(DESTDIR)$(mandir)/man1
> -- for f in $(IPROGS); do cp $$f $(DESTDIR)$(bindir); done
> -- for f in $(ILIBS); do cp $$f $(DESTDIR)$(libdir); done
> -- for f in $(IHDRS); do cp $$f $(DESTDIR)$(includedir); done
> -- for f in $(IDOCS); do cp $$f $(DESTDIR)$(mandir)/man1; done
> -+ ${BSD_INSTALL_DATA_DIR} $(DESTDIR)$(bindir)
> -+ ${BSD_INSTALL_DATA_DIR} $(DESTDIR)$(libdir)
> -+ ${BSD_INSTALL_DATA_DIR} $(DESTDIR)$(includedir)
> -+ ${BSD_INSTALL_DATA_DIR} $(DESTDIR)$(mandir)/man1
> -+ for f in $(IPROGS); do ${BSD_INSTALL_PROGRAM} $$f $(DESTDIR)$(bindir); done
> -+ for f in $(ILIBS); do ${BSD_INSTALL_DATA} $$f $(DESTDIR)$(libdir); done
> -+ for f in $(IHDRS); do ${BSD_INSTALL_DATA} $$f $(DESTDIR)$(includedir); done
> -+ for f in $(IDOCS); do ${BSD_INSTALL_MAN} $$f $(DESTDIR)$(mandir)/man1; done
> -
> - clean:
> - rm -rf $(PROGS) *.[ao] *.[ls]o *~ testdb
> Index: patches/patch-lmdb-0_9_mdb_c
> ===================================================================
> RCS file: patches/patch-lmdb-0_9_mdb_c
> diff -N patches/patch-lmdb-0_9_mdb_c
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ patches/patch-lmdb-0_9_mdb_c 3 Jul 2026 12:55:21 -0000
> @@ -0,0 +1,11 @@
> +Index: lmdb-0.9/mdb.c
> +--- lmdb-0.9/mdb.c.orig
> ++++ lmdb-0.9/mdb.c
> +@@ -5069,6 +5069,7 @@ mdb_env_open(MDB_env *env, const char *path, unsigned
> + /* silently ignore WRITEMAP when we're only getting read access */
> + flags &= ~MDB_WRITEMAP;
> + } else {
> ++ flags |= MDB_WRITEMAP;
> + if (!((env->me_free_pgs = mdb_midl_alloc(MDB_IDL_UM_MAX)) &&
> + (env->me_dirty_list = calloc(MDB_IDL_UM_SIZE, sizeof(MDB_ID2)))))
> + rc = ENOMEM;
> Index: patches/patch-mdb_c
> ===================================================================
> RCS file: /home/cvs/ports/databases/lmdb/patches/patch-mdb_c,v
> diff -u -p -r1.11 patch-mdb_c
> --- patches/patch-mdb_c 14 Sep 2025 16:27:47 -0000 1.11
> +++ patches/patch-mdb_c 3 Jul 2026 12:55:21 -0000
> @@ -3,11 +3,19 @@ enforce MDB_WRITEMAP, because we have no
> Index: mdb.c
> --- mdb.c.orig
> +++ mdb.c
> -@@ -5055,6 +5055,7 @@ mdb_env_open(MDB_env *env, const char *path, unsigned
> +@@ -2331,6 +2331,7 @@ mdb_dlist_free(MDB_txn *txn)
> + #if MDB_RPAGE_CACHE
> + #if defined(MDB_VL32) || ((MDB_RPAGE_CACHE) & 2) /* Always remap */
> + #define MDB_REMAPPING(flags) 1
> ++#error "MDB_REMAPPING is incompatible with MDB_WRITEMAP"
> + #else
> + #define MDB_REMAPPING(flags) ((flags) & MDB_REMAP_CHUNKS)
> + #endif
> +@@ -6288,6 +6289,7 @@ mdb_env_open(MDB_env *env, const char *path, unsigned
> /* silently ignore WRITEMAP when we're only getting read access */
> flags &= ~MDB_WRITEMAP;
> } else {
> + flags |= MDB_WRITEMAP;
> + /* WRITEMAP has a dummy element to match dirty_room = 1 */
> + size_t dl_size = (flags & MDB_WRITEMAP) ? 2 : MDB_IDL_UM_SIZE;
> if (!((env->me_free_pgs = mdb_midl_alloc(MDB_IDL_UM_MAX)) &&
> - (env->me_dirty_list = calloc(MDB_IDL_UM_SIZE, sizeof(MDB_ID2)))))
> - rc = ENOMEM;
> Index: pkg/MESSAGE
> ===================================================================
> RCS file: pkg/MESSAGE
> diff -N pkg/MESSAGE
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ pkg/MESSAGE 3 Jul 2026 12:55:21 -0000
> @@ -0,0 +1,3 @@
> +LMDB 1.0 is an incompatible update from LMDB 0.9. Existing databases
> +have to be converted from the old to the new format using the
> +mdb_dump-0.9(1) and mdb_load(1) commands provided in this package.
> Index: pkg/PLIST
> ===================================================================
> RCS file: /home/cvs/ports/databases/lmdb/pkg/PLIST,v
> diff -u -p -r1.4 PLIST
> --- pkg/PLIST 22 Apr 2024 17:50:04 -0000 1.4
> +++ pkg/PLIST 3 Jul 2026 12:55:21 -0000
> @@ -1,5 +1,7 @@
> @bin bin/mdb_copy
> +@bin bin/mdb_drop
> @bin bin/mdb_dump
> +@bin bin/mdb_dump-0.9
> @bin bin/mdb_load
> @bin bin/mdb_stat
> include/lmdb.h
> @@ -7,6 +9,8 @@ include/lmdb.h
> @lib lib/liblmdb.so.${LIBlmdb_VERSION}
> lib/pkgconfig/lmdb.pc
> @man man/man1/mdb_copy.1
> +@man man/man1/mdb_drop.1
> +@man man/man1/mdb_dump-0.9.1
> @man man/man1/mdb_dump.1
> @man man/man1/mdb_load.1
> @man man/man1/mdb_stat.1
>
>
> --
> jca
>
See what postgresql-server does, there is a WHOLE pkg_add annotation
devoted to it, named @ask-update.
pkg_create(1) has some documentation.
Cliff notes:
- in interactive mode it displays a message if the update crosses a version boundary
- it will update in non-interactive mode
- you can also force it with -Dupdate_lmdb
Pretty straightforward if you ask me ;)
[update] lmdb-1.0.0 (BREAKING CHANGES)