]>
Commit | Line | Data |
---|---|---|
886e2cf2 RG |
1 | #pragma once |
2 | ||
3 | #include <atomic> | |
4 | #include <unordered_map> | |
5 | #include "lock.hh" | |
6 | ||
7 | class DNSDistPacketCache : boost::noncopyable | |
8 | { | |
9 | public: | |
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 | ||
29 | private: | |
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 | }; |