fatal_exit("malloc failure updating config settings");
}
}
+ if(cfg->rrset_cache_size != slabhash_get_size(daemon->rrset_cache) ||
+ cfg->rrset_cache_slabs != daemon->rrset_cache->size) {
+ slabhash_delete(daemon->rrset_cache);
+ daemon->rrset_cache = slabhash_create(cfg->rrset_cache_slabs,
+ HASH_DEFAULT_STARTARRAY, cfg->rrset_cache_size,
+ ub_rrset_sizefunc, ub_rrset_compare,
+ ub_rrset_key_delete, rrset_data_delete,
+ &daemon->superalloc);
+ if(!daemon->rrset_cache) {
+ fatal_exit("malloc failure updating config settings");
+ }
+ }
}
/** Read existing pid from pidfile. */
4 May 2007: Wouter
- msgreply sizefunc is more accurate.
+ - config settings for rrset cache size and slabs.
3 May 2007: Wouter
- fill refs. Use new parse and encode to answer queries.
# msg-cache-slabs: 4
# the number of queries that a thread gets to service.
- # this must be a power of 2.
# num-queries-per-thread: 1024
+ # the amount of memory to use for the RRset cache.
+ # in bytes. default is 4 Mb
+ # rrset-cache-size: 4194304
+
+ # the number of slabs to use for the RRset cache.
+ # the number of slabs must be a power of 2.
+ # more slabs reduce lock contention, but fragment memory usage.
+ # rrset-cache-slabs: 4
+
# Enable IPv4, "yes" or "no".
# do-ip4: yes
reasonable guess.
.It \fBnum-queries-per-thread:\fR <number>
The number of queries that every thread will service simultaneously.
+.It \fBrrset-cache-size:\fR <number>
+Number of bytes size of the RRset cache. Default is 4 megabytes.
+.It \fBrrset-cache-slabs:\fR <number>
+Number of slabs in the RRset cache. Slabs reduce lock contention by threads.
+Must be set to a power of 2.
.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>
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;}
- if(!(cfg->directory = strdup("/etc/unbound"))) {config_delete(cfg); return NULL;}
- if(!(cfg->logfile = strdup(""))) {config_delete(cfg); return NULL;}
- if(!(cfg->pidfile = strdup("unbound.pid"))) {config_delete(cfg); return NULL;}
+ cfg->rrset_cache_size = 4 * 1024 * 1024;
+ cfg->rrset_cache_slabs = 4;
+ if(!(cfg->fwd_address = strdup(""))) goto error_exit;
+ if(!(cfg->username = strdup(""))) goto error_exit;
+ if(!(cfg->chrootdir = strdup(""))) goto error_exit;
+ if(!(cfg->directory = strdup("/etc/unbound"))) goto error_exit;
+ if(!(cfg->logfile = strdup(""))) goto error_exit;
+ if(!(cfg->pidfile = strdup("unbound.pid"))) goto error_exit;
cfg->fwd_port = UNBOUND_DNS_PORT;
cfg->do_daemonize = 1;
cfg->num_ifs = 0;
cfg->ifs = NULL;
return cfg;
+error_exit:
+ config_delete(cfg);
+ return NULL;
}
/** initialize the global cfg_parser object. */
size_t msg_cache_slabs;
/** number of queries every thread can service */
size_t num_queries_per_thread;
+ /** size of the rrset cache */
+ size_t rrset_cache_size;
+ /** slabs in the rrset cache */
+ size_t rrset_cache_slabs;
/** 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;}
+rrset-cache-size{COLON} { LEXOUT(("v(%s) ", yytext)); return VAR_RRSET_CACHE_SIZE;}
+rrset-cache-slabs{COLON} { LEXOUT(("v(%s) ", yytext)); return VAR_RRSET_CACHE_SLABS;}
num-queries-per-thread{COLON} { LEXOUT(("v(%s) ", yytext)); return VAR_NUM_QUERIES_PER_THREAD;}
{NEWLINE} { LEXOUT(("NL\n")); cfg_parser->line++;}
%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 VAR_NUM_QUERIES_PER_THREAD
+%token VAR_RRSET_CACHE_SIZE VAR_RRSET_CACHE_SLABS
%%
toplevelvars: /* empty */ | toplevelvars toplevelvar ;
cfg_parser->server_settings_seen = 1;
}
;
-contents_server: contents_server content_server | ;
+contents_server: contents_server content_server
+ | ;
content_server: server_num_threads | server_verbosity | server_port |
server_outgoing_port | server_outgoing_range | server_do_ip4 |
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_num_queries_per_thread;
+ server_num_queries_per_thread | server_rrset_cache_size |
+ server_rrset_cache_slabs
+ ;
server_num_threads: VAR_NUM_THREADS STRING
{
OUTYY(("P(server_num_threads:%s)\n", $2));
free($2);
}
;
+server_rrset_cache_size: VAR_RRSET_CACHE_SIZE STRING
+ {
+ OUTYY(("P(server_rrset_cache_size:%s)\n", $2));
+ if(atoi($2) == 0)
+ yyerror("number expected");
+ else cfg_parser->cfg->rrset_cache_size = atoi($2);
+ free($2);
+ }
+ ;
+server_rrset_cache_slabs: VAR_RRSET_CACHE_SLABS STRING
+ {
+ OUTYY(("P(server_rrset_cache_slabs:%s)\n", $2));
+ if(atoi($2) == 0)
+ yyerror("number expected");
+ else {
+ cfg_parser->cfg->rrset_cache_slabs = atoi($2);
+ if(!is_pow2(cfg_parser->cfg->rrset_cache_slabs))
+ yyerror("must be a power of 2");
+ }
+ free($2);
+ }
+ ;
%%
/* parse helper routines could be here */