Skip to content

Commit

Permalink
Generate cache invalidation report post build
Browse files Browse the repository at this point in the history
  • Loading branch information
irismoini committed Dec 5, 2023
1 parent 72bbd1e commit 1365931
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 55 deletions.
3 changes: 1 addition & 2 deletions packages/core/core/src/Parcel.js
Original file line number Diff line number Diff line change
Expand Up @@ -340,7 +340,6 @@ export default class Parcel {
if (this.#watchAbortController) {
this.#watchAbortController.abort();
}

this.#watchQueue.add(() => this._startNextBuild());
}

Expand All @@ -359,6 +358,7 @@ export default class Parcel {
createValidationRequest({optionsRef: this.#optionsRef, assetRequests}),
{force: assetRequests.length > 0},
);
this.#requestTracker.generateInvalidationReport();
return event;
} catch (e) {
if (e instanceof BuildAbortError) {
Expand Down Expand Up @@ -406,7 +406,6 @@ export default class Parcel {
if (this.#watchAbortController) {
this.#watchAbortController.abort();
}

this.#watchQueue.add(() => this._startNextBuild());
this.#watchQueue.run();
}
Expand Down
120 changes: 67 additions & 53 deletions packages/core/core/src/RequestTracker.js
Original file line number Diff line number Diff line change
Expand Up @@ -745,58 +745,6 @@ export class RequestGraph extends ContentGraph<
}
}

generateInvalidationReport(): void {
let nodes = {};
let invalidationRelations = {};
for (let {invalidated, cause} of this.invalidationReport) {
let invalidatedNode = nullthrows(this.getNode(invalidated));
invariant(invalidatedNode.type === 'request');
let causeNode =
cause !== undefined ? nullthrows(this.getNode(cause)) : undefined;

if (invalidatedNode.id === 'Main') {
continue;
}

if (!invalidationRelations[invalidated]) {
invalidationRelations[invalidated] = [];
}

if (causeNode && !invalidationRelations[invalidated].includes(cause)) {
invalidationRelations[invalidated].push(cause);
}

nodes[invalidated] = {
id: invalidatedNode.id,
type: invalidatedNode.type,
requestType: invalidatedNode.requestType,
invalidateReason: invalidatedNode.invalidateReason,
};

if (causeNode) {
invariant(cause !== undefined);
let {id, type, requestType, invalidateReason} = causeNode;
nodes[cause] =
requestType !== undefined && invalidateReason !== undefined
? {id, type, requestType, invalidateReason}
: {id, type};
}
}

const fs = require('fs');
fs.writeFile(
'cache-invalidation-report.json',
JSON.stringify(
{invalidationRelations: invalidationRelations, nodes: nodes},
undefined,
4,
),
function (err) {
if (err) throw err;
},
);
}

respondToFSEvents(
events: Array<{|path: ProjectPath, type: EventType|}>,
): boolean {
Expand Down Expand Up @@ -1167,6 +1115,73 @@ export default class RequestTracker {
return {api, subRequestContentKeys};
}

generateInvalidationReport(): void {
let nodes = {};
let invalidationRelations = {};
for (let {invalidated, cause} of this.graph.invalidationReport) {
let invalidatedNode = this.graph.getNode(invalidated);
let causeNode =
cause !== undefined ? this.graph.getNode(cause) : undefined;
if (
invalidatedNode === null ||
causeNode === null ||
invalidatedNode === undefined ||
causeNode === undefined
) {
continue;
}

if (invalidatedNode.id !== 'Main') {
if (!invalidationRelations[invalidated]) {
invalidationRelations[invalidated] = [];
}

if (!invalidationRelations[invalidated].includes(cause)) {
invariant(cause !== undefined);
invalidationRelations[invalidated].push(cause);
}
}

invariant(invalidatedNode.type === 'request');
nodes[invalidated] = {
id: invalidatedNode.id,
type: invalidatedNode.type,
requestType: invalidatedNode.requestType,
invalidateReason: invalidatedNode.invalidateReason,
};

if (
causeNode.requestType !== undefined &&
causeNode.invalidateReason !== undefined
) {
nodes[cause] = {
id: causeNode.id,
type: causeNode.type,
requestType: causeNode.requestType,
invalidateReason: causeNode.invalidateReason,
};
} else {
nodes[cause] = {
id: causeNode.id,
type: causeNode.type,
};
}
}

const fs = require('fs');
fs.writeFile(
'cache-invalidation-report.json',
JSON.stringify(
{invalidationRelations: invalidationRelations, nodes: nodes},
undefined,
4,
),
function (err) {
if (err) throw err;
},
);
}

async writeToCache() {
let cacheKey = getCacheKey(this.options);
let requestGraphKey = hashString(`${cacheKey}:requestGraph`);
Expand Down Expand Up @@ -1288,7 +1303,6 @@ async function loadRequestGraph(options): Async<RequestGraph> {
path: toProjectPath(options.projectRoot, e.path),
})),
);
requestGraph.generateInvalidationReport();

return requestGraph;
}
Expand Down

0 comments on commit 1365931

Please sign in to comment.