static isc_result_t
configure_zone(const cfg_obj_t *config, const cfg_obj_t *zconfig,
- const cfg_obj_t *vconfig, isc_mem_t *mctx, dns_view_t *view,
+ const cfg_obj_t *vconfig, dns_view_t *view,
dns_viewlist_t *viewlist, dns_kasplist_t *kasplist,
cfg_aclconfctx_t *aclconf, bool added, bool old_rpz_ok,
bool modify);
static isc_result_t
configure_newzones(dns_view_t *view, cfg_obj_t *config, cfg_obj_t *vconfig,
- isc_mem_t *mctx, cfg_aclconfctx_t *actx);
+ cfg_aclconfctx_t *actx);
static isc_result_t
add_keydata_zone(dns_view_t *view, const char *directory, isc_mem_t *mctx);
isc_buffer_constinit(&b, reverse, strlen(reverse));
isc_buffer_add(&b, strlen(reverse));
CHECK(dns_name_fromtext(name, &b, dns_rootname, 0, NULL));
- CHECK(dns_zone_create(&zone, mctx));
+ CHECK(dns_zone_create(&zone, mctx, 0));
CHECK(dns_zone_setorigin(zone, name));
dns_zone_setview(zone, view);
CHECK(dns_zonemgr_managezone(named_g_server->zonemgr, zone));
result = isc_task_beginexclusive(task);
RUNTIME_CHECK(result == ISC_R_SUCCESS);
dns_view_thaw(ev->view);
- result = configure_zone(
- cfg->config, zoneobj, cfg->vconfig, ev->cbd->server->mctx,
- ev->view, &ev->cbd->server->viewlist,
- &ev->cbd->server->kasplist, cfg->actx, true, false, ev->mod);
+ result = configure_zone(cfg->config, zoneobj, cfg->vconfig, ev->view,
+ &ev->cbd->server->viewlist,
+ &ev->cbd->server->kasplist, cfg->actx, true,
+ false, ev->mod);
dns_view_freeze(ev->view);
isc_task_endexclusive(task);
/*
* Create the actual zone.
*/
- CHECK(dns_zone_create(&zone, mctx));
+ CHECK(dns_zone_create(&zone, mctx, 0));
CHECK(dns_zone_setorigin(zone, name));
CHECK(dns_zonemgr_managezone(named_g_server->zonemgr, zone));
dns_zone_setclass(zone, view->rdclass);
element = cfg_list_next(element))
{
const cfg_obj_t *zconfig = cfg_listelt_value(element);
- CHECK(configure_zone(config, zconfig, vconfig, mctx, view,
- viewlist, kasplist, actx, false,
- old_rpz_ok, false));
+ CHECK(configure_zone(config, zconfig, vconfig, view, viewlist,
+ kasplist, actx, false, old_rpz_ok, false));
}
zones_configured = true;
* from the newzone file for zones that were added during previous
* runs.
*/
- CHECK(configure_newzones(view, config, vconfig, mctx, actx));
+ CHECK(configure_newzones(view, config, vconfig, actx));
/*
* Create Dynamically Loadable Zone driver.
*/
static isc_result_t
configure_zone(const cfg_obj_t *config, const cfg_obj_t *zconfig,
- const cfg_obj_t *vconfig, isc_mem_t *mctx, dns_view_t *view,
+ const cfg_obj_t *vconfig, dns_view_t *view,
dns_viewlist_t *viewlist, dns_kasplist_t *kasplist,
cfg_aclconfctx_t *aclconf, bool added, bool old_rpz_ok,
bool modify) {
if (inline_signing) {
dns_zone_getraw(zone, &raw);
if (raw == NULL) {
- CHECK(dns_zone_create(&raw, mctx));
+ CHECK(dns_zone_create(&raw, dns_zone_getmem(zone),
+ dns_zone_gettid(zone)));
CHECK(dns_zone_setorigin(raw, origin));
dns_zone_setview(raw, view);
dns_zone_setstats(raw, named_g_server->zonestats);
static isc_result_t
configure_newzones(dns_view_t *view, cfg_obj_t *config, cfg_obj_t *vconfig,
- isc_mem_t *mctx, cfg_aclconfctx_t *actx) {
+ cfg_aclconfctx_t *actx) {
isc_result_t result;
ns_cfgctx_t *nzctx;
const cfg_obj_t *zonelist;
element = cfg_list_next(element))
{
const cfg_obj_t *zconfig = cfg_listelt_value(element);
- CHECK(configure_zone(config, zconfig, vconfig, mctx, view,
+ CHECK(configure_zone(config, zconfig, vconfig, view,
&named_g_server->viewlist,
&named_g_server->kasplist, actx, true,
false, false));
*/
typedef isc_result_t (*newzone_cfg_cb_t)(const cfg_obj_t *zconfig,
cfg_obj_t *config, cfg_obj_t *vconfig,
- isc_mem_t *mctx, dns_view_t *view,
+ dns_view_t *view,
cfg_aclconfctx_t *actx);
/*%
*/
static isc_result_t
for_all_newzone_cfgs(newzone_cfg_cb_t callback, cfg_obj_t *config,
- cfg_obj_t *vconfig, isc_mem_t *mctx, dns_view_t *view,
+ cfg_obj_t *vconfig, dns_view_t *view,
cfg_aclconfctx_t *actx, MDB_txn *txn, MDB_dbi dbi) {
const cfg_obj_t *zconfig, *zlist;
isc_result_t result = ISC_R_SUCCESS;
/*
* Invoke callback.
*/
- result = callback(zconfig, config, vconfig, mctx, view, actx);
+ result = callback(zconfig, config, vconfig, view, actx);
if (result != ISC_R_SUCCESS) {
break;
}
*/
static isc_result_t
configure_newzone(const cfg_obj_t *zconfig, cfg_obj_t *config,
- cfg_obj_t *vconfig, isc_mem_t *mctx, dns_view_t *view,
+ cfg_obj_t *vconfig, dns_view_t *view,
cfg_aclconfctx_t *actx) {
return (configure_zone(
- config, zconfig, vconfig, mctx, view, &named_g_server->viewlist,
+ config, zconfig, vconfig, view, &named_g_server->viewlist,
&named_g_server->kasplist, actx, true, false, false));
}
*/
static isc_result_t
configure_newzone_revert(const cfg_obj_t *zconfig, cfg_obj_t *config,
- cfg_obj_t *vconfig, isc_mem_t *mctx, dns_view_t *view,
+ cfg_obj_t *vconfig, dns_view_t *view,
cfg_aclconfctx_t *actx) {
UNUSED(config);
UNUSED(vconfig);
- UNUSED(mctx);
UNUSED(actx);
configure_zone_setviewcommit(ISC_R_FAILURE, zconfig, view);
static isc_result_t
configure_newzones(dns_view_t *view, cfg_obj_t *config, cfg_obj_t *vconfig,
- isc_mem_t *mctx, cfg_aclconfctx_t *actx) {
+ cfg_aclconfctx_t *actx) {
isc_result_t result;
MDB_txn *txn = NULL;
MDB_dbi dbi;
"for view '%s'",
view->new_zone_db, view->name);
- result = for_all_newzone_cfgs(configure_newzone, config, vconfig, mctx,
- view, actx, txn, dbi);
+ result = for_all_newzone_cfgs(configure_newzone, config, vconfig, view,
+ actx, txn, dbi);
if (result != ISC_R_SUCCESS) {
/*
* An error was encountered while attempting to configure zones
* terms of trying to make things right.
*/
(void)for_all_newzone_cfgs(configure_newzone_revert, config,
- vconfig, mctx, view, actx, txn, dbi);
+ vconfig, view, actx, txn, dbi);
}
(void)nzd_close(&txn, false);
/* Mark view unfrozen and configure zone */
dns_view_thaw(view);
- result = configure_zone(cfg->config, zoneobj, cfg->vconfig,
- server->mctx, view, &server->viewlist,
- &server->kasplist, cfg->actx, true, false,
- false);
+ result = configure_zone(cfg->config, zoneobj, cfg->vconfig, view,
+ &server->viewlist, &server->kasplist, cfg->actx,
+ true, false, false);
dns_view_freeze(view);
isc_task_endexclusive(server->task);
/* Reconfigure the zone */
dns_view_thaw(view);
- result = configure_zone(cfg->config, zoneobj, cfg->vconfig,
- server->mctx, view, &server->viewlist,
- &server->kasplist, cfg->actx, true, false,
- true);
+ result = configure_zone(cfg->config, zoneobj, cfg->vconfig, view,
+ &server->viewlist, &server->kasplist, cfg->actx,
+ true, false, true);
dns_view_freeze(view);
exclusive = false;
isc_rwlock_t dblock;
dns_db_t *db; /* Locked by dblock */
+ unsigned int tid;
+
/* Locked */
dns_zonemgr_t *zmgr;
ISC_LINK(dns_zone_t) link; /* Used by zmgr. */
isc_taskmgr_t *taskmgr;
isc_timermgr_t *timermgr;
isc_nm_t *netmgr;
+ unsigned int workers;
atomic_uint_fast32_t nzonetasks;
isc_pool_t *zonetasks;
atomic_uint_fast32_t nloadtasks;
***/
isc_result_t
-dns_zone_create(dns_zone_t **zonep, isc_mem_t *mctx) {
+dns_zone_create(dns_zone_t **zonep, isc_mem_t *mctx, unsigned int tid) {
isc_result_t result;
isc_time_t now;
dns_zone_t *zone = NULL;
- dns_zone_t z = { .masterformat = dns_masterformat_none,
- .journalsize = -1,
- .rdclass = dns_rdataclass_none,
- .type = dns_zone_none,
- .refresh = DNS_ZONE_DEFAULTREFRESH,
- .retry = DNS_ZONE_DEFAULTRETRY,
- .maxrefresh = DNS_ZONE_MAXREFRESH,
- .minrefresh = DNS_ZONE_MINREFRESH,
- .maxretry = DNS_ZONE_MAXRETRY,
- .minretry = DNS_ZONE_MINRETRY,
- .notifytype = dns_notifytype_yes,
- .zero_no_soa_ttl = true,
- .check_names = dns_severity_ignore,
- .idlein = DNS_DEFAULT_IDLEIN,
- .idleout = DNS_DEFAULT_IDLEOUT,
- .notifysrc4dscp = -1,
- .notifysrc6dscp = -1,
- .parentalsrc4dscp = -1,
- .parentalsrc6dscp = -1,
- .xfrsource4dscp = -1,
- .xfrsource6dscp = -1,
- .altxfrsource4dscp = -1,
- .altxfrsource6dscp = -1,
- .maxxfrin = MAX_XFER_TIME,
- .maxxfrout = MAX_XFER_TIME,
- .sigvalidityinterval = 30 * 24 * 3600,
- .sigresigninginterval = 7 * 24 * 3600,
- .statlevel = dns_zonestat_none,
- .notifydelay = 5,
- .signatures = 10,
- .nodes = 100,
- .privatetype = (dns_rdatatype_t)0xffffU,
- .rpz_num = DNS_RPZ_INVALID_NUM,
- .requestixfr = true,
- .ixfr_ratio = 100,
- .requestexpire = true,
- .updatemethod = dns_updatemethod_increment,
- .magic = ZONE_MAGIC };
+ dns_zone_t z = {
+ .masterformat = dns_masterformat_none,
+ .journalsize = -1,
+ .rdclass = dns_rdataclass_none,
+ .type = dns_zone_none,
+ .refresh = DNS_ZONE_DEFAULTREFRESH,
+ .retry = DNS_ZONE_DEFAULTRETRY,
+ .maxrefresh = DNS_ZONE_MAXREFRESH,
+ .minrefresh = DNS_ZONE_MINREFRESH,
+ .maxretry = DNS_ZONE_MAXRETRY,
+ .minretry = DNS_ZONE_MINRETRY,
+ .notifytype = dns_notifytype_yes,
+ .zero_no_soa_ttl = true,
+ .check_names = dns_severity_ignore,
+ .idlein = DNS_DEFAULT_IDLEIN,
+ .idleout = DNS_DEFAULT_IDLEOUT,
+ .notifysrc4dscp = -1,
+ .notifysrc6dscp = -1,
+ .parentalsrc4dscp = -1,
+ .parentalsrc6dscp = -1,
+ .xfrsource4dscp = -1,
+ .xfrsource6dscp = -1,
+ .altxfrsource4dscp = -1,
+ .altxfrsource6dscp = -1,
+ .maxxfrin = MAX_XFER_TIME,
+ .maxxfrout = MAX_XFER_TIME,
+ .sigvalidityinterval = 30 * 24 * 3600,
+ .sigresigninginterval = 7 * 24 * 3600,
+ .statlevel = dns_zonestat_none,
+ .notifydelay = 5,
+ .signatures = 10,
+ .nodes = 100,
+ .privatetype = (dns_rdatatype_t)0xffffU,
+ .rpz_num = DNS_RPZ_INVALID_NUM,
+ .requestixfr = true,
+ .ixfr_ratio = 100,
+ .requestexpire = true,
+ .updatemethod = dns_updatemethod_increment,
+ .tid = tid,
+ };
REQUIRE(zonep != NULL && *zonep == NULL);
REQUIRE(mctx != NULL);
goto free_refs;
}
+ zone->magic = ZONE_MAGIC;
+
/* Must be after magic is set. */
dns_zone_setdbtype(zone, dbargc_default, dbargv_default);
isc_result_t result;
isc_mem_t *mctx = NULL;
dns_zone_t *zone = NULL;
- void *item;
+ unsigned int tid;
REQUIRE(DNS_ZONEMGR_VALID(zmgr));
REQUIRE(zonep != NULL && *zonep == NULL);
return (ISC_R_FAILURE);
}
- item = isc_pool_get(zmgr->mctxpool);
- if (item == NULL) {
+ tid = isc_random_uniform(zmgr->workers);
+
+ mctx = isc_pool_get(zmgr->mctxpool, tid);
+ if (mctx == NULL) {
return (ISC_R_FAILURE);
}
- isc_mem_attach((isc_mem_t *)item, &mctx);
- result = dns_zone_create(&zone, mctx);
- isc_mem_detach(&mctx);
+ result = dns_zone_create(&zone, mctx, tid);
if (result == ISC_R_SUCCESS) {
*zonep = zone;
REQUIRE(zone->timer == NULL);
REQUIRE(zone->zmgr == NULL);
- isc_task_attach(isc_pool_get(zmgr->zonetasks), &zone->task);
- isc_task_attach(isc_pool_get(zmgr->loadtasks), &zone->loadtask);
+ isc_task_attach(isc_pool_get(zmgr->zonetasks, zone->tid), &zone->task);
+ isc_task_attach(isc_pool_get(zmgr->loadtasks, zone->tid),
+ &zone->loadtask);
/*
* Set the task name. The tag will arbitrarily point to one
zonemgr_setsize(dns_zonemgr_t *zmgr, unsigned int workers) {
isc_result_t result;
+ zmgr->workers = workers;
+
/* Create the zone tasks pool. */
REQUIRE(zmgr->zonetasks == NULL);
result = isc_pool_create(zmgr->mctx, workers, taskfree, zonetaskinit,
RWUNLOCK(&zmgr->rwlock, isc_rwlocktype_write);
}
+
+isc_mem_t *
+dns_zone_getmem(dns_zone_t *zone) {
+ return (zone->mctx);
+}
+
+unsigned int
+dns_zone_gettid(dns_zone_t *zone) {
+ return (zone->tid);
+}