Skip to content

Commit 5555fca

Browse files
authored
Merge pull request #2118 from github/charisk/variant-analysis-scrubbing
Clean up variant analyses from query history
2 parents 68fb744 + 06463a2 commit 5555fca

File tree

11 files changed

+83
-18
lines changed

11 files changed

+83
-18
lines changed

extensions/ql-vscode/src/extension.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ import { ExtensionApp } from "./common/vscode/vscode-app";
131131
import { RepositoriesFilterSortStateWithIds } from "./pure/variant-analysis-filter-sort";
132132
import { DbModule } from "./databases/db-module";
133133
import { redactableError } from "./pure/errors";
134+
import { QueryHistoryDirs } from "./query-history/query-history-dirs";
134135

135136
/**
136137
* extension.ts
@@ -649,13 +650,18 @@ async function activateWithInstalledDistribution(
649650
);
650651

651652
void extLogger.log("Initializing query history.");
653+
const queryHistoryDirs: QueryHistoryDirs = {
654+
localQueriesDirPath: queryStorageDir,
655+
variantAnalysesDirPath: variantAnalysisStorageDir,
656+
};
657+
652658
const qhm = new QueryHistoryManager(
653659
qs,
654660
dbm,
655661
localQueryResultsView,
656662
variantAnalysisManager,
657663
evalLogViewer,
658-
queryStorageDir,
664+
queryHistoryDirs,
659665
ctx,
660666
queryHistoryConfigurationListener,
661667
labelProvider,

extensions/ql-vscode/src/pure/files.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,3 +67,8 @@ export function pathsEqual(
6767
}
6868
return path1 === path2;
6969
}
70+
71+
export async function readDirFullPaths(path: string): Promise<string[]> {
72+
const baseNames = await readdir(path);
73+
return baseNames.map((baseName) => join(path, baseName));
74+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export interface QueryHistoryDirs {
2+
localQueriesDirPath: string;
3+
variantAnalysesDirPath: string;
4+
}

extensions/ql-vscode/src/query-history/query-history-manager.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ import { VariantAnalysisHistoryItem } from "./variant-analysis-history-item";
6565
import { getTotalResultCount } from "../variant-analysis/shared/variant-analysis";
6666
import { HistoryTreeDataProvider } from "./history-tree-data-provider";
6767
import { redactableError } from "../pure/errors";
68+
import { QueryHistoryDirs } from "./query-history-dirs";
6869

6970
/**
7071
* query-history-manager.ts
@@ -139,7 +140,7 @@ export class QueryHistoryManager extends DisposableObject {
139140
private readonly localQueriesResultsView: ResultsView,
140141
private readonly variantAnalysisManager: VariantAnalysisManager,
141142
private readonly evalLogViewer: EvalLogViewer,
142-
private readonly queryStorageDir: string,
143+
private readonly queryHistoryDirs: QueryHistoryDirs,
143144
ctx: ExtensionContext,
144145
private readonly queryHistoryConfigListener: QueryHistoryConfig,
145146
private readonly labelProvider: HistoryItemLabelProvider,
@@ -389,7 +390,7 @@ export class QueryHistoryManager extends DisposableObject {
389390
ONE_HOUR_IN_MS,
390391
TWO_HOURS_IN_MS,
391392
queryHistoryConfigListener.ttlInMillis,
392-
this.queryStorageDir,
393+
this.queryHistoryDirs,
393394
qhm,
394395
ctx,
395396
),

extensions/ql-vscode/src/query-history/query-history-scrubber.ts

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
import { pathExists, readdir, stat, remove, readFile } from "fs-extra";
1+
import { pathExists, stat, remove, readFile } from "fs-extra";
22
import { EOL } from "os";
33
import { join } from "path";
44
import { Disposable, ExtensionContext } from "vscode";
55
import { extLogger } from "../common";
6+
import { readDirFullPaths } from "../pure/files";
7+
import { QueryHistoryDirs } from "./query-history-dirs";
68
import { QueryHistoryManager } from "./query-history-manager";
79

810
const LAST_SCRUB_TIME_KEY = "lastScrubTime";
@@ -23,14 +25,14 @@ type Counter = {
2325
* @param wakeInterval How often to check to see if the job should run.
2426
* @param throttleTime How often to actually run the job.
2527
* @param maxQueryTime The maximum age of a query before is ready for deletion.
26-
* @param queryDirectory The directory containing all queries.
28+
* @param queryHistoryDirs The directories containing all query history information.
2729
* @param ctx The extension context.
2830
*/
2931
export function registerQueryHistoryScrubber(
3032
wakeInterval: number,
3133
throttleTime: number,
3234
maxQueryTime: number,
33-
queryDirectory: string,
35+
queryHistoryDirs: QueryHistoryDirs,
3436
qhm: QueryHistoryManager,
3537
ctx: ExtensionContext,
3638

@@ -42,7 +44,7 @@ export function registerQueryHistoryScrubber(
4244
wakeInterval,
4345
throttleTime,
4446
maxQueryTime,
45-
queryDirectory,
47+
queryHistoryDirs,
4648
qhm,
4749
ctx,
4850
counter,
@@ -58,7 +60,7 @@ export function registerQueryHistoryScrubber(
5860
async function scrubQueries(
5961
throttleTime: number,
6062
maxQueryTime: number,
61-
queryDirectory: string,
63+
queryHistoryDirs: QueryHistoryDirs,
6264
qhm: QueryHistoryManager,
6365
ctx: ExtensionContext,
6466
counter?: Counter,
@@ -74,18 +76,33 @@ async function scrubQueries(
7476
let scrubCount = 0; // total number of directories deleted
7577
try {
7678
counter?.increment();
77-
void extLogger.log("Scrubbing query directory. Removing old queries.");
78-
if (!(await pathExists(queryDirectory))) {
79+
void extLogger.log(
80+
"Cleaning up query history directories. Removing old entries.",
81+
);
82+
83+
if (!(await pathExists(queryHistoryDirs.localQueriesDirPath))) {
84+
void extLogger.log(
85+
`Cannot clean up query history directories. Local queries directory does not exist: ${queryHistoryDirs.localQueriesDirPath}`,
86+
);
87+
return;
88+
}
89+
if (!(await pathExists(queryHistoryDirs.variantAnalysesDirPath))) {
7990
void extLogger.log(
80-
`Cannot scrub. Query directory does not exist: ${queryDirectory}`,
91+
`Cannot clean up query history directories. Variant analyses directory does not exist: ${queryHistoryDirs.variantAnalysesDirPath}`,
8192
);
8293
return;
8394
}
8495

85-
const baseNames = await readdir(queryDirectory);
96+
const localQueryDirPaths = await readDirFullPaths(
97+
queryHistoryDirs.localQueriesDirPath,
98+
);
99+
const variantAnalysisDirPaths = await readDirFullPaths(
100+
queryHistoryDirs.variantAnalysesDirPath,
101+
);
102+
const allDirPaths = [...localQueryDirPaths, ...variantAnalysisDirPaths];
103+
86104
const errors: string[] = [];
87-
for (const baseName of baseNames) {
88-
const dir = join(queryDirectory, baseName);
105+
for (const dir of allDirPaths) {
89106
const scrubResult = await scrubDirectory(dir, now, maxQueryTime);
90107
if (scrubResult.errorMsg) {
91108
errors.push(scrubResult.errorMsg);
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { QueryHistoryDirs } from "../../../src/query-history/query-history-dirs";
2+
3+
export function createMockQueryHistoryDirs({
4+
localQueriesDirPath = "mock-local-queries-dir-path",
5+
variantAnalysesDirPath = "mock-variant-analyses-dir-path",
6+
}: {
7+
localQueriesDirPath?: string;
8+
variantAnalysesDirPath?: string;
9+
} = {}): QueryHistoryDirs {
10+
return {
11+
localQueriesDirPath,
12+
variantAnalysesDirPath,
13+
};
14+
}

extensions/ql-vscode/test/unit-tests/pure/files.test.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
gatherQlFiles,
55
getDirectoryNamesInsidePath,
66
pathsEqual,
7+
readDirFullPaths,
78
} from "../../../src/pure/files";
89

910
describe("files", () => {
@@ -100,6 +101,20 @@ describe("files", () => {
100101
expect(result).toEqual(["sub-folder"]);
101102
});
102103
});
104+
105+
describe("readDirFullPaths", () => {
106+
it("should return all files with full path", async () => {
107+
const file1 = join(dataDir, "compute-default-strings.ql");
108+
const file2 = join(dataDir, "multiple-result-sets.ql");
109+
const file3 = join(dataDir, "query.ql");
110+
111+
const paths = await readDirFullPaths(dataDir);
112+
113+
expect(paths.some((path) => path === file1)).toBe(true);
114+
expect(paths.some((path) => path === file2)).toBe(true);
115+
expect(paths.some((path) => path === file3)).toBe(true);
116+
});
117+
});
103118
});
104119

105120
describe("pathsEqual", () => {

extensions/ql-vscode/test/vscode-tests/no-workspace/query-history/history-tree-data-provider.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import {
2626
SortOrder,
2727
} from "../../../../src/query-history/history-tree-data-provider";
2828
import { QueryHistoryManager } from "../../../../src/query-history/query-history-manager";
29+
import { createMockQueryHistoryDirs } from "../../../factories/query-history/query-history-dirs";
2930

3031
describe("HistoryTreeDataProvider", () => {
3132
const mockExtensionLocation = join(tmpDir.name, "mock-extension-location");
@@ -425,7 +426,7 @@ describe("HistoryTreeDataProvider", () => {
425426
localQueriesResultsViewStub,
426427
variantAnalysisManagerStub,
427428
{} as EvalLogViewer,
428-
"xxx",
429+
createMockQueryHistoryDirs(),
429430
{
430431
globalStorageUri: vscode.Uri.file(mockExtensionLocation),
431432
extensionPath: vscode.Uri.file("/x/y/z").fsPath,

extensions/ql-vscode/test/vscode-tests/no-workspace/query-history/query-history-manager.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import { QuickPickItem, TextEditor } from "vscode";
2626
import { WebviewReveal } from "../../../../src/interface-utils";
2727
import * as helpers from "../../../../src/helpers";
2828
import { mockedObject } from "../../utils/mocking.helpers";
29+
import { createMockQueryHistoryDirs } from "../../../factories/query-history/query-history-dirs";
2930

3031
describe("QueryHistoryManager", () => {
3132
const mockExtensionLocation = join(tmpDir.name, "mock-extension-location");
@@ -1150,7 +1151,7 @@ describe("QueryHistoryManager", () => {
11501151
localQueriesResultsViewStub,
11511152
variantAnalysisManagerStub,
11521153
{} as EvalLogViewer,
1153-
"xxx",
1154+
createMockQueryHistoryDirs(),
11541155
{
11551156
globalStorageUri: vscode.Uri.file(mockExtensionLocation),
11561157
extensionPath: vscode.Uri.file("/x/y/z").fsPath,

extensions/ql-vscode/test/vscode-tests/no-workspace/query-history/query-history-scrubber.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ describe("query history scrubber", () => {
181181
ONE_HOUR_IN_MS,
182182
TWO_HOURS_IN_MS,
183183
LESS_THAN_ONE_DAY,
184-
dir,
184+
{ localQueriesDirPath: dir, variantAnalysesDirPath: dir },
185185
mockedObject<QueryHistoryManager>({
186186
removeDeletedQueries: () => {
187187
return Promise.resolve();

0 commit comments

Comments
 (0)