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