1 /* 2 * Copyright (C) 1996-2021 The Squid Software Foundation and contributors 3 * 4 * Squid software is distributed under GPLv2+ license and includes 5 * contributions from numerous individuals and organizations. 6 * Please see the COPYING and CONTRIBUTORS files for details. 7 */ 8 9 /* DEBUG: section 70 Cache Digest */ 10 11 #ifndef SQUID_CACHEDIGEST_H_ 12 #define SQUID_CACHEDIGEST_H_ 13 14 #include "mem/forward.h" 15 #include "store_key_md5.h" 16 17 class CacheDigestGuessStats; 18 class StoreEntry; 19 20 class CacheDigest 21 { 22 MEMPROXY_CLASS(CacheDigest); 23 public: 24 CacheDigest(uint64_t capacity, uint8_t bpe); 25 ~CacheDigest(); 26 27 // NP: only used by broken unit-test 28 /// produce a new identical copy of the digest object 29 CacheDigest *clone() const; 30 31 /// reset the digest mask and counters 32 void clear(); 33 34 /// changes mask size to fit newCapacity, resets bits to 0 35 void updateCapacity(uint64_t newCapacity); 36 37 void add(const cache_key * key); 38 void remove(const cache_key * key); 39 40 /// \returns true if the key belongs to the digest 41 bool contains(const cache_key * key) const; 42 43 /// percentage of mask bits which are used 44 double usedMaskPercent() const; 45 46 /// calculate the size of mask required to digest up to 47 /// a specified capacity and bitsize. 48 static uint32_t CalcMaskSize(uint64_t cap, uint8_t bpe); 49 50 private: 51 void init(uint64_t newCapacity); 52 53 public: 54 /* public, read-only */ 55 uint64_t count; /* number of digested entries */ 56 uint64_t del_count; /* number of deletions performed so far */ 57 uint64_t capacity; /* expected maximum for .count, not a hard limit */ 58 char *mask; /* bit mask */ 59 uint32_t mask_size; /* mask size in bytes */ 60 int8_t bits_per_entry; /* number of bits allocated for each entry from capacity */ 61 }; 62 63 void cacheDigestGuessStatsUpdate(CacheDigestGuessStats * stats, int real_hit, int guess_hit); 64 void cacheDigestGuessStatsReport(const CacheDigestGuessStats * stats, StoreEntry * sentry, const char *label); 65 void cacheDigestReport(CacheDigest * cd, const char *label, StoreEntry * e); 66 67 #endif /* SQUID_CACHEDIGEST_H_ */ 68 69