]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
config settings for rrset cache.
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Fri, 4 May 2007 07:34:10 +0000 (07:34 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Fri, 4 May 2007 07:34:10 +0000 (07:34 +0000)
git-svn-id: file:///svn/unbound/trunk@279 be551aaa-1e26-0410-a405-d3ace91eadb9

daemon/unbound.c
doc/Changelog
doc/example.conf
doc/unbound.conf.5
util/config_file.c
util/config_file.h
util/configlexer.lex
util/configparser.y

index e03cf67c5b7c0679f8030dbf6e71540953fcf5f5..fa6fc847439f64133d1f9438daadee3176889f35 100644 (file)
@@ -93,6 +93,18 @@ apply_dir(struct daemon* daemon, struct config_file* cfg, int cmdline_verbose)
                        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. */
index 5217cec4e3108f8bbdcefcaffb4f81b2e1050174..501d65ba536d58beffa8942e3cdc3a042801d327 100644 (file)
@@ -1,5 +1,6 @@
 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.
index 10e71087c2e09fea4c4db6fa9c1033497a181c67..25bd71e42f3b8dae51759010204045e1a1efd177 100644 (file)
@@ -49,9 +49,17 @@ server:
        # 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
 
index 63f11995f6528b553c823d87cf77bee50d9b2356..e6dd79c62f06fb7ffcc8489ebcd6f6b9e6ad2f94 100644 (file)
@@ -71,6 +71,11 @@ 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 \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>
index b14785691a745b1edab913a223b6e00883ded634..113f9abba4d9aab559baab17a164e6371b757d4c 100644 (file)
@@ -80,17 +80,22 @@ config_create()
        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. */
index be722077e33fcbb74e1a0aaa70aba68c36765b49..f4837de40907a7610258ce15031880d065b90515 100644 (file)
@@ -75,6 +75,10 @@ struct config_file {
        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;
index 93b562280acf0820780b1e3095ff34b5b4bb1ffb..639ec7e03ad5bbe79bf23a0a68c97ccdf4feea10 100644 (file)
@@ -116,6 +116,8 @@ 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;}
+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++;}
 
index 1ef486d835816b2529971d2955beba2e2a5c27ab..f483ecdac411f7dd5f45ab4f2c50c3113b29faa0 100644 (file)
@@ -73,6 +73,7 @@ extern struct config_parser_state* cfg_parser;
 %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 ;
@@ -87,14 +88,17 @@ serverstart: VAR_SERVER
                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)); 
@@ -271,6 +275,28 @@ server_num_queries_per_thread: VAR_NUM_QUERIES_PER_THREAD STRING
                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 */