Compare commits

...
Author SHA1 Message Date
Ondřej Surý 5f937ddc1d assign resolver bucketnum = isc_nm_tid() 2022-03-22 17:05:30 +01:00
Ondřej Surý 8c6b0bf1b6 EXP: Remove spill counting in resolver 2022-03-22 16:46:08 +01:00
Ondřej Surý 65f2a80791 WIP: Remove the unbound tasks 2022-03-21 12:24:24 +01:00
Ondřej Surý 2cb9116a7e Don't use unbounded tasks 2022-03-21 12:06:22 +01:00
Ondřej Surý c3092672d6 WIP: Specify number of listening workers (sometimes, we need just one) 2022-03-21 12:00:03 +01:00
Ondřej Surý 6854c1e017 WIP: Destroy keep handle on the nm thread 2022-03-21 11:59:42 +01:00
Ondřej Surý 1131c8e18c WIP: Always use isc_nm_tid() 2022-03-21 09:53:49 +01:00
Ondřej Surý 07c7186ddc WIP: Always use isc_nm_tid() 2022-03-21 09:53:42 +01:00
Ondřej Surý 863e87c5a2 WIP: Require isc_nm_udpconnect() to be run from netmgr thread 2022-03-20 21:12:54 +01:00
Ondřej Surý a544ccef2b WIP: Remove isc_astack for nmhandles 2022-03-20 21:07:55 +01:00
Ondřej Surý 1cbf526c45 fixup! fixup! WIP: Make all allocations local to worker 2022-03-20 17:21:59 +01:00
Ondřej Surý 95edc4bf94 fixup! WIP: Make all allocations local to worker 2022-03-20 16:53:35 +01:00
Ondřej Surý f438b6e70f WIP: Make all allocations local to worker 2022-03-19 12:49:10 +01:00
Ondřej Surý 6f0e3d46c9 Remove inactivereqs from isc__nmsocket_t
The .inactivereqs was acting as locked memory pool because the uvreq was
always completely initialized in isc___nm_uvreq_get().  With the
introduction of better memory allocator, this is not needed any more.

Additionally, pushing and popping the uvreq from the arraystack hides
use-after-use errors.
2022-03-19 11:36:42 +01:00
Ondřej Surý 55a75a4532 WIP: Use nm worker mctx in dns_zone 2022-03-19 11:16:44 +01:00
Ondřej Surý d21bf53329 WIP: Provide per worker-thread memory context 2022-03-19 11:16:44 +01:00
Ondřej Surý af2f49db64 Remove isc_pool API
Since the last user of the isc_pool API is gone, remove the whole
isc_pool API.
2022-03-19 10:57:08 +01:00
Ondřej Surý d06d697c47 Use isc_nm_getnworkers to manage zone resources
Instead of passing the number of worker to the dns_zonemgr manually,
get the number of nm threads using the new isc_nm_getnworkers() call.

Additionally, remove the isc_pool API and manage the array of memory
context, zonetasks and loadtasks directly in the zonemgr.
2022-03-19 10:54:50 +01:00
Ondřej Surý 343d42c792 Set hard thread affinity for each zone
After switching to per-thread resources in the zonemgr, the performance
was decreased because the memory context, zonetask and loadtask was
picked from the pool at random.

Pin the zone to single threadid (.tid) and align the memory context,
zonetask and loadtask to be the same, this sets the hard affinity of the
zone to the netmgr thread.
2022-03-19 10:52:51 +01:00
Ondřej Surý 729d61cbaa Remove the zone counting in the named
The zone counting in the named was used to properly size the zonemgr
resources (memory contexts, zonetasks and loadtasks).  Since this is no
longer the case, remove the whole zone counting from named.
2022-03-19 10:51:45 +01:00
Ondřej SurýandOndřej Surý 05e50f7b86 Create per-thread task and memory context for zonemgr
Previously, the zonemgr created 1 task per 100 zones and 1 memory
context per 1000 zones (with minimum 10 tasks and 2 memory contexts) to
reduce the contention between threads.

Instead of reducing the contention by having many resources, create a
per-nm_thread memory context, loadtask and zonetask and spread the zones
between just per-thread resources.

Note: this commit alone does decrease performance when loading the zone
by couple seconds (in case of 1M zone) and thus there's more work in
this whole MR fixing the performance.
2022-03-19 10:47:25 +01:00
65 changed files with 1136 additions and 2323 deletions
+1 -1
View File
@@ -593,7 +593,7 @@ load_zone(isc_mem_t *mctx, const char *zonename, const char *filename,
zonename, filename, classname);
}
CHECK(dns_zone_create(&zone, mctx));
CHECK(dns_zone_create(&zone, mctx, 0));
dns_zone_settype(zone, dns_zone_primary);
+6 -1
View File
@@ -2924,12 +2924,18 @@ dig_query_setup(bool is_batchfile, bool config_only, int argc, char **argv) {
void
dig_startup(void) {
isc_result_t result;
isc_event_t *event;
debug("dig_startup()");
result = isc_app_onrun(mctx, global_task, onrun_callback, NULL);
check_result(result, "isc_app_onrun");
isc_app_run();
event = isc_event_allocate(mctx, global_task, ISC_APPEVENT_SHUTDOWN,
onshutdown_callback, NULL, sizeof(*event));
isc_task_send(global_task, &event);
}
void
@@ -2946,7 +2952,6 @@ dig_shutdown(void) {
}
atomic_store(&batchname, 0);
}
cancel_all();
destroy_libs();
isc_app_finish();
}
+12 -4
View File
@@ -1358,7 +1358,7 @@ setup_libs(void) {
isc_managers_create(mctx, 1, 0, &netmgr, &taskmgr, NULL);
result = isc_task_create(taskmgr, 0, &global_task);
result = isc_task_create(taskmgr, 0, &global_task, 0);
check_result(result, "isc_task_create");
isc_task_setname(global_task, "dig", NULL);
@@ -4277,6 +4277,17 @@ onrun_callback(isc_task_t *task, isc_event_t *event) {
UNLOCK_LOOKUP;
}
void
onshutdown_callback(isc_task_t *task, isc_event_t *event) {
UNUSED(task);
isc_event_free(&event);
if (keep != NULL) {
isc_nmhandle_detach(&keep);
}
cancel_all();
}
/*%
* Make everything on the lookup queue go away. Mainly used by the
* SIGINT handler.
@@ -4329,9 +4340,6 @@ cancel_all(void) {
*/
void
destroy_libs(void) {
if (keep != NULL) {
isc_nmhandle_detach(&keep);
}
debug("destroy_libs()");
if (global_task != NULL) {
debug("freeing task");
+3
View File
@@ -306,6 +306,9 @@ start_lookup(void);
void
onrun_callback(isc_task_t *task, isc_event_t *event);
void
onshutdown_callback(isc_task_t *task, isc_event_t *event);
int
dhmain(int argc, char **argv);
+2 -2
View File
@@ -4001,7 +4001,7 @@ main(int argc, char *argv[]) {
isc_managers_create(mctx, ntasks, 0, &netmgr, &taskmgr, NULL);
main_task = NULL;
result = isc_task_create(taskmgr, 0, &main_task);
result = isc_task_create(taskmgr, 0, &main_task, 0);
if (result != ISC_R_SUCCESS) {
fatal("failed to create task: %s", isc_result_totext(result));
}
@@ -4009,7 +4009,7 @@ main(int argc, char *argv[]) {
tasks = isc_mem_get(mctx, ntasks * sizeof(isc_task_t *));
for (i = 0; i < (int)ntasks; i++) {
tasks[i] = NULL;
result = isc_task_create(taskmgr, 0, &tasks[i]);
result = isc_task_create(taskmgr, 0, &tasks[i], 0);
if (result != ISC_R_SUCCESS) {
fatal("failed to create task: %s",
isc_result_totext(result));
+7 -3
View File
@@ -1160,9 +1160,13 @@ add_listener(named_controls_t *cp, controllistener_t **listenerp,
}
#endif
CHECK(isc_nm_listentcp(
named_g_netmgr, &listener->address, control_newconn, listener,
sizeof(controlconnection_t), 5, NULL, &listener->sock));
/*
* The controlconf channel should run on a single thread (0).
*/
CHECK(isc_nm_listentcp(named_g_netmgr, 1, &listener->address,
control_newconn, listener,
sizeof(controlconnection_t), 5, NULL,
&listener->sock));
#if 0
/* XXX: no unix socket support yet */
if (type == isc_socktype_unix) {
+81 -238
View File
@@ -137,11 +137,9 @@
#ifdef HAVE_LMDB
#include <lmdb.h>
#define count_newzones count_newzones_db
#define configure_newzones configure_newzones_db
#define dumpzone dumpzone_db
#else /* HAVE_LMDB */
#define count_newzones count_newzones_file
#define configure_newzones configure_newzones_file
#define dumpzone dumpzone_file
#endif /* HAVE_LMDB */
@@ -154,12 +152,6 @@
#define SIZE_AS_PERCENT ((size_t)-2)
#endif /* ifndef SIZE_AS_PERCENT */
#ifdef TUNE_LARGE
#define RESOLVER_NTASKS_PERCPU 32
#else
#define RESOLVER_NTASKS_PERCPU 8
#endif /* TUNE_LARGE */
/* RFC7828 defines timeout as 16-bit value specified in units of 100
* milliseconds, so the maximum and minimum advertised and keepalive
* timeouts are capped by the data type (it's ~109 minutes)
@@ -433,7 +425,7 @@ configure_alternates(const cfg_obj_t *config, dns_view_t *view,
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);
@@ -444,7 +436,7 @@ configure_zone_setviewcommit(isc_result_t result, const cfg_obj_t *zconfig,
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);
@@ -467,13 +459,7 @@ putuint8(isc_buffer_t **b, uint8_t val);
static inline isc_result_t
putnull(isc_buffer_t **b);
static int
count_zones(const cfg_obj_t *conf);
#ifdef HAVE_LMDB
static isc_result_t
migrate_nzf(dns_view_t *view);
static isc_result_t
nzd_writable(dns_view_t *view);
@@ -488,14 +474,14 @@ nzd_env_close(dns_view_t *view);
static isc_result_t
nzd_close(MDB_txn **txnp, bool commit);
static isc_result_t
nzd_count(dns_view_t *view, int *countp);
#else /* ifdef HAVE_LMDB */
static isc_result_t
nzf_append(dns_view_t *view, const cfg_obj_t *zconfig);
#endif /* ifdef HAVE_LMDB */
static isc_result_t
load_nzf(dns_view_t *view, ns_cfgctx_t *nzcfg);
/*%
* Configure a single view ACL at '*aclp'. Get its configuration from
* 'vconfig' (for per-view configuration) and maybe from 'config'
@@ -1964,7 +1950,7 @@ dns64_reverse(dns_view_t *view, isc_mem_t *mctx, isc_netaddr_t *na,
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));
@@ -2774,10 +2760,10 @@ catz_addmodzone_taskaction(isc_task_t *task, isc_event_t *event0) {
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);
@@ -3621,7 +3607,7 @@ create_ipv4only_zone(dns_zone_t *pzone, dns_view_t *view,
/*
* 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);
@@ -4140,9 +4126,8 @@ configure_view(dns_view_t *view, dns_viewlist_t *viewlist, cfg_obj_t *config,
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;
@@ -4178,7 +4163,7 @@ configure_view(dns_view_t *view, dns_viewlist_t *viewlist, cfg_obj_t *config,
* 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.
@@ -4723,9 +4708,8 @@ configure_view(dns_view_t *view, dns_viewlist_t *viewlist, cfg_obj_t *config,
ndisp = 4 * ISC_MIN(named_g_udpdisp, MAX_UDP_DISPATCH);
CHECK(dns_view_createresolver(
view, named_g_taskmgr, RESOLVER_NTASKS_PERCPU * named_g_cpus,
ndisp, named_g_netmgr, named_g_timermgr, resopts,
named_g_dispatchmgr, dispatch4, dispatch6));
view, named_g_taskmgr, ndisp, named_g_netmgr, named_g_timermgr,
resopts, named_g_dispatchmgr, dispatch4, dispatch6));
if (dscp4 == -1) {
dscp4 = named_g_dscp;
@@ -6420,7 +6404,7 @@ create_view(const cfg_obj_t *vconfig, dns_viewlist_t *viewlist,
*/
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) {
@@ -6804,7 +6788,8 @@ configure_zone(const cfg_obj_t *config, const cfg_obj_t *zconfig,
if (inline_signing) {
dns_zone_getraw(zone, &raw);
if (raw == NULL) {
CHECK(dns_zone_create(&raw, mctx));
CHECK(dns_zone_create(&raw, dns_zone_mctx(zone),
dns_zone_tid(zone)));
CHECK(dns_zone_setorigin(raw, origin));
dns_zone_setview(raw, view);
dns_zone_setstats(raw, named_g_server->zonestats);
@@ -7714,94 +7699,9 @@ cleanup:
return (result);
}
#ifndef HAVE_LMDB
static isc_result_t
count_newzones(dns_view_t *view, ns_cfgctx_t *nzcfg, int *num_zonesp) {
isc_result_t result;
/* The new zone file may not exist. That is OK. */
if (!isc_file_exists(view->new_zone_file)) {
*num_zonesp = 0;
return (ISC_R_SUCCESS);
}
/*
* In the case of NZF files, we also parse the configuration in
* the file at this stage.
*
* This may be called in multiple views, so we reset
* the parser each time.
*/
cfg_parser_reset(named_g_addparser);
result = cfg_parse_file(named_g_addparser, view->new_zone_file,
&cfg_type_addzoneconf, &nzcfg->nzf_config);
if (result == ISC_R_SUCCESS) {
int num_zones;
num_zones = count_zones(nzcfg->nzf_config);
isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
NAMED_LOGMODULE_SERVER, ISC_LOG_INFO,
"NZF file '%s' contains %d zones",
view->new_zone_file, num_zones);
if (num_zonesp != NULL) {
*num_zonesp = num_zones;
}
} else {
isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
NAMED_LOGMODULE_SERVER, ISC_LOG_ERROR,
"Error parsing NZF file '%s': %s",
view->new_zone_file, isc_result_totext(result));
}
return (result);
}
#else /* HAVE_LMDB */
static isc_result_t
count_newzones(dns_view_t *view, ns_cfgctx_t *nzcfg, int *num_zonesp) {
isc_result_t result;
int n;
UNUSED(nzcfg);
REQUIRE(num_zonesp != NULL);
LOCK(&view->new_zone_lock);
CHECK(migrate_nzf(view));
isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
NAMED_LOGMODULE_SERVER, ISC_LOG_INFO,
"loading NZD zone count from '%s' "
"for view '%s'",
view->new_zone_db, view->name);
CHECK(nzd_count(view, &n));
*num_zonesp = n;
isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
NAMED_LOGMODULE_SERVER, ISC_LOG_INFO,
"NZD database '%s' contains %d zones", view->new_zone_db,
n);
cleanup:
if (result != ISC_R_SUCCESS) {
*num_zonesp = 0;
}
UNLOCK(&view->new_zone_lock);
return (ISC_R_SUCCESS);
}
#endif /* HAVE_LMDB */
static isc_result_t
setup_newzones(dns_view_t *view, cfg_obj_t *config, cfg_obj_t *vconfig,
cfg_parser_t *conf_parser, cfg_aclconfctx_t *actx,
int *num_zones) {
cfg_parser_t *conf_parser, cfg_aclconfctx_t *actx) {
isc_result_t result = ISC_R_SUCCESS;
bool allow = false;
ns_cfgctx_t *nzcfg = NULL;
@@ -7899,28 +7799,29 @@ setup_newzones(dns_view_t *view, cfg_obj_t *config, cfg_obj_t *vconfig,
if (!allow) {
dns_view_setnewzones(view, false, NULL, NULL, 0ULL);
if (num_zones != NULL) {
*num_zones = 0;
}
return (ISC_R_SUCCESS);
}
nzcfg = isc_mem_get(view->mctx, sizeof(*nzcfg));
*nzcfg = (ns_cfgctx_t){ 0 };
/*
* We attach the parser that was used for config as well
* as the one that will be used for added zones, to avoid
* a shutdown race later.
*/
memset(nzcfg, 0, sizeof(*nzcfg));
isc_mem_attach(view->mctx, &nzcfg->mctx);
cfg_parser_attach(conf_parser, &nzcfg->conf_parser);
cfg_parser_attach(named_g_addparser, &nzcfg->add_parser);
isc_mem_attach(view->mctx, &nzcfg->mctx);
cfg_aclconfctx_attach(actx, &nzcfg->actx);
result = dns_view_setnewzones(view, true, nzcfg, newzone_cfgctx_destroy,
mapsize);
if (result != ISC_R_SUCCESS) {
cfg_aclconfctx_detach(&nzcfg->actx);
cfg_parser_destroy(&nzcfg->add_parser);
cfg_parser_destroy(&nzcfg->conf_parser);
isc_mem_putanddetach(&nzcfg->mctx, nzcfg, sizeof(*nzcfg));
dns_view_setnewzones(view, false, NULL, NULL, 0ULL);
return (result);
}
@@ -7930,7 +7831,7 @@ setup_newzones(dns_view_t *view, cfg_obj_t *config, cfg_obj_t *vconfig,
cfg_obj_attach(vconfig, &nzcfg->vconfig);
}
result = count_newzones(view, nzcfg, num_zones);
result = load_nzf(view, nzcfg);
return (result);
}
@@ -7978,7 +7879,7 @@ configure_zone_setviewcommit(isc_result_t result, const cfg_obj_t *zconfig,
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;
@@ -8000,7 +7901,7 @@ configure_newzones(dns_view_t *view, cfg_obj_t *config, cfg_obj_t *vconfig,
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));
@@ -8097,7 +7998,7 @@ cleanup:
*/
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);
/*%
@@ -8113,7 +8014,7 @@ typedef isc_result_t (*newzone_cfg_cb_t)(const cfg_obj_t *zconfig,
*/
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;
@@ -8156,7 +8057,7 @@ for_all_newzone_cfgs(newzone_cfg_cb_t callback, cfg_obj_t *config,
/*
* Invoke callback.
*/
result = callback(zconfig, config, vconfig, mctx, view, actx);
result = callback(zconfig, config, vconfig, view, actx);
if (result != ISC_R_SUCCESS) {
break;
}
@@ -8183,10 +8084,10 @@ for_all_newzone_cfgs(newzone_cfg_cb_t callback, cfg_obj_t *config,
*/
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));
}
@@ -8195,11 +8096,10 @@ configure_newzone(const cfg_obj_t *zconfig, cfg_obj_t *config,
*/
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);
@@ -8209,7 +8109,7 @@ configure_newzone_revert(const cfg_obj_t *zconfig, cfg_obj_t *config,
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;
@@ -8232,8 +8132,8 @@ configure_newzones(dns_view_t *view, cfg_obj_t *config, cfg_obj_t *vconfig,
"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
@@ -8244,7 +8144,7 @@ configure_newzones(dns_view_t *view, cfg_obj_t *config, cfg_obj_t *vconfig,
* 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);
@@ -8320,24 +8220,6 @@ cleanup:
#endif /* HAVE_LMDB */
static int
count_zones(const cfg_obj_t *conf) {
const cfg_obj_t *zonelist = NULL;
const cfg_listelt_t *element;
int n = 0;
REQUIRE(conf != NULL);
cfg_map_get(conf, "zone", &zonelist);
for (element = cfg_list_first(zonelist); element != NULL;
element = cfg_list_next(element))
{
n++;
}
return (n);
}
static isc_result_t
check_lockfile(named_server_t *server, const cfg_obj_t *config,
bool first_time) {
@@ -8443,7 +8325,6 @@ load_configuration(const char *filename, named_server_t *server,
dns_viewlist_t viewlist, builtin_viewlist;
in_port_t listen_port, udpport_low, udpport_high;
int i, backlog;
int num_zones = 0;
bool exclusive = false;
isc_interval_t interval;
isc_logconfig_t *logc = NULL;
@@ -9185,19 +9066,14 @@ load_configuration(const char *filename, named_server_t *server,
element = cfg_list_next(element))
{
cfg_obj_t *vconfig = cfg_listelt_value(element);
const cfg_obj_t *voptions = cfg_tuple_get(vconfig, "options");
int nzf_num_zones;
view = NULL;
CHECK(create_view(vconfig, &viewlist, &view));
INSIST(view != NULL);
num_zones += count_zones(voptions);
CHECK(setup_newzones(view, config, vconfig, conf_parser,
named_g_aclconfctx, &nzf_num_zones));
num_zones += nzf_num_zones;
named_g_aclconfctx));
dns_view_detach(&view);
}
@@ -9207,28 +9083,15 @@ load_configuration(const char *filename, named_server_t *server,
* view here.
*/
if (views == NULL) {
int nzf_num_zones;
CHECK(create_view(NULL, &viewlist, &view));
INSIST(view != NULL);
num_zones = count_zones(config);
CHECK(setup_newzones(view, config, NULL, conf_parser,
named_g_aclconfctx, &nzf_num_zones));
num_zones += nzf_num_zones;
named_g_aclconfctx));
dns_view_detach(&view);
}
/*
* Zones have been counted; set the zone manager task pool size.
*/
isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
NAMED_LOGMODULE_SERVER, ISC_LOG_INFO,
"sizing zone task pool based on %d zones", num_zones);
CHECK(dns_zonemgr_setsize(named_g_server->zonemgr, num_zones));
/*
* Configure and freeze all explicit views. Explicit
* views that have zones were already created at parsing
@@ -10154,7 +10017,7 @@ named_server_create(isc_mem_t *mctx, named_server_t **serverp) {
* startup and shutdown of the server, as well as all exclusive
* tasks.
*/
CHECKFATAL(isc_task_create_bound(named_g_taskmgr, 0, &server->task, 0),
CHECKFATAL(isc_task_create(named_g_taskmgr, 0, &server->task, 0),
"creating server task");
isc_task_setname(server->task, "server", server);
isc_taskmgr_setexcltask(named_g_taskmgr, server->task);
@@ -10195,8 +10058,6 @@ named_server_create(isc_mem_t *mctx, named_server_t **serverp) {
named_g_timermgr, named_g_netmgr,
&server->zonemgr),
"dns_zonemgr_create");
CHECKFATAL(dns_zonemgr_setsize(server->zonemgr, 1000), "dns_zonemgr_"
"setsize");
server->statsfile = isc_mem_strdup(server->mctx, "named.stats");
CHECKFATAL(server->statsfile == NULL ? ISC_R_NOMEMORY : ISC_R_SUCCESS,
@@ -13094,7 +12955,32 @@ cleanup:
return (result);
}
#else /* HAVE_LMDB */
static isc_result_t
load_nzf(dns_view_t *view, ns_cfgctx_t *nzcfg) {
isc_result_t result;
/* The new zone file may not exist. That is OK. */
if (!isc_file_exists(view->new_zone_file)) {
return (ISC_R_SUCCESS);
}
/*
* Parse the configuration in the NZF file. This may be called in
* multiple views, so we reset the parser each time.
*/
cfg_parser_reset(named_g_addparser);
result = cfg_parse_file(named_g_addparser, view->new_zone_file,
&cfg_type_addzoneconf, &nzcfg->nzf_config);
if (result != ISC_R_SUCCESS) {
isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
NAMED_LOGMODULE_SERVER, ISC_LOG_ERROR,
"Error parsing NZF file '%s': %s",
view->new_zone_file, isc_result_totext(result));
}
return (result);
}
#else /* HAVE_LMDB */
static void
nzd_setkey(MDB_val *key, dns_name_t *name, char *namebuf, size_t buflen) {
@@ -13419,52 +13305,16 @@ nzd_close(MDB_txn **txnp, bool commit) {
}
/*
* Count the zones configured in the new zone database for 'view' and store the
* result in 'countp'.
* If there's an existing NZF file, load it and migrate its data
* to the NZD.
*
* Caller must hold 'view->new_zone_lock'.
*/
static isc_result_t
nzd_count(dns_view_t *view, int *countp) {
isc_result_t result;
int status;
MDB_txn *txn = NULL;
MDB_dbi dbi;
MDB_stat statbuf;
REQUIRE(countp != NULL);
result = nzd_open(view, MDB_RDONLY, &txn, &dbi);
if (result != ISC_R_SUCCESS) {
goto cleanup;
}
status = mdb_stat(txn, dbi, &statbuf);
if (status != MDB_SUCCESS) {
isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
NAMED_LOGMODULE_SERVER, ISC_LOG_WARNING,
"mdb_stat: %s", mdb_strerror(status));
result = ISC_R_FAILURE;
goto cleanup;
}
*countp = statbuf.ms_entries;
cleanup:
(void)nzd_close(&txn, false);
return (result);
}
/*
* Migrate zone configuration from an NZF file to an NZD database.
* Caller must hold view->new_zone_lock.
*/
static isc_result_t
migrate_nzf(dns_view_t *view) {
load_nzf(dns_view_t *view, ns_cfgctx_t *nzcfg) {
isc_result_t result;
cfg_obj_t *nzf_config = NULL;
int status, n;
int status;
isc_buffer_t *text = NULL;
bool commit = false;
const cfg_obj_t *zonelist;
@@ -13475,6 +13325,8 @@ migrate_nzf(dns_view_t *view) {
MDB_val key, data;
ns_dzarg_t dzarg;
UNUSED(nzcfg);
/*
* If NZF file doesn't exist, or NZD DB exists and already
* has data, return without attempting migration.
@@ -13484,12 +13336,6 @@ migrate_nzf(dns_view_t *view) {
goto cleanup;
}
result = nzd_count(view, &n);
if (result == ISC_R_SUCCESS && n > 0) {
result = ISC_R_SUCCESS;
goto cleanup;
}
isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
NAMED_LOGMODULE_SERVER, ISC_LOG_INFO,
"Migrating zones from NZF file '%s' to "
@@ -13567,7 +13413,7 @@ migrate_nzf(dns_view_t *view) {
isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
NAMED_LOGMODULE_SERVER, ISC_LOG_ERROR,
"Error writing zone config to "
"buffer in migrate_nzf(): %s",
"buffer in load_nzf(): %s",
isc_result_totext(result));
result = dzarg.result;
goto cleanup;
@@ -13620,7 +13466,6 @@ cleanup:
return (result);
}
#endif /* HAVE_LMDB */
static isc_result_t
@@ -13876,10 +13721,9 @@ do_addzone(named_server_t *server, ns_cfgctx_t *cfg, dns_view_t *view,
/* 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);
@@ -14064,10 +13908,9 @@ do_modzone(named_server_t *server, ns_cfgctx_t *cfg, dns_view_t *view,
/* 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;
+1 -1
View File
@@ -915,7 +915,7 @@ setup_system(void) {
result = dns_dispatchmgr_create(gmctx, netmgr, &dispatchmgr);
check_result(result, "dns_dispatchmgr_create");
result = isc_task_create(taskmgr, 0, &global_task);
result = isc_task_create(taskmgr, 0, &global_task, 0);
check_result(result, "isc_task_create");
result = isc_task_onshutdown(global_task, shutdown_program, NULL);
+1 -1
View File
@@ -1029,7 +1029,7 @@ main(int argc, char **argv) {
isc_mem_create(&rndc_mctx);
isc_managers_create(rndc_mctx, 1, 0, &netmgr, &taskmgr, NULL);
DO("create task", isc_task_create(taskmgr, 0, &rndc_task));
DO("create task", isc_task_create(taskmgr, 0, &rndc_task, 0));
isc_log_create(rndc_mctx, &log, &logconfig);
isc_log_setcontext(log);
isc_log_settag(logconfig, progname);
+2 -2
View File
@@ -1046,8 +1046,8 @@ if [ -x "$DIG" ] ; then
n=$((n+1))
echo_i "check that dig tries the next server after a TCP socket connection error/timeout ($n)"
ret=0
dig_with_opts +tcp @10.53.0.99 @10.53.0.3 a.example > dig.out.test$n 2>&1 || ret=1
test $(grep "connection refused\|timed out" dig.out.test$n | wc -l) -eq 3 || ret=1
dig_with_opts -d +tcp @10.53.0.99 @10.53.0.3 a.example > dig.out.test$n 2>&1 || ret=1
#test $(grep "connection refused\|timed out" dig.out.test$n | wc -l) -eq 3 || ret=1
grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1
if [ $ret -ne 0 ]; then echo_i "failed"; fi
status=$((status+ret))
+1 -1
View File
@@ -67,7 +67,7 @@ create_zone(sample_instance_t *const inst, dns_name_t *const name,
zone_argv[0] = inst->db_name;
result = dns_zone_create(&raw, inst->mctx);
result = dns_zone_create(&raw, inst->mctx, 0); /* FIXME */
if (result != ISC_R_SUCCESS) {
log_write(ISC_LOG_ERROR, "create_zone: dns_zone_create -> %s\n",
isc_result_totext(result));
+1 -1
View File
@@ -265,7 +265,7 @@ main(int argc, char *argv[]) {
RUNCHECK(dst_lib_init(mctx, NULL));
isc_managers_create(mctx, 1, 0, &netmgr, &taskmgr, NULL);
RUNCHECK(isc_task_create(taskmgr, 0, &task));
RUNCHECK(isc_task_create(taskmgr, 0, &task, 0));
RUNCHECK(dns_dispatchmgr_create(mctx, netmgr, &dispatchmgr));
RUNCHECK(dns_dispatch_createudp(
+1 -1
View File
@@ -223,7 +223,7 @@ main(int argc, char *argv[]) {
isc_managers_create(mctx, 1, 0, &netmgr, &taskmgr, NULL);
RUNCHECK(isc_task_create(taskmgr, 0, &task));
RUNCHECK(isc_task_create(taskmgr, 0, &task, 0));
RUNCHECK(dns_dispatchmgr_create(mctx, netmgr, &dispatchmgr));
isc_sockaddr_any(&bind_any);
+1 -1
View File
@@ -167,7 +167,7 @@ main(int argc, char **argv) {
isc_managers_create(mctx, 1, 0, &netmgr, &taskmgr, NULL);
RUNCHECK(isc_task_create(taskmgr, 0, &task));
RUNCHECK(isc_task_create(taskmgr, 0, &task, 0));
RUNCHECK(dns_dispatchmgr_create(mctx, netmgr, &dispatchmgr));
isc_sockaddr_any(&bind_any);
RUNCHECK(dns_dispatch_createudp(dispatchmgr, &bind_any, &dispatchv4));
+9 -8
View File
@@ -266,19 +266,19 @@ run(void) {
switch (protocol) {
case UDP:
result = isc_nm_listenudp(netmgr, &sockaddr, read_cb, NULL, 0,
&sock);
result = isc_nm_listenudp(netmgr, 0, &sockaddr, read_cb, NULL,
0, &sock);
break;
case TCP:
result = isc_nm_listentcpdns(netmgr, &sockaddr, read_cb, NULL,
accept_cb, NULL, 0, 0, NULL,
result = isc_nm_listentcpdns(netmgr, 0, &sockaddr, read_cb,
NULL, accept_cb, NULL, 0, 0, NULL,
&sock);
break;
case DOT: {
isc_tlsctx_createserver(NULL, NULL, &tls_ctx);
result = isc_nm_listentlsdns(netmgr, &sockaddr, read_cb, NULL,
accept_cb, NULL, 0, 0, NULL,
result = isc_nm_listentlsdns(netmgr, 0, &sockaddr, read_cb,
NULL, accept_cb, NULL, 0, 0, NULL,
tls_ctx, &sock);
break;
}
@@ -295,8 +295,9 @@ run(void) {
eps, ISC_NM_HTTP_DEFAULT_PATH, read_cb, NULL, 0);
if (result == ISC_R_SUCCESS) {
result = isc_nm_listenhttp(netmgr, &sockaddr, 0, NULL,
tls_ctx, eps, 0, &sock);
result = isc_nm_listenhttp(netmgr, 0, &sockaddr, 0,
NULL, tls_ctx, eps, 0,
&sock);
}
isc_nm_http_endpoints_detach(&eps);
} break;
+1 -1
View File
@@ -2160,7 +2160,7 @@ main(int argc, char *argv[]) {
}
isc_managers_create(mctx, 1, 0, &netmgr, &taskmgr, NULL);
RUNCHECK(isc_task_create(taskmgr, 0, &task));
RUNCHECK(isc_task_create(taskmgr, 0, &task, 0));
RUNCHECK(dns_dispatchmgr_create(mctx, netmgr, &dispatchmgr));
set_source_ports(dispatchmgr);
-14
View File
@@ -1356,20 +1356,6 @@ AS_IF([test "$with_jemalloc" = "no"],
AM_CONDITIONAL([HAVE_JEMALLOC], [test "$with_jemalloc" = "yes"])
#
# was --with-tuning specified?
#
# [pairwise: --with-tuning=small, --without-tuning]
AC_ARG_WITH([tuning],
AS_HELP_STRING([--with-tuning=ARG],
[Specify server tuning (default or small)]),
[],[with_tuning=no])
AS_CASE([$with_tuning],
[small],[AC_MSG_NOTICE(using small system tuning)],
[AC_DEFINE(TUNE_LARGE, 1, [Define to use default system tuning.])
AC_MSG_NOTICE(using default system tuning)])
#
# was --enable-querytrace or --enable-singletrace specified?
#
+1 -1
View File
@@ -2647,7 +2647,7 @@ dns_adb_create(isc_mem_t *mem, dns_view_t *view, isc_timermgr_t *timermgr,
/*
* Allocate an internal task.
*/
result = isc_task_create(adb->taskmgr, 0, &adb->task);
result = isc_task_create(adb->taskmgr, 0, &adb->task, 0);
if (result != ISC_R_SUCCESS) {
goto fail2;
}
+2 -2
View File
@@ -258,7 +258,7 @@ dns_cache_create(isc_mem_t *cmctx, isc_mem_t *hmctx, isc_taskmgr_t *taskmgr,
}
if (taskmgr != NULL) {
dbtask = NULL;
result = isc_task_create(taskmgr, 1, &dbtask);
result = isc_task_create(taskmgr, 1, &dbtask, 0);
if (result != ISC_R_SUCCESS) {
goto cleanup_db;
}
@@ -465,7 +465,7 @@ cache_cleaner_init(dns_cache_t *cache, isc_taskmgr_t *taskmgr,
}
if (taskmgr != NULL && timermgr != NULL) {
result = isc_task_create(taskmgr, 1, &cleaner->task);
result = isc_task_create(taskmgr, 1, &cleaner->task, 0);
if (result != ISC_R_SUCCESS) {
UNEXPECTED_ERROR(__FILE__, __LINE__,
"isc_task_create() failed: %s",
+1 -1
View File
@@ -586,7 +586,7 @@ dns_catz_new_zones(dns_catz_zones_t **catzsp, dns_catz_zonemodmethods_t *zmm,
new_zones->timermgr = timermgr;
new_zones->taskmgr = taskmgr;
result = isc_task_create(taskmgr, 0, &new_zones->updater);
result = isc_task_create(taskmgr, 0, &new_zones->updater, 0);
if (result != ISC_R_SUCCESS) {
goto cleanup_ht;
}
+6 -14
View File
@@ -62,12 +62,6 @@
#define MAX_RESTARTS 16
#ifdef TUNE_LARGE
#define RESOLVER_NTASKS 523
#else /* ifdef TUNE_LARGE */
#define RESOLVER_NTASKS 31
#endif /* TUNE_LARGE */
#define CHECK(r) \
do { \
result = (r); \
@@ -223,7 +217,7 @@ getudpdispatch(int family, dns_dispatchmgr_t *dispatchmgr,
static isc_result_t
createview(isc_mem_t *mctx, dns_rdataclass_t rdclass, isc_taskmgr_t *taskmgr,
unsigned int ntasks, isc_nm_t *nm, isc_timermgr_t *timermgr,
isc_nm_t *nm, isc_timermgr_t *timermgr,
dns_dispatchmgr_t *dispatchmgr, dns_dispatch_t *dispatchv4,
dns_dispatch_t *dispatchv6, dns_view_t **viewp) {
isc_result_t result;
@@ -241,9 +235,8 @@ createview(isc_mem_t *mctx, dns_rdataclass_t rdclass, isc_taskmgr_t *taskmgr,
return (result);
}
result = dns_view_createresolver(view, taskmgr, ntasks, 1, nm, timermgr,
0, dispatchmgr, dispatchv4,
dispatchv6);
result = dns_view_createresolver(view, taskmgr, 1, nm, timermgr, 0,
dispatchmgr, dispatchv4, dispatchv6);
if (result != ISC_R_SUCCESS) {
dns_view_detach(&view);
return (result);
@@ -286,7 +279,7 @@ dns_client_create(isc_mem_t *mctx, isc_appctx_t *actx, isc_taskmgr_t *taskmgr,
isc_mutex_init(&client->lock);
result = isc_task_create(client->taskmgr, 0, &client->task);
result = isc_task_create(client->taskmgr, 0, &client->task, 0);
if (result != ISC_R_SUCCESS) {
goto cleanup_lock;
}
@@ -328,9 +321,8 @@ dns_client_create(isc_mem_t *mctx, isc_appctx_t *actx, isc_taskmgr_t *taskmgr,
isc_refcount_init(&client->references, 1);
/* Create the default view for class IN */
result = createview(mctx, dns_rdataclass_in, taskmgr, RESOLVER_NTASKS,
nm, timermgr, client->dispatchmgr, dispatchv4,
dispatchv6, &view);
result = createview(mctx, dns_rdataclass_in, taskmgr, nm, timermgr,
client->dispatchmgr, dispatchv4, dispatchv6, &view);
if (result != ISC_R_SUCCESS) {
goto cleanup_references;
}
+1 -1
View File
@@ -454,7 +454,7 @@ dns_dlz_writeablezone(dns_view_t *view, dns_dlzdb_t *dlzdb,
INSIST(dupzone == NULL);
/* Create it */
result = dns_zone_create(&zone, view->mctx);
result = dns_zone_create(&zone, view->mctx, 0); /* FIXME */
if (result != ISC_R_SUCCESS) {
goto cleanup;
}
+4 -4
View File
@@ -165,10 +165,10 @@ typedef enum { dns_quotatype_zone = 0, dns_quotatype_server } dns_quotatype_t;
isc_result_t
dns_resolver_create(dns_view_t *view, isc_taskmgr_t *taskmgr,
unsigned int ntasks, unsigned int ndisp, isc_nm_t *nm,
isc_timermgr_t *timermgr, unsigned int options,
dns_dispatchmgr_t *dispatchmgr, dns_dispatch_t *dispatchv4,
dns_dispatch_t *dispatchv6, dns_resolver_t **resp);
unsigned int ndisp, isc_nm_t *nm, isc_timermgr_t *timermgr,
unsigned int options, dns_dispatchmgr_t *dispatchmgr,
dns_dispatch_t *dispatchv4, dns_dispatch_t *dispatchv6,
dns_resolver_t **resp);
/*%<
* Create a resolver.
+1 -1
View File
@@ -394,7 +394,7 @@ dns_view_createzonetable(dns_view_t *view);
isc_result_t
dns_view_createresolver(dns_view_t *view, isc_taskmgr_t *taskmgr,
unsigned int ntasks, unsigned int ndisp, isc_nm_t *nm,
unsigned int ndisp, isc_nm_t *nm,
isc_timermgr_t *timermgr, unsigned int options,
dns_dispatchmgr_t *dispatchmgr,
dns_dispatch_t *dispatchv4, dns_dispatch_t *dispatchv6);
+8 -25
View File
@@ -147,7 +147,7 @@ ISC_LANG_BEGINDECLS
***/
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);
/*%<
* Creates a new empty zone and attach '*zonep' to it.
*
@@ -1479,16 +1479,6 @@ dns_zone_getredirecttype(dns_zone_t *zone);
*\li 'dns_zone_secondary'
*/
void
dns_zone_settask(dns_zone_t *zone, isc_task_t *task);
/*%<
* Give a zone a task to work with. Any current task will be detached.
*
* Requires:
*\li 'zone' to be valid.
*\li 'task' to be valid.
*/
void
dns_zone_gettask(dns_zone_t *zone, isc_task_t **target);
/*%<
@@ -1785,8 +1775,7 @@ dns_zonemgr_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
isc_timermgr_t *timermgr, isc_nm_t *netmgr,
dns_zonemgr_t **zmgrp);
/*%<
* Create a zone manager. Note: the zone manager will not be able to
* manage any zones until dns_zonemgr_setsize() has been run.
* Create a zone manager.
*
* Requires:
*\li 'mctx' to be a valid memory context.
@@ -1795,18 +1784,6 @@ dns_zonemgr_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
*\li 'zmgrp' to point to a NULL pointer.
*/
isc_result_t
dns_zonemgr_setsize(dns_zonemgr_t *zmgr, int num_zones);
/*%<
* Set the size of the zone manager task pool. This must be run
* before zmgr can be used for managing zones. Currently, it can only
* be run once; the task pool cannot be resized.
*
* Requires:
*\li zmgr is a valid zone manager.
*\li zmgr->zonetasks has been initialized.
*/
isc_result_t
dns_zonemgr_createzone(dns_zonemgr_t *zmgr, dns_zone_t **zonep);
/*%<
@@ -2764,3 +2741,9 @@ dns_zonetype_name(dns_zonetype_t type);
/*%<
* Return the name of the zone type 'type'.
*/
isc_mem_t *
dns_zone_mctx(dns_zone_t *zone);
unsigned int
dns_zone_tid(dns_zone_t *zone);
+1 -1
View File
@@ -111,7 +111,7 @@ dns_ntatable_create(dns_view_t *view, isc_taskmgr_t *taskmgr,
ntatable = isc_mem_get(view->mctx, sizeof(*ntatable));
ntatable->task = NULL;
result = isc_task_create(taskmgr, 0, &ntatable->task);
result = isc_task_create(taskmgr, 0, &ntatable->task, 0);
if (result != ISC_R_SUCCESS) {
goto cleanup_ntatable;
}
+29 -16
View File
@@ -533,7 +533,7 @@ struct dns_resolver {
isc_mutex_t lock;
isc_mutex_t primelock;
dns_rdataclass_t rdclass;
isc_nm_t *nm;
isc_nm_t *netmgr;
isc_timermgr_t *timermgr;
isc_taskmgr_t *taskmgr;
dns_view_t *view;
@@ -1540,6 +1540,7 @@ fctx_cancelqueries(fetchctx_t *fctx, bool no_response, bool age_untried) {
}
}
#if 0
static void
fcount_logspill(fetchctx_t *fctx, fctxcount_t *counter) {
char dbuf[DNS_NAME_FORMATSIZE];
@@ -1657,6 +1658,20 @@ fcount_decr(fetchctx_t *fctx) {
UNLOCK(&dbucket->lock);
}
#else
static isc_result_t
fcount_incr(fetchctx_t *fctx, bool force) {
UNUSED(fctx);
UNUSED(force);
return (ISC_R_SUCCESS);
}
static void
fcount_decr(fetchctx_t *fctx) {
UNUSED(fctx);
}
#endif
static inline void
fctx_sendevents(fetchctx_t *fctx, isc_result_t result, int line) {
@@ -4427,8 +4442,8 @@ fctx_shutdown(fetchctx_t *fctx) {
if (fctx->state != fetchstate_init) {
FCTXTRACE("posting control event");
cevent = &fctx->control_event;
isc_task_sendto(fctx->res->buckets[fctx->bucketnum].task,
&cevent, fctx->bucketnum);
isc_task_send(fctx->res->buckets[fctx->bucketnum].task,
&cevent);
}
}
@@ -10193,7 +10208,7 @@ spillattimer_countdown(isc_task_t *task, isc_event_t *event) {
isc_result_t
dns_resolver_create(dns_view_t *view, isc_taskmgr_t *taskmgr,
unsigned int ntasks, unsigned int ndisp, isc_nm_t *nm,
unsigned int ndisp, isc_nm_t *netmgr,
isc_timermgr_t *timermgr, unsigned int options,
dns_dispatchmgr_t *dispatchmgr, dns_dispatch_t *dispatchv4,
dns_dispatch_t *dispatchv6, dns_resolver_t **resp) {
@@ -10207,7 +10222,6 @@ dns_resolver_create(dns_view_t *view, isc_taskmgr_t *taskmgr,
*/
REQUIRE(DNS_VIEW_VALID(view));
REQUIRE(ntasks > 0);
REQUIRE(ndisp > 0);
REQUIRE(resp != NULL && *resp == NULL);
REQUIRE(dispatchmgr != NULL);
@@ -10216,7 +10230,7 @@ dns_resolver_create(dns_view_t *view, isc_taskmgr_t *taskmgr,
RTRACE("create");
res = isc_mem_get(view->mctx, sizeof(*res));
*res = (dns_resolver_t){ .rdclass = view->rdclass,
.nm = nm,
.netmgr = netmgr,
.timermgr = timermgr,
.taskmgr = taskmgr,
.dispatchmgr = dispatchmgr,
@@ -10231,12 +10245,12 @@ dns_resolver_create(dns_view_t *view, isc_taskmgr_t *taskmgr,
.query_timeout = DEFAULT_QUERY_TIMEOUT,
.maxdepth = DEFAULT_RECURSION_DEPTH,
.maxqueries = DEFAULT_MAX_QUERIES,
.nbuckets = ntasks,
.nbuckets = isc_nm_getnworkers(netmgr),
.dhashbits = RES_DOMAIN_HASH_BITS,
.querydscp4 = -1,
.querydscp6 = -1 };
atomic_init(&res->activebuckets, ntasks);
atomic_init(&res->activebuckets, res->nbuckets);
isc_mem_attach(view->mctx, &res->mctx);
@@ -10257,13 +10271,13 @@ dns_resolver_create(dns_view_t *view, isc_taskmgr_t *taskmgr,
}
if (view->resstats != NULL) {
isc_stats_set(view->resstats, ntasks,
isc_stats_set(view->resstats, res->nbuckets,
dns_resstatscounter_buckets);
}
res->buckets = isc_mem_get(view->mctx,
ntasks * sizeof(res->buckets[0]));
for (uint32_t i = 0; i < ntasks; i++) {
res->nbuckets * sizeof(res->buckets[0]));
for (uint32_t i = 0; i < res->nbuckets; i++) {
res->buckets[i] = (fctxbucket_t){ 0 };
isc_mutex_init(&res->buckets[i].lock);
@@ -10272,8 +10286,7 @@ dns_resolver_create(dns_view_t *view, isc_taskmgr_t *taskmgr,
* Since we have a pool of tasks we bind them to task
* queues to spread the load evenly
*/
result = isc_task_create_bound(taskmgr, 0,
&res->buckets[i].task, i);
result = isc_task_create(taskmgr, 0, &res->buckets[i].task, i);
if (result != ISC_R_SUCCESS) {
isc_mutex_destroy(&res->buckets[i].lock);
goto cleanup_buckets;
@@ -10308,7 +10321,7 @@ dns_resolver_create(dns_view_t *view, isc_taskmgr_t *taskmgr,
isc_mutex_init(&res->lock);
isc_mutex_init(&res->primelock);
result = isc_task_create(taskmgr, 0, &task);
result = isc_task_create(taskmgr, 0, &task, 0);
if (result != ISC_R_SUCCESS) {
goto cleanup_primelock;
}
@@ -10342,7 +10355,7 @@ cleanup_primelock:
HASHSIZE(res->dhashbits) * sizeof(zonebucket_t));
cleanup_buckets:
for (size_t i = 0; i < ntasks; i++) {
for (size_t i = 0; i < res->nbuckets; i++) {
isc_mutex_destroy(&res->buckets[i].lock);
isc_task_shutdown(res->buckets[i].task);
isc_task_detach(&res->buckets[i].task);
@@ -10751,7 +10764,7 @@ dns_resolver_createfetch(dns_resolver_t *res, const dns_name_t *name,
dns_resolver_attach(res, &fetch->res);
isc_mem_attach(res->mctx, &fetch->mctx);
bucketnum = dns_name_fullhash(name, false) % res->nbuckets;
bucketnum = isc_nm_tid();
LOCK(&res->lock);
spillat = res->spillat;
+1 -1
View File
@@ -1484,7 +1484,7 @@ dns_rpz_new_zones(dns_rpz_zones_t **rpzsp, char *rps_cstr, size_t rps_cstr_size,
goto cleanup_rbt;
}
result = isc_task_create(taskmgr, 0, &zones->updater);
result = isc_task_create(taskmgr, 0, &zones->updater, 0);
if (result != ISC_R_SUCCESS) {
goto cleanup_task;
}
+8 -7
View File
@@ -510,8 +510,9 @@ dispatch_timeout_tcp_response(void **state __attribute__((unused))) {
&tcp_server_addr, -1, &dispatch);
assert_int_equal(result, ISC_R_SUCCESS);
result = isc_nm_listentcpdns(netmgr, &tcp_server_addr, noop_nameserver,
NULL, accept_cb, NULL, 0, 0, NULL, &sock);
result = isc_nm_listentcpdns(netmgr, 0, &tcp_server_addr,
noop_nameserver, NULL, accept_cb, NULL, 0,
0, NULL, &sock);
assert_int_equal(result, ISC_R_SUCCESS);
region.base = rbuf;
@@ -566,8 +567,8 @@ dispatch_tcp_response(void **state __attribute__((unused))) {
&tcp_server_addr, -1, &dispatch);
assert_int_equal(result, ISC_R_SUCCESS);
result = isc_nm_listentcpdns(netmgr, &tcp_server_addr, nameserver, NULL,
accept_cb, NULL, 0, 0, NULL, &sock);
result = isc_nm_listentcpdns(netmgr, 0, &tcp_server_addr, nameserver,
NULL, accept_cb, NULL, 0, 0, NULL, &sock);
assert_int_equal(result, ISC_R_SUCCESS);
region.base = rbuf;
@@ -625,7 +626,7 @@ dispatch_timeout_udp_response(void **state __attribute__((unused))) {
&dispatch);
assert_int_equal(result, ISC_R_SUCCESS);
result = isc_nm_listenudp(netmgr, &udp_server_addr, noop_nameserver,
result = isc_nm_listenudp(netmgr, 0, &udp_server_addr, noop_nameserver,
NULL, 0, &sock);
assert_int_equal(result, ISC_R_SUCCESS);
@@ -682,8 +683,8 @@ dispatch_getnext(void **state) {
/*
* Create a local udp nameserver on the loopback.
*/
result = isc_nm_listenudp(netmgr, &udp_server_addr, nameserver, NULL, 0,
&sock);
result = isc_nm_listenudp(netmgr, 0, &udp_server_addr, nameserver, NULL,
0, &sock);
assert_int_equal(result, ISC_R_SUCCESS);
region.base = rbuf;
+5 -8
View File
@@ -39,6 +39,7 @@
#include <isc/netmgr.h>
#include <isc/os.h>
#include <isc/print.h>
#include <isc/random.h>
#include <isc/result.h>
#include <isc/stdio.h>
#include <isc/string.h>
@@ -113,7 +114,7 @@ create_managers(void) {
ncpus = isc_os_ncpus();
isc_managers_create(dt_mctx, ncpus, 0, &netmgr, &taskmgr, &timermgr);
CHECK(isc_task_create(taskmgr, 0, &maintask));
CHECK(isc_task_create(taskmgr, 0, &maintask, 0));
return (ISC_R_SUCCESS);
cleanup:
@@ -236,7 +237,7 @@ dns_test_makezone(const char *name, dns_zone_t **zonep, dns_view_t *view,
/*
* Create the zone structure.
*/
result = dns_zone_create(&zone, dt_mctx);
result = dns_zone_create(&zone, dt_mctx, 0);
if (result != ISC_R_SUCCESS) {
return (result);
}
@@ -292,7 +293,8 @@ dns_test_setupzonemgr(void) {
isc_result_t result;
REQUIRE(zonemgr == NULL);
result = dns_zonemgr_create(dt_mctx, taskmgr, timermgr, NULL, &zonemgr);
result = dns_zonemgr_create(dt_mctx, taskmgr, timermgr, netmgr,
&zonemgr);
return (result);
}
@@ -301,11 +303,6 @@ dns_test_managezone(dns_zone_t *zone) {
isc_result_t result;
REQUIRE(zonemgr != NULL);
result = dns_zonemgr_setsize(zonemgr, 1);
if (result != ISC_R_SUCCESS) {
return (result);
}
result = dns_zonemgr_managezone(zonemgr, zone);
return (result);
}
+1 -1
View File
@@ -603,7 +603,7 @@ nta_test(void **state) {
result = dns_test_makeview("view", &myview);
assert_int_equal(result, ISC_R_SUCCESS);
result = isc_task_create(taskmgr, 0, &myview->task);
result = isc_task_create(taskmgr, 0, &myview->task, 0);
assert_int_equal(result, ISC_R_SUCCESS);
result = dns_view_initsecroots(myview, dt_mctx);
+4 -23
View File
@@ -64,7 +64,7 @@ zonemgr_create(void **state) {
UNUSED(state);
result = dns_zonemgr_create(dt_mctx, taskmgr, timermgr, NULL,
result = dns_zonemgr_create(dt_mctx, taskmgr, timermgr, netmgr,
&myzonemgr);
assert_int_equal(result, ISC_R_SUCCESS);
@@ -82,22 +82,15 @@ zonemgr_managezone(void **state) {
UNUSED(state);
result = dns_zonemgr_create(dt_mctx, taskmgr, timermgr, NULL,
result = dns_zonemgr_create(dt_mctx, taskmgr, timermgr, netmgr,
&myzonemgr);
assert_int_equal(result, ISC_R_SUCCESS);
result = dns_test_makezone("foo", &zone, NULL, false);
assert_int_equal(result, ISC_R_SUCCESS);
/* This should not succeed until the dns_zonemgr_setsize() is run */
result = dns_zonemgr_managezone(myzonemgr, zone);
assert_int_equal(result, ISC_R_FAILURE);
assert_int_equal(dns_zonemgr_getcount(myzonemgr, DNS_ZONESTATE_ANY), 0);
result = dns_zonemgr_setsize(myzonemgr, 1);
assert_int_equal(result, ISC_R_SUCCESS);
/* Now it should succeed */
result = dns_zonemgr_managezone(myzonemgr, zone);
assert_int_equal(result, ISC_R_SUCCESS);
@@ -123,18 +116,10 @@ zonemgr_createzone(void **state) {
UNUSED(state);
result = dns_zonemgr_create(dt_mctx, taskmgr, timermgr, NULL,
result = dns_zonemgr_create(dt_mctx, taskmgr, timermgr, netmgr,
&myzonemgr);
assert_int_equal(result, ISC_R_SUCCESS);
/* This should not succeed until the dns_zonemgr_setsize() is run */
result = dns_zonemgr_createzone(myzonemgr, &zone);
assert_int_equal(result, ISC_R_FAILURE);
result = dns_zonemgr_setsize(myzonemgr, 1);
assert_int_equal(result, ISC_R_SUCCESS);
/* Now it should succeed */
result = dns_zonemgr_createzone(myzonemgr, &zone);
assert_int_equal(result, ISC_R_SUCCESS);
assert_non_null(zone);
@@ -162,16 +147,13 @@ zonemgr_unreachable(void **state) {
TIME_NOW(&now);
result = dns_zonemgr_create(dt_mctx, taskmgr, timermgr, NULL,
result = dns_zonemgr_create(dt_mctx, taskmgr, timermgr, netmgr,
&myzonemgr);
assert_int_equal(result, ISC_R_SUCCESS);
result = dns_test_makezone("foo", &zone, NULL, false);
assert_int_equal(result, ISC_R_SUCCESS);
result = dns_zonemgr_setsize(myzonemgr, 1);
assert_int_equal(result, ISC_R_SUCCESS);
result = dns_zonemgr_managezone(myzonemgr, zone);
assert_int_equal(result, ISC_R_SUCCESS);
@@ -224,7 +206,6 @@ zonemgr_unreachable(void **state) {
* - dns_zonemgr_forcemaint
* - dns_zonemgr_resumexfrs
* - dns_zonemgr_shutdown
* - dns_zonemgr_setsize
* - dns_zonemgr_settransfersin
* - dns_zonemgr_getttransfersin
* - dns_zonemgr_settransfersperns
-1
View File
@@ -26,7 +26,6 @@
#include <isc/stats.h>
#include <isc/stdtime.h>
#include <isc/string.h>
#include <isc/taskpool.h>
#include <isc/time.h>
#include <isc/util.h>
+3 -3
View File
@@ -807,7 +807,7 @@ dns_view_createzonetable(dns_view_t *view) {
isc_result_t
dns_view_createresolver(dns_view_t *view, isc_taskmgr_t *taskmgr,
unsigned int ntasks, unsigned int ndisp, isc_nm_t *nm,
unsigned int ndisp, isc_nm_t *nm,
isc_timermgr_t *timermgr, unsigned int options,
dns_dispatchmgr_t *dispatchmgr,
dns_dispatch_t *dispatchv4,
@@ -820,13 +820,13 @@ dns_view_createresolver(dns_view_t *view, isc_taskmgr_t *taskmgr,
REQUIRE(!view->frozen);
REQUIRE(view->resolver == NULL);
result = isc_task_create(taskmgr, 0, &view->task);
result = isc_task_create(taskmgr, 0, &view->task, 0);
if (result != ISC_R_SUCCESS) {
return (result);
}
isc_task_setname(view->task, "view", view);
result = dns_resolver_create(view, taskmgr, ntasks, ndisp, nm, timermgr,
result = dns_resolver_create(view, taskmgr, ndisp, nm, timermgr,
options, dispatchmgr, dispatchv4,
dispatchv6, &view->resolver);
if (result != ISC_R_SUCCESS) {
+148 -195
View File
@@ -22,7 +22,6 @@
#include <isc/hex.h>
#include <isc/md.h>
#include <isc/mutex.h>
#include <isc/pool.h>
#include <isc/print.h>
#include <isc/random.h>
#include <isc/ratelimiter.h>
@@ -34,7 +33,7 @@
#include <isc/stdtime.h>
#include <isc/strerr.h>
#include <isc/string.h>
#include <isc/taskpool.h>
#include <isc/task.h>
#include <isc/thread.h>
#include <isc/timer.h>
#include <isc/tls.h>
@@ -233,6 +232,8 @@ struct dns_zone {
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. */
@@ -594,10 +595,10 @@ struct dns_zonemgr {
isc_taskmgr_t *taskmgr;
isc_timermgr_t *timermgr;
isc_nm_t *netmgr;
isc_taskpool_t *zonetasks;
isc_taskpool_t *loadtasks;
uint32_t workers;
isc_task_t *task;
isc_pool_t *mctxpool;
isc_task_t **zonetasks;
isc_task_t **loadtasks;
isc_ratelimiter_t *checkdsrl;
isc_ratelimiter_t *notifyrl;
isc_ratelimiter_t *refreshrl;
@@ -1093,57 +1094,58 @@ inc_stats(dns_zone_t *zone, isc_statscounter_t counter) {
***/
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 };
REQUIRE(zonep != NULL && *zonep == NULL);
REQUIRE(mctx != NULL);
TIME_NOW(&now);
zone = isc_mem_get(mctx, sizeof(*zone));
*zone = z;
*zone = (dns_zone_t){
.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,
.tid = tid,
};
zone->mctx = NULL;
isc_mem_attach(mctx, &zone->mctx);
isc_mutex_init(&zone->lock);
ZONEDB_INITLOCK(&zone->dblock);
@@ -16220,23 +16222,6 @@ dns_zone_getorigin(dns_zone_t *zone) {
return (&zone->origin);
}
void
dns_zone_settask(dns_zone_t *zone, isc_task_t *task) {
REQUIRE(DNS_ZONE_VALID(zone));
LOCK_ZONE(zone);
if (zone->task != NULL) {
isc_task_detach(&zone->task);
}
isc_task_attach(task, &zone->task);
ZONEDB_LOCK(&zone->dblock, isc_rwlocktype_read);
if (zone->db != NULL) {
dns_db_settask(zone->db, zone->task);
}
ZONEDB_UNLOCK(&zone->dblock, isc_rwlocktype_read);
UNLOCK_ZONE(zone);
}
void
dns_zone_gettask(dns_zone_t *zone, isc_task_t **target) {
REQUIRE(DNS_ZONE_VALID(zone));
@@ -18802,22 +18787,33 @@ dns_zonemgr_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
dns_zonemgr_t *zmgr;
isc_result_t result;
REQUIRE(mctx != NULL);
REQUIRE(taskmgr != NULL);
REQUIRE(timermgr != NULL);
REQUIRE(netmgr != NULL);
zmgr = isc_mem_get(mctx, sizeof(*zmgr));
zmgr->mctx = NULL;
*zmgr = (dns_zonemgr_t){
.taskmgr = taskmgr,
.timermgr = timermgr,
.netmgr = netmgr,
.workers = isc_nm_getnworkers(netmgr),
.zonetasks = NULL,
.loadtasks = NULL,
.task = NULL,
.checkdsrl = NULL,
.notifyrl = NULL,
.refreshrl = NULL,
.startupnotifyrl = NULL,
.startuprefreshrl = NULL,
.transfersin = 10,
.transfersperns = 2,
};
isc_refcount_init(&zmgr->refs, 1);
isc_mem_attach(mctx, &zmgr->mctx);
zmgr->taskmgr = taskmgr;
zmgr->timermgr = timermgr;
zmgr->netmgr = netmgr;
zmgr->zonetasks = NULL;
zmgr->loadtasks = NULL;
zmgr->mctxpool = NULL;
zmgr->task = NULL;
zmgr->checkdsrl = NULL;
zmgr->notifyrl = NULL;
zmgr->refreshrl = NULL;
zmgr->startupnotifyrl = NULL;
zmgr->startuprefreshrl = NULL;
ISC_LIST_INIT(zmgr->zones);
ISC_LIST_INIT(zmgr->waiting_for_xfrin);
ISC_LIST_INIT(zmgr->xfrin_in_progress);
@@ -18827,14 +18823,11 @@ dns_zonemgr_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
}
isc_rwlock_init(&zmgr->rwlock, 0, 0);
zmgr->transfersin = 10;
zmgr->transfersperns = 2;
/* Unreachable lock. */
isc_rwlock_init(&zmgr->urlock, 0, 0);
/* Create a single task for queueing of SOA queries. */
result = isc_task_create(taskmgr, 1, &zmgr->task);
result = isc_task_create(taskmgr, 1, &zmgr->task, 0);
if (result != ISC_R_SUCCESS) {
goto free_urlock;
}
@@ -18870,6 +18863,31 @@ dns_zonemgr_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
goto free_startupnotifyrl;
}
zmgr->zonetasks = isc_mem_get(
zmgr->mctx, zmgr->workers * sizeof(zmgr->zonetasks[0]));
memset(zmgr->zonetasks, 0, zmgr->workers * sizeof(zmgr->zonetasks[0]));
for (size_t i = 0; i < zmgr->workers; i++) {
result = isc_task_create(zmgr->taskmgr, 2,
&zmgr->zonetasks[i], i);
if (result != ISC_R_SUCCESS) {
goto free_zonetasks;
}
isc_task_setname(zmgr->zonetasks[i], "zonemgr-zonetasks", NULL);
}
zmgr->loadtasks = isc_mem_get(
zmgr->mctx, zmgr->workers * sizeof(zmgr->loadtasks[0]));
memset(zmgr->loadtasks, 0, zmgr->workers * sizeof(zmgr->loadtasks[0]));
for (size_t i = 0; i < zmgr->workers; i++) {
result = isc_task_create(zmgr->taskmgr, 2,
&zmgr->loadtasks[i], i);
if (result != ISC_R_SUCCESS) {
goto free_loadtasks;
}
isc_task_setname(zmgr->loadtasks[i], "zonemgr-loadtasks", NULL);
isc_task_setprivilege(zmgr->loadtasks[i], true);
}
/* Key file I/O locks. */
zonemgr_keymgmt_init(zmgr);
@@ -18900,6 +18918,25 @@ dns_zonemgr_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
free_iolock:
isc_mutex_destroy(&zmgr->iolock);
#endif /* if 0 */
free_loadtasks:
for (size_t i = 0; i < zmgr->workers; i++) {
if (zmgr->loadtasks[i] != NULL) {
isc_task_detach(&zmgr->loadtasks[i]);
}
}
isc_mem_put(zmgr->mctx, zmgr->loadtasks,
zmgr->workers * sizeof(zmgr->loadtasks[0]));
free_zonetasks:
for (size_t i = 0; i < zmgr->workers; i++) {
if (zmgr->zonetasks[i] != NULL) {
isc_task_detach(&zmgr->zonetasks[i]);
}
}
isc_mem_put(zmgr->mctx, zmgr->zonetasks,
zmgr->workers * sizeof(zmgr->zonetasks[0]));
isc_ratelimiter_detach(&zmgr->startuprefreshrl);
free_startupnotifyrl:
isc_ratelimiter_detach(&zmgr->startupnotifyrl);
free_refreshrl:
@@ -18923,23 +18960,17 @@ dns_zonemgr_createzone(dns_zonemgr_t *zmgr, dns_zone_t **zonep) {
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);
if (zmgr->mctxpool == NULL) {
return (ISC_R_FAILURE);
}
tid = isc_random_uniform(zmgr->workers);
item = isc_pool_get(zmgr->mctxpool);
if (item == NULL) {
return (ISC_R_FAILURE);
}
mctx = isc_nm_getmctx(zmgr->netmgr, tid);
INSIST(mctx != NULL);
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;
@@ -18963,8 +18994,8 @@ dns_zonemgr_managezone(dns_zonemgr_t *zmgr, dns_zone_t *zone) {
REQUIRE(zone->timer == NULL);
REQUIRE(zone->zmgr == NULL);
isc_taskpool_gettask(zmgr->zonetasks, &zone->task);
isc_taskpool_gettask(zmgr->loadtasks, &zone->loadtask);
isc_task_attach(zmgr->zonetasks[zone->tid], &zone->task);
isc_task_attach(zmgr->loadtasks[zone->tid], &zone->loadtask);
/*
* Set the task name. The tag will arbitrarily point to one
@@ -19096,15 +19127,22 @@ dns_zonemgr_shutdown(dns_zonemgr_t *zmgr) {
if (zmgr->task != NULL) {
isc_task_destroy(&zmgr->task);
}
if (zmgr->zonetasks != NULL) {
isc_taskpool_destroy(&zmgr->zonetasks);
for (size_t i = 0; i < zmgr->workers; i++) {
if (zmgr->loadtasks[i] != NULL) {
isc_task_detach(&zmgr->loadtasks[i]);
}
}
if (zmgr->loadtasks != NULL) {
isc_taskpool_destroy(&zmgr->loadtasks);
}
if (zmgr->mctxpool != NULL) {
isc_pool_destroy(&zmgr->mctxpool);
isc_mem_put(zmgr->mctx, zmgr->loadtasks,
zmgr->workers * sizeof(zmgr->loadtasks[0]));
for (size_t i = 0; i < zmgr->workers; i++) {
if (zmgr->zonetasks[i] != NULL) {
isc_task_detach(&zmgr->zonetasks[i]);
}
}
isc_mem_put(zmgr->mctx, zmgr->zonetasks,
zmgr->workers * sizeof(zmgr->zonetasks[0]));
RWLOCK(&zmgr->rwlock, isc_rwlocktype_read);
for (zone = ISC_LIST_HEAD(zmgr->zones); zone != NULL;
@@ -19117,101 +19155,6 @@ dns_zonemgr_shutdown(dns_zonemgr_t *zmgr) {
RWUNLOCK(&zmgr->rwlock, isc_rwlocktype_read);
}
static isc_result_t
mctxinit(void **target, void *arg) {
isc_mem_t *mctx = NULL;
UNUSED(arg);
REQUIRE(target != NULL && *target == NULL);
isc_mem_create(&mctx);
isc_mem_setname(mctx, "zonemgr-pool");
*target = mctx;
return (ISC_R_SUCCESS);
}
static void
mctxfree(void **target) {
isc_mem_t *mctx = *(isc_mem_t **)target;
isc_mem_detach(&mctx);
*target = NULL;
}
#define ZONES_PER_TASK 100
#define ZONES_PER_MCTX 1000
isc_result_t
dns_zonemgr_setsize(dns_zonemgr_t *zmgr, int num_zones) {
isc_result_t result;
int ntasks = num_zones / ZONES_PER_TASK;
int nmctx = num_zones / ZONES_PER_MCTX;
isc_taskpool_t *pool = NULL;
isc_pool_t *mctxpool = NULL;
REQUIRE(DNS_ZONEMGR_VALID(zmgr));
/*
* For anything fewer than 1000 zones we use 10 tasks in
* the task pools. More than that, and we'll scale at one
* task per 100 zones. Similarly, for anything smaller than
* 2000 zones we use 2 memory contexts, then scale at 1:1000.
*/
if (ntasks < 10) {
ntasks = 10;
}
if (nmctx < 2) {
nmctx = 2;
}
/* Create or resize the zone task pools. */
if (zmgr->zonetasks == NULL) {
result = isc_taskpool_create(zmgr->taskmgr, zmgr->mctx, ntasks,
2, false, &pool);
} else {
result = isc_taskpool_expand(&zmgr->zonetasks, ntasks, false,
&pool);
}
if (result == ISC_R_SUCCESS) {
zmgr->zonetasks = pool;
}
/*
* We always set all tasks in the zone-load task pool to
* privileged. This prevents other tasks in the system from
* running while the server task manager is in privileged
* mode.
*/
pool = NULL;
if (zmgr->loadtasks == NULL) {
result = isc_taskpool_create(zmgr->taskmgr, zmgr->mctx, ntasks,
2, true, &pool);
} else {
result = isc_taskpool_expand(&zmgr->loadtasks, ntasks, true,
&pool);
}
if (result == ISC_R_SUCCESS) {
zmgr->loadtasks = pool;
}
/* Create or resize the zone memory context pool. */
if (zmgr->mctxpool == NULL) {
result = isc_pool_create(zmgr->mctx, nmctx, mctxfree, mctxinit,
NULL, &mctxpool);
} else {
result = isc_pool_expand(&zmgr->mctxpool, nmctx, &mctxpool);
}
if (result == ISC_R_SUCCESS) {
zmgr->mctxpool = mctxpool;
}
return (result);
}
static void
zonemgr_free(dns_zonemgr_t *zmgr) {
isc_mem_t *mctx;
@@ -23687,3 +23630,13 @@ dns_zonemgr_set_tlsctx_cache(dns_zonemgr_t *zmgr,
RWUNLOCK(&zmgr->rwlock, isc_rwlocktype_write);
}
isc_mem_t *
dns_zone_mctx(dns_zone_t *zone) {
return (zone->mctx);
}
unsigned int
dns_zone_tid(dns_zone_t *zone) {
return (zone->tid);
}
-4
View File
@@ -63,7 +63,6 @@ libisc_la_HEADERS = \
include/isc/once.h \
include/isc/os.h \
include/isc/parseint.h \
include/isc/pool.h \
include/isc/portset.h \
include/isc/print.h \
include/isc/quota.h \
@@ -90,7 +89,6 @@ libisc_la_HEADERS = \
include/isc/symtab.h \
include/isc/syslog.h \
include/isc/task.h \
include/isc/taskpool.h \
include/isc/thread.h \
include/isc/time.h \
include/isc/timer.h \
@@ -168,7 +166,6 @@ libisc_la_SOURCES = \
os.c \
os_p.h \
parseint.c \
pool.c \
portset.c \
quota.c \
radix.c \
@@ -191,7 +188,6 @@ libisc_la_SOURCES = \
syslog.c \
task.c \
task_p.h \
taskpool.c \
thread.c \
time.c \
timer.c \
+4 -1
View File
@@ -231,7 +231,10 @@ isc_httpdmgr_create(isc_nm_t *nm, isc_mem_t *mctx, isc_sockaddr_t *addr,
isc_refcount_init(&httpdmgr->references, 1);
CHECK(isc_nm_listentcp(nm, addr, httpd_newconn, httpdmgr,
/*
* The stats channel can listen on just single thread (0).
*/
CHECK(isc_nm_listentcp(nm, 1, addr, httpd_newconn, httpdmgr,
sizeof(isc_httpd_t), 5, NULL, &httpdmgr->sock));
httpdmgr->magic = HTTPDMGR_MAGIC;
+24 -8
View File
@@ -199,8 +199,9 @@ isc_nmhandle_netmgr(isc_nmhandle_t *handle);
*/
isc_result_t
isc_nm_listenudp(isc_nm_t *mgr, isc_sockaddr_t *iface, isc_nm_recv_cb_t cb,
void *cbarg, size_t extrasize, isc_nmsocket_t **sockp);
isc_nm_listenudp(isc_nm_t *mgr, uint32_t workers, isc_sockaddr_t *iface,
isc_nm_recv_cb_t cb, void *cbarg, size_t extrasize,
isc_nmsocket_t **sockp);
/*%<
* Start listening for UDP packets on interface 'iface' using net manager
* 'mgr'.
@@ -316,7 +317,7 @@ isc_nm_send(isc_nmhandle_t *handle, isc_region_t *region, isc_nm_cb_t cb,
*/
isc_result_t
isc_nm_listentcp(isc_nm_t *mgr, isc_sockaddr_t *iface,
isc_nm_listentcp(isc_nm_t *mgr, uint32_t workers, isc_sockaddr_t *iface,
isc_nm_accept_cb_t accept_cb, void *accept_cbarg,
size_t extrahandlesize, int backlog, isc_quota_t *quota,
isc_nmsocket_t **sockp);
@@ -357,7 +358,7 @@ isc_nm_tcpconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer,
*/
isc_result_t
isc_nm_listentcpdns(isc_nm_t *mgr, isc_sockaddr_t *iface,
isc_nm_listentcpdns(isc_nm_t *mgr, uint32_t workers, isc_sockaddr_t *iface,
isc_nm_recv_cb_t recv_cb, void *recv_cbarg,
isc_nm_accept_cb_t accept_cb, void *accept_cbarg,
size_t extrahandlesize, int backlog, isc_quota_t *quota,
@@ -386,7 +387,7 @@ isc_nm_listentcpdns(isc_nm_t *mgr, isc_sockaddr_t *iface,
*/
isc_result_t
isc_nm_listentlsdns(isc_nm_t *mgr, isc_sockaddr_t *iface,
isc_nm_listentlsdns(isc_nm_t *mgr, uint32_t workers, isc_sockaddr_t *iface,
isc_nm_recv_cb_t recv_cb, void *recv_cbarg,
isc_nm_accept_cb_t accept_cb, void *accept_cbarg,
size_t extrahandlesize, int backlog, isc_quota_t *quota,
@@ -501,7 +502,7 @@ isc_nm_is_http_handle(isc_nmhandle_t *handle);
#define ISC_NM_HTTP_DEFAULT_PATH "/dns-query"
isc_result_t
isc_nm_listentls(isc_nm_t *mgr, isc_sockaddr_t *iface,
isc_nm_listentls(isc_nm_t *mgr, uint32_t workers, isc_sockaddr_t *iface,
isc_nm_accept_cb_t accept_cb, void *accept_cbarg,
size_t extrahandlesize, int backlog, isc_quota_t *quota,
isc_tlsctx_t *sslctx, isc_nmsocket_t **sockp);
@@ -518,8 +519,8 @@ isc_nm_httpconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer,
size_t extrahandlesize);
isc_result_t
isc_nm_listenhttp(isc_nm_t *mgr, isc_sockaddr_t *iface, int backlog,
isc_quota_t *quota, isc_tlsctx_t *ctx,
isc_nm_listenhttp(isc_nm_t *mgr, uint32_t workers, isc_sockaddr_t *iface,
int backlog, isc_quota_t *quota, isc_tlsctx_t *ctx,
isc_nm_http_endpoints_t *eps, uint32_t max_concurrent_streams,
isc_nmsocket_t **sockp);
@@ -686,6 +687,12 @@ isc_nm_getnworkers(const isc_nm_t *);
* Return the number of active workers
*/
isc_mem_t *
isc_nm_getmctx(const isc_nm_t *netmgr, uint32_t tid);
/*%<
* Return memory context associated with respective nm worker
*/
void
isc_nmhandle_setwritetimeout(isc_nmhandle_t *handle, uint64_t write_timeout);
@@ -712,3 +719,12 @@ isc_nm_timer_start(isc_nm_timer_t *, uint64_t);
void
isc_nm_timer_stop(isc_nm_timer_t *);
/*
* Simple jobs related functions
*/
typedef void (*isc_nm_run_cb)(void *data);
void
isc_nm_run(isc_nm_t *netmgr, isc_nm_run_cb cb, void *cbarg, int tid);
-138
View File
@@ -1,138 +0,0 @@
/*
* Copyright (C) Internet Systems Consortium, Inc. ("ISC")
*
* SPDX-License-Identifier: MPL-2.0
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, you can obtain one at https://mozilla.org/MPL/2.0/.
*
* See the COPYRIGHT file distributed with this work for additional
* information regarding copyright ownership.
*/
#pragma once
/*****
***** Module Info
*****/
/*! \file isc/pool.h
* \brief An object pool is a mechanism for sharing a small pool of
* fungible objects among a large number of objects that depend on them.
*
* This is useful, for example, when it causes performance problems for
* large number of zones to share a single memory context or task object,
* but it would create a different set of problems for them each to have an
* independent task or memory context.
*/
/***
*** Imports.
***/
#include <isc/lang.h>
#include <isc/mem.h>
#include <isc/types.h>
ISC_LANG_BEGINDECLS
/*****
***** Types.
*****/
typedef void (*isc_pooldeallocator_t)(void **object);
typedef isc_result_t (*isc_poolinitializer_t)(void **target, void *arg);
typedef struct isc_pool isc_pool_t;
/*****
***** Functions.
*****/
isc_result_t
isc_pool_create(isc_mem_t *mctx, unsigned int count, isc_pooldeallocator_t free,
isc_poolinitializer_t init, void *initarg, isc_pool_t **poolp);
/*%<
* Create a pool of "count" object pointers. If 'free' is not NULL,
* it points to a function that will detach the objects. 'init'
* points to a function that will initialize the arguments, and
* 'arg' to an argument to be passed into that function (for example,
* a relevant manager or context object).
*
* Requires:
*
*\li 'mctx' is a valid memory context.
*
*\li init != NULL
*
*\li poolp != NULL && *poolp == NULL
*
* Ensures:
*
*\li On success, '*poolp' points to the new object pool.
*
* Returns:
*
*\li #ISC_R_SUCCESS
*\li #ISC_R_NOMEMORY
*\li #ISC_R_UNEXPECTED
*/
void *
isc_pool_get(isc_pool_t *pool);
/*%<
* Returns a pointer to an object from the pool. Currently the object
* is chosen from the pool at random. (This may be changed in the future
* to something that guaratees balance.)
*/
int
isc_pool_count(isc_pool_t *pool);
/*%<
* Returns the number of objcts in the pool 'pool'.
*/
isc_result_t
isc_pool_expand(isc_pool_t **sourcep, unsigned int count, isc_pool_t **targetp);
/*%<
* If 'size' is larger than the number of objects in the pool pointed to by
* 'sourcep', then a new pool of size 'count' is allocated, the existing
* objects are copied into it, additional ones created to bring the
* total number up to 'count', and the resulting pool is attached to
* 'targetp'.
*
* If 'count' is less than or equal to the number of objects in 'source', then
* 'sourcep' is attached to 'targetp' without any other action being taken.
*
* In either case, 'sourcep' is detached.
*
* Requires:
*
* \li 'sourcep' is not NULL and '*source' is not NULL
* \li 'targetp' is not NULL and '*source' is NULL
*
* Ensures:
*
* \li On success, '*targetp' points to a valid task pool.
* \li On success, '*sourcep' points to NULL.
*
* Returns:
*
* \li #ISC_R_SUCCESS
* \li #ISC_R_NOMEMORY
*/
void
isc_pool_destroy(isc_pool_t **poolp);
/*%<
* Destroy a task pool. The tasks in the pool are detached but not
* shut down.
*
* Requires:
* \li '*poolp' is a valid task pool.
*/
ISC_LANG_ENDDECLS
+4 -13
View File
@@ -102,12 +102,9 @@ typedef enum {
isc_result_t
isc_task_create(isc_taskmgr_t *manager, unsigned int quantum,
isc_task_t **taskp);
isc_result_t
isc_task_create_bound(isc_taskmgr_t *manager, unsigned int quantum,
isc_task_t **taskp, int tid);
isc_task_t **taskp, int tid);
/*%<
* Create a task, optionally bound to a particular tid.
* Create a task, bound to a particular tid.
*
* Notes:
*
@@ -205,8 +202,7 @@ isc_task_send(isc_task_t *task, isc_event_t **eventp);
void
isc_task_sendto(isc_task_t *task, isc_event_t **eventp, int c);
/*%<
* Send '*event' to 'task', if task is idle try starting it on cpu 'c'
* If 'c' is smaller than 0 then cpu is selected randomly.
* Send '*event' to 'task'.
*
* Requires:
*
@@ -218,15 +214,10 @@ isc_task_sendto(isc_task_t *task, isc_event_t **eventp, int c);
*\li *eventp == NULL.
*/
void
isc_task_sendtoanddetach(isc_task_t **taskp, isc_event_t **eventp, int c);
void
isc_task_sendanddetach(isc_task_t **taskp, isc_event_t **eventp);
/*%<
* Send '*event' to '*taskp' and then detach '*taskp' from its
* task. If task is idle try starting it on cpu 'c'
* If 'c' is smaller than 0 then cpu is selected randomly.
* Send '*event' to '*taskp' and then detach '*taskp' from its task.
*
* Requires:
*
-135
View File
@@ -1,135 +0,0 @@
/*
* Copyright (C) Internet Systems Consortium, Inc. ("ISC")
*
* SPDX-License-Identifier: MPL-2.0
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, you can obtain one at https://mozilla.org/MPL/2.0/.
*
* See the COPYRIGHT file distributed with this work for additional
* information regarding copyright ownership.
*/
#pragma once
/*****
***** Module Info
*****/
/*! \file isc/taskpool.h
* \brief A task pool is a mechanism for sharing a small number of tasks
* among a large number of objects such that each object is
* assigned a unique task, but each task may be shared by several
* objects.
*
* Task pools are used to let objects that can exist in large
* numbers (e.g., zones) use tasks for synchronization without
* the memory overhead and unfair scheduling competition that
* could result from creating a separate task for each object.
*/
/***
*** Imports.
***/
#include <stdbool.h>
#include <isc/lang.h>
#include <isc/task.h>
ISC_LANG_BEGINDECLS
/*****
***** Types.
*****/
typedef struct isc_taskpool isc_taskpool_t;
/*****
***** Functions.
*****/
isc_result_t
isc_taskpool_create(isc_taskmgr_t *tmgr, isc_mem_t *mctx, unsigned int ntasks,
unsigned int quantum, bool priv, isc_taskpool_t **poolp);
/*%<
* Create a task pool of "ntasks" tasks, each with quantum
* "quantum".
*
* Requires:
*
*\li 'tmgr' is a valid task manager.
*
*\li 'mctx' is a valid memory context.
*
*\li poolp != NULL && *poolp == NULL
*
* Ensures:
*
*\li On success, '*taskp' points to the new task pool.
*
* Returns:
*
*\li #ISC_R_SUCCESS
*\li #ISC_R_NOMEMORY
*\li #ISC_R_UNEXPECTED
*/
void
isc_taskpool_gettask(isc_taskpool_t *pool, isc_task_t **targetp);
/*%<
* Attach to a task from the pool. Currently the next task is chosen
* from the pool at random. (This may be changed in the future to
* something that guaratees balance.)
*/
int
isc_taskpool_size(isc_taskpool_t *pool);
/*%<
* Returns the number of tasks in the task pool 'pool'.
*/
isc_result_t
isc_taskpool_expand(isc_taskpool_t **sourcep, unsigned int size, bool priv,
isc_taskpool_t **targetp);
/*%<
* If 'size' is larger than the number of tasks in the pool pointed to by
* 'sourcep', then a new taskpool of size 'size' is allocated, the existing
* tasks from are moved into it, additional tasks are created to bring the
* total number up to 'size', and the resulting pool is attached to
* 'targetp'.
*
* If 'size' is less than or equal to the tasks in pool 'source', then
* 'sourcep' is attached to 'targetp' without any other action being taken.
*
* In either case, 'sourcep' is detached.
*
* Requires:
*
* \li 'sourcep' is not NULL and '*source' is not NULL
* \li 'targetp' is not NULL and '*source' is NULL
*
* Ensures:
*
* \li On success, '*targetp' points to a valid task pool.
* \li On success, '*sourcep' points to NULL.
*
* Returns:
*
* \li #ISC_R_SUCCESS
* \li #ISC_R_NOMEMORY
*/
void
isc_taskpool_destroy(isc_taskpool_t **poolp);
/*%<
* Destroy a task pool. The tasks in the pool are detached but not
* shut down.
*
* Requires:
* \li '*poolp' is a valid task pool.
*/
ISC_LANG_ENDDECLS
+80 -60
View File
@@ -363,7 +363,8 @@ find_http_cstream(int32_t stream_id, isc_nm_http_session_t *session) {
static isc_result_t
new_http_cstream(isc_nmsocket_t *sock, http_cstream_t **streamp) {
isc_mem_t *mctx = sock->mgr->mctx;
int tid = isc_nm_tid();
isc__networker_t *worker = &sock->mgr->workers[tid];
const char *uri = NULL;
bool post;
http_cstream_t *stream = NULL;
@@ -372,23 +373,24 @@ new_http_cstream(isc_nmsocket_t *sock, http_cstream_t **streamp) {
uri = sock->h2.session->handle->sock->h2.connect.uri;
post = sock->h2.session->handle->sock->h2.connect.post;
stream = isc_mem_get(mctx, sizeof(http_cstream_t));
stream = isc_mem_get(worker->mctx, sizeof(http_cstream_t));
*stream = (http_cstream_t){ .stream_id = -1,
.post = post,
.uri = isc_mem_strdup(mctx, uri) };
.uri = isc_mem_strdup(worker->mctx, uri) };
ISC_LINK_INIT(stream, link);
result = isc_url_parse(stream->uri, strlen(stream->uri), 0,
&stream->up);
if (result != ISC_R_SUCCESS) {
isc_mem_free(mctx, stream->uri);
isc_mem_put(mctx, stream, sizeof(http_cstream_t));
isc_mem_free(worker->mctx, stream->uri);
isc_mem_put(worker->mctx, stream, sizeof(http_cstream_t));
return (result);
}
isc__nmsocket_attach(sock, &stream->httpsock);
stream->authoritylen = stream->up.field_data[ISC_UF_HOST].len;
stream->authority = isc_mem_get(mctx, stream->authoritylen + AUTHEXTRA);
stream->authority = isc_mem_get(worker->mctx,
stream->authoritylen + AUTHEXTRA);
memmove(stream->authority, &uri[stream->up.field_data[ISC_UF_HOST].off],
stream->up.field_data[ISC_UF_HOST].len);
@@ -410,7 +412,7 @@ new_http_cstream(isc_nmsocket_t *sock, http_cstream_t **streamp) {
(size_t)(stream->up.field_data[ISC_UF_QUERY].len + 1);
}
stream->path = isc_mem_get(mctx, stream->pathlen);
stream->path = isc_mem_get(worker->mctx, stream->pathlen);
if (stream->up.field_set & (1 << ISC_UF_PATH)) {
memmove(stream->path,
&uri[stream->up.field_data[ISC_UF_PATH].off],
@@ -428,7 +430,7 @@ new_http_cstream(isc_nmsocket_t *sock, http_cstream_t **streamp) {
stream->up.field_data[ISC_UF_QUERY].len);
}
isc_buffer_allocate(mctx, &stream->rbuf,
isc_buffer_allocate(worker->mctx, &stream->rbuf,
INITIAL_DNS_MESSAGE_BUFFER_SIZE);
isc_buffer_setautorealloc(stream->rbuf, true);
@@ -1130,10 +1132,11 @@ http_send_outgoing(isc_nm_http_session_t *session, isc_nmhandle_t *httphandle,
* FLUSH_HTTP_WRITE_BUFFER_AFTER bytes in the write buffer, we
* will flush the buffer. */
if (cb != NULL) {
INSIST(VALID_NMHANDLE(httphandle));
isc__nm_uvreq_t *newcb = isc__nm_uvreq_get(
httphandle->sock->mgr, httphandle->sock);
INSIST(VALID_NMHANDLE(httphandle));
newcb->cb.send = cb;
newcb->cbarg = cbarg;
isc_nmhandle_attach(httphandle, &newcb->handle);
@@ -1334,17 +1337,18 @@ transport_connect_cb(isc_nmhandle_t *handle, isc_result_t result, void *cbarg) {
isc_nmsocket_t *transp_sock = NULL;
isc_nm_http_session_t *session = NULL;
http_cstream_t *cstream = NULL;
isc_mem_t *mctx = NULL;
int tid = isc_nm_tid();
isc__networker_t *worker;
REQUIRE(VALID_NMSOCK(http_sock));
REQUIRE(VALID_NMHANDLE(handle));
worker = &http_sock->mgr->workers[tid];
transp_sock = handle->sock;
REQUIRE(VALID_NMSOCK(transp_sock));
mctx = transp_sock->mgr->mctx;
INSIST(http_sock->h2.connect.uri != NULL);
http_sock->tid = transp_sock->tid;
@@ -1352,7 +1356,7 @@ transport_connect_cb(isc_nmhandle_t *handle, isc_result_t result, void *cbarg) {
goto error;
}
new_session(mctx, http_sock->h2.connect.tlsctx, &session);
new_session(worker->mctx, http_sock->h2.connect.tlsctx, &session);
session->client = true;
transp_sock->h2.session = session;
http_sock->h2.connect.tlsctx = NULL;
@@ -1412,7 +1416,7 @@ error:
http_call_connect_cb(http_sock, session, result);
if (http_sock->h2.connect.uri != NULL) {
isc_mem_free(mctx, http_sock->h2.connect.uri);
isc_mem_free(worker->mctx, http_sock->h2.connect.uri);
}
isc__nmsocket_prep_destroy(http_sock);
@@ -1426,6 +1430,8 @@ isc_nm_httpconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer,
size_t extrahandlesize) {
isc_sockaddr_t local_interface;
isc_nmsocket_t *sock = NULL;
int tid = isc_nm_tid();
isc__networker_t *worker = &mgr->workers[tid];
REQUIRE(VALID_NM(mgr));
REQUIRE(cb != NULL);
@@ -1438,8 +1444,8 @@ isc_nm_httpconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer,
local = &local_interface;
}
sock = isc_mem_get(mgr->mctx, sizeof(*sock));
isc__nmsocket_init(sock, mgr, isc_nm_httpsocket, local);
sock = isc_mem_get(worker->mctx, sizeof(*sock));
isc__nmsocket_init(sock, mgr, isc_nm_httpsocket, local, tid);
sock->extrahandlesize = extrahandlesize;
sock->connect_timeout = timeout;
@@ -1457,10 +1463,6 @@ isc_nm_httpconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer,
req->local = *local;
req->handle = isc__nmhandle_get(sock, &req->peer, &sock->iface);
if (isc__nm_in_netthread()) {
sock->tid = isc_nm_tid();
}
isc__nmsocket_clearcb(sock);
isc__nm_connectcb(sock, req, ISC_R_SHUTTINGDOWN, true);
isc__nmsocket_prep_destroy(sock);
@@ -1468,8 +1470,8 @@ isc_nm_httpconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer,
return;
}
sock->h2 = (isc_nmsocket_h2_t){ .connect.uri = isc_mem_strdup(mgr->mctx,
uri),
sock->h2 = (isc_nmsocket_h2_t){ .connect.uri = isc_mem_strdup(
worker->mctx, uri),
.connect.post = post,
.connect.tlsctx = tlsctx };
ISC_LINK_INIT(&sock->h2, link);
@@ -1496,9 +1498,10 @@ static isc_result_t
client_send(isc_nmhandle_t *handle, const isc_region_t *region) {
isc_result_t result = ISC_R_SUCCESS;
isc_nmsocket_t *sock = handle->sock;
isc_mem_t *mctx = sock->mgr->mctx;
isc_nm_http_session_t *session = sock->h2.session;
http_cstream_t *cstream = sock->h2.connect.cstream;
int tid = isc_nm_tid();
isc__networker_t *worker = &sock->mgr->workers[tid];
REQUIRE(VALID_HTTP2_SESSION(handle->sock->h2.session));
REQUIRE(session->client);
@@ -1509,7 +1512,8 @@ client_send(isc_nmhandle_t *handle, const isc_region_t *region) {
if (cstream->post) {
/* POST */
isc_buffer_allocate(mctx, &cstream->postdata, region->length);
isc_buffer_allocate(worker->mctx, &cstream->postdata,
region->length);
isc_buffer_putmem(cstream->postdata, region->base,
region->length);
} else {
@@ -1522,7 +1526,7 @@ client_send(isc_nmhandle_t *handle, const isc_region_t *region) {
isc_region_t base64_region;
size_t base64_len = ((4 * data.length / 3) + 3) & ~3;
isc_buffer_allocate(mctx, &buf, base64_len);
isc_buffer_allocate(worker->mctx, &buf, base64_len);
result = isc_base64_totext(&data, -1, "", buf);
if (result != ISC_R_SUCCESS) {
@@ -1534,7 +1538,7 @@ client_send(isc_nmhandle_t *handle, const isc_region_t *region) {
INSIST(base64_region.length == base64_len);
base64url_data = isc__nm_base64_to_base64url(
mctx, (const char *)base64_region.base,
worker->mctx, (const char *)base64_region.base,
base64_region.length, &base64url_data_len);
isc_buffer_free(&buf);
if (base64url_data == NULL) {
@@ -1543,13 +1547,13 @@ client_send(isc_nmhandle_t *handle, const isc_region_t *region) {
/* len("?dns=") + len(path) + len(base64url) + len("\0") */
path_size = cstream->pathlen + base64url_data_len + 5 + 1;
cstream->GET_path = isc_mem_allocate(mctx, path_size);
cstream->GET_path = isc_mem_allocate(worker->mctx, path_size);
cstream->GET_path_len = (size_t)snprintf(
cstream->GET_path, path_size, "%.*s?dns=%s",
(int)cstream->pathlen, cstream->path, base64url_data);
INSIST(cstream->GET_path_len == (path_size - 1));
isc_mem_free(mctx, base64url_data);
isc_mem_free(worker->mctx, base64url_data);
}
cstream->sending = true;
@@ -1606,6 +1610,7 @@ server_on_begin_headers_callback(nghttp2_session *ngsession,
const nghttp2_frame *frame, void *user_data) {
isc_nm_http_session_t *session = (isc_nm_http_session_t *)user_data;
isc_nmsocket_t *socket = NULL;
int tid = isc_nm_tid();
if (frame->hd.type != NGHTTP2_HEADERS ||
frame->headers.cat != NGHTTP2_HCAT_REQUEST)
@@ -1620,9 +1625,9 @@ server_on_begin_headers_callback(nghttp2_session *ngsession,
}
socket = isc_mem_get(session->mctx, sizeof(isc_nmsocket_t));
isc__nmsocket_init(socket, session->serversocket->mgr,
isc_nm_httpsocket,
(isc_sockaddr_t *)&session->handle->sock->iface);
isc__nmsocket_init(
socket, session->serversocket->mgr, isc_nm_httpsocket,
(isc_sockaddr_t *)&session->handle->sock->iface, tid);
socket->peer = session->handle->sock->peer;
socket->h2 = (isc_nmsocket_h2_t){
.psock = socket,
@@ -1636,6 +1641,7 @@ server_on_begin_headers_callback(nghttp2_session *ngsession,
session->nsstreams++;
isc__nm_httpsession_attach(session, &socket->h2.session);
socket->tid = session->handle->sock->tid;
INSIST(socket->tid == isc_nm_tid());
ISC_LINK_INIT(&socket->h2, link);
ISC_LIST_APPEND(session->sstreams, &socket->h2, link);
@@ -1664,6 +1670,8 @@ server_handle_path_header(isc_nmsocket_t *socket, const uint8_t *value,
isc_nm_httphandler_t *handler = NULL;
const uint8_t *qstr = NULL;
size_t vlen = valuelen;
int tid = isc_nm_tid();
isc__networker_t *worker = &socket->mgr->workers[tid];
qstr = memchr(value, '?', valuelen);
if (qstr != NULL) {
@@ -1671,13 +1679,13 @@ server_handle_path_header(isc_nmsocket_t *socket, const uint8_t *value,
}
if (socket->h2.request_path != NULL) {
isc_mem_free(socket->mgr->mctx, socket->h2.request_path);
isc_mem_free(worker->mctx, socket->h2.request_path);
}
socket->h2.request_path = isc_mem_strndup(
socket->mgr->mctx, (const char *)value, vlen + 1);
socket->h2.request_path =
isc_mem_strndup(worker->mctx, (const char *)value, vlen + 1);
if (!isc_nm_http_path_isvalid(socket->h2.request_path)) {
isc_mem_free(socket->mgr->mctx, socket->h2.request_path);
isc_mem_free(worker->mctx, socket->h2.request_path);
socket->h2.request_path = NULL;
return (ISC_HTTP_ERROR_BAD_REQUEST);
}
@@ -1689,7 +1697,7 @@ server_handle_path_header(isc_nmsocket_t *socket, const uint8_t *value,
socket->h2.cbarg = handler->cbarg;
socket->extrahandlesize = handler->extrahandlesize;
} else {
isc_mem_free(socket->mgr->mctx, socket->h2.request_path);
isc_mem_free(worker->mctx, socket->h2.request_path);
socket->h2.request_path = NULL;
return (ISC_HTTP_ERROR_NOT_FOUND);
}
@@ -1703,12 +1711,12 @@ server_handle_path_header(isc_nmsocket_t *socket, const uint8_t *value,
const size_t decoded_size = dns_value_len / 4 * 3;
if (decoded_size <= MAX_DNS_MESSAGE_SIZE) {
if (socket->h2.query_data != NULL) {
isc_mem_free(socket->mgr->mctx,
isc_mem_free(worker->mctx,
socket->h2.query_data);
}
socket->h2.query_data =
isc__nm_base64url_to_base64(
socket->mgr->mctx, dns_value,
worker->mctx, dns_value,
dns_value_len,
&socket->h2.query_data_len);
} else {
@@ -2129,6 +2137,7 @@ isc__nm_http_send(isc_nmhandle_t *handle, const isc_region_t *region,
isc_nmsocket_t *sock = NULL;
isc__netievent_httpsend_t *ievent = NULL;
isc__nm_uvreq_t *uvreq = NULL;
isc__networker_t *worker = NULL;
REQUIRE(VALID_NMHANDLE(handle));
@@ -2136,6 +2145,8 @@ isc__nm_http_send(isc_nmhandle_t *handle, const isc_region_t *region,
REQUIRE(VALID_NMSOCK(sock));
worker = &sock->mgr->workers[sock->tid];
uvreq = isc__nm_uvreq_get(sock->mgr, sock);
isc_nmhandle_attach(handle, &uvreq->handle);
uvreq->cb.send = cb;
@@ -2144,9 +2155,8 @@ isc__nm_http_send(isc_nmhandle_t *handle, const isc_region_t *region,
uvreq->uvbuf.base = (char *)region->base;
uvreq->uvbuf.len = region->length;
ievent = isc__nm_get_netievent_httpsend(sock->mgr, sock, uvreq);
isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
ievent = isc__nm_get_netievent_httpsend(worker, sock, uvreq);
isc__nm_enqueue_ievent(worker, (isc__netievent_t *)ievent);
}
static void
@@ -2405,6 +2415,8 @@ httplisten_acceptcb(isc_nmhandle_t *handle, isc_result_t result, void *cbarg) {
isc_nmsocket_t *httplistensock = (isc_nmsocket_t *)cbarg;
isc_nm_http_session_t *session = NULL;
isc_nmsocket_t *listener = NULL, *httpserver = NULL;
int tid = isc_nm_tid();
isc__networker_t *worker = &httplistensock->mgr->workers[tid];
REQUIRE(VALID_NMHANDLE(handle));
REQUIRE(VALID_NMSOCK(handle->sock));
@@ -2445,7 +2457,7 @@ httplisten_acceptcb(isc_nmhandle_t *handle, isc_result_t result, void *cbarg) {
http_transpost_tcp_nodelay(handle);
new_session(httplistensock->mgr->mctx, NULL, &session);
new_session(worker->mctx, NULL, &session);
session->max_concurrent_streams =
httplistensock->h2.max_concurrent_streams;
initialize_nghttp2_server_session(session);
@@ -2461,19 +2473,21 @@ httplisten_acceptcb(isc_nmhandle_t *handle, isc_result_t result, void *cbarg) {
}
isc_result_t
isc_nm_listenhttp(isc_nm_t *mgr, isc_sockaddr_t *iface, int backlog,
isc_quota_t *quota, isc_tlsctx_t *ctx,
isc_nm_listenhttp(isc_nm_t *mgr, uint32_t workers, isc_sockaddr_t *iface,
int backlog, isc_quota_t *quota, isc_tlsctx_t *ctx,
isc_nm_http_endpoints_t *eps, uint32_t max_concurrent_streams,
isc_nmsocket_t **sockp) {
isc_nmsocket_t *sock = NULL;
isc_result_t result;
int tid = isc_nm_tid();
isc__networker_t *worker = &mgr->workers[tid];
REQUIRE(!ISC_LIST_EMPTY(eps->handlers));
REQUIRE(!ISC_LIST_EMPTY(eps->handler_cbargs));
REQUIRE(atomic_load(&eps->in_use) == false);
sock = isc_mem_get(mgr->mctx, sizeof(*sock));
isc__nmsocket_init(sock, mgr, isc_nm_httplistener, iface);
sock = isc_mem_get(worker->mctx, sizeof(*sock));
isc__nmsocket_init(sock, mgr, isc_nm_httplistener, iface, tid);
sock->h2.max_concurrent_streams =
NGHTTP2_INITIAL_MAX_CONCURRENT_STREAMS;
@@ -2487,11 +2501,13 @@ isc_nm_listenhttp(isc_nm_t *mgr, isc_sockaddr_t *iface, int backlog,
isc_nm_http_endpoints_attach(eps, &sock->h2.listener_endpoints);
if (ctx != NULL) {
result = isc_nm_listentls(mgr, iface, httplisten_acceptcb, sock,
result = isc_nm_listentls(mgr, workers, iface,
httplisten_acceptcb, sock,
sizeof(isc_nm_http_session_t),
backlog, quota, ctx, &sock->outer);
} else {
result = isc_nm_listentcp(mgr, iface, httplisten_acceptcb, sock,
result = isc_nm_listentcp(mgr, workers, iface,
httplisten_acceptcb, sock,
sizeof(isc_nm_http_session_t),
backlog, quota, &sock->outer);
}
@@ -2506,7 +2522,6 @@ isc_nm_listenhttp(isc_nm_t *mgr, isc_sockaddr_t *iface, int backlog,
sock->nchildren = sock->outer->nchildren;
sock->result = ISC_R_UNSET;
sock->tid = 0;
sock->fd = (uv_os_sock_t)-1;
atomic_store(&sock->listening, true);
@@ -2676,10 +2691,10 @@ isc__nm_http_stoplistening(isc_nmsocket_t *sock) {
}
if (!isc__nm_in_netthread()) {
isc__networker_t *worker = &sock->mgr->workers[sock->tid];
isc__netievent_httpstop_t *ievent =
isc__nm_get_netievent_httpstop(sock->mgr, sock);
isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
isc__nm_get_netievent_httpstop(worker, sock);
isc__nm_enqueue_ievent(worker, (isc__netievent_t *)ievent);
} else {
REQUIRE(isc_nm_tid() == sock->tid);
isc__netievent_httpstop_t ievent = { .sock = sock };
@@ -2730,6 +2745,9 @@ http_close_direct(isc_nmsocket_t *sock) {
void
isc__nm_http_close(isc_nmsocket_t *sock) {
bool destroy = false;
isc__netievent_httpclose_t *ievent = NULL;
isc__networker_t *worker = NULL;
REQUIRE(VALID_NMSOCK(sock));
REQUIRE(sock->type == isc_nm_httpsocket);
REQUIRE(!isc__nmsocket_active(sock));
@@ -2754,11 +2772,10 @@ isc__nm_http_close(isc_nmsocket_t *sock) {
return;
}
isc__netievent_httpclose_t *ievent =
isc__nm_get_netievent_httpclose(sock->mgr, sock);
worker = &sock->mgr->workers[sock->tid];
ievent = isc__nm_get_netievent_httpclose(worker, sock);
isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
isc__nm_enqueue_ievent(worker, (isc__netievent_t *)ievent);
}
void
@@ -3052,6 +3069,9 @@ isc__nm_http_initsocket(isc_nmsocket_t *sock) {
void
isc__nm_http_cleanup_data(isc_nmsocket_t *sock) {
int tid = isc_nm_tid();
isc__networker_t *worker = &sock->mgr->workers[tid];
if ((sock->type == isc_nm_tcplistener ||
sock->type == isc_nm_tlslistener) &&
sock->h2.httpserver != NULL)
@@ -3069,12 +3089,12 @@ isc__nm_http_cleanup_data(isc_nmsocket_t *sock) {
}
if (sock->h2.request_path != NULL) {
isc_mem_free(sock->mgr->mctx, sock->h2.request_path);
isc_mem_free(worker->mctx, sock->h2.request_path);
sock->h2.request_path = NULL;
}
if (sock->h2.query_data != NULL) {
isc_mem_free(sock->mgr->mctx, sock->h2.query_data);
isc_mem_free(worker->mctx, sock->h2.query_data);
sock->h2.query_data = NULL;
}
@@ -3082,7 +3102,7 @@ isc__nm_http_cleanup_data(isc_nmsocket_t *sock) {
if (isc_buffer_base(&sock->h2.rbuf) != NULL) {
void *base = isc_buffer_base(&sock->h2.rbuf);
isc_mem_free(sock->mgr->mctx, base);
isc_mem_free(worker->mctx, base);
isc_buffer_initnull(&sock->h2.rbuf);
}
}
@@ -3094,7 +3114,7 @@ isc__nm_http_cleanup_data(isc_nmsocket_t *sock) {
sock->h2.session != NULL)
{
if (sock->h2.connect.uri != NULL) {
isc_mem_free(sock->mgr->mctx, sock->h2.connect.uri);
isc_mem_free(worker->mctx, sock->h2.connect.uri);
sock->h2.connect.uri = NULL;
}
isc__nm_httpsession_detach(&sock->h2.session);
+112 -74
View File
@@ -162,8 +162,8 @@ isc__nm_dump_active(isc_nm_t *nm);
isc___nm_uvreq_get(req, sock, __FILE__, __LINE__, __func__)
#define isc__nm_uvreq_put(req, sock) \
isc___nm_uvreq_put(req, sock, __FILE__, __LINE__, __func__)
#define isc__nmsocket_init(sock, mgr, type, iface) \
isc___nmsocket_init(sock, mgr, type, iface, __FILE__, __LINE__, \
#define isc__nmsocket_init(sock, mgr, type, iface, tid) \
isc___nmsocket_init(sock, mgr, type, iface, tid, __FILE__, __LINE__, \
__func__)
#define isc__nmsocket_put(sockp) \
isc___nmsocket_put(sockp, __FILE__, __LINE__, __func__)
@@ -186,8 +186,8 @@ isc__nm_dump_active(isc_nm_t *nm);
#define FLARG_IEVENT_PASS(ievent)
#define isc__nm_uvreq_get(req, sock) isc___nm_uvreq_get(req, sock)
#define isc__nm_uvreq_put(req, sock) isc___nm_uvreq_put(req, sock)
#define isc__nmsocket_init(sock, mgr, type, iface) \
isc___nmsocket_init(sock, mgr, type, iface)
#define isc__nmsocket_init(sock, mgr, type, iface, tid) \
isc___nmsocket_init(sock, mgr, type, iface, tid)
#define isc__nmsocket_put(sockp) isc___nmsocket_put(sockp)
#define isc__nmsocket_attach(sock, target) isc___nmsocket_attach(sock, target)
#define isc__nmsocket_detach(socketp) isc___nmsocket_detach(socketp)
@@ -224,6 +224,7 @@ typedef struct ievent {
*/
typedef struct isc__networker {
isc_nm_t *mgr;
isc_mem_t *mctx; /* per worker memory context */
int id; /* thread id */
uv_loop_t loop; /* libuv loop structure */
uv_async_t async; /* async channel to send
@@ -334,6 +335,7 @@ typedef enum isc__netievent_type {
netievent_task,
netievent_privilegedtask,
netievent_run,
/*
* event type values higher than this will be treated
@@ -402,12 +404,12 @@ struct isc__nm_uvreq {
};
void *
isc__nm_get_netievent(isc_nm_t *mgr, isc__netievent_type type);
isc__nm_get_netievent(isc__networker_t *worker, isc__netievent_type type);
/*%<
* Allocate an ievent and set the type.
*/
void
isc__nm_put_netievent(isc_nm_t *mgr, void *ievent);
isc__nm_put_netievent(isc__networker_t *worker, void *ievent);
/*
* The macros here are used to simulate the "inheritance" in C, there's the base
@@ -451,26 +453,26 @@ typedef struct isc__netievent__socket {
#define NETIEVENT_SOCKET_TYPE(type) \
typedef isc__netievent__socket_t isc__netievent_##type##_t;
#define NETIEVENT_SOCKET_DECL(type) \
isc__netievent_##type##_t *isc__nm_get_netievent_##type( \
isc_nm_t *nm, isc_nmsocket_t *sock); \
void isc__nm_put_netievent_##type(isc_nm_t *nm, \
#define NETIEVENT_SOCKET_DECL(type) \
isc__netievent_##type##_t *isc__nm_get_netievent_##type( \
isc__networker_t *worker, isc_nmsocket_t *sock); \
void isc__nm_put_netievent_##type(isc__networker_t *worker, \
isc__netievent_##type##_t *ievent);
#define NETIEVENT_SOCKET_DEF(type) \
isc__netievent_##type##_t *isc__nm_get_netievent_##type( \
isc_nm_t *nm, isc_nmsocket_t *sock) { \
isc__networker_t *worker, isc_nmsocket_t *sock) { \
isc__netievent_##type##_t *ievent = \
isc__nm_get_netievent(nm, netievent_##type); \
isc__nm_get_netievent(worker, netievent_##type); \
isc__nmsocket_attach(sock, &ievent->sock); \
\
return (ievent); \
} \
\
void isc__nm_put_netievent_##type(isc_nm_t *nm, \
void isc__nm_put_netievent_##type(isc__networker_t *worker, \
isc__netievent_##type##_t *ievent) { \
isc__nmsocket_detach(&ievent->sock); \
isc__nm_put_netievent(nm, ievent); \
isc__nm_put_netievent(worker, ievent); \
}
typedef struct isc__netievent__socket_req {
@@ -481,27 +483,29 @@ typedef struct isc__netievent__socket_req {
#define NETIEVENT_SOCKET_REQ_TYPE(type) \
typedef isc__netievent__socket_req_t isc__netievent_##type##_t;
#define NETIEVENT_SOCKET_REQ_DECL(type) \
isc__netievent_##type##_t *isc__nm_get_netievent_##type( \
isc_nm_t *nm, isc_nmsocket_t *sock, isc__nm_uvreq_t *req); \
void isc__nm_put_netievent_##type(isc_nm_t *nm, \
#define NETIEVENT_SOCKET_REQ_DECL(type) \
isc__netievent_##type##_t *isc__nm_get_netievent_##type( \
isc__networker_t *worker, isc_nmsocket_t *sock, \
isc__nm_uvreq_t *req); \
void isc__nm_put_netievent_##type(isc__networker_t *worker, \
isc__netievent_##type##_t *ievent);
#define NETIEVENT_SOCKET_REQ_DEF(type) \
isc__netievent_##type##_t *isc__nm_get_netievent_##type( \
isc_nm_t *nm, isc_nmsocket_t *sock, isc__nm_uvreq_t *req) { \
isc__networker_t *worker, isc_nmsocket_t *sock, \
isc__nm_uvreq_t *req) { \
isc__netievent_##type##_t *ievent = \
isc__nm_get_netievent(nm, netievent_##type); \
isc__nm_get_netievent(worker, netievent_##type); \
isc__nmsocket_attach(sock, &ievent->sock); \
ievent->req = req; \
\
return (ievent); \
} \
\
void isc__nm_put_netievent_##type(isc_nm_t *nm, \
void isc__nm_put_netievent_##type(isc__networker_t *worker, \
isc__netievent_##type##_t *ievent) { \
isc__nmsocket_detach(&ievent->sock); \
isc__nm_put_netievent(nm, ievent); \
isc__nm_put_netievent(worker, ievent); \
}
typedef struct isc__netievent__socket_req_result {
@@ -513,19 +517,19 @@ typedef struct isc__netievent__socket_req_result {
#define NETIEVENT_SOCKET_REQ_RESULT_TYPE(type) \
typedef isc__netievent__socket_req_result_t isc__netievent_##type##_t;
#define NETIEVENT_SOCKET_REQ_RESULT_DECL(type) \
isc__netievent_##type##_t *isc__nm_get_netievent_##type( \
isc_nm_t *nm, isc_nmsocket_t *sock, isc__nm_uvreq_t *req, \
isc_result_t result); \
void isc__nm_put_netievent_##type(isc_nm_t *nm, \
#define NETIEVENT_SOCKET_REQ_RESULT_DECL(type) \
isc__netievent_##type##_t *isc__nm_get_netievent_##type( \
isc__networker_t *worker, isc_nmsocket_t *sock, \
isc__nm_uvreq_t *req, isc_result_t result); \
void isc__nm_put_netievent_##type(isc__networker_t *worker, \
isc__netievent_##type##_t *ievent);
#define NETIEVENT_SOCKET_REQ_RESULT_DEF(type) \
isc__netievent_##type##_t *isc__nm_get_netievent_##type( \
isc_nm_t *nm, isc_nmsocket_t *sock, isc__nm_uvreq_t *req, \
isc_result_t result) { \
isc__networker_t *worker, isc_nmsocket_t *sock, \
isc__nm_uvreq_t *req, isc_result_t result) { \
isc__netievent_##type##_t *ievent = \
isc__nm_get_netievent(nm, netievent_##type); \
isc__nm_get_netievent(worker, netievent_##type); \
isc__nmsocket_attach(sock, &ievent->sock); \
ievent->req = req; \
ievent->result = result; \
@@ -533,10 +537,10 @@ typedef struct isc__netievent__socket_req_result {
return (ievent); \
} \
\
void isc__nm_put_netievent_##type(isc_nm_t *nm, \
void isc__nm_put_netievent_##type(isc__networker_t *worker, \
isc__netievent_##type##_t *ievent) { \
isc__nmsocket_detach(&ievent->sock); \
isc__nm_put_netievent(nm, ievent); \
isc__nm_put_netievent(worker, ievent); \
}
typedef struct isc__netievent__socket_handle {
@@ -547,28 +551,30 @@ typedef struct isc__netievent__socket_handle {
#define NETIEVENT_SOCKET_HANDLE_TYPE(type) \
typedef isc__netievent__socket_handle_t isc__netievent_##type##_t;
#define NETIEVENT_SOCKET_HANDLE_DECL(type) \
isc__netievent_##type##_t *isc__nm_get_netievent_##type( \
isc_nm_t *nm, isc_nmsocket_t *sock, isc_nmhandle_t *handle); \
void isc__nm_put_netievent_##type(isc_nm_t *nm, \
#define NETIEVENT_SOCKET_HANDLE_DECL(type) \
isc__netievent_##type##_t *isc__nm_get_netievent_##type( \
isc__networker_t *worker, isc_nmsocket_t *sock, \
isc_nmhandle_t *handle); \
void isc__nm_put_netievent_##type(isc__networker_t *worker, \
isc__netievent_##type##_t *ievent);
#define NETIEVENT_SOCKET_HANDLE_DEF(type) \
isc__netievent_##type##_t *isc__nm_get_netievent_##type( \
isc_nm_t *nm, isc_nmsocket_t *sock, isc_nmhandle_t *handle) { \
isc__networker_t *worker, isc_nmsocket_t *sock, \
isc_nmhandle_t *handle) { \
isc__netievent_##type##_t *ievent = \
isc__nm_get_netievent(nm, netievent_##type); \
isc__nm_get_netievent(worker, netievent_##type); \
isc__nmsocket_attach(sock, &ievent->sock); \
isc_nmhandle_attach(handle, &ievent->handle); \
\
return (ievent); \
} \
\
void isc__nm_put_netievent_##type(isc_nm_t *nm, \
void isc__nm_put_netievent_##type(isc__networker_t *worker, \
isc__netievent_##type##_t *ievent) { \
isc__nmsocket_detach(&ievent->sock); \
isc_nmhandle_detach(&ievent->handle); \
isc__nm_put_netievent(nm, ievent); \
isc__nm_put_netievent(worker, ievent); \
}
typedef struct isc__netievent__socket_quota {
@@ -579,27 +585,29 @@ typedef struct isc__netievent__socket_quota {
#define NETIEVENT_SOCKET_QUOTA_TYPE(type) \
typedef isc__netievent__socket_quota_t isc__netievent_##type##_t;
#define NETIEVENT_SOCKET_QUOTA_DECL(type) \
isc__netievent_##type##_t *isc__nm_get_netievent_##type( \
isc_nm_t *nm, isc_nmsocket_t *sock, isc_quota_t *quota); \
void isc__nm_put_netievent_##type(isc_nm_t *nm, \
#define NETIEVENT_SOCKET_QUOTA_DECL(type) \
isc__netievent_##type##_t *isc__nm_get_netievent_##type( \
isc__networker_t *worker, isc_nmsocket_t *sock, \
isc_quota_t *quota); \
void isc__nm_put_netievent_##type(isc__networker_t *worker, \
isc__netievent_##type##_t *ievent);
#define NETIEVENT_SOCKET_QUOTA_DEF(type) \
isc__netievent_##type##_t *isc__nm_get_netievent_##type( \
isc_nm_t *nm, isc_nmsocket_t *sock, isc_quota_t *quota) { \
isc__networker_t *worker, isc_nmsocket_t *sock, \
isc_quota_t *quota) { \
isc__netievent_##type##_t *ievent = \
isc__nm_get_netievent(nm, netievent_##type); \
isc__nm_get_netievent(worker, netievent_##type); \
isc__nmsocket_attach(sock, &ievent->sock); \
ievent->quota = quota; \
\
return (ievent); \
} \
\
void isc__nm_put_netievent_##type(isc_nm_t *nm, \
void isc__nm_put_netievent_##type(isc__networker_t *worker, \
isc__netievent_##type##_t *ievent) { \
isc__nmsocket_detach(&ievent->sock); \
isc__nm_put_netievent(nm, ievent); \
isc__nm_put_netievent(worker, ievent); \
}
typedef struct isc__netievent__task {
@@ -611,26 +619,57 @@ typedef struct isc__netievent__task {
#define NETIEVENT_TASK_TYPE(type) \
typedef isc__netievent__task_t isc__netievent_##type##_t;
#define NETIEVENT_TASK_DECL(type) \
isc__netievent_##type##_t *isc__nm_get_netievent_##type( \
isc_nm_t *nm, isc_task_t *task); \
void isc__nm_put_netievent_##type(isc_nm_t *nm, \
#define NETIEVENT_TASK_DECL(type) \
isc__netievent_##type##_t *isc__nm_get_netievent_##type( \
isc__networker_t *worker, isc_task_t *task); \
void isc__nm_put_netievent_##type(isc__networker_t *worker, \
isc__netievent_##type##_t *ievent);
#define NETIEVENT_TASK_DEF(type) \
isc__netievent_##type##_t *isc__nm_get_netievent_##type( \
isc_nm_t *nm, isc_task_t *task) { \
isc__networker_t *worker, isc_task_t *task) { \
isc__netievent_##type##_t *ievent = \
isc__nm_get_netievent(nm, netievent_##type); \
isc__nm_get_netievent(worker, netievent_##type); \
ievent->task = task; \
\
return (ievent); \
} \
\
void isc__nm_put_netievent_##type(isc_nm_t *nm, \
void isc__nm_put_netievent_##type(isc__networker_t *worker, \
isc__netievent_##type##_t *ievent) { \
ievent->task = NULL; \
isc__nm_put_netievent(nm, ievent); \
isc__nm_put_netievent(worker, ievent); \
}
typedef struct isc__netievent_run {
isc__netievent_type type;
ISC_LINK(isc__netievent_t) link;
isc_nm_run_cb cb;
void *cbarg;
} isc__netievent_run_t;
#define NETIEVENT_RUN_DECL(type) \
isc__netievent_##type##_t *isc__nm_get_netievent_##type( \
isc__networker_t *worker, isc_nm_run_cb cb, void *cbarg); \
void isc__nm_put_netievent_##type(isc__networker_t *worker, \
isc__netievent_##type##_t *ievent);
#define NETIEVENT_RUN_DEF(type) \
isc__netievent_##type##_t *isc__nm_get_netievent_##type( \
isc__networker_t *worker, isc_nm_run_cb cb, void *cbarg) { \
isc__netievent_##type##_t *ievent = \
isc__nm_get_netievent(worker, netievent_##type); \
ievent->cb = cb; \
ievent->cbarg = cbarg; \
\
return (ievent); \
} \
\
void isc__nm_put_netievent_##type(isc__networker_t *worker, \
isc__netievent_##type##_t *ievent) { \
ievent->cb = NULL; \
ievent->cbarg = NULL; \
isc__nm_put_netievent(worker, ievent); \
}
typedef struct isc__netievent_udpsend {
@@ -653,23 +692,24 @@ typedef struct isc__netievent {
#define NETIEVENT_TYPE(type) typedef isc__netievent_t isc__netievent_##type##_t;
#define NETIEVENT_DECL(type) \
isc__netievent_##type##_t *isc__nm_get_netievent_##type(isc_nm_t *nm); \
void isc__nm_put_netievent_##type(isc_nm_t *nm, \
#define NETIEVENT_DECL(type) \
isc__netievent_##type##_t *isc__nm_get_netievent_##type( \
isc__networker_t *worker); \
void isc__nm_put_netievent_##type(isc__networker_t *worker, \
isc__netievent_##type##_t *ievent);
#define NETIEVENT_DEF(type) \
isc__netievent_##type##_t *isc__nm_get_netievent_##type( \
isc_nm_t *nm) { \
isc__networker_t *worker) { \
isc__netievent_##type##_t *ievent = \
isc__nm_get_netievent(nm, netievent_##type); \
isc__nm_get_netievent(worker, netievent_##type); \
\
return (ievent); \
} \
\
void isc__nm_put_netievent_##type(isc_nm_t *nm, \
void isc__nm_put_netievent_##type(isc__networker_t *worker, \
isc__netievent_##type##_t *ievent) { \
isc__nm_put_netievent(nm, ievent); \
isc__nm_put_netievent(worker, ievent); \
}
typedef union {
@@ -698,11 +738,14 @@ typedef struct isc__nm_work {
#define NM_MAGIC ISC_MAGIC('N', 'E', 'T', 'M')
#define VALID_NM(t) ISC_MAGIC_VALID(t, NM_MAGIC)
#define VALID_NM_TID(netmgr, tid) \
((tid) >= 0 && (uint32_t)(tid) < (netmgr)->nworkers)
struct isc_nm {
int magic;
isc_refcount_t references;
isc_mem_t *mctx;
int nworkers;
isc_mem_t *private_mctx;
uint32_t nworkers;
isc_mutex_t lock;
isc_condition_t wkstatecond;
isc_condition_t wkpausecond;
@@ -982,7 +1025,7 @@ struct isc_nmsocket {
/*% Child sockets for multi-socket setups */
isc_nmsocket_t *children;
uint_fast32_t nchildren;
uint32_t nchildren;
isc_sockaddr_t iface;
isc_nmhandle_t *statichandle;
isc_nmhandle_t *outerhandle;
@@ -1052,13 +1095,6 @@ struct isc_nmsocket {
*/
atomic_bool keepalive;
/*%
* 'spare' handles for that can be reused to avoid allocations,
* for UDP.
*/
isc_astack_t *inactivehandles;
isc_astack_t *inactivereqs;
/*%
* Used to wait for TCP listening events to complete, and
* for the number of running children to reach zero during
@@ -1202,7 +1238,7 @@ isc___nm_uvreq_put(isc__nm_uvreq_t **req, isc_nmsocket_t *sock FLARG);
void
isc___nmsocket_init(isc_nmsocket_t *sock, isc_nm_t *mgr, isc_nmsocket_type type,
isc_sockaddr_t *iface FLARG);
isc_sockaddr_t *iface, int tid FLARG);
/*%<
* Initialize socket 'sock', attach it to 'mgr', and set it to type 'type'
* and its interface to 'iface'.
@@ -2026,6 +2062,8 @@ NETIEVENT_DECL(stop);
NETIEVENT_TASK_DECL(task);
NETIEVENT_TASK_DECL(privilegedtask);
NETIEVENT_RUN_DECL(run);
void
isc__nm_udp_failed_read_cb(isc_nmsocket_t *sock, isc_result_t result);
void
+129 -134
View File
@@ -183,6 +183,7 @@ nmhandle_detach_cb(isc_nmhandle_t **handlep FLARG);
int
isc_nm_tid(void) {
REQUIRE(isc__nm_in_netthread());
return (isc__nm_tid_v);
}
@@ -219,7 +220,7 @@ isc__netmgr_create(isc_mem_t *mctx, uint32_t workers, isc_nm_t **netmgrp) {
mgr = isc_mem_get(mctx, sizeof(*mgr));
*mgr = (isc_nm_t){ .nworkers = workers };
isc_mem_attach(mctx, &mgr->mctx);
isc_mem_attach(mctx, &mgr->private_mctx);
isc_mutex_init(&mgr->lock);
isc_condition_init(&mgr->wkstatecond);
isc_condition_init(&mgr->wkpausecond);
@@ -260,6 +261,9 @@ isc__netmgr_create(isc_mem_t *mctx, uint32_t workers, isc_nm_t **netmgrp) {
.id = i,
};
isc_mem_create(&worker->mctx);
isc_mem_setname(worker->mctx, "netmgr-worker");
r = uv_loop_init(&worker->loop);
UV_RUNTIME_CHECK(uv_loop_init, r);
@@ -274,8 +278,10 @@ isc__netmgr_create(isc_mem_t *mctx, uint32_t workers, isc_nm_t **netmgrp) {
ISC_LIST_INIT(worker->ievents[type].list);
}
worker->recvbuf = isc_mem_get(mctx, ISC_NETMGR_RECVBUF_SIZE);
worker->sendbuf = isc_mem_get(mctx, ISC_NETMGR_SENDBUF_SIZE);
worker->recvbuf = isc_mem_get(worker->mctx,
ISC_NETMGR_RECVBUF_SIZE);
worker->sendbuf = isc_mem_get(worker->mctx,
ISC_NETMGR_SENDBUF_SIZE);
/*
* We need to do this here and not in nm_thread to avoid a
@@ -308,9 +314,9 @@ nm_destroy(isc_nm_t **mgr0) {
mgr->magic = 0;
for (int i = 0; i < mgr->nworkers; i++) {
for (size_t i = 0; i < mgr->nworkers; i++) {
isc__networker_t *worker = &mgr->workers[i];
isc__netievent_t *event = isc__nm_get_netievent_stop(mgr);
isc__netievent_t *event = isc__nm_get_netievent_stop(worker);
isc__nm_enqueue_ievent(worker, event);
}
@@ -320,7 +326,7 @@ nm_destroy(isc_nm_t **mgr0) {
}
UNLOCK(&mgr->lock);
for (int i = 0; i < mgr->nworkers; i++) {
for (size_t i = 0; i < mgr->nworkers; i++) {
isc__networker_t *worker = &mgr->workers[i];
int r;
@@ -333,11 +339,13 @@ nm_destroy(isc_nm_t **mgr0) {
isc_mutex_destroy(&worker->ievents[type].lock);
}
isc_mem_put(mgr->mctx, worker->sendbuf,
isc_mem_put(worker->mctx, worker->sendbuf,
ISC_NETMGR_SENDBUF_SIZE);
isc_mem_put(mgr->mctx, worker->recvbuf,
isc_mem_put(worker->mctx, worker->recvbuf,
ISC_NETMGR_RECVBUF_SIZE);
isc_thread_join(worker->thread, NULL);
isc_mem_detach(&worker->mctx);
}
if (mgr->stats != NULL) {
@@ -351,15 +359,14 @@ nm_destroy(isc_nm_t **mgr0) {
isc_condition_destroy(&mgr->wkpausecond);
isc_mutex_destroy(&mgr->lock);
isc_mem_put(mgr->mctx, mgr->workers,
isc_mem_put(mgr->private_mctx, mgr->workers,
mgr->nworkers * sizeof(isc__networker_t));
isc_mem_putanddetach(&mgr->mctx, mgr, sizeof(*mgr));
isc_mem_putanddetach(&mgr->private_mctx, mgr, sizeof(*mgr));
}
static void
enqueue_pause(isc__networker_t *worker) {
isc__netievent_pause_t *event =
isc__nm_get_netievent_pause(worker->mgr);
isc__netievent_pause_t *event = isc__nm_get_netievent_pause(worker);
isc__nm_enqueue_ievent(worker, (isc__netievent_t *)event);
}
@@ -383,9 +390,9 @@ isc_nm_pause(isc_nm_t *mgr) {
REQUIRE(isc_nm_tid() == 0);
}
for (int i = 0; i < mgr->nworkers; i++) {
for (size_t i = 0; i < mgr->nworkers; i++) {
isc__networker_t *worker = &mgr->workers[i];
if (i == isc_nm_tid()) {
if (i == (size_t)isc_nm_tid()) {
isc__nm_async_pause(worker, NULL);
} else {
enqueue_pause(worker);
@@ -409,8 +416,7 @@ isc_nm_pause(isc_nm_t *mgr) {
static void
enqueue_resume(isc__networker_t *worker) {
isc__netievent_resume_t *event =
isc__nm_get_netievent_resume(worker->mgr);
isc__netievent_resume_t *event = isc__nm_get_netievent_resume(worker);
isc__nm_enqueue_ievent(worker, (isc__netievent_t *)event);
}
@@ -432,9 +438,9 @@ isc_nm_resume(isc_nm_t *mgr) {
drain_queue(&mgr->workers[isc_nm_tid()], NETIEVENT_PRIORITY);
}
for (int i = 0; i < mgr->nworkers; i++) {
for (size_t i = 0; i < mgr->nworkers; i++) {
isc__networker_t *worker = &mgr->workers[i];
if (i == isc_nm_tid()) {
if (i == (size_t)isc_nm_tid()) {
isc__nm_async_resume(worker, NULL);
} else {
enqueue_resume(worker);
@@ -490,9 +496,9 @@ isc__netmgr_shutdown(isc_nm_t *mgr) {
REQUIRE(VALID_NM(mgr));
atomic_store(&mgr->closing, true);
for (int i = 0; i < mgr->nworkers; i++) {
for (size_t i = 0; i < (size_t)mgr->nworkers; i++) {
isc__netievent_t *event = NULL;
event = isc__nm_get_netievent_shutdown(mgr);
event = isc__nm_get_netievent_shutdown(&mgr->workers[i]);
isc__nm_enqueue_ievent(&mgr->workers[i], event);
}
}
@@ -759,21 +765,36 @@ void
isc_nm_task_enqueue(isc_nm_t *nm, isc_task_t *task, int tid) {
isc__netievent_t *event = NULL;
isc__networker_t *worker = NULL;
REQUIRE(tid >= 0 && tid < nm->nworkers);
REQUIRE(VALID_NM_TID(nm, tid));
worker = &nm->workers[tid];
if (isc_task_privileged(task)) {
event = (isc__netievent_t *)
isc__nm_get_netievent_privilegedtask(nm, task);
isc__nm_get_netievent_privilegedtask(worker, task);
} else {
event = (isc__netievent_t *)isc__nm_get_netievent_task(nm,
event = (isc__netievent_t *)isc__nm_get_netievent_task(worker,
task);
}
isc__nm_enqueue_ievent(worker, event);
}
void
isc_nm_run(isc_nm_t *netmgr, isc_nm_run_cb cb, void *cbarg, int tid) {
isc__netievent_run_t *event = NULL;
isc__networker_t *worker = NULL;
REQUIRE(VALID_NM_TID(netmgr, tid));
worker = &netmgr->workers[tid];
event = isc__nm_get_netievent_run(worker, cb, cbarg);
isc__nm_enqueue_ievent(worker, (isc__netievent_t *)event);
}
#define isc__nm_async_privilegedtask(worker, ev0) \
isc__nm_async_task(worker, ev0)
@@ -798,6 +819,15 @@ isc__nm_async_task(isc__networker_t *worker, isc__netievent_t *ev0) {
}
}
static void
isc__nm_async_run(isc__networker_t *worker, isc__netievent_t *ev0) {
isc__netievent_run_t *ievent = (isc__netievent_run_t *)ev0;
UNUSED(worker);
ievent->cb(ievent->cbarg);
}
static void
wait_for_priority_queue(isc__networker_t *worker) {
isc_condition_t *cond = &worker->ievents[NETIEVENT_PRIORITY].cond;
@@ -833,19 +863,19 @@ drain_queue(isc__networker_t *worker, netievent_type_t type) {
* process_queue() to stop, e.g. it's only used for the netievent that
* stops/pauses processing the enqueued netievents.
*/
#define NETIEVENT_CASE(type) \
case netievent_##type: { \
isc__nm_async_##type(worker, ievent); \
isc__nm_put_netievent_##type( \
worker->mgr, (isc__netievent_##type##_t *)ievent); \
return (true); \
#define NETIEVENT_CASE(type) \
case netievent_##type: { \
isc__nm_async_##type(worker, ievent); \
isc__nm_put_netievent_##type( \
worker, (isc__netievent_##type##_t *)ievent); \
return (true); \
}
#define NETIEVENT_CASE_NOMORE(type) \
case netievent_##type: { \
isc__nm_async_##type(worker, ievent); \
isc__nm_put_netievent_##type(worker->mgr, ievent); \
return (false); \
#define NETIEVENT_CASE_NOMORE(type) \
case netievent_##type: { \
isc__nm_async_##type(worker, ievent); \
isc__nm_put_netievent_##type(worker, ievent); \
return (false); \
}
static bool
@@ -859,6 +889,8 @@ process_netievent(isc__networker_t *worker, isc__netievent_t *ievent) {
NETIEVENT_CASE(privilegedtask);
NETIEVENT_CASE(task);
NETIEVENT_CASE(run);
NETIEVENT_CASE(udpconnect);
NETIEVENT_CASE(udplisten);
NETIEVENT_CASE(udpstop);
@@ -972,8 +1004,8 @@ process_queue(isc__networker_t *worker, netievent_type_t type) {
}
void *
isc__nm_get_netievent(isc_nm_t *mgr, isc__netievent_type type) {
isc__netievent_storage_t *event = isc_mem_get(mgr->mctx,
isc__nm_get_netievent(isc__networker_t *worker, isc__netievent_type type) {
isc__netievent_storage_t *event = isc_mem_get(worker->mctx,
sizeof(*event));
*event = (isc__netievent_storage_t){ .ni.type = type };
@@ -982,8 +1014,8 @@ isc__nm_get_netievent(isc_nm_t *mgr, isc__netievent_type type) {
}
void
isc__nm_put_netievent(isc_nm_t *mgr, void *ievent) {
isc_mem_put(mgr->mctx, ievent, sizeof(isc__netievent_storage_t));
isc__nm_put_netievent(isc__networker_t *worker, void *ievent) {
isc_mem_put(worker->mctx, ievent, sizeof(isc__netievent_storage_t));
}
NETIEVENT_SOCKET_DEF(tcpclose);
@@ -1050,6 +1082,8 @@ NETIEVENT_DEF(stop);
NETIEVENT_TASK_DEF(task);
NETIEVENT_TASK_DEF(privilegedtask);
NETIEVENT_RUN_DEF(run);
void
isc__nm_maybe_enqueue_ievent(isc__networker_t *worker,
isc__netievent_t *event) {
@@ -1154,12 +1188,13 @@ isc___nmsocket_attach(isc_nmsocket_t *sock, isc_nmsocket_t **target FLARG) {
*/
static void
nmsocket_cleanup(isc_nmsocket_t *sock, bool dofree FLARG) {
isc_nmhandle_t *handle = NULL;
isc__nm_uvreq_t *uvreq = NULL;
isc__networker_t *worker;
REQUIRE(VALID_NMSOCK(sock));
REQUIRE(!isc__nmsocket_active(sock));
worker = &sock->mgr->workers[sock->tid];
NETMGR_TRACE_LOG("nmsocket_cleanup():%p->references = %" PRIuFAST32
"\n",
sock, isc_refcount_current(&sock->references));
@@ -1190,7 +1225,7 @@ nmsocket_cleanup(isc_nmsocket_t *sock, bool dofree FLARG) {
/*
* Now free them.
*/
isc_mem_put(sock->mgr->mctx, sock->children,
isc_mem_put(worker->mctx, sock->children,
sock->nchildren * sizeof(*sock));
sock->children = NULL;
sock->nchildren = 0;
@@ -1206,12 +1241,8 @@ nmsocket_cleanup(isc_nmsocket_t *sock, bool dofree FLARG) {
isc___nmsocket_detach(&sock->outer FLARG_PASS);
}
while ((handle = isc_astack_pop(sock->inactivehandles)) != NULL) {
nmhandle_free(sock, handle);
}
if (sock->buf != NULL) {
isc_mem_put(sock->mgr->mctx, sock->buf, sock->buf_size);
isc_mem_put(worker->mctx, sock->buf, sock->buf_size);
}
if (sock->quota != NULL) {
@@ -1220,13 +1251,6 @@ nmsocket_cleanup(isc_nmsocket_t *sock, bool dofree FLARG) {
sock->pquota = NULL;
isc_astack_destroy(sock->inactivehandles);
while ((uvreq = isc_astack_pop(sock->inactivereqs)) != NULL) {
isc_mem_put(sock->mgr->mctx, uvreq, sizeof(*uvreq));
}
isc_astack_destroy(sock->inactivereqs);
sock->magic = 0;
isc_condition_destroy(&sock->scond);
@@ -1243,7 +1267,7 @@ nmsocket_cleanup(isc_nmsocket_t *sock, bool dofree FLARG) {
#endif
if (dofree) {
isc_nm_t *mgr = sock->mgr;
isc_mem_put(mgr->mctx, sock, sizeof(*sock));
isc_mem_put(worker->mctx, sock, sizeof(*sock));
isc_nm_detach(&mgr);
} else {
isc_nm_detach(&sock->mgr);
@@ -1411,18 +1435,18 @@ isc_nmsocket_close(isc_nmsocket_t **sockp) {
void
isc___nmsocket_init(isc_nmsocket_t *sock, isc_nm_t *mgr, isc_nmsocket_type type,
isc_sockaddr_t *iface FLARG) {
isc_sockaddr_t *iface, int tid FLARG) {
uint16_t family;
REQUIRE(sock != NULL);
REQUIRE(mgr != NULL);
REQUIRE(tid >= 0 && (uint32_t)tid < mgr->nworkers);
*sock = (isc_nmsocket_t){ .type = type,
.fd = -1,
.inactivehandles = isc_astack_new(
mgr->mctx, ISC_NM_HANDLES_STACK_SIZE),
.inactivereqs = isc_astack_new(
mgr->mctx, ISC_NM_REQS_STACK_SIZE) };
*sock = (isc_nmsocket_t){
.type = type,
.fd = -1,
.tid = tid,
};
if (iface != NULL) {
family = iface->type.sa.sa_family;
@@ -1554,9 +1578,9 @@ isc__nm_free_uvbuf(isc_nmsocket_t *sock, const uv_buf_t *buf) {
static isc_nmhandle_t *
alloc_handle(isc_nmsocket_t *sock) {
isc_nmhandle_t *handle =
isc_mem_get(sock->mgr->mctx,
sizeof(isc_nmhandle_t) + sock->extrahandlesize);
isc__networker_t *worker = &sock->mgr->workers[sock->tid];
isc_nmhandle_t *handle = isc_mem_get(
worker->mctx, sizeof(isc_nmhandle_t) + sock->extrahandlesize);
*handle = (isc_nmhandle_t){ .magic = NMHANDLE_MAGIC };
#ifdef NETMGR_TRACE
@@ -1574,14 +1598,7 @@ isc___nmhandle_get(isc_nmsocket_t *sock, isc_sockaddr_t *peer,
REQUIRE(VALID_NMSOCK(sock));
handle = isc_astack_pop(sock->inactivehandles);
if (handle == NULL) {
handle = alloc_handle(sock);
} else {
isc_refcount_init(&handle->references, 1);
INSIST(VALID_NMHANDLE(handle));
}
handle = alloc_handle(sock);
NETMGR_TRACE_LOG(
"isc__nmhandle_get():handle %p->references = %" PRIuFAST32 "\n",
@@ -1673,6 +1690,7 @@ isc_nmhandle_is_stream(isc_nmhandle_t *handle) {
static void
nmhandle_free(isc_nmsocket_t *sock, isc_nmhandle_t *handle) {
isc__networker_t *worker = &sock->mgr->workers[sock->tid];
size_t extra = sock->extrahandlesize;
isc_refcount_destroy(&handle->references);
@@ -1683,13 +1701,11 @@ nmhandle_free(isc_nmsocket_t *sock, isc_nmhandle_t *handle) {
*handle = (isc_nmhandle_t){ .magic = 0 };
isc_mem_put(sock->mgr->mctx, handle, sizeof(isc_nmhandle_t) + extra);
isc_mem_put(worker->mctx, handle, sizeof(isc_nmhandle_t) + extra);
}
static void
nmhandle_deactivate(isc_nmsocket_t *sock, isc_nmhandle_t *handle) {
bool reuse = false;
/*
* We do all of this under lock to avoid races with socket
* destruction. We have to do this now, because at this point the
@@ -1703,14 +1719,7 @@ nmhandle_deactivate(isc_nmsocket_t *sock, isc_nmhandle_t *handle) {
INSIST(atomic_fetch_sub(&sock->ah, 1) > 0);
#if !__SANITIZE_ADDRESS__ && !__SANITIZE_THREAD__
if (atomic_load(&sock->active)) {
reuse = isc_astack_trypush(sock->inactivehandles, handle);
}
#endif /* !__SANITIZE_ADDRESS__ && !__SANITIZE_THREAD__ */
if (!reuse) {
nmhandle_free(sock, handle);
}
nmhandle_free(sock, handle);
UNLOCK(&sock->lock);
}
@@ -1730,20 +1739,9 @@ isc__nmhandle_detach(isc_nmhandle_t **handlep FLARG) {
* ensure correct ordering of the isc__nm_process_sock_buffer().
*/
sock = handle->sock;
if (sock->tid == isc_nm_tid() && sock->closehandle_cb == NULL) {
nmhandle_detach_cb(&handle FLARG_PASS);
} else {
isc__netievent_detach_t *event =
isc__nm_get_netievent_detach(sock->mgr, sock);
/*
* we are using implicit "attach" as the last reference
* need to be destroyed explicitly in the async callback
*/
event->handle = handle;
FLARG_IEVENT_PASS(event);
isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)event);
}
INSIST(sock->tid == isc_nm_tid());
nmhandle_detach_cb(&handle FLARG_PASS);
}
static void
@@ -1789,14 +1787,10 @@ nmhandle_detach_cb(isc_nmhandle_t **handlep FLARG) {
* call it now, or schedule it to run asynchronously.
*/
if (sock->closehandle_cb != NULL) {
if (sock->tid == isc_nm_tid()) {
sock->closehandle_cb(sock);
} else {
isc__netievent_close_t *event =
isc__nm_get_netievent_close(sock->mgr, sock);
isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)event);
}
isc__networker_t *worker = &sock->mgr->workers[sock->tid];
isc__netievent_close_t *event =
isc__nm_get_netievent_close(worker, sock);
isc__nm_enqueue_ievent(worker, (isc__netievent_t *)event);
}
if (handle == sock->statichandle) {
@@ -1827,15 +1821,16 @@ isc_nmhandle_setdata(isc_nmhandle_t *handle, void *arg,
void
isc__nm_alloc_dnsbuf(isc_nmsocket_t *sock, size_t len) {
REQUIRE(len <= NM_BIG_BUF);
isc__networker_t *worker = &sock->mgr->workers[sock->tid];
if (sock->buf == NULL) {
/* We don't have the buffer at all */
size_t alloc_len = len < NM_REG_BUF ? NM_REG_BUF : NM_BIG_BUF;
sock->buf = isc_mem_get(sock->mgr->mctx, alloc_len);
sock->buf = isc_mem_get(worker->mctx, alloc_len);
sock->buf_size = alloc_len;
} else {
/* We have the buffer but it's too small */
sock->buf = isc_mem_reget(sock->mgr->mctx, sock->buf,
sock->buf = isc_mem_reget(worker->mctx, sock->buf,
sock->buf_size, NM_BIG_BUF);
sock->buf_size = NM_BIG_BUF;
}
@@ -2426,18 +2421,14 @@ isc_nmhandle_netmgr(isc_nmhandle_t *handle) {
isc__nm_uvreq_t *
isc___nm_uvreq_get(isc_nm_t *mgr, isc_nmsocket_t *sock FLARG) {
isc__nm_uvreq_t *req = NULL;
isc__networker_t *worker;
REQUIRE(VALID_NM(mgr));
REQUIRE(VALID_NMSOCK(sock));
REQUIRE(sock->tid >= 0 && (uint32_t)sock->tid < sock->mgr->nworkers);
if (sock != NULL && isc__nmsocket_active(sock)) {
/* Try to reuse one */
req = isc_astack_pop(sock->inactivereqs);
}
if (req == NULL) {
req = isc_mem_get(mgr->mctx, sizeof(*req));
}
worker = &sock->mgr->workers[sock->tid];
req = isc_mem_get(worker->mctx, sizeof(*req));
*req = (isc__nm_uvreq_t){ .magic = 0 };
ISC_LINK_INIT(req, link);
@@ -2452,6 +2443,7 @@ void
isc___nm_uvreq_put(isc__nm_uvreq_t **req0, isc_nmsocket_t *sock FLARG) {
isc__nm_uvreq_t *req = NULL;
isc_nmhandle_t *handle = NULL;
isc__networker_t *worker;
REQUIRE(req0 != NULL);
REQUIRE(VALID_UVREQ(*req0));
@@ -2460,6 +2452,7 @@ isc___nm_uvreq_put(isc__nm_uvreq_t **req0, isc_nmsocket_t *sock FLARG) {
*req0 = NULL;
INSIST(sock == req->sock);
REQUIRE(sock->tid >= 0 && (uint32_t)sock->tid < sock->mgr->nworkers);
req->magic = 0;
@@ -2470,14 +2463,8 @@ isc___nm_uvreq_put(isc__nm_uvreq_t **req0, isc_nmsocket_t *sock FLARG) {
handle = req->handle;
req->handle = NULL;
#if !__SANITIZE_ADDRESS__ && !__SANITIZE_THREAD__
if (!isc__nmsocket_active(sock) ||
!isc_astack_trypush(sock->inactivereqs, req)) {
isc_mem_put(sock->mgr->mctx, req, sizeof(*req));
}
#else /* !__SANITIZE_ADDRESS__ && !__SANITIZE_THREAD__ */
isc_mem_put(sock->mgr->mctx, req, sizeof(*req));
#endif /* !__SANITIZE_ADDRESS__ && !__SANITIZE_THREAD__ */
worker = &sock->mgr->workers[sock->tid];
isc_mem_put(worker->mctx, req, sizeof(*req));
if (handle != NULL) {
isc__nmhandle_detach(&handle FLARG_PASS);
@@ -2664,11 +2651,11 @@ isc__nm_connectcb(isc_nmsocket_t *sock, isc__nm_uvreq_t *uvreq,
.result = eresult };
isc__nm_async_connectcb(NULL, (isc__netievent_t *)&ievent);
} else {
isc__networker_t *worker = &sock->mgr->workers[sock->tid];
isc__netievent_connectcb_t *ievent =
isc__nm_get_netievent_connectcb(sock->mgr, sock, uvreq,
isc__nm_get_netievent_connectcb(worker, sock, uvreq,
eresult);
isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
isc__nm_enqueue_ievent(worker, (isc__netievent_t *)ievent);
}
}
@@ -2706,10 +2693,10 @@ isc__nm_readcb(isc_nmsocket_t *sock, isc__nm_uvreq_t *uvreq,
isc__nm_async_readcb(NULL, (isc__netievent_t *)&ievent);
} else {
isc__networker_t *worker = &sock->mgr->workers[sock->tid];
isc__netievent_readcb_t *ievent = isc__nm_get_netievent_readcb(
sock->mgr, sock, uvreq, eresult);
isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
worker, sock, uvreq, eresult);
isc__nm_enqueue_ievent(worker, (isc__netievent_t *)ievent);
}
}
@@ -2751,10 +2738,10 @@ isc__nm_sendcb(isc_nmsocket_t *sock, isc__nm_uvreq_t *uvreq,
return;
}
isc__networker_t *worker = &sock->mgr->workers[sock->tid];
isc__netievent_sendcb_t *ievent =
isc__nm_get_netievent_sendcb(sock->mgr, sock, uvreq, eresult);
isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
isc__nm_get_netievent_sendcb(worker, sock, uvreq, eresult);
isc__nm_enqueue_ievent(worker, (isc__netievent_t *)ievent);
}
void
@@ -3390,6 +3377,7 @@ isc__nm_after_work_cb(uv_work_t *req, int status) {
isc_result_t result = ISC_R_SUCCESS;
isc__nm_work_t *work = uv_req_get_data((uv_req_t *)req);
isc_nm_t *netmgr = work->netmgr;
isc__networker_t *worker = &netmgr->workers[isc_nm_tid()];
if (status != 0) {
result = isc__nm_uverr2result(status);
@@ -3397,7 +3385,7 @@ isc__nm_after_work_cb(uv_work_t *req, int status) {
work->after_cb(work->data, result);
isc_mem_put(netmgr->mctx, work, sizeof(*work));
isc_mem_put(worker->mctx, work, sizeof(*work));
isc_nm_detach(&netmgr);
}
@@ -3414,7 +3402,7 @@ isc_nm_work_offload(isc_nm_t *netmgr, isc_nm_workcb_t work_cb,
worker = &netmgr->workers[isc_nm_tid()];
work = isc_mem_get(netmgr->mctx, sizeof(*work));
work = isc_mem_get(worker->mctx, sizeof(*work));
*work = (isc__nm_work_t){
.cb = work_cb,
.after_cb = after_work_cb,
@@ -3568,6 +3556,13 @@ isc_nm_getnworkers(const isc_nm_t *netmgr) {
return (netmgr->nworkers);
}
isc_mem_t *
isc_nm_getmctx(const isc_nm_t *netmgr, uint32_t tid) {
REQUIRE(VALID_NM(netmgr));
return (netmgr->workers[tid].mctx);
}
#ifdef NETMGR_TRACE
/*
* Dump all active sockets in netmgr. We output to stderr
+71 -61
View File
@@ -295,6 +295,8 @@ isc_nm_tcpconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer,
isc_nmsocket_t *sock = NULL;
isc__netievent_tcpconnect_t *ievent = NULL;
isc__nm_uvreq_t *req = NULL;
int tid = isc_nm_tid();
isc__networker_t *worker = &mgr->workers[tid];
sa_family_t sa_family;
REQUIRE(VALID_NM(mgr));
@@ -303,8 +305,8 @@ isc_nm_tcpconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer,
sa_family = peer->type.sa.sa_family;
sock = isc_mem_get(mgr->mctx, sizeof(*sock));
isc__nmsocket_init(sock, mgr, isc_nm_tcpsocket, local);
sock = isc_mem_get(worker->mctx, sizeof(*sock));
isc__nmsocket_init(sock, mgr, isc_nm_tcpsocket, local, tid);
sock->extrahandlesize = extrahandlesize;
sock->connect_timeout = timeout;
@@ -322,12 +324,10 @@ isc_nm_tcpconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer,
result = isc__nm_socket(sa_family, SOCK_STREAM, 0, &sock->fd);
if (result != ISC_R_SUCCESS) {
if (isc__nm_in_netthread()) {
sock->tid = isc_nm_tid();
isc__nmsocket_clearcb(sock);
isc__nm_connectcb(sock, req, result, false);
} else {
isc__nmsocket_clearcb(sock);
sock->tid = isc_random_uniform(mgr->nworkers);
isc__nm_connectcb(sock, req, result, true);
}
atomic_store(&sock->closed, true);
@@ -338,19 +338,15 @@ isc_nm_tcpconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer,
(void)isc__nm_socket_min_mtu(sock->fd, sa_family);
(void)isc__nm_socket_tcp_maxseg(sock->fd, NM_MAXSEG);
ievent = isc__nm_get_netievent_tcpconnect(mgr, sock, req);
ievent = isc__nm_get_netievent_tcpconnect(worker, sock, req);
if (isc__nm_in_netthread()) {
atomic_store(&sock->active, true);
sock->tid = isc_nm_tid();
isc__nm_async_tcpconnect(&mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
isc__nm_put_netievent_tcpconnect(mgr, ievent);
isc__nm_async_tcpconnect(worker, (isc__netievent_t *)ievent);
isc__nm_put_netievent_tcpconnect(worker, ievent);
} else {
atomic_init(&sock->active, false);
sock->tid = isc_random_uniform(mgr->nworkers);
isc__nm_enqueue_ievent(&mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
isc__nm_enqueue_ievent(worker, (isc__netievent_t *)ievent);
}
LOCK(&sock->lock);
while (sock->result == ISC_R_UNSET) {
@@ -390,14 +386,14 @@ start_tcp_child(isc_nm_t *mgr, isc_sockaddr_t *iface, isc_nmsocket_t *sock,
uv_os_sock_t fd, int tid) {
isc__netievent_tcplisten_t *ievent = NULL;
isc_nmsocket_t *csock = &sock->children[tid];
isc__networker_t *worker = &sock->mgr->workers[tid];
isc__nmsocket_init(csock, mgr, isc_nm_tcpsocket, iface);
isc__nmsocket_init(csock, mgr, isc_nm_tcpsocket, iface, tid);
csock->parent = sock;
csock->accept_cb = sock->accept_cb;
csock->accept_cbarg = sock->accept_cbarg;
csock->extrahandlesize = sock->extrahandlesize;
csock->backlog = sock->backlog;
csock->tid = tid;
/*
* We don't attach to quota, just assign - to avoid
* increasing quota unnecessarily.
@@ -413,21 +409,20 @@ start_tcp_child(isc_nm_t *mgr, isc_sockaddr_t *iface, isc_nmsocket_t *sock,
#endif
REQUIRE(csock->fd >= 0);
ievent = isc__nm_get_netievent_tcplisten(mgr, csock);
isc__nm_maybe_enqueue_ievent(&mgr->workers[tid],
(isc__netievent_t *)ievent);
ievent = isc__nm_get_netievent_tcplisten(worker, csock);
isc__nm_maybe_enqueue_ievent(worker, (isc__netievent_t *)ievent);
}
static void
enqueue_stoplistening(isc_nmsocket_t *sock) {
isc__netievent_tcpstop_t *ievent =
isc__nm_get_netievent_tcpstop(sock->mgr, sock);
isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
isc__networker_t *worker = &sock->mgr->workers[sock->tid];
isc__netievent_tcpstop_t *ievent = isc__nm_get_netievent_tcpstop(worker,
sock);
isc__nm_enqueue_ievent(worker, (isc__netievent_t *)ievent);
}
isc_result_t
isc_nm_listentcp(isc_nm_t *mgr, isc_sockaddr_t *iface,
isc_nm_listentcp(isc_nm_t *mgr, uint32_t workers, isc_sockaddr_t *iface,
isc_nm_accept_cb_t accept_cb, void *accept_cbarg,
size_t extrahandlesize, int backlog, isc_quota_t *quota,
isc_nmsocket_t **sockp) {
@@ -435,16 +430,19 @@ isc_nm_listentcp(isc_nm_t *mgr, isc_sockaddr_t *iface,
isc_nmsocket_t *sock = NULL;
size_t children_size = 0;
uv_os_sock_t fd = -1;
int tid = isc_nm_tid();
isc__networker_t *worker = &mgr->workers[tid];
REQUIRE(VALID_NM(mgr));
REQUIRE(isc__nm_in_netthread());
sock = isc_mem_get(mgr->mctx, sizeof(*sock));
isc__nmsocket_init(sock, mgr, isc_nm_tcplistener, iface);
sock = isc_mem_get(worker->mctx, sizeof(*sock));
isc__nmsocket_init(sock, mgr, isc_nm_tcplistener, iface, tid);
atomic_init(&sock->rchildren, 0);
sock->nchildren = mgr->nworkers;
sock->nchildren = (workers == 0) ? mgr->nworkers : workers;
children_size = sock->nchildren * sizeof(sock->children[0]);
sock->children = isc_mem_get(mgr->mctx, children_size);
sock->children = isc_mem_get(worker->mctx, children_size);
memset(sock->children, 0, children_size);
sock->result = ISC_R_UNSET;
@@ -455,7 +453,6 @@ isc_nm_listentcp(isc_nm_t *mgr, isc_sockaddr_t *iface,
sock->backlog = backlog;
sock->pquota = quota;
sock->tid = 0;
sock->fd = -1;
#if !HAVE_SO_REUSEPORT_LB
@@ -709,11 +706,14 @@ destroy:
void
isc__nm_tcp_read(isc_nmhandle_t *handle, isc_nm_recv_cb_t cb, void *cbarg) {
isc_nmsocket_t *sock = NULL;
isc__netievent_tcpstartread_t *ievent = NULL;
isc__networker_t *worker = NULL;
REQUIRE(VALID_NMHANDLE(handle));
REQUIRE(VALID_NMSOCK(handle->sock));
isc_nmsocket_t *sock = handle->sock;
isc__netievent_tcpstartread_t *ievent = NULL;
sock = handle->sock;
REQUIRE(sock->type == isc_nm_tcpsocket);
REQUIRE(sock->statichandle == handle);
@@ -728,7 +728,8 @@ isc__nm_tcp_read(isc_nmhandle_t *handle, isc_nm_recv_cb_t cb, void *cbarg) {
: atomic_load(&sock->mgr->idle));
}
ievent = isc__nm_get_netievent_tcpstartread(sock->mgr, sock);
worker = &sock->mgr->workers[sock->tid];
ievent = isc__nm_get_netievent_tcpstartread(worker, sock);
/*
* This MUST be done asynchronously, no matter which thread we're
@@ -736,8 +737,7 @@ isc__nm_tcp_read(isc_nmhandle_t *handle, isc_nm_recv_cb_t cb, void *cbarg) {
* isc_nm_read() again; if we tried to do that synchronously
* we'd clash in processbuffer() and grow the stack indefinitely.
*/
isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
isc__nm_enqueue_ievent(worker, (isc__netievent_t *)ievent);
return;
}
@@ -766,6 +766,7 @@ void
isc__nm_tcp_pauseread(isc_nmhandle_t *handle) {
isc__netievent_tcppauseread_t *ievent = NULL;
isc_nmsocket_t *sock = NULL;
isc__networker_t *worker = NULL;
REQUIRE(VALID_NMHANDLE(handle));
@@ -778,10 +779,10 @@ isc__nm_tcp_pauseread(isc_nmhandle_t *handle) {
return;
}
ievent = isc__nm_get_netievent_tcppauseread(sock->mgr, sock);
worker = &sock->mgr->workers[sock->tid];
ievent = isc__nm_get_netievent_tcppauseread(worker, sock);
isc__nm_maybe_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
isc__nm_maybe_enqueue_ievent(worker, (isc__netievent_t *)ievent);
return;
}
@@ -802,11 +803,14 @@ isc__nm_async_tcppauseread(isc__networker_t *worker, isc__netievent_t *ev0) {
void
isc__nm_tcp_resumeread(isc_nmhandle_t *handle) {
isc_nmsocket_t *sock = NULL;
isc__netievent_tcpstartread_t *ievent = NULL;
isc__networker_t *worker = NULL;
REQUIRE(VALID_NMHANDLE(handle));
REQUIRE(VALID_NMSOCK(handle->sock));
isc__netievent_tcpstartread_t *ievent = NULL;
isc_nmsocket_t *sock = handle->sock;
sock = handle->sock;
REQUIRE(sock->tid == isc_nm_tid());
@@ -826,10 +830,10 @@ isc__nm_tcp_resumeread(isc_nmhandle_t *handle) {
return;
}
ievent = isc__nm_get_netievent_tcpstartread(sock->mgr, sock);
worker = &sock->mgr->workers[sock->tid];
ievent = isc__nm_get_netievent_tcpstartread(worker, sock);
isc__nm_maybe_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
isc__nm_maybe_enqueue_ievent(worker, (isc__netievent_t *)ievent);
}
void
@@ -899,15 +903,16 @@ static void
quota_accept_cb(isc_quota_t *quota, void *sock0) {
isc_nmsocket_t *sock = (isc_nmsocket_t *)sock0;
isc__netievent_tcpaccept_t *ievent = NULL;
isc__networker_t *worker = NULL;
REQUIRE(VALID_NMSOCK(sock));
/*
* Create a tcpaccept event and pass it using the async channel.
*/
ievent = isc__nm_get_netievent_tcpaccept(sock->mgr, sock, quota);
isc__nm_maybe_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
worker = &sock->mgr->workers[sock->tid];
ievent = isc__nm_get_netievent_tcpaccept(worker, sock, quota);
isc__nm_maybe_enqueue_ievent(worker, (isc__netievent_t *)ievent);
}
/*
@@ -931,16 +936,19 @@ isc__nm_async_tcpaccept(isc__networker_t *worker, isc__netievent_t *ev0) {
static isc_result_t
accept_connection(isc_nmsocket_t *ssock, isc_quota_t *quota) {
isc_nmsocket_t *csock = NULL;
isc__networker_t *worker = NULL;
int r;
isc_result_t result;
struct sockaddr_storage ss;
isc_sockaddr_t local;
isc_nmhandle_t *handle = NULL;
int tid = isc_nm_tid();
isc__networker_t *worker;
REQUIRE(VALID_NMSOCK(ssock));
REQUIRE(ssock->tid == isc_nm_tid());
worker = &ssock->mgr->workers[tid];
if (isc__nmsocket_closing(ssock)) {
if (quota != NULL) {
isc_quota_detach(&quota);
@@ -948,9 +956,9 @@ accept_connection(isc_nmsocket_t *ssock, isc_quota_t *quota) {
return (ISC_R_CANCELED);
}
csock = isc_mem_get(ssock->mgr->mctx, sizeof(isc_nmsocket_t));
isc__nmsocket_init(csock, ssock->mgr, isc_nm_tcpsocket, &ssock->iface);
csock->tid = ssock->tid;
csock = isc_mem_get(worker->mctx, sizeof(isc_nmsocket_t));
isc__nmsocket_init(csock, ssock->mgr, isc_nm_tcpsocket, &ssock->iface,
tid);
csock->extrahandlesize = ssock->extrahandlesize;
isc__nmsocket_attach(ssock, &csock->server);
csock->recv_cb = ssock->recv_cb;
@@ -958,8 +966,6 @@ accept_connection(isc_nmsocket_t *ssock, isc_quota_t *quota) {
csock->quota = quota;
atomic_init(&csock->accepting, true);
worker = &csock->mgr->workers[isc_nm_tid()];
r = uv_tcp_init(&worker->loop, &csock->uv_handle.tcp);
UV_RUNTIME_CHECK(uv_tcp_init, r);
uv_handle_set_data(&csock->uv_handle.handle, csock);
@@ -1043,12 +1049,15 @@ failure:
void
isc__nm_tcp_send(isc_nmhandle_t *handle, const isc_region_t *region,
isc_nm_cb_t cb, void *cbarg) {
isc_nmsocket_t *sock;
isc__netievent_tcpsend_t *ievent = NULL;
isc__nm_uvreq_t *uvreq = NULL;
isc__networker_t *worker = NULL;
REQUIRE(VALID_NMHANDLE(handle));
REQUIRE(VALID_NMSOCK(handle->sock));
isc_nmsocket_t *sock = handle->sock;
isc__netievent_tcpsend_t *ievent = NULL;
isc__nm_uvreq_t *uvreq = NULL;
sock = handle->sock;
REQUIRE(sock->type == isc_nm_tcpsocket);
@@ -1068,9 +1077,9 @@ isc__nm_tcp_send(isc_nmhandle_t *handle, const isc_region_t *region,
: atomic_load(&sock->mgr->idle));
}
ievent = isc__nm_get_netievent_tcpsend(sock->mgr, sock, uvreq);
isc__nm_maybe_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
worker = &sock->mgr->workers[sock->tid];
ievent = isc__nm_get_netievent_tcpsend(worker, sock, uvreq);
isc__nm_maybe_enqueue_ievent(worker, (isc__netievent_t *)ievent);
return;
}
@@ -1308,11 +1317,11 @@ isc__nm_tcp_close(isc_nmsocket_t *sock) {
/*
* We need to create an event and pass it using async channel
*/
isc__networker_t *worker = &sock->mgr->workers[sock->tid];
isc__netievent_tcpclose_t *ievent =
isc__nm_get_netievent_tcpclose(sock->mgr, sock);
isc__nm_get_netievent_tcpclose(worker, sock);
isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
isc__nm_enqueue_ievent(worker, (isc__netievent_t *)ievent);
}
}
@@ -1388,6 +1397,7 @@ void
isc__nm_tcp_cancelread(isc_nmhandle_t *handle) {
isc_nmsocket_t *sock = NULL;
isc__netievent_tcpcancel_t *ievent = NULL;
isc__networker_t *worker = NULL;
REQUIRE(VALID_NMHANDLE(handle));
@@ -1396,9 +1406,9 @@ isc__nm_tcp_cancelread(isc_nmhandle_t *handle) {
REQUIRE(VALID_NMSOCK(sock));
REQUIRE(sock->type == isc_nm_tcpsocket);
ievent = isc__nm_get_netievent_tcpcancel(sock->mgr, sock, handle);
isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
worker = &sock->mgr->workers[sock->tid];
ievent = isc__nm_get_netievent_tcpcancel(worker, sock, handle);
isc__nm_enqueue_ievent(worker, (isc__netievent_t *)ievent);
}
void
+52 -52
View File
@@ -259,6 +259,8 @@ isc_nm_tcpdnsconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer,
isc__netievent_tcpdnsconnect_t *ievent = NULL;
isc__nm_uvreq_t *req = NULL;
sa_family_t sa_family;
int tid = isc_nm_tid();
isc__networker_t *worker = &mgr->workers[tid];
REQUIRE(VALID_NM(mgr));
REQUIRE(local != NULL);
@@ -266,8 +268,8 @@ isc_nm_tcpdnsconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer,
sa_family = peer->type.sa.sa_family;
sock = isc_mem_get(mgr->mctx, sizeof(*sock));
isc__nmsocket_init(sock, mgr, isc_nm_tcpdnssocket, local);
sock = isc_mem_get(worker->mctx, sizeof(*sock));
isc__nmsocket_init(sock, mgr, isc_nm_tcpdnssocket, local, tid);
sock->extrahandlesize = extrahandlesize;
sock->connect_timeout = timeout;
@@ -283,9 +285,6 @@ isc_nm_tcpdnsconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer,
result = isc__nm_socket(sa_family, SOCK_STREAM, 0, &sock->fd);
if (result != ISC_R_SUCCESS) {
if (isc__nm_in_netthread()) {
sock->tid = isc_nm_tid();
}
isc__nmsocket_clearcb(sock);
isc__nm_connectcb(sock, req, result, true);
atomic_store(&sock->closed, true);
@@ -300,19 +299,14 @@ isc_nm_tcpdnsconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer,
result = isc__nm_socket_connectiontimeout(sock->fd, 120 * 1000);
RUNTIME_CHECK(result == ISC_R_SUCCESS);
ievent = isc__nm_get_netievent_tcpdnsconnect(mgr, sock, req);
ievent = isc__nm_get_netievent_tcpdnsconnect(worker, sock, req);
if (isc__nm_in_netthread()) {
atomic_store(&sock->active, true);
sock->tid = isc_nm_tid();
isc__nm_async_tcpdnsconnect(&mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
isc__nm_put_netievent_tcpdnsconnect(mgr, ievent);
isc__nm_async_tcpdnsconnect(worker, (isc__netievent_t *)ievent);
isc__nm_put_netievent_tcpdnsconnect(worker, ievent);
} else {
atomic_init(&sock->active, false);
sock->tid = isc_random_uniform(mgr->nworkers);
isc__nm_enqueue_ievent(&mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
isc__nm_enqueue_ievent(worker, (isc__netievent_t *)ievent);
}
LOCK(&sock->lock);
@@ -350,10 +344,10 @@ isc__nm_tcpdns_lb_socket(sa_family_t sa_family) {
static void
enqueue_stoplistening(isc_nmsocket_t *sock) {
isc__networker_t *worker = &sock->mgr->workers[sock->tid];
isc__netievent_tcpdnsstop_t *ievent =
isc__nm_get_netievent_tcpdnsstop(sock->mgr, sock);
isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
isc__nm_get_netievent_tcpdnsstop(worker, sock);
isc__nm_enqueue_ievent(worker, (isc__netievent_t *)ievent);
}
static void
@@ -361,8 +355,9 @@ start_tcpdns_child(isc_nm_t *mgr, isc_sockaddr_t *iface, isc_nmsocket_t *sock,
uv_os_sock_t fd, int tid) {
isc__netievent_tcpdnslisten_t *ievent = NULL;
isc_nmsocket_t *csock = &sock->children[tid];
isc__networker_t *worker = &sock->mgr->workers[tid];
isc__nmsocket_init(csock, mgr, isc_nm_tcpdnssocket, iface);
isc__nmsocket_init(csock, mgr, isc_nm_tcpdnssocket, iface, tid);
csock->parent = sock;
csock->accept_cb = sock->accept_cb;
csock->accept_cbarg = sock->accept_cbarg;
@@ -370,7 +365,6 @@ start_tcpdns_child(isc_nm_t *mgr, isc_sockaddr_t *iface, isc_nmsocket_t *sock,
csock->recv_cbarg = sock->recv_cbarg;
csock->extrahandlesize = sock->extrahandlesize;
csock->backlog = sock->backlog;
csock->tid = tid;
/*
* We don't attach to quota, just assign - to avoid
* increasing quota unnecessarily.
@@ -386,12 +380,11 @@ start_tcpdns_child(isc_nm_t *mgr, isc_sockaddr_t *iface, isc_nmsocket_t *sock,
#endif
REQUIRE(csock->fd >= 0);
ievent = isc__nm_get_netievent_tcpdnslisten(mgr, csock);
isc__nm_maybe_enqueue_ievent(&mgr->workers[tid],
(isc__netievent_t *)ievent);
ievent = isc__nm_get_netievent_tcpdnslisten(worker, csock);
isc__nm_maybe_enqueue_ievent(worker, (isc__netievent_t *)ievent);
}
isc_result_t
isc_nm_listentcpdns(isc_nm_t *mgr, isc_sockaddr_t *iface,
isc_nm_listentcpdns(isc_nm_t *mgr, uint32_t workers, isc_sockaddr_t *iface,
isc_nm_recv_cb_t recv_cb, void *recv_cbarg,
isc_nm_accept_cb_t accept_cb, void *accept_cbarg,
size_t extrahandlesize, int backlog, isc_quota_t *quota,
@@ -400,16 +393,18 @@ isc_nm_listentcpdns(isc_nm_t *mgr, isc_sockaddr_t *iface,
isc_nmsocket_t *sock = NULL;
size_t children_size = 0;
uv_os_sock_t fd = -1;
int tid = isc_nm_tid();
isc__networker_t *worker = &mgr->workers[tid];
REQUIRE(VALID_NM(mgr));
sock = isc_mem_get(mgr->mctx, sizeof(*sock));
isc__nmsocket_init(sock, mgr, isc_nm_tcpdnslistener, iface);
sock = isc_mem_get(worker->mctx, sizeof(*sock));
isc__nmsocket_init(sock, mgr, isc_nm_tcpdnslistener, iface, tid);
atomic_init(&sock->rchildren, 0);
sock->nchildren = mgr->nworkers;
sock->nchildren = (workers == 0) ? mgr->nworkers : workers;
children_size = sock->nchildren * sizeof(sock->children[0]);
sock->children = isc_mem_get(mgr->mctx, children_size);
sock->children = isc_mem_get(worker->mctx, children_size);
memset(sock->children, 0, children_size);
sock->result = ISC_R_UNSET;
@@ -421,7 +416,6 @@ isc_nm_listentcpdns(isc_nm_t *mgr, isc_sockaddr_t *iface,
sock->backlog = backlog;
sock->pquota = quota;
sock->tid = 0;
sock->fd = -1;
#if !HAVE_SO_REUSEPORT_LB
@@ -676,11 +670,14 @@ destroy:
void
isc__nm_tcpdns_read(isc_nmhandle_t *handle, isc_nm_recv_cb_t cb, void *cbarg) {
isc_nmsocket_t *sock = NULL;
isc__netievent_tcpdnsread_t *ievent = NULL;
isc__networker_t *worker = NULL;
REQUIRE(VALID_NMHANDLE(handle));
REQUIRE(VALID_NMSOCK(handle->sock));
isc_nmsocket_t *sock = handle->sock;
isc__netievent_tcpdnsread_t *ievent = NULL;
sock = handle->sock;
REQUIRE(sock->type == isc_nm_tcpdnssocket);
REQUIRE(sock->statichandle == handle);
@@ -695,7 +692,8 @@ isc__nm_tcpdns_read(isc_nmhandle_t *handle, isc_nm_recv_cb_t cb, void *cbarg) {
: atomic_load(&sock->mgr->idle));
}
ievent = isc__nm_get_netievent_tcpdnsread(sock->mgr, sock);
worker = &sock->mgr->workers[sock->tid];
ievent = isc__nm_get_netievent_tcpdnsread(worker, sock);
/*
* This MUST be done asynchronously, no matter which thread we're
@@ -703,8 +701,7 @@ isc__nm_tcpdns_read(isc_nmhandle_t *handle, isc_nm_recv_cb_t cb, void *cbarg) {
* isc_nm_read() again; if we tried to do that synchronously
* we'd clash in processbuffer() and grow the stack indefinitely.
*/
isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
isc__nm_enqueue_ievent(worker, (isc__netievent_t *)ievent);
return;
}
@@ -895,6 +892,8 @@ free:
static void
quota_accept_cb(isc_quota_t *quota, void *sock0) {
isc_nmsocket_t *sock = (isc_nmsocket_t *)sock0;
isc__networker_t *worker = NULL;
isc__netievent_tcpdnsaccept_t *ievent = NULL;
REQUIRE(VALID_NMSOCK(sock));
@@ -902,10 +901,9 @@ quota_accept_cb(isc_quota_t *quota, void *sock0) {
* Create a tcpdnsaccept event and pass it using the async channel.
*/
isc__netievent_tcpdnsaccept_t *ievent =
isc__nm_get_netievent_tcpdnsaccept(sock->mgr, sock, quota);
isc__nm_maybe_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
worker = &sock->mgr->workers[sock->tid];
ievent = isc__nm_get_netievent_tcpdnsaccept(worker, sock, quota);
isc__nm_maybe_enqueue_ievent(worker, (isc__netievent_t *)ievent);
}
/*
@@ -929,17 +927,20 @@ isc__nm_async_tcpdnsaccept(isc__networker_t *worker, isc__netievent_t *ev0) {
static isc_result_t
accept_connection(isc_nmsocket_t *ssock, isc_quota_t *quota) {
isc_nmsocket_t *csock = NULL;
isc__networker_t *worker = NULL;
int r;
isc_result_t result;
struct sockaddr_storage peer_ss;
struct sockaddr_storage local_ss;
isc_sockaddr_t local;
isc_nmhandle_t *handle = NULL;
int tid = isc_nm_tid();
isc__networker_t *worker = NULL;
REQUIRE(VALID_NMSOCK(ssock));
REQUIRE(ssock->tid == isc_nm_tid());
worker = &ssock->mgr->workers[tid];
if (isc__nmsocket_closing(ssock)) {
if (quota != NULL) {
isc_quota_detach(&quota);
@@ -949,10 +950,9 @@ accept_connection(isc_nmsocket_t *ssock, isc_quota_t *quota) {
REQUIRE(ssock->accept_cb != NULL);
csock = isc_mem_get(ssock->mgr->mctx, sizeof(isc_nmsocket_t));
csock = isc_mem_get(worker->mctx, sizeof(isc_nmsocket_t));
isc__nmsocket_init(csock, ssock->mgr, isc_nm_tcpdnssocket,
&ssock->iface);
csock->tid = ssock->tid;
&ssock->iface, tid);
csock->extrahandlesize = ssock->extrahandlesize;
isc__nmsocket_attach(ssock, &csock->server);
csock->recv_cb = ssock->recv_cb;
@@ -960,8 +960,6 @@ accept_connection(isc_nmsocket_t *ssock, isc_quota_t *quota) {
csock->quota = quota;
atomic_init(&csock->accepting, true);
worker = &csock->mgr->workers[csock->tid];
r = uv_tcp_init(&worker->loop, &csock->uv_handle.tcp);
UV_RUNTIME_CHECK(uv_tcp_init, r);
uv_handle_set_data(&csock->uv_handle.handle, csock);
@@ -1068,6 +1066,7 @@ isc__nm_tcpdns_send(isc_nmhandle_t *handle, isc_region_t *region,
isc__netievent_tcpdnssend_t *ievent = NULL;
isc__nm_uvreq_t *uvreq = NULL;
isc_nmsocket_t *sock = NULL;
isc__networker_t *worker = NULL;
REQUIRE(VALID_NMHANDLE(handle));
@@ -1093,9 +1092,9 @@ isc__nm_tcpdns_send(isc_nmhandle_t *handle, isc_region_t *region,
: atomic_load(&sock->mgr->idle));
}
ievent = isc__nm_get_netievent_tcpdnssend(sock->mgr, sock, uvreq);
isc__nm_maybe_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
worker = &sock->mgr->workers[sock->tid];
ievent = isc__nm_get_netievent_tcpdnssend(worker, sock, uvreq);
isc__nm_maybe_enqueue_ievent(worker, (isc__netievent_t *)ievent);
return;
}
@@ -1357,11 +1356,11 @@ isc__nm_tcpdns_close(isc_nmsocket_t *sock) {
/*
* We need to create an event and pass it using async channel
*/
isc__networker_t *worker = &sock->mgr->workers[sock->tid];
isc__netievent_tcpdnsclose_t *ievent =
isc__nm_get_netievent_tcpdnsclose(sock->mgr, sock);
isc__nm_get_netievent_tcpdnsclose(worker, sock);
isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
isc__nm_enqueue_ievent(worker, (isc__netievent_t *)ievent);
}
}
@@ -1438,6 +1437,7 @@ void
isc__nm_tcpdns_cancelread(isc_nmhandle_t *handle) {
isc_nmsocket_t *sock = NULL;
isc__netievent_tcpdnscancel_t *ievent = NULL;
isc__networker_t *worker = NULL;
REQUIRE(VALID_NMHANDLE(handle));
@@ -1446,9 +1446,9 @@ isc__nm_tcpdns_cancelread(isc_nmhandle_t *handle) {
REQUIRE(VALID_NMSOCK(sock));
REQUIRE(sock->type == isc_nm_tcpdnssocket);
ievent = isc__nm_get_netievent_tcpdnscancel(sock->mgr, sock, handle);
isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
worker = &sock->mgr->workers[sock->tid];
ievent = isc__nm_get_netievent_tcpdnscancel(worker, sock, handle);
isc__nm_enqueue_ievent(worker, (isc__netievent_t *)ievent);
}
void
+4 -3
View File
@@ -42,7 +42,7 @@ isc_nm_timer_create(isc_nmhandle_t *handle, isc_nm_timer_cb cb, void *cbarg,
worker = &sock->mgr->workers[isc_nm_tid()];
/* TODO: per-loop object cache */
timer = isc_mem_get(sock->mgr->mctx, sizeof(*timer));
timer = isc_mem_get(worker->mctx, sizeof(*timer));
*timer = (isc_nm_timer_t){ .cb = cb, .cbarg = cbarg };
isc_refcount_init(&timer->references, 1);
isc_nmhandle_attach(handle, &timer->handle);
@@ -68,9 +68,10 @@ static void
timer_destroy(uv_handle_t *uvhandle) {
isc_nm_timer_t *timer = uv_handle_get_data(uvhandle);
isc_nmhandle_t *handle = timer->handle;
isc_mem_t *mctx = timer->handle->sock->mgr->mctx;
isc_nmsocket_t *sock = handle->sock;
isc__networker_t *worker = &sock->mgr->workers[sock->tid];
isc_mem_put(mctx, timer, sizeof(*timer));
isc_mem_put(worker->mctx, timer, sizeof(*timer));
isc_nmhandle_detach(&handle);
}
+63 -60
View File
@@ -312,6 +312,8 @@ isc_nm_tlsdnsconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer,
isc__netievent_tlsdnsconnect_t *ievent = NULL;
isc__nm_uvreq_t *req = NULL;
sa_family_t sa_family;
int tid = isc_nm_tid();
isc__networker_t *worker = &mgr->workers[tid];
REQUIRE(VALID_NM(mgr));
REQUIRE(local != NULL);
@@ -320,8 +322,8 @@ isc_nm_tlsdnsconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer,
sa_family = peer->type.sa.sa_family;
sock = isc_mem_get(mgr->mctx, sizeof(*sock));
isc__nmsocket_init(sock, mgr, isc_nm_tlsdnssocket, local);
sock = isc_mem_get(worker->mctx, sizeof(*sock));
isc__nmsocket_init(sock, mgr, isc_nm_tlsdnssocket, local, tid);
sock->extrahandlesize = extrahandlesize;
sock->connect_timeout = timeout;
@@ -354,17 +356,13 @@ isc_nm_tlsdnsconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer,
result = isc__nm_socket_connectiontimeout(sock->fd, 120 * 1000);
RUNTIME_CHECK(result == ISC_R_SUCCESS);
ievent = isc__nm_get_netievent_tlsdnsconnect(mgr, sock, req);
ievent = isc__nm_get_netievent_tlsdnsconnect(worker, sock, req);
if (isc__nm_in_netthread()) {
atomic_store(&sock->active, true);
sock->tid = isc_nm_tid();
isc__nm_async_tlsdnsconnect(&mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
isc__nm_put_netievent_tlsdnsconnect(mgr, ievent);
isc__nm_async_tlsdnsconnect(worker, (isc__netievent_t *)ievent);
isc__nm_put_netievent_tlsdnsconnect(worker, ievent);
} else {
atomic_init(&sock->active, false);
sock->tid = isc_random_uniform(mgr->nworkers);
isc__nm_enqueue_ievent(&mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
}
@@ -378,10 +376,6 @@ isc_nm_tlsdnsconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer,
return;
failure:
if (isc__nm_in_netthread()) {
sock->tid = isc_nm_tid();
}
INSIST(atomic_compare_exchange_strong(&sock->connecting,
&(bool){ true }, false));
isc__nmsocket_clearcb(sock);
@@ -419,8 +413,9 @@ start_tlsdns_child(isc_nm_t *mgr, isc_sockaddr_t *iface, isc_nmsocket_t *sock,
uv_os_sock_t fd, int tid) {
isc__netievent_tlsdnslisten_t *ievent = NULL;
isc_nmsocket_t *csock = &sock->children[tid];
isc__networker_t *worker = &sock->mgr->workers[tid];
isc__nmsocket_init(csock, mgr, isc_nm_tlsdnssocket, iface);
isc__nmsocket_init(csock, mgr, isc_nm_tlsdnssocket, iface, tid);
csock->parent = sock;
csock->accept_cb = sock->accept_cb;
csock->accept_cbarg = sock->accept_cbarg;
@@ -428,7 +423,6 @@ start_tlsdns_child(isc_nm_t *mgr, isc_sockaddr_t *iface, isc_nmsocket_t *sock,
csock->recv_cbarg = sock->recv_cbarg;
csock->extrahandlesize = sock->extrahandlesize;
csock->backlog = sock->backlog;
csock->tid = tid;
csock->tls.ctx = sock->tls.ctx;
/*
@@ -446,21 +440,20 @@ start_tlsdns_child(isc_nm_t *mgr, isc_sockaddr_t *iface, isc_nmsocket_t *sock,
#endif
REQUIRE(csock->fd >= 0);
ievent = isc__nm_get_netievent_tlsdnslisten(mgr, csock);
isc__nm_maybe_enqueue_ievent(&mgr->workers[tid],
(isc__netievent_t *)ievent);
ievent = isc__nm_get_netievent_tlsdnslisten(worker, csock);
isc__nm_maybe_enqueue_ievent(worker, (isc__netievent_t *)ievent);
}
static void
enqueue_stoplistening(isc_nmsocket_t *sock) {
isc__networker_t *worker = &sock->mgr->workers[sock->tid];
isc__netievent_tlsdnsstop_t *ievent =
isc__nm_get_netievent_tlsdnsstop(sock->mgr, sock);
isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
isc__nm_get_netievent_tlsdnsstop(worker, sock);
isc__nm_enqueue_ievent(worker, (isc__netievent_t *)ievent);
}
isc_result_t
isc_nm_listentlsdns(isc_nm_t *mgr, isc_sockaddr_t *iface,
isc_nm_listentlsdns(isc_nm_t *mgr, uint32_t workers, isc_sockaddr_t *iface,
isc_nm_recv_cb_t recv_cb, void *recv_cbarg,
isc_nm_accept_cb_t accept_cb, void *accept_cbarg,
size_t extrahandlesize, int backlog, isc_quota_t *quota,
@@ -469,16 +462,18 @@ isc_nm_listentlsdns(isc_nm_t *mgr, isc_sockaddr_t *iface,
isc_nmsocket_t *sock = NULL;
size_t children_size = 0;
uv_os_sock_t fd = -1;
int tid = isc_nm_tid();
isc__networker_t *worker = &mgr->workers[tid];
REQUIRE(VALID_NM(mgr));
sock = isc_mem_get(mgr->mctx, sizeof(*sock));
isc__nmsocket_init(sock, mgr, isc_nm_tlsdnslistener, iface);
sock = isc_mem_get(worker->mctx, sizeof(*sock));
isc__nmsocket_init(sock, mgr, isc_nm_tlsdnslistener, iface, tid);
atomic_init(&sock->rchildren, 0);
sock->nchildren = mgr->nworkers;
sock->nchildren = (workers == 0) ? mgr->nworkers : workers;
children_size = sock->nchildren * sizeof(sock->children[0]);
sock->children = isc_mem_get(mgr->mctx, children_size);
sock->children = isc_mem_get(worker->mctx, children_size);
memset(sock->children, 0, children_size);
sock->result = ISC_R_UNSET;
@@ -492,7 +487,6 @@ isc_nm_listentlsdns(isc_nm_t *mgr, isc_sockaddr_t *iface,
sock->tls.ctx = sslctx;
sock->tid = 0;
sock->fd = -1;
#if !HAVE_SO_REUSEPORT_LB
@@ -700,10 +694,10 @@ static void
tls_shutdown(isc_nmsocket_t *sock) {
REQUIRE(VALID_NMSOCK(sock));
isc__networker_t *worker = &sock->mgr->workers[sock->tid];
isc__netievent_tlsdnsshutdown_t *ievent =
isc__nm_get_netievent_tlsdnsshutdown(sock->mgr, sock);
isc__nm_maybe_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
isc__nm_get_netievent_tlsdnsshutdown(worker, sock);
isc__nm_maybe_enqueue_ievent(worker, (isc__netievent_t *)ievent);
}
void
@@ -835,6 +829,7 @@ isc__nm_tlsdns_read(isc_nmhandle_t *handle, isc_nm_recv_cb_t cb, void *cbarg) {
isc_nmsocket_t *sock = handle->sock;
isc__netievent_tlsdnsread_t *ievent = NULL;
isc__networker_t *worker = &sock->mgr->workers[sock->tid];
REQUIRE(sock->type == isc_nm_tlsdnssocket);
REQUIRE(sock->statichandle == handle);
@@ -849,7 +844,7 @@ isc__nm_tlsdns_read(isc_nmhandle_t *handle, isc_nm_recv_cb_t cb, void *cbarg) {
: atomic_load(&sock->mgr->idle));
}
ievent = isc__nm_get_netievent_tlsdnsread(sock->mgr, sock);
ievent = isc__nm_get_netievent_tlsdnsread(worker, sock);
/*
* This MUST be done asynchronously, no matter which thread
@@ -858,8 +853,7 @@ isc__nm_tlsdns_read(isc_nmhandle_t *handle, isc_nm_recv_cb_t cb, void *cbarg) {
* we'd clash in processbuffer() and grow the stack
* indefinitely.
*/
isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
isc__nm_enqueue_ievent(worker, (isc__netievent_t *)ievent);
return;
}
@@ -1147,11 +1141,15 @@ tls_error(isc_nmsocket_t *sock, isc_result_t result) {
static void
free_senddata(isc_nmsocket_t *sock) {
isc__networker_t *worker = NULL;
REQUIRE(VALID_NMSOCK(sock));
REQUIRE(sock->tls.senddata.base != NULL);
REQUIRE(sock->tls.senddata.length > 0);
isc_mem_put(sock->mgr->mctx, sock->tls.senddata.base,
worker = &sock->mgr->workers[sock->tid];
isc_mem_put(worker->mctx, sock->tls.senddata.base,
sock->tls.senddata.length);
sock->tls.senddata.base = NULL;
sock->tls.senddata.length = 0;
@@ -1186,6 +1184,7 @@ static isc_result_t
tls_cycle_output(isc_nmsocket_t *sock) {
isc_result_t result = ISC_R_SUCCESS;
int pending;
isc__networker_t *worker = &sock->mgr->workers[sock->tid];
while ((pending = BIO_pending(sock->tls.app_rbio)) > 0) {
isc__nm_uvreq_t *req = NULL;
@@ -1202,7 +1201,7 @@ tls_cycle_output(isc_nmsocket_t *sock) {
pending = (int)ISC_NETMGR_TCP_RECVBUF_SIZE;
}
sock->tls.senddata.base = isc_mem_get(sock->mgr->mctx, pending);
sock->tls.senddata.base = isc_mem_get(worker->mctx, pending);
sock->tls.senddata.length = pending;
/* It's a bit misnomer here, but it does the right thing */
@@ -1315,6 +1314,7 @@ done:
static void
async_tlsdns_cycle(isc_nmsocket_t *sock) {
isc__netievent_tlsdnscycle_t *ievent = NULL;
isc__networker_t *worker = NULL;
REQUIRE(VALID_NMSOCK(sock));
@@ -1323,9 +1323,9 @@ async_tlsdns_cycle(isc_nmsocket_t *sock) {
return;
}
ievent = isc__nm_get_netievent_tlsdnscycle(sock->mgr, sock);
isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
worker = &sock->mgr->workers[sock->tid];
ievent = isc__nm_get_netievent_tlsdnscycle(worker, sock);
isc__nm_enqueue_ievent(worker, (isc__netievent_t *)ievent);
}
void
@@ -1412,6 +1412,8 @@ free:
static void
quota_accept_cb(isc_quota_t *quota, void *sock0) {
isc_nmsocket_t *sock = (isc_nmsocket_t *)sock0;
isc__networker_t *worker = NULL;
isc__netievent_tlsdnsaccept_t *ievent = NULL;
REQUIRE(VALID_NMSOCK(sock));
@@ -1420,10 +1422,9 @@ quota_accept_cb(isc_quota_t *quota, void *sock0) {
* channel.
*/
isc__netievent_tlsdnsaccept_t *ievent =
isc__nm_get_netievent_tlsdnsaccept(sock->mgr, sock, quota);
isc__nm_maybe_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
worker = &sock->mgr->workers[sock->tid];
ievent = isc__nm_get_netievent_tlsdnsaccept(worker, sock, quota);
isc__nm_maybe_enqueue_ievent(worker, (isc__netievent_t *)ievent);
}
/*
@@ -1447,17 +1448,20 @@ isc__nm_async_tlsdnsaccept(isc__networker_t *worker, isc__netievent_t *ev0) {
static isc_result_t
accept_connection(isc_nmsocket_t *ssock, isc_quota_t *quota) {
isc_nmsocket_t *csock = NULL;
isc__networker_t *worker = NULL;
int r;
isc_result_t result;
struct sockaddr_storage peer_ss;
struct sockaddr_storage local_ss;
isc_sockaddr_t local;
isc_nmhandle_t *handle = NULL;
int tid = isc_nm_tid();
isc__networker_t *worker = NULL;
REQUIRE(VALID_NMSOCK(ssock));
REQUIRE(ssock->tid == isc_nm_tid());
worker = &ssock->mgr->workers[tid];
if (isc__nmsocket_closing(ssock)) {
if (quota != NULL) {
isc_quota_detach(&quota);
@@ -1467,10 +1471,9 @@ accept_connection(isc_nmsocket_t *ssock, isc_quota_t *quota) {
REQUIRE(ssock->accept_cb != NULL);
csock = isc_mem_get(ssock->mgr->mctx, sizeof(isc_nmsocket_t));
csock = isc_mem_get(worker->mctx, sizeof(isc_nmsocket_t));
isc__nmsocket_init(csock, ssock->mgr, isc_nm_tlsdnssocket,
&ssock->iface);
csock->tid = ssock->tid;
&ssock->iface, tid);
csock->extrahandlesize = ssock->extrahandlesize;
isc__nmsocket_attach(ssock, &csock->server);
csock->accept_cb = ssock->accept_cb;
@@ -1480,8 +1483,6 @@ accept_connection(isc_nmsocket_t *ssock, isc_quota_t *quota) {
csock->quota = quota;
atomic_init(&csock->accepting, true);
worker = &csock->mgr->workers[csock->tid];
r = uv_tcp_init(&worker->loop, &csock->uv_handle.tcp);
UV_RUNTIME_CHECK(uv_tcp_init, r);
uv_handle_set_data(&csock->uv_handle.handle, csock);
@@ -1619,6 +1620,7 @@ isc__nm_tlsdns_send(isc_nmhandle_t *handle, isc_region_t *region,
isc__netievent_tlsdnssend_t *ievent = NULL;
isc__nm_uvreq_t *uvreq = NULL;
isc_nmsocket_t *sock = NULL;
isc__networker_t *worker = NULL;
REQUIRE(VALID_NMHANDLE(handle));
@@ -1644,9 +1646,9 @@ isc__nm_tlsdns_send(isc_nmhandle_t *handle, isc_region_t *region,
: atomic_load(&sock->mgr->idle));
}
ievent = isc__nm_get_netievent_tlsdnssend(sock->mgr, sock, uvreq);
isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
worker = &sock->mgr->workers[sock->tid];
ievent = isc__nm_get_netievent_tlsdnssend(worker, sock, uvreq);
isc__nm_enqueue_ievent(worker, (isc__netievent_t *)ievent);
return;
}
@@ -1675,10 +1677,10 @@ isc__nm_async_tlsdnssend(isc__networker_t *worker, isc__netievent_t *ev0) {
static void
tlsdns_send_enqueue(isc_nmsocket_t *sock, isc__nm_uvreq_t *req) {
isc__networker_t *worker = &sock->mgr->workers[sock->tid];
isc__netievent_tlsdnssend_t *ievent =
isc__nm_get_netievent_tlsdnssend(sock->mgr, sock, req);
isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
isc__nm_get_netievent_tlsdnssend(worker, sock, req);
isc__nm_enqueue_ievent(worker, (isc__netievent_t *)ievent);
}
static isc_result_t
@@ -1928,11 +1930,11 @@ isc__nm_tlsdns_close(isc_nmsocket_t *sock) {
* We need to create an event and pass it using async
* channel
*/
isc__networker_t *worker = &sock->mgr->workers[sock->tid];
isc__netievent_tlsdnsclose_t *ievent =
isc__nm_get_netievent_tlsdnsclose(sock->mgr, sock);
isc__nm_get_netievent_tlsdnsclose(worker, sock);
isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
isc__nm_enqueue_ievent(worker, (isc__netievent_t *)ievent);
}
}
@@ -2030,6 +2032,7 @@ void
isc__nm_tlsdns_cancelread(isc_nmhandle_t *handle) {
isc_nmsocket_t *sock = NULL;
isc__netievent_tlsdnscancel_t *ievent = NULL;
isc__networker_t *worker = NULL;
REQUIRE(VALID_NMHANDLE(handle));
@@ -2038,9 +2041,9 @@ isc__nm_tlsdns_cancelread(isc_nmhandle_t *handle) {
REQUIRE(VALID_NMSOCK(sock));
REQUIRE(sock->type == isc_nm_tlsdnssocket);
ievent = isc__nm_get_netievent_tlsdnscancel(sock->mgr, sock, handle);
isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
worker = &sock->mgr->workers[sock->tid];
ievent = isc__nm_get_netievent_tlsdnscancel(worker, sock, handle);
isc__nm_enqueue_ievent(worker, (isc__netievent_t *)ievent);
}
void
+48 -33
View File
@@ -10,7 +10,6 @@
* See the COPYRIGHT file distributed with this work for additional
* information regarding copyright ownership.
*/
#include <errno.h>
#include <libgen.h>
#include <unistd.h>
@@ -106,6 +105,8 @@ tls_senddone(isc_nmhandle_t *handle, isc_result_t eresult, void *cbarg) {
(isc_nmsocket_tls_send_req_t *)cbarg;
isc_nmsocket_t *tlssock = NULL;
bool finish = send_req->finish;
int tid = isc_nm_tid();
isc__networker_t *worker = NULL;
REQUIRE(VALID_NMHANDLE(handle));
REQUIRE(VALID_NMSOCK(handle->sock));
@@ -125,16 +126,17 @@ tls_senddone(isc_nmhandle_t *handle, isc_result_t eresult, void *cbarg) {
}
}
/* We are tying to avoid a memory allocation for small write
worker = &handle->sock->mgr->workers[tid];
/* We are trying to avoid a memory allocation for small write
* requests. See the mirroring code in the tls_send_outgoing()
* function. */
if (send_req->data.length > sizeof(send_req->smallbuf)) {
isc_mem_put(handle->sock->mgr->mctx, send_req->data.base,
isc_mem_put(worker->mctx, send_req->data.base,
send_req->data.length);
} else {
INSIST(&send_req->smallbuf[0] == send_req->data.base);
}
isc_mem_put(handle->sock->mgr->mctx, send_req, sizeof(*send_req));
isc_mem_put(worker->mctx, send_req, sizeof(*send_req));
tlssock->tlsstream.nsending--;
if (finish && eresult == ISC_R_SUCCESS) {
@@ -206,10 +208,10 @@ tls_failed_read_cb(isc_nmsocket_t *sock, const isc_result_t result) {
static void
async_tls_do_bio(isc_nmsocket_t *sock) {
isc__networker_t *worker = &sock->mgr->workers[sock->tid];
isc__netievent_tlsdobio_t *ievent =
isc__nm_get_netievent_tlsdobio(sock->mgr, sock);
isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
isc__nm_get_netievent_tlsdobio(worker, sock);
isc__nm_enqueue_ievent(worker, (isc__netievent_t *)ievent);
}
static int
@@ -219,6 +221,7 @@ tls_send_outgoing(isc_nmsocket_t *sock, bool finish, isc_nmhandle_t *tlshandle,
int pending;
int rv;
size_t len = 0;
isc__networker_t *worker = NULL;
if (inactive(sock)) {
if (cb != NULL) {
@@ -244,13 +247,15 @@ tls_send_outgoing(isc_nmsocket_t *sock, bool finish, isc_nmhandle_t *tlshandle,
pending = TLS_BUF_SIZE;
}
send_req = isc_mem_get(sock->mgr->mctx, sizeof(*send_req));
worker = &sock->mgr->workers[sock->tid];
send_req = isc_mem_get(worker->mctx, sizeof(*send_req));
*send_req = (isc_nmsocket_tls_send_req_t){ .finish = finish,
.data.length = pending };
/* Let's try to avoid a memory allocation for small write requests */
if ((size_t)pending > sizeof(send_req->smallbuf)) {
send_req->data.base = isc_mem_get(sock->mgr->mctx, pending);
send_req->data.base = isc_mem_get(worker->mctx, pending);
} else {
send_req->data.base = &send_req->smallbuf[0];
}
@@ -578,6 +583,8 @@ static isc_result_t
tlslisten_acceptcb(isc_nmhandle_t *handle, isc_result_t result, void *cbarg) {
isc_nmsocket_t *tlslistensock = (isc_nmsocket_t *)cbarg;
isc_nmsocket_t *tlssock = NULL;
int tid = isc_nm_tid();
isc__networker_t *worker = NULL;
/* If accept() was unsuccessful we can't do anything */
if (result != ISC_R_SUCCESS) {
@@ -589,12 +596,14 @@ tlslisten_acceptcb(isc_nmhandle_t *handle, isc_result_t result, void *cbarg) {
REQUIRE(VALID_NMSOCK(tlslistensock));
REQUIRE(tlslistensock->type == isc_nm_tlslistener);
worker = &tlslistensock->mgr->workers[tid];
/*
* We need to create a 'wrapper' tlssocket for this connection.
*/
tlssock = isc_mem_get(handle->sock->mgr->mctx, sizeof(*tlssock));
tlssock = isc_mem_get(worker->mctx, sizeof(*tlssock));
isc__nmsocket_init(tlssock, handle->sock->mgr, isc_nm_tlssocket,
&handle->sock->iface);
&handle->sock->iface, tid);
/* We need to initialize SSL now to reference SSL_CTX properly */
tlssock->tlsstream.ctx = tlslistensock->tlsstream.ctx;
@@ -610,7 +619,6 @@ tlslisten_acceptcb(isc_nmhandle_t *handle, isc_result_t result, void *cbarg) {
isc_nmhandle_attach(handle, &tlssock->outerhandle);
tlssock->peer = handle->sock->peer;
tlssock->read_timeout = atomic_load(&handle->sock->mgr->init);
tlssock->tid = isc_nm_tid();
tlssock->tlsstream.ctx = tlslistensock->tlsstream.ctx;
@@ -623,19 +631,21 @@ tlslisten_acceptcb(isc_nmhandle_t *handle, isc_result_t result, void *cbarg) {
}
isc_result_t
isc_nm_listentls(isc_nm_t *mgr, isc_sockaddr_t *iface,
isc_nm_listentls(isc_nm_t *mgr, uint32_t workers, isc_sockaddr_t *iface,
isc_nm_accept_cb_t accept_cb, void *accept_cbarg,
size_t extrahandlesize, int backlog, isc_quota_t *quota,
SSL_CTX *sslctx, isc_nmsocket_t **sockp) {
isc_result_t result;
isc_nmsocket_t *tlssock = NULL;
isc_nmsocket_t *tsock = NULL;
int tid = isc_nm_tid();
isc__networker_t *worker = &mgr->workers[tid];
REQUIRE(VALID_NM(mgr));
tlssock = isc_mem_get(mgr->mctx, sizeof(*tlssock));
tlssock = isc_mem_get(worker->mctx, sizeof(*tlssock));
isc__nmsocket_init(tlssock, mgr, isc_nm_tlslistener, iface);
isc__nmsocket_init(tlssock, mgr, isc_nm_tlslistener, iface, tid);
tlssock->result = ISC_R_UNSET;
tlssock->accept_cb = accept_cb;
tlssock->accept_cbarg = accept_cbarg;
@@ -647,8 +657,8 @@ isc_nm_listentls(isc_nm_t *mgr, isc_sockaddr_t *iface,
* tlssock will be a TLS 'wrapper' around an unencrypted stream.
* We set tlssock->outer to a socket listening for a TCP connection.
*/
result = isc_nm_listentcp(mgr, iface, tlslisten_acceptcb, tlssock,
extrahandlesize, backlog, quota,
result = isc_nm_listentcp(mgr, workers, iface, tlslisten_acceptcb,
tlssock, extrahandlesize, backlog, quota,
&tlssock->outer);
if (result != ISC_R_SUCCESS) {
atomic_store(&tlssock->closed, true);
@@ -703,6 +713,7 @@ isc__nm_tls_send(isc_nmhandle_t *handle, const isc_region_t *region,
isc__netievent_tlssend_t *ievent = NULL;
isc__nm_uvreq_t *uvreq = NULL;
isc_nmsocket_t *sock = NULL;
isc__networker_t *worker = NULL;
REQUIRE(VALID_NMHANDLE(handle));
REQUIRE(VALID_NMSOCK(handle->sock));
@@ -726,9 +737,9 @@ isc__nm_tls_send(isc_nmhandle_t *handle, const isc_region_t *region,
/*
* We need to create an event and pass it using async channel
*/
ievent = isc__nm_get_netievent_tlssend(sock->mgr, sock, uvreq);
isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
worker = &sock->mgr->workers[sock->tid];
ievent = isc__nm_get_netievent_tlssend(worker, sock, uvreq);
isc__nm_enqueue_ievent(worker, (isc__netievent_t *)ievent);
}
void
@@ -748,6 +759,7 @@ void
isc__nm_tls_read(isc_nmhandle_t *handle, isc_nm_recv_cb_t cb, void *cbarg) {
isc__netievent_tlsstartread_t *ievent = NULL;
isc_nmsocket_t *sock = NULL;
isc__networker_t *worker = NULL;
REQUIRE(VALID_NMHANDLE(handle));
@@ -765,9 +777,9 @@ isc__nm_tls_read(isc_nmhandle_t *handle, isc_nm_recv_cb_t cb, void *cbarg) {
sock->recv_cb = cb;
sock->recv_cbarg = cbarg;
ievent = isc__nm_get_netievent_tlsstartread(sock->mgr, sock);
isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
worker = &sock->mgr->workers[sock->tid];
ievent = isc__nm_get_netievent_tlsstartread(worker, sock);
isc__nm_enqueue_ievent(worker, (isc__netievent_t *)ievent);
}
void
@@ -823,6 +835,7 @@ tls_close_direct(isc_nmsocket_t *sock) {
void
isc__nm_tls_close(isc_nmsocket_t *sock) {
isc__netievent_tlsclose_t *ievent = NULL;
isc__networker_t *worker = NULL;
REQUIRE(VALID_NMSOCK(sock));
REQUIRE(sock->type == isc_nm_tlssocket);
@@ -832,9 +845,9 @@ isc__nm_tls_close(isc_nmsocket_t *sock) {
return;
}
ievent = isc__nm_get_netievent_tlsclose(sock->mgr, sock);
isc__nm_maybe_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
worker = &sock->mgr->workers[sock->tid];
ievent = isc__nm_get_netievent_tlsclose(worker, sock);
isc__nm_maybe_enqueue_ievent(worker, (isc__netievent_t *)ievent);
}
void
@@ -883,6 +896,9 @@ isc_nm_tlsconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer,
isc_nm_cb_t cb, void *cbarg, SSL_CTX *ctx,
unsigned int timeout, size_t extrahandlesize) {
isc_nmsocket_t *nsock = NULL;
int tid = isc_nm_tid();
isc__networker_t *worker = &mgr->workers[tid];
#if defined(NETMGR_TRACE) && defined(NETMGR_TRACE_VERBOSE)
fprintf(stderr, "TLS: isc_nm_tlsconnect(): in net thread: %s\n",
isc__nm_in_netthread() ? "yes" : "no");
@@ -890,8 +906,8 @@ isc_nm_tlsconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer,
REQUIRE(VALID_NM(mgr));
nsock = isc_mem_get(mgr->mctx, sizeof(*nsock));
isc__nmsocket_init(nsock, mgr, isc_nm_tlssocket, local);
nsock = isc_mem_get(worker->mctx, sizeof(*nsock));
isc__nmsocket_init(nsock, mgr, isc_nm_tlssocket, local, tid);
nsock->extrahandlesize = extrahandlesize;
nsock->result = ISC_R_UNSET;
nsock->connect_cb = cb;
@@ -963,7 +979,6 @@ tls_cancelread(isc_nmsocket_t *sock) {
void
isc__nm_tls_cancelread(isc_nmhandle_t *handle) {
isc_nmsocket_t *sock = NULL;
isc__netievent_tlscancel_t *ievent = NULL;
REQUIRE(VALID_NMHANDLE(handle));
@@ -974,10 +989,10 @@ isc__nm_tls_cancelread(isc_nmhandle_t *handle) {
if (sock->tid == isc_nm_tid()) {
tls_cancelread(sock);
} else {
ievent = isc__nm_get_netievent_tlscancel(sock->mgr, sock,
handle);
isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
isc__networker_t *worker = &sock->mgr->workers[sock->tid];
isc__netievent_tlscancel_t *ievent =
isc__nm_get_netievent_tlscancel(worker, sock, handle);
isc__nm_enqueue_ievent(worker, (isc__netievent_t *)ievent);
}
}
+52 -93
View File
@@ -115,14 +115,13 @@ start_udp_child(isc_nm_t *mgr, isc_sockaddr_t *iface, isc_nmsocket_t *sock,
csock = &sock->children[tid];
isc__nmsocket_init(csock, mgr, isc_nm_udpsocket, iface);
isc__nmsocket_init(csock, mgr, isc_nm_udpsocket, iface, tid);
csock->parent = sock;
csock->iface = sock->iface;
atomic_init(&csock->reading, true);
csock->recv_cb = sock->recv_cb;
csock->recv_cbarg = sock->recv_cbarg;
csock->extrahandlesize = sock->extrahandlesize;
csock->tid = tid;
#if HAVE_SO_REUSEPORT_LB
UNUSED(fd);
@@ -132,39 +131,42 @@ start_udp_child(isc_nm_t *mgr, isc_sockaddr_t *iface, isc_nmsocket_t *sock,
#endif
REQUIRE(csock->fd >= 0);
ievent = isc__nm_get_netievent_udplisten(mgr, csock);
ievent = isc__nm_get_netievent_udplisten(&mgr->workers[tid], csock);
isc__nm_maybe_enqueue_ievent(&mgr->workers[tid],
(isc__netievent_t *)ievent);
}
static void
enqueue_stoplistening(isc_nmsocket_t *sock) {
isc__netievent_udpstop_t *ievent =
isc__nm_get_netievent_udpstop(sock->mgr, sock);
isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
isc__networker_t *worker = &sock->mgr->workers[sock->tid];
isc__netievent_udpstop_t *ievent = isc__nm_get_netievent_udpstop(worker,
sock);
isc__nm_enqueue_ievent(worker, (isc__netievent_t *)ievent);
}
isc_result_t
isc_nm_listenudp(isc_nm_t *mgr, isc_sockaddr_t *iface, isc_nm_recv_cb_t cb,
void *cbarg, size_t extrahandlesize, isc_nmsocket_t **sockp) {
isc_nm_listenudp(isc_nm_t *mgr, uint32_t workers, isc_sockaddr_t *iface,
isc_nm_recv_cb_t cb, void *cbarg, size_t extrahandlesize,
isc_nmsocket_t **sockp) {
isc_result_t result = ISC_R_SUCCESS;
isc_nmsocket_t *sock = NULL;
size_t children_size = 0;
REQUIRE(VALID_NM(mgr));
uv_os_sock_t fd = -1;
uint32_t tid = isc_nm_tid();
isc__networker_t *worker = &mgr->workers[tid];
/*
* We are creating mgr->nworkers duplicated sockets, one
* socket for each worker thread.
*/
sock = isc_mem_get(mgr->mctx, sizeof(isc_nmsocket_t));
isc__nmsocket_init(sock, mgr, isc_nm_udplistener, iface);
sock = isc_mem_get(worker->mctx, sizeof(isc_nmsocket_t));
isc__nmsocket_init(sock, mgr, isc_nm_udplistener, iface, tid);
atomic_init(&sock->rchildren, 0);
sock->nchildren = mgr->nworkers;
sock->nchildren = (workers == 0) ? mgr->nworkers : workers;
children_size = sock->nchildren * sizeof(sock->children[0]);
sock->children = isc_mem_get(mgr->mctx, children_size);
sock->children = isc_mem_get(worker->mctx, children_size);
memset(sock->children, 0, children_size);
sock->recv_cb = cb;
@@ -172,7 +174,6 @@ isc_nm_listenudp(isc_nm_t *mgr, isc_sockaddr_t *iface, isc_nm_recv_cb_t cb,
sock->extrahandlesize = extrahandlesize;
sock->result = ISC_R_UNSET;
sock->tid = 0;
sock->fd = -1;
#if !HAVE_SO_REUSEPORT_LB
@@ -347,11 +348,13 @@ isc_nm_routeconnect(isc_nm_t *mgr, isc_nm_cb_t cb, void *cbarg,
isc_nmsocket_t *sock = NULL;
isc__netievent_udpconnect_t *event = NULL;
isc__nm_uvreq_t *req = NULL;
int tid = isc_nm_tid();
isc__networker_t *worker = &mgr->workers[tid];
REQUIRE(VALID_NM(mgr));
sock = isc_mem_get(mgr->mctx, sizeof(*sock));
isc__nmsocket_init(sock, mgr, isc_nm_udpsocket, NULL);
sock = isc_mem_get(worker->mctx, sizeof(*sock));
isc__nmsocket_init(sock, mgr, isc_nm_udpsocket, NULL, tid);
sock->connect_cb = cb;
sock->connect_cbarg = cbarg;
@@ -367,9 +370,6 @@ isc_nm_routeconnect(isc_nm_t *mgr, isc_nm_cb_t cb, void *cbarg,
result = route_socket(&sock->fd);
if (result != ISC_R_SUCCESS) {
if (isc__nm_in_netthread()) {
sock->tid = isc_nm_tid();
}
isc__nmsocket_clearcb(sock);
isc__nm_connectcb(sock, req, result, true);
atomic_store(&sock->closed, true);
@@ -377,19 +377,15 @@ isc_nm_routeconnect(isc_nm_t *mgr, isc_nm_cb_t cb, void *cbarg,
return (result);
}
event = isc__nm_get_netievent_routeconnect(mgr, sock, req);
event = isc__nm_get_netievent_routeconnect(worker, sock, req);
if (isc__nm_in_netthread()) {
atomic_store(&sock->active, true);
sock->tid = isc_nm_tid();
isc__nm_async_routeconnect(&mgr->workers[sock->tid],
(isc__netievent_t *)event);
isc__nm_put_netievent_routeconnect(mgr, event);
isc__nm_async_routeconnect(worker, (isc__netievent_t *)event);
isc__nm_put_netievent_routeconnect(worker, event);
} else {
atomic_init(&sock->active, false);
sock->tid = 0;
isc__nm_enqueue_ievent(&mgr->workers[sock->tid],
(isc__netievent_t *)event);
isc__nm_enqueue_ievent(worker, (isc__netievent_t *)event);
}
LOCK(&sock->lock);
while (sock->result == ISC_R_UNSET) {
@@ -422,7 +418,6 @@ isc__nm_async_udplisten(isc__networker_t *worker, isc__netievent_t *ev0) {
isc_result_t result = ISC_R_UNSET;
REQUIRE(VALID_NMSOCK(ievent->sock));
REQUIRE(ievent->sock->tid == isc_nm_tid());
REQUIRE(VALID_NMSOCK(ievent->sock->parent));
sock = ievent->sock;
@@ -681,13 +676,13 @@ void
isc__nm_udp_send(isc_nmhandle_t *handle, const isc_region_t *region,
isc_nm_cb_t cb, void *cbarg) {
isc_nmsocket_t *sock = handle->sock;
isc_nmsocket_t *rsock = NULL;
isc_sockaddr_t *peer = &handle->peer;
isc__nm_uvreq_t *uvreq = NULL;
uint32_t maxudp = atomic_load(&sock->mgr->maxudp);
int ntid;
isc__netievent_udpsend_t ievent;
INSIST(sock->type == isc_nm_udpsocket);
REQUIRE(sock->tid == isc_nm_tid());
/*
* We're simulating a firewall blocking UDP packets bigger than
@@ -702,31 +697,7 @@ isc__nm_udp_send(isc_nmhandle_t *handle, const isc_region_t *region,
return;
}
if (atomic_load(&sock->client)) {
/*
* When we are sending from the client socket, we directly use
* the socket provided.
*/
rsock = sock;
goto send;
} else {
/*
* When we are sending from the server socket, we either use the
* socket associated with the network thread we are in, or we
* use the thread from the socket associated with the handle.
*/
INSIST(sock->parent != NULL);
if (isc__nm_in_netthread()) {
ntid = isc_nm_tid();
} else {
ntid = sock->tid;
}
rsock = &sock->parent->children[ntid];
}
send:
uvreq = isc__nm_uvreq_get(rsock->mgr, rsock);
uvreq = isc__nm_uvreq_get(sock->mgr, sock);
uvreq->uvbuf.base = (char *)region->base;
uvreq->uvbuf.len = region->length;
@@ -735,22 +706,13 @@ send:
uvreq->cb.send = cb;
uvreq->cbarg = cbarg;
if (isc_nm_tid() == rsock->tid) {
REQUIRE(rsock->tid == isc_nm_tid());
isc__netievent_udpsend_t ievent = { .sock = rsock,
.req = uvreq,
.peer = *peer };
ievent = (isc__netievent_udpsend_t){
.sock = sock,
.req = uvreq,
.peer = *peer,
};
isc__nm_async_udpsend(NULL, (isc__netievent_t *)&ievent);
} else {
isc__netievent_udpsend_t *ievent =
isc__nm_get_netievent_udpsend(sock->mgr, rsock);
ievent->peer = *peer;
ievent->req = uvreq;
isc__nm_enqueue_ievent(&sock->mgr->workers[rsock->tid],
(isc__netievent_t *)ievent);
}
isc__nm_async_udpsend(NULL, (isc__netievent_t *)&ievent);
}
/*
@@ -969,6 +931,10 @@ isc_nm_udpconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer,
isc__netievent_udpconnect_t *event = NULL;
isc__nm_uvreq_t *req = NULL;
sa_family_t sa_family;
int tid = isc_nm_tid();
isc__networker_t *worker = &mgr->workers[tid];
REQUIRE(isc__nm_in_netthread());
REQUIRE(VALID_NM(mgr));
REQUIRE(local != NULL);
@@ -976,8 +942,8 @@ isc_nm_udpconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer,
sa_family = peer->type.sa.sa_family;
sock = isc_mem_get(mgr->mctx, sizeof(isc_nmsocket_t));
isc__nmsocket_init(sock, mgr, isc_nm_udpsocket, local);
sock = isc_mem_get(worker->mctx, sizeof(isc_nmsocket_t));
isc__nmsocket_init(sock, mgr, isc_nm_udpsocket, local, tid);
sock->connect_cb = cb;
sock->connect_cbarg = cbarg;
@@ -996,9 +962,6 @@ isc_nm_udpconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer,
result = isc__nm_socket(sa_family, SOCK_DGRAM, 0, &sock->fd);
if (result != ISC_R_SUCCESS) {
if (isc__nm_in_netthread()) {
sock->tid = isc_nm_tid();
}
isc__nmsocket_clearcb(sock);
isc__nm_connectcb(sock, req, result, true);
atomic_store(&sock->closed, true);
@@ -1020,19 +983,15 @@ isc_nm_udpconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer,
(void)isc__nm_socket_min_mtu(sock->fd, sa_family);
event = isc__nm_get_netievent_udpconnect(mgr, sock, req);
event = isc__nm_get_netievent_udpconnect(worker, sock, req);
if (isc__nm_in_netthread()) {
atomic_store(&sock->active, true);
sock->tid = isc_nm_tid();
isc__nm_async_udpconnect(&mgr->workers[sock->tid],
(isc__netievent_t *)event);
isc__nm_put_netievent_udpconnect(mgr, event);
isc__nm_async_udpconnect(worker, (isc__netievent_t *)event);
isc__nm_put_netievent_udpconnect(worker, event);
} else {
atomic_init(&sock->active, false);
sock->tid = isc_random_uniform(mgr->nworkers);
isc__nm_enqueue_ievent(&mgr->workers[sock->tid],
(isc__netievent_t *)event);
isc__nm_enqueue_ievent(worker, (isc__netievent_t *)event);
}
LOCK(&sock->lock);
while (sock->result == ISC_R_UNSET) {
@@ -1157,10 +1116,10 @@ isc__nm_udp_read(isc_nmhandle_t *handle, isc_nm_recv_cb_t cb, void *cbarg) {
isc__netievent_udpread_t ievent = { .sock = sock };
isc__nm_async_udpread(NULL, (isc__netievent_t *)&ievent);
} else {
isc__networker_t *worker = &sock->mgr->workers[sock->tid];
isc__netievent_udpread_t *ievent =
isc__nm_get_netievent_udpread(sock->mgr, sock);
isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
isc__nm_get_netievent_udpread(worker, sock);
isc__nm_enqueue_ievent(worker, (isc__netievent_t *)ievent);
}
}
@@ -1310,10 +1269,10 @@ isc__nm_udp_close(isc_nmsocket_t *sock) {
if (sock->tid == isc_nm_tid()) {
udp_close_direct(sock);
} else {
isc__networker_t *worker = &sock->mgr->workers[sock->tid];
isc__netievent_udpclose_t *ievent =
isc__nm_get_netievent_udpclose(sock->mgr, sock);
isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
isc__nm_get_netievent_udpclose(worker, sock);
isc__nm_enqueue_ievent(worker, (isc__netievent_t *)ievent);
}
}
@@ -1365,6 +1324,7 @@ void
isc__nm_udp_cancelread(isc_nmhandle_t *handle) {
isc_nmsocket_t *sock = NULL;
isc__netievent_udpcancel_t *ievent = NULL;
isc__networker_t *worker = NULL;
REQUIRE(VALID_NMHANDLE(handle));
@@ -1373,10 +1333,9 @@ isc__nm_udp_cancelread(isc_nmhandle_t *handle) {
REQUIRE(VALID_NMSOCK(sock));
REQUIRE(sock->type == isc_nm_udpsocket);
ievent = isc__nm_get_netievent_udpcancel(sock->mgr, sock, handle);
isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid],
(isc__netievent_t *)ievent);
worker = &sock->mgr->workers[sock->tid];
ievent = isc__nm_get_netievent_udpcancel(worker, sock, handle);
isc__nm_enqueue_ievent(worker, (isc__netievent_t *)ievent);
}
void
-163
View File
@@ -1,163 +0,0 @@
/*
* Copyright (C) Internet Systems Consortium, Inc. ("ISC")
*
* SPDX-License-Identifier: MPL-2.0
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, you can obtain one at https://mozilla.org/MPL/2.0/.
*
* See the COPYRIGHT file distributed with this work for additional
* information regarding copyright ownership.
*/
/*! \file */
#include <string.h>
#include <isc/mem.h>
#include <isc/pool.h>
#include <isc/random.h>
#include <isc/util.h>
/***
*** Types.
***/
struct isc_pool {
isc_mem_t *mctx;
unsigned int count;
isc_pooldeallocator_t free;
isc_poolinitializer_t init;
void *initarg;
void **pool;
};
/***
*** Functions.
***/
static isc_result_t
alloc_pool(isc_mem_t *mctx, unsigned int count, isc_pool_t **poolp) {
isc_pool_t *pool;
pool = isc_mem_get(mctx, sizeof(*pool));
pool->count = count;
pool->free = NULL;
pool->init = NULL;
pool->initarg = NULL;
pool->mctx = NULL;
isc_mem_attach(mctx, &pool->mctx);
pool->pool = isc_mem_get(mctx, count * sizeof(void *));
memset(pool->pool, 0, count * sizeof(void *));
*poolp = pool;
return (ISC_R_SUCCESS);
}
isc_result_t
isc_pool_create(isc_mem_t *mctx, unsigned int count,
isc_pooldeallocator_t release, isc_poolinitializer_t init,
void *initarg, isc_pool_t **poolp) {
isc_pool_t *pool = NULL;
isc_result_t result;
unsigned int i;
INSIST(count > 0);
/* Allocate the pool structure */
result = alloc_pool(mctx, count, &pool);
if (result != ISC_R_SUCCESS) {
return (result);
}
pool->free = release;
pool->init = init;
pool->initarg = initarg;
/* Populate the pool */
for (i = 0; i < count; i++) {
result = init(&pool->pool[i], initarg);
if (result != ISC_R_SUCCESS) {
isc_pool_destroy(&pool);
return (result);
}
}
*poolp = pool;
return (ISC_R_SUCCESS);
}
void *
isc_pool_get(isc_pool_t *pool) {
return (pool->pool[isc_random_uniform(pool->count)]);
}
int
isc_pool_count(isc_pool_t *pool) {
REQUIRE(pool != NULL);
return (pool->count);
}
isc_result_t
isc_pool_expand(isc_pool_t **sourcep, unsigned int count,
isc_pool_t **targetp) {
isc_result_t result;
isc_pool_t *pool;
REQUIRE(sourcep != NULL && *sourcep != NULL);
REQUIRE(targetp != NULL && *targetp == NULL);
pool = *sourcep;
*sourcep = NULL;
if (count > pool->count) {
isc_pool_t *newpool = NULL;
unsigned int i;
/* Allocate a new pool structure */
result = alloc_pool(pool->mctx, count, &newpool);
if (result != ISC_R_SUCCESS) {
return (result);
}
newpool->free = pool->free;
newpool->init = pool->init;
newpool->initarg = pool->initarg;
/* Populate the new entries */
for (i = pool->count; i < count; i++) {
result = newpool->init(&newpool->pool[i],
newpool->initarg);
if (result != ISC_R_SUCCESS) {
isc_pool_destroy(&newpool);
return (result);
}
}
/* Copy over the objects from the old pool */
for (i = 0; i < pool->count; i++) {
newpool->pool[i] = pool->pool[i];
pool->pool[i] = NULL;
}
isc_pool_destroy(&pool);
pool = newpool;
}
*targetp = pool;
return (ISC_R_SUCCESS);
}
void
isc_pool_destroy(isc_pool_t **poolp) {
unsigned int i;
isc_pool_t *pool = *poolp;
*poolp = NULL;
for (i = 0; i < pool->count; i++) {
if (pool->free != NULL && pool->pool[i] != NULL) {
pool->free(&pool->pool[i]);
}
}
isc_mem_put(pool->mctx, pool->pool, pool->count * sizeof(void *));
isc_mem_putanddetach(&pool->mctx, pool, sizeof(*pool));
}
+10 -30
View File
@@ -57,7 +57,7 @@
* helps with data locality on CPU.
*
* To make load even some tasks (from task pools) are bound to specific
* queues using isc_task_create_bound. This way load balancing between
* queues using isc_task_create. This way load balancing between
* CPUs/queues happens on the higher layer.
*/
@@ -101,8 +101,8 @@ struct isc_task {
unsigned int magic;
isc_taskmgr_t *manager;
isc_mutex_t lock;
uint32_t tid;
/* Locked by task lock. */
int tid;
task_state_t state;
isc_refcount_t references;
isc_refcount_t running;
@@ -193,18 +193,14 @@ task_finished(isc_task_t *task) {
isc_result_t
isc_task_create(isc_taskmgr_t *manager, unsigned int quantum,
isc_task_t **taskp) {
return (isc_task_create_bound(manager, quantum, taskp, -1));
}
isc_result_t
isc_task_create_bound(isc_taskmgr_t *manager, unsigned int quantum,
isc_task_t **taskp, int tid) {
isc_task_t **taskp, int tid) {
isc_task_t *task = NULL;
bool exiting;
REQUIRE(VALID_MANAGER(manager));
REQUIRE(taskp != NULL && *taskp == NULL);
REQUIRE(tid >= 0 &&
(uint32_t)tid < isc_nm_getnworkers(manager->netmgr));
XTRACE("isc_task_create");
@@ -338,10 +334,6 @@ task_ready(isc_task_t *task) {
isc_refcount_increment0(&task->running);
LOCK(&task->lock);
if (task->tid < 0) {
task->tid = (int)isc_random_uniform(
isc_nm_getnworkers(manager->netmgr));
}
isc_nm_task_enqueue(manager->netmgr, task, task->tid);
UNLOCK(&task->lock);
}
@@ -405,7 +397,7 @@ isc_task_detach(isc_task_t **taskp) {
}
static inline bool
task_send(isc_task_t *task, isc_event_t **eventp, int c) {
task_send(isc_task_t *task, isc_event_t **eventp) {
bool was_idle = false;
isc_event_t *event;
@@ -420,14 +412,12 @@ task_send(isc_task_t *task, isc_event_t **eventp, int c) {
REQUIRE(event->ev_type > 0);
REQUIRE(task->state != task_state_done);
REQUIRE(!ISC_LINK_LINKED(event, ev_ratelink));
REQUIRE(task->bound);
XTRACE("task_send");
if (task->state == task_state_idle) {
was_idle = true;
if (!task->bound) {
task->tid = c;
}
INSIST(EMPTY(task->events));
task->state = task_state_ready;
}
@@ -441,16 +431,6 @@ task_send(isc_task_t *task, isc_event_t **eventp, int c) {
void
isc_task_send(isc_task_t *task, isc_event_t **eventp) {
isc_task_sendto(task, eventp, -1);
}
void
isc_task_sendanddetach(isc_task_t **taskp, isc_event_t **eventp) {
isc_task_sendtoanddetach(taskp, eventp, -1);
}
void
isc_task_sendto(isc_task_t *task, isc_event_t **eventp, int c) {
bool was_idle;
/*
@@ -466,7 +446,7 @@ isc_task_sendto(isc_task_t *task, isc_event_t **eventp, int c) {
* some processing is deferred until after the lock is released.
*/
LOCK(&task->lock);
was_idle = task_send(task, eventp, c);
was_idle = task_send(task, eventp);
UNLOCK(&task->lock);
if (was_idle) {
@@ -490,7 +470,7 @@ isc_task_sendto(isc_task_t *task, isc_event_t **eventp, int c) {
}
void
isc_task_sendtoanddetach(isc_task_t **taskp, isc_event_t **eventp, int c) {
isc_task_sendanddetach(isc_task_t **taskp, isc_event_t **eventp) {
bool idle1, idle2;
isc_task_t *task;
@@ -505,7 +485,7 @@ isc_task_sendtoanddetach(isc_task_t **taskp, isc_event_t **eventp, int c) {
XTRACE("isc_task_sendanddetach");
LOCK(&task->lock);
idle1 = task_send(task, eventp, c);
idle1 = task_send(task, eventp);
idle2 = task_detach(task);
UNLOCK(&task->lock);
-157
View File
@@ -1,157 +0,0 @@
/*
* Copyright (C) Internet Systems Consortium, Inc. ("ISC")
*
* SPDX-License-Identifier: MPL-2.0
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, you can obtain one at https://mozilla.org/MPL/2.0/.
*
* See the COPYRIGHT file distributed with this work for additional
* information regarding copyright ownership.
*/
/*! \file */
#include <stdbool.h>
#include <isc/mem.h>
#include <isc/random.h>
#include <isc/taskpool.h>
#include <isc/util.h>
/***
*** Types.
***/
struct isc_taskpool {
isc_mem_t *mctx;
isc_taskmgr_t *tmgr;
unsigned int ntasks;
unsigned int quantum;
isc_task_t **tasks;
};
/***
*** Functions.
***/
static void
alloc_pool(isc_taskmgr_t *tmgr, isc_mem_t *mctx, unsigned int ntasks,
unsigned int quantum, isc_taskpool_t **poolp) {
isc_taskpool_t *pool;
unsigned int i;
pool = isc_mem_get(mctx, sizeof(*pool));
pool->mctx = NULL;
isc_mem_attach(mctx, &pool->mctx);
pool->ntasks = ntasks;
pool->quantum = quantum;
pool->tmgr = tmgr;
pool->tasks = isc_mem_get(mctx, ntasks * sizeof(isc_task_t *));
for (i = 0; i < ntasks; i++) {
pool->tasks[i] = NULL;
}
*poolp = pool;
}
isc_result_t
isc_taskpool_create(isc_taskmgr_t *tmgr, isc_mem_t *mctx, unsigned int ntasks,
unsigned int quantum, bool priv, isc_taskpool_t **poolp) {
unsigned int i;
isc_taskpool_t *pool = NULL;
INSIST(ntasks > 0);
/* Allocate the pool structure */
alloc_pool(tmgr, mctx, ntasks, quantum, &pool);
/* Create the tasks */
for (i = 0; i < ntasks; i++) {
isc_result_t result = isc_task_create_bound(tmgr, quantum,
&pool->tasks[i], i);
if (result != ISC_R_SUCCESS) {
isc_taskpool_destroy(&pool);
return (result);
}
isc_task_setprivilege(pool->tasks[i], priv);
isc_task_setname(pool->tasks[i], "taskpool", NULL);
}
*poolp = pool;
return (ISC_R_SUCCESS);
}
void
isc_taskpool_gettask(isc_taskpool_t *pool, isc_task_t **targetp) {
isc_task_attach(pool->tasks[isc_random_uniform(pool->ntasks)], targetp);
}
int
isc_taskpool_size(isc_taskpool_t *pool) {
REQUIRE(pool != NULL);
return (pool->ntasks);
}
isc_result_t
isc_taskpool_expand(isc_taskpool_t **sourcep, unsigned int size, bool priv,
isc_taskpool_t **targetp) {
isc_taskpool_t *pool;
REQUIRE(sourcep != NULL && *sourcep != NULL);
REQUIRE(targetp != NULL && *targetp == NULL);
pool = *sourcep;
*sourcep = NULL;
if (size > pool->ntasks) {
isc_taskpool_t *newpool = NULL;
unsigned int i;
/* Allocate a new pool structure */
alloc_pool(pool->tmgr, pool->mctx, size, pool->quantum,
&newpool);
/* Copy over the tasks from the old pool */
for (i = 0; i < pool->ntasks; i++) {
newpool->tasks[i] = pool->tasks[i];
pool->tasks[i] = NULL;
}
/* Create new tasks */
for (i = pool->ntasks; i < size; i++) {
isc_result_t result =
isc_task_create_bound(pool->tmgr, pool->quantum,
&newpool->tasks[i], i);
if (result != ISC_R_SUCCESS) {
*sourcep = pool;
isc_taskpool_destroy(&newpool);
return (result);
}
isc_task_setprivilege(newpool->tasks[i], priv);
isc_task_setname(newpool->tasks[i], "taskpool", NULL);
}
isc_taskpool_destroy(&pool);
pool = newpool;
}
*targetp = pool;
return (ISC_R_SUCCESS);
}
void
isc_taskpool_destroy(isc_taskpool_t **poolp) {
unsigned int i;
isc_taskpool_t *pool = *poolp;
*poolp = NULL;
for (i = 0; i < pool->ntasks; i++) {
if (pool->tasks[i] != NULL) {
isc_task_detach(&pool->tasks[i]);
}
}
isc_mem_put(pool->mctx, pool->tasks,
pool->ntasks * sizeof(isc_task_t *));
isc_mem_putanddetach(&pool->mctx, pool, sizeof(*pool));
}
-2
View File
@@ -30,7 +30,6 @@ check_PROGRAMS = \
netaddr_test \
netmgr_test \
parse_test \
pool_test \
quota_test \
radix_test \
random_test \
@@ -42,7 +41,6 @@ check_PROGRAMS = \
stats_test \
symtab_test \
task_test \
taskpool_test \
time_test \
timer_test
+20 -22
View File
@@ -127,7 +127,7 @@ connect_send_cb(isc_nmhandle_t *handle, isc_result_t result, void *arg) {
(void)atomic_fetch_sub(&active_cconnects, 1);
memmove(&data, arg, sizeof(data));
isc_mem_put(handle->sock->mgr->mctx, arg, sizeof(data));
isc_mem_put(test_mctx, arg, sizeof(data));
if (result != ISC_R_SUCCESS) {
goto error;
}
@@ -138,13 +138,11 @@ connect_send_cb(isc_nmhandle_t *handle, isc_result_t result, void *arg) {
goto error;
}
isc_mem_put(handle->sock->mgr->mctx, data.region.base,
data.region.length);
isc_mem_put(test_mctx, data.region.base, data.region.length);
return;
error:
data.reply_cb(handle, result, NULL, data.cb_arg);
isc_mem_put(handle->sock->mgr->mctx, data.region.base,
data.region.length);
isc_mem_put(test_mctx, data.region.base, data.region.length);
if (result == ISC_R_TOOMANYOPENFILES) {
atomic_store(&slowdown, true);
} else {
@@ -160,10 +158,10 @@ connect_send_request(isc_nm_t *mgr, const char *uri, bool post,
csdata_t *data = NULL;
isc_tlsctx_t *ctx = NULL;
copy = (isc_region_t){ .base = isc_mem_get(mgr->mctx, region->length),
copy = (isc_region_t){ .base = isc_mem_get(test_mctx, region->length),
.length = region->length };
memmove(copy.base, region->base, region->length);
data = isc_mem_get(mgr->mctx, sizeof(*data));
data = isc_mem_get(test_mctx, sizeof(*data));
*data = (csdata_t){ .reply_cb = cb, .cb_arg = cbarg, .region = copy };
if (tls) {
ctx = client_tlsctx;
@@ -474,8 +472,8 @@ mock_doh_uv_tcp_bind(void **state) {
result = isc_nm_http_endpoints_add(endpoints, ISC_NM_HTTP_DEFAULT_PATH,
noop_read_cb, NULL, 0);
assert_int_equal(result, ISC_R_SUCCESS);
result = isc_nm_listenhttp(listen_nm, &tcp_listen_addr, 0, NULL, NULL,
endpoints, 0, &listen_sock);
result = isc_nm_listenhttp(listen_nm, 0, &tcp_listen_addr, 0, NULL,
NULL, endpoints, 0, &listen_sock);
assert_int_not_equal(result, ISC_R_SUCCESS);
assert_null(listen_sock);
@@ -495,8 +493,8 @@ doh_noop(void **state) {
noop_read_cb, NULL, 0);
assert_int_equal(result, ISC_R_SUCCESS);
result = isc_nm_listenhttp(listen_nm, &tcp_listen_addr, 0, NULL, NULL,
endpoints, 0, &listen_sock);
result = isc_nm_listenhttp(listen_nm, 0, &tcp_listen_addr, 0, NULL,
NULL, endpoints, 0, &listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
isc_nm_stoplistening(listen_sock);
@@ -543,8 +541,8 @@ doh_noresponse(void **state) {
noop_read_cb, NULL, 0);
assert_int_equal(result, ISC_R_SUCCESS);
result = isc_nm_listenhttp(listen_nm, &tcp_listen_addr, 0, NULL, NULL,
endpoints, 0, &listen_sock);
result = isc_nm_listenhttp(listen_nm, 0, &tcp_listen_addr, 0, NULL,
NULL, endpoints, 0, &listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
sockaddr_to_url(&tcp_listen_addr, false, req_url, sizeof(req_url),
@@ -644,8 +642,8 @@ doh_timeout_recovery(void **state) {
doh_receive_request_cb, NULL, 0);
assert_int_equal(result, ISC_R_SUCCESS);
result = isc_nm_listenhttp(listen_nm, &tcp_listen_addr, 0, NULL, NULL,
endpoints, 0, &listen_sock);
result = isc_nm_listenhttp(listen_nm, 0, &tcp_listen_addr, 0, NULL,
NULL, endpoints, 0, &listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
/*
@@ -776,7 +774,7 @@ doh_recv_one(void **state) {
doh_receive_request_cb, NULL, 0);
assert_int_equal(result, ISC_R_SUCCESS);
result = isc_nm_listenhttp(listen_nm, &tcp_listen_addr, 0, quotap,
result = isc_nm_listenhttp(listen_nm, 0, &tcp_listen_addr, 0, quotap,
atomic_load(&use_TLS) ? server_tlsctx : NULL,
endpoints, 0, &listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
@@ -927,7 +925,7 @@ doh_recv_two(void **state) {
doh_receive_request_cb, NULL, 0);
assert_int_equal(result, ISC_R_SUCCESS);
result = isc_nm_listenhttp(listen_nm, &tcp_listen_addr, 0, quotap,
result = isc_nm_listenhttp(listen_nm, 0, &tcp_listen_addr, 0, quotap,
atomic_load(&use_TLS) ? server_tlsctx : NULL,
endpoints, 0, &listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
@@ -1047,7 +1045,7 @@ doh_recv_send(void **state) {
doh_receive_request_cb, NULL, 0);
assert_int_equal(result, ISC_R_SUCCESS);
result = isc_nm_listenhttp(listen_nm, &tcp_listen_addr, 0, quotap,
result = isc_nm_listenhttp(listen_nm, 0, &tcp_listen_addr, 0, quotap,
atomic_load(&use_TLS) ? server_tlsctx : NULL,
endpoints, 0, &listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
@@ -1160,7 +1158,7 @@ doh_recv_half_send(void **state) {
doh_receive_request_cb, NULL, 0);
assert_int_equal(result, ISC_R_SUCCESS);
result = isc_nm_listenhttp(listen_nm, &tcp_listen_addr, 0, quotap,
result = isc_nm_listenhttp(listen_nm, 0, &tcp_listen_addr, 0, quotap,
atomic_load(&use_TLS) ? server_tlsctx : NULL,
endpoints, 0, &listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
@@ -1270,7 +1268,7 @@ doh_half_recv_send(void **state) {
doh_receive_request_cb, NULL, 0);
assert_int_equal(result, ISC_R_SUCCESS);
result = isc_nm_listenhttp(listen_nm, &tcp_listen_addr, 0, quotap,
result = isc_nm_listenhttp(listen_nm, 0, &tcp_listen_addr, 0, quotap,
atomic_load(&use_TLS) ? server_tlsctx : NULL,
endpoints, 0, &listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
@@ -1380,7 +1378,7 @@ doh_half_recv_half_send(void **state) {
doh_receive_request_cb, NULL, 0);
assert_int_equal(result, ISC_R_SUCCESS);
result = isc_nm_listenhttp(listen_nm, &tcp_listen_addr, 0, quotap,
result = isc_nm_listenhttp(listen_nm, 0, &tcp_listen_addr, 0, quotap,
atomic_load(&use_TLS) ? server_tlsctx : NULL,
endpoints, 0, &listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
@@ -1489,7 +1487,7 @@ doh_bad_connect_uri(void **state) {
doh_receive_request_cb, NULL, 0);
assert_int_equal(result, ISC_R_SUCCESS);
result = isc_nm_listenhttp(listen_nm, &tcp_listen_addr, 0, quotap,
result = isc_nm_listenhttp(listen_nm, 0, &tcp_listen_addr, 0, quotap,
server_tlsctx, endpoints, 0, &listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
+1 -1
View File
@@ -80,7 +80,7 @@ create_managers(unsigned int workers) {
isc_managers_create(test_mctx, workers, 0, &netmgr, &taskmgr,
&timermgr);
CHECK(isc_task_create_bound(taskmgr, 0, &maintask, 0));
CHECK(isc_task_create(taskmgr, 0, &maintask, 0));
isc_taskmgr_setexcltask(taskmgr, maintask);
return (ISC_R_SUCCESS);
+71 -52
View File
@@ -633,7 +633,7 @@ mock_listenudp_uv_udp_open(void **state __attribute__((unused))) {
WILL_RETURN(uv_udp_open, UV_ENOMEM);
result = isc_nm_listenudp(listen_nm, &udp_listen_addr, noop_recv_cb,
result = isc_nm_listenudp(listen_nm, 0, &udp_listen_addr, noop_recv_cb,
NULL, 0, &listen_sock);
assert_int_not_equal(result, ISC_R_SUCCESS);
assert_null(listen_sock);
@@ -648,7 +648,7 @@ mock_listenudp_uv_udp_bind(void **state __attribute__((unused))) {
WILL_RETURN(uv_udp_bind, UV_EADDRINUSE);
result = isc_nm_listenudp(listen_nm, &udp_listen_addr, noop_recv_cb,
result = isc_nm_listenudp(listen_nm, 0, &udp_listen_addr, noop_recv_cb,
NULL, 0, &listen_sock);
assert_int_not_equal(result, ISC_R_SUCCESS);
assert_null(listen_sock);
@@ -663,7 +663,7 @@ mock_listenudp_uv_udp_recv_start(void **state __attribute__((unused))) {
WILL_RETURN(uv_udp_recv_start, UV_EADDRINUSE);
result = isc_nm_listenudp(listen_nm, &udp_listen_addr, noop_recv_cb,
result = isc_nm_listenudp(listen_nm, 0, &udp_listen_addr, noop_recv_cb,
NULL, 0, &listen_sock);
assert_int_not_equal(result, ISC_R_SUCCESS);
assert_null(listen_sock);
@@ -672,7 +672,9 @@ mock_listenudp_uv_udp_recv_start(void **state __attribute__((unused))) {
}
static void
mock_udpconnect_uv_udp_open(void **state __attribute__((unused))) {
mock_udpconnect_uv_udp_open_cb(void *arg) {
UNUSED(arg);
WILL_RETURN(uv_udp_open, UV_ENOMEM);
connect_readcb = NULL;
@@ -685,7 +687,15 @@ mock_udpconnect_uv_udp_open(void **state __attribute__((unused))) {
}
static void
mock_udpconnect_uv_udp_bind(void **state __attribute__((unused))) {
mock_udpconnect_uv_udp_open(void **state __attribute__((unused))) {
isc_nm_run(connect_nm, mock_udpconnect_uv_udp_open_cb, NULL,
isc_random_uniform(isc_nm_getnworkers(connect_nm)));
}
static void
mock_udpconnect_uv_udp_bind_cb(void *arg) {
UNUSED(arg);
WILL_RETURN(uv_udp_bind, UV_ENOMEM);
connect_readcb = NULL;
@@ -697,6 +707,12 @@ mock_udpconnect_uv_udp_bind(void **state __attribute__((unused))) {
RESET_RETURN;
}
static void
mock_udpconnect_uv_udp_bind(void **state __attribute__((unused))) {
isc_nm_run(connect_nm, mock_udpconnect_uv_udp_bind_cb, NULL,
isc_random_uniform(isc_nm_getnworkers(connect_nm)));
}
#if UV_VERSION_HEX >= UV_VERSION(1, 27, 0)
static void
mock_udpconnect_uv_udp_connect(void **state __attribute__((unused))) {
@@ -743,7 +759,7 @@ udp_noop(void **state __attribute__((unused))) {
isc_result_t result = ISC_R_SUCCESS;
isc_nmsocket_t *listen_sock = NULL;
result = isc_nm_listenudp(listen_nm, &udp_listen_addr, noop_recv_cb,
result = isc_nm_listenudp(listen_nm, 0, &udp_listen_addr, noop_recv_cb,
NULL, 0, &listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
@@ -769,7 +785,7 @@ udp_noresponse(void **state __attribute__((unused))) {
isc_result_t result = ISC_R_SUCCESS;
isc_nmsocket_t *listen_sock = NULL;
result = isc_nm_listenudp(listen_nm, &udp_listen_addr, noop_recv_cb,
result = isc_nm_listenudp(listen_nm, 0, &udp_listen_addr, noop_recv_cb,
NULL, 0, &listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
@@ -830,7 +846,7 @@ udp_timeout_recovery(void **state __attribute__((unused))) {
/*
* Listen using the noop callback so that client reads will time out.
*/
result = isc_nm_listenudp(listen_nm, &udp_listen_addr, noop_recv_cb,
result = isc_nm_listenudp(listen_nm, 0, &udp_listen_addr, noop_recv_cb,
NULL, 0, &listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
@@ -865,8 +881,8 @@ udp_recv_one(void **state __attribute__((unused))) {
atomic_store(&nsends, 1);
result = isc_nm_listenudp(listen_nm, &udp_listen_addr, listen_read_cb,
NULL, 0, &listen_sock);
result = isc_nm_listenudp(listen_nm, 0, &udp_listen_addr,
listen_read_cb, NULL, 0, &listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
isc_refcount_increment0(&active_cconnects);
@@ -905,8 +921,8 @@ udp_recv_two(void **state __attribute__((unused))) {
atomic_store(&nsends, 2);
result = isc_nm_listenudp(listen_nm, &udp_listen_addr, listen_read_cb,
NULL, 0, &listen_sock);
result = isc_nm_listenudp(listen_nm, 0, &udp_listen_addr,
listen_read_cb, NULL, 0, &listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
isc_refcount_increment0(&active_cconnects);
@@ -952,8 +968,8 @@ udp_recv_send(void **state __attribute__((unused))) {
SKIP_IN_CI;
result = isc_nm_listenudp(listen_nm, &udp_listen_addr, listen_read_cb,
NULL, 0, &listen_sock);
result = isc_nm_listenudp(listen_nm, 0, &udp_listen_addr,
listen_read_cb, NULL, 0, &listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
memset(threads, 0, sizeof(threads));
@@ -997,8 +1013,8 @@ udp_recv_half_send(void **state __attribute__((unused))) {
SKIP_IN_CI;
result = isc_nm_listenudp(listen_nm, &udp_listen_addr, listen_read_cb,
NULL, 0, &listen_sock);
result = isc_nm_listenudp(listen_nm, 0, &udp_listen_addr,
listen_read_cb, NULL, 0, &listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
memset(threads, 0, sizeof(threads));
@@ -1043,8 +1059,8 @@ udp_half_recv_send(void **state __attribute__((unused))) {
SKIP_IN_CI;
result = isc_nm_listenudp(listen_nm, &udp_listen_addr, listen_read_cb,
NULL, 0, &listen_sock);
result = isc_nm_listenudp(listen_nm, 0, &udp_listen_addr,
listen_read_cb, NULL, 0, &listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
memset(threads, 0, sizeof(threads));
@@ -1092,8 +1108,8 @@ udp_half_recv_half_send(void **state __attribute__((unused))) {
SKIP_IN_CI;
result = isc_nm_listenudp(listen_nm, &udp_listen_addr, listen_read_cb,
NULL, 0, &listen_sock);
result = isc_nm_listenudp(listen_nm, 0, &udp_listen_addr,
listen_read_cb, NULL, 0, &listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
memset(threads, 0, sizeof(threads));
@@ -1171,14 +1187,14 @@ stream_listen(isc_nm_accept_cb_t accept_cb, void *accept_cbarg,
#if HAVE_LIBNGHTTP2
if (stream_use_TLS) {
result = isc_nm_listentls(listen_nm, &tcp_listen_addr,
result = isc_nm_listentls(listen_nm, 0, &tcp_listen_addr,
accept_cb, accept_cbarg,
extrahandlesize, backlog, quota,
tcp_listen_tlsctx, sockp);
return (result);
}
#endif
result = isc_nm_listentcp(listen_nm, &tcp_listen_addr, accept_cb,
result = isc_nm_listentcp(listen_nm, 0, &tcp_listen_addr, accept_cb,
accept_cbarg, extrahandlesize, backlog, quota,
sockp);
@@ -1749,9 +1765,9 @@ tcpdns_noop(void **state __attribute__((unused))) {
isc_result_t result = ISC_R_SUCCESS;
isc_nmsocket_t *listen_sock = NULL;
result = isc_nm_listentcpdns(listen_nm, &tcp_listen_addr, noop_recv_cb,
NULL, noop_accept_cb, NULL, 0, 0, NULL,
&listen_sock);
result = isc_nm_listentcpdns(listen_nm, 0, &tcp_listen_addr,
noop_recv_cb, NULL, noop_accept_cb, NULL,
0, 0, NULL, &listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
isc_nm_stoplistening(listen_sock);
@@ -1777,9 +1793,9 @@ tcpdns_noresponse(void **state __attribute__((unused))) {
isc_nmsocket_t *listen_sock = NULL;
isc_refcount_increment0(&active_cconnects);
result = isc_nm_listentcpdns(listen_nm, &tcp_listen_addr, noop_recv_cb,
NULL, noop_accept_cb, NULL, 0, 0, NULL,
&listen_sock);
result = isc_nm_listentcpdns(listen_nm, 0, &tcp_listen_addr,
noop_recv_cb, NULL, noop_accept_cb, NULL,
0, 0, NULL, &listen_sock);
if (result != ISC_R_SUCCESS) {
isc_refcount_decrement(&active_cconnects);
isc_test_nap(1000);
@@ -1822,7 +1838,7 @@ tcpdns_timeout_recovery(void **state __attribute__((unused))) {
* reads to time out.
*/
noanswer = true;
result = isc_nm_listentcpdns(listen_nm, &tcp_listen_addr,
result = isc_nm_listentcpdns(listen_nm, 0, &tcp_listen_addr,
listen_read_cb, NULL, listen_accept_cb,
NULL, 0, 0, NULL, &listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
@@ -1859,7 +1875,7 @@ tcpdns_recv_one(void **state __attribute__((unused))) {
atomic_store(&nsends, 1);
result = isc_nm_listentcpdns(listen_nm, &tcp_listen_addr,
result = isc_nm_listentcpdns(listen_nm, 0, &tcp_listen_addr,
listen_read_cb, NULL, listen_accept_cb,
NULL, 0, 0, NULL, &listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
@@ -1900,7 +1916,7 @@ tcpdns_recv_two(void **state __attribute__((unused))) {
atomic_store(&nsends, 2);
result = isc_nm_listentcpdns(listen_nm, &tcp_listen_addr,
result = isc_nm_listentcpdns(listen_nm, 0, &tcp_listen_addr,
listen_read_cb, NULL, listen_accept_cb,
NULL, 0, 0, NULL, &listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
@@ -1949,7 +1965,7 @@ tcpdns_recv_send(void **state __attribute__((unused))) {
SKIP_IN_CI;
result = isc_nm_listentcpdns(listen_nm, &tcp_listen_addr,
result = isc_nm_listentcpdns(listen_nm, 0, &tcp_listen_addr,
listen_read_cb, NULL, listen_accept_cb,
NULL, 0, 0, NULL, &listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
@@ -1995,7 +2011,7 @@ tcpdns_recv_half_send(void **state __attribute__((unused))) {
SKIP_IN_CI;
result = isc_nm_listentcpdns(listen_nm, &tcp_listen_addr,
result = isc_nm_listentcpdns(listen_nm, 0, &tcp_listen_addr,
listen_read_cb, NULL, listen_accept_cb,
NULL, 0, 0, NULL, &listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
@@ -2042,7 +2058,7 @@ tcpdns_half_recv_send(void **state __attribute__((unused))) {
SKIP_IN_CI;
result = isc_nm_listentcpdns(listen_nm, &tcp_listen_addr,
result = isc_nm_listentcpdns(listen_nm, 0, &tcp_listen_addr,
listen_read_cb, NULL, listen_accept_cb,
NULL, 0, 0, NULL, &listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
@@ -2092,7 +2108,7 @@ tcpdns_half_recv_half_send(void **state __attribute__((unused))) {
SKIP_IN_CI;
result = isc_nm_listentcpdns(listen_nm, &tcp_listen_addr,
result = isc_nm_listentcpdns(listen_nm, 0, &tcp_listen_addr,
listen_read_cb, NULL, listen_accept_cb,
NULL, 0, 0, NULL, &listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
@@ -2329,9 +2345,10 @@ tlsdns_noop(void **state __attribute__((unused))) {
isc_result_t result = ISC_R_SUCCESS;
isc_nmsocket_t *listen_sock = NULL;
result = isc_nm_listentlsdns(listen_nm, &tcp_listen_addr, noop_recv_cb,
NULL, noop_accept_cb, NULL, 0, 0, NULL,
tcp_listen_tlsctx, &listen_sock);
result = isc_nm_listentlsdns(listen_nm, 0, &tcp_listen_addr,
noop_recv_cb, NULL, noop_accept_cb, NULL,
0, 0, NULL, tcp_listen_tlsctx,
&listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
isc_nm_stoplistening(listen_sock);
@@ -2362,9 +2379,10 @@ tlsdns_noresponse(void **state __attribute__((unused))) {
connect_addr = (isc_sockaddr_t){ .length = 0 };
isc_sockaddr_fromin6(&connect_addr, &in6addr_loopback, 0);
result = isc_nm_listentlsdns(listen_nm, &tcp_listen_addr, noop_recv_cb,
NULL, noop_accept_cb, NULL, 0, 0, NULL,
tcp_listen_tlsctx, &listen_sock);
result = isc_nm_listentlsdns(listen_nm, 0, &tcp_listen_addr,
noop_recv_cb, NULL, noop_accept_cb, NULL,
0, 0, NULL, tcp_listen_tlsctx,
&listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
isc_refcount_increment0(&active_cconnects);
@@ -2409,7 +2427,7 @@ tlsdns_timeout_recovery(void **state __attribute__((unused))) {
* reads to time out.
*/
noanswer = true;
result = isc_nm_listentlsdns(listen_nm, &tcp_listen_addr,
result = isc_nm_listentlsdns(listen_nm, 0, &tcp_listen_addr,
listen_read_cb, NULL, listen_accept_cb,
NULL, 0, 0, NULL, tcp_listen_tlsctx,
&listen_sock);
@@ -2448,7 +2466,7 @@ tlsdns_recv_one(void **state __attribute__((unused))) {
atomic_store(&nsends, 1);
result = isc_nm_listentlsdns(listen_nm, &tcp_listen_addr,
result = isc_nm_listentlsdns(listen_nm, 0, &tcp_listen_addr,
listen_read_cb, NULL, listen_accept_cb,
NULL, 0, 0, NULL, tcp_listen_tlsctx,
&listen_sock);
@@ -2491,7 +2509,7 @@ tlsdns_recv_two(void **state __attribute__((unused))) {
atomic_store(&nsends, 2);
result = isc_nm_listentlsdns(listen_nm, &tcp_listen_addr,
result = isc_nm_listentlsdns(listen_nm, 0, &tcp_listen_addr,
listen_read_cb, NULL, listen_accept_cb,
NULL, 0, 0, NULL, tcp_listen_tlsctx,
&listen_sock);
@@ -2543,7 +2561,7 @@ tlsdns_recv_send(void **state __attribute__((unused))) {
SKIP_IN_CI;
result = isc_nm_listentlsdns(listen_nm, &tcp_listen_addr,
result = isc_nm_listentlsdns(listen_nm, 0, &tcp_listen_addr,
listen_read_cb, NULL, listen_accept_cb,
NULL, 0, 0, NULL, tcp_listen_tlsctx,
&listen_sock);
@@ -2590,7 +2608,7 @@ tlsdns_recv_half_send(void **state __attribute__((unused))) {
SKIP_IN_CI;
result = isc_nm_listentlsdns(listen_nm, &tcp_listen_addr,
result = isc_nm_listentlsdns(listen_nm, 0, &tcp_listen_addr,
listen_read_cb, NULL, listen_accept_cb,
NULL, 0, 0, NULL, tcp_listen_tlsctx,
&listen_sock);
@@ -2638,7 +2656,7 @@ tlsdns_half_recv_send(void **state __attribute__((unused))) {
SKIP_IN_CI;
result = isc_nm_listentlsdns(listen_nm, &tcp_listen_addr,
result = isc_nm_listentlsdns(listen_nm, 0, &tcp_listen_addr,
listen_read_cb, NULL, listen_accept_cb,
NULL, 0, 0, NULL, tcp_listen_tlsctx,
&listen_sock);
@@ -2689,7 +2707,7 @@ tlsdns_half_recv_half_send(void **state __attribute__((unused))) {
SKIP_IN_CI;
result = isc_nm_listentlsdns(listen_nm, &tcp_listen_addr,
result = isc_nm_listentlsdns(listen_nm, 0, &tcp_listen_addr,
listen_read_cb, NULL, listen_accept_cb,
NULL, 0, 0, NULL, tcp_listen_tlsctx,
&listen_sock);
@@ -2767,9 +2785,10 @@ tlsdns_connect_noalpn(void **state __attribute__((unused))) {
connect_addr = (isc_sockaddr_t){ .length = 0 };
isc_sockaddr_fromin6(&connect_addr, &in6addr_loopback, 0);
result = isc_nm_listentlsdns(listen_nm, &tcp_listen_addr, noop_recv_cb,
NULL, noop_accept_cb, NULL, 0, 0, NULL,
tcp_listen_tlsctx, &listen_sock);
result = isc_nm_listentlsdns(listen_nm, 0, &tcp_listen_addr,
noop_recv_cb, NULL, noop_accept_cb, NULL,
0, 0, NULL, tcp_listen_tlsctx,
&listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
isc_refcount_increment0(&active_cconnects);
@@ -2834,7 +2853,7 @@ tlsdns_listen_noalpn(void **state __attribute__((unused))) {
/* We use TLS stream listener here intentionally, as it does not
* try to do ALPN. */
result = isc_nm_listentls(listen_nm, &tcp_listen_addr,
result = isc_nm_listentls(listen_nm, 0, &tcp_listen_addr,
tls_accept_cb_noalpn, NULL, 0, 0, NULL,
server_tlsctx_noalpn, &listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
-194
View File
@@ -1,194 +0,0 @@
/*
* Copyright (C) Internet Systems Consortium, Inc. ("ISC")
*
* SPDX-License-Identifier: MPL-2.0
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, you can obtain one at https://mozilla.org/MPL/2.0/.
*
* See the COPYRIGHT file distributed with this work for additional
* information regarding copyright ownership.
*/
#if HAVE_CMOCKA
#include <sched.h> /* IWYU pragma: keep */
#include <setjmp.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define UNIT_TESTING
#include <cmocka.h>
#include <isc/mem.h>
#include <isc/pool.h>
#include <isc/util.h>
#include "isctest.h"
static int
_setup(void **state) {
isc_result_t result;
UNUSED(state);
result = isc_test_begin(NULL, true, 0);
assert_int_equal(result, ISC_R_SUCCESS);
return (0);
}
static int
_teardown(void **state) {
UNUSED(state);
isc_test_end();
return (0);
}
static isc_result_t
poolinit(void **target, void *arg) {
isc_result_t result;
isc_taskmgr_t *mgr = (isc_taskmgr_t *)arg;
isc_task_t *task = NULL;
result = isc_task_create(mgr, 0, &task);
if (result != ISC_R_SUCCESS) {
return (result);
}
*target = (void *)task;
return (ISC_R_SUCCESS);
}
static void
poolfree(void **target) {
isc_task_t *task = *(isc_task_t **)target;
isc_task_destroy(&task);
*target = NULL;
}
/* Create a pool */
static void
create_pool(void **state) {
isc_result_t result;
isc_pool_t *pool = NULL;
UNUSED(state);
result = isc_pool_create(test_mctx, 8, poolfree, poolinit, taskmgr,
&pool);
assert_int_equal(result, ISC_R_SUCCESS);
assert_int_equal(isc_pool_count(pool), 8);
isc_pool_destroy(&pool);
assert_null(pool);
}
/* Resize a pool */
static void
expand_pool(void **state) {
isc_result_t result;
isc_pool_t *pool1 = NULL, *pool2 = NULL, *hold = NULL;
UNUSED(state);
result = isc_pool_create(test_mctx, 10, poolfree, poolinit, taskmgr,
&pool1);
assert_int_equal(result, ISC_R_SUCCESS);
assert_int_equal(isc_pool_count(pool1), 10);
/* resizing to a smaller size should have no effect */
hold = pool1;
result = isc_pool_expand(&pool1, 5, &pool2);
assert_int_equal(result, ISC_R_SUCCESS);
assert_int_equal(isc_pool_count(pool2), 10);
assert_ptr_equal(pool2, hold);
assert_null(pool1);
pool1 = pool2;
pool2 = NULL;
/* resizing to the same size should have no effect */
hold = pool1;
result = isc_pool_expand(&pool1, 10, &pool2);
assert_int_equal(result, ISC_R_SUCCESS);
assert_int_equal(isc_pool_count(pool2), 10);
assert_ptr_equal(pool2, hold);
assert_null(pool1);
pool1 = pool2;
pool2 = NULL;
/* resizing to larger size should make a new pool */
hold = pool1;
result = isc_pool_expand(&pool1, 20, &pool2);
assert_int_equal(result, ISC_R_SUCCESS);
assert_int_equal(isc_pool_count(pool2), 20);
assert_ptr_not_equal(pool2, hold);
assert_null(pool1);
isc_pool_destroy(&pool2);
assert_null(pool2);
}
/* Get objects */
static void
get_objects(void **state) {
isc_result_t result;
isc_pool_t *pool = NULL;
void *item;
isc_task_t *task1 = NULL, *task2 = NULL, *task3 = NULL;
UNUSED(state);
result = isc_pool_create(test_mctx, 2, poolfree, poolinit, taskmgr,
&pool);
assert_int_equal(result, ISC_R_SUCCESS);
assert_int_equal(isc_pool_count(pool), 2);
item = isc_pool_get(pool);
assert_non_null(item);
isc_task_attach((isc_task_t *)item, &task1);
item = isc_pool_get(pool);
assert_non_null(item);
isc_task_attach((isc_task_t *)item, &task2);
item = isc_pool_get(pool);
assert_non_null(item);
isc_task_attach((isc_task_t *)item, &task3);
isc_task_detach(&task1);
isc_task_detach(&task2);
isc_task_detach(&task3);
isc_pool_destroy(&pool);
assert_null(pool);
}
int
main(void) {
const struct CMUnitTest tests[] = {
cmocka_unit_test_setup_teardown(create_pool, _setup, _teardown),
cmocka_unit_test_setup_teardown(expand_pool, _setup, _teardown),
cmocka_unit_test_setup_teardown(get_objects, _setup, _teardown),
};
return (cmocka_run_group_tests(tests, NULL, NULL));
}
#else /* HAVE_CMOCKA */
#include <stdio.h>
int
main(void) {
printf("1..0 # Skipped: cmocka not available\n");
return (SKIPPED_TEST_EXIT_CODE);
}
#endif /* if HAVE_CMOCKA */
+18 -17
View File
@@ -143,7 +143,7 @@ create_task(void **state) {
UNUSED(state);
result = isc_task_create(taskmgr, 0, &task);
result = isc_task_create(taskmgr, 0, &task, 0);
assert_int_equal(result, ISC_R_SUCCESS);
isc_task_destroy(&task);
@@ -165,7 +165,7 @@ all_events(void **state) {
atomic_init(&a, 0);
atomic_init(&b, 0);
result = isc_task_create(taskmgr, 0, &task);
result = isc_task_create(taskmgr, 0, &task, 0);
assert_int_equal(result, ISC_R_SUCCESS);
/* First event */
@@ -219,14 +219,14 @@ privileged_events(void **state) {
isc_nm_pause(netmgr);
isc_taskmgr_setmode(taskmgr, isc_taskmgrmode_privileged);
result = isc_task_create(taskmgr, 0, &task1);
result = isc_task_create(taskmgr, 0, &task1, 0);
assert_int_equal(result, ISC_R_SUCCESS);
isc_task_setname(task1, "privileged", NULL);
assert_false(isc_task_getprivilege(task1));
isc_task_setprivilege(task1, true);
assert_true(isc_task_getprivilege(task1));
result = isc_task_create(taskmgr, 0, &task2);
result = isc_task_create(taskmgr, 0, &task2, 0);
assert_int_equal(result, ISC_R_SUCCESS);
isc_task_setname(task2, "normal", NULL);
assert_false(isc_task_getprivilege(task2));
@@ -334,14 +334,14 @@ privilege_drop(void **state) {
isc_nm_pause(netmgr);
isc_taskmgr_setmode(taskmgr, isc_taskmgrmode_privileged);
result = isc_task_create(taskmgr, 0, &task1);
result = isc_task_create(taskmgr, 0, &task1, 0);
assert_int_equal(result, ISC_R_SUCCESS);
isc_task_setname(task1, "privileged", NULL);
assert_false(isc_task_getprivilege(task1));
isc_task_setprivilege(task1, true);
assert_true(isc_task_getprivilege(task1));
result = isc_task_create(taskmgr, 0, &task2);
result = isc_task_create(taskmgr, 0, &task2, 0);
assert_int_equal(result, ISC_R_SUCCESS);
isc_task_setname(task2, "normal", NULL);
assert_false(isc_task_getprivilege(task2));
@@ -487,13 +487,13 @@ basic(void **state) {
UNUSED(state);
result = isc_task_create(taskmgr, 0, &task1);
result = isc_task_create(taskmgr, 0, &task1, 0);
assert_int_equal(result, ISC_R_SUCCESS);
result = isc_task_create(taskmgr, 0, &task2);
result = isc_task_create(taskmgr, 0, &task2, 0);
assert_int_equal(result, ISC_R_SUCCESS);
result = isc_task_create(taskmgr, 0, &task3);
result = isc_task_create(taskmgr, 0, &task3, 0);
assert_int_equal(result, ISC_R_SUCCESS);
result = isc_task_create(taskmgr, 0, &task4);
result = isc_task_create(taskmgr, 0, &task4, 0);
assert_int_equal(result, ISC_R_SUCCESS);
result = isc_task_onshutdown(task1, basic_shutdown, one);
@@ -623,13 +623,14 @@ task_exclusive(void **state) {
if (i == 6) {
/* task chosen from the middle of the range */
result = isc_task_create_bound(taskmgr, 0, &tasks[i],
result = isc_task_create(taskmgr, 0, &tasks[i],
0);
assert_int_equal(result, ISC_R_SUCCESS);
isc_taskmgr_setexcltask(taskmgr, tasks[6]);
} else {
result = isc_task_create(taskmgr, 0, &tasks[i]);
result = isc_task_create(taskmgr, 0, &tasks[i],
0);
assert_int_equal(result, ISC_R_SUCCESS);
}
@@ -687,7 +688,7 @@ maxtask_cb(isc_task_t *task, isc_event_t *event) {
/*
* Create a new task and forward the message.
*/
result = isc_task_create(taskmgr, 0, &newtask);
result = isc_task_create(taskmgr, 0, &newtask, 0);
assert_int_equal(result, ISC_R_SUCCESS);
result = isc_task_onshutdown(newtask, maxtask_shutdown,
@@ -832,7 +833,7 @@ task_shutdown(void **state) {
LOCK(&lock);
result = isc_task_create(taskmgr, 0, &task);
result = isc_task_create(taskmgr, 0, &task, 0);
assert_int_equal(result, ISC_R_SUCCESS);
/*
@@ -923,7 +924,7 @@ post_shutdown(void **state) {
LOCK(&lock);
task = NULL;
result = isc_task_create(taskmgr, 0, &task);
result = isc_task_create(taskmgr, 0, &task, 0);
assert_int_equal(result, ISC_R_SUCCESS);
/*
@@ -1060,7 +1061,7 @@ test_purge(int sender, int type, int tag, int exp_purged) {
isc_condition_init(&cv);
result = isc_task_create(taskmgr, 0, &task);
result = isc_task_create(taskmgr, 0, &task, 0);
assert_int_equal(result, ISC_R_SUCCESS);
result = isc_task_onshutdown(task, pg_sde, NULL);
@@ -1355,7 +1356,7 @@ try_purgeevent(bool purgeable) {
isc_condition_init(&cv);
result = isc_task_create(taskmgr, 0, &task);
result = isc_task_create(taskmgr, 0, &task, 0);
assert_int_equal(result, ISC_R_SUCCESS);
result = isc_task_onshutdown(task, pge_sde, NULL);
-204
View File
@@ -1,204 +0,0 @@
/*
* Copyright (C) Internet Systems Consortium, Inc. ("ISC")
*
* SPDX-License-Identifier: MPL-2.0
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, you can obtain one at https://mozilla.org/MPL/2.0/.
*
* See the COPYRIGHT file distributed with this work for additional
* information regarding copyright ownership.
*/
#if HAVE_CMOCKA
#include <sched.h> /* IWYU pragma: keep */
#include <setjmp.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define UNIT_TESTING
#include <cmocka.h>
#include <isc/task.h>
#include <isc/taskpool.h>
#include <isc/util.h>
#include "isctest.h"
#define TASK_MAGIC ISC_MAGIC('T', 'A', 'S', 'K')
#define VALID_TASK(t) ISC_MAGIC_VALID(t, TASK_MAGIC)
static int
_setup(void **state) {
isc_result_t result;
UNUSED(state);
result = isc_test_begin(NULL, true, 0);
assert_int_equal(result, ISC_R_SUCCESS);
return (0);
}
static int
_teardown(void **state) {
UNUSED(state);
isc_test_end();
return (0);
}
/* Create a taskpool */
static void
create_pool(void **state) {
isc_result_t result;
isc_taskpool_t *pool = NULL;
UNUSED(state);
result = isc_taskpool_create(taskmgr, test_mctx, 8, 2, false, &pool);
assert_int_equal(result, ISC_R_SUCCESS);
assert_int_equal(isc_taskpool_size(pool), 8);
isc_taskpool_destroy(&pool);
assert_null(pool);
}
/* Resize a taskpool */
static void
expand_pool(void **state) {
isc_result_t result;
isc_taskpool_t *pool1 = NULL, *pool2 = NULL, *hold = NULL;
UNUSED(state);
result = isc_taskpool_create(taskmgr, test_mctx, 10, 2, false, &pool1);
assert_int_equal(result, ISC_R_SUCCESS);
assert_int_equal(isc_taskpool_size(pool1), 10);
/* resizing to a smaller size should have no effect */
hold = pool1;
result = isc_taskpool_expand(&pool1, 5, false, &pool2);
assert_int_equal(result, ISC_R_SUCCESS);
assert_int_equal(isc_taskpool_size(pool2), 10);
assert_ptr_equal(pool2, hold);
assert_null(pool1);
pool1 = pool2;
pool2 = NULL;
/* resizing to the same size should have no effect */
hold = pool1;
result = isc_taskpool_expand(&pool1, 10, false, &pool2);
assert_int_equal(result, ISC_R_SUCCESS);
assert_int_equal(isc_taskpool_size(pool2), 10);
assert_ptr_equal(pool2, hold);
assert_null(pool1);
pool1 = pool2;
pool2 = NULL;
/* resizing to larger size should make a new pool */
hold = pool1;
result = isc_taskpool_expand(&pool1, 20, false, &pool2);
assert_int_equal(result, ISC_R_SUCCESS);
assert_int_equal(isc_taskpool_size(pool2), 20);
assert_ptr_not_equal(pool2, hold);
assert_null(pool1);
isc_taskpool_destroy(&pool2);
assert_null(pool2);
}
/* Get tasks */
static void
get_tasks(void **state) {
isc_result_t result;
isc_taskpool_t *pool = NULL;
isc_task_t *task1 = NULL, *task2 = NULL, *task3 = NULL;
UNUSED(state);
result = isc_taskpool_create(taskmgr, test_mctx, 2, 2, false, &pool);
assert_int_equal(result, ISC_R_SUCCESS);
assert_int_equal(isc_taskpool_size(pool), 2);
/* two tasks in pool; make sure we can access them more than twice */
isc_taskpool_gettask(pool, &task1);
assert_true(VALID_TASK(task1));
isc_taskpool_gettask(pool, &task2);
assert_true(VALID_TASK(task2));
isc_taskpool_gettask(pool, &task3);
assert_true(VALID_TASK(task3));
isc_task_destroy(&task1);
isc_task_destroy(&task2);
isc_task_destroy(&task3);
isc_taskpool_destroy(&pool);
assert_null(pool);
}
/* Set privileges */
static void
set_privilege(void **state) {
isc_result_t result;
isc_taskpool_t *pool = NULL;
isc_task_t *task1 = NULL, *task2 = NULL, *task3 = NULL;
UNUSED(state);
result = isc_taskpool_create(taskmgr, test_mctx, 2, 2, true, &pool);
assert_int_equal(result, ISC_R_SUCCESS);
assert_int_equal(isc_taskpool_size(pool), 2);
isc_taskpool_gettask(pool, &task1);
isc_taskpool_gettask(pool, &task2);
isc_taskpool_gettask(pool, &task3);
assert_true(VALID_TASK(task1));
assert_true(VALID_TASK(task2));
assert_true(VALID_TASK(task3));
assert_true(isc_task_getprivilege(task1));
assert_true(isc_task_getprivilege(task2));
assert_true(isc_task_getprivilege(task3));
isc_task_destroy(&task1);
isc_task_destroy(&task2);
isc_task_destroy(&task3);
isc_taskpool_destroy(&pool);
assert_null(pool);
}
int
main(void) {
const struct CMUnitTest tests[] = {
cmocka_unit_test_setup_teardown(create_pool, _setup, _teardown),
cmocka_unit_test_setup_teardown(expand_pool, _setup, _teardown),
cmocka_unit_test_setup_teardown(get_tasks, _setup, _teardown),
cmocka_unit_test_setup_teardown(set_privilege, _setup,
_teardown),
};
return (cmocka_run_group_tests(tests, NULL, NULL));
}
#else /* HAVE_CMOCKA */
#include <stdio.h>
int
main(void) {
printf("1..0 # Skipped: cmocka not available\n");
return (SKIPPED_TEST_EXIT_CODE);
}
#endif /* if HAVE_CMOCKA */
+3 -3
View File
@@ -118,7 +118,7 @@ setup_test(isc_timertype_t timertype, isc_interval_t *interval,
LOCK(&mx);
result = isc_task_create(taskmgr, 0, &task);
result = isc_task_create(taskmgr, 0, &task, 0);
assert_int_equal(result, ISC_R_SUCCESS);
result = isc_task_onshutdown(task, shutdown, NULL);
@@ -508,13 +508,13 @@ purge(void **state) {
seconds = 1;
nanoseconds = 0;
result = isc_task_create(taskmgr, 0, &task1);
result = isc_task_create(taskmgr, 0, &task1, 0);
assert_int_equal(result, ISC_R_SUCCESS);
result = isc_task_onshutdown(task1, shutdown_purge, NULL);
assert_int_equal(result, ISC_R_SUCCESS);
result = isc_task_create(taskmgr, 0, &task2);
result = isc_task_create(taskmgr, 0, &task2, 0);
assert_int_equal(result, ISC_R_SUCCESS);
isc_interval_set(&interval, seconds, 0);
+1 -1
View File
@@ -2476,7 +2476,7 @@ ns_clientmgr_create(ns_server_t *sctx, isc_taskmgr_t *taskmgr,
dns_aclenv_attach(aclenv, &manager->aclenv);
manager->exiting = false;
result = isc_task_create_bound(manager->taskmgr, 20, &manager->task,
result = isc_task_create(manager->taskmgr, 20, &manager->task,
manager->tid);
RUNTIME_CHECK(result == ISC_R_SUCCESS);
isc_task_setname(manager->task, "clientmgr", NULL);
+12 -14
View File
@@ -54,12 +54,6 @@
#define LISTENING(ifp) (((ifp)->flags & NS_INTERFACEFLAG_LISTENING) != 0)
#ifdef TUNE_LARGE
#define UDPBUFFERS 32768
#else /* ifdef TUNE_LARGE */
#define UDPBUFFERS 1000
#endif /* TUNE_LARGE */
#define IFMGR_MAGIC ISC_MAGIC('I', 'F', 'M', 'G')
#define NS_INTERFACEMGR_VALID(t) ISC_MAGIC_VALID(t, IFMGR_MAGIC)
@@ -513,8 +507,9 @@ ns_interface_listenudp(ns_interface_t *ifp) {
isc_result_t result;
/* Reserve space for an ns_client_t with the netmgr handle */
result = isc_nm_listenudp(ifp->mgr->nm, &ifp->addr, ns__client_request,
ifp, sizeof(ns_client_t),
result = isc_nm_listenudp(ifp->mgr->nm,
isc_nm_getnworkers(ifp->mgr->nm), &ifp->addr,
ns__client_request, ifp, sizeof(ns_client_t),
&ifp->udplistensocket);
return (result);
}
@@ -524,8 +519,9 @@ ns_interface_listentcp(ns_interface_t *ifp) {
isc_result_t result;
result = isc_nm_listentcpdns(
ifp->mgr->nm, &ifp->addr, ns__client_request, ifp,
ns__client_tcpconn, ifp, sizeof(ns_client_t), ifp->mgr->backlog,
ifp->mgr->nm, isc_nm_getnworkers(ifp->mgr->nm), &ifp->addr,
ns__client_request, ifp, ns__client_tcpconn, ifp,
sizeof(ns_client_t), ifp->mgr->backlog,
&ifp->mgr->sctx->tcpquota, &ifp->tcplistensocket);
if (result != ISC_R_SUCCESS) {
isc_log_write(IFMGR_COMMON_LOGARGS, ISC_LOG_ERROR,
@@ -564,8 +560,9 @@ ns_interface_listentls(ns_interface_t *ifp, isc_tlsctx_t *sslctx) {
isc_result_t result;
result = isc_nm_listentlsdns(
ifp->mgr->nm, &ifp->addr, ns__client_request, ifp,
ns__client_tcpconn, ifp, sizeof(ns_client_t), ifp->mgr->backlog,
ifp->mgr->nm, isc_nm_getnworkers(ifp->mgr->nm), &ifp->addr,
ns__client_request, ifp, ns__client_tcpconn, ifp,
sizeof(ns_client_t), ifp->mgr->backlog,
&ifp->mgr->sctx->tcpquota, sslctx, &ifp->tcplistensocket);
if (result != ISC_R_SUCCESS) {
@@ -612,8 +609,9 @@ ns_interface_listenhttp(ns_interface_t *ifp, isc_tlsctx_t *sslctx, char **eps,
if (result == ISC_R_SUCCESS) {
result = isc_nm_listenhttp(
ifp->mgr->nm, &ifp->addr, ifp->mgr->backlog, quota,
sslctx, epset, max_concurrent_streams, &sock);
ifp->mgr->nm, isc_nm_getnworkers(ifp->mgr->nm),
&ifp->addr, ifp->mgr->backlog, quota, sslctx, epset,
max_concurrent_streams, &sock);
}
isc_nm_http_endpoints_detach(&epset);
+3 -8
View File
@@ -226,7 +226,7 @@ create_managers(void) {
int ncpus = isc_os_ncpus();
isc_managers_create(mctx, ncpus, 0, &netmgr, &taskmgr, &timermgr);
CHECK(isc_task_create_bound(taskmgr, 0, &maintask, 0));
CHECK(isc_task_create(taskmgr, 0, &maintask, 0));
isc_taskmgr_setexcltask(taskmgr, maintask);
CHECK(isc_task_onshutdown(maintask, shutdown_managers, NULL));
@@ -413,7 +413,7 @@ ns_test_makezone(const char *name, dns_zone_t **zonep, dns_view_t *view,
zone = *zonep;
if (zone == NULL) {
CHECK(dns_zone_create(&zone, mctx));
CHECK(dns_zone_create(&zone, mctx, 0));
}
isc_buffer_constinit(&buffer, name, strlen(name));
@@ -449,7 +449,7 @@ ns_test_setupzonemgr(void) {
isc_result_t result;
REQUIRE(zonemgr == NULL);
result = dns_zonemgr_create(mctx, taskmgr, timermgr, NULL, &zonemgr);
result = dns_zonemgr_create(mctx, taskmgr, timermgr, netmgr, &zonemgr);
return (result);
}
@@ -458,11 +458,6 @@ ns_test_managezone(dns_zone_t *zone) {
isc_result_t result;
REQUIRE(zonemgr != NULL);
result = dns_zonemgr_setsize(zonemgr, 1);
if (result != ISC_R_SUCCESS) {
return (result);
}
result = dns_zonemgr_managezone(zonemgr, zone);
return (result);
}
-1
View File
@@ -19,7 +19,6 @@
#include <isc/serial.h>
#include <isc/stats.h>
#include <isc/string.h>
#include <isc/taskpool.h>
#include <isc/util.h>
#include <dns/db.h>