Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 20 Jul 2020 13:50:13 +0000 (UTC)
From:      Mathieu Arnold <mat@FreeBSD.org>
To:        ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org
Subject:   svn commit: r542640 - in head/dns: bind911 bind911/files bind916 bind916/files
Message-ID:  <202007201350.06KDoDaA091454@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mat
Date: Mon Jul 20 13:50:13 2020
New Revision: 542640
URL: https://svnweb.freebsd.org/changeset/ports/542640

Log:
  Fix rndc with LMDB 0.9.26+.
  
  PR:		247950
  Submitted by: 	delphij
  Reportedy:	david isnic is
  Obtained from:	https://gitlab.isc.org/isc-projects/bind9/-/issues/1976
  MFH:		2020Q3 (not sure if needed)

Added:
  head/dns/bind911/files/extrapatch-bind-lmdb-lock   (contents, props changed)
  head/dns/bind916/files/extrapatch-bind-lmdb-lock   (contents, props changed)
Modified:
  head/dns/bind911/Makefile   (contents, props changed)
  head/dns/bind916/Makefile   (contents, props changed)

Modified: head/dns/bind911/Makefile
==============================================================================
--- head/dns/bind911/Makefile	Mon Jul 20 13:50:02 2020	(r542639)
+++ head/dns/bind911/Makefile	Mon Jul 20 13:50:13 2020	(r542640)
@@ -3,7 +3,7 @@
 
 PORTNAME=	bind
 PORTVERSION=	${ISCVERSION:S/-P/P/:S/b/.b/:S/a/.a/:S/rc/.rc/}
-PORTREVISION=	0
+PORTREVISION=	1
 CATEGORIES=	dns net
 MASTER_SITES=	ISC/bind9/${ISCVERSION}
 PKGNAMESUFFIX=	911
@@ -159,6 +159,7 @@ LARGE_FILE_CONFIGURE_ENABLE=	largefile
 
 LMDB_CONFIGURE_WITH=	lmdb=${LOCALBASE}
 LMDB_LIB_DEPENDS=	liblmdb.so:databases/lmdb
+LMDB_EXTRA_PATCHES=	${FILESDIR}/extrapatch-bind-lmdb-lock
 
 MINCACHE_EXTRA_PATCHES=	${FILESDIR}/extrapatch-bind-min-override-ttl
 

Added: head/dns/bind911/files/extrapatch-bind-lmdb-lock
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/dns/bind911/files/extrapatch-bind-lmdb-lock	Mon Jul 20 13:50:13 2020	(r542640)
@@ -0,0 +1,235 @@
+--- bin/named/server.c.orig	2020-06-10 18:00:37 UTC
++++ bin/named/server.c
+@@ -6797,6 +6797,8 @@ count_newzones(dns_view_t *view, ns_cfgctx_t *nzcfg, i
+ 		      "for view '%s'",
+ 		      view->new_zone_db, view->name);
+ 
++	LOCK(&view->new_zone_lock);
++
+ 	CHECK(nzd_count(view, &n));
+ 
+ 	*num_zonesp = n;
+@@ -6811,6 +6813,8 @@ count_newzones(dns_view_t *view, ns_cfgctx_t *nzcfg, i
+ 	if (result != ISC_R_SUCCESS)
+ 		*num_zonesp = 0;
+ 
++	UNLOCK(&view->new_zone_lock);
++
+ 	return (ISC_R_SUCCESS);
+ }
+ 
+@@ -7116,6 +7120,8 @@ typedef isc_result_t (*newzone_cfg_cb_t)(const cfg_obj
+  * Immediately interrupt processing if an error is encountered while
+  * transforming NZD data into a zone configuration object or if "callback"
+  * returns an error.
++ *
++ * Caller must hold 'view->new_zone_lock'.
+  */
+ static isc_result_t
+ for_all_newzone_cfgs(newzone_cfg_cb_t callback, cfg_obj_t *config,
+@@ -7228,8 +7234,11 @@ configure_newzones(dns_view_t *view, cfg_obj_t *config
+ 		return (ISC_R_SUCCESS);
+ 	}
+ 
++	LOCK(&view->new_zone_lock);
++
+ 	result = nzd_open(view, MDB_RDONLY, &txn, &dbi);
+ 	if (result != ISC_R_SUCCESS) {
++		UNLOCK(&view->new_zone_lock);
+ 		return (ISC_R_SUCCESS);
+ 	}
+ 
+@@ -7256,6 +7265,9 @@ configure_newzones(dns_view_t *view, cfg_obj_t *config
+ 	}
+ 
+ 	(void) nzd_close(&txn, false);
++
++	UNLOCK(&view->new_zone_lock);
++
+ 	return (result);
+ }
+ 
+@@ -7277,6 +7289,8 @@ get_newzone_config(dns_view_t *view, const char *zonen
+ 
+ 	INSIST(zoneconfig != NULL && *zoneconfig == NULL);
+ 
++	LOCK(&view->new_zone_lock);
++
+ 	CHECK(nzd_open(view, MDB_RDONLY, &txn, &dbi));
+ 
+ 	isc_log_write(ns_g_lctx,
+@@ -7310,6 +7324,8 @@ get_newzone_config(dns_view_t *view, const char *zonen
+  cleanup:
+ 	(void) nzd_close(&txn, false);
+ 
++	UNLOCK(&view->new_zone_lock);
++
+ 	if (zoneconf != NULL) {
+ 		cfg_obj_destroy(ns_g_addparser, &zoneconf);
+ 	}
+@@ -11638,8 +11654,6 @@ nzd_save(MDB_txn **txnp, MDB_dbi dbi, dns_zone_t *zone
+ 
+ 	nzd_setkey(&key, dns_zone_getorigin(zone), namebuf, sizeof(namebuf));
+ 
+-	LOCK(&view->new_zone_lock);
+-
+ 	if (zconfig == NULL) {
+ 		/* We're deleting the zone from the database */
+ 		status = mdb_del(*txnp, dbi, &key, NULL);
+@@ -11739,8 +11753,6 @@ nzd_save(MDB_txn **txnp, MDB_dbi dbi, dns_zone_t *zone
+ 	}
+ 	*txnp = NULL;
+ 
+-	UNLOCK(&view->new_zone_lock);
+-
+ 	if (text != NULL) {
+ 		isc_buffer_free(&text);
+ 	}
+@@ -11748,6 +11760,11 @@ nzd_save(MDB_txn **txnp, MDB_dbi dbi, dns_zone_t *zone
+ 	return (result);
+ }
+ 
++/*
++ * Check whether the new zone database for 'view' can be opened for writing.
++ *
++ * Caller must hold 'view->new_zone_lock'.
++ */
+ static isc_result_t
+ nzd_writable(dns_view_t *view) {
+ 	isc_result_t result = ISC_R_SUCCESS;
+@@ -11779,6 +11796,11 @@ nzd_writable(dns_view_t *view) {
+ 	return (result);
+ }
+ 
++/*
++ * Open the new zone database for 'view' and start a transaction for it.
++ *
++ * Caller must hold 'view->new_zone_lock'.
++ */
+ static isc_result_t
+ nzd_open(dns_view_t *view, unsigned int flags, MDB_txn **txnp, MDB_dbi *dbi) {
+ 	int status;
+@@ -11909,6 +11931,13 @@ nzd_env_reopen(dns_view_t *view) {
+ 	return (result);
+ }
+ 
++/*
++ * If 'commit' is true, commit the new zone database transaction pointed to by
++ * 'txnp'; otherwise, abort that transaction.
++ *
++ * Caller must hold 'view->new_zone_lock' for the view that the transaction
++ * pointed to by 'txnp' was started for.
++ */
+ static isc_result_t
+ nzd_close(MDB_txn **txnp, bool commit) {
+ 	isc_result_t result = ISC_R_SUCCESS;
+@@ -11931,6 +11960,12 @@ nzd_close(MDB_txn **txnp, bool commit) {
+ 	return (result);
+ }
+ 
++/*
++ * Count the zones configured in the new zone database for 'view' and store the
++ * result in 'countp'.
++ *
++ * Caller must hold 'view->new_zone_lock'.
++ */
+ static isc_result_t
+ nzd_count(dns_view_t *view, int *countp) {
+ 	isc_result_t result;
+@@ -11979,6 +12014,8 @@ migrate_nzf(dns_view_t *view) {
+ 	MDB_val key, data;
+ 	ns_dzarg_t dzarg;
+ 
++	LOCK(&view->new_zone_lock);
++
+ 	/*
+ 	 * If NZF file doesn't exist, or NZD DB exists and already
+ 	 * has data, return without attempting migration.
+@@ -12122,6 +12159,8 @@ migrate_nzf(dns_view_t *view) {
+ 		result = nzd_close(&txn, commit);
+ 	}
+ 
++	UNLOCK(&view->new_zone_lock);
++
+ 	if (text != NULL) {
+ 		isc_buffer_free(&text);
+ 	}
+@@ -12325,6 +12364,7 @@ do_addzone(ns_server_t *server, ns_cfgctx_t *cfg, dns_
+ 	MDB_dbi dbi;
+ 
+ 	UNUSED(zoneconf);
++	LOCK(&view->new_zone_lock);
+ #endif /* HAVE_LMDB */
+ 
+ 	/* Zone shouldn't already exist */
+@@ -12465,6 +12505,7 @@ do_addzone(ns_server_t *server, ns_cfgctx_t *cfg, dns_
+ #else /* HAVE_LMDB */
+ 	if (txn != NULL)
+ 		(void) nzd_close(&txn, false);
++	UNLOCK(&view->new_zone_lock);
+ #endif /* HAVE_LMDB */
+ 
+ 	if (zone != NULL)
+@@ -12488,6 +12529,7 @@ do_modzone(ns_server_t *server, ns_cfgctx_t *cfg, dns_
+ #else /* HAVE_LMDB */
+ 	MDB_txn *txn = NULL;
+ 	MDB_dbi dbi;
++	LOCK(&view->new_zone_lock);
+ #endif /* HAVE_LMDB */
+ 
+ 	/* Zone must already exist */
+@@ -12667,6 +12709,7 @@ do_modzone(ns_server_t *server, ns_cfgctx_t *cfg, dns_
+ #else /* HAVE_LMDB */
+ 	if (txn != NULL)
+ 		(void) nzd_close(&txn, false);
++	UNLOCK(&view->new_zone_lock);
+ #endif /* HAVE_LMDB */
+ 
+ 	if (zone != NULL)
+@@ -12816,6 +12859,7 @@ rmzone(isc_task_t *task, isc_event_t *event) {
+ 	if (added && cfg != NULL) {
+ #ifdef HAVE_LMDB
+ 		/* Make sure we can open the NZD database */
++		LOCK(&view->new_zone_lock);
+ 		result = nzd_open(view, 0, &txn, &dbi);
+ 		if (result != ISC_R_SUCCESS) {
+ 			isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+@@ -12834,6 +12878,11 @@ rmzone(isc_task_t *task, isc_event_t *event) {
+ 				      "delete zone configuration: %s",
+ 				      isc_result_totext(result));
+ 		}
++
++		if (txn != NULL) {
++			(void)nzd_close(&txn, false);
++		}
++		UNLOCK(&view->new_zone_lock);
+ #else
+ 		result = delete_zoneconf(view, cfg->add_parser,
+ 					 cfg->nzf_config,
+@@ -12926,10 +12975,6 @@ rmzone(isc_task_t *task, isc_event_t *event) {
+ 		}
+ 	}
+ 
+-#ifdef HAVE_LMDB
+-	if (txn != NULL)
+-		(void) nzd_close(&txn, false);
+-#endif
+ 	if (raw != NULL)
+ 		dns_zone_detach(&raw);
+ 	dns_zone_detach(&zone);
+--- lib/dns/include/dns/view.h.orig	2020-06-10 18:00:37 UTC
++++ lib/dns/include/dns/view.h
+@@ -240,12 +240,7 @@ struct dns_view {
+ 
+ #ifdef HAVE_LMDB
+ #include <lmdb.h>
+-/*
+- * MDB_NOTLS is used to prevent problems after configuration is reloaded, due
+- * to the way LMDB's use of thread-local storage (TLS) interacts with the BIND9
+- * thread model.
+- */
+-#define DNS_LMDB_COMMON_FLAGS		(MDB_CREATE | MDB_NOSUBDIR | MDB_NOTLS)
++#define DNS_LMDB_COMMON_FLAGS		(MDB_CREATE | MDB_NOSUBDIR | MDB_NOLOCK)
+ #ifndef __OpenBSD__
+ #define DNS_LMDB_FLAGS			(DNS_LMDB_COMMON_FLAGS)
+ #else /* __OpenBSD__ */

Modified: head/dns/bind916/Makefile
==============================================================================
--- head/dns/bind916/Makefile	Mon Jul 20 13:50:02 2020	(r542639)
+++ head/dns/bind916/Makefile	Mon Jul 20 13:50:13 2020	(r542640)
@@ -8,7 +8,7 @@ PORTVERSION=	${ISCVERSION:S/-P/P/:S/b/.b/:S/a/.a/:S/rc
 PORTREVISION=	0
 .else
 # dns/bind916 here
-PORTREVISION=	0
+PORTREVISION=	1
 .endif
 CATEGORIES=	dns net
 MASTER_SITES=	ISC/bind9/${ISCVERSION}
@@ -180,6 +180,7 @@ LARGE_FILE_CONFIGURE_ENABLE=	largefile
 
 LMDB_CONFIGURE_WITH=	lmdb=${LOCALBASE}
 LMDB_LIB_DEPENDS=	liblmdb.so:databases/lmdb
+LMDB_EXTRA_PATCHES=	${FILESDIR}/extrapatch-bind-lmdb-lock
 
 MANPAGES_BUILD_DEPENDS=	sphinx-build:textproc/py-sphinx
 

Added: head/dns/bind916/files/extrapatch-bind-lmdb-lock
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/dns/bind916/files/extrapatch-bind-lmdb-lock	Mon Jul 20 13:50:13 2020	(r542640)
@@ -0,0 +1,236 @@
+--- bin/named/server.c.orig	2020-06-10 21:01:43 UTC
++++ bin/named/server.c
+@@ -7578,6 +7578,8 @@ count_newzones(dns_view_t *view, ns_cfgctx_t *nzcfg, i
+ 		      "for view '%s'",
+ 		      view->new_zone_db, view->name);
+ 
++	LOCK(&view->new_zone_lock);
++
+ 	CHECK(nzd_count(view, &n));
+ 
+ 	*num_zonesp = n;
+@@ -7592,6 +7594,8 @@ cleanup:
+ 		*num_zonesp = 0;
+ 	}
+ 
++	UNLOCK(&view->new_zone_lock);
++
+ 	return (ISC_R_SUCCESS);
+ }
+ 
+@@ -7920,6 +7924,8 @@ typedef isc_result_t (*newzone_cfg_cb_t)(const cfg_obj
+  * Immediately interrupt processing if an error is encountered while
+  * transforming NZD data into a zone configuration object or if "callback"
+  * returns an error.
++ *
++ * Caller must hold 'view->new_zone_lock'.
+  */
+ static isc_result_t
+ for_all_newzone_cfgs(newzone_cfg_cb_t callback, cfg_obj_t *config,
+@@ -8028,8 +8034,11 @@ configure_newzones(dns_view_t *view, cfg_obj_t *config
+ 		return (ISC_R_SUCCESS);
+ 	}
+ 
++	LOCK(&view->new_zone_lock);
++
+ 	result = nzd_open(view, MDB_RDONLY, &txn, &dbi);
+ 	if (result != ISC_R_SUCCESS) {
++		UNLOCK(&view->new_zone_lock);
+ 		return (ISC_R_SUCCESS);
+ 	}
+ 
+@@ -8055,6 +8064,9 @@ configure_newzones(dns_view_t *view, cfg_obj_t *config
+ 	}
+ 
+ 	(void)nzd_close(&txn, false);
++
++	UNLOCK(&view->new_zone_lock);
++
+ 	return (result);
+ }
+ 
+@@ -8075,6 +8087,8 @@ get_newzone_config(dns_view_t *view, const char *zonen
+ 
+ 	INSIST(zoneconfig != NULL && *zoneconfig == NULL);
+ 
++	LOCK(&view->new_zone_lock);
++
+ 	CHECK(nzd_open(view, MDB_RDONLY, &txn, &dbi));
+ 
+ 	isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
+@@ -8108,6 +8122,8 @@ get_newzone_config(dns_view_t *view, const char *zonen
+ cleanup:
+ 	(void)nzd_close(&txn, false);
+ 
++	UNLOCK(&view->new_zone_lock);
++
+ 	if (zoneconf != NULL) {
+ 		cfg_obj_destroy(named_g_addparser, &zoneconf);
+ 	}
+@@ -12566,8 +12582,6 @@ nzd_save(MDB_txn **txnp, MDB_dbi dbi, dns_zone_t *zone
+ 
+ 	nzd_setkey(&key, dns_zone_getorigin(zone), namebuf, sizeof(namebuf));
+ 
+-	LOCK(&view->new_zone_lock);
+-
+ 	if (zconfig == NULL) {
+ 		/* We're deleting the zone from the database */
+ 		status = mdb_del(*txnp, dbi, &key, NULL);
+@@ -12647,8 +12661,6 @@ cleanup:
+ 	}
+ 	*txnp = NULL;
+ 
+-	UNLOCK(&view->new_zone_lock);
+-
+ 	if (text != NULL) {
+ 		isc_buffer_free(&text);
+ 	}
+@@ -12656,6 +12668,11 @@ cleanup:
+ 	return (result);
+ }
+ 
++/*
++ * Check whether the new zone database for 'view' can be opened for writing.
++ *
++ * Caller must hold 'view->new_zone_lock'.
++ */
+ static isc_result_t
+ nzd_writable(dns_view_t *view) {
+ 	isc_result_t result = ISC_R_SUCCESS;
+@@ -12685,6 +12702,11 @@ nzd_writable(dns_view_t *view) {
+ 	return (result);
+ }
+ 
++/*
++ * Open the new zone database for 'view' and start a transaction for it.
++ *
++ * Caller must hold 'view->new_zone_lock'.
++ */
+ static isc_result_t
+ nzd_open(dns_view_t *view, unsigned int flags, MDB_txn **txnp, MDB_dbi *dbi) {
+ 	int status;
+@@ -12812,6 +12834,13 @@ cleanup:
+ 	return (result);
+ }
+ 
++/*
++ * If 'commit' is true, commit the new zone database transaction pointed to by
++ * 'txnp'; otherwise, abort that transaction.
++ *
++ * Caller must hold 'view->new_zone_lock' for the view that the transaction
++ * pointed to by 'txnp' was started for.
++ */
+ static isc_result_t
+ nzd_close(MDB_txn **txnp, bool commit) {
+ 	isc_result_t result = ISC_R_SUCCESS;
+@@ -12834,6 +12863,12 @@ nzd_close(MDB_txn **txnp, bool commit) {
+ 	return (result);
+ }
+ 
++/*
++ * Count the zones configured in the new zone database for 'view' and store the
++ * result in 'countp'.
++ *
++ * Caller must hold 'view->new_zone_lock'.
++ */
+ static isc_result_t
+ nzd_count(dns_view_t *view, int *countp) {
+ 	isc_result_t result;
+@@ -12881,6 +12916,8 @@ migrate_nzf(dns_view_t *view) {
+ 	MDB_val key, data;
+ 	ns_dzarg_t dzarg;
+ 
++	LOCK(&view->new_zone_lock);
++
+ 	/*
+ 	 * If NZF file doesn't exist, or NZD DB exists and already
+ 	 * has data, return without attempting migration.
+@@ -13016,6 +13053,8 @@ cleanup:
+ 		result = nzd_close(&txn, commit);
+ 	}
+ 
++	UNLOCK(&view->new_zone_lock);
++
+ 	if (text != NULL) {
+ 		isc_buffer_free(&text);
+ 	}
+@@ -13225,6 +13264,7 @@ do_addzone(named_server_t *server, ns_cfgctx_t *cfg, d
+ 	MDB_dbi dbi;
+ 
+ 	UNUSED(zoneconf);
++	LOCK(&view->new_zone_lock);
+ #endif /* HAVE_LMDB */
+ 
+ 	/* Zone shouldn't already exist */
+@@ -13378,6 +13418,7 @@ cleanup:
+ 	if (txn != NULL) {
+ 		(void)nzd_close(&txn, false);
+ 	}
++	UNLOCK(&view->new_zone_lock);
+ #endif /* HAVE_LMDB */
+ 
+ 	if (zone != NULL) {
+@@ -13401,6 +13442,7 @@ do_modzone(named_server_t *server, ns_cfgctx_t *cfg, d
+ #else  /* HAVE_LMDB */
+ 	MDB_txn *txn = NULL;
+ 	MDB_dbi dbi;
++	LOCK(&view->new_zone_lock);
+ #endif /* HAVE_LMDB */
+ 
+ 	/* Zone must already exist */
+@@ -13598,6 +13640,7 @@ cleanup:
+ 	if (txn != NULL) {
+ 		(void)nzd_close(&txn, false);
+ 	}
++	UNLOCK(&view->new_zone_lock);
+ #endif /* HAVE_LMDB */
+ 
+ 	if (zone != NULL) {
+@@ -13761,6 +13804,7 @@ rmzone(isc_task_t *task, isc_event_t *event) {
+ 	if (added && cfg != NULL) {
+ #ifdef HAVE_LMDB
+ 		/* Make sure we can open the NZD database */
++		LOCK(&view->new_zone_lock);
+ 		result = nzd_open(view, 0, &txn, &dbi);
+ 		if (result != ISC_R_SUCCESS) {
+ 			isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
+@@ -13778,6 +13822,11 @@ rmzone(isc_task_t *task, isc_event_t *event) {
+ 				      "delete zone configuration: %s",
+ 				      isc_result_totext(result));
+ 		}
++
++		if (txn != NULL) {
++			(void)nzd_close(&txn, false);
++		}
++		UNLOCK(&view->new_zone_lock);
+ #else  /* ifdef HAVE_LMDB */
+ 		result = delete_zoneconf(view, cfg->add_parser, cfg->nzf_config,
+ 					 dns_zone_getorigin(zone),
+@@ -13867,11 +13916,6 @@ rmzone(isc_task_t *task, isc_event_t *event) {
+ 		}
+ 	}
+ 
+-#ifdef HAVE_LMDB
+-	if (txn != NULL) {
+-		(void)nzd_close(&txn, false);
+-	}
+-#endif /* ifdef HAVE_LMDB */
+ 	if (raw != NULL) {
+ 		dns_zone_detach(&raw);
+ 	}
+--- lib/dns/include/dns/lmdb.h.orig	2020-06-10 21:01:43 UTC
++++ lib/dns/include/dns/lmdb.h
+@@ -10,12 +10,7 @@
+  */
+ 
+ #include <lmdb.h>
+-/*
+- * MDB_NOTLS is used to prevent problems after configuration is reloaded, due
+- * to the way LMDB's use of thread-local storage (TLS) interacts with the BIND9
+- * thread model.
+- */
+-#define DNS_LMDB_COMMON_FLAGS (MDB_CREATE | MDB_NOSUBDIR | MDB_NOTLS)
++#define DNS_LMDB_COMMON_FLAGS (MDB_CREATE | MDB_NOSUBDIR | MDB_NOLOCK)
+ #ifndef __OpenBSD__
+ #define DNS_LMDB_FLAGS (DNS_LMDB_COMMON_FLAGS)
+ #else /* __OpenBSD__ */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202007201350.06KDoDaA091454>