Skip to content

Commit 2e058f6

Browse files
committed
Make the cache TTL an explicit, configurable parameter
1 parent fdc6fcf commit 2e058f6

4 files changed

Lines changed: 34 additions & 15 deletions

File tree

dnscrypt-proxy/config.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ type SourceConfig struct {
188188
CacheFile string `toml:"cache_file"`
189189
FormatStr string `toml:"format"`
190190
RefreshDelay int `toml:"refresh_delay"`
191+
CacheTTL int `toml:"cache_ttl"`
191192
Prefix string
192193
}
193194

@@ -716,6 +717,10 @@ func (config *Config) loadSource(proxy *Proxy, cfgSourceName string, cfgSource *
716717
cfgSource.RefreshDelay = 72
717718
}
718719
cfgSource.RefreshDelay = Min(169, Max(25, cfgSource.RefreshDelay))
720+
if cfgSource.CacheTTL <= 0 {
721+
cfgSource.CacheTTL = 168
722+
}
723+
cfgSource.CacheTTL = Min(168, Max(cfgSource.RefreshDelay, cfgSource.CacheTTL))
719724
source, err := NewSource(
720725
cfgSourceName,
721726
proxy.xTransport,
@@ -724,6 +729,7 @@ func (config *Config) loadSource(proxy *Proxy, cfgSourceName string, cfgSource *
724729
cfgSource.CacheFile,
725730
cfgSource.FormatStr,
726731
time.Duration(cfgSource.RefreshDelay)*time.Hour,
732+
time.Duration(cfgSource.CacheTTL)*time.Hour,
727733
cfgSource.Prefix,
728734
)
729735
if err != nil {

dnscrypt-proxy/example-dnscrypt-proxy.toml

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -752,10 +752,14 @@ format = 'tsv'
752752
##
753753
## If the `urls` property is missing, cache files and valid signatures
754754
## must already be present. This doesn't prevent these cache files from
755-
## expiring after `refresh_delay` hours.
756-
## `refreshed_delay` must be in the [24..168] interval.
757-
## The minimum delay of 24 hours (1 day) avoids unnecessary requests to servers.
758-
## The maximum delay of 168 hours (1 week) ensures cache freshness.
755+
## expiring after `cache_ttl` hours.
756+
##
757+
## `refresh_delay` controls how often to download updates during normal operation.
758+
## Must be in the [24..168] interval (1 day to 1 week).
759+
##
760+
## `cache_ttl` controls how old the cache can be at startup before requiring
761+
## an immediate download. Defaults to 168 hours if not set.
762+
## Must be in [refresh_delay..168] interval.
759763

760764
[sources]
761765

dnscrypt-proxy/sources.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -221,17 +221,24 @@ func NewSource(
221221
cacheFile string,
222222
formatStr string,
223223
refreshDelay time.Duration,
224+
cacheTTL time.Duration,
224225
prefix string,
225226
) (*Source, error) {
226227
if refreshDelay < DefaultPrefetchDelay {
227228
refreshDelay = DefaultPrefetchDelay
228229
}
230+
if cacheTTL < refreshDelay {
231+
cacheTTL = refreshDelay
232+
}
233+
if cacheTTL > 168*time.Hour {
234+
cacheTTL = 168 * time.Hour
235+
}
229236
source := &Source{
230237
name: name,
231238
urls: []*url.URL{},
232239
cacheFile: cacheFile,
233-
cacheTTL: refreshDelay,
234-
prefetchDelay: DefaultPrefetchDelay,
240+
cacheTTL: cacheTTL,
241+
prefetchDelay: refreshDelay,
235242
prefix: prefix,
236243
}
237244
if formatStr == "v2" {

dnscrypt-proxy/sources_test.go

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -350,7 +350,7 @@ func prepSourceTestDownload(
350350
}
351351
if e.success {
352352
e.err = ""
353-
e.delay = DefaultPrefetchDelay
353+
e.delay = DefaultPrefetchDelay * 3 // matches cacheTTL/prefetchDelay set in setupSourceTestCase
354354
} else {
355355
e.delay = MinimumPrefetchInterval
356356
}
@@ -371,7 +371,7 @@ func setupSourceTestCase(t *testing.T, d *SourceTestData, i int,
371371
}
372372
e.Source = &Source{
373373
name: id, urls: []*url.URL{}, format: SourceFormatV2, minisignKey: d.key,
374-
cacheFile: e.cachePath, cacheTTL: DefaultPrefetchDelay * 3, prefetchDelay: DefaultPrefetchDelay,
374+
cacheFile: e.cachePath, cacheTTL: DefaultPrefetchDelay * 3, prefetchDelay: DefaultPrefetchDelay * 3,
375375
}
376376
if cacheTest != nil {
377377
prepSourceTestCache(t, d, e, d.sources[i], *cacheTest)
@@ -401,13 +401,13 @@ func TestNewSource(t *testing.T) {
401401
}
402402
d.n++
403403
for _, tt := range []struct {
404-
v, key string
405-
refreshDelay time.Duration
406-
e *SourceTestExpect
404+
v, key string
405+
refreshDelay, cacheTTL time.Duration
406+
e *SourceTestExpect
407407
}{
408-
{"", "", 0, &SourceTestExpect{err: " ", Source: &Source{name: "short refresh delay", urls: []*url.URL{}, cacheTTL: DefaultPrefetchDelay, prefetchDelay: DefaultPrefetchDelay, prefix: ""}}},
409-
{"v1", d.keyStr, DefaultPrefetchDelay * 2, &SourceTestExpect{err: "Unsupported source format", Source: &Source{name: "old format", urls: []*url.URL{}, cacheTTL: DefaultPrefetchDelay * 2, prefetchDelay: DefaultPrefetchDelay}}},
410-
{"v2", "", DefaultPrefetchDelay * 3, &SourceTestExpect{err: "Invalid encoded public key", Source: &Source{name: "invalid public key", urls: []*url.URL{}, cacheTTL: DefaultPrefetchDelay * 3, prefetchDelay: DefaultPrefetchDelay}}},
408+
{"", "", 0, 0, &SourceTestExpect{err: " ", Source: &Source{name: "short refresh delay", urls: []*url.URL{}, cacheTTL: DefaultPrefetchDelay, prefetchDelay: DefaultPrefetchDelay, prefix: ""}}},
409+
{"v1", d.keyStr, DefaultPrefetchDelay * 2, DefaultPrefetchDelay * 2, &SourceTestExpect{err: "Unsupported source format", Source: &Source{name: "old format", urls: []*url.URL{}, cacheTTL: DefaultPrefetchDelay * 2, prefetchDelay: DefaultPrefetchDelay * 2}}},
410+
{"v2", "", DefaultPrefetchDelay * 3, DefaultPrefetchDelay * 3, &SourceTestExpect{err: "Invalid encoded public key", Source: &Source{name: "invalid public key", urls: []*url.URL{}, cacheTTL: DefaultPrefetchDelay * 3, prefetchDelay: DefaultPrefetchDelay * 3}}},
411411
} {
412412
t.Run(tt.e.Source.name, func(t *testing.T) {
413413
got, err := NewSource(
@@ -418,6 +418,7 @@ func TestNewSource(t *testing.T) {
418418
tt.e.cachePath,
419419
tt.v,
420420
tt.refreshDelay,
421+
tt.cacheTTL,
421422
tt.e.prefix,
422423
)
423424
checkResult(t, tt.e, got, err)
@@ -437,6 +438,7 @@ func TestNewSource(t *testing.T) {
437438
e.cachePath,
438439
"v2",
439440
DefaultPrefetchDelay*3,
441+
DefaultPrefetchDelay*3,
440442
"",
441443
)
442444
checkResult(t, e, got, err)
@@ -483,7 +485,7 @@ func TestPrefetchSources(t *testing.T) {
483485
cacheFile: e.Source.cacheFile,
484486
cacheTTL: e.Source.cacheTTL,
485487
prefetchDelay: e.Source.prefetchDelay,
486-
refresh: e.Source.refresh,
488+
refresh: d.timeUpd, // Set to trigger prefetch (source.refresh.After(now) will be false)
487489
prefix: e.Source.prefix,
488490
// bin is intentionally left nil
489491
}

0 commit comments

Comments
 (0)