diff options
author | Mathieu Arnold <mat@FreeBSD.org> | 2020-07-20 13:50:13 +0000 |
---|---|---|
committer | Mathieu Arnold <mat@FreeBSD.org> | 2020-07-20 13:50:13 +0000 |
commit | 093041dd65efc48d8909cacb1f28e4cb264a802e (patch) | |
tree | 2b7978fa878167efcb0e8f6ec85085464d6bb668 /dns/bind911 | |
parent | 7a5c5426cd166bdb23f7ef30a724d4cfea7f7e8e (diff) | |
download | ports-093041dd65efc48d8909cacb1f28e4cb264a802e.tar.gz ports-093041dd65efc48d8909cacb1f28e4cb264a802e.zip |
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)
Notes
Notes:
svn path=/head/; revision=542640
Diffstat (limited to 'dns/bind911')
-rw-r--r-- | dns/bind911/Makefile | 3 | ||||
-rw-r--r-- | dns/bind911/files/extrapatch-bind-lmdb-lock | 235 |
2 files changed, 237 insertions, 1 deletions
diff --git a/dns/bind911/Makefile b/dns/bind911/Makefile index 280278b641f8..af9d9b725ef1 100644 --- a/dns/bind911/Makefile +++ b/dns/bind911/Makefile @@ -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 diff --git a/dns/bind911/files/extrapatch-bind-lmdb-lock b/dns/bind911/files/extrapatch-bind-lmdb-lock new file mode 100644 index 000000000000..310881929cbd --- /dev/null +++ b/dns/bind911/files/extrapatch-bind-lmdb-lock @@ -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__ */ |