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>