static void
cacheDigestInit(CacheDigest * cd, int capacity)
{
- const size_t mask_size = cacheDigestCalcMaskSize(capacity, cd->bits_per_entry);
+ const size_t mask_size = CacheDigest::CalcMaskSize(capacity, cd->bits_per_entry);
assert(cd);
assert(capacity > 0 && cd->bits_per_entry > 0);
assert(mask_size > 0);
cacheDigestInit(this, newCapacity); // will re-init mask and mask_size
}
-/* returns true if the key belongs to the digest */
-int
-cacheDigestTest(const CacheDigest * cd, const cache_key * key)
+bool
+CacheDigest::test(const cache_key * key) const
{
- assert(cd && key);
+ assert(key);
/* hash */
- cacheDigestHashKey(cd, key);
+ cacheDigestHashKey(this, key);
/* test corresponding bits */
return
- CBIT_TEST(cd->mask, hashed_keys[0]) &&
- CBIT_TEST(cd->mask, hashed_keys[1]) &&
- CBIT_TEST(cd->mask, hashed_keys[2]) &&
- CBIT_TEST(cd->mask, hashed_keys[3]);
+ CBIT_TEST(mask, hashed_keys[0]) &&
+ CBIT_TEST(mask, hashed_keys[1]) &&
+ CBIT_TEST(mask, hashed_keys[2]) &&
+ CBIT_TEST(mask, hashed_keys[3]);
}
void
}
size_t
-cacheDigestCalcMaskSize(int cap, int bpe)
+CacheDigest::CalcMaskSize(int cap, int bpe)
{
+ // XXX: might 32-bit overflow during multiply
return (size_t) (cap * bpe + 7) / 8;
}
/// changes mask size to fit newCapacity, resets bits to 0
void updateCapacity(int newCapacity);
+ /// \returns true if the key belongs to the digest
+ bool test(const cache_key * key) const;
+
+ /// calculate the size of mask required to digest up to
+ /// a specified capacity and bitsize.
+ static size_t CalcMaskSize(int cap, int bpe);
+
public:
/* public, read-only */
char *mask; /* bit mask */
int del_count; /* number of deletions performed so far */
};
-int cacheDigestTest(const CacheDigest * cd, const cache_key * key);
void cacheDigestAdd(CacheDigest * cd, const cache_key * key);
void cacheDigestDel(CacheDigest * cd, const cache_key * key);
-size_t cacheDigestCalcMaskSize(int cap, int bpe);
int cacheDigestBitUtil(const CacheDigest * cd);
void cacheDigestGuessStatsUpdate(CacheDigestGuessStats * stats, int real_hit, int guess_hit);
void cacheDigestGuessStatsReport(const CacheDigestGuessStats * stats, StoreEntry * sentry, const char *label);
assert(p->digest->cd);
/* does digest predict a hit? */
- if (!cacheDigestTest(p->digest->cd, key))
+ if (!p->digest->cd->test(key))
return LOOKUP_MISS;
debugs(15, 5, "peerDigestLookup: peer " << p->host << " says HIT!");
}
/* check consistency further */
- if ((size_t)cblock.mask_size != cacheDigestCalcMaskSize(cblock.capacity, cblock.bits_per_entry)) {
+ if ((size_t)cblock.mask_size != CacheDigest::CalcMaskSize(cblock.capacity, cblock.bits_per_entry)) {
debugs(72, DBG_CRITICAL, host << " digest cblock is corrupted " <<
"(mask size mismatch: " << cblock.mask_size << " ? " <<
- cacheDigestCalcMaskSize(cblock.capacity, cblock.bits_per_entry)
+ CacheDigest::CalcMaskSize(cblock.capacity, cblock.bits_per_entry)
<< ").");
return 0;
}
debugs(71, 6, "storeDigestDel: checking entry, key: " << entry->getMD5Text());
if (!EBIT_TEST(entry->flags, KEY_PRIVATE)) {
- if (!cacheDigestTest(store_digest, (const cache_key *)entry->key)) {
+ if (!store_digest->test(static_cast<const cache_key *>(entry->key))) {
++sd_stats.del_lost_count;
debugs(71, 6, "storeDigestDel: lost entry, key: " << entry->getMD5Text() << " url: " << entry->url() );
} else {
if (storeDigestAddable(entry)) {
++sd_stats.add_count;
- if (cacheDigestTest(store_digest, (const cache_key *)entry->key))
+ if (store_digest->test(static_cast<const cache_key *>(entry->key)))
++sd_stats.add_coll_count;
cacheDigestAdd(store_digest, (const cache_key *)entry->key);
} else {
++sd_stats.rej_count;
- if (cacheDigestTest(store_digest, (const cache_key *)entry->key))
+ if (store_digest->test(static_cast<const cache_key *>(entry->key)))
++sd_stats.rej_coll_count;
}
}
cacheQueryPeer(Cache * cache, const cache_key * key)
{
const int peer_has_it = hash_lookup(cache->peer->hash, key) != NULL;
- const int we_think_we_have_it = cacheDigestTest(cache->digest, key);
+ const int we_think_we_have_it = cache->digest->test(key);
++ cache->qstats.query_count;
CacheDigest *CacheDigest::clone() const STUB_RETVAL(nullptr)
void CacheDigest::clear() STUB
void CacheDigest::updateCapacity(int) STUB
-int cacheDigestTest(const CacheDigest *, const cache_key *) STUB_RETVAL(1)
+bool CacheDigest::test(const cache_key *) const STUB_RETVAL(false)
void cacheDigestAdd(CacheDigest *, const cache_key *) STUB
void cacheDigestDel(CacheDigest *, const cache_key *) STUB
int cacheDigestBitUtil(const CacheDigest *) STUB_RETVAL(0)
void cacheDigestGuessStatsUpdate(CacheDigestGuessStats *, int, int) STUB
void cacheDigestGuessStatsReport(const CacheDigestGuessStats *, StoreEntry *, const char *) STUB
void cacheDigestReport(CacheDigest *, const char *, StoreEntry *) STUB
-size_t cacheDigestCalcMaskSize(int, int) STUB_RETVAL(1)
+size_t CacheDigest::CalcMaskSize(int, int) STUB_RETVAL(1)