Compare commits
21
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5f937ddc1d | ||
|
|
8c6b0bf1b6 | ||
|
|
65f2a80791 | ||
|
|
2cb9116a7e | ||
|
|
c3092672d6 | ||
|
|
6854c1e017 | ||
|
|
1131c8e18c | ||
|
|
07c7186ddc | ||
|
|
863e87c5a2 | ||
|
|
a544ccef2b | ||
|
|
1cbf526c45 | ||
|
|
95edc4bf94 | ||
|
|
f438b6e70f | ||
|
|
6f0e3d46c9 | ||
|
|
55a75a4532 | ||
|
|
d21bf53329 | ||
|
|
af2f49db64 | ||
|
|
d06d697c47 | ||
|
|
343d42c792 | ||
|
|
729d61cbaa | ||
|
|
05e50f7b86 |
@@ -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
@@ -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
@@ -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");
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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
@@ -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;
|
||||
|
||||
@@ -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
@@ -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);
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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
@@ -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);
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
@@ -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:
|
||||
*
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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("a);
|
||||
@@ -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
@@ -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("a);
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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("a);
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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);
|
||||
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
@@ -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
@@ -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);
|
||||
|
||||
|
||||
@@ -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
@@ -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);
|
||||
|
||||
@@ -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
@@ -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);
|
||||
|
||||
@@ -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 */
|
||||
@@ -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
@@ -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
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user