Lines Matching defs:worker

2  * daemon/worker.c - worker that handles a pending list of requests.
39 * This file implements the worker that handles callbacks on events, for
46 #include "daemon/worker.h"
117 worker_mem_report(struct worker* ATTR_UNUSED(worker),
132 front = listen_get_mem(worker->front);
133 back = outnet_get_mem(worker->back);
134 msg = slabhash_get_mem(worker->env.msg_cache);
135 rrset = slabhash_get_mem(&worker->env.rrset_cache->table);
136 infra = infra_get_mem(worker->env.infra_cache);
137 mesh = mesh_get_mem(worker->env.mesh);
138 ac = alloc_get_mem(worker->alloc);
139 superac = alloc_get_mem(&worker->daemon->superalloc);
140 anch = anchors_get_mem(worker->env.anchors);
143 for(i=0; i<worker->env.mesh->mods.num; i++) {
144 fptr_ok(fptr_whitelist_mod_get_mem(worker->env.mesh->
146 if(strcmp(worker->env.mesh->mods.mod[i]->name, "validator")==0)
147 val += (*worker->env.mesh->mods.mod[i]->get_mem)
148 (&worker->env, i);
150 else if(strcmp(worker->env.mesh->mods.mod[i]->name,
152 subnet += (*worker->env.mesh->mods.mod[i]->get_mem)
153 (&worker->env, i);
155 else iter += (*worker->env.mesh->mods.mod[i]->get_mem)
156 (&worker->env, i);
158 me = sizeof(*worker) + sizeof(*worker->base) + sizeof(*worker->comsig)
159 + comm_point_get_mem(worker->cmd_com)
160 + sizeof(worker->rndstate)
161 + regional_get_mem(worker->scratchpad)
162 + sizeof(*worker->env.scratch_buffer)
163 + sldns_buffer_capacity(worker->env.scratch_buffer);
164 if(worker->daemon->env->fwds)
165 log_info("forwards=%u", (unsigned)forwards_get_mem(worker->env.fwds));
166 if(worker->daemon->env->hints)
167 log_info("hints=%u", (unsigned)hints_get_mem(worker->env.hints));
168 if(worker->thread_num == 0)
169 me += acl_list_get_mem(worker->daemon->acl);
204 for(i=0; i<worker->env.mesh->mods.num; i++) {
205 fptr_ok(fptr_whitelist_mod_get_mem(worker->env.mesh->
207 if(strcmp(worker->env.mesh->mods.mod[i]->name, "validator")==0)
208 val += (*worker->env.mesh->mods.mod[i]->get_mem)
209 (&worker->env, i);
211 else if(strcmp(worker->env.mesh->mods.mod[i]->name,
213 subnet += (*worker->env.mesh->mods.mod[i]->get_mem)
214 (&worker->env, i);
220 (unsigned)slabhash_get_mem(worker->env.msg_cache),
221 (unsigned)slabhash_get_mem(&worker->env.rrset_cache->table),
222 (unsigned)infra_get_mem(worker->env.infra_cache),
226 (unsigned)slabhash_get_mem(worker->env.msg_cache),
227 (unsigned)slabhash_get_mem(&worker->env.rrset_cache->table),
228 (unsigned)infra_get_mem(worker->env.infra_cache),
235 worker_send_cmd(struct worker* worker, enum worker_commands cmd)
238 if(!tube_write_msg(worker->cmd, (uint8_t*)&c, sizeof(c), 0)) {
239 log_err("worker send cmd %d failed", (int)cmd);
248 struct worker* worker = e->qstate->env->worker;
251 verbose(VERB_ALGO, "worker svcd callback for qstate %p", e->qstate);
253 mesh_report_reply(worker->env.mesh, e, reply_info, error);
254 worker_mem_report(worker, sq);
264 verbose(VERB_ALGO, "worker: bad reply handled as timeout");
265 mesh_report_reply(worker->env.mesh, e, reply_info,
267 worker_mem_report(worker, sq);
270 mesh_report_reply(worker->env.mesh, e, reply_info, NETEVENT_NOERROR);
271 worker_mem_report(worker, sq);
276 * @param worker: the worker struct with ratelimit counter
281 worker_err_ratelimit(struct worker* worker, int err)
283 if(worker->err_limit_time == *worker->env.now) {
285 if(worker->err_limit_count++ > ERROR_RATELIMIT)
289 worker->err_limit_time = *worker->env.now;
290 worker->err_limit_count = 1;
306 * @param worker: parameters for checking.
310 worker_check_request(sldns_buffer* pkt, struct worker* worker,
321 worker->daemon->cfg->harden_large_queries) {
334 out->value = worker_err_ratelimit(worker, LDNS_RCODE_FORMERR);
341 out->value = worker_err_ratelimit(worker, LDNS_RCODE_NOTIMPL);
347 out->value = worker_err_ratelimit(worker, LDNS_RCODE_FORMERR);
355 out->value = worker_err_ratelimit(worker, LDNS_RCODE_FORMERR);
361 out->value = worker_err_ratelimit(worker, LDNS_RCODE_FORMERR);
367 out->value = worker_err_ratelimit(worker, LDNS_RCODE_FORMERR);
378 struct worker* worker = (struct worker*)arg;
383 comm_base_exit(worker->base);
395 comm_base_exit(worker->base);
399 server_stats_reply(worker, 1);
403 server_stats_reply(worker, 0);
407 daemon_remote_exec(worker);
465 answer_norec_from_cache(struct worker* worker, struct query_info* qinfo,
480 time_t timenow = *worker->env.now;
482 int must_validate = (!has_cd_bit || worker->env.cfg->ignore_cd)
483 && worker->env.need_to_validate;
487 dp = dns_cache_find_delegation(&worker->env, qinfo->qname,
489 worker->scratchpad, &msg, timenow, 0, NULL, 0);
510 if(!inplace_cb_reply_servfail_call(&worker->env, qinfo, NULL,
511 msg->rep, LDNS_RCODE_SERVFAIL, edns, repinfo, worker->scratchpad,
512 worker->env.now_tv))
515 if(worker->env.cfg->ede &&
518 worker->scratchpad, msg->rep->reason_bogus,
523 if(worker->stats.extended) {
524 worker->stats.ans_bogus++;
525 worker->stats.ans_rcode[LDNS_RCODE_SERVFAIL]++;
531 if(worker->env.cfg->val_clean_additional)
548 if(worker->env.cfg->disable_edns_do && (edns->bits & EDNS_DO))
550 if(!inplace_cb_reply_cache_call(&worker->env, qinfo, NULL, msg->rep,
551 (int)(flags&LDNS_RCODE_MASK), edns, repinfo, worker->scratchpad,
552 worker->env.now_tv))
557 if(worker->env.cfg->ede && has_cd_bit &&
562 worker->scratchpad, msg->rep->reason_bogus,
566 repinfo->c->buffer, 0, 1, worker->scratchpad,
568 if(!inplace_cb_reply_servfail_call(&worker->env, qinfo, NULL, NULL,
569 LDNS_RCODE_SERVFAIL, edns, repinfo, worker->scratchpad,
570 worker->env.now_tv))
575 if(worker->stats.extended) {
576 if(secure) worker->stats.ans_secure++;
577 server_stats_insrcode(&worker->stats, repinfo->c->buffer);
588 apply_respip_action(struct worker* worker, const struct query_info* qinfo,
603 alias_rrset, 0, worker->scratchpad, az, NULL))
621 if(worker->stats.extended && actinfo.rpz_used) {
623 worker->stats.rpz_action[RPZ_DISABLED_ACTION]++;
625 worker->stats.rpz_action[RPZ_CNAME_OVERRIDE_ACTION]++;
627 worker->stats.rpz_action[
644 answer_from_cache(struct worker* worker, struct query_info* qinfo,
651 time_t timenow = *worker->env.now;
656 int must_validate = (!has_cd_bit || worker->env.cfg->ignore_cd)
657 && worker->env.need_to_validate;
663 if(worker->env.cfg->serve_expired &&
668 (!worker->env.cfg->serve_expired_client_timeout ||
671 && !(worker->env.cachedb_enabled &&
672 worker->env.cfg->cachedb_check_when_serve_expired)
711 if(worker->env.cfg->disable_edns_do && (edns->bits & EDNS_DO))
713 if(!inplace_cb_reply_servfail_call(&worker->env, qinfo, NULL, rep,
714 LDNS_RCODE_SERVFAIL, edns, repinfo, worker->scratchpad,
715 worker->env.now_tv))
718 if(worker->env.cfg->ede && rep->reason_bogus != LDNS_EDE_NONE) {
720 worker->scratchpad, rep->reason_bogus,
725 rrset_array_unlock_touch(worker->env.rrset_cache,
726 worker->scratchpad, rep->ref, rep->rrset_count);
727 if(worker->stats.extended) {
728 worker->stats.ans_bogus ++;
729 worker->stats.ans_rcode[LDNS_RCODE_SERVFAIL] ++;
753 if(worker->env.cfg->disable_edns_do && (edns->bits & EDNS_DO))
756 if((worker->daemon->use_response_ip || worker->daemon->use_rpz) &&
757 !partial_rep && !apply_respip_action(worker, qinfo, cinfo, rep,
759 &encode_rep, worker->env.auth_zones)) {
763 must_validate, &encode_rep, worker->scratchpad,
764 worker->env.auth_zones)) {
779 worker->scratchpad);
785 worker->env.cfg->ede_serve_expired && worker->env.cfg->ede) {
787 worker->scratchpad, LDNS_EDE_STALE_ANSWER, "");
792 worker->env.cfg->ede && has_cd_bit &&
795 worker->scratchpad, encode_rep->reason_bogus,
798 if(!inplace_cb_reply_cache_call(&worker->env, qinfo, NULL, encode_rep,
799 (int)(flags&LDNS_RCODE_MASK), edns, repinfo, worker->scratchpad,
800 worker->env.now_tv))
803 repinfo->c->buffer, timenow, 1, worker->scratchpad,
806 if(!inplace_cb_reply_servfail_call(&worker->env, qinfo,
808 worker->scratchpad, worker->env.now_tv))
816 rrset_array_unlock_touch(worker->env.rrset_cache, worker->scratchpad,
822 rrset_array_unlock_touch(worker->env.rrset_cache,
823 worker->scratchpad, rep->ref, rep->rrset_count);
829 reply_and_prefetch(struct worker* worker, struct query_info* qinfo,
844 server_stats_prefetch(&worker->stats, worker);
849 if(modstack_find(&worker->env.mesh->mods, "subnetcache") != -1
850 && worker->env.unique_mesh) {
851 mesh_new_prefetch(worker->env.mesh, qinfo, flags, leeway +
861 mesh_new_prefetch(worker->env.mesh, qinfo, flags, leeway +
872 * @param worker: worker with scratch region.
877 struct worker* worker, struct comm_reply* repinfo)
886 if(!inplace_cb_reply_local_call(&worker->env, NULL, NULL, NULL,
887 LDNS_RCODE_NOERROR, edns, repinfo, worker->scratchpad,
888 worker->env.now_tv))
928 struct worker* worker, struct comm_reply* repinfo)
930 chaos_replystr(pkt, (char**)&str, 1, edns, worker, repinfo);
937 * @param w: worker with scratch region.
941 chaos_trustanchor(sldns_buffer* pkt, struct edns_data* edns, struct worker* w,
993 * @param w: worker
1001 answer_chaos(struct worker* w, struct query_info* qinfo,
1055 * @param w: worker
1063 answer_notify(struct worker* w, struct query_info* qinfo,
1115 struct worker* worker, struct comm_reply* repinfo,
1126 if(worker->stats.extended)
1127 worker->stats.unwanted_queries++;
1138 if(worker->stats.extended)
1139 worker->stats.unwanted_queries++;
1140 worker_check_request(c->buffer, worker, check_result);
1303 struct worker* worker, struct comm_reply* repinfo,
1308 *acladdr = acl_addr_lookup(worker->daemon->acl,
1311 *acladdr = acl_addr_lookup(worker->daemon->acl,
1319 return deny_refuse(c, *acl, acl_deny, acl_refuse, worker, repinfo,
1325 struct worker* worker, struct comm_reply* repinfo,
1330 worker, repinfo, acladdr, ede, check_result);
1336 check_ip_ratelimit(struct worker* worker, struct sockaddr_storage* addr,
1339 if(!infra_ip_ratelimit_inc(worker->env.infra_cache, addr, addrlen,
1340 *worker->env.now, has_cookie,
1341 worker->env.cfg->ip_ratelimit_backoff, pkt)) {
1343 if(!has_cookie && worker->env.cfg->ip_ratelimit_factor != 0 &&
1344 ub_random_max(worker->env.rnd,
1345 worker->env.cfg->ip_ratelimit_factor) == 0) {
1362 struct worker* worker = (struct worker*)arg;
1396 if (worker->env.cfg->sock_queue_timeout && timeval_isset(&c->recv_tv)) {
1397 timeval_subtract(&wait_time, worker->env.now_tv, &c->recv_tv);
1399 if (worker->stats.max_query_time_us < wait_queue_time)
1400 worker->stats.max_query_time_us = wait_queue_time;
1402 (long long)(worker->env.cfg->sock_queue_timeout * 1000000)) {
1404 worker->stats.num_queries_timed_out++;
1410 repinfo->max_udp_size = worker->daemon->cfg->max_udp_size;
1411 if(!dnsc_handle_curved_request(worker->daemon->dnscenv, repinfo)) {
1412 worker->stats.num_query_dnscrypt_crypted_malformed++;
1418 worker_check_request(c->buffer, worker, &check_result);
1421 "dnscrypt: worker check request: bad query.");
1429 "dnscrypt: worker parse request: formerror.");
1438 worker->daemon->dnscenv->provider_name) == 0)) {
1441 worker->daemon->dnscenv->provider_name,
1445 worker->stats.num_query_dnscrypt_cleartext++;
1448 worker->stats.num_query_dnscrypt_cert++;
1451 worker->stats.num_query_dnscrypt_crypted++;
1458 if(worker->dtenv.log_client_query_messages) {
1461 dt_msg_send_client_query(&worker->dtenv, &repinfo->client_addr, (void*)repinfo->c->socket->addr, c->type, c->ssl, c->buffer,
1462 ((worker->env.cfg->sock_queue_timeout && timeval_isset(&c->recv_tv))?&c->recv_tv:NULL));
1467 if((ret=deny_refuse_all(c, &acl, worker, repinfo, &acladdr,
1468 worker->env.cfg->ede, 1, &check_result)) != -1) {
1474 if((ret=deny_refuse_all(c, &acl, worker, repinfo, &acladdr,
1475 worker->env.cfg->ede, 0, &check_result)) != -1) {
1481 worker_check_request(c->buffer, worker, &check_result);
1483 verbose(VERB_ALGO, "worker check request: bad query.");
1495 worker->stats.num_queries++;
1496 pre_edns_ip_ratelimit = !worker->env.cfg->do_answer_cookie
1505 if(!check_ip_ratelimit(worker, &repinfo->client_addr,
1507 worker->stats.num_queries_ip_ratelimited++;
1514 verbose(VERB_ALGO, "worker parse request: formerror.");
1518 if(worker_err_ratelimit(worker, LDNS_RCODE_FORMERR) == -1) {
1528 if(worker->env.cfg->log_queries) {
1535 verbose(VERB_ALGO, "worker request: refused zone transfer.");
1542 if(worker->stats.extended) {
1543 worker->stats.qtype[qinfo.qtype]++;
1553 verbose(VERB_ALGO, "worker request: formerror for meta-type.");
1556 if(worker_err_ratelimit(worker, LDNS_RCODE_FORMERR) == -1) {
1564 if(worker->stats.extended) {
1565 worker->stats.qtype[qinfo.qtype]++;
1570 c->buffer, &edns, worker->env.cfg, c, repinfo,
1571 (worker->env.now ? *worker->env.now : time(NULL)),
1572 worker->scratchpad,
1573 worker->daemon->cookie_secrets)) != 0) {
1575 verbose(VERB_ALGO, "worker parse edns: formerror.");
1583 regional_free_all(worker->scratchpad);
1597 regional_free_all(worker->scratchpad);
1601 worker->daemon->cfg->harden_short_bufsize) {
1602 verbose(VERB_QUERY, "worker request: EDNS bufsize %d ignored",
1611 server_stats_downstream_cookie(&worker->stats, &edns);
1617 if(!check_ip_ratelimit(worker, &repinfo->client_addr,
1620 worker->stats.num_queries_ip_ratelimited++;
1644 regional_free_all(worker->scratchpad);
1648 verbose(VERB_ALGO, "worker request: "
1653 worker->scratchpad, LDNS_EDE_OTHER,
1661 regional_free_all(worker->scratchpad);
1665 if(edns.udp_size > worker->daemon->cfg->max_udp_size &&
1668 "worker request: max UDP reply size modified"
1672 edns.udp_size = worker->daemon->cfg->max_udp_size;
1675 verbose(VERB_ALGO, "worker request: edns is too small.");
1686 regional_free_all(worker->scratchpad);
1689 if(worker->stats.extended)
1690 server_stats_insquery(&worker->stats, c, qinfo.qtype,
1694 if(qinfo.qclass == LDNS_RR_CLASS_CH && answer_chaos(worker, &qinfo,
1696 regional_free_all(worker->scratchpad);
1701 answer_notify(worker, &qinfo, &edns, c->buffer,
1703 regional_free_all(worker->scratchpad);
1706 if(local_zones_answer(worker->daemon->local_zones, &worker->env, &qinfo,
1707 &edns, c->buffer, worker->scratchpad, repinfo, acladdr->taglist,
1710 acladdr->tag_datas_size, worker->daemon->cfg->tagname,
1711 worker->daemon->cfg->num_tags, acladdr->view)) {
1712 regional_free_all(worker->scratchpad);
1719 if(worker->env.auth_zones &&
1720 rpz_callback_from_worker_request(worker->env.auth_zones,
1721 &worker->env, &qinfo, &edns, c->buffer, worker->scratchpad,
1722 repinfo, acladdr->taglist, acladdr->taglen, &worker->stats,
1724 regional_free_all(worker->scratchpad);
1731 if(worker->env.auth_zones &&
1732 auth_zones_answer(worker->env.auth_zones, &worker->env,
1733 &qinfo, &edns, repinfo, c->buffer, worker->scratchpad)) {
1734 regional_free_all(worker->scratchpad);
1749 if((ret=deny_refuse_non_local(c, acl, worker, repinfo, acladdr,
1750 worker->env.cfg->ede, &check_result)) != -1)
1752 regional_free_all(worker->scratchpad);
1769 if(worker->env.cfg->ede) {
1771 worker->scratchpad, LDNS_EDE_NOT_AUTHORITATIVE, "");
1776 regional_free_all(worker->scratchpad);
1795 regional_free_all(worker->scratchpad);
1805 if((worker->daemon->use_response_ip || worker->daemon->use_rpz) &&
1816 cinfo_tmp.respip_set = worker->daemon->respip_set;
1830 if(!edns_bypass_cache_stage(edns.opt_list_in, &worker->env)) {
1834 if((e=slabhash_lookup(worker->env.msg_cache, h, lookup_qinfo, 0))) {
1837 if(answer_from_cache(worker, &qinfo, cinfo, &need_drop,
1847 if((worker->env.cfg->prefetch &&
1848 *worker->env.now >= rep->prefetch_ttl) ||
1849 (worker->env.cfg->serve_expired &&
1850 *worker->env.now > rep->ttl)) {
1852 time_t leeway = rep->ttl - *worker->env.now;
1853 if(rep->ttl < *worker->env.now)
1857 reply_and_prefetch(worker, lookup_qinfo,
1865 regional_free_all(worker->scratchpad);
1870 regional_free_all(worker->scratchpad);
1888 regional_free_all(worker->scratchpad);
1901 if(answer_norec_from_cache(worker, &qinfo,
1905 regional_free_all(worker->scratchpad);
1913 server_stats_querymiss(&worker->stats, worker);
1924 mesh_new_client(worker->env.mesh, &qinfo, cinfo,
1928 regional_free_all(worker->scratchpad);
1929 worker_mem_report(worker, NULL);
1940 worker->stats.ans_expired++;
1942 server_stats_insrcode(&worker->stats, c->buffer);
1943 if(worker->stats.extended) {
1944 if(is_secure_answer) worker->stats.ans_secure++;
1950 if(worker->dtenv.log_client_response_messages && rc !=0) {
1953 dt_msg_send_client_response(&worker->dtenv, &repinfo->client_addr, (void*)repinfo->c->socket->addr, c->type, c->ssl, c->buffer);
1956 if(worker->env.cfg->log_replies)
1968 (worker->env.cfg->log_destaddr?(void*)repinfo->c->socket->addr:NULL),
1974 (worker->env.cfg->log_destaddr?(void*)repinfo->c->socket->addr:NULL),
1991 struct worker* worker = (struct worker*)arg;
1995 comm_base_exit(worker->base);
2002 worker->need_to_exit = 1;
2003 comm_base_exit(worker->base);
2007 worker->need_to_exit = 1;
2008 comm_base_exit(worker->base);
2012 worker->need_to_exit = 1;
2013 comm_base_exit(worker->base);
2021 /** restart statistics timer for worker, if enabled */
2023 worker_restart_timer(struct worker* worker)
2025 if(worker->env.cfg->stat_interval > 0) {
2028 tv.tv_sec = worker->env.cfg->stat_interval;
2031 comm_timer_set(worker->stat_timer, &tv);
2037 struct worker* worker = (struct worker*)arg;
2038 server_stats_log(&worker->stats, worker, worker->thread_num);
2039 mesh_stats(worker->env.mesh, "mesh has");
2040 worker_mem_report(worker, NULL);
2042 if (worker->daemon->cfg->shm_enable) {
2043 shm_main_run(worker);
2045 if(!worker->daemon->cfg->stat_cumulative) {
2046 worker_stats_clear(worker);
2049 worker_restart_timer(worker);
2054 struct worker* worker = (struct worker*)arg;
2057 tv.tv_sec = (time_t)autr_probe_timer(&worker->env);
2061 comm_timer_set(worker->env.probe_timer, &tv);
2064 struct worker*
2068 struct worker* worker = (struct worker*)calloc(1,
2069 sizeof(struct worker));
2070 if(!worker)
2072 worker->numports = n;
2073 worker->ports = (int*)memdup(ports, sizeof(int)*n);
2074 if(!worker->ports) {
2075 free(worker);
2078 worker->daemon = daemon;
2079 worker->thread_num = id;
2080 if(!(worker->cmd = tube_create())) {
2081 free(worker->ports);
2082 free(worker);
2086 if(!(worker->rndstate = ub_initstate(daemon->rand))) {
2088 tube_delete(worker->cmd);
2089 free(worker->ports);
2090 free(worker);
2094 return worker;
2098 worker_init(struct worker* worker, struct config_file *cfg,
2102 struct dt_env* dtenv = &worker->dtenv;
2107 worker->thread_tid = gettid();
2109 worker->need_to_exit = 0;
2110 worker->base = comm_base_create(do_sigs);
2111 if(!worker->base) {
2113 worker_delete(worker);
2116 comm_base_set_slow_accept_handlers(worker->base, &worker_stop_accept,
2117 &worker_start_accept, worker);
2131 worker->comsig = comm_signal_create(worker->base,
2132 worker_sighandler, worker);
2133 if(!worker->comsig
2135 || !comm_signal_bind(worker->comsig, SIGHUP)
2138 || !comm_signal_bind(worker->comsig, SIGQUIT)
2140 || !comm_signal_bind(worker->comsig, SIGTERM)
2142 || !comm_signal_bind(worker->comsig, SIGBREAK)
2144 || !comm_signal_bind(worker->comsig, SIGINT)) {
2146 worker_delete(worker);
2150 if(!daemon_remote_open_accept(worker->daemon->rc,
2151 worker->daemon->rc_ports, worker)) {
2152 worker_delete(worker);
2156 wsvc_setup_worker(worker);
2159 worker->comsig = NULL;
2163 log_assert(worker->daemon->dtenv != NULL);
2164 memcpy(&worker->dtenv, worker->daemon->dtenv, sizeof(struct dt_env));
2165 if(!dt_init(&worker->dtenv, worker->base))
2169 worker->front = listen_create(worker->base, ports,
2176 worker->daemon->tcl, worker->daemon->listen_sslctx,
2177 dtenv, worker->daemon->doq_table, worker->env.rnd,
2179 worker_handle_request, worker);
2180 if(!worker->front) {
2182 worker_delete(worker);
2185 worker->back = outside_network_create(worker->base,
2189 worker->daemon->env->infra_cache, worker->rndstate,
2190 cfg->use_caps_bits_for_id, worker->ports, worker->numports,
2192 &worker_alloc_cleanup, worker,
2194 worker->daemon->connect_sslctx, cfg->delay_close,
2198 if(!worker->back) {
2200 worker_delete(worker);
2203 iterator_set_ip46_support(&worker->daemon->mods, worker->daemon->env,
2204 worker->back);
2206 if(!tube_setup_bg_listen(worker->cmd, worker->base,
2207 &worker_handle_control_cmd, worker)) {
2209 worker_delete(worker);
2212 worker->stat_timer = comm_timer_create(worker->base,
2213 worker_stat_timer_cb, worker);
2214 if(!worker->stat_timer) {
2220 worker->scratchpad = regional_create_custom(cfg->msg_buffer_size);
2221 if(!worker->scratchpad) {
2223 worker_delete(worker);
2227 server_stats_init(&worker->stats, cfg);
2228 worker->alloc = worker->daemon->worker_allocs[worker->thread_num];
2229 alloc_set_id_cleanup(worker->alloc, &worker_alloc_cleanup, worker);
2230 worker->env = *worker->daemon->env;
2231 comm_base_timept(worker->base, &worker->env.now, &worker->env.now_tv);
2232 worker->env.worker = worker;
2233 worker->env.worker_base = worker->base;
2234 worker->env.send_query = &worker_send_query;
2235 worker->env.alloc = worker->alloc;
2236 worker->env.outnet = worker->back;
2237 worker->env.rnd = worker->rndstate;
2241 * sharing it with worker's own scratchpad at the cost of having
2242 * one more pad per worker. */
2243 worker->env.scratch = regional_create_custom(cfg->msg_buffer_size);
2244 if(!worker->env.scratch) {
2246 worker_delete(worker);
2249 worker->env.mesh = mesh_create(&worker->daemon->mods, &worker->env);
2250 if(!worker->env.mesh) {
2252 worker_delete(worker);
2256 worker->env.mesh->use_response_ip = worker->daemon->use_response_ip;
2257 worker->env.mesh->use_rpz = worker->daemon->use_rpz;
2259 worker->env.detach_subs = &mesh_detach_subs;
2260 worker->env.attach_sub = &mesh_attach_sub;
2261 worker->env.add_sub = &mesh_add_sub;
2262 worker->env.kill_sub = &mesh_state_delete;
2263 worker->env.detect_cycle = &mesh_detect_cycle;
2264 worker->env.scratch_buffer = sldns_buffer_new(cfg->msg_buffer_size);
2265 if(!worker->env.scratch_buffer) {
2267 worker_delete(worker);
2271 if(autr_get_num_anchors(worker->env.anchors) > 0
2273 && worker->thread_num == 0
2279 worker->env.probe_timer = comm_timer_create(worker->base,
2280 worker_probe_timer_cb, worker);
2281 if(!worker->env.probe_timer) {
2285 comm_timer_set(worker->env.probe_timer, &tv);
2289 if(worker->env.auth_zones
2291 && worker->thread_num == 0
2294 auth_xfer_pickup_initial(worker->env.auth_zones, &worker->env);
2295 auth_zones_pickup_zonemd_verify(worker->env.auth_zones,
2296 &worker->env);
2299 if(worker->daemon->cfg->dnstap
2301 && worker->thread_num == 0
2305 worker->base), worker->daemon->num)) {
2307 worker_delete(worker);
2312 worker_mem_report(worker, NULL);
2314 if(worker->env.cfg->stat_interval > 0) {
2316 worker->env.cfg->stat_interval);
2317 worker_restart_timer(worker);
2324 worker_work(struct worker* worker)
2326 comm_base_dispatch(worker->base);
2330 worker_delete(struct worker* worker)
2332 if(!worker)
2334 if(worker->env.mesh && verbosity >= VERB_OPS) {
2335 server_stats_log(&worker->stats, worker, worker->thread_num);
2336 mesh_stats(worker->env.mesh, "mesh has");
2337 worker_mem_report(worker, NULL);
2339 outside_network_quit_prepare(worker->back);
2340 mesh_delete(worker->env.mesh);
2341 sldns_buffer_free(worker->env.scratch_buffer);
2342 listen_delete(worker->front);
2343 outside_network_delete(worker->back);
2344 comm_signal_delete(worker->comsig);
2345 tube_delete(worker->cmd);
2346 comm_timer_delete(worker->stat_timer);
2347 comm_timer_delete(worker->env.probe_timer);
2348 free(worker->ports);
2349 if(worker->thread_num == 0) {
2351 wsvc_desetup_worker(worker);
2355 if(worker->daemon->cfg->dnstap
2357 && worker->thread_num == 0
2360 dt_io_thread_stop(worker->dtenv.dtio);
2362 dt_deinit(&worker->dtenv);
2364 comm_base_delete(worker->base);
2365 ub_randfree(worker->rndstate);
2366 /* don't touch worker->alloc, as it's maintained in daemon */
2367 regional_destroy(worker->env.scratch);
2368 regional_destroy(worker->scratchpad);
2369 free(worker);
2379 struct worker* worker = q->env->worker;
2385 e->qsent = outnet_serviced_query(worker->back, qinfo, flags, dnssec,
2388 worker_handle_service_reply, e, worker->back->udp_buff, q->env,
2399 struct worker* worker = (struct worker*)arg;
2400 slabhash_clear(&worker->env.rrset_cache->table);
2401 slabhash_clear(worker->env.msg_cache);
2404 void worker_stats_clear(struct worker* worker)
2406 server_stats_init(&worker->stats, worker->env.cfg);
2407 mesh_stats_clear(worker->env.mesh);
2408 worker->back->unwanted_replies = 0;
2409 worker->back->num_tcp_outgoing = 0;
2410 worker->back->num_udp_outgoing = 0;
2415 struct worker* worker = (struct worker*)arg;
2416 listen_start_accept(worker->front);
2417 if(worker->thread_num == 0)
2418 daemon_remote_start_accept(worker->daemon->rc);
2423 struct worker* worker = (struct worker*)arg;
2424 listen_stop_accept(worker->front);
2425 if(worker->thread_num == 0)
2426 daemon_remote_stop_accept(worker->daemon->rc);