/* lookup the digest of a given peer */ lookup_t peerDigestLookup(peer * p, request_t * request) { #if USE_CACHE_DIGESTS const cache_key *key = request ? storeKeyPublicByRequest(request) : NULL; assert(p); assert(request); debug(15, 5) ("peerDigestLookup: peer %s\n", p->name); /* does the peeer have a valid digest? */ if (!p->digest) { debug(15, 5) ("peerDigestLookup: gone!\n"); return LOOKUP_NONE; } else if (!peerHTTPOkay(p, request)) { debug(15, 5) ("peerDigestLookup: !peerHTTPOkay\n"); return LOOKUP_NONE; } else if (!p->digest->flags.needed) { debug(15, 5) ("peerDigestLookup: note need\n"); peerDigestNeeded(p->digest); return LOOKUP_NONE; } else if (!p->digest->flags.usable) { debug(15, 5) ("peerDigestLookup: !ready && %srequested\n", p->digest->flags.requested ? "" : "!"); return LOOKUP_NONE; } debug(15, 5) ("peerDigestLookup: OK to lookup peer %s\n", p->name); assert(p->digest->cd); /* does digest predict a hit? */ if (!cacheDigestTest(p->digest->cd, key)) return LOOKUP_MISS; debug(15, 5) ("peerDigestLookup: peer %s says HIT!\n", p->name); return LOOKUP_HIT; #endif return LOOKUP_NONE; }
static void storeDigestAdd(const StoreEntry * entry) { assert(entry && store_digest); if (storeDigestAddable(entry)) { sd_stats.add_count++; if (cacheDigestTest(store_digest, entry->hash.key)) sd_stats.add_coll_count++; cacheDigestAdd(store_digest, entry->hash.key); debug(71, 6) ("storeDigestAdd: added entry, key: %s\n", storeKeyText(entry->hash.key)); } else { sd_stats.rej_count++; if (cacheDigestTest(store_digest, entry->hash.key)) sd_stats.rej_coll_count++; } }
static void 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); cache->qstats.query_count++; if (peer_has_it) { if (we_think_we_have_it) cache->qstats.true_hit_count++; else cache->qstats.false_miss_count++; } else { if (we_think_we_have_it) cache->qstats.false_hit_count++; else cache->qstats.true_miss_count++; } }
void storeDigestDel(const StoreEntry * entry) { #if USE_CACHE_DIGESTS if (!Config.onoff.digest_generation) { return; } assert(entry && store_digest); debug(71, 6) ("storeDigestDel: checking entry, key: %s\n", storeKeyText(entry->hash.key)); if (!EBIT_TEST(entry->flags, KEY_PRIVATE)) { if (!cacheDigestTest(store_digest, entry->hash.key)) { sd_stats.del_lost_count++; debug(71, 6) ("storeDigestDel: lost entry, key: %s url: %s\n", storeKeyText(entry->hash.key), storeUrl(entry)); } else { sd_stats.del_count++; cacheDigestDel(store_digest, entry->hash.key); debug(71, 6) ("storeDigestDel: deled entry, key: %s\n", storeKeyText(entry->hash.key)); } } #endif }