]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
Config options for infra cache.
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Wed, 16 May 2007 14:29:46 +0000 (14:29 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Wed, 16 May 2007 14:29:46 +0000 (14:29 +0000)
git-svn-id: file:///svn/unbound/trunk@325 be551aaa-1e26-0410-a405-d3ace91eadb9

daemon/daemon.c
daemon/daemon.h
daemon/unbound.c
doc/Changelog
services/cache/infra.c
services/cache/infra.h
util/configlexer.lex
util/configparser.y
util/module.h

index 793d2e099310b4ea28b1cd531eb06cf4f28f519e..b3670e74564bff358cb0c43532891de646f373ac 100644 (file)
@@ -51,6 +51,7 @@
 #include "util/storage/slabhash.h"
 #include "services/listen_dnsport.h"
 #include "services/cache/rrset.h"
+#include "services/cache/infra.h"
 #include "util/module.h"
 #include "iterator/iterator.h"
 #include <signal.h>
@@ -121,26 +122,12 @@ daemon_init()
        signal_handling_record();
        checklock_start();
        daemon->need_to_exit = 0;
-       daemon->msg_cache = slabhash_create(HASH_DEFAULT_SLABS, 
-               HASH_DEFAULT_STARTARRAY, HASH_DEFAULT_MAXMEM, 
-               msgreply_sizefunc, query_info_compare,
-               query_entry_delete, reply_info_delete, NULL);
-       if(!daemon->msg_cache) {
-               free(daemon);
-               return NULL;
-       }
-       alloc_init(&daemon->superalloc, NULL, 0);
-       daemon->rrset_cache = rrset_cache_create(NULL, &daemon->superalloc);
-       if(!daemon->rrset_cache) {
-               slabhash_delete(daemon->msg_cache);
-               free(daemon);
-               return NULL;
-       }
        if(!(daemon->env = (struct module_env*)calloc(1, 
                sizeof(*daemon->env)))) {
-               daemon_delete(daemon);
+               free(daemon);
                return NULL;
        }
+       alloc_init(&daemon->superalloc, NULL, 0);
        return daemon;  
 }
 
@@ -173,8 +160,6 @@ static void daemon_setup_modules(struct daemon* daemon)
        }
        daemon->modfunc[0] = iter_get_funcblock();
        daemon->env->cfg = daemon->cfg;
-       daemon->env->msg_cache = daemon->msg_cache;
-       daemon->env->rrset_cache = daemon->rrset_cache;
        daemon->env->alloc = &daemon->superalloc;
        daemon->env->worker = NULL;
        daemon->env->send_query = &worker_send_query;
@@ -380,8 +365,11 @@ daemon_delete(struct daemon* daemon)
        if(!daemon)
                return;
        listening_ports_free(daemon->ports);
-       slabhash_delete(daemon->msg_cache);
-       rrset_cache_delete(daemon->rrset_cache);
+       if(daemon->env) {
+               slabhash_delete(daemon->env->msg_cache);
+               rrset_cache_delete(daemon->env->rrset_cache);
+               infra_delete(daemon->env->infra_cache);
+       }
        alloc_clear(&daemon->superalloc);
        free(daemon->cwd);
        free(daemon->pidfile);
index af00f2c3c0ee01513353e2aca97ed8eaafd960be..bc20abc09cbb07202a728d40ddeeb3123f564ad9 100644 (file)
@@ -74,10 +74,6 @@ struct daemon {
        int need_to_exit;
        /** master allocation cache */
        struct alloc_cache superalloc;
-       /** the message cache, content is struct msgreply_entry* */
-       struct slabhash* msg_cache;
-       /** the rrset cache, content is struct ub_packed_rrset_key* */
-       struct rrset_cache* rrset_cache;
        /** the module environment master value, copied and changed by threads*/
        struct module_env* env;
        /** number of modules active, ids from 0 to num-1. */
index 37928f8872576135bfa44c2290021457a29806dc..48780640efb989b090dd6bd22ec55911a75dee40 100644 (file)
@@ -47,6 +47,7 @@
 #include "util/storage/slabhash.h"
 #include "services/listen_dnsport.h"
 #include "services/cache/rrset.h"
+#include "services/cache/infra.h"
 #include "util/data/msgreply.h"
 #include "util/module.h"
 #include <signal.h>
@@ -120,22 +121,24 @@ apply_dir(struct daemon* daemon, struct config_file* cfg, int cmdline_verbose)
                                log_err("cwd: malloc failed");
                }
        }
-       if(cfg->msg_cache_size != slabhash_get_size(daemon->msg_cache) ||
-               cfg->msg_cache_slabs != daemon->msg_cache->size) {
-               slabhash_delete(daemon->msg_cache);
-               daemon->msg_cache = slabhash_create(cfg->msg_cache_slabs, 
+       if(!daemon->env->msg_cache ||
+          cfg->msg_cache_size != slabhash_get_size(daemon->env->msg_cache) ||
+          cfg->msg_cache_slabs != daemon->env->msg_cache->size) {
+               slabhash_delete(daemon->env->msg_cache);
+               daemon->env->msg_cache = slabhash_create(cfg->msg_cache_slabs, 
                        HASH_DEFAULT_STARTARRAY, cfg->msg_cache_size, 
                        msgreply_sizefunc, query_info_compare,
                        query_entry_delete, reply_info_delete, NULL);
-               if(!daemon->msg_cache) {
+               if(!daemon->env->msg_cache) {
                        fatal_exit("malloc failure updating config settings");
                }
        }
-       if((daemon->rrset_cache = rrset_cache_adjust(daemon->rrset_cache,
-                       cfg, &daemon->superalloc)) == 0)
-                       fatal_exit("malloc failure updating config settings");
-       daemon->env->rrset_cache = daemon->rrset_cache;
-       daemon->env->msg_cache = daemon->msg_cache;
+       if((daemon->env->rrset_cache = rrset_cache_adjust(
+               daemon->env->rrset_cache, cfg, &daemon->superalloc)) == 0)
+               fatal_exit("malloc failure updating config settings");
+       if((daemon->env->infra_cache = infra_adjust(daemon->env->infra_cache, 
+               cfg))==0)
+               fatal_exit("malloc failure updating config settings");
        checkrlimits(cfg);
 }
 
index 129ad86f62de6754217ecaf65277e6eced7833f1..58378f7e95dc1bd692320a7f1a0975205e7ad27c 100644 (file)
@@ -4,6 +4,8 @@
        - services/cache/rrset.c for rrset cache code.
        - special rrset_cache LRU updating function that uses the rrset id.
        - no dependencies calculation when make clean is called.
+       - config settings for infra cache.
+       - daemon code slightly cleaner, only creates caches once.
 
 15 May 2007: Wouter
        - host cache code.
index d3ed429a5235e548bd7da7a1e5996afba67f1e1c..fbc0d050236d9b75a6a73183958795bd2fc0c6cb 100644 (file)
@@ -121,6 +121,25 @@ infra_delete(struct infra_cache* infra)
        free(infra);
 }
 
+struct infra_cache* 
+infra_adjust(struct infra_cache* infra, struct config_file* cfg)
+{
+       size_t maxmem;
+       if(!infra)
+               return infra_create(cfg);
+       infra->host_ttl = cfg->host_ttl;
+       infra->lame_ttl = cfg->lame_ttl;
+       infra->max_lame = cfg->infra_cache_numlame;
+       maxmem = cfg->infra_cache_numhosts * 
+               (sizeof(struct infra_host_key)+sizeof(struct infra_host_data));
+       if(maxmem != slabhash_get_size(infra->hosts) ||
+               cfg->infra_cache_slabs != infra->hosts->size) {
+               infra_delete(infra);
+               infra = infra_create(cfg);
+       }
+       return infra;
+}
+
 /** calculate the hash value for a host key */
 static hashvalue_t
 hash_addr(struct sockaddr_storage* addr, socklen_t addrlen)
index c30687f28098705651e168ce2a9dfec08482bc68..6fd29c613be3e959e05d83f0ebfc679376210749 100644 (file)
@@ -114,7 +114,7 @@ struct infra_cache {
 
 /**
  * Create infra cache.
- * @param cfg: config parameters.
+ * @param cfg: config parameters or NULL for defaults.
  * @return: new infra cache, or NULL.
  */
 struct infra_cache* infra_create(struct config_file* cfg);
@@ -125,6 +125,17 @@ struct infra_cache* infra_create(struct config_file* cfg);
  */
 void infra_delete(struct infra_cache* infra);
 
+/**
+ * Adjust infra cache to use updated configuration settings.
+ * This may clean the cache. Operates a bit like realloc.
+ * There may be no threading or use by other threads.
+ * @param infra: existing cache. If NULL a new infra cache is returned.
+ * @param cfg: config options.
+ * @return the new infra cache pointer or NULL on error.
+ */
+struct infra_cache* infra_adjust(struct infra_cache* infra, 
+       struct config_file* cfg);
+
 /**
  * Lookup host data
  * @param infra: infrastructure cache.
index f0cf4d80af7687bb76b38ef00ea93e36d491bc4a..1ab5ffa911159297d10b676e38001e5a45e5ac26 100644 (file)
@@ -27,6 +27,8 @@ void ub_c_error(const char *message);
 #define LEXOUT(s)
 #endif
 
+#define YDOUT LEXOUT(("v(%s )", yytext))
+
 struct inc_state {
        char* filename;
        int line;
@@ -96,30 +98,35 @@ ANY     [^\"\n\r\\]|\\.
 %%
 {SPACE}*               { LEXOUT(("SP ")); /* ignore */ }
 {SPACE}*{COMMENT}.*    { LEXOUT(("comment(%s) ", yytext)); /* ignore */ }
-server{COLON}          { LEXOUT(("v(%s) ", yytext)); return VAR_SERVER;}
-num-threads{COLON}     { LEXOUT(("v(%s) ", yytext)); return VAR_NUM_THREADS;}
-verbosity{COLON}       { LEXOUT(("v(%s) ", yytext)); return VAR_VERBOSITY;}
-port{COLON}            { LEXOUT(("v(%s) ", yytext)); return VAR_PORT;}
-outgoing-port{COLON}   { LEXOUT(("v(%s) ", yytext)); return VAR_OUTGOING_PORT;}
-outgoing-range{COLON}  { LEXOUT(("v(%s) ", yytext)); return VAR_OUTGOING_RANGE;}
-outgoing-num-tcp{COLON}        { LEXOUT(("v(%s) ", yytext)); return VAR_OUTGOING_NUM_TCP;}
-do-ip4{COLON}          { LEXOUT(("v(%s) ", yytext)); return VAR_DO_IP4;}
-do-ip6{COLON}          { LEXOUT(("v(%s) ", yytext)); return VAR_DO_IP6;}
-do-udp{COLON}          { LEXOUT(("v(%s) ", yytext)); return VAR_DO_UDP;}
-do-tcp{COLON}          { LEXOUT(("v(%s) ", yytext)); return VAR_DO_TCP;}
-forward-to{COLON}      { LEXOUT(("v(%s) ", yytext)); return VAR_FORWARD_TO;}
-forward-to-port{COLON} { LEXOUT(("v(%s) ", yytext)); return VAR_FORWARD_TO_PORT;}
-interface{COLON}       { LEXOUT(("v(%s) ", yytext)); return VAR_INTERFACE;}
-chroot{COLON}          { LEXOUT(("v(%s) ", yytext)); return VAR_CHROOT;}
-username{COLON}                { LEXOUT(("v(%s) ", yytext)); return VAR_USERNAME;}
-directory{COLON}       { LEXOUT(("v(%s) ", yytext)); return VAR_DIRECTORY;}
-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;}
+server{COLON}          { YDOUT; return VAR_SERVER;}
+num-threads{COLON}     { YDOUT; return VAR_NUM_THREADS;}
+verbosity{COLON}       { YDOUT; return VAR_VERBOSITY;}
+port{COLON}            { YDOUT; return VAR_PORT;}
+outgoing-port{COLON}   { YDOUT; return VAR_OUTGOING_PORT;}
+outgoing-range{COLON}  { YDOUT; return VAR_OUTGOING_RANGE;}
+outgoing-num-tcp{COLON}        { YDOUT; return VAR_OUTGOING_NUM_TCP;}
+do-ip4{COLON}          { YDOUT; return VAR_DO_IP4;}
+do-ip6{COLON}          { YDOUT; return VAR_DO_IP6;}
+do-udp{COLON}          { YDOUT; return VAR_DO_UDP;}
+do-tcp{COLON}          { YDOUT; return VAR_DO_TCP;}
+forward-to{COLON}      { YDOUT; return VAR_FORWARD_TO;}
+forward-to-port{COLON} { YDOUT; return VAR_FORWARD_TO_PORT;}
+interface{COLON}       { YDOUT; return VAR_INTERFACE;}
+chroot{COLON}          { YDOUT; return VAR_CHROOT;}
+username{COLON}                { YDOUT; return VAR_USERNAME;}
+directory{COLON}       { YDOUT; return VAR_DIRECTORY;}
+logfile{COLON}         { YDOUT; return VAR_LOGFILE;}
+pidfile{COLON}         { YDOUT; return VAR_PIDFILE;}
+msg-cache-size{COLON}  { YDOUT; return VAR_MSG_CACHE_SIZE;}
+msg-cache-slabs{COLON} { YDOUT; return VAR_MSG_CACHE_SLABS;}
+rrset-cache-size{COLON}        { YDOUT; return VAR_RRSET_CACHE_SIZE;}
+rrset-cache-slabs{COLON}       { YDOUT; return VAR_RRSET_CACHE_SLABS;}
+infra-host-ttl{COLON}  { YDOUT; return VAR_INFRA_HOST_TTL;}
+infra-lame-ttl{COLON}  { YDOUT; return VAR_INFRA_LAME_TTL;}
+infra-cache-slabs{COLON}       { YDOUT; return VAR_INFRA_CACHE_SLABS;}
+infra-cache-numhosts{COLON}    { YDOUT; return VAR_INFRA_CACHE_NUMHOSTS;}
+infra-cache-numlame{COLON}     { YDOUT; return VAR_INFRA_CACHE_NUMLAME;}
+num-queries-per-thread{COLON}  { YDOUT; return VAR_NUM_QUERIES_PER_THREAD;}
 {NEWLINE}              { LEXOUT(("NL\n")); cfg_parser->line++;}
 
        /* Quoted strings. Strip leading and ending quotes */
index d57198b861fa7681543618b57fe24269de7a955c..08c7dfa55217ebacf072499c7cee264a6421d157 100644 (file)
@@ -74,6 +74,8 @@ extern struct config_parser_state* cfg_parser;
 %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 VAR_OUTGOING_NUM_TCP
+%token VAR_INFRA_HOST_TTL VAR_INFRA_LAME_TTL VAR_INFRA_CACHE_SLABS
+%token VAR_INFRA_CACHE_NUMHOSTS VAR_INFRA_CACHE_NUMLAME
 
 %%
 toplevelvars: /* empty */ | toplevelvars toplevelvar ;
@@ -97,7 +99,10 @@ content_server: server_num_threads | server_verbosity | server_port |
        server_username | server_directory | server_logfile | server_pidfile |
        server_msg_cache_size | server_msg_cache_slabs |
        server_num_queries_per_thread | server_rrset_cache_size | 
-       server_rrset_cache_slabs | server_outgoing_num_tcp
+       server_rrset_cache_slabs | server_outgoing_num_tcp | 
+       server_infra_host_ttl | server_infra_lame_ttl | 
+       server_infra_cache_slabs | server_infra_cache_numhosts |
+       server_infra_cache_numlame
        ;
 server_num_threads: VAR_NUM_THREADS STRING 
        { 
@@ -306,6 +311,55 @@ server_rrset_cache_slabs: VAR_RRSET_CACHE_SLABS STRING
                free($2);
        }
        ;
+server_infra_host_ttl: VAR_INFRA_HOST_TTL STRING
+       {
+               OUTYY(("P(server_infra_host_ttl:%s)\n", $2));
+               if(atoi($2) == 0 && strcmp($2, "0") != 0)
+                       yyerror("number expected");
+               else cfg_parser->cfg->host_ttl = atoi($2);
+               free($2);
+       }
+       ;
+server_infra_lame_ttl: VAR_INFRA_LAME_TTL STRING
+       {
+               OUTYY(("P(server_infra_lame_ttl:%s)\n", $2));
+               if(atoi($2) == 0 && strcmp($2, "0") != 0)
+                       yyerror("number expected");
+               else cfg_parser->cfg->lame_ttl = atoi($2);
+               free($2);
+       }
+       ;
+server_infra_cache_numhosts: VAR_INFRA_CACHE_NUMHOSTS STRING
+       {
+               OUTYY(("P(server_infra_cache_numhosts:%s)\n", $2));
+               if(atoi($2) == 0)
+                       yyerror("number expected");
+               else cfg_parser->cfg->infra_cache_numhosts = atoi($2);
+               free($2);
+       }
+       ;
+server_infra_cache_numlame: VAR_INFRA_CACHE_NUMLAME STRING
+       {
+               OUTYY(("P(server_infra_cache_numlame:%s)\n", $2));
+               if(atoi($2) == 0)
+                       yyerror("number expected");
+               else cfg_parser->cfg->infra_cache_numlame = atoi($2);
+               free($2);
+       }
+       ;
+server_infra_cache_slabs: VAR_INFRA_CACHE_SLABS STRING
+       {
+               OUTYY(("P(server_infra_cache_slabs:%s)\n", $2));
+               if(atoi($2) == 0)
+                       yyerror("number expected");
+               else {
+                       cfg_parser->cfg->infra_cache_slabs = atoi($2);
+                       if(!is_pow2(cfg_parser->cfg->infra_cache_slabs))
+                               yyerror("must be a power of 2");
+               }
+               free($2);
+       }
+       ;
 %%
 
 /* parse helper routines could be here */
index e82f34777245431751716ab2280a6095fe1c8d66..ba2927459c838a53eeaaa88fecc75345e24daa85 100644 (file)
@@ -69,6 +69,8 @@ struct module_env {
        struct slabhash* msg_cache;
        /** shared rrset cache */
        struct rrset_cache* rrset_cache;
+       /** shared infrastructure cache (edns, lameness) */
+       struct infra_cache* infra_cache;
 
        /* --- services --- */
        /**