/* 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;
}
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));
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)
return 0;
}
}
- worker->request_size = 1;
+ worker->request_size = cfg->num_queries_per_thread;
if(!reqs_init(worker)) {
worker_delete(worker);
return 0;
{
if(!worker)
return;
+ reqs_delete(worker);
listen_delete(worker->front);
outside_network_delete(worker->back);
comm_signal_delete(worker->comsig);
uint16_t query_id;
/** flags uint16 from query */
uint16_t query_flags;
+ /** next query in all-list */
+ struct work_query* all_next;
};
/**
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;
+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
# 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
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>
; config options go here.
+server:
+ num-queries-per-thread: 1
CONFIG_END
SCENARIO_BEGIN Sample of a valid query
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;}
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;
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 */
%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 ;
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));
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 */