cache

package
v1.6.6 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 7, 2026 License: MIT Imports: 18 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func AcquireMsg added in v1.0.0

func AcquireMsg() *dns.Msg

AcquireMsg returns an empty msg from pool with pre-allocated slices.

func ReleaseMsg added in v1.0.0

func ReleaseMsg(m *dns.Msg)

ReleaseMsg returns msg to pool.

func SetCacheSizeFuncs added in v1.6.1

func SetCacheSizeFuncs(positive, negative func() int)

SetCacheSizeFuncs sets the functions to get cache sizes

func SetMetricsInstance added in v1.6.1

func SetMetricsInstance(m *CacheMetrics)

SetMetricsInstance sets the metrics instance for hit rate calculation

func UpdateCacheSizeMetrics added in v1.6.1

func UpdateCacheSizeMetrics()

UpdateCacheSizeMetrics updates the cache size gauges

Types

type Cache

type Cache struct {
	// contains filtered or unexported fields
}

Cache is the cache implementation.

func New

func New(cfg *config.Config) *Cache

New creates a new cache.

func (*Cache) ForEachEntry added in v1.6.2

func (c *Cache) ForEachEntry(fn func(positive bool, key uint64, entry *CacheEntry) bool)

ForEachEntry iterates over positive and negative cache entries. Iteration is not atomic with concurrent updates. Returning false from fn stops iteration.

func (*Cache) Name

func (c *Cache) Name() string

(*Cache).Name name returns middleware name.

func (*Cache) Purge added in v1.6.4

func (c *Cache) Purge(q dns.Question)

(*Cache).Purge removes positive and negative cache entries for q under both CD=true and CD=false. Implements middleware.Purger so the api purge endpoint can invalidate cache state without synthesising a CHAOS-NULL request.

func (*Cache) ServeDNS

func (c *Cache) ServeDNS(ctx context.Context, ch *middleware.Chain)

(*Cache).ServeDNS serveDNS implements the middleware.Handler interface.

func (*Cache) Set

func (c *Cache) Set(key uint64, msg *dns.Msg)

(*Cache).Set set adds a new element to the cache. Provided for API compatibility (prefetch worker, plugin callers). Internally goes through Store; the entry is constructed with origTTL adjusted to the real upstream TTL so subsequent prefetch decisions don't miscalculate from the post-Calculate (clamped) value.

func (*Cache) SetPrefetchQueryer added in v1.6.4

func (c *Cache) SetPrefetchQueryer(q middleware.Queryer)

(*Cache).SetPrefetchQueryer installs the Queryer used by the prefetch worker. The prefetch sub-pipeline excludes the cache middleware so a refresh reaches the upstream resolver / forwarder instead of returning its own about-to-expire entry.

func (*Cache) SetQueryer added in v1.6.4

func (c *Cache) SetQueryer(q middleware.Queryer)

(*Cache).SetQueryer installs the Queryer used for internal client-shaped work (CNAME chase on cache writeback, future DNAME target lookup from the resolver). Called once from sdns.go startup.

func (*Cache) Stats added in v1.5.0

func (c *Cache) Stats() map[string]any

(*Cache).Stats stats returns cache statistics.

func (*Cache) Stop added in v1.5.0

func (c *Cache) Stop()

(*Cache).Stop stop gracefully shuts down the cache.

func (*Cache) Store added in v1.6.4

func (c *Cache) Store() middleware.Store

(*Cache).Store returns the storage facade, typed as middleware.Store so Cache satisfies middleware.StoreProvider for auto-wiring in middleware.Setup. External callers that need the full *Store surface can type-assert.

type CacheConfig added in v1.5.0

type CacheConfig struct {
	Size        int
	Prefetch    int
	PositiveTTL time.Duration
	NegativeTTL time.Duration
	MinTTL      time.Duration
	MaxTTL      time.Duration
	RateLimit   int
}

CacheConfig holds cache configuration with validation.

func (CacheConfig) Validate added in v1.5.0

func (cc CacheConfig) Validate() error

(CacheConfig).Validate validate checks if the configuration is valid.

type CacheEntry added in v1.5.0

type CacheEntry struct {
	// contains filtered or unexported fields
}

CacheEntry represents an immutable cache entry.

func NewCacheEntry added in v1.5.0

func NewCacheEntry(msg *dns.Msg, ttl time.Duration, rateLimit int) *CacheEntry

NewCacheEntry creates a new cache entry from a DNS message.

func NewCacheEntryWithKey added in v1.6.0

func NewCacheEntryWithKey(msg *dns.Msg, ttl time.Duration, rateLimit int, key uint64) *CacheEntry

NewCacheEntryWithKey creates a new cache entry with a specific key for rate limiting

func (*CacheEntry) GetRateLimiter added in v1.6.0

func (e *CacheEntry) GetRateLimiter() *rate.Limiter

(*CacheEntry).GetRateLimiter returns the shared rate limiter for this entry

func (*CacheEntry) IsExpired added in v1.5.0

func (e *CacheEntry) IsExpired() bool

(*CacheEntry).IsExpired isExpired checks if the cache entry has expired.

func (*CacheEntry) ShouldPrefetch added in v1.5.0

func (e *CacheEntry) ShouldPrefetch(threshold int) bool

(*CacheEntry).ShouldPrefetch shouldPrefetch checks if this entry should be prefetched.

func (*CacheEntry) TTL added in v1.5.0

func (e *CacheEntry) TTL() int

(*CacheEntry).TTL TTL returns the remaining TTL in seconds.

func (*CacheEntry) ToMsg added in v1.5.0

func (e *CacheEntry) ToMsg(req *dns.Msg) *dns.Msg

(*CacheEntry).ToMsg toMsg creates a response message with updated TTLs.

type CacheKey added in v1.5.0

type CacheKey struct {
	Question dns.Question
	CD       bool
}

CacheKey represents a structured cache key.

func (CacheKey) Hash added in v1.5.0

func (k CacheKey) Hash() uint64

(CacheKey).Hash hash returns the cache key hash.

type CacheMetrics added in v1.5.0

type CacheMetrics struct {
	// contains filtered or unexported fields
}

CacheMetrics tracks cache performance metrics.

func (*CacheMetrics) Eviction added in v1.5.0

func (m *CacheMetrics) Eviction()

(*CacheMetrics).Eviction eviction records a cache eviction.

func (*CacheMetrics) Hit added in v1.5.0

func (m *CacheMetrics) Hit()

(*CacheMetrics).Hit hit records a cache hit.

func (*CacheMetrics) Miss added in v1.5.0

func (m *CacheMetrics) Miss()

(*CacheMetrics).Miss miss records a cache miss.

func (*CacheMetrics) Prefetch added in v1.5.0

func (m *CacheMetrics) Prefetch()

(*CacheMetrics).Prefetch prefetch records a prefetch operation.

func (*CacheMetrics) Stats added in v1.5.0

func (m *CacheMetrics) Stats() (hits, misses, evictions, prefetches int64)

(*CacheMetrics).Stats stats returns current metrics.

type DCache added in v1.6.4

type DCache interface {
	Get(key uint64) (*CacheEntry, bool)
	Set(key uint64, entry *CacheEntry)
	Remove(key uint64)
	Len() int
}

DCache defines the interface for DNS cache implementations.

type NegativeCache added in v1.5.0

type NegativeCache struct {
	// contains filtered or unexported fields
}

NegativeCache handles error DNS responses.

func NewNegativeCache added in v1.5.0

func NewNegativeCache(size int, minTTL, maxTTL time.Duration, metrics *CacheMetrics) *NegativeCache

NewNegativeCache creates a new negative cache.

func (*NegativeCache) Get added in v1.5.0

func (nc *NegativeCache) Get(key uint64) (*CacheEntry, bool)

(*NegativeCache).Get get retrieves an entry from the negative cache. Hit/Miss metrics are NOT recorded here — see PositiveCache.Get.

func (*NegativeCache) Len added in v1.5.0

func (nc *NegativeCache) Len() int

(*NegativeCache).Len len returns the number of entries in the cache.

func (*NegativeCache) Remove added in v1.5.0

func (nc *NegativeCache) Remove(key uint64)

(*NegativeCache).Remove remove deletes an entry from the negative cache.

func (*NegativeCache) Set added in v1.5.0

func (nc *NegativeCache) Set(key uint64, entry *CacheEntry)

(*NegativeCache).Set set stores an entry in the negative cache.

type PositiveCache added in v1.5.0

type PositiveCache struct {
	// contains filtered or unexported fields
}

PositiveCache handles successful DNS responses.

func NewPositiveCache added in v1.5.0

func NewPositiveCache(size int, minTTL, maxTTL time.Duration, metrics *CacheMetrics) *PositiveCache

NewPositiveCache creates a new positive cache.

func (*PositiveCache) Get added in v1.5.0

func (pc *PositiveCache) Get(key uint64) (*CacheEntry, bool)

(*PositiveCache).Get get retrieves an entry from the positive cache. Hit/Miss metrics are NOT recorded here — checkCache consults both positive and negative caches per request and records the aggregate result once, so pushing metrics in here would double-count both sides of a single miss.

func (*PositiveCache) Len added in v1.5.0

func (pc *PositiveCache) Len() int

(*PositiveCache).Len len returns the number of entries in the cache.

func (*PositiveCache) Remove added in v1.5.0

func (pc *PositiveCache) Remove(key uint64)

(*PositiveCache).Remove remove deletes an entry from the positive cache.

func (*PositiveCache) Set added in v1.5.0

func (pc *PositiveCache) Set(key uint64, entry *CacheEntry)

(*PositiveCache).Set set stores an entry in the positive cache.

type PrefetchQueue added in v1.5.0

type PrefetchQueue struct {
	// contains filtered or unexported fields
}

PrefetchQueue manages prefetch requests with worker pool.

func NewPrefetchQueue added in v1.5.0

func NewPrefetchQueue(workers, queueSize int, metrics *CacheMetrics) *PrefetchQueue

NewPrefetchQueue creates a new prefetch queue.

func (*PrefetchQueue) Add added in v1.5.0

func (pq *PrefetchQueue) Add(req PrefetchRequest) bool

(*PrefetchQueue).Add add queues a prefetch request.

func (*PrefetchQueue) Stop added in v1.5.0

func (pq *PrefetchQueue) Stop()

(*PrefetchQueue).Stop stop gracefully shuts down the prefetch queue.

type PrefetchRequest added in v1.5.0

type PrefetchRequest struct {
	Request *dns.Msg
	Key     uint64
	Cache   *Cache      // Reference to the cache to store prefetched results
	Entry   *CacheEntry // Entry that claimed the prefetch; used to release the claim on failure/drop
}

PrefetchRequest represents a DNS query to be prefetched.

type ResponseWriter

type ResponseWriter struct {
	middleware.ResponseWriter
	// contains filtered or unexported fields
}

ResponseWriter is the response writer for cache.

func (*ResponseWriter) WriteMsg

func (w *ResponseWriter) WriteMsg(res *dns.Msg) error

(*ResponseWriter).WriteMsg writeMsg implements the ResponseWriter interface.

type Store added in v1.6.4

type Store struct {
	// contains filtered or unexported fields
}

Store is the cache backing for the cache middleware. It owns nothing directly — the positive/negative sub-caches are constructed by Cache.New and shared with Store — but it centralises classification, keying, and TTL handling so callers outside ServeDNS (resolver sub-queries, queryer-driven prefetch, future API purge wiring) don't need to understand the wire-write rules in ResponseWriter.WriteMsg.

SetFromResponse keys on the caller-supplied keyCD rather than on resp.CheckingDisabled to make the keying contract explicit at every call site — Forwarder and Resolver both temporarily mutate CD on the upstream request, and silent reliance on resp.CheckingDisabled is the kind of thing that splits CD=1 and CD=0 lookups across stale entries when a future change forgets to restore.

func NewStore added in v1.6.4

func NewStore(positive *PositiveCache, negative *NegativeCache, cfg CacheConfig) *Store

NewStore returns a Store backed by the supplied sub-caches. The caches are shared with the surrounding *Cache; this constructor does not allocate them.

func (*Store) ForEach added in v1.6.4

func (s *Store) ForEach(fn func(positive bool, key uint64, entry *CacheEntry) bool)

ForEach iterates over positive then negative entries. Returning false from fn stops iteration. Iteration is not atomic with concurrent updates.

func (*Store) Get added in v1.6.4

func (s *Store) Get(req *dns.Msg) (*dns.Msg, bool)

Get returns a materialised cached response for req. Reply header/ID/CD/AD interaction is handled by CacheEntry.ToMsg, which needs req for SetReply.

func (*Store) Lookup added in v1.6.4

func (s *Store) Lookup(req *dns.Msg) (*CacheEntry, bool)

Lookup returns the cache entry for req without materialising a response. Used by callers that need to inspect TTL or prefetch flags before deciding whether to consume the entry.

func (*Store) LookupByKey added in v1.6.4

func (s *Store) LookupByKey(key uint64) (*CacheEntry, bool)

LookupByKey is the pre-keyed form of Lookup, used by hot paths inside the cache middleware that already computed the key.

func (*Store) NegativeLen added in v1.6.4

func (s *Store) NegativeLen() int

NegativeLen returns the number of entries in the negative cache.

func (*Store) PositiveLen added in v1.6.4

func (s *Store) PositiveLen() int

PositiveLen returns the number of entries in the positive cache.

func (*Store) Purge added in v1.6.4

func (s *Store) Purge(q dns.Question)

Purge removes both CD=true and CD=false entries for q from positive and negative caches.

func (*Store) SetEntryWithKey added in v1.6.4

func (s *Store) SetEntryWithKey(key uint64, entry *CacheEntry, mt util.ResponseType)

SetEntryWithKey replaces a stored entry directly. Used by Cache.Set's compatibility path where a caller already constructed the CacheEntry (e.g. prefetch worker writing back a response with adjusted origTTL).

func (*Store) SetFromResponse added in v1.6.4

func (s *Store) SetFromResponse(resp *dns.Msg, keyCD bool)

SetFromResponse classifies resp (positive / NXDOMAIN+NODATA / SERVFAIL) and stores it under (resp.Question[0], keyCD). CHAOS signalling responses are skipped, matching ResponseWriter.WriteMsg.

func (*Store) SetFromResponseWithKey added in v1.6.4

func (s *Store) SetFromResponseWithKey(key uint64, resp *dns.Msg)

SetFromResponseWithKey is the pre-keyed form of SetFromResponse, used by ResponseWriter.WriteMsg, which has the key already.

type TTLManager added in v1.5.0

type TTLManager struct {
	// contains filtered or unexported fields
}

TTLManager manages TTL calculations.

func NewTTLManager added in v1.5.0

func NewTTLManager(min, max time.Duration) TTLManager

NewTTLManager creates a new TTL manager.

func (TTLManager) Calculate added in v1.5.0

func (tm TTLManager) Calculate(msgTTL time.Duration) time.Duration

(TTLManager).Calculate calculate returns the effective TTL within configured bounds.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL