Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 13 additions & 10 deletions src/cache/cache.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,10 @@ export class Cache {
this.bloomSize = options.bloomSize || 10000;
this.bloomFalsePositiveRate = options.bloomFalsePositiveRate || 0.01;
this._bloomInitialized = false;
this._bloomPopulated = false; // True only when bloom filter is populated from existing data
this._inflightRequests = new Map();
this._driverInitialized = false;

if (!this.driver) {
throw new Error('Storage driver is required');
}
Expand Down Expand Up @@ -61,12 +62,13 @@ export class Cache {
async _doFetch(key, options = {}) {
const driver = await this._ensureDriver();
await this._initBloomFilter();

// Check bloom filter first for non-existence
if (this.bloomFilter && !this.bloomFilter.has(key)) {

// Only use bloom filter if it was pre-populated (e.g., loaded from disk)
// An empty bloom filter would incorrectly reject all keys from existing caches
if (this.bloomFilter && this._bloomPopulated && !this.bloomFilter.has(key)) {
return null; // Definitely not in cache
}

try {
const value = await driver.get(key);
// Handle cache validation, ETags, etc.
Expand All @@ -82,20 +84,21 @@ export class Cache {
async set(key, value, options = {}) {
const driver = await this._ensureDriver();
await this._initBloomFilter();
// Add to bloom filter

// Add to bloom filter and mark as populated
if (this.bloomFilter) {
this.bloomFilter.add(key);
this._bloomPopulated = true;
}
return driver.put(key, value, options);
}

async has(key) {
const driver = await this._ensureDriver();
await this._initBloomFilter();
// Check bloom filter first
if (this.bloomFilter && !this.bloomFilter.has(key)) {

// Only use bloom filter if it was pre-populated
if (this.bloomFilter && this._bloomPopulated && !this.bloomFilter.has(key)) {
return false; // Definitely not in cache
}
return driver.has(key);
Expand Down