Index | Thread | Search

From:
Marc Espie <marc.espie.openbsd@gmail.com>
Subject:
Re: [update] lmdb-1.0.0 (BREAKING CHANGES)
To:
ports@openbsd.org, Aisha Tammy <aisha@openbsd.org>, Rafael Sadowski <rsadowski@openbsd.org>, Kurt Mosiejczuk <kmos@openbsd.org>, Otto Moerbeek <otto@drijf.net>, Antoine Jacoutot <ajacoutot@openbsd.org>
Date:
Fri, 3 Jul 2026 17:32:43 +0200

Download raw body.

Thread
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 ;)