Skip to content

Commit 5705e40

Browse files
Clean-up cache info when starting to write request tracker (#9741)
* Clean-up cache info when starting to write request tracker * Add RequestTrackerCacheInfo unit-tests --------- Co-authored-by: pyamada (Remote Dev Environment) <[email protected]>
1 parent 2628e7b commit 5705e40

File tree

3 files changed

+88
-1
lines changed

3 files changed

+88
-1
lines changed

packages/core/core/src/RequestTracker.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,10 @@ import {report} from './ReporterRunner';
5555
import {PromiseQueue} from '@parcel/utils';
5656
import type {Cache} from '@parcel/cache';
5757
import {getConfigKeyContentHash} from './requests/ConfigRequest';
58-
import {storeRequestTrackerCacheInfo} from './RequestTrackerCacheInfo';
58+
import {
59+
storeRequestTrackerCacheInfo,
60+
clearRequestTrackerCacheInfo,
61+
} from './RequestTrackerCacheInfo';
5962

6063
export const requestGraphEdgeTypes = {
6164
subrequest: 2,
@@ -1361,6 +1364,7 @@ export default class RequestTracker {
13611364
let serialisedGraph = this.graph.serialize();
13621365

13631366
// Delete an existing request graph cache, to prevent invalid states
1367+
await clearRequestTrackerCacheInfo(this.options.cache);
13641368
await this.options.cache.deleteLargeBlob(requestGraphKey);
13651369

13661370
let total = 0;

packages/core/core/src/RequestTrackerCacheInfo.js

+9
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,12 @@ export async function storeRequestTrackerCacheInfo(
5858
requestTrackerCacheInfo,
5959
);
6060
}
61+
62+
/**
63+
* When starting a build the request tracker cache keys are cleared.
64+
* This prevents dangling references from being present if the process exits
65+
* while writing the cache.
66+
*/
67+
export async function clearRequestTrackerCacheInfo(cache: Cache) {
68+
await cache.set(toFsCacheKey('RequestTrackerCacheInfo'), null);
69+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
// @flow strict-local
2+
3+
import type {Cache} from '@parcel/types';
4+
import {FSCache, LMDBCache} from '@parcel/cache';
5+
import * as tempy from 'tempy';
6+
import {
7+
clearRequestTrackerCacheInfo,
8+
getRequestTrackerCacheInfo,
9+
storeRequestTrackerCacheInfo,
10+
} from '../src/RequestTrackerCacheInfo';
11+
import assert from 'assert';
12+
import {NodeFS} from '@parcel/fs';
13+
14+
type CacheImplementation = {|
15+
name: string,
16+
build: () => Cache,
17+
|};
18+
19+
const cacheImplementations: CacheImplementation[] = [
20+
{
21+
name: 'FSCache',
22+
build: () => new FSCache(new NodeFS(), tempy.directory()),
23+
},
24+
{
25+
name: 'LMDBCache',
26+
build: () => new LMDBCache(tempy.directory()),
27+
},
28+
];
29+
30+
describe('RequestTrackerCacheInfo', () => {
31+
cacheImplementations.forEach(cacheImplementation => {
32+
describe(`When using ${cacheImplementation.name}`, () => {
33+
let cache: Cache;
34+
beforeEach(async () => {
35+
cache = cacheImplementation.build();
36+
await cache.ensure();
37+
});
38+
39+
it('getRequestTrackerCacheInfo - returns null if the cache entry is missing', async () => {
40+
const entry = await getRequestTrackerCacheInfo(cache);
41+
assert(entry === null);
42+
});
43+
44+
it("getRequestTrackerCacheInfo - returns an entry if it's set with the store method", async () => {
45+
{
46+
const entry = await getRequestTrackerCacheInfo(cache);
47+
assert(entry === null);
48+
}
49+
const expectedEntry = {
50+
snapshotKey: 'snapshot-key',
51+
timestamp: Date.now(),
52+
requestGraphKey: 'request-graph-key',
53+
};
54+
await storeRequestTrackerCacheInfo(cache, expectedEntry);
55+
{
56+
const entry = await getRequestTrackerCacheInfo(cache);
57+
assert.deepEqual(entry, expectedEntry);
58+
}
59+
});
60+
61+
it('entries can be cleared with clearRequestTrackerCacheInfo', async () => {
62+
const expectedEntry = {
63+
snapshotKey: 'snapshot-key',
64+
timestamp: Date.now(),
65+
requestGraphKey: 'request-graph-key',
66+
};
67+
await storeRequestTrackerCacheInfo(cache, expectedEntry);
68+
await clearRequestTrackerCacheInfo(cache);
69+
const entry = await getRequestTrackerCacheInfo(cache);
70+
assert(entry === null);
71+
});
72+
});
73+
});
74+
});

0 commit comments

Comments
 (0)