]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
query list config option. tpkg test.
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Wed, 28 Mar 2007 13:43:50 +0000 (13:43 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Wed, 28 Mar 2007 13:43:50 +0000 (13:43 +0000)
git-svn-id: file:///svn/unbound/trunk@203 be551aaa-1e26-0410-a405-d3ace91eadb9

12 files changed:
daemon/worker.c
daemon/worker.h
doc/Changelog
doc/example.conf
doc/unbound.conf.5
testdata/fwd_three.tpkg
testdata/fwd_three_service.tpkg [new file with mode: 0644]
testdata/fwd_two.rpl
util/config_file.c
util/config_file.h
util/configlexer.lex
util/configparser.y

index 0cff28066c1af1c317c66a07784b01763123c1a9..2158f71a3caa66786919bd9280f1c3d7a185935c 100644 (file)
@@ -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; i<worker->request_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);
index 5c83a1a09110486442754155a93c4b78f6d1acf4..fcf6dac92c7554b92b0d9dac8d55688ebb86b7f3 100644 (file)
@@ -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;
index 80c1cd8e27b46142bee0097535c7bce66096d2a6..b5d001b79340f887908d1a801120f8cfd03a254d 100644 (file)
@@ -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
index 84d633d241abd8b346d99d2d16e59a1947823a0a..5c74d17a85df0fb7bd4313cfd6a04ee361200293 100644 (file)
@@ -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
 
index 7fa0929e7f76a33b563c1501d4a77c6753e22332..63f11995f6528b553c823d87cf77bee50d9b2356 100644 (file)
@@ -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 <number>
+The number of queries that every thread will service simultaneously.
 .It \fBdo-ip4:\fR <yes or no>
 Enable or disable whether ip4 queries are answered. Default is yes.
 .It \fBdo-ip6:\fR <yes or no>
index 03f50e17c913a78144249970fdee9d967e7b3c1c..fa03ca9f8a92af65509b3823e8122093840f0778 100644 (file)
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 (file)
index 0000000..9decdba
Binary files /dev/null and b/testdata/fwd_three_service.tpkg differ
index fe7aaef72fe7c097eb6f8caafa51a5003535c3af..2e1354d067c2497cdd9ccb4a486f372c61d68681 100644 (file)
@@ -1,4 +1,6 @@
 ; config options go here.
+server:
+       num-queries-per-thread: 1
 CONFIG_END
 SCENARIO_BEGIN Sample of a valid query
 
index 026c6eb6143305f42a035c124e09e78fd16506a5..b14785691a745b1edab913a223b6e00883ded634 100644 (file)
@@ -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;}
index 4b94e333f512d716f06a77ba6735964f0ae8649d..be722077e33fcbb74e1a0aaa70aba68c36765b49 100644 (file)
@@ -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;
index 73739efebbbbef15a4a1f3d42e55b1a90f5f35d2..93b562280acf0820780b1e3095ff34b5b4bb1ffb 100644 (file)
@@ -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 */
index 4ddcce2b155e9065ae425874d57128da3c7b5d64..1ef486d835816b2529971d2955beba2e2a5c27ab 100644 (file)
@@ -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 */