Skip to content

Commit 3c6eb3f

Browse files
committed
fix forceNoCache ignored when backgroundRenew is false
1 parent d6b4c21 commit 3c6eb3f

File tree

2 files changed

+62
-17
lines changed

2 files changed

+62
-17
lines changed

packages/cubejs-query-orchestrator/src/orchestrator/QueryCache.ts

Lines changed: 34 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,26 @@ export class QueryCache {
280280
}
281281
}
282282

283+
if (forceNoCache) {
284+
return {
285+
data: this.cacheQueryResult(
286+
query,
287+
values,
288+
cacheKey,
289+
expireSecs,
290+
{
291+
priority: queuePriority,
292+
forceNoCache,
293+
external: queryBody.external,
294+
requestId: queryBody.requestId,
295+
dataSource: queryBody.dataSource,
296+
persistent: queryBody.persistent,
297+
}
298+
),
299+
lastRefreshTime: await this.lastRefreshTime(cacheKey)
300+
};
301+
}
302+
283303
// renewQuery has been deprecated, but keeping it for now
284304
if (queryBody.cacheMode === 'must-revalidate' || queryBody.renewQuery) {
285305
this.logger('Requested renew', { cacheKey, requestId: queryBody.requestId });
@@ -343,30 +363,27 @@ export class QueryCache {
343363
expireSecs,
344364
{
345365
priority: queuePriority,
346-
forceNoCache,
347366
external: queryBody.external,
348367
requestId: queryBody.requestId,
349368
dataSource: queryBody.dataSource,
350369
persistent: queryBody.persistent,
351370
}
352371
);
353372

354-
if (!forceNoCache) {
355-
this.startRenewCycle(
356-
query,
357-
values,
358-
cacheKeyQueries,
359-
expireSecs,
360-
cacheKey,
361-
renewalThreshold,
362-
{
363-
external: queryBody.external,
364-
requestId: queryBody.requestId,
365-
dataSource: queryBody.dataSource,
366-
persistent: queryBody.persistent,
367-
}
368-
);
369-
}
373+
this.startRenewCycle(
374+
query,
375+
values,
376+
cacheKeyQueries,
377+
expireSecs,
378+
cacheKey,
379+
renewalThreshold,
380+
{
381+
external: queryBody.external,
382+
requestId: queryBody.requestId,
383+
dataSource: queryBody.dataSource,
384+
persistent: queryBody.persistent,
385+
}
386+
);
370387

371388
return {
372389
data: await mainPromise,

packages/cubejs-query-orchestrator/test/unit/QueryCache.abstract.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,5 +163,33 @@ export const QueryCacheTest = (name: string, options: QueryCacheTestOptions) =>
163163
// @ts-ignore
164164
expect(key4.persistent).toEqual(false);
165165
});
166+
167+
it('bypass cache when forceNoCache=true', async () => {
168+
let queryExecutionCount = 0;
169+
170+
const mockDriverFactory = jest.fn(() => ({
171+
query: jest.fn(async () => {
172+
queryExecutionCount++;
173+
})
174+
})) as any;
175+
176+
const cacheInstance = new QueryCache(
177+
crypto.randomBytes(16).toString('hex'),
178+
mockDriverFactory,
179+
jest.fn(),
180+
{
181+
...options,
182+
queueOptions: async () => ({ concurrency: 1 }),
183+
}
184+
);
185+
186+
const queryBody = { query: 'select 1', values: [], forceNoCache: true };
187+
188+
await cacheInstance.cachedQueryResult(queryBody, []);
189+
await cacheInstance.cachedQueryResult(queryBody, []);
190+
191+
expect(queryExecutionCount).toBe(2);
192+
await cacheInstance.cleanup();
193+
});
166194
});
167195
};

0 commit comments

Comments
 (0)