]> git.ipfire.org Git - thirdparty/pdns.git/blob - pdns/dnsdist-cache.hh
dbc59e61b97795a1c3b294e881df7e09b36a3e7b
[thirdparty/pdns.git] / pdns / dnsdist-cache.hh
1 #pragma once
2
3 #include <atomic>
4 #include <unordered_map>
5 #include "lock.hh"
6
7 struct DNSQuestion;
8
9 class DNSDistPacketCache : boost::noncopyable
10 {
11 public:
12 DNSDistPacketCache(size_t maxEntries, uint32_t maxTTL=86400, uint32_t minTTL=0, uint32_t servFailTTL=60, uint32_t staleTTL=60);
13 ~DNSDistPacketCache();
14
15 void insert(uint32_t key, const DNSName& qname, uint16_t qtype, uint16_t qclass, const char* response, uint16_t responseLen, bool tcp, bool servFail=false);
16 bool get(const DNSQuestion& dq, uint16_t consumed, uint16_t queryId, char* response, uint16_t* responseLen, uint32_t* keyOut, uint32_t allowExpired=0, bool skipAging=false);
17 void purgeExpired(size_t upTo=0);
18 void expunge(size_t upTo=0);
19 void expungeByName(const DNSName& name, uint16_t qtype=QType::ANY);
20 bool isFull();
21 string toString();
22 uint64_t getSize() const { return d_map.size(); }
23 uint64_t getHits() const { return d_hits; }
24 uint64_t getMisses() const { return d_misses; }
25 uint64_t getDeferredLookups() const { return d_deferredLookups; }
26 uint64_t getDeferredInserts() const { return d_deferredInserts; }
27 uint64_t getLookupCollisions() const { return d_lookupCollisions; }
28 uint64_t getInsertCollisions() const { return d_insertCollisions; }
29 uint64_t getMaxEntries() const { return d_maxEntries; }
30 uint64_t getTTLTooShorts() const { return d_ttlTooShorts; }
31 uint64_t getEntriesCount();
32
33 static uint32_t getMinTTL(const char* packet, uint16_t length);
34
35 private:
36
37 struct CacheValue
38 {
39 time_t getTTD() const { return validity; }
40 std::string value;
41 DNSName qname;
42 uint16_t qtype{0};
43 uint16_t qclass{0};
44 time_t added{0};
45 time_t validity{0};
46 uint16_t len{0};
47 bool tcp{false};
48 };
49
50 static uint32_t getKey(const DNSName& qname, uint16_t consumed, const unsigned char* packet, uint16_t packetLen, bool tcp);
51 static bool cachedValueMatches(const CacheValue& cachedValue, const DNSName& qname, uint16_t qtype, uint16_t qclass, bool tcp);
52
53 pthread_rwlock_t d_lock;
54 std::unordered_map<uint32_t,CacheValue> d_map;
55 std::atomic<uint64_t> d_deferredLookups{0};
56 std::atomic<uint64_t> d_deferredInserts{0};
57 std::atomic<uint64_t> d_hits{0};
58 std::atomic<uint64_t> d_misses{0};
59 std::atomic<uint64_t> d_insertCollisions{0};
60 std::atomic<uint64_t> d_lookupCollisions{0};
61 std::atomic<uint64_t> d_ttlTooShorts{0};
62 size_t d_maxEntries;
63 uint32_t d_maxTTL;
64 uint32_t d_servFailTTL;
65 uint32_t d_minTTL;
66 uint32_t d_staleTTL;
67 };