4 #include <unordered_map>
9 class DNSDistPacketCache : boost::noncopyable
12 DNSDistPacketCache(size_t maxEntries, uint32_t maxTTL=86400, uint32_t minTTL=0, uint32_t servFailTTL=60, uint32_t staleTTL=60);
13 ~DNSDistPacketCache();
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);
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();
33 static uint32_t getMinTTL(const char* packet, uint16_t length);
39 time_t getTTD() const { return validity; }
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);
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};
64 uint32_t d_servFailTTL;