diff options
author | Martin Polden <mpolden@mpolden.no> | 2020-01-11 13:48:54 +0100 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2020-01-11 15:29:24 +0100 |
commit | deb91244471124365767e330f06fdef2ddc61672 (patch) | |
tree | 6b6efec680a4d8a919867d797defa22518e30b1c | |
parent | a03b5b5b001aa175216d627ddc78ada0af1f0b06 (diff) |
Wire cache backend
-rw-r--r-- | cmd/zdns/main.go | 21 | ||||
-rw-r--r-- | config.go | 4 | ||||
-rw-r--r-- | config_test.go | 4 | ||||
-rw-r--r-- | zdnsrc | 7 |
4 files changed, 32 insertions, 4 deletions
diff --git a/cmd/zdns/main.go b/cmd/zdns/main.go index e1c7243..0fc935d 100644 --- a/cmd/zdns/main.go +++ b/cmd/zdns/main.go @@ -81,7 +81,10 @@ func newCli(out io.Writer, args []string, configFile string, sig chan os.Signal) sigHandler := signal.NewHandler(sig, logger) // SQL backends - var sqlLogger *sql.Logger + var ( + sqlLogger *sql.Logger + sqlCache *sql.Cache + ) if config.DNS.Database != "" { sqlClient, err := sql.New(config.DNS.Database) fatal(err) @@ -89,20 +92,30 @@ func newCli(out io.Writer, args []string, configFile string, sig chan os.Signal) // Logger sqlLogger = sql.NewLogger(sqlClient, config.DNS.LogMode, config.DNS.LogTTL) sigHandler.OnClose(sqlLogger) + + // Cache + sqlCache = sql.NewCache(sqlClient, logger) + sigHandler.OnClose(sqlCache) } // DNS client dnsClient := dnsutil.NewClient(config.Resolver.Protocol, config.Resolver.Timeout, config.DNS.Resolvers...) // Cache + var dnsCache *cache.Cache var cacheDNS *dnsutil.Client if config.DNS.CachePrefetch { cacheDNS = dnsClient } - cache := cache.New(config.DNS.CacheSize, cacheDNS) + if sqlCache != nil && config.DNS.CachePersist { + dnsCache = cache.NewWithBackend(config.DNS.CacheSize, cacheDNS, sqlCache) + + } else { + dnsCache = cache.New(config.DNS.CacheSize, cacheDNS) + } // DNS server - proxy, err := dns.NewProxy(cache, dnsClient, logger, sqlLogger) + proxy, err := dns.NewProxy(dnsCache, dnsClient, logger, sqlLogger) fatal(err) sigHandler.OnClose(proxy) @@ -114,7 +127,7 @@ func newCli(out io.Writer, args []string, configFile string, sig chan os.Signal) // HTTP server if config.DNS.ListenHTTP != "" { - httpSrv := http.NewServer(cache, sqlLogger, logger, config.DNS.ListenHTTP) + httpSrv := http.NewServer(dnsCache, sqlLogger, logger, config.DNS.ListenHTTP) sigHandler.OnClose(httpSrv) servers = append(servers, httpSrv) } @@ -26,6 +26,7 @@ type DNSOptions struct { Protocol string `toml:"protocol"` CacheSize int `toml:"cache_size"` CachePrefetch bool `toml:"cache_prefetch"` + CachePersist bool `toml:"cache_persist"` HijackMode string `toml:"hijack_mode"` hijackMode int RefreshInterval string `toml:"hosts_refresh_interval"` @@ -88,6 +89,9 @@ func (c *Config) load() error { if c.DNS.CacheSize < 0 { return fmt.Errorf("cache size must be >= 0") } + if c.DNS.CachePersist && c.DNS.Database == "" { + return fmt.Errorf("cache_persist = %t requires 'database' to be set", c.DNS.CachePersist) + } switch c.DNS.HijackMode { case "", "zero": c.DNS.hijackMode = HijackZero diff --git a/config_test.go b/config_test.go index 8d04e00..f18873b 100644 --- a/config_test.go +++ b/config_test.go @@ -169,6 +169,9 @@ resolvers = ["http://example.com"] [resolver] protocol = "https" ` + conf15 := baseConf + ` +cache_persist = true +` var tests = []struct { in string err string @@ -189,6 +192,7 @@ protocol = "https" {conf12, "invalid log mode: foo"}, {conf13, `log_mode = "hijacked" requires 'database' to be set`}, {conf14, "protocol https requires https scheme for resolver http://example.com"}, + {conf15, "cache_persist = true requires 'database' to be set"}, } for i, tt := range tests { var got string @@ -22,6 +22,13 @@ # # cache_prefetch = false +# Cache persistence. +# +# If enabled, cache contents is periodically written to disk. The persisted +# content will then be used to pre-populate the cache on startup. +# +# cache_persist = false + # Upstream DNS servers to use when answering queries. # # The default is Cloudflare DNS servers, which support DNS-over-TLS. |