FreeBSD Bugzilla – Attachment 216457 Details for
Bug 247950
dns/bind911 and dns/bind916: lmdb-0.9.24_2,1 causes problems with bind dynamic zones after reload
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
dns/bind911: Apply upstream change of LMDB locking
0001-dns-bind911-Apply-upstream-change-of-LMDB-locking.patch (text/plain), 8.01 KB, created by
Xin LI
on 2020-07-15 06:20:45 UTC
(
hide
)
Description:
dns/bind911: Apply upstream change of LMDB locking
Filename:
MIME Type:
Creator:
Xin LI
Created:
2020-07-15 06:20:45 UTC
Size:
8.01 KB
patch
obsolete
>From a3a56615668909038f2b7d40f9e25fb785a28b16 Mon Sep 17 00:00:00 2001 >From: Xin Li <delphij@FreeBSD.org> >Date: Tue, 14 Jul 2020 23:07:59 -0700 >Subject: [PATCH] dns/bind911: Apply upstream change of LMDB locking. > >PR: 247950 >--- > dns/bind911/Makefile | 3 +- > dns/bind911/files/extrapatch-bind-lmdb-lock | 235 ++++++++++++++++++++ > 2 files changed, 237 insertions(+), 1 deletion(-) > create mode 100644 dns/bind911/files/extrapatch-bind-lmdb-lock > >diff --git a/dns/bind911/Makefile b/dns/bind911/Makefile >index 9a734f8219ca..6b7bfbfe995d 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__ */ >-- >2.27.0 >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Flags:
delphij
:
maintainer-approval?
(
mat
)
Actions:
View
|
Diff
Attachments on
bug 247950
:
216456
| 216457