From: Wouter Wijngaards Date: Wed, 28 Mar 2007 13:43:50 +0000 (+0000) Subject: query list config option. tpkg test. X-Git-Tag: release-0.2~24 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ae93dcac767b8e4aab78b6763e680ab3e222d7a1;p=thirdparty%2Funbound.git query list config option. tpkg test. git-svn-id: file:///svn/unbound/trunk@203 be551aaa-1e26-0410-a405-d3ace91eadb9 --- diff --git a/daemon/worker.c b/daemon/worker.c index 0cff28066..2158f71a3 100644 --- a/daemon/worker.c +++ b/daemon/worker.c @@ -84,8 +84,8 @@ req_release(struct work_query* w) /* no longer at max, start accepting again. */ listen_resume(w->worker->front); } + log_assert(w->worker->num_requests >= 1); w->worker->num_requests --; - log_assert(w->worker->num_requests >= 0); w->next = w->worker->free_queries; w->worker->free_queries = w; } @@ -398,7 +398,7 @@ worker_create(struct daemon* daemon, int id) static int reqs_init(struct worker* worker) { - int i; + size_t i; for(i=0; irequest_size; i++) { struct work_query* q = (struct work_query*)calloc(1, sizeof(struct work_query)); @@ -406,10 +406,28 @@ reqs_init(struct worker* worker) q->worker = worker; q->next = worker->free_queries; worker->free_queries = q; + q->all_next = worker->all_queries; + worker->all_queries = q; } return 1; } +/** delete request list */ +static void +reqs_delete(struct worker* worker) +{ + struct work_query* q = worker->all_queries; + struct work_query* n; + while(q) { + n = q->all_next; + log_assert(q->worker == worker); + /* comm_reply closed in outside_network_delete */ + query_info_clear(&q->qinfo); + free(q); + q = n; + } +} + int worker_init(struct worker* worker, struct config_file *cfg, struct listen_port* ports, size_t buffer_size, int do_sigs) @@ -484,7 +502,7 @@ worker_init(struct worker* worker, struct config_file *cfg, return 0; } } - worker->request_size = 1; + worker->request_size = cfg->num_queries_per_thread; if(!reqs_init(worker)) { worker_delete(worker); return 0; @@ -512,6 +530,7 @@ worker_delete(struct worker* worker) { if(!worker) return; + reqs_delete(worker); listen_delete(worker->front); outside_network_delete(worker->back); comm_signal_delete(worker->comsig); diff --git a/daemon/worker.h b/daemon/worker.h index 5c83a1a09..fcf6dac92 100644 --- a/daemon/worker.h +++ b/daemon/worker.h @@ -80,6 +80,8 @@ struct work_query { uint16_t query_id; /** flags uint16 from query */ uint16_t query_flags; + /** next query in all-list */ + struct work_query* all_next; }; /** @@ -109,11 +111,13 @@ struct worker { struct comm_point* cmd_com; /** number of requests currently active */ - int num_requests; + size_t num_requests; /** number of requests that can be handled by this worker */ - int request_size; + size_t request_size; /** the free working queries */ struct work_query* free_queries; + /** list of all working queries */ + struct work_query* all_queries; /** address to forward to */ struct sockaddr_storage fwd_addr; diff --git a/doc/Changelog b/doc/Changelog index 80c1cd8e2..b5d001b79 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -1,3 +1,8 @@ +28 March 2007: Wouter + - new config option: num-queries-per-thread. + - added tpkg test for answering three queries at the same time + using one thread (from the query service list). + 27 March 2007: Wouter - added test for cache and not cached answers, in testbound replays. - testbound can give config file and commandline options from the diff --git a/doc/example.conf b/doc/example.conf index 84d633d24..5c74d17a8 100644 --- a/doc/example.conf +++ b/doc/example.conf @@ -44,6 +44,9 @@ server: # more slabs reduce lock contention, but fracture memory usage. # msg-cache-slabs: 4 + # the number of queries that a thread gets to service. + # num-queries-per-thread: 1024 + # Enable IPv4, "yes" or "no". # do-ip4: yes diff --git a/doc/unbound.conf.5 b/doc/unbound.conf.5 index 7fa0929e7..63f11995f 100644 --- a/doc/unbound.conf.5 +++ b/doc/unbound.conf.5 @@ -69,6 +69,8 @@ Number of bytes size of the message cache. Default is 4 megabytes. Number of slabs in the message cache. Slabs reduce lock contention by threads. Must be set to a power of 2. Setting (close) to the number of cpus is a reasonable guess. +.It \fBnum-queries-per-thread:\fR +The number of queries that every thread will service simultaneously. .It \fBdo-ip4:\fR Enable or disable whether ip4 queries are answered. Default is yes. .It \fBdo-ip6:\fR diff --git a/testdata/fwd_three.tpkg b/testdata/fwd_three.tpkg index 03f50e17c..fa03ca9f8 100644 Binary files a/testdata/fwd_three.tpkg and b/testdata/fwd_three.tpkg differ diff --git a/testdata/fwd_three_service.tpkg b/testdata/fwd_three_service.tpkg new file mode 100644 index 000000000..9decdba89 Binary files /dev/null and b/testdata/fwd_three_service.tpkg differ diff --git a/testdata/fwd_two.rpl b/testdata/fwd_two.rpl index fe7aaef72..2e1354d06 100644 --- a/testdata/fwd_two.rpl +++ b/testdata/fwd_two.rpl @@ -1,4 +1,6 @@ ; config options go here. +server: + num-queries-per-thread: 1 CONFIG_END SCENARIO_BEGIN Sample of a valid query diff --git a/util/config_file.c b/util/config_file.c index 026c6eb61..b14785691 100644 --- a/util/config_file.c +++ b/util/config_file.c @@ -79,6 +79,7 @@ config_create() cfg->outgoing_num_ports = 16; cfg->msg_cache_size = 4 * 1024 * 1024; cfg->msg_cache_slabs = 4; + cfg->num_queries_per_thread = 1024; if(!(cfg->fwd_address = strdup(""))) {config_delete(cfg); return NULL;} if(!(cfg->username = strdup(""))) {config_delete(cfg); return NULL;} if(!(cfg->chrootdir = strdup(""))) {config_delete(cfg); return NULL;} diff --git a/util/config_file.h b/util/config_file.h index 4b94e333f..be722077e 100644 --- a/util/config_file.h +++ b/util/config_file.h @@ -73,6 +73,8 @@ struct config_file { size_t msg_cache_size; /** slabs in the message cache. */ size_t msg_cache_slabs; + /** number of queries every thread can service */ + size_t num_queries_per_thread; /** forwarder address. string. If not NULL fwder mode is enabled. */ char* fwd_address; diff --git a/util/configlexer.lex b/util/configlexer.lex index 73739efeb..93b562280 100644 --- a/util/configlexer.lex +++ b/util/configlexer.lex @@ -116,6 +116,7 @@ logfile{COLON} { LEXOUT(("v(%s) ", yytext)); return VAR_LOGFILE;} pidfile{COLON} { LEXOUT(("v(%s) ", yytext)); return VAR_PIDFILE;} msg-cache-size{COLON} { LEXOUT(("v(%s) ", yytext)); return VAR_MSG_CACHE_SIZE;} msg-cache-slabs{COLON} { LEXOUT(("v(%s) ", yytext)); return VAR_MSG_CACHE_SLABS;} +num-queries-per-thread{COLON} { LEXOUT(("v(%s) ", yytext)); return VAR_NUM_QUERIES_PER_THREAD;} {NEWLINE} { LEXOUT(("NL\n")); cfg_parser->line++;} /* Quoted strings. Strip leading and ending quotes */ diff --git a/util/configparser.y b/util/configparser.y index 4ddcce2b1..1ef486d83 100644 --- a/util/configparser.y +++ b/util/configparser.y @@ -72,7 +72,7 @@ extern struct config_parser_state* cfg_parser; %token VAR_DO_IP4 VAR_DO_IP6 VAR_DO_UDP VAR_DO_TCP %token VAR_FORWARD_TO VAR_FORWARD_TO_PORT VAR_CHROOT %token VAR_USERNAME VAR_DIRECTORY VAR_LOGFILE VAR_PIDFILE -%token VAR_MSG_CACHE_SIZE VAR_MSG_CACHE_SLABS +%token VAR_MSG_CACHE_SIZE VAR_MSG_CACHE_SLABS VAR_NUM_QUERIES_PER_THREAD %% toplevelvars: /* empty */ | toplevelvars toplevelvar ; @@ -93,7 +93,8 @@ content_server: server_num_threads | server_verbosity | server_port | server_do_ip6 | server_do_udp | server_do_tcp | server_forward_to | server_forward_to_port | server_interface | server_chroot | server_username | server_directory | server_logfile | server_pidfile | - server_msg_cache_size | server_msg_cache_slabs; + server_msg_cache_size | server_msg_cache_slabs | + server_num_queries_per_thread; server_num_threads: VAR_NUM_THREADS STRING { OUTYY(("P(server_num_threads:%s)\n", $2)); @@ -261,6 +262,15 @@ server_msg_cache_slabs: VAR_MSG_CACHE_SLABS STRING free($2); } ; +server_num_queries_per_thread: VAR_NUM_QUERIES_PER_THREAD STRING + { + OUTYY(("P(server_num_queries_per_thread:%s)\n", $2)); + if(atoi($2) == 0) + yyerror("number expected"); + else cfg_parser->cfg->num_queries_per_thread = atoi($2); + free($2); + } + ; %% /* parse helper routines could be here */